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 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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user