* 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:
parent
b7458c6b96
commit
18212e76cc
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku, Inc.
|
* Copyright 2001-2008, Haiku, Inc.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@ -94,7 +94,8 @@ DrawingEngine::DrawingEngine(HWInterface* interface)
|
|||||||
: fPainter(new Painter()),
|
: fPainter(new Painter()),
|
||||||
fGraphicsCard(NULL),
|
fGraphicsCard(NULL),
|
||||||
fAvailableHWAccleration(0),
|
fAvailableHWAccleration(0),
|
||||||
fSuspendSyncLevel(0)
|
fSuspendSyncLevel(0),
|
||||||
|
fCopyToFront(true)
|
||||||
{
|
{
|
||||||
SetHWInterface(interface);
|
SetHWInterface(interface);
|
||||||
}
|
}
|
||||||
@ -176,6 +177,23 @@ DrawingEngine::SetHWInterface(HWInterface* interface)
|
|||||||
FrameBufferChanged();
|
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 -
|
// #pragma mark -
|
||||||
|
|
||||||
//! the DrawingEngine needs to be locked!
|
//! the DrawingEngine needs to be locked!
|
||||||
@ -526,7 +544,7 @@ DrawingEngine::InvertRect(BRect r)
|
|||||||
} else {
|
} else {
|
||||||
fPainter->InvertRect(r);
|
fPainter->InvertRect(r);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(r);
|
_CopyToFront(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -544,7 +562,7 @@ DrawingEngine::DrawBitmap(ServerBitmap *bitmap,
|
|||||||
|
|
||||||
fPainter->DrawBitmap(bitmap, source, dest);
|
fPainter->DrawBitmap(bitmap, source, dest);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(clipped);
|
_CopyToFront(clipped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,7 +591,7 @@ DrawingEngine::DrawArc(BRect r, const float &angle,
|
|||||||
else
|
else
|
||||||
fPainter->StrokeArc(center, xRadius, yRadius, angle, span);
|
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);
|
BRect touched = fPainter->DrawBezier(pts, filled);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
|
|
||||||
// DrawEllipse
|
// DrawEllipse
|
||||||
@ -616,7 +634,7 @@ DrawingEngine::DrawEllipse(BRect r, bool filled)
|
|||||||
|
|
||||||
fPainter->DrawEllipse(r, 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);
|
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);
|
fPainter->StrokeLine(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this function is used to draw a one pixel wide rect
|
// 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);
|
fPainter->StrokeRect(r, color);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(clipped);
|
_CopyToFront(clipped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -713,7 +731,7 @@ DrawingEngine::FillRect(BRect r, const rgb_color& color)
|
|||||||
} else {
|
} else {
|
||||||
fPainter->FillRect(r, color);
|
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);
|
fPainter->FillRectNoClipping(r.RectAtInt(i), color);
|
||||||
}
|
}
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(frame);
|
_CopyToFront(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,7 +792,7 @@ DrawingEngine::StrokeRect(BRect r)
|
|||||||
|
|
||||||
fPainter->StrokeRect(r);
|
fPainter->StrokeRect(r);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(clipped);
|
_CopyToFront(clipped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -827,7 +845,7 @@ DrawingEngine::FillRect(BRect r)
|
|||||||
if (doInSoftware) {
|
if (doInSoftware) {
|
||||||
fPainter->FillRect(r);
|
fPainter->FillRect(r);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(r);
|
_CopyToFront(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -880,7 +898,7 @@ DrawingEngine::FillRegion(BRegion& r)
|
|||||||
touched = touched | fPainter->FillRect(r.RectAt(i));
|
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)
|
BRect touched = filled ? fPainter->FillRoundRect(r, xrad, yrad)
|
||||||
: fPainter->StrokeRoundRect(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,
|
ptCount, ptList,
|
||||||
filled);
|
filled);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -947,7 +965,7 @@ DrawingEngine::DrawTriangle(BPoint* pts, const BRect& bounds, bool filled)
|
|||||||
else
|
else
|
||||||
fPainter->StrokeTriangle(pts[0], pts[1], pts[2]);
|
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);
|
fPainter->StrokeLine(start, end);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1021,7 +1039,7 @@ DrawingEngine::StrokeLineArray(int32 numLines,
|
|||||||
fPainter->SetHighColor(oldColor);
|
fPainter->SetHighColor(oldColor);
|
||||||
fPainter->SetPattern(pattern);
|
fPainter->SetPattern(pattern);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1069,7 +1087,7 @@ DrawingEngine::DrawString(const char* string, int32 length,
|
|||||||
&cacheReference);
|
&cacheReference);
|
||||||
//printf("drawing string: %lld µs\n", system_time() - now);
|
//printf("drawing string: %lld µs\n", system_time() - now);
|
||||||
|
|
||||||
fGraphicsCard->Invalidate(touched);
|
_CopyToFront(touched);
|
||||||
}
|
}
|
||||||
|
|
||||||
return penLocation;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku, Inc.
|
* Copyright 2001-2008, Haiku, Inc.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@ -46,6 +46,11 @@ public:
|
|||||||
// for "changing" hardware
|
// for "changing" hardware
|
||||||
void SetHWInterface(HWInterface* interface);
|
void SetHWInterface(HWInterface* interface);
|
||||||
|
|
||||||
|
void SetCopyToFrontEnabled(bool enable);
|
||||||
|
bool CopyToFrontEnabled() const
|
||||||
|
{ return fCopyToFront; }
|
||||||
|
void CopyToFront(/*const*/ BRegion& region);
|
||||||
|
|
||||||
// locking
|
// locking
|
||||||
bool LockParallelAccess();
|
bool LockParallelAccess();
|
||||||
bool IsParallelAccessLocked();
|
bool IsParallelAccessLocked();
|
||||||
@ -161,10 +166,13 @@ public:
|
|||||||
uint32 height, uint32 bytesPerRow,
|
uint32 height, uint32 bytesPerRow,
|
||||||
int32 xOffset, int32 yOffset) const;
|
int32 xOffset, int32 yOffset) const;
|
||||||
|
|
||||||
|
inline void _CopyToFront(const BRect& frame);
|
||||||
|
|
||||||
Painter* fPainter;
|
Painter* fPainter;
|
||||||
HWInterface* fGraphicsCard;
|
HWInterface* fGraphicsCard;
|
||||||
uint32 fAvailableHWAccleration;
|
uint32 fAvailableHWAccleration;
|
||||||
int32 fSuspendSyncLevel;
|
int32 fSuspendSyncLevel;
|
||||||
|
bool fCopyToFront;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DRAWING_ENGINE_H_
|
#endif // DRAWING_ENGINE_H_
|
||||||
|
Loading…
Reference in New Issue
Block a user