From 0c926a191fafefb7f00767e7e65eb6e6fe010ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 15 Apr 2005 12:25:25 +0000 Subject: [PATCH] reuse DrawingMode instances git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12412 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/servers/app/Painter.h | 3 + src/servers/app/drawing/Painter/Painter.cpp | 34 ++++----- .../drawing_modes/DrawingModeFactory.cpp | 72 ++++++++++++++----- .../drawing_modes/DrawingModeFactory.h | 22 +++++- .../Painter/drawing_modes/forwarding_pixfmt.h | 3 - 5 files changed, 96 insertions(+), 38 deletions(-) diff --git a/headers/private/servers/app/Painter.h b/headers/private/servers/app/Painter.h index b5a74f3e66..700f6c7231 100644 --- a/headers/private/servers/app/Painter.h +++ b/headers/private/servers/app/Painter.h @@ -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; diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index b3b2d7649d..6a3119e458 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -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,10 +101,10 @@ Painter::AttachToBuffer(RenderingBuffer* buffer) buffer->BytesPerRow()); fPixelFormat = new pixfmt(*fBuffer, fPatternHandler); - fPixelFormat->set_drawing_mode(DrawingModeFactory::DrawingModeFor(fDrawingMode, - fAlphaSrcMode, - fAlphaFncMode, - false)); + fPixelFormat->set_drawing_mode(fDrawingModeFactory->DrawingModeFor(fDrawingMode, + fAlphaSrcMode, + fAlphaFncMode, + false)); fBaseRenderer = new renderer_base(*fPixelFormat); // attach our clipping region to the renderer, it keeps a pointer @@ -1035,21 +1037,21 @@ Painter::_UpdateDrawingMode() pattern p = *fPatternHandler->GetR5Pattern(); if (p == B_SOLID_HIGH) { _SetRendererColor(fPatternHandler->HighColor().GetColor32()); - mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, - fAlphaSrcMode, - fAlphaFncMode, - true); + mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode, + fAlphaSrcMode, + fAlphaFncMode, + true); } else if (p == B_SOLID_LOW) { _SetRendererColor(fPatternHandler->LowColor().GetColor32()); - mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, - fAlphaSrcMode, - fAlphaFncMode, - true); + mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode, + fAlphaSrcMode, + fAlphaFncMode, + true); } else { - mode = DrawingModeFactory::DrawingModeFor(fDrawingMode, - fAlphaSrcMode, - fAlphaFncMode, - false); + mode = fDrawingModeFactory->DrawingModeFor(fDrawingMode, + fAlphaSrcMode, + fAlphaFncMode, + false); } fPixelFormat->set_drawing_mode(mode); } diff --git a/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.cpp b/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.cpp index e41744e686..65080526de 100644 --- a/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.cpp +++ b/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.cpp @@ -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; } diff --git a/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.h b/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.h index d8a4743a68..c8f77ac2d9 100644 --- a/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.h +++ b/src/servers/app/drawing/Painter/drawing_modes/DrawingModeFactory.h @@ -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 diff --git a/src/servers/app/drawing/Painter/drawing_modes/forwarding_pixfmt.h b/src/servers/app/drawing/Painter/drawing_modes/forwarding_pixfmt.h index 9c7728439a..678249d0d8 100644 --- a/src/servers/app/drawing/Painter/drawing_modes/forwarding_pixfmt.h +++ b/src/servers/app/drawing/Painter/drawing_modes/forwarding_pixfmt.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) {