Even more BPicture support. We should have the basic to draw every picture used in our tree (for example, Tracker's navigator's buttons)

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16350 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2006-02-11 17:48:19 +00:00
parent 7c74b12b2a
commit 1afee82631
2 changed files with 154 additions and 47 deletions
+75 -47
View File
@@ -53,103 +53,132 @@ fill_rect(ViewLayer *view, BRect rect)
static void static void
stroke_round_rect(void *user, BRect rect, BPoint radii) stroke_round_rect(ViewLayer *view, BRect rect, BPoint radii)
{ {
printf("StrokeRoundRect(BRect(%.2f, %.2f, %.2f, %.2f), BPoint(%.2f, %.2f))\n", view->ConvertToScreenForDrawing(&rect);
rect.left, rect.top, rect.right, rect.bottom, radii.x, radii.y); view->Window()->GetDrawingEngine()->DrawRoundRect(rect, radii.x, radii.y, view->CurrentState(), false);
} }
static void static void
fill_round_rect(void *user, BRect rect, BPoint radii) fill_round_rect(ViewLayer *view, BRect rect, BPoint radii)
{ {
printf("FillRoundRect(BRect(%.2f, %.2f, %.2f, %.2f), BPoint(%.2f, %.2f))\n", view->ConvertToScreenForDrawing(&rect);
rect.left, rect.top, rect.right, rect.bottom, radii.x, radii.y); view->Window()->GetDrawingEngine()->DrawRoundRect(rect, radii.x, radii.y, view->CurrentState(), true);
} }
static void static void
stroke_bezier(void *user, BPoint *control) stroke_bezier(ViewLayer *view, BPoint *points)
{ {
printf("StrokeBezier\n");
for (int32 i = 0; i < 4; i++) for (int32 i = 0; i < 4; i++)
control[i].PrintToStream(); view->ConvertToScreenForDrawing(&points[i]);
view->Window()->GetDrawingEngine()->DrawBezier(points, view->CurrentState(), false);
} }
static void static void
fill_bezier(void *user, BPoint *control) fill_bezier(ViewLayer *view, BPoint *points)
{ {
printf("FillBezier\n");
for (int32 i = 0; i < 4; i++) for (int32 i = 0; i < 4; i++)
control[i].PrintToStream(); view->ConvertToScreenForDrawing(&points[i]);
view->Window()->GetDrawingEngine()->DrawBezier(points, view->CurrentState(), true);
} }
static void static void
stroke_arc(void *user, BPoint center, BPoint radii, float startTheta, stroke_arc(ViewLayer *view, BPoint center, BPoint radii, float startTheta,
float arcTheta) float arcTheta)
{ {
printf("StrokeArc(BPoint(%.2f, %.2f), BPoint(%.2f, %.2f), %.2f, %.2f)\n", /*view->ConvertToScreenForDrawing(&r);
center.x, center.y, radii.x, radii.y, startTheta, arcTheta); view->Window()->GetDrawingEngine()->DrawArc(r, angle, span, view->CurrentState(), false);*/
} }
static void static void
fill_arc(void *user, BPoint center, BPoint radii, float startTheta, fill_arc(ViewLayer *view, BPoint center, BPoint radii, float startTheta,
float arcTheta) float arcTheta)
{ {
printf("FillArc(BPoint(%.2f, %.2f), BPoint(%.2f, %.2f), %.2f, %.2f)\n", /*view->ConvertToScreenForDrawing(&r);
center.x, center.y, radii.x, radii.y, startTheta, arcTheta); view->Window()->GetDrawingEngine()->DrawArc(r, angle, span, view->CurrentState(), true);*/
} }
static void static void
stroke_ellipse(ViewLayer *view, BPoint center, BPoint radii) stroke_ellipse(ViewLayer *view, BPoint center, BPoint radii)
{ {
//view->StrokeEllipse(BRect(BPoint(center.x - radii.x, center.y - radii.y), /*view->ConvertToScreenForDrawing(&rect);
// BPoint(center.x + radii.x, center.y + radii.y))); view->Window()->GetDrawingEngine()->DrawEllipse(rect, view->CurrentState(), false);*/
printf("StrokeEllipse(BPoint(%.2f, %.2f), BPoint(%.2f, %.2f))\n",
center.x, center.y, radii.x, radii.y);
} }
static void static void
fill_ellipse(ViewLayer *view, BPoint center, BPoint radii) fill_ellipse(ViewLayer *view, BPoint center, BPoint radii)
{ {
//view->FillEllipse(BRect(BPoint(center.x - radii.x, center.y - radii.y), /*view->ConvertToScreenForDrawing(&rect);
// BPoint(center.x + radii.x, center.y + radii.y))); view->Window()->GetDrawingEngine()->DrawEllipse(rect, view->CurrentState(), true);*/
printf("FillEllipse(BPoint(%.2f, %.2f), BPoint(%.2f, %.2f))\n", center.x, center.y,
radii.x, radii.y);
} }
static void static void
stroke_polygon(void *user, int32 numPoints, BPoint *points, bool isClosed) stroke_polygon(ViewLayer *view, int32 numPoints, BPoint *points, bool isClosed)
{ {
printf("StrokePolygon %ld %s\n", numPoints, isClosed ? "closed" : "");
for (int32 i = 0; i < numPoints; i++) for (int32 i = 0; i < numPoints; i++)
points[i].PrintToStream(); view->ConvertToScreenForDrawing(&points[i]);
BRect polyFrame = BRect(points[0], points[0]);
for (int32 i = 1; i < numPoints; i++) {
if (points[i].x < polyFrame.left)
polyFrame.left = points[i].x;
if (points[i].y < polyFrame.top)
polyFrame.top = points[i].y;
if (points[i].x > polyFrame.right)
polyFrame.right = points[i].x;
if (points[i].y > polyFrame.bottom)
polyFrame.bottom = points[i].y;
}
view->Window()->GetDrawingEngine()->DrawPolygon(points, numPoints, polyFrame, view->CurrentState(),
false, isClosed && numPoints > 2);
} }
static void static void
fill_polygon(void *user, int32 numPoints, BPoint *points) fill_polygon(ViewLayer *view, int32 numPoints, BPoint *points)
{ {
printf("FillPolygon %ld\n", numPoints);
for (int32 i = 0; i < numPoints; i++) for (int32 i = 0; i < numPoints; i++)
points[i].PrintToStream(); view->ConvertToScreenForDrawing(&points[i]);
BRect polyFrame = BRect(points[0], points[0]);
for (int32 i = 1; i < numPoints; i++) {
if (points[i].x < polyFrame.left)
polyFrame.left = points[i].x;
if (points[i].y < polyFrame.top)
polyFrame.top = points[i].y;
if (points[i].x > polyFrame.right)
polyFrame.right = points[i].x;
if (points[i].y > polyFrame.bottom)
polyFrame.bottom = points[i].y;
}
view->Window()->GetDrawingEngine()->DrawPolygon(points, numPoints, polyFrame, view->CurrentState(),
true, true);
} }
static void static void
stroke_shape(ViewLayer *view, BShape *shape) stroke_shape(ViewLayer *view, BShape *shape)
{ {
//view->StrokeShape(shape); //TODO: Oh-ho... how do I access BShape private members ?
/*for (int32 i = 0; i < ptCount; i++)
fCurrentLayer->ConvertToScreenForDrawing(&ptList[i]);
printf("StrokeShape\n"); view->Window()->GetDrawingEngine()->DrawShape(shapeFrame, opCount, opList, ptCount, ptList,
fCurrentLayer->CurrentState(), code == AS_FILL_SHAPE);*/
} }
@@ -200,16 +229,18 @@ draw_pixels(ViewLayer *view, BRect src, BRect dest, int32 width, int32 height,
static void static void
set_clipping_rects(void *user, BRect *rects, uint32 numRects) set_clipping_rects(ViewLayer *view, BRect *rects, uint32 numRects)
{ {
printf("SetClippingRects %ld\n", numRects); // TODO: This is too slow, we should copy the rects directly to BRegion's internal data
for (uint32 i = 0; i < numRects; i++) BRegion region;
rects[i].PrintToStream(); for (uint32 c = 0; c < numRects; c++)
region.Include(rects[c]);
view->SetUserClipping(region);
} }
static void static void
clip_to_picture(void *user, BPicture *picture, BPoint pt, clip_to_picture(ViewLayer *view, BPicture *picture, BPoint pt,
bool clip_to_inverse_picture) bool clip_to_inverse_picture)
{ {
printf("ClipToPicture(picture, BPoint(%.2f, %.2f), %s)\n", pt.x, pt.y, printf("ClipToPicture(picture, BPoint(%.2f, %.2f), %s)\n", pt.x, pt.y,
@@ -349,13 +380,9 @@ set_font_spacing(ViewLayer *view, int32 spacing)
static void static void
set_font_size(ViewLayer *view, float size) set_font_size(ViewLayer *view, float size)
{ {
/* ServerFont font;
BFont font;
view->GetFont(&font);
font.SetSize(size); font.SetSize(size);
view->SetFont(&font, B_FONT_SIZE); view->CurrentState()->SetFont(font, B_FONT_SIZE);
*/
printf("SetFontSize(%.2f)\n", size);
} }
@@ -451,6 +478,7 @@ const void *tableEntries[] = {
}; };
// ServerPicture
ServerPicture::ServerPicture() ServerPicture::ServerPicture()
{ {
fToken = gTokenSpace.NewToken(kPictureToken, this); fToken = gTokenSpace.NewToken(kPictureToken, this);
+79
View File
@@ -2229,6 +2229,60 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link)
picture->EndOp(); picture->EndOp();
break; break;
} }
case AS_LAYER_INVERT_RECT:
{
picture->BeginOp(B_PIC_SET_DRAWING_MODE);
picture->AddInt16((int16)B_OP_INVERT);
picture->EndOp();
BRect rect;
link.Read<BRect>(&rect);
picture->BeginOp(B_PIC_FILL_RECT);
picture->AddRect(rect);
picture->EndOp();
picture->BeginOp(B_PIC_SET_DRAWING_MODE);
picture->AddInt16((int16)B_OP_COPY);
picture->EndOp();
break;
}
case AS_LAYER_PUSH_STATE:
{
picture->BeginOp(B_PIC_PUSH_STATE);
picture->EndOp();
break;
}
case AS_LAYER_POP_STATE:
{
picture->BeginOp(B_PIC_POP_STATE);
picture->EndOp();
break;
}
case AS_LAYER_SET_DRAWING_MODE:
{
int8 drawingMode;
link.Read<int8>(&drawingMode);
picture->BeginOp(B_PIC_SET_DRAWING_MODE);
picture->AddInt16((int16)drawingMode);
picture->EndOp();
break;
}
case AS_LAYER_SET_PEN_SIZE:
{
float penSize;
link.Read<float>(&penSize);
picture->BeginOp(B_PIC_SET_PEN_SIZE);
picture->AddFloat(penSize);
picture->EndOp();
break;
}
case AS_FILL_RECT: case AS_FILL_RECT:
case AS_STROKE_RECT: case AS_STROKE_RECT:
{ {
@@ -2241,6 +2295,23 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link)
break; break;
} }
case AS_STROKE_ROUNDRECT:
case AS_FILL_ROUNDRECT:
{
BRect rect;
link.Read<BRect>(&rect);
BPoint radii;
link.Read<float>(&radii.x);
link.Read<float>(&radii.y);
picture->BeginOp(code == AS_FILL_ROUNDRECT ? B_PIC_FILL_ROUND_RECT : B_PIC_STROKE_ROUND_RECT);
picture->AddRect(rect);
picture->AddCoord(radii);
picture->EndOp();
break;
}
case AS_STROKE_LINE: case AS_STROKE_LINE:
{ {
float x1, y1, x2, y2; float x1, y1, x2, y2;
@@ -2261,6 +2332,9 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link)
{ {
int32 lineCount; int32 lineCount;
link.Read<int32>(&lineCount); link.Read<int32>(&lineCount);
if (lineCount <= 0)
break;
for (int32 i = 0; i < lineCount; i++) { for (int32 i = 0; i < lineCount; i++) {
float x1, y1, x2, y2; float x1, y1, x2, y2;
link.Read<float>(&x1); link.Read<float>(&x1);
@@ -2280,6 +2354,11 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link)
picture->AddCoord(BPoint(x2, y2)); picture->AddCoord(BPoint(x2, y2));
picture->EndOp(); picture->EndOp();
} }
// reset the color to the previous one
picture->BeginOp(B_PIC_SET_FORE_COLOR);
picture->AddColor(fCurrentLayer->CurrentState()->HighColor().GetColor32());
picture->EndOp();
break; break;
} }