From 8eca754bfd5c448506fa96e6542daa4cf8ab8889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 28 Jan 2005 13:05:37 +0000 Subject: [PATCH] support for the rest of the drawing modes git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11099 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../drawing_modes/DrawingModeFactory.cpp | 60 ++++++++++++++++--- .../drawing_modes/DrawingModeFactory.h | 4 +- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.cpp b/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.cpp index 543ef94764..433020d859 100644 --- a/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.cpp +++ b/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.cpp @@ -1,32 +1,51 @@ // DrawingModeFactory.h +#include #include "DrawingModeAdd.h" +#include "DrawingModeAlphaCC.h" +#include "DrawingModeAlphaCO.h" +#include "DrawingModeAlphaPC.h" +#include "DrawingModeAlphaPO.h" #include "DrawingModeBlend.h" #include "DrawingModeCopy.h" +#include "DrawingModeErase.h" #include "DrawingModeInvert.h" #include "DrawingModeMax.h" #include "DrawingModeMin.h" #include "DrawingModeOver.h" +#include "DrawingModeSelect.h" #include "DrawingModeSubtract.h" #include "DrawingModeFactory.h" // DrawingModeFor agg::DrawingMode* -DrawingModeFactory::DrawingModeFor(drawing_mode mode) +DrawingModeFactory::DrawingModeFor(drawing_mode mode, + source_alpha alphaSrcMode, + alpha_function alphaFncMode) { switch (mode) { - case B_OP_INVERT: - return new agg::DrawingModeBGRA32Invert(); - break; - case B_OP_COPY: - return new agg::DrawingModeBGRA32Copy(); - break; + // these drawing modes discard source pixels + // which have the current low color case B_OP_OVER: return new agg::DrawingModeBGRA32Over(); break; + case B_OP_ERASE: + return new agg::DrawingModeBGRA32Erase(); + break; + case B_OP_INVERT: + return new agg::DrawingModeBGRA32Invert(); + break; + case B_OP_SELECT: + return new agg::DrawingModeBGRA32Select(); + break; + // in these drawing modes, the current high + // and low color are treated equally + case B_OP_COPY: + return new agg::DrawingModeBGRA32Copy(); + break; case B_OP_ADD: return new agg::DrawingModeBGRA32Add(); break; @@ -36,7 +55,6 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode) case B_OP_BLEND: return new agg::DrawingModeBGRA32Blend(); break; - case B_OP_MIN: return new agg::DrawingModeBGRA32Min(); break; @@ -44,8 +62,34 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode) return new agg::DrawingModeBGRA32Max(); break; + // this drawing mode is the only one considering + // alpha at all. In B_CONSTANT_ALPHA, the alpha + // value from the current high color is used for + // all computations. In B_PIXEL_ALPHA, the alpha + // is considered at every source pixel. + // To simplify the implementation, four separate + // DrawingMode classes are used to cover the + // four possible combinations of alpha enabled drawing. + case B_OP_ALPHA: + if (alphaSrcMode == B_CONSTANT_ALPHA) { + if (alphaFncMode == B_ALPHA_OVERLAY) { + return new agg::DrawingModeBGRA32AlphaCO(); + } else if (alphaFncMode == B_ALPHA_COMPOSITE) { + return new agg::DrawingModeBGRA32AlphaCC(); + } + } else if (alphaSrcMode == B_PIXEL_ALPHA){ + if (alphaFncMode == B_ALPHA_OVERLAY) { + return new agg::DrawingModeBGRA32AlphaPO(); + } else if (alphaFncMode == B_ALPHA_COMPOSITE) { + return new agg::DrawingModeBGRA32AlphaPC(); + } + } + break; + default: +fprintf(stderr, "DrawingModeFactory::DrawingModeFor() - drawing_mode not implemented\n"); return new agg::DrawingModeBGRA32Copy(); } + return NULL; } diff --git a/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.h b/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.h index ac130b5e8b..392d6ab1b7 100644 --- a/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.h +++ b/src/servers/app/server/Painter/drawing_modes/DrawingModeFactory.h @@ -12,7 +12,9 @@ class DrawingModeFactory { DrawingModeFactory() {} virtual ~DrawingModeFactory() {} - static agg::DrawingMode* DrawingModeFor(drawing_mode mode); + static agg::DrawingMode* DrawingModeFor(drawing_mode mode, + source_alpha alphaSrcMode, + alpha_function alphaFncMode); }; #endif // DRAWING_MODE_FACTORY_H