refactoring and cleanup

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10921 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2005-01-20 23:26:13 +00:00
parent 34651df507
commit 08f1d3c965
2 changed files with 76 additions and 133 deletions
@@ -8,6 +8,28 @@
#include "DrawingMode.h" #include "DrawingMode.h"
#include "PatternHandler.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 namespace agg
{ {
//====================================================DrawingModeAdd //====================================================DrawingModeAdd
@@ -26,30 +48,17 @@ namespace agg
//-------------------------------------------------------------------- //--------------------------------------------------------------------
virtual void blend_pixel(int x, int y, const color_type& c, int8u cover) virtual void blend_pixel(int x, int y, const color_type& c, int8u cover)
{ {
//printf("DrawingModeAdd::blend_pixel()\n"); int8u* p = m_rbuf->row(y) + (x << 2);
if (fPatternHandler->IsHighColor(x, y)) { rgb_color color = fPatternHandler->R5ColorAt(x, y);
int8u* p = m_rbuf->row(y) + (x << 2); if(cover)
rgb_color color = fPatternHandler->R5ColorAt(x, y); {
// int alpha = int(cover) * int(c.a); assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
int alpha = int(cover) * int(color.alpha); color.red, color.green, color.blue);
if(alpha == 255*255) }
{ else
p[Order::R] = min_c(255, p[Order::R] + color.red); {
p[Order::G] = min_c(255, p[Order::G] + color.green); blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
p[Order::B] = min_c(255, p[Order::B] + color.blue); color.red, color.green, color.blue, cover);
// 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);
}
} }
} }
@@ -57,41 +66,30 @@ namespace agg
virtual void blend_hline(int x, int y, unsigned len, virtual void blend_hline(int x, int y, unsigned len,
const color_type& c, int8u cover) const color_type& c, int8u cover)
{ {
//printf("DrawingModeAdd::blend_hline()\n"); int8u* p = m_rbuf->row(y) + (x << 2);
int alpha = int(cover) * int(c.a); if(cover == 255)
if(alpha == 255*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 do
{ {
if (fPatternHandler->IsHighColor(x, y)) rgb_color color = fPatternHandler->R5ColorAt(x, y);
*p32 = v;
p32++; assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
color.red, color.green, color.blue);
p += 4;
x++; x++;
} }
while(--len); while(--len);
} }
else else
{ {
int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
if (fPatternHandler->IsHighColor(x, y)) { rgb_color color = fPatternHandler->R5ColorAt(x, y);
int r = p[Order::R];
int g = p[Order::G]; blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
int b = p[Order::B]; color.red, color.green, color.blue, cover);
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);
}
x++; x++;
p += 4; p += 4;
} }
@@ -110,43 +108,21 @@ printf("DrawingModeAdd::blend_vline()\n");
virtual void blend_solid_hspan(int x, int y, unsigned len, virtual void blend_solid_hspan(int x, int y, unsigned len,
const color_type& c, const int8u* covers) const color_type& c, const int8u* covers)
{ {
//printf("DrawingModeAdd::blend_solid_hspan()\n");
int8u* p = m_rbuf->row(y) + (x << 2); int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
if (fPatternHandler->IsHighColor(x, y)) { rgb_color color = fPatternHandler->R5ColorAt(x, y);
rgb_color color = fPatternHandler->R5ColorAt(x, y); if(*covers)
// int alpha = int(*covers++) * c.a; {
int alpha = int(*covers) * color.alpha; if(*covers == 255)
//int alpha = int(*covers++);
if(alpha)
{ {
if(alpha == 255*255) assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
{ color.red, color.green, color.blue);
// p[Order::R] = (int8u)c.r; }
// p[Order::G] = (int8u)c.g; else
// p[Order::B] = (int8u)c.b; {
// p[Order::A] = (int8u)c.a; blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
p[Order::R] = color.red; color.red, color.green, color.blue, *covers);
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);
}
} }
} }
covers++; covers++;
@@ -162,46 +138,23 @@ printf("DrawingModeAdd::blend_vline()\n");
virtual void blend_solid_vspan(int x, int y, unsigned len, virtual void blend_solid_vspan(int x, int y, unsigned len,
const color_type& c, const int8u* covers) const color_type& c, const int8u* covers)
{ {
//printf("DrawingModeAdd::blend_solid_vspan()\n");
int8u* p = m_rbuf->row(y) + (x << 2); int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
if (fPatternHandler->IsHighColor(x, y)) { rgb_color color = fPatternHandler->R5ColorAt(x, y);
rgb_color color = fPatternHandler->R5ColorAt(x, y); if(*covers)
// int alpha = int(*covers++) * c.a; {
int alpha = int(*covers) * color.alpha; if(*covers == 255)
//int alpha = int(*covers++);
if(alpha)
{ {
if(alpha == 255*255) assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
{ color.red, color.green, color.blue);
// 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);
}
} }
}; else
{
blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
color.red, color.green, color.blue, *covers);
}
}
covers++; covers++;
p += m_rbuf->stride(); p += m_rbuf->stride();
y++; y++;
@@ -216,31 +169,22 @@ printf("DrawingModeAdd::blend_vline()\n");
const int8u* covers, const int8u* covers,
int8u cover) int8u cover)
{ {
//printf("DrawingModeAdd::blend_color_hspan()\n");
int8u* p = m_rbuf->row(y) + (x << 2); int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
int alpha = colors->a * (covers ? int(*covers++) : int(cover)); uint8 alpha = covers ? *covers++ : cover;
if(alpha) if(alpha)
{ {
if(alpha == 255*255) if(alpha == 255)
{ {
p[Order::R] = min_c(255, (int8u)colors->r + p[Order::R]); assign_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
p[Order::G] = min_c(255, (int8u)colors->g + p[Order::G]); colors->r, colors->g, colors->b);
p[Order::B] = min_c(255, (int8u)colors->b + p[Order::B]);
// p[Order::A] = min_c(255, (int8u)colors->a + p[Order::R]);
} }
else else
{ {
int r = p[Order::R]; blend_add(&p[Order::R], &p[Order::G], &p[Order::B], &p[Order::A],
int g = p[Order::G]; colors->r, colors->g, colors->b, alpha);
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);
} }
} }
p += 4; p += 4;
@@ -64,9 +64,9 @@ namespace agg
{ {
//printf("DrawingModeCopy::blend_hline()\n"); //printf("DrawingModeCopy::blend_hline()\n");
int alpha = int(cover) * int(c.a); int alpha = int(cover) * int(c.a);
int8u* p = m_rbuf->row(y) + (x << 2);
if(alpha == 255*255) if(alpha == 255*255)
{ {
int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
rgb_color color = fPatternHandler->R5ColorAt(x, y); rgb_color color = fPatternHandler->R5ColorAt(x, y);
@@ -81,7 +81,6 @@ namespace agg
} }
else else
{ {
int8u* p = m_rbuf->row(y) + (x << 2);
do do
{ {
rgb_color color = fPatternHandler->R5ColorAt(x, y); rgb_color color = fPatternHandler->R5ColorAt(x, y);