diff --git a/src/servers/app/server/Painter/drawing_modes/DrawingModeAdd.h b/src/servers/app/server/Painter/drawing_modes/DrawingModeAdd.h index c4aa4ca2c5..ee505d7500 100644 --- a/src/servers/app/server/Painter/drawing_modes/DrawingModeAdd.h +++ b/src/servers/app/server/Painter/drawing_modes/DrawingModeAdd.h @@ -8,6 +8,28 @@ #include "DrawingMode.h" #include "PatternHandler.h" + +inline void +blend_add(uint8* d1, uint8* d2, uint8* d3, uint8* da, + uint8 s1, uint8 s2, uint8 s3, uint8 a) +{ + s1 = min_c(255, *d1 + s1); + s2 = min_c(255, *d2 + s2); + s3 = min_c(255, *d3 + s3); + + blend(d1, d2, d3, da, s1, s2, s3, a); +} + +inline void +assign_add(uint8* d1, uint8* d2, uint8* d3, uint8* da, + uint8 s1, uint8 s2, uint8 s3) +{ + *d1 = min_c(255, *d1 + s1); + *d2 = min_c(255, *d2 + s2); + *d3 = min_c(255, *d3 + s3); +} + + namespace agg { //====================================================DrawingModeAdd @@ -26,30 +48,17 @@ namespace agg //-------------------------------------------------------------------- virtual void blend_pixel(int x, int y, const color_type& c, int8u cover) { -//printf("DrawingModeAdd::blend_pixel()\n"); - if (fPatternHandler->IsHighColor(x, y)) { - int8u* p = m_rbuf->row(y) + (x << 2); - rgb_color color = fPatternHandler->R5ColorAt(x, y); - // int alpha = int(cover) * int(c.a); - int alpha = int(cover) * int(color.alpha); - if(alpha == 255*255) - { - p[Order::R] = min_c(255, p[Order::R] + color.red); - p[Order::G] = min_c(255, p[Order::G] + color.green); - p[Order::B] = min_c(255, p[Order::B] + color.blue); -// p[Order::A] = color.alpha; - } - else - { - int r = p[Order::R]; - int g = p[Order::G]; - int b = p[Order::B]; - int a = p[Order::A]; - p[Order::R] = (int8u)((((color.red - r) * alpha) + (r << 16)) >> 16); - p[Order::G] = (int8u)((((color.green - g) * alpha) + (g << 16)) >> 16); - p[Order::B] = (int8u)((((color.blue - b) * alpha) + (b << 16)) >> 16); - p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - } + int8u* p = m_rbuf->row(y) + (x << 2); + rgb_color color = fPatternHandler->R5ColorAt(x, y); + if(cover) + { + assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue); + } + else + { + blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue, cover); } } @@ -57,41 +66,30 @@ namespace agg virtual void blend_hline(int x, int y, unsigned len, const color_type& c, int8u cover) { -//printf("DrawingModeAdd::blend_hline()\n"); - int alpha = int(cover) * int(c.a); - if(alpha == 255*255) + int8u* p = m_rbuf->row(y) + (x << 2); + if(cover == 255) { - int32u v; - int8u* p8 = (int8u*)&v; - p8[Order::R] = (int8u)c.r; - p8[Order::G] = (int8u)c.g; - p8[Order::B] = (int8u)c.b; - p8[Order::A] = (int8u)c.a; - int32u* p32 = (int32u*)(m_rbuf->row(y)) + x; do { - if (fPatternHandler->IsHighColor(x, y)) - *p32 = v; - p32++; + rgb_color color = fPatternHandler->R5ColorAt(x, y); + + assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue); + + p += 4; x++; } while(--len); } else { - int8u* p = m_rbuf->row(y) + (x << 2); do { - if (fPatternHandler->IsHighColor(x, y)) { - int r = p[Order::R]; - int g = p[Order::G]; - int b = p[Order::B]; - int a = p[Order::A]; - p[Order::R] = (int8u)((((c.r - r) * alpha) + (r << 16)) >> 16); - p[Order::G] = (int8u)((((c.g - g) * alpha) + (g << 16)) >> 16); - p[Order::B] = (int8u)((((c.b - b) * alpha) + (b << 16)) >> 16); - p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - } + rgb_color color = fPatternHandler->R5ColorAt(x, y); + + blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue, cover); + x++; p += 4; } @@ -110,43 +108,21 @@ printf("DrawingModeAdd::blend_vline()\n"); virtual void blend_solid_hspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { -//printf("DrawingModeAdd::blend_solid_hspan()\n"); int8u* p = m_rbuf->row(y) + (x << 2); do { - if (fPatternHandler->IsHighColor(x, y)) { - rgb_color color = fPatternHandler->R5ColorAt(x, y); - // int alpha = int(*covers++) * c.a; - int alpha = int(*covers) * color.alpha; - //int alpha = int(*covers++); - if(alpha) + rgb_color color = fPatternHandler->R5ColorAt(x, y); + if(*covers) + { + if(*covers == 255) { - if(alpha == 255*255) - { - // p[Order::R] = (int8u)c.r; - // p[Order::G] = (int8u)c.g; - // p[Order::B] = (int8u)c.b; - // p[Order::A] = (int8u)c.a; - p[Order::R] = color.red; - p[Order::G] = color.green; - p[Order::B] = color.blue; - p[Order::A] = color.alpha; - } - else - { - int r = p[Order::R]; - int g = p[Order::G]; - int b = p[Order::B]; - int a = p[Order::A]; - // p[Order::R] = (int8u)((((c.r - r) * alpha) + (r << 16)) >> 16); - // p[Order::G] = (int8u)((((c.g - g) * alpha) + (g << 16)) >> 16); - // p[Order::B] = (int8u)((((c.b - b) * alpha) + (b << 16)) >> 16); - // p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - p[Order::R] = (int8u)((((color.red - r) * alpha) + (r << 16)) >> 16); - p[Order::G] = (int8u)((((color.green - g) * alpha) + (g << 16)) >> 16); - p[Order::B] = (int8u)((((color.blue - b) * alpha) + (b << 16)) >> 16); - p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - } + assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue); + } + else + { + blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue, *covers); } } covers++; @@ -162,46 +138,23 @@ printf("DrawingModeAdd::blend_vline()\n"); virtual void blend_solid_vspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { -//printf("DrawingModeAdd::blend_solid_vspan()\n"); int8u* p = m_rbuf->row(y) + (x << 2); do { - if (fPatternHandler->IsHighColor(x, y)) { - rgb_color color = fPatternHandler->R5ColorAt(x, y); - // int alpha = int(*covers++) * c.a; - int alpha = int(*covers) * color.alpha; - //int alpha = int(*covers++); - - if(alpha) + rgb_color color = fPatternHandler->R5ColorAt(x, y); + if(*covers) + { + if(*covers == 255) { - if(alpha == 255*255) - { - // p[Order::R] = (int8u)c.r; - // p[Order::G] = (int8u)c.g; - // p[Order::B] = (int8u)c.b; - // p[Order::A] = (int8u)c.a; - p[Order::R] = color.red; - p[Order::G] = color.green; - p[Order::B] = color.blue; - p[Order::A] = color.alpha; - } - else - { - int r = p[Order::R]; - int g = p[Order::G]; - int b = p[Order::B]; - int a = p[Order::A]; - // p[Order::R] = (int8u)((((c.r - r) * alpha) + (r << 16)) >> 16); - // p[Order::G] = (int8u)((((c.g - g) * alpha) + (g << 16)) >> 16); - // p[Order::B] = (int8u)((((c.b - b) * alpha) + (b << 16)) >> 16); - // p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - p[Order::R] = (int8u)((((color.red - r) * alpha) + (r << 16)) >> 16); - p[Order::G] = (int8u)((((color.green - g) * alpha) + (g << 16)) >> 16); - p[Order::B] = (int8u)((((color.blue - b) * alpha) + (b << 16)) >> 16); - p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); - } + assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue); } - }; + else + { + blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + color.red, color.green, color.blue, *covers); + } + } covers++; p += m_rbuf->stride(); y++; @@ -216,31 +169,22 @@ printf("DrawingModeAdd::blend_vline()\n"); const int8u* covers, int8u cover) { -//printf("DrawingModeAdd::blend_color_hspan()\n"); int8u* p = m_rbuf->row(y) + (x << 2); do { - int alpha = colors->a * (covers ? int(*covers++) : int(cover)); + uint8 alpha = covers ? *covers++ : cover; if(alpha) { - if(alpha == 255*255) + if(alpha == 255) { - p[Order::R] = min_c(255, (int8u)colors->r + p[Order::R]); - p[Order::G] = min_c(255, (int8u)colors->g + p[Order::G]); - p[Order::B] = min_c(255, (int8u)colors->b + p[Order::B]); -// p[Order::A] = min_c(255, (int8u)colors->a + p[Order::R]); + assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + colors->r, colors->g, colors->b); } else { - int r = p[Order::R]; - int g = p[Order::G]; - int b = p[Order::B]; - int a = p[Order::A]; - p[Order::R] = (int8u)((((min_c(255, r + colors->r) - r) * alpha) + (r << 16)) >> 16); - p[Order::G] = (int8u)((((min_c(255, g + colors->g) - g) * alpha) + (g << 16)) >> 16); - p[Order::B] = (int8u)((((min_c(255, b + colors->b) - b) * alpha) + (b << 16)) >> 16); - p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8); + blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A], + colors->r, colors->g, colors->b, alpha); } } p += 4; diff --git a/src/servers/app/server/Painter/drawing_modes/DrawingModeCopy.h b/src/servers/app/server/Painter/drawing_modes/DrawingModeCopy.h index e7a627f1f4..c8dbe25fc7 100644 --- a/src/servers/app/server/Painter/drawing_modes/DrawingModeCopy.h +++ b/src/servers/app/server/Painter/drawing_modes/DrawingModeCopy.h @@ -64,9 +64,9 @@ namespace agg { //printf("DrawingModeCopy::blend_hline()\n"); int alpha = int(cover) * int(c.a); + int8u* p = m_rbuf->row(y) + (x << 2); if(alpha == 255*255) { - int8u* p = m_rbuf->row(y) + (x << 2); do { rgb_color color = fPatternHandler->R5ColorAt(x, y); @@ -81,7 +81,6 @@ namespace agg } else { - int8u* p = m_rbuf->row(y) + (x << 2); do { rgb_color color = fPatternHandler->R5ColorAt(x, y);