reuse DrawingMode instances
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12412 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user