gradient: try to fix delete gradient data only on color change

Signed-off-by: Thilo Graf <dbt@novatux.de>
This commit is contained in:
[CST] Focus
2015-04-27 09:25:21 +02:00
committed by Thilo Graf
parent d8da2a3087
commit 53ce471af8
3 changed files with 23 additions and 10 deletions

View File

@@ -65,8 +65,9 @@ CComponents::CComponents() : COSDFader(g_settings.theme.menu_Content_alpha)
frameBuffer = CFrameBuffer::getInstance(); frameBuffer = CFrameBuffer::getInstance();
v_fbdata.clear(); v_fbdata.clear();
saved_screen.pixbuf = NULL; saved_screen.pixbuf = NULL;
cc_body_gradientBuf = NULL;
col_body_gradient = false; col_body_gradient = false;
cc_gradientData.gradientBuf = NULL;
cc_gradientData.boxBuf = NULL;
} }
CComponents::~CComponents() CComponents::~CComponents()
@@ -74,8 +75,10 @@ CComponents::~CComponents()
hide(); hide();
clearSavedScreen(); clearSavedScreen();
clearFbData(); clearFbData();
if (cc_body_gradientBuf) if (cc_gradientData.gradientBuf)
free(cc_body_gradientBuf); free(cc_gradientData.gradientBuf);
if (cc_gradientData.boxBuf)
cs_free_uncached(cc_gradientData.boxBuf);
} }
void CComponents::clearSavedScreen() void CComponents::clearSavedScreen()
@@ -293,11 +296,13 @@ void CComponents::clearFbData()
if (v_fbdata[i].pixbuf) if (v_fbdata[i].pixbuf)
delete[] v_fbdata[i].pixbuf; delete[] v_fbdata[i].pixbuf;
#if 0
if (v_fbdata[i].data && (v_fbdata[i].fbdata_type == CC_FBDATA_TYPE_BOX)) { if (v_fbdata[i].data && (v_fbdata[i].fbdata_type == CC_FBDATA_TYPE_BOX)) {
gradientData_t *gradientData = static_cast<gradientData_t*> (v_fbdata[i].data); gradientData_t *gradientData = static_cast<gradientData_t*> (v_fbdata[i].data);
if (gradientData->boxBuf) if (gradientData->boxBuf)
cs_free_uncached(gradientData->boxBuf); cs_free_uncached(gradientData->boxBuf);
} }
#endif
} }
v_fbdata.clear(); v_fbdata.clear();
} }

View File

@@ -72,6 +72,7 @@ class CComponents : public CComponentsSignals, public COSDFader
void *cc_tag; void *cc_tag;
///property: color of body ///property: color of body
fb_pixel_t col_body; fb_pixel_t col_body;
fb_pixel_t old_gradient_color;
///property: color of shadow ///property: color of shadow
fb_pixel_t col_shadow; fb_pixel_t col_shadow;
///property: color of frame ///property: color of frame
@@ -81,8 +82,6 @@ class CComponents : public CComponentsSignals, public COSDFader
///property: contains data for gradiant handling ///property: contains data for gradiant handling
gradientData_t cc_gradientData; gradientData_t cc_gradientData;
///gradiant pixel buffer
fb_pixel_t *cc_body_gradientBuf;
///property: true component can paint gradient, see also enableColBodyGradient() ///property: true component can paint gradient, see also enableColBodyGradient()
bool col_body_gradient; bool col_body_gradient;
///property: background gradient mode ///property: background gradient mode

View File

@@ -33,6 +33,7 @@
#include "cc_base.h" #include "cc_base.h"
#include <driver/screen_max.h> #include <driver/screen_max.h>
#include <system/debug.h> #include <system/debug.h>
#include <cs_api.h>
using namespace std; using namespace std;
// y // y
@@ -98,8 +99,7 @@ void CComponentsItem::paintInit(bool do_save_bg)
ix = cc_xr; ix = cc_xr;
iy = cc_yr; iy = cc_yr;
} }
cc_gradientData.boxBuf = NULL;
cc_gradientData.mode = CFrameBuffer::pbrg_noFree; cc_gradientData.mode = CFrameBuffer::pbrg_noFree;
void* gradientData = (cc_gradientData.gradientBuf == NULL) ? NULL : &cc_gradientData; void* gradientData = (cc_gradientData.gradientBuf == NULL) ? NULL : &cc_gradientData;
comp_fbdata_t fbdata[] = comp_fbdata_t fbdata[] =
@@ -257,12 +257,21 @@ void CComponentsItem::setFocus(bool focus)
void CComponentsItem::initBodyGradient() void CComponentsItem::initBodyGradient()
{ {
if (cc_body_gradientBuf == NULL) { if (col_body_gradient && cc_gradientData.gradientBuf && old_gradient_color != col_body) {
free(cc_gradientData.gradientBuf);
cc_gradientData.gradientBuf = NULL;
if (cc_gradientData.boxBuf) {
cs_free_uncached(cc_gradientData.boxBuf);
cc_gradientData.boxBuf = NULL;
}
}
if (cc_gradientData.gradientBuf == NULL) {
CColorGradient ccGradient; CColorGradient ccGradient;
int gsize = cc_body_gradient_direction == CFrameBuffer::gradientVertical ? height : width; int gsize = cc_body_gradient_direction == CFrameBuffer::gradientVertical ? height : width;
cc_body_gradientBuf = ccGradient.gradientOneColor(col_body, NULL, gsize, cc_body_gradient_mode, cc_body_gradient_intensity, cc_body_gradient_intensity_v_min, cc_body_gradient_intensity_v_max, cc_body_gradient_saturation); cc_gradientData.gradientBuf = ccGradient.gradientOneColor(col_body, NULL, gsize, cc_body_gradient_mode, cc_body_gradient_intensity, cc_body_gradient_intensity_v_min, cc_body_gradient_intensity_v_max, cc_body_gradient_saturation);
old_gradient_color = col_body;
} }
cc_gradientData.gradientBuf = cc_body_gradientBuf;
cc_gradientData.direction = cc_body_gradient_direction; cc_gradientData.direction = cc_body_gradient_direction;
cc_gradientData.mode = CFrameBuffer::pbrg_noOption; cc_gradientData.mode = CFrameBuffer::pbrg_noOption;
} }