diff --git a/src/gui/components/cc_base.cpp b/src/gui/components/cc_base.cpp index aea0dfe3a..dcb58fe09 100644 --- a/src/gui/components/cc_base.cpp +++ b/src/gui/components/cc_base.cpp @@ -65,8 +65,9 @@ CComponents::CComponents() : COSDFader(g_settings.theme.menu_Content_alpha) frameBuffer = CFrameBuffer::getInstance(); v_fbdata.clear(); saved_screen.pixbuf = NULL; - cc_body_gradientBuf = NULL; col_body_gradient = false; + cc_gradientData.gradientBuf = NULL; + cc_gradientData.boxBuf = NULL; } CComponents::~CComponents() @@ -74,8 +75,10 @@ CComponents::~CComponents() hide(); clearSavedScreen(); clearFbData(); - if (cc_body_gradientBuf) - free(cc_body_gradientBuf); + if (cc_gradientData.gradientBuf) + free(cc_gradientData.gradientBuf); + if (cc_gradientData.boxBuf) + cs_free_uncached(cc_gradientData.boxBuf); } void CComponents::clearSavedScreen() @@ -293,11 +296,13 @@ void CComponents::clearFbData() if (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)) { gradientData_t *gradientData = static_cast (v_fbdata[i].data); if (gradientData->boxBuf) cs_free_uncached(gradientData->boxBuf); } +#endif } v_fbdata.clear(); } diff --git a/src/gui/components/cc_base.h b/src/gui/components/cc_base.h index 3618b2581..3aa0f740d 100644 --- a/src/gui/components/cc_base.h +++ b/src/gui/components/cc_base.h @@ -72,6 +72,7 @@ class CComponents : public CComponentsSignals, public COSDFader void *cc_tag; ///property: color of body fb_pixel_t col_body; + fb_pixel_t old_gradient_color; ///property: color of shadow fb_pixel_t col_shadow; ///property: color of frame @@ -81,8 +82,6 @@ class CComponents : public CComponentsSignals, public COSDFader ///property: contains data for gradiant handling gradientData_t cc_gradientData; - ///gradiant pixel buffer - fb_pixel_t *cc_body_gradientBuf; ///property: true component can paint gradient, see also enableColBodyGradient() bool col_body_gradient; ///property: background gradient mode diff --git a/src/gui/components/cc_item.cpp b/src/gui/components/cc_item.cpp index f89406d03..c8e9a516b 100644 --- a/src/gui/components/cc_item.cpp +++ b/src/gui/components/cc_item.cpp @@ -33,6 +33,7 @@ #include "cc_base.h" #include #include +#include using namespace std; // y @@ -98,8 +99,7 @@ void CComponentsItem::paintInit(bool do_save_bg) ix = cc_xr; iy = cc_yr; } - - cc_gradientData.boxBuf = NULL; + cc_gradientData.mode = CFrameBuffer::pbrg_noFree; void* gradientData = (cc_gradientData.gradientBuf == NULL) ? NULL : &cc_gradientData; comp_fbdata_t fbdata[] = @@ -257,12 +257,21 @@ void CComponentsItem::setFocus(bool focus) 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; 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.mode = CFrameBuffer::pbrg_noOption; }