X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fresourcepixmap.C;fp=cinelerra-5.1%2Fcinelerra%2Fresourcepixmap.C;h=9ed12d9357dc71fdef5f83de4f277ec43e408f33;hp=82dd7c802329f85cd65dde4eea3c839ae0564cfe;hb=3abbd84aa85907d646b13c98295ce778d2a71215;hpb=3b4b6f588c4f2643316afcbc486ca6a35c16a431 diff --git a/cinelerra-5.1/cinelerra/resourcepixmap.C b/cinelerra-5.1/cinelerra/resourcepixmap.C index 82dd7c80..9ed12d93 100644 --- a/cinelerra-5.1/cinelerra/resourcepixmap.C +++ b/cinelerra-5.1/cinelerra/resourcepixmap.C @@ -236,32 +236,50 @@ VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color) 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 cr = (color>>16), cg = (color>>8), cb = (color>>0); uint8_t **bar_rows = title_bar->get_rows(); const uint8_t gap_grey = 0x4a; - if( th > 0 ) { - uint8_t *cp = bar_rows[0]; - for( int x=0; x 3 ) cp[3] = 0xff; - cp += bpp; + 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 0 ) { - cp[0] = cp[1] = cp[2] = gap_grey; - if( bpp > 3 ) cp[3] = 0xff; - cp += bpp; + unsigned rgba = (0xff<<24) | (color & 0xffffff); + for( int y=1; y 0 ) *bp++ = gap_rgba; + for( int i=tw1; --i>0; ++bp ) *bp = rgba; + if( tw > 1 ) *bp = gap_rgba; } - for( int x=1; x 3 ) cp[3] = 0xff; - cp += bpp; + } + else { + uint8_t cr = (color>>16), cg = (color>>8), cb = (color>>0); + if( th > 0 ) { + uint8_t *cp = bar_rows[0]; + for( int x=0; x 3 ) cp[3] = 0xff; + cp += bpp; + } } - if( tw > 1 ) { - cp[0] = cp[1] = cp[2] = gap_grey; - if( bpp > 3 ) cp[3] = 0xff; + for( int y=1; y 0 ) { + cp[0] = cp[1] = cp[2] = gap_grey; + if( bpp > 3 ) cp[3] = 0xff; + cp += bpp; + } + for( int x=1; x 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; @@ -270,17 +288,28 @@ VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color) VFrame *ResourcePixmap::change_picon_alpha(VFrame *picon_frame, int alpha) { uint8_t **picon_rows = picon_frame->get_rows(); - int w = picon_frame->get_w(), h = picon_frame->get_h(); + 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(w, h, BC_RGBA8888); + VFrame *frame = new VFrame(pw, ph, BC_RGBA8888); uint8_t **rows = frame->get_rows(); - for( int y=0; y=0; ++bp,++rp ) *rp = (*bp & 0xffffff) | a; + } + } + else { + for( int y=0; y