reuse DrawingMode instances

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12412 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2005-04-15 12:25:25 +00:00
parent 18f3859aed
commit 0c926a191f
5 changed files with 96 additions and 38 deletions
+3
View File
@@ -17,6 +17,7 @@ class AGGTextRenderer;
class BBitmap;
class BRegion;
class DrawData;
class DrawingModeFactory;
class PatternHandler;
class RenderingBuffer;
class ServerBitmap;
@@ -291,6 +292,8 @@ class Painter {
source_alpha fAlphaSrcMode;
alpha_function fAlphaFncMode;
BPoint fPenLocation;
DrawingModeFactory* fDrawingModeFactory;
PatternHandler* fPatternHandler;
ServerFont fFont;
+6 -4
View File
@@ -61,6 +61,7 @@ Painter::Painter()
// fAlphaSrcMode(B_CONSTANT_ALPHA),
fAlphaFncMode(B_ALPHA_OVERLAY),
fPenLocation(0.0, 0.0),
fDrawingModeFactory(new DrawingModeFactory()),
fPatternHandler(new PatternHandler()),
fTextRenderer(new AGGTextRenderer()),
fLastFamilyAndStyle(0)
@@ -78,6 +79,7 @@ Painter::~Painter()
_MakeEmpty();
delete fClippingRegion;
delete fDrawingModeFactory;
delete fPatternHandler;
delete fTextRenderer;
}
@@ -99,7 +101,7 @@ Painter::AttachToBuffer(RenderingBuffer* buffer)
buffer->BytesPerRow());
fPixelFormat = new pixfmt(*fBuffer, fPatternHandler);
fPixelFormat->set_drawing_mode(DrawingModeFactory::DrawingModeFor(fDrawingMode,
fPixelFormat->set_drawing_mode(fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode,
fAlphaFncMode,
false));
@@ -1035,18 +1037,18 @@ Painter::_UpdateDrawingMode()
pattern p = *fPatternHandler->GetR5Pattern();
if (p == B_SOLID_HIGH) {
_SetRendererColor(fPatternHandler->HighColor().GetColor32());
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode,
mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode,
fAlphaFncMode,
true);
} else if (p == B_SOLID_LOW) {
_SetRendererColor(fPatternHandler->LowColor().GetColor32());
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode,
mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode,
fAlphaFncMode,
true);
} else {
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode,
mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode,
fAlphaFncMode,
false);
@@ -20,6 +20,46 @@
#include "DrawingModeFactory.h"
// constructor
DrawingModeFactory::DrawingModeFactory()
: fDrawingModeBGRA32Over(new DrawingModeBGRA32Over()),
fDrawingModeBGRA32Erase(new DrawingModeBGRA32Erase()),
fDrawingModeBGRA32Invert(new DrawingModeBGRA32Invert()),
fDrawingModeBGRA32Select(new DrawingModeBGRA32Select()),
fDrawingModeBGRA32CopySolid(new DrawingModeBGRA32CopySolid()),
fDrawingModeBGRA32Copy(new DrawingModeBGRA32Copy()),
fDrawingModeBGRA32Add(new DrawingModeBGRA32Add()),
fDrawingModeBGRA32Subtract(new DrawingModeBGRA32Subtract()),
fDrawingModeBGRA32Blend(new DrawingModeBGRA32Blend()),
fDrawingModeBGRA32Min(new DrawingModeBGRA32Min()),
fDrawingModeBGRA32Max(new DrawingModeBGRA32Max()),
fDrawingModeBGRA32AlphaCO(new DrawingModeBGRA32AlphaCO()),
fDrawingModeBGRA32AlphaCC(new DrawingModeBGRA32AlphaCC()),
fDrawingModeBGRA32AlphaPO(new DrawingModeBGRA32AlphaPO()),
fDrawingModeBGRA32AlphaPC(new DrawingModeBGRA32AlphaPC())
{
}
// destructor
DrawingModeFactory::~DrawingModeFactory()
{
delete fDrawingModeBGRA32Over;
delete fDrawingModeBGRA32Erase;
delete fDrawingModeBGRA32Invert;
delete fDrawingModeBGRA32Select;
delete fDrawingModeBGRA32CopySolid;
delete fDrawingModeBGRA32Copy;
delete fDrawingModeBGRA32Add;
delete fDrawingModeBGRA32Subtract;
delete fDrawingModeBGRA32Blend;
delete fDrawingModeBGRA32Min;
delete fDrawingModeBGRA32Max;
delete fDrawingModeBGRA32AlphaCO;
delete fDrawingModeBGRA32AlphaCC;
delete fDrawingModeBGRA32AlphaPO;
delete fDrawingModeBGRA32AlphaPC;
}
// DrawingModeFor
DrawingMode*
DrawingModeFactory::DrawingModeFor(drawing_mode mode,
@@ -31,40 +71,40 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode,
// these drawing modes discard source pixels
// which have the current low color
case B_OP_OVER:
return new DrawingModeBGRA32Over();
return fDrawingModeBGRA32Over;
break;
case B_OP_ERASE:
return new DrawingModeBGRA32Erase();
return fDrawingModeBGRA32Erase;
break;
case B_OP_INVERT:
return new DrawingModeBGRA32Invert();
return fDrawingModeBGRA32Invert;
break;
case B_OP_SELECT:
return new DrawingModeBGRA32Select();
return fDrawingModeBGRA32Select;
break;
// in these drawing modes, the current high
// and low color are treated equally
case B_OP_COPY:
if (solid) {
return new DrawingModeBGRA32CopySolid();
return fDrawingModeBGRA32CopySolid;
} else
return new DrawingModeBGRA32Copy();
return fDrawingModeBGRA32Copy;
break;
case B_OP_ADD:
return new DrawingModeBGRA32Add();
return fDrawingModeBGRA32Add;
break;
case B_OP_SUBTRACT:
return new DrawingModeBGRA32Subtract();
return fDrawingModeBGRA32Subtract;
break;
case B_OP_BLEND:
return new DrawingModeBGRA32Blend();
return fDrawingModeBGRA32Blend;
break;
case B_OP_MIN:
return new DrawingModeBGRA32Min();
return fDrawingModeBGRA32Min;
break;
case B_OP_MAX:
return new DrawingModeBGRA32Max();
return fDrawingModeBGRA32Max;
break;
// this drawing mode is the only one considering
@@ -78,22 +118,22 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode,
case B_OP_ALPHA:
if (alphaSrcMode == B_CONSTANT_ALPHA) {
if (alphaFncMode == B_ALPHA_OVERLAY) {
return new DrawingModeBGRA32AlphaCO();
return fDrawingModeBGRA32AlphaCO;
} else if (alphaFncMode == B_ALPHA_COMPOSITE) {
return new DrawingModeBGRA32AlphaCC();
return fDrawingModeBGRA32AlphaCC;
}
} else if (alphaSrcMode == B_PIXEL_ALPHA){
if (alphaFncMode == B_ALPHA_OVERLAY) {
return new DrawingModeBGRA32AlphaPO();
return fDrawingModeBGRA32AlphaPO;
} else if (alphaFncMode == B_ALPHA_COMPOSITE) {
return new DrawingModeBGRA32AlphaPC();
return fDrawingModeBGRA32AlphaPC;
}
}
break;
default:
fprintf(stderr, "DrawingModeFactory::DrawingModeFor() - drawing_mode not implemented\n");
return new DrawingModeBGRA32Copy();
return fDrawingModeBGRA32Copy;
}
return NULL;
}
@@ -9,13 +9,29 @@
class DrawingModeFactory {
public:
DrawingModeFactory() {}
virtual ~DrawingModeFactory() {}
DrawingModeFactory();
virtual ~DrawingModeFactory();
static DrawingMode* DrawingModeFor(drawing_mode mode,
DrawingMode* DrawingModeFor(drawing_mode mode,
source_alpha alphaSrcMode,
alpha_function alphaFncMode,
bool solid = false);
private:
DrawingMode* fDrawingModeBGRA32Over;
DrawingMode* fDrawingModeBGRA32Erase;
DrawingMode* fDrawingModeBGRA32Invert;
DrawingMode* fDrawingModeBGRA32Select;
DrawingMode* fDrawingModeBGRA32CopySolid;
DrawingMode* fDrawingModeBGRA32Copy;
DrawingMode* fDrawingModeBGRA32Add;
DrawingMode* fDrawingModeBGRA32Subtract;
DrawingMode* fDrawingModeBGRA32Blend;
DrawingMode* fDrawingModeBGRA32Min;
DrawingMode* fDrawingModeBGRA32Max;
DrawingMode* fDrawingModeBGRA32AlphaCO;
DrawingMode* fDrawingModeBGRA32AlphaCC;
DrawingMode* fDrawingModeBGRA32AlphaPO;
DrawingMode* fDrawingModeBGRA32AlphaPC;
};
#endif // DRAWING_MODE_FACTORY_H
@@ -30,15 +30,12 @@ class forwarding_pixel_format {
~forwarding_pixel_format()
{
delete fDrawingMode;
}
// set_drawing_mode
void set_drawing_mode(DrawingMode* mode)
{
if (fDrawingMode != mode) {
// delete old DrawingMode
delete fDrawingMode;
// attach new DrawingMode
fDrawingMode = mode;
if (fDrawingMode) {