Added to Utils a function to compute polygon boundaries
Moved Utils to libappserver - DisplaySupport needs it Tweaked PicturePlayer to match polygon function tweaks Added Shape, Region, and Polygon handling to ServerWindow Removed ServerWindow::DispatchGraphicsMessage Numerous small tweaks to DisplayDriver git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8991 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
c33ef86b1d
commit
98ecc9715d
@ -98,8 +98,14 @@ void DisplayDriver::Shutdown(void)
|
||||
|
||||
If the destination is not the same size as the source, the source should be scaled to fit.
|
||||
*/
|
||||
void DisplayDriver::CopyBits(const BRect &src, const BRect &dest)
|
||||
void DisplayDriver::CopyBits(const BRect &src, const BRect &dest, const DrawData *d)
|
||||
{
|
||||
if(!d)
|
||||
return;
|
||||
|
||||
Lock();
|
||||
Blit(src,dest,d);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -109,6 +115,7 @@ void DisplayDriver::CopyBits(const BRect &src, const BRect &dest)
|
||||
*/
|
||||
void DisplayDriver::CopyRegion(BRegion *src, const BPoint &lefttop)
|
||||
{
|
||||
// TODO: Implement DisplayDriver;:CopyRegion
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -566,8 +573,7 @@ void DisplayDriver::DrawString(const char *string, const int32 &length, const BP
|
||||
previous=glyph_index;
|
||||
}
|
||||
|
||||
// TODO: implement properly
|
||||
// calculate the invalid rectangle
|
||||
// TODO: implement calculation of invalid rectangle in DisplayDriver::DrawString properly
|
||||
BRect r;
|
||||
r.left=MIN(point.x,pen.x>>6);
|
||||
r.right=MAX(point.x,pen.x>>6);
|
||||
@ -670,6 +676,8 @@ void DisplayDriver::BlitMono2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD
|
||||
destindex+=destinc;
|
||||
}
|
||||
ReleaseBuffer();
|
||||
|
||||
// TODO: test to see if Invalidate calls should be made in DisplayDriver::BlitMono2RGB32
|
||||
Invalidate(BRect(pt.x, pt.y, pt.x + srcwidth, pt.y + srcheight));
|
||||
}
|
||||
|
||||
@ -792,6 +800,7 @@ void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD
|
||||
destindex+=destinc;
|
||||
}
|
||||
ReleaseBuffer();
|
||||
// TODO: test to see if Invalidate calls should be made in DisplayDriver::BlitGray2RGB32
|
||||
Invalidate(BRect(pt.x, pt.y, pt.x + srcwidth, pt.y + srcheight));
|
||||
}
|
||||
|
||||
@ -1164,6 +1173,7 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa
|
||||
}
|
||||
}
|
||||
}
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -1527,6 +1537,7 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa
|
||||
}
|
||||
}
|
||||
}
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -1535,7 +1546,7 @@ void DisplayDriver::FillBezier(BPoint *pts, const RGBColor &color)
|
||||
Lock();
|
||||
|
||||
BezierCurve curve(pts);
|
||||
FillPolygon(curve.GetPointArray(), curve.points.CountItems(), color);
|
||||
FillPolygon(curve.GetPointArray(), curve.points.CountItems(), curve.Frame(), color);
|
||||
|
||||
Unlock();
|
||||
}
|
||||
@ -1551,7 +1562,7 @@ void DisplayDriver::FillBezier(BPoint *pts, const DrawData *d)
|
||||
Lock();
|
||||
|
||||
BezierCurve curve(pts);
|
||||
FillPolygon(curve.GetPointArray(), curve.points.CountItems(), d);
|
||||
FillPolygon(curve.GetPointArray(), curve.points.CountItems(), curve.Frame(), d);
|
||||
|
||||
Unlock();
|
||||
}
|
||||
@ -1685,6 +1696,7 @@ void DisplayDriver::FillEllipse(const BRect &r, const DrawData *d)
|
||||
StrokeLine(BPoint(xc-x,yc-y),BPoint(xc+x,yc-y),&data);
|
||||
StrokeLine(BPoint(xc-x,yc+y),BPoint(xc+x,yc+y),&data);
|
||||
}
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -1694,7 +1706,7 @@ void DisplayDriver::FillEllipse(const BRect &r, const DrawData *d)
|
||||
\param numpts Number of points in the BPoint array.
|
||||
\param color The color of the polygon
|
||||
*/
|
||||
void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &color)
|
||||
void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const BRect &bounds, const RGBColor &color)
|
||||
{
|
||||
/* Here's the plan. Record all line segments in polygon. If a line segments crosses
|
||||
the y-value of a point not in the segment, split the segment into 2 segments.
|
||||
@ -1721,7 +1733,8 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &co
|
||||
maxX = ROUND(ptlist[0].x);
|
||||
minY = ROUND(ptlist[0].y);
|
||||
maxY = ROUND(ptlist[0].y);
|
||||
/* Generate the segment list */
|
||||
|
||||
// Generate the segment list
|
||||
currentPoint = ptlist;
|
||||
currentIndex = 0;
|
||||
nextPoint = &ptlist[1];
|
||||
@ -1776,7 +1789,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &co
|
||||
}
|
||||
}
|
||||
|
||||
/* Selection sort the segments. Probably should replace this later. */
|
||||
// Selection sort the segments. Probably should replace this later.
|
||||
for (i=0; i<numSegments; i++)
|
||||
{
|
||||
bestIndex = i;
|
||||
@ -1791,7 +1804,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &co
|
||||
segmentArray[i].Swap(segmentArray[bestIndex]);
|
||||
}
|
||||
|
||||
/* Draw the lines */
|
||||
// Draw the lines
|
||||
for (y=minY; y<=maxY; y++)
|
||||
{
|
||||
i = 0;
|
||||
@ -1824,6 +1837,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &co
|
||||
}
|
||||
|
||||
delete[] segmentArray;
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
|
||||
}
|
||||
@ -1834,7 +1848,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const RGBColor &co
|
||||
\param numpts Number of points in the BPoint array.
|
||||
\param d The 50 bazillion drawing options (inluding clip region)
|
||||
*/
|
||||
void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const BRect &bounds, const DrawData *d)
|
||||
{
|
||||
/* Here's the plan. Record all line segments in polygon. If a line segments crosses
|
||||
the y-value of a point not in the segment, split the segment into 2 segments.
|
||||
@ -1861,7 +1875,8 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
maxX = ROUND(ptlist[0].x);
|
||||
minY = ROUND(ptlist[0].y);
|
||||
maxY = ROUND(ptlist[0].y);
|
||||
/* Generate the segment list */
|
||||
|
||||
// Generate the segment list
|
||||
currentPoint = ptlist;
|
||||
currentIndex = 0;
|
||||
nextPoint = &ptlist[1];
|
||||
@ -1916,7 +1931,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
}
|
||||
}
|
||||
|
||||
/* Selection sort the segments. Probably should replace this later. */
|
||||
// Selection sort the segments. Probably should replace this later.
|
||||
for (i=0; i<numSegments; i++)
|
||||
{
|
||||
bestIndex = i;
|
||||
@ -1933,7 +1948,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
|
||||
if ( !d->clipReg )
|
||||
{
|
||||
/* Draw the lines */
|
||||
// Draw the lines
|
||||
for (y=minY; y<=maxY; y++)
|
||||
{
|
||||
i = 0;
|
||||
@ -1985,7 +2000,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
yStart = MAX(minY,ROUND(clipRect.top));
|
||||
yEnd = MIN(maxY,ROUND(clipRect.bottom));
|
||||
|
||||
/* Draw the lines */
|
||||
// Draw the lines
|
||||
for (y=yStart; y<=yEnd; y++)
|
||||
{
|
||||
i = 0;
|
||||
@ -2035,6 +2050,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d)
|
||||
}
|
||||
}
|
||||
delete[] segmentArray;
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2077,6 +2093,7 @@ void DisplayDriver::FillRect(const BRect &r, const DrawData *d)
|
||||
}
|
||||
else
|
||||
FillPatternRect(r,d);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2094,7 +2111,7 @@ void DisplayDriver::FillRegion(BRegion& r, const RGBColor &color)
|
||||
numRects = r.CountRects();
|
||||
for(int32 i=0; i<numRects;i++)
|
||||
FillSolidRect(r.RectAt(i),color);
|
||||
|
||||
Invalidate(r.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2131,7 +2148,7 @@ void DisplayDriver::FillRegion(BRegion& r, const DrawData *d)
|
||||
for(int32 i=0; i<numRects;i++)
|
||||
FillPatternRect(r.RectAt(i),d);
|
||||
}
|
||||
|
||||
Invalidate(r.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2150,6 +2167,7 @@ void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float
|
||||
StrokeSolidLine(ROUND(r.left+xrad-arc_x), ROUND(r.bottom-yrad+i), ROUND(r.right-xrad+arc_x), ROUND(r.bottom-yrad+i),color);
|
||||
}
|
||||
FillSolidRect(BRect(r.left,r.top+yrad,r.right,r.bottom-yrad),color);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2209,14 +2227,18 @@ void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float
|
||||
}
|
||||
}
|
||||
FillPatternRect(BRect(r.left,r.top+yrad,r.right,r.bottom-yrad),d);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
//void DisplayDriver::FillShape(SShape *sh, const DrawData *d, const Pattern &pat)
|
||||
//{
|
||||
//}
|
||||
void DisplayDriver::FillShape(const BRect &bounds, const int32 &opcount, const int32 *oplist,
|
||||
const int32 &ptcount, const BPoint *ptlist, const DrawData *d)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::FillShape. How, though? AGG backend?
|
||||
printf("DisplayDriver::FillShape unimplemented\n");
|
||||
}
|
||||
|
||||
void DisplayDriver::FillTriangle(BPoint *pts, const RGBColor &color)
|
||||
void DisplayDriver::FillTriangle(BPoint *pts, const BRect &bounds, const RGBColor &color)
|
||||
{
|
||||
if ( !pts )
|
||||
return;
|
||||
@ -2306,7 +2328,9 @@ void DisplayDriver::FillTriangle(BPoint *pts, const RGBColor &color)
|
||||
|
||||
for(i=(int32)second.y; i<=third.y; i++)
|
||||
StrokeSolidLine(ROUND(lineC.GetX(i)), i, ROUND(lineB.GetX(i)), i, color);
|
||||
|
||||
|
||||
Invalidate(bounds);
|
||||
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2315,7 +2339,7 @@ void DisplayDriver::FillTriangle(BPoint *pts, const RGBColor &color)
|
||||
\param pts Array of 3 BPoints. Always non-NULL.
|
||||
\param setLine Horizontal line drawing routine which handles things like color and pattern.
|
||||
*/
|
||||
void DisplayDriver::FillTriangle(BPoint *pts, const DrawData *d)
|
||||
void DisplayDriver::FillTriangle(BPoint *pts, const BRect &bounds, const DrawData *d)
|
||||
{
|
||||
if ( !pts )
|
||||
return;
|
||||
@ -2326,7 +2350,7 @@ void DisplayDriver::FillTriangle(BPoint *pts, const DrawData *d)
|
||||
{
|
||||
// For now, cop out and use FillPolygon
|
||||
// Need to investigate if Triangle specific code would save processing time
|
||||
FillPolygon(pts,3,d);
|
||||
FillPolygon(pts,3,bounds,d);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2415,7 +2439,9 @@ void DisplayDriver::FillTriangle(BPoint *pts, const DrawData *d)
|
||||
for(i=(int32)second.y; i<=third.y; i++)
|
||||
StrokePatternLine(ROUND(lineC.GetX(i)), i, ROUND(lineB.GetX(i)), i, d);
|
||||
}
|
||||
|
||||
|
||||
Invalidate(bounds);
|
||||
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2775,7 +2801,7 @@ void DisplayDriver::StrokeArc(const BRect &r, const float &angle, const float &s
|
||||
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
||||
StrokePoint(BPoint(xc+x,yc+y),color);
|
||||
}
|
||||
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2938,7 +2964,7 @@ void DisplayDriver::StrokeArc(const BRect &r, const float &angle, const float &s
|
||||
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
||||
StrokePoint(BPoint(xc+x,yc+y),d);
|
||||
}
|
||||
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2957,6 +2983,7 @@ void DisplayDriver::StrokeBezier(BPoint *pts, const RGBColor &color)
|
||||
numLines = curve.points.CountItems()-1;
|
||||
for (i=0; i<numLines; i++)
|
||||
StrokeLine(*((BPoint*)curve.points.ItemAt(i)),*((BPoint*)curve.points.ItemAt(i+1)),color);
|
||||
Invalidate(curve.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -2975,6 +3002,7 @@ void DisplayDriver::StrokeBezier(BPoint *pts, const DrawData *d)
|
||||
numLines = curve.points.CountItems()-1;
|
||||
for (i=0; i<numLines; i++)
|
||||
StrokeLine(*((BPoint*)curve.points.ItemAt(i)),*((BPoint*)curve.points.ItemAt(i+1)),d);
|
||||
Invalidate(curve.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3045,7 +3073,7 @@ void DisplayDriver::StrokeEllipse(const BRect &r, const RGBColor &color)
|
||||
StrokeLine(BPoint(xc-lastx,yc+lasty),BPoint(xc-x,yc+y),color);
|
||||
StrokeLine(BPoint(xc+lastx,yc+lasty),BPoint(xc+x,yc+y),color);
|
||||
}
|
||||
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3116,7 +3144,7 @@ void DisplayDriver::StrokeEllipse(const BRect &r, const DrawData *d)
|
||||
StrokeLine(BPoint(xc-lastx,yc+lasty),BPoint(xc-x,yc+y),d);
|
||||
StrokeLine(BPoint(xc+lastx,yc+lasty),BPoint(xc+x,yc+y),d);
|
||||
}
|
||||
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3130,6 +3158,7 @@ void DisplayDriver::StrokeLine(const BPoint &start, const BPoint &end, const RGB
|
||||
{
|
||||
Lock();
|
||||
StrokeSolidLine(ROUND(start.x),ROUND(start.y),ROUND(end.x),ROUND(end.y),color);
|
||||
Invalidate(BRect(start,end));
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3234,9 +3263,10 @@ void DisplayDriver::StrokeLine(const BPoint &start, const BPoint &end, const Dra
|
||||
corners[3].x += xoffset;
|
||||
corners[3].y += yoffset;
|
||||
}
|
||||
FillPolygon(corners,4,d);
|
||||
FillPolygon(corners,4,BRect(start,end),d);
|
||||
}
|
||||
}
|
||||
Invalidate(BRect(start,end));
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3273,19 +3303,22 @@ void DisplayDriver::StrokeLine(const BPoint &start, const BPoint &end, DisplayDr
|
||||
y += yInc;
|
||||
(driver->*setPixel)(ROUND(x),ROUND(y));
|
||||
}
|
||||
Invalidate(BRect(start,end));
|
||||
}
|
||||
|
||||
void DisplayDriver::StrokePoint(const BPoint& pt, const RGBColor &color)
|
||||
{
|
||||
StrokeLine(pt, pt, color);
|
||||
Invalidate(BRect(pt,pt));
|
||||
}
|
||||
|
||||
void DisplayDriver::StrokePoint(const BPoint& pt, const DrawData *d)
|
||||
{
|
||||
StrokeLine(pt, pt, d);
|
||||
Invalidate(BRect(pt,pt));
|
||||
}
|
||||
|
||||
void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const RGBColor &color, bool is_closed)
|
||||
void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const BRect &bounds, const RGBColor &color, bool is_closed)
|
||||
{
|
||||
if(!ptlist)
|
||||
return;
|
||||
@ -3295,6 +3328,7 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const RGBColor &
|
||||
StrokeLine(ptlist[i],ptlist[i+1],color);
|
||||
if(is_closed)
|
||||
StrokeLine(ptlist[numpts-1],ptlist[0],color);
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3304,7 +3338,7 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const RGBColor &
|
||||
\param numpts Number of points in the BPoint array.
|
||||
\param d DrawData containing all of the other options
|
||||
*/
|
||||
void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData *d, bool is_closed)
|
||||
void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const BRect &bounds, const DrawData *d, bool is_closed)
|
||||
{
|
||||
if(!ptlist)
|
||||
return;
|
||||
@ -3314,6 +3348,7 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData *
|
||||
StrokeLine(ptlist[i],ptlist[i+1],d);
|
||||
if(is_closed)
|
||||
StrokeLine(ptlist[numpts-1],ptlist[0],d);
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3326,10 +3361,8 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData *
|
||||
void DisplayDriver::StrokeRect(const BRect &r, const RGBColor &color)
|
||||
{
|
||||
Lock();
|
||||
StrokeLine(r.LeftTop(),r.RightTop(),color);
|
||||
StrokeLine(r.LeftTop(),r.LeftBottom(),color);
|
||||
StrokeLine(r.RightTop(),r.RightBottom(),color);
|
||||
StrokeLine(r.LeftBottom(),r.RightBottom(),color);
|
||||
StrokeSolidRect(r,color);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3340,6 +3373,7 @@ void DisplayDriver::StrokeRect(const BRect &r, const DrawData *d)
|
||||
StrokeLine(r.LeftTop(),r.LeftBottom(),d);
|
||||
StrokeLine(r.RightTop(),r.RightBottom(),d);
|
||||
StrokeLine(r.LeftBottom(),r.RightBottom(),d);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3356,7 +3390,7 @@ void DisplayDriver::StrokeRegion(BRegion& r, const RGBColor &color)
|
||||
|
||||
for(int32 i=0; i<r.CountRects();i++)
|
||||
StrokeRect(r.RectAt(i),color);
|
||||
|
||||
Invalidate(r.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3366,7 +3400,7 @@ void DisplayDriver::StrokeRegion(BRegion& r, const DrawData *d)
|
||||
|
||||
for(int32 i=0; i<r.CountRects();i++)
|
||||
StrokeRect(r.RectAt(i),d);
|
||||
|
||||
Invalidate(r.Frame());
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3397,6 +3431,7 @@ void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const flo
|
||||
|
||||
StrokeArc(BRect(bRight,bBottom,r.right,r.bottom), 270, 90, color);
|
||||
StrokeLine(BPoint(r.right, vBottom), BPoint(r.right, vTop), color);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3434,34 +3469,39 @@ void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const flo
|
||||
|
||||
StrokeArc(BRect(bRight,bBottom,r.right,r.bottom), 270, 90, d);
|
||||
StrokeLine(BPoint(r.right, vBottom), BPoint(r.right, vTop), d);
|
||||
Invalidate(r);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
//void DisplayDriver::StrokeShape(SShape *sh, const DrawData *d, const Pattern &pat)
|
||||
//{
|
||||
//}
|
||||
void DisplayDriver::StrokeShape(const BRect &bounds, const int32 &opcount, const int32 *oplist,
|
||||
const int32 &ptcount, const BPoint *ptlist, const DrawData *d)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::StrokeShape. ShapeIterator subclass?
|
||||
printf("DisplayDriver::StrokeShape unimplemented\n");
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Called for all BView::StrokeTriangle calls
|
||||
\param pts Array of 3 BPoints. Always non-NULL.
|
||||
\param pensize The line thickness
|
||||
\param color The color of the lines
|
||||
*/
|
||||
void DisplayDriver::StrokeTriangle(BPoint *pts, const RGBColor &color)
|
||||
void DisplayDriver::StrokeTriangle(BPoint *pts, const BRect &bounds, const RGBColor &color)
|
||||
{
|
||||
Lock();
|
||||
StrokeLine(pts[0],pts[1],color);
|
||||
StrokeLine(pts[1],pts[2],color);
|
||||
StrokeLine(pts[2],pts[0],color);
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
void DisplayDriver::StrokeTriangle(BPoint *pts, const DrawData *d)
|
||||
void DisplayDriver::StrokeTriangle(BPoint *pts, const BRect &bounds, const DrawData *d)
|
||||
{
|
||||
Lock();
|
||||
StrokeLine(pts[0],pts[1],d);
|
||||
StrokeLine(pts[1],pts[2],d);
|
||||
StrokeLine(pts[2],pts[0],d);
|
||||
Invalidate(bounds);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3486,6 +3526,8 @@ void DisplayDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const Dr
|
||||
StrokeLine(pts[i<<1],pts[i<<1+1],&data);
|
||||
}
|
||||
|
||||
// TODO: calculate invalid region for DisplayDriver::StrokeLineArray
|
||||
|
||||
Unlock();
|
||||
}
|
||||
|
||||
@ -3699,6 +3741,7 @@ float DisplayDriver::StringHeight(const char *string, int32 length, const DrawDa
|
||||
void DisplayDriver::GetBoundingBoxes(const char *string, int32 count,
|
||||
font_metric_mode mode, escapement_delta *delta, BRect *rectarray, const DrawData *d)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::GetBoundingBoxes
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -3717,6 +3760,7 @@ void DisplayDriver::GetBoundingBoxes(const char *string, int32 count,
|
||||
void DisplayDriver::GetEscapements(const char *string, int32 charcount,
|
||||
escapement_delta *delta, escapement_delta *escapements, escapement_delta *offsets, const DrawData *d)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::GetEscapements
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -3730,6 +3774,7 @@ void DisplayDriver::GetEscapements(const char *string, int32 charcount,
|
||||
*/
|
||||
void DisplayDriver::GetEdges(const char *string, int32 charcount, edge_info *edgearray, const DrawData *d)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::GetEdges
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -3742,6 +3787,7 @@ void DisplayDriver::GetEdges(const char *string, int32 charcount, edge_info *edg
|
||||
*/
|
||||
void DisplayDriver::GetHasGlyphs(const char *string, int32 charcount, bool *hasarray)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::GetHasGlyphs
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -3758,6 +3804,7 @@ void DisplayDriver::GetHasGlyphs(const char *string, int32 charcount, bool *hasa
|
||||
void DisplayDriver::GetTruncatedStrings(const char **instrings,const int32 &stringcount,
|
||||
const uint32 &mode, const float &maxwidth, char **outstrings)
|
||||
{
|
||||
// TODO: Implement DisplayDriver::GetTruncatedStrings
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -4043,7 +4090,7 @@ void DisplayDriver::StrokeSolidLine(int32 x1, int32 y1, int32 x2, int32 y2, cons
|
||||
{
|
||||
}
|
||||
|
||||
/* Draws a line with pensize 1. Coordinates are guarenteed to be in bounds */
|
||||
// Draws a line with pensize 1. Coordinates are guarenteed to be in bounds
|
||||
void DisplayDriver::StrokePatternLine(int32 x1, int32 y1, int32 x2, int32 y2, const DrawData *d)
|
||||
{
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ BezierCurve::BezierCurve(BPoint* pts)
|
||||
pointArray = NULL;
|
||||
for (i=0; i<4; i++)
|
||||
points.AddItem(new BPoint(pts[i]));
|
||||
GenerateFrame(pts);
|
||||
GeneratePoints(0);
|
||||
}
|
||||
|
||||
@ -35,6 +36,25 @@ BPoint* BezierCurve::GetPointArray()
|
||||
return pointArray;
|
||||
}
|
||||
|
||||
void BezierCurve::GenerateFrame(BPoint *pts)
|
||||
{
|
||||
// shamelessly stolen from Marc's BPolygon code and tweaked to fit. :P
|
||||
|
||||
fFrame = BRect(pointArray[0], pointArray[0]);
|
||||
|
||||
for (int32 i = 1; i < 4; i++)
|
||||
{
|
||||
if (pts[i].x < fFrame.left)
|
||||
fFrame.left = pts[i].x;
|
||||
if (pts[i].y < fFrame.top)
|
||||
fFrame.top = pts[i].y;
|
||||
if (pts[i].x > fFrame.right)
|
||||
fFrame.right = pts[i].x;
|
||||
if (pts[i].y > fFrame.bottom)
|
||||
fFrame.bottom = pts[i].y;
|
||||
}
|
||||
}
|
||||
|
||||
int BezierCurve::GeneratePoints(int startPos)
|
||||
{
|
||||
double slopeAB, slopeBC, slopeCD;
|
||||
|
@ -31,6 +31,7 @@ SharedLibrary appserver :
|
||||
SysCursor.cpp
|
||||
SystemPalette.cpp
|
||||
TokenHandler.cpp
|
||||
Utils.cpp
|
||||
;
|
||||
|
||||
LinkSharedOSLibs libappserver.so : root be
|
||||
@ -43,7 +44,6 @@ Server app_server :
|
||||
FMWList.cpp
|
||||
PicturePlayer.cpp
|
||||
PNGDump.cpp
|
||||
Utils.cpp
|
||||
|
||||
# Manager Classes
|
||||
AppServer.cpp
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#include "PicturePlayer.h"
|
||||
#include "PictureProtocol.h"
|
||||
#include "Utils.h"
|
||||
#include "DisplayDriver.h"
|
||||
#include <ServerBitmap.h>
|
||||
#include <stdio.h>
|
||||
@ -202,7 +203,7 @@ status_t PicturePlayer::Play(int32 tableEntries,void *userData, LayerData *d)
|
||||
BPoint *points = new BPoint[numPoints];
|
||||
GetData(points, numPoints * sizeof(BPoint));
|
||||
bool isClosed = GetBool();
|
||||
fdriver->StrokePolygon(points,numPoints,&fldata,isClosed);
|
||||
fdriver->StrokePolygon(points,numPoints,CalculatePolygonBounds(points,numPoints),&fldata,isClosed);
|
||||
delete points;
|
||||
break;
|
||||
}
|
||||
@ -211,7 +212,7 @@ status_t PicturePlayer::Play(int32 tableEntries,void *userData, LayerData *d)
|
||||
int32 numPoints = GetInt32();
|
||||
BPoint *points = new BPoint[numPoints];
|
||||
GetData(points, numPoints * sizeof(BPoint));
|
||||
fdriver->FillPolygon(points,numPoints,&fldata);
|
||||
fdriver->FillPolygon(points,numPoints,CalculatePolygonBounds(points,numPoints),&fldata);
|
||||
delete points;
|
||||
break;
|
||||
}
|
||||
|
@ -1854,9 +1854,7 @@ void ServerWindow::DispatchMessage(int32 code)
|
||||
for(int i=0;i<3;i++)
|
||||
pts[i]=cl->ConvertToTop(pts[i]);
|
||||
|
||||
// TODO: modify DisplayDriver::StrokeTriangle to utilize a boundary BRect
|
||||
desktop->GetDisplayDriver()->StrokeTriangle(pts,cl->fLayerData);
|
||||
// desktop->GetDisplayDriver()->StrokeTriangle(pts,cl->ConvertToTop(rect),cl->fLayerData);
|
||||
desktop->GetDisplayDriver()->StrokeTriangle(pts,cl->ConvertToTop(rect),cl->fLayerData);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1876,12 +1874,174 @@ void ServerWindow::DispatchMessage(int32 code)
|
||||
for(int i=0;i<3;i++)
|
||||
pts[i]=cl->ConvertToTop(pts[i]);
|
||||
|
||||
// TODO: modify DisplayDriver::FillTriangle to utilize a boundary BRect
|
||||
desktop->GetDisplayDriver()->FillTriangle(pts,cl->fLayerData);
|
||||
// desktop->GetDisplayDriver()->FillTriangle(pts,cl->ConvertToTop(rect),cl->fLayerData);
|
||||
desktop->GetDisplayDriver()->FillTriangle(pts,cl->ConvertToTop(rect),cl->fLayerData);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AS_STROKE_POLYGON:
|
||||
{
|
||||
BRect polyframe;
|
||||
bool isclosed;
|
||||
int32 pointcount;
|
||||
BPoint *pointlist;
|
||||
|
||||
fSession->Read<BRect>(&polyframe);
|
||||
fSession->Read<bool>(&isclosed);
|
||||
fSession->Read<int32>(&pointcount);
|
||||
|
||||
pointlist=new BPoint[pointcount];
|
||||
|
||||
for(int32 i=0; i<pointcount; i++)
|
||||
pointlist[i]=cl->ConvertToTop(pointlist[i]);
|
||||
|
||||
// TODO: modify DisplayDriver::StrokePolygon to utilize a boundary BRect
|
||||
desktop->GetDisplayDriver()->StrokePolygon(pointlist,pointcount,polyframe,
|
||||
cl->fLayerData,isclosed);
|
||||
|
||||
delete [] pointlist;
|
||||
|
||||
break;
|
||||
}
|
||||
case AS_FILL_POLYGON:
|
||||
{
|
||||
BRect polyframe;
|
||||
bool isclosed;
|
||||
int32 pointcount;
|
||||
BPoint *pointlist;
|
||||
|
||||
fSession->Read<BRect>(&polyframe);
|
||||
fSession->Read<bool>(&isclosed);
|
||||
fSession->Read<int32>(&pointcount);
|
||||
|
||||
pointlist=new BPoint[pointcount];
|
||||
|
||||
fSession->Read(pointlist, sizeof(BPoint)*pointcount);
|
||||
|
||||
for(int32 i=0; i<pointcount; i++)
|
||||
pointlist[i]=cl->ConvertToTop(pointlist[i]);
|
||||
|
||||
// TODO: modify DisplayDriver::FillPolygon to utilize a boundary BRect
|
||||
desktop->GetDisplayDriver()->StrokePolygon(pointlist,pointcount,polyframe,cl->fLayerData);
|
||||
|
||||
delete [] pointlist;
|
||||
|
||||
break;
|
||||
}
|
||||
case AS_STROKE_SHAPE:
|
||||
{
|
||||
BRect shaperect;
|
||||
int32 opcount;
|
||||
int32 ptcount;
|
||||
int32 *oplist;
|
||||
BPoint *ptlist;
|
||||
|
||||
fSession->Read<BRect>(&shaperect);
|
||||
fSession->Read<int32>(&opcount);
|
||||
fSession->Read<int32>(&ptcount);
|
||||
|
||||
oplist=new int32[opcount];
|
||||
ptlist=new BPoint[ptcount];
|
||||
|
||||
fSession->Read(oplist,sizeof(int32)*opcount);
|
||||
fSession->Read(ptlist,sizeof(BPoint)*ptcount);
|
||||
|
||||
for(int32 i=0; i<ptcount; i++)
|
||||
ptlist[i]=cl->ConvertToTop(ptlist[i]);
|
||||
|
||||
desktop->GetDisplayDriver()->StrokeShape(shaperect, opcount, oplist, ptcount, ptlist, cl->fLayerData);
|
||||
delete oplist;
|
||||
delete ptlist;
|
||||
|
||||
break;
|
||||
}
|
||||
case AS_FILL_SHAPE:
|
||||
{
|
||||
BRect shaperect;
|
||||
int32 opcount;
|
||||
int32 ptcount;
|
||||
int32 *oplist;
|
||||
BPoint *ptlist;
|
||||
|
||||
fSession->Read<BRect>(&shaperect);
|
||||
fSession->Read<int32>(&opcount);
|
||||
fSession->Read<int32>(&ptcount);
|
||||
|
||||
oplist=new int32[opcount];
|
||||
ptlist=new BPoint[ptcount];
|
||||
|
||||
fSession->Read(oplist,sizeof(int32)*opcount);
|
||||
fSession->Read(ptlist,sizeof(BPoint)*ptcount);
|
||||
|
||||
for(int32 i=0; i<ptcount; i++)
|
||||
ptlist[i]=cl->ConvertToTop(ptlist[i]);
|
||||
|
||||
desktop->GetDisplayDriver()->FillShape(shaperect, opcount, oplist, ptcount, ptlist, cl->fLayerData);
|
||||
|
||||
delete oplist;
|
||||
delete ptlist;
|
||||
|
||||
break;
|
||||
}
|
||||
case AS_FILL_REGION:
|
||||
{
|
||||
// TODO: Implement AS_FILL_REGION
|
||||
int32 rectcount;
|
||||
BRect *rectlist;
|
||||
|
||||
fSession->Read<int32>(&rectcount);
|
||||
|
||||
rectlist=new BRect[rectcount];
|
||||
|
||||
fSession->Read(rectlist, sizeof(BRect)*rectcount);
|
||||
|
||||
// Between the client-side conversion to BRects from clipping_rects to the overhead
|
||||
// in repeatedly calling FillRect(), this is definitely in need of optimization. At
|
||||
// least it works for now. :)
|
||||
for(int32 i=0; i<rectcount; i++)
|
||||
desktop->GetDisplayDriver()->FillRect(cl->ConvertToTop(cl->ConvertToTop(rectlist[i])),cl->fLayerData);
|
||||
|
||||
delete [] rectlist;
|
||||
|
||||
// TODO: create support for clipping_rect usage for faster BRegion display.
|
||||
// Tweaks to DisplayDriver are necessary along with conversion routines in Layer
|
||||
|
||||
break;
|
||||
}
|
||||
case AS_STROKE_LINEARRAY:
|
||||
{
|
||||
// TODO: Implement AS_STROKE_LINEARRAY
|
||||
break;
|
||||
}
|
||||
case AS_MOVEPENBY:
|
||||
{
|
||||
// TODO: Implement AS_MOVEPENBY
|
||||
break;
|
||||
}
|
||||
case AS_MOVEPENTO:
|
||||
{
|
||||
// TODO: Implement AS_MOVEPENTO
|
||||
break;
|
||||
}
|
||||
case AS_SETPENSIZE:
|
||||
{
|
||||
// TODO: Implement AS_SETPENSIZE
|
||||
break;
|
||||
}
|
||||
case AS_DRAW_STRING:
|
||||
{
|
||||
// TODO: Implement AS_DRAW_STRING
|
||||
break;
|
||||
}
|
||||
case AS_SET_FONT:
|
||||
{
|
||||
// TODO: Implement AS_SET_FONT
|
||||
break;
|
||||
}
|
||||
case AS_SET_FONT_SIZE:
|
||||
{
|
||||
// TODO: Implement AS_SET_FONT_SIZE
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
printf("ServerWindow %s received unexpected code - message offset %lx\n",fTitle.String(), code - SERVER_TRUE);
|
||||
@ -1890,138 +2050,6 @@ void ServerWindow::DispatchMessage(int32 code)
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
/*!
|
||||
\brief Iterator for graphics update messages
|
||||
\param msgsize Size of the buffer containing the graphics messages
|
||||
\param msgbuffer Buffer containing the graphics message
|
||||
*/
|
||||
void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
|
||||
{
|
||||
/* Layer *layer;
|
||||
LayerData *layerdata;
|
||||
int32 code;
|
||||
int32 view_token;
|
||||
uint32 sizeRemaining = (uint32)msgsize;
|
||||
BRegion WindowClipRegion;
|
||||
BRegion LayerClipRegion;
|
||||
// Layer *sibling;
|
||||
int32 numRects = 0;
|
||||
|
||||
if (!msgsize || !msgbuffer)
|
||||
return;
|
||||
if (IsHidden())
|
||||
return;
|
||||
|
||||
// TODO: fix sibling-related clipping calculations in DispatchGraphicsMessage
|
||||
// WindowClipRegion.Set(fWinBorder->Frame());
|
||||
// sibling = fWinBorder->UpperSibling();
|
||||
// while (sibling)
|
||||
// {
|
||||
// WindowClipRegion.Exclude(sibling->Frame());
|
||||
// sibling = sibling->UpperSibling();
|
||||
// }
|
||||
|
||||
|
||||
if (!WindowClipRegion.Frame().IsValid())
|
||||
return;
|
||||
|
||||
// We need to decide whether coordinates are specified in view or root coordinates.
|
||||
// For now, we assume root level coordinates.
|
||||
code = AS_BEGIN_UPDATE;
|
||||
while ((sizeRemaining > 2*sizeof(int32)) && (code != AS_END_UPDATE))
|
||||
{
|
||||
code = read_from_buffer<int32>(&msgbuffer);
|
||||
view_token = read_from_buffer<int32>(&msgbuffer);
|
||||
|
||||
//TODO: fix code to find a layer based on a view token in DispatchGraphicsMessage
|
||||
layer = NULL;//fWorkspace->GetRoot()->FindLayer(view_token);
|
||||
|
||||
if (layer)
|
||||
{
|
||||
layerdata = layer->fLayerData;
|
||||
LayerClipRegion.Set(layer->Frame());
|
||||
LayerClipRegion.IntersectWith(&WindowClipRegion);
|
||||
numRects = LayerClipRegion.CountRects();
|
||||
}
|
||||
else
|
||||
{
|
||||
layerdata = NULL;
|
||||
STRACE(("ServerWindow %s received invalid view token %lx",fTitle.String(),view_token));
|
||||
}
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case AS_STROKE_LINEARRAY:
|
||||
{
|
||||
// TODO: Implement AS_STROKE_LINEARRAY
|
||||
break;
|
||||
}
|
||||
case AS_STROKE_POLYGON:
|
||||
{
|
||||
// TODO: Implement AS_STROKE_POLYGON
|
||||
break;
|
||||
}
|
||||
case AS_STROKE_SHAPE:
|
||||
{
|
||||
// TODO: Implement AS_STROKE_SHAPE
|
||||
break;
|
||||
}
|
||||
case AS_FILL_POLYGON:
|
||||
{
|
||||
// TODO: Implement AS_FILL_POLYGON
|
||||
break;
|
||||
}
|
||||
case AS_FILL_REGION:
|
||||
{
|
||||
// TODO: Implement AS_FILL_REGION
|
||||
break;
|
||||
}
|
||||
case AS_FILL_SHAPE:
|
||||
{
|
||||
// TODO: Implement AS_FILL_SHAPE
|
||||
break;
|
||||
}
|
||||
case AS_MOVEPENBY:
|
||||
{
|
||||
// TODO: Implement AS_MOVEPENBY
|
||||
break;
|
||||
}
|
||||
case AS_MOVEPENTO:
|
||||
{
|
||||
// TODO: Implement AS_MOVEPENTO
|
||||
break;
|
||||
}
|
||||
case AS_SETPENSIZE:
|
||||
{
|
||||
// TODO: Implement AS_SETPENSIZE
|
||||
break;
|
||||
}
|
||||
case AS_DRAW_STRING:
|
||||
{
|
||||
// TODO: Implement AS_DRAW_STRING
|
||||
break;
|
||||
}
|
||||
case AS_SET_FONT:
|
||||
{
|
||||
// TODO: Implement AS_SET_FONT
|
||||
break;
|
||||
}
|
||||
case AS_SET_FONT_SIZE:
|
||||
{
|
||||
// TODO: Implement AS_SET_FONT_SIZE
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
sizeRemaining -= sizeof(int32);
|
||||
printf("ServerWindow %s received unexpected graphics code %lx",fTitle.String(),code);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
/*!
|
||||
\brief Message-dispatching loop for the ServerWindow
|
||||
|
||||
|
@ -126,7 +126,6 @@ private:
|
||||
|
||||
// message handle methods.
|
||||
void DispatchMessage(int32 code);
|
||||
void DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer);
|
||||
static int32 MonitorWin(void *data);
|
||||
|
||||
|
||||
|
@ -301,3 +301,27 @@ status_t ConvertModeToDisplayMode(uint32 mode, display_mode *dmode)
|
||||
}
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
BRect CalculatePolygonBounds(BPoint *pts, int32 pointcount)
|
||||
{
|
||||
if(!pts)
|
||||
return BRect(0,0,0,0);
|
||||
|
||||
BRect r(0,0,0,0);
|
||||
|
||||
// shamelessly stolen from Marc's BPolygon code and tweaked to fit. :P
|
||||
r = BRect(pts[0], pts[0]);
|
||||
|
||||
for (int32 i = 1; i < 4; i++)
|
||||
{
|
||||
if (pts[i].x < r.left)
|
||||
r.left = pts[i].x;
|
||||
if (pts[i].y < r.top)
|
||||
r.top = pts[i].y;
|
||||
if (pts[i].x > r.right)
|
||||
r.right = pts[i].x;
|
||||
if (pts[i].y > r.bottom)
|
||||
r.bottom = pts[i].y;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
@ -35,5 +35,5 @@ void SendMessage(port_id port, BMessage *message, int32 target=-1);
|
||||
const char *MsgCodeToString(int32 code);
|
||||
BString MsgCodeToBString(int32 code);
|
||||
status_t ConvertModeToDisplayMode(uint32 mode, display_mode *dmode);
|
||||
|
||||
BRect CalculatePolygonBounds(BPoint *pts, int32 pointcount);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user