From 1311aa610c13552f750bfe93ce2c0cf4c01c4f51 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 11 Jan 2014 04:23:00 +0000 Subject: [PATCH] gtk3 added polybezier git-svn-id: trunk@43701 - --- lcl/interfaces/gtk3/gtk3objects.pas | 46 +++++++++++++++++++++++++++++ lcl/interfaces/gtk3/gtk3winapi.inc | 8 ++--- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lcl/interfaces/gtk3/gtk3objects.pas b/lcl/interfaces/gtk3/gtk3objects.pas index 36db98fba3..61dcfa9d8c 100644 --- a/lcl/interfaces/gtk3/gtk3objects.pas +++ b/lcl/interfaces/gtk3/gtk3objects.pas @@ -236,6 +236,7 @@ type procedure drawPixmap(p: PPoint; pm: PGdkPixbuf; sr: PRect); procedure drawPolyLine(P: PPoint; NumPts: Integer); procedure drawPolygon(P: PPoint; NumPts: Integer; FillRule: integer); + procedure drawPolyBezier(P: PPoint; NumPoints: Integer; Filled, Continuous: boolean); procedure EllipseArcPath(CX, CY, RX, RY: Double; Angle1, Angle2: Double; Clockwise, Continuous: Boolean); procedure eraseRect(ARect: PRect); procedure fillRect(ARect: PRect; ABrush: HBRUSH); overload; @@ -1402,6 +1403,51 @@ begin end; end; +procedure TGtk3DeviceContext.drawPolyBezier(P: PPoint; NumPoints: Integer; Filled, Continuous: boolean); +var + i: Integer; +const + PixelOffset = 0.5; +begin + // 3 points per curve + a starting point for the first curve + if (NumPoints < 4) then + Exit; + + cairo_save(Widget); + try + ApplyPen; + cairo_move_to(Widget, P[0].X+PixelOffset, P[0].Y+PixelOffset); // start point + i := 1; + + // we need 3 points left for continuous and 4 for not continous + while i < NumPoints-1 - (3 + ord(not Continuous)) do + begin + if Not Continuous then + begin + cairo_move_to(Widget, P[i].X+PixelOffset, P[i].Y+PixelOffset); // start point + Inc(i); + end; + cairo_curve_to(Widget, + P[i].X+PixelOffset, P[i].Y+PixelOffset, // control point 1 + P[i+1].X+PixelOffset, P[i+1].Y+PixelOffset, // control point 2 + P[i+2].X+PixelOffset, P[i+2].Y+PixelOffset); // end point and start point of next + Inc(i, 3); + end; + cairo_stroke_preserve(Widget); + + if Filled then + begin + ApplyBrush; + // join start and end points + cairo_close_path(Widget); + cairo_fill(Widget); + end; + + finally + cairo_restore(Widget); + end; +end; + procedure TGtk3DeviceContext.eraseRect(ARect: PRect); begin // cairo_surface_ diff --git a/lcl/interfaces/gtk3/gtk3winapi.inc b/lcl/interfaces/gtk3/gtk3winapi.inc index 4beff2fe63..762c9391ec 100644 --- a/lcl/interfaces/gtk3/gtk3winapi.inc +++ b/lcl/interfaces/gtk3/gtk3winapi.inc @@ -3081,10 +3081,10 @@ end; function TGtk3WidgetSet.PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; begin - {$IFDEF GTK3DEBUGNOTIMPLEMENTED} - DebugLn('WARNING: TGtk3WidgetSet.PolyBezier not implemented ...'); - {$ENDIF} - Result:=inherited PolyBezier(DC, Points, NumPts, Filled, Continuous); + if not IsValidDC(DC) then + exit(False); + TGtk3DeviceContext(DC).drawPolyBezier(Points, NumPts, Filled, Continuous); + Result:=True; end; function TGtk3WidgetSet.Polygon(DC: HDC; Points: PPoint; NumPts: Integer;