+
+VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color)
+{
+ int colormodel = title_bg->get_color_model();
+ int bpp = BC_CModels::calculate_pixelsize(colormodel);
+ int tw = title_bg->get_w(), tw1 = tw-1, th = title_bg->get_h();
+ VFrame *title_bar = new VFrame(tw, th, colormodel);
+ uint8_t **bar_rows = title_bar->get_rows();
+ const uint8_t gap_grey = 0x4a;
+ union { unsigned rgba; struct { uint8_t r,g,b,a; }; } c;
+ c.r = color>>16; c.g = color>>8; c.b = color>>0; c.a = 0xff;
+ if( BC_CModels::has_alpha(colormodel) && // fast path
+ BC_CModels::calculate_pixelsize(colormodel) == sizeof(unsigned) ) {
+ const unsigned gap_rgba = (0xff<<24) |
+ (gap_grey<<16) | (gap_grey<<8) | (gap_grey<<0);
+ if( th > 0 ) {
+ unsigned *bp = (unsigned *)bar_rows[0];
+ for( int i=tw; --i>=0; ) *bp++ = gap_rgba;
+ }
+ for( int y=1; y<th; ++y ) {
+ unsigned *bp = (unsigned *)bar_rows[y];
+ if( tw > 0 ) *bp++ = gap_rgba;
+ for( int i=tw1; --i>0; ++bp ) *bp = c.rgba;
+ if( tw > 1 ) *bp = gap_rgba;
+ }
+ }
+ else {
+ if( th > 0 ) {
+ uint8_t *cp = bar_rows[0];
+ for( int x=0; x<tw; ++x ) {
+ cp[0] = cp[1] = cp[2] = gap_grey;
+ if( bpp > 3 ) cp[3] = 0xff;
+ cp += bpp;
+ }
+ }
+ for( int y=1; y<th; ++y ) {
+ uint8_t *cp = bar_rows[y];
+ if( tw > 0 ) {
+ cp[0] = cp[1] = cp[2] = gap_grey;
+ if( bpp > 3 ) cp[3] = 0xff;
+ cp += bpp;
+ }
+ for( int x=1; x<tw1; ++x ) {
+ cp[0] = c.r; cp[1] = c.g; cp[2] = c.b;
+ if( bpp > 3 ) cp[3] = 0xff;
+ cp += bpp;
+ }
+ if( tw > 1 ) {
+ cp[0] = cp[1] = cp[2] = gap_grey;
+ if( bpp > 3 ) cp[3] = 0xff;
+ }
+ }
+ }
+ return title_bar;
+}
+
+VFrame *ResourcePixmap::change_picon_alpha(VFrame *picon_frame, int alpha)
+{
+ uint8_t **picon_rows = picon_frame->get_rows();
+ int pw = picon_frame->get_w(), ph = picon_frame->get_h();
+ int color_model = picon_frame->get_color_model();
+ int bpp = BC_CModels::calculate_pixelsize(color_model);
+ VFrame *frame = new VFrame(pw, ph, BC_RGBA8888);
+ uint8_t **rows = frame->get_rows();
+ if( BC_CModels::has_alpha(color_model) && // fast path
+ BC_CModels::calculate_pixelsize(color_model) == sizeof(unsigned) ) {
+ unsigned a = alpha << 24;
+ for( int y=0; y<ph; ++y ) {
+ unsigned *bp = (unsigned *)picon_rows[y];
+ unsigned *rp = (unsigned *)rows[y];
+ for( int i=pw; --i>=0; ++bp,++rp ) *rp = (*bp & 0xffffff) | a;
+ }
+ }
+ else {
+ for( int y=0; y<ph; ++y ) {
+ uint8_t *bp = picon_rows[y], *rp = rows[y];
+ for( int x=0; x<pw; ++x ) {
+ rp[0] = bp[0]; rp[1] = bp[1];
+ rp[2] = bp[2]; bp += bpp;
+ rp[3] = alpha; rp += 4;
+ }
+ }
+ }
+ return frame;
+}
+