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 BBitmap;
class BRegion; class BRegion;
class DrawData; class DrawData;
class DrawingModeFactory;
class PatternHandler; class PatternHandler;
class RenderingBuffer; class RenderingBuffer;
class ServerBitmap; class ServerBitmap;
@@ -291,6 +292,8 @@ class Painter {
source_alpha fAlphaSrcMode; source_alpha fAlphaSrcMode;
alpha_function fAlphaFncMode; alpha_function fAlphaFncMode;
BPoint fPenLocation; BPoint fPenLocation;
DrawingModeFactory* fDrawingModeFactory;
PatternHandler* fPatternHandler; PatternHandler* fPatternHandler;
ServerFont fFont; ServerFont fFont;
+18 -16
View File
@@ -61,6 +61,7 @@ Painter::Painter()
// fAlphaSrcMode(B_CONSTANT_ALPHA), // fAlphaSrcMode(B_CONSTANT_ALPHA),
fAlphaFncMode(B_ALPHA_OVERLAY), fAlphaFncMode(B_ALPHA_OVERLAY),
fPenLocation(0.0, 0.0), fPenLocation(0.0, 0.0),
fDrawingModeFactory(new DrawingModeFactory()),
fPatternHandler(new PatternHandler()), fPatternHandler(new PatternHandler()),
fTextRenderer(new AGGTextRenderer()), fTextRenderer(new AGGTextRenderer()),
fLastFamilyAndStyle(0) fLastFamilyAndStyle(0)
@@ -78,6 +79,7 @@ Painter::~Painter()
_MakeEmpty(); _MakeEmpty();
delete fClippingRegion; delete fClippingRegion;
delete fDrawingModeFactory;
delete fPatternHandler; delete fPatternHandler;
delete fTextRenderer; delete fTextRenderer;
} }
@@ -99,10 +101,10 @@ Painter::AttachToBuffer(RenderingBuffer* buffer)
buffer->BytesPerRow()); buffer->BytesPerRow());
fPixelFormat = new pixfmt(*fBuffer, fPatternHandler); fPixelFormat = new pixfmt(*fBuffer, fPatternHandler);
fPixelFormat->set_drawing_mode(DrawingModeFactory::DrawingModeFor(fDrawingMode, fPixelFormat->set_drawing_mode(fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode, fAlphaSrcMode,
fAlphaFncMode, fAlphaFncMode,
false)); false));
fBaseRenderer = new renderer_base(*fPixelFormat); fBaseRenderer = new renderer_base(*fPixelFormat);
// attach our clipping region to the renderer, it keeps a pointer // attach our clipping region to the renderer, it keeps a pointer
@@ -1035,21 +1037,21 @@ Painter::_UpdateDrawingMode()
pattern p = *fPatternHandler->GetR5Pattern(); pattern p = *fPatternHandler->GetR5Pattern();
if (p == B_SOLID_HIGH) { if (p == B_SOLID_HIGH) {
_SetRendererColor(fPatternHandler->HighColor().GetColor32()); _SetRendererColor(fPatternHandler->HighColor().GetColor32());
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode, fAlphaSrcMode,
fAlphaFncMode, fAlphaFncMode,
true); true);
} else if (p == B_SOLID_LOW) { } else if (p == B_SOLID_LOW) {
_SetRendererColor(fPatternHandler->LowColor().GetColor32()); _SetRendererColor(fPatternHandler->LowColor().GetColor32());
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode, fAlphaSrcMode,
fAlphaFncMode, fAlphaFncMode,
true); true);
} else { } else {
mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode,
fAlphaSrcMode, fAlphaSrcMode,
fAlphaFncMode, fAlphaFncMode,
false); false);
} }
fPixelFormat->set_drawing_mode(mode); fPixelFormat->set_drawing_mode(mode);
} }
@@ -20,6 +20,46 @@
#include "DrawingModeFactory.h" #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 // DrawingModeFor
DrawingMode* DrawingMode*
DrawingModeFactory::DrawingModeFor(drawing_mode mode, DrawingModeFactory::DrawingModeFor(drawing_mode mode,
@@ -31,40 +71,40 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode,
// these drawing modes discard source pixels // these drawing modes discard source pixels
// which have the current low color // which have the current low color
case B_OP_OVER: case B_OP_OVER:
return new DrawingModeBGRA32Over(); return fDrawingModeBGRA32Over;
break; break;
case B_OP_ERASE: case B_OP_ERASE:
return new DrawingModeBGRA32Erase(); return fDrawingModeBGRA32Erase;
break; break;
case B_OP_INVERT: case B_OP_INVERT:
return new DrawingModeBGRA32Invert(); return fDrawingModeBGRA32Invert;
break; break;
case B_OP_SELECT: case B_OP_SELECT:
return new DrawingModeBGRA32Select(); return fDrawingModeBGRA32Select;
break; break;
// in these drawing modes, the current high // in these drawing modes, the current high
// and low color are treated equally // and low color are treated equally
case B_OP_COPY: case B_OP_COPY:
if (solid) { if (solid) {
return new DrawingModeBGRA32CopySolid(); return fDrawingModeBGRA32CopySolid;
} else } else
return new DrawingModeBGRA32Copy(); return fDrawingModeBGRA32Copy;
break; break;
case B_OP_ADD: case B_OP_ADD:
return new DrawingModeBGRA32Add(); return fDrawingModeBGRA32Add;
break; break;
case B_OP_SUBTRACT: case B_OP_SUBTRACT:
return new DrawingModeBGRA32Subtract(); return fDrawingModeBGRA32Subtract;
break; break;
case B_OP_BLEND: case B_OP_BLEND:
return new DrawingModeBGRA32Blend(); return fDrawingModeBGRA32Blend;
break; break;
case B_OP_MIN: case B_OP_MIN:
return new DrawingModeBGRA32Min(); return fDrawingModeBGRA32Min;
break; break;
case B_OP_MAX: case B_OP_MAX:
return new DrawingModeBGRA32Max(); return fDrawingModeBGRA32Max;
break; break;
// this drawing mode is the only one considering // this drawing mode is the only one considering
@@ -78,22 +118,22 @@ DrawingModeFactory::DrawingModeFor(drawing_mode mode,
case B_OP_ALPHA: case B_OP_ALPHA:
if (alphaSrcMode == B_CONSTANT_ALPHA) { if (alphaSrcMode == B_CONSTANT_ALPHA) {
if (alphaFncMode == B_ALPHA_OVERLAY) { if (alphaFncMode == B_ALPHA_OVERLAY) {
return new DrawingModeBGRA32AlphaCO(); return fDrawingModeBGRA32AlphaCO;
} else if (alphaFncMode == B_ALPHA_COMPOSITE) { } else if (alphaFncMode == B_ALPHA_COMPOSITE) {
return new DrawingModeBGRA32AlphaCC(); return fDrawingModeBGRA32AlphaCC;
} }
} else if (alphaSrcMode == B_PIXEL_ALPHA){ } else if (alphaSrcMode == B_PIXEL_ALPHA){
if (alphaFncMode == B_ALPHA_OVERLAY) { if (alphaFncMode == B_ALPHA_OVERLAY) {
return new DrawingModeBGRA32AlphaPO(); return fDrawingModeBGRA32AlphaPO;
} else if (alphaFncMode == B_ALPHA_COMPOSITE) { } else if (alphaFncMode == B_ALPHA_COMPOSITE) {
return new DrawingModeBGRA32AlphaPC(); return fDrawingModeBGRA32AlphaPC;
} }
} }
break; break;
default: default:
fprintf(stderr, "DrawingModeFactory::DrawingModeFor() - drawing_mode not implemented\n"); fprintf(stderr, "DrawingModeFactory::DrawingModeFor() - drawing_mode not implemented\n");
return new DrawingModeBGRA32Copy(); return fDrawingModeBGRA32Copy;
} }
return NULL; return NULL;
} }
@@ -9,13 +9,29 @@
class DrawingModeFactory { class DrawingModeFactory {
public: public:
DrawingModeFactory() {} DrawingModeFactory();
virtual ~DrawingModeFactory() {} virtual ~DrawingModeFactory();
static DrawingMode* DrawingModeFor(drawing_mode mode, DrawingMode* DrawingModeFor(drawing_mode mode,
source_alpha alphaSrcMode, source_alpha alphaSrcMode,
alpha_function alphaFncMode, alpha_function alphaFncMode,
bool solid = false); 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 #endif // DRAWING_MODE_FACTORY_H
@@ -30,15 +30,12 @@ class forwarding_pixel_format {
~forwarding_pixel_format() ~forwarding_pixel_format()
{ {
delete fDrawingMode;
} }
// set_drawing_mode // set_drawing_mode
void set_drawing_mode(DrawingMode* mode) void set_drawing_mode(DrawingMode* mode)
{ {
if (fDrawingMode != mode) { if (fDrawingMode != mode) {
// delete old DrawingMode
delete fDrawingMode;
// attach new DrawingMode // attach new DrawingMode
fDrawingMode = mode; fDrawingMode = mode;
if (fDrawingMode) { if (fDrawingMode) {