From 42a2db36026dcd7414b82247b25c53e5176fab34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 26 Oct 2007 15:31:27 +0000 Subject: [PATCH] * track the fact if Painter is attached to a frame buffer, incorporate this information in the fValidClipping flag... which should prevent any drawing code to run if Painter is not attached properly git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22736 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/drawing/Painter/Painter.cpp | 19 +++++++++++++++---- src/servers/app/drawing/Painter/Painter.h | 7 ++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index 0cc11bfe92..ace264dfc8 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -64,12 +64,13 @@ Painter::Painter() fCurve(fPath), fSubpixelPrecise(false), + fValidClipping(false), + fDrawingText(false), + fAttached(false), fPenSize(1.0), fClippingRegion(NULL), - fValidClipping(false), fDrawingMode(B_OP_COPY), - fDrawingText(false), fAlphaSrcMode(B_PIXEL_ALPHA), fAlphaFncMode(B_ALPHA_OVERLAY), fLineCapMode(B_BUTT_CAP), @@ -98,11 +99,18 @@ void Painter::AttachToBuffer(RenderingBuffer* buffer) { if (buffer && buffer->InitCheck() >= B_OK && - // TODO: implement drawing on B_RGB24, B_RGB15, B_RGB16, B_CMAP8 and B_GRAY8 :-[ (buffer->ColorSpace() == B_RGBA32 || buffer->ColorSpace() == B_RGB32)) { + // TODO: implement drawing on B_RGB24, B_RGB15, B_RGB16, + // B_CMAP8 and B_GRAY8 :-[ + // (if ever we want to support some devices where this gives + // a great speed up, right now it seems fine, even in emulation) + fBuffer.attach((uint8*)buffer->Bits(), buffer->Width(), buffer->Height(), buffer->BytesPerRow()); + fAttached = true; + fValidClipping = fClippingRegion + && fClippingRegion->Frame().IsValid(); // These are the AGG renderes and rasterizes which // will be used for stroking paths @@ -115,6 +123,9 @@ Painter::AttachToBuffer(RenderingBuffer* buffer) void Painter::DetachFromBuffer() { + fBuffer.attach(NULL, 0, 0, 0); + fAttached = false; + fValidClipping = false; } // Bounds @@ -174,7 +185,7 @@ Painter::ConstrainClipping(const BRegion* region) { fClippingRegion = region; fBaseRenderer.set_clipping_region(const_cast(region)); - fValidClipping = region->Frame().IsValid(); + fValidClipping = region->Frame().IsValid() && fAttached; if (fValidClipping) { clipping_rect cb = fClippingRegion->FrameInt(); diff --git a/src/servers/app/drawing/Painter/Painter.h b/src/servers/app/drawing/Painter/Painter.h index abd8656fea..d91d1c4aec 100644 --- a/src/servers/app/drawing/Painter/Painter.h +++ b/src/servers/app/drawing/Painter/Painter.h @@ -261,13 +261,14 @@ mutable agg::path_storage fPath; mutable agg::conv_curve fCurve; // for internal coordinate rounding/transformation - bool fSubpixelPrecise; + bool fSubpixelPrecise : 1; + bool fValidClipping : 1; + bool fDrawingText : 1; + bool fAttached : 1; float fPenSize; const BRegion* fClippingRegion; - bool fValidClipping; drawing_mode fDrawingMode; - bool fDrawingText; source_alpha fAlphaSrcMode; alpha_function fAlphaFncMode; cap_mode fLineCapMode;