* Made it possible to supress automatic back to front buffer copying of the

rectangle area that is touched by a drawing command.
* Added a CopyToFront(BRegion) method which copies a complete region from
  the drawing/back buffer to the front buffer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24353 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2008-03-10 22:24:00 +00:00
parent b7458c6b96
commit 18212e76cc
2 changed files with 56 additions and 22 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2001-2007, Haiku, Inc.
* Copyright 2001-2008, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -94,7 +94,8 @@ DrawingEngine::DrawingEngine(HWInterface* interface)
: fPainter(new Painter()),
fGraphicsCard(NULL),
fAvailableHWAccleration(0),
fSuspendSyncLevel(0)
fSuspendSyncLevel(0),
fCopyToFront(true)
{
SetHWInterface(interface);
}
@ -176,6 +177,23 @@ DrawingEngine::SetHWInterface(HWInterface* interface)
FrameBufferChanged();
}
void
DrawingEngine::SetCopyToFrontEnabled(bool enable)
{
fCopyToFront = enable;
}
void
DrawingEngine::CopyToFront(/*const*/ BRegion& region)
{
int32 count = region.CountRects();
for (int32 i = 0; i < count; i++)
fGraphicsCard->CopyBackToFront(region.RectAt(i));
}
// #pragma mark -
//! the DrawingEngine needs to be locked!
@ -526,7 +544,7 @@ DrawingEngine::InvertRect(BRect r)
} else {
fPainter->InvertRect(r);
fGraphicsCard->Invalidate(r);
_CopyToFront(r);
}
}
}
@ -544,7 +562,7 @@ DrawingEngine::DrawBitmap(ServerBitmap *bitmap,
fPainter->DrawBitmap(bitmap, source, dest);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -573,7 +591,7 @@ DrawingEngine::DrawArc(BRect r, const float &angle,
else
fPainter->StrokeArc(center, xRadius, yRadius, angle, span);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -588,7 +606,7 @@ DrawingEngine::DrawBezier(BPoint *pts, bool filled)
BRect touched = fPainter->DrawBezier(pts, filled);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
// DrawEllipse
@ -616,7 +634,7 @@ DrawingEngine::DrawEllipse(BRect r, bool filled)
fPainter->DrawEllipse(r, filled);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -636,7 +654,7 @@ DrawingEngine::DrawPolygon(BPoint* ptlist, int32 numpts,
fPainter->DrawPolygon(ptlist, numpts, filled, closed);
fGraphicsCard->Invalidate(bounds);
_CopyToFront(bounds);
}
}
@ -669,7 +687,7 @@ DrawingEngine::StrokeLine(const BPoint &start, const BPoint &end,
fPainter->StrokeLine(start, end);
}
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
// this function is used to draw a one pixel wide rect
@ -685,7 +703,7 @@ DrawingEngine::StrokeRect(BRect r, const rgb_color &color)
fPainter->StrokeRect(r, color);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -713,7 +731,7 @@ DrawingEngine::FillRect(BRect r, const rgb_color& color)
} else {
fPainter->FillRect(r, color);
fGraphicsCard->Invalidate(r);
_CopyToFront(r);
}
}
}
@ -753,7 +771,7 @@ DrawingEngine::FillRegion(BRegion& r, const rgb_color& color)
fPainter->FillRectNoClipping(r.RectAtInt(i), color);
}
fGraphicsCard->Invalidate(frame);
_CopyToFront(frame);
}
}
@ -774,7 +792,7 @@ DrawingEngine::StrokeRect(BRect r)
fPainter->StrokeRect(r);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -827,7 +845,7 @@ DrawingEngine::FillRect(BRect r)
if (doInSoftware) {
fPainter->FillRect(r);
fGraphicsCard->Invalidate(r);
_CopyToFront(r);
}
}
}
@ -880,7 +898,7 @@ DrawingEngine::FillRegion(BRegion& r)
touched = touched | fPainter->FillRect(r.RectAt(i));
}
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
}
}
@ -907,7 +925,7 @@ DrawingEngine::DrawRoundRect(BRect r, float xrad, float yrad, bool filled)
BRect touched = filled ? fPainter->FillRoundRect(r, xrad, yrad)
: fPainter->StrokeRoundRect(r, xrad, yrad);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
}
@ -926,7 +944,7 @@ DrawingEngine::DrawShape(const BRect& bounds, int32 opCount,
ptCount, ptList,
filled);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
@ -947,7 +965,7 @@ DrawingEngine::DrawTriangle(BPoint* pts, const BRect& bounds, bool filled)
else
fPainter->StrokeTriangle(pts[0], pts[1], pts[2]);
fGraphicsCard->Invalidate(clipped);
_CopyToFront(clipped);
}
}
@ -966,7 +984,7 @@ DrawingEngine::StrokeLine(const BPoint &start, const BPoint &end)
fPainter->StrokeLine(start, end);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
}
@ -1021,7 +1039,7 @@ DrawingEngine::StrokeLineArray(int32 numLines,
fPainter->SetHighColor(oldColor);
fPainter->SetPattern(pattern);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
}
@ -1069,7 +1087,7 @@ DrawingEngine::DrawString(const char* string, int32 length,
&cacheReference);
//printf("drawing string: %lld µs\n", system_time() - now);
fGraphicsCard->Invalidate(touched);
_CopyToFront(touched);
}
return penLocation;
@ -1279,3 +1297,11 @@ DrawingEngine::_CopyRect(uint8* src, uint32 width, uint32 height,
}
inline void
DrawingEngine::_CopyToFront(const BRect& frame)
{
if (fCopyToFront)
fGraphicsCard->Invalidate(frame);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2001-2007, Haiku, Inc.
* Copyright 2001-2008, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -46,6 +46,11 @@ public:
// for "changing" hardware
void SetHWInterface(HWInterface* interface);
void SetCopyToFrontEnabled(bool enable);
bool CopyToFrontEnabled() const
{ return fCopyToFront; }
void CopyToFront(/*const*/ BRegion& region);
// locking
bool LockParallelAccess();
bool IsParallelAccessLocked();
@ -161,10 +166,13 @@ public:
uint32 height, uint32 bytesPerRow,
int32 xOffset, int32 yOffset) const;
inline void _CopyToFront(const BRect& frame);
Painter* fPainter;
HWInterface* fGraphicsCard;
uint32 fAvailableHWAccleration;
int32 fSuspendSyncLevel;
bool fCopyToFront;
};
#endif // DRAWING_ENGINE_H_