LCL-GTK3: Housekeeping with minor fixes. Rename TGtk3DeviceContext Widget to pcr (pointer to Cairo). Issue #37933, patch from Anton Kavalenka.

git-svn-id: trunk@64031 -
This commit is contained in:
juha 2020-10-16 20:10:32 +00:00
parent c83c7f8279
commit 610353511b
6 changed files with 209 additions and 187 deletions

View File

@ -617,10 +617,7 @@ begin
// inherited DCSetAntialiasing(CanvasHandle, AEnabled);
if IsValidDC(CanvasHandle) then
begin
if AEnabled then
cairo_set_antialias(TGtk3DeviceContext(CanvasHandle).Widget, CAIRO_ANTIALIAS_DEFAULT)
else
cairo_set_antialias(TGtk3DeviceContext(CanvasHandle).Widget, CAIRO_ANTIALIAS_NONE);
TGtk3DeviceContext(CanvasHandle).set_antialiasing(AEnabled);
end;
end;

View File

@ -222,7 +222,7 @@ type
procedure FillAndStroke;
public
CairoSurface: Pcairo_surface_t;
Widget: Pcairo_t;
pcr: Pcairo_t;
Parent: PGtkWidget;
Window: PGdkWindow;
ParentPixmap: PGdkPixbuf;
@ -269,6 +269,7 @@ type
function ResetClip: Integer;
procedure TranslateCairoToDevice;
procedure Translate(APoint: TPoint);
procedure set_antialiasing(aamode:boolean);
property BkMode: Integer read FBkMode write FBkMode;
property CanRelease: Boolean read FCanRelease write FCanRelease;
property CurrentBrush: TGtk3Brush read FCurrentBrush write FCurrentBrush;
@ -1047,8 +1048,8 @@ var
begin
FColor := AValue;
ColorToCairoRGB(FColor, ARed, AGreen, ABlue);
if Assigned(FContext) and Assigned(FContext.Widget) then
cairo_set_source_rgb(FContext.Widget, ARed, AGreen, ABlue);
if Assigned(FContext) and Assigned(FContext.pcr) then
cairo_set_source_rgb(FContext.pcr, ARed, AGreen, ABlue);
end;
constructor TGtk3Pen.Create;
@ -1084,12 +1085,12 @@ end;
procedure TGtk3Pen.setCosmetic(b: Boolean);
begin
FCosmetic := B;
if Assigned(FContext) and Assigned(FContext.Widget) then
if Assigned(FContext) and Assigned(FContext.pcr) then
begin
if b then
cairo_set_line_width(FContext.Widget, 0)
cairo_set_line_width(FContext.pcr, 0)
else
cairo_set_line_width(FContext.Widget, 1);
cairo_set_line_width(FContext.pcr, 1);
end;
end;
@ -1097,7 +1098,7 @@ procedure TGtk3Pen.setWidth(p1: Integer);
begin
FWidth := p1;
if Assigned(FContext) then
cairo_set_line_width(FContext.Widget, p1);
cairo_set_line_width(FContext.pcr, p1);
end;
{ TGtk3Brush }
@ -1109,7 +1110,7 @@ begin
FColor := AValue;
ColorToCairoRGB(FColor, ARed, AGreen, ABlue);
if Assigned(FContext) then
cairo_set_source_rgb(FContext.Widget, ARed, AGreen, ABlue);
cairo_set_source_rgb(FContext.pcr, ARed, AGreen, ABlue);
end;
procedure TGtk3Brush.SetStyle(AStyle: longword);
@ -1240,7 +1241,7 @@ function TGtk3DeviceContext.GetOffset: TPoint;
var
dx,dy: Double;
begin
cairo_surface_get_device_offset(cairo_get_target(Widget), @dx, @dy);
cairo_surface_get_device_offset(cairo_get_target(pcr), @dx, @dy);
Result := Point(Round(dx), Round(dy));
end;
@ -1264,7 +1265,7 @@ var
begin
dx := AValue.X;
dy := AValue.Y;
cairo_surface_set_device_offset(cairo_get_target(Widget), dx, dy);
cairo_surface_set_device_offset(cairo_get_target(pcr), dx, dy);
end;
procedure TGtk3DeviceContext.setPen(AValue: TGtk3Pen);
@ -1313,7 +1314,7 @@ begin
if Self.FCurrentBrush.Style<>0 then
begin
if Assigned(Self.FCurrentBrush.brush_pattern) then
cairo_set_source(Widget,Self.FCurrentBrush.brush_pattern);
cairo_set_source(pcr,Self.FCurrentBrush.brush_pattern);
end;
end;
@ -1330,7 +1331,7 @@ end;
procedure TGtk3DeviceContext.ApplyPen;
procedure SetDash(d: array of double);
begin
cairo_set_dash(Widget, @d, High(d)+1, 0);
cairo_set_dash(pcr, @d, High(d)+1, 0);
end;
var
cap: cairo_line_cap_t;
@ -1340,15 +1341,15 @@ begin
case FCurrentPen.Mode of
pmBlack: begin
SetSourceColor(clBlack);
cairo_set_operator(Widget, CAIRO_OPERATOR_OVER);
cairo_set_operator(pcr, CAIRO_OPERATOR_OVER);
end;
pmWhite: begin
SetSourceColor(clWhite);
cairo_set_operator(Widget, CAIRO_OPERATOR_OVER);
cairo_set_operator(pcr, CAIRO_OPERATOR_OVER);
end;
pmCopy: cairo_set_operator(Widget, CAIRO_OPERATOR_OVER);
pmXor: cairo_set_operator(Widget, CAIRO_OPERATOR_XOR);
pmNotXor: cairo_set_operator(Widget, CAIRO_OPERATOR_XOR);
pmCopy: cairo_set_operator(pcr, CAIRO_OPERATOR_OVER);
pmXor: cairo_set_operator(pcr, CAIRO_OPERATOR_XOR);
pmNotXor: cairo_set_operator(pcr, CAIRO_OPERATOR_XOR);
{pmNop,
pmNot,
pmCopy,
@ -1362,27 +1363,27 @@ begin
pmMask,
pmNotMask,}
else
cairo_set_operator(Widget, CAIRO_OPERATOR_OVER);
cairo_set_operator(pcr, CAIRO_OPERATOR_OVER);
end;
if FCurrentPen.Cosmetic then
cairo_set_line_width(Widget, 1.0)
cairo_set_line_width(pcr, 1.0)
else
begin
w := FCurrentPen.Width;
if w = 0 then
w := 0.5;
cairo_set_line_width(Widget, w {* ScaleX}); //line_width is diameter of the pen circle
cairo_set_line_width(pcr, w {* ScaleX}); //line_width is diameter of the pen circle
end;
case FCurrentPen.Style of
psSolid: cairo_set_dash(Widget, nil, 0, 0);
psSolid: cairo_set_dash(pcr, nil, 0, 0);
psDash: SetDash(Dash_Dash);
psDot: SetDash(Dash_Dot);
psDashDot: SetDash(Dash_DashDot);
psDashDotDot: SetDash(Dash_DashDotDot);
else
cairo_set_dash(Widget, nil, 0, 0);
cairo_set_dash(pcr, nil, 0, 0);
end;
case FCurrentPen.EndCap of
@ -1397,12 +1398,12 @@ begin
psDash, psDot, psDashDot, psDashDotDot:
cap := CAIRO_LINE_CAP_BUTT
end;
cairo_set_line_cap(Widget, cap);
cairo_set_line_cap(pcr, cap);
case FCurrentPen.JoinStyle of
pjsRound: cairo_set_line_join(Widget, CAIRO_LINE_JOIN_ROUND);
pjsBevel: cairo_set_line_join(Widget, CAIRO_LINE_JOIN_BEVEL);
pjsMiter: cairo_set_line_join(Widget, CAIRO_LINE_JOIN_MITER);
pjsRound: cairo_set_line_join(pcr, CAIRO_LINE_JOIN_ROUND);
pjsBevel: cairo_set_line_join(pcr, CAIRO_LINE_JOIN_BEVEL);
pjsMiter: cairo_set_line_join(pcr, CAIRO_LINE_JOIN_MITER);
end;
end;
@ -1452,7 +1453,7 @@ begin
ACairo := gdk_cairo_create(gdk_get_default_root_window);
gdk_cairo_get_clip_rectangle(ACairo, @ARect);
CairoSurface := cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ARect.width, ARect.height);
Widget := cairo_create(CairoSurface);
pcr := cairo_create(CairoSurface);
ParentPixmap := gdk_pixbuf_get_from_surface(CairoSurface, 0, 0, ARect.width, ARect.height);
FOwnsSurface := True;
@ -1466,18 +1467,18 @@ begin
H := gtk_widget_get_allocated_height(AWidget);
if W <= 0 then W := 1;
if H <= 0 then H := 1;
Widget := gdk_cairo_create(gtk_widget_get_window(AWidget));
pcr := gdk_cairo_create(gtk_widget_get_window(AWidget));
end else
begin
W := gtk_widget_get_allocated_width(AWidget);
H := gtk_widget_get_allocated_height(AWidget);
if W <= 0 then W := 1;
if H <= 0 then H := 1;
Widget := gdk_cairo_create(gtk_widget_get_window(AWidget));
pcr := gdk_cairo_create(gtk_widget_get_window(AWidget));
end;
end;
if not FOwnsSurface then
CairoSurface := cairo_get_target(Widget);
CairoSurface := cairo_get_target(pcr);
CreateObjects;
(*
FRopMode := R2_COPYPEN;
@ -1510,10 +1511,10 @@ begin
FCurrentTextColor := clBlack;
//AWindow^.get_geometry(@x, @y, @w, @h);
// ParentPixmap := gdk_pixbuf_get_from_window(AWindow, x, y, w, h);
Widget := gdk_cairo_create(AWindow);
pcr := gdk_cairo_create(AWindow);
// gdk_cairo_set_source_pixbuf(Widget, ParentPixmap, 0, 0);
gdk_cairo_set_source_window(Widget, AWindow, 0, 0);
CairoSurface := cairo_get_target(Widget);
gdk_cairo_set_source_window(pcr, AWindow, 0, 0);
CairoSurface := cairo_get_target(pcr);
CreateObjects;
end;
@ -1537,8 +1538,8 @@ begin
FCurrentTextColor := clBlack;
gdk_cairo_get_clip_rectangle(ACairo, @AGdkRect);
FvClipRect := RectFromGdkRect(AGdkRect);
Widget := ACairo;
CairoSurface := cairo_get_target(Widget);
pcr := ACairo;
CairoSurface := cairo_get_target(pcr);
CreateObjects;
end;
@ -1548,14 +1549,14 @@ begin
WriteLn('TGtk3DeviceContext.Destroy ',dbgHex(PtrUInt(Self)));
{$endif}
DeleteObjects;
if FOwnsCairo and (Widget <> nil) then
cairo_destroy(Widget);
if FOwnsCairo and (pcr <> nil) then
cairo_destroy(pcr);
if (ParentPixmap <> nil) then
g_object_unref(ParentPixmap);
if FOwnsSurface and (CairoSurface <> nil) then
cairo_surface_destroy(CairoSurface);
Parent := nil;
Widget := nil;
pcr := nil;
ParentPixmap := nil;
CairoSurface := nil;
Window := nil;
@ -1578,12 +1579,12 @@ begin
FPen.Color := clBlack;
FCurrentPen := FPen;
FCurrentBrush := FBrush;
FFont := TGtk3Font.Create(Widget, Parent);
FFont := TGtk3Font.Create(pcr, Parent);
FCurrentFont := FFont;
FvImage := TGtk3Image.Create(nil, 1, 1, 8, CAIRO_FORMAT_ARGB32);
FCurrentImage := FvImage;
cairo_get_matrix(Widget, @Matrix);
cairo_get_matrix(pcr, @Matrix);
// widget with menu or other non-client exclusions have offset in trasform matrix
fncOrigin:=Point(round(Matrix.x0),round(Matrix.y0));
end;
@ -1604,10 +1605,10 @@ procedure TGtk3DeviceContext.drawPixel(x, y: Integer; AColor: TColor);
// Seems that painting line from (a-1, b-1) to (a,b) gives one pixel
begin
SetSourceColor(AColor);
cairo_set_line_width(Widget, 1);
cairo_move_to(Widget, x - PixelOffset, y - PixelOffset);
cairo_line_to(Widget, x + PixelOffset, y + PixelOffset);
cairo_stroke(Widget);
cairo_set_line_width(pcr, 1);
cairo_move_to(pcr, x - PixelOffset, y - PixelOffset);
cairo_line_to(pcr, x + PixelOffset, y + PixelOffset);
cairo_stroke(pcr);
end;
function TGtk3DeviceContext.getPixel(x, y: Integer): TColor;
@ -1627,24 +1628,24 @@ end;
procedure TGtk3DeviceContext.drawRect(x1, y1, w, h: Integer; const AFill, ABorder: Boolean);
begin
cairo_save(Widget);
cairo_save(pcr);
try
cairo_rectangle(Widget, x1 + PixelOffset, y1 + PixelOffset, w - 1, h - 1);
cairo_rectangle(pcr, x1 + PixelOffset, y1 + PixelOffset, w - 1, h - 1);
if AFill then
begin
ApplyBrush;
cairo_fill_preserve(Widget);
cairo_fill_preserve(pcr);
end;
if ABorder then
begin
ApplyPen;
cairo_stroke(Widget);
cairo_stroke(pcr);
end;
cairo_new_path(Widget);
cairo_new_path(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1653,7 +1654,8 @@ begin
RoundRect(x, y, w, h, rx, ry);
end;
procedure TGtk3DeviceContext.drawText(X, Y: Integer; AText: PChar; ALen: Integer);
procedure TGtk3DeviceContext.drawText(x, y: Integer; AText: PChar; ALen: Integer
);
var
R, G, B: Double;
gColor: TGdkColor;
@ -1662,14 +1664,14 @@ var
UseBack: boolean;
ornt:integer;
begin
cairo_save(Widget);
cairo_save(pcr);
try
cairo_move_to(Widget, X, Y);
cairo_move_to(pcr, X, Y);
ornt := Self.FCurrentFont.FLogFont.lfOrientation;
if ornt<>0 then
cairo_rotate(Widget, - pi * (ornt / 10)/180);
cairo_rotate(pcr, - pi * (ornt / 10)/180);
ColorToCairoRGB(TColor(CurrentTextColor), R, G, B);
cairo_set_source_rgb(Widget, R, G, B);
cairo_set_source_rgb(pcr, R, G, B);
FCurrentFont.Layout^.set_text(AText, ALen);
@ -1683,7 +1685,7 @@ begin
FCurrentFont.Layout^.set_attributes(AttrList);
end;
pango_cairo_show_layout(Widget, FCurrentFont.Layout);
pango_cairo_show_layout(pcr, FCurrentFont.Layout);
if UseBack then
begin
@ -1691,7 +1693,7 @@ begin
pango_attribute_destroy(Attr);
end;
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1699,37 +1701,37 @@ procedure TGtk3DeviceContext.drawEllipse(x, y, w, h: Integer; AFill, ABorder: Bo
var
save_matrix:cairo_matrix_t;
begin
cairo_save(Widget);
cairo_save(pcr);
try
cairo_get_matrix(Widget, @save_matrix);
cairo_translate (Widget, x + w / 2.0 + PixelOffset, y + h / 2.0 + PixelOffset);
cairo_scale (Widget, w / 2.0, h / 2.0);
cairo_new_path(Widget);
cairo_get_matrix(pcr, @save_matrix);
cairo_translate (pcr, x + w / 2.0 + PixelOffset, y + h / 2.0 + PixelOffset);
cairo_scale (pcr, w / 2.0, h / 2.0);
cairo_new_path(pcr);
cairo_arc
(
(*cr =*) Widget,
(*cr =*) pcr,
(*xc =*) 0,
(*yc =*) 0,
(*radius =*) 1,
(*angle1 =*) 0,
(*angle2 =*) 2 * Pi
);
cairo_close_path(Widget);
cairo_close_path(pcr);
if AFill then
begin
ApplyBrush;
cairo_fill_preserve(Widget);
cairo_fill_preserve(pcr);
end;
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
if ABorder then
begin
ApplyPen;
cairo_stroke(Widget);
cairo_stroke(pcr);
end;
//if ABorder=false, need to clear current path
cairo_new_path(Widget);
cairo_new_path(pcr);
end;
procedure TGtk3DeviceContext.drawSurface(targetRect: PRect;
@ -1741,21 +1743,21 @@ begin
{$IFDEF VerboseGtk3DeviceContext}
DebugLn('TGtk3DeviceContext.DrawSurface ');
{$ENDIF}
cairo_save(Widget);
cairo_save(pcr);
try
with targetRect^ do
cairo_rectangle(Widget, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_set_source_surface(Widget, Surface, 0, 0);
cairo_rectangle(pcr, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_set_source_surface(pcr, Surface, 0, 0);
cairo_matrix_init_identity(@M);
cairo_matrix_translate(@M, SourceRect^.Left, SourceRect^.Top);
cairo_matrix_scale(@M, (sourceRect^.Right-sourceRect^.Left) / (targetRect^.Right-targetRect^.Left),
(sourceRect^.Bottom-sourceRect^.Top) / (targetRect^.Bottom-targetRect^.Top));
cairo_matrix_translate(@M, -targetRect^.Left, -targetRect^.Top);
cairo_pattern_set_matrix(cairo_get_source(Widget), @M);
cairo_clip(Widget);
cairo_paint(Widget);
cairo_pattern_set_matrix(cairo_get_source(pcr), @M);
cairo_clip(pcr);
cairo_paint(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1769,19 +1771,19 @@ begin
{$IFDEF VerboseGtk3DeviceContext}
DebugLn('TGtk3DeviceContext.DrawImage ');
{$ENDIF}
cairo_save(Widget);
cairo_save(pcr);
try
// pm := Image;
// AData := PByte(gdk_pixbuf_get_pixels(pm));
// ASurface := cairo_image_surface_create_for_data(AData, CAIRO_FORMAT_ARGB32, gdk_pixbuf_get_width(pm), gdk_pixbuf_get_height(pm), gdk_pixbuf_get_rowstride(pm));
// cairo_set_source_surface(Widget, ASurface, targetRect^.Left, targetRect^.Top);
gdk_cairo_set_source_pixbuf(Widget, Image, 0, 0);
gdk_cairo_set_source_pixbuf(pcr, Image, 0, 0);
with targetRect^ do
cairo_rectangle(Widget, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_paint(Widget);
cairo_rectangle(pcr, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_paint(pcr);
finally
// cairo_surface_destroy(ASurface);
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1793,13 +1795,13 @@ begin
{$IFDEF VerboseGtk3DeviceContext}
DebugLn('TGtk3DeviceContext.DrawImage ');
{$ENDIF}
cairo_save(Widget);
cairo_save(pcr);
try
gdk_cairo_set_source_pixbuf(Widget, Image, 0, 0);
gdk_cairo_set_source_pixbuf(pcr, Image, 0, 0);
with targetRect^ do
cairo_rectangle(Widget, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_rectangle(pcr, Left + PixelOffset, Top + PixelOffset, Right - Left, Bottom - Top);
cairo_set_operator (Widget, CAIRO_OPERATOR_OVER);
cairo_set_operator (pcr, CAIRO_OPERATOR_OVER);
cairo_matrix_init_identity(@M);
@ -1807,12 +1809,12 @@ begin
cairo_matrix_scale(@M, (sourceRect^.Right-sourceRect^.Left) / (targetRect^.Right-targetRect^.Left),
(sourceRect^.Bottom-sourceRect^.Top) / (targetRect^.Bottom-targetRect^.Top));
cairo_matrix_translate(@M, -targetRect^.Left, -targetRect^.Top);
cairo_pattern_set_matrix(cairo_get_source(Widget), @M);
cairo_pattern_set_matrix(cairo_get_source(pcr), @M);
//cairo_fill (Widget);
cairo_clip(Widget);
cairo_paint(Widget);
cairo_clip(pcr);
cairo_paint(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1826,15 +1828,15 @@ begin
{$IFDEF VerboseGtk3DeviceContext}
DebugLn('TGtk3DeviceContext.DrawPixmap ');
{$ENDIF}
cairo_save(Widget);
cairo_save(pcr);
try
AData := PByte(gdk_pixbuf_get_pixels(pm));
ASurface := cairo_image_surface_create_for_data(AData, CAIRO_FORMAT_ARGB32, gdk_pixbuf_get_width(pm), gdk_pixbuf_get_height(pm), gdk_pixbuf_get_rowstride(pm));
cairo_set_source_surface(Widget, ASurface, sr^.Left, sr^.Top);
cairo_paint(Widget);
cairo_set_source_surface(pcr, ASurface, sr^.Left, sr^.Top);
cairo_paint(pcr);
finally
cairo_surface_destroy(ASurface);
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1842,15 +1844,15 @@ procedure TGtk3DeviceContext.drawPolyLine(P: PPoint; NumPts: Integer);
var
i: Integer;
begin
cairo_save(Widget);
cairo_save(pcr);
try
ApplyPen;
cairo_move_to(Widget, P[0].X+PixelOffset, P[0].Y+PixelOffset);
cairo_move_to(pcr, P[0].X+PixelOffset, P[0].Y+PixelOffset);
for i := 1 to NumPts-1 do
cairo_line_to(Widget, P[i].X+PixelOffset, P[i].Y+PixelOffset);
cairo_stroke(Widget);
cairo_line_to(pcr, P[i].X+PixelOffset, P[i].Y+PixelOffset);
cairo_stroke(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1860,30 +1862,30 @@ procedure TGtk3DeviceContext.drawPolygon(P: PPoint; NumPts: Integer;
var
i: Integer;
begin
cairo_save(Widget);
cairo_save(pcr);
try
// add offset so the center of the pixel is used
cairo_move_to(Widget, P[0].X+PixelOffset, P[0].Y+PixelOffset);
cairo_move_to(pcr, P[0].X+PixelOffset, P[0].Y+PixelOffset);
for i := 1 to NumPts-1 do
cairo_line_to(Widget, P[i].X+PixelOffset, P[i].Y+PixelOffset);
cairo_close_path(Widget);
cairo_line_to(pcr, P[i].X+PixelOffset, P[i].Y+PixelOffset);
cairo_close_path(pcr);
if AFill then
begin
ApplyBrush;
cairo_set_fill_rule(Widget, cairo_fill_rule_t(FillRule));
cairo_fill_preserve(Widget);
cairo_set_fill_rule(pcr, cairo_fill_rule_t(FillRule));
cairo_fill_preserve(pcr);
end;
if ABorder then
begin
ApplyPen;
cairo_stroke(Widget);
cairo_stroke(pcr);
end;
cairo_new_path(Widget);
cairo_new_path(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1902,24 +1904,24 @@ begin
// we need 3 points left for continuous and 4 for not continous
MaxIndex := NumPoints - 3 - Ord(not Continuous);
cairo_save(Widget);
cairo_save(pcr);
try
i := 0;
while i <= MaxIndex do
begin
if i = 0 then
begin
cairo_move_to(Widget, P[i].X+PixelOffset, P[i].Y+PixelOffset); // start point
cairo_move_to(pcr, P[i].X+PixelOffset, P[i].Y+PixelOffset); // start point
Inc(i);
end
else
if not Continuous then
begin
cairo_line_to(Widget, P[i].X+PixelOffset, P[i].Y+PixelOffset); // start point
cairo_line_to(pcr, P[i].X+PixelOffset, P[i].Y+PixelOffset); // start point
Inc(i);
end;
cairo_curve_to(Widget,
cairo_curve_to(pcr,
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
@ -1928,23 +1930,23 @@ begin
if Filled then
begin
cairo_close_path(Widget);
cairo_close_path(pcr);
if bFill then
begin
ApplyBrush;
cairo_fill_preserve(Widget);
cairo_fill_preserve(pcr);
end;
end;
if bBorder then
begin
ApplyPen;
cairo_stroke(Widget);
cairo_stroke(pcr);
end
else
cairo_new_path(Widget);
cairo_new_path(pcr);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -1967,7 +1969,7 @@ begin
// WriteLn('TGtk3DeviceContext.fillRect ',Format('x %d y %d w %d h %d',[x, y, w, h]));
{$endif}
cairo_save(Widget);
cairo_save(pcr);
try
ATempBrush := nil;
if ABrush <> 0 then
@ -1978,18 +1980,18 @@ begin
end;
applyBrush;
cairo_rectangle(Widget, x + PixelOffset, y + PixelOffset, w - 1, h - 1);
cairo_fill_preserve(Widget);
cairo_rectangle(pcr, x + PixelOffset, y + PixelOffset, w - 1, h - 1);
cairo_fill_preserve(pcr);
// must paint border, filling is not enough
SetSourceColor(FCurrentBrush.Color);
cairo_set_line_width(Widget, 1);
cairo_stroke(Widget);
cairo_set_line_width(pcr, 1);
cairo_stroke(pcr);
if ABrush <> 0 then
CurrentBrush:= ATempBrush;
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -2004,14 +2006,14 @@ begin
begin
ApplyBrush;
if Assigned(FCurrentPen) and (FCurrentPen.Style = psClear) then
cairo_fill(Widget)
cairo_fill(pcr)
else
cairo_fill_preserve(Widget);
cairo_fill_preserve(pcr);
end;
if Assigned(FCurrentPen) and (FCurrentPen.Style <> psClear) then
begin
ApplyPen;
cairo_stroke(Widget);
cairo_stroke(pcr);
end;
end;
@ -2019,18 +2021,18 @@ procedure TGtk3DeviceContext.EllipseArcPath(CX, CY, RX, RY: Double; Angle1, Angl
begin
if (RX=0) or (RY=0) then //cairo_scale do not likes zero params
Exit;
cairo_save(Widget);
cairo_save(pcr);
try
cairo_translate(Widget, SX(CX), SY(CY));
cairo_scale(Widget, SX2(RX), SY2(RY));
cairo_translate(pcr, SX(CX), SY(CY));
cairo_scale(pcr, SX2(RX), SY2(RY));
if not Continuous then
cairo_move_to(Widget, cos(Angle1), sin(Angle1)); //Move to arcs starting point
cairo_move_to(pcr, cos(Angle1), sin(Angle1)); //Move to arcs starting point
if Clockwise then
cairo_arc(Widget, 0, 0, 1, Angle1, Angle2)
cairo_arc(pcr, 0, 0, 1, Angle1, Angle2)
else
cairo_arc_negative(Widget, 0, 0, 1, Angle1, Angle2);
cairo_arc_negative(pcr, 0, 0, 1, Angle1, Angle2);
finally
cairo_restore(Widget);
cairo_restore(pcr);
end;
end;
@ -2039,24 +2041,24 @@ var
DX, DY: Double;
begin
Result := False;
cairo_surface_get_device_offset(cairo_get_target(Widget), @DX, @DY);
cairo_surface_get_device_offset(cairo_get_target(pcr), @DX, @DY);
DX := DX+PixelOffset;
DY := DY+PixelOffset;
cairo_translate(Widget, DX, DY);
cairo_translate(pcr, DX, DY);
try
cairo_move_to(Widget, SX(X1+RX), SY(Y1));
cairo_line_to(Widget, SX(X2-RX), SY(Y1));
cairo_move_to(pcr, SX(X1+RX), SY(Y1));
cairo_line_to(pcr, SX(X2-RX), SY(Y1));
EllipseArcPath(X2-RX, Y1+RY, RX, RY, -PI/2, 0, True, True);
cairo_line_to(Widget, SX(X2), SY(Y2-RY));
cairo_line_to(pcr, SX(X2), SY(Y2-RY));
EllipseArcPath(X2-RX, Y2-RY, RX, RY, 0, PI/2, True, True);
cairo_line_to(Widget, SX(X1+RX), SY(Y2));
cairo_line_to(pcr, SX(X1+RX), SY(Y2));
EllipseArcPath(X1+RX, Y2-RY, RX, RY, PI/2, PI, True, True);
cairo_line_to(Widget, SX(X1), SY(Y1+RX));
cairo_line_to(pcr, SX(X1), SY(Y1+RX));
EllipseArcPath(X1+RX, Y1+RY, RX, RY, PI, PI*1.5, True, True);
FillAndStroke;
Result := True;
finally
cairo_translate(Widget, -DX, -DY);
cairo_translate(pcr, -DX, -DY);
end;
end;
@ -2127,13 +2129,13 @@ var
FX, FY: Double;
X0, Y0: Integer;
begin
if not Assigned(Widget) then
if not Assigned(pcr) then
exit(False);
ApplyPen;
// we must paint line until, but NOT including, (X,Y)
// let's offset X, Y by 1 px, but only for horizontal and vertical lines (yet?)
cairo_get_current_point(Widget, @FX, @FY);
cairo_get_current_point(pcr, @FX, @FY);
X0 := Round(FX-PixelOffset);
Y0 := Round(FY-PixelOffset);
if X0 = X then
@ -2155,8 +2157,8 @@ begin
Inc(X);
end;
cairo_line_to(Widget, X+PixelOffset, Y+PixelOffset);
cairo_stroke(Widget);
cairo_line_to(pcr, X+PixelOffset, Y+PixelOffset);
cairo_stroke(pcr);
Result := True;
end;
@ -2165,26 +2167,26 @@ var
dx: Double;
dy: Double;
begin
if not Assigned(Widget) then
if not Assigned(pcr) then
exit(False);
if OldPoint <> nil then
begin
cairo_get_current_point(Widget, @dx, @dy);
cairo_get_current_point(pcr, @dx, @dy);
OldPoint^.X := Round(dx);
OldPoint^.Y := Round(dy);
end;
cairo_move_to(Widget, X+PixelOffset, Y+PixelOffset);
cairo_move_to(pcr, X+PixelOffset, Y+PixelOffset);
Result := True;
end;
function TGtk3DeviceContext.SetClipRegion(ARgn: TGtk3Region): Integer;
begin
Result := SimpleRegion;
if Assigned(Widget) then
if Assigned(pcr) then
begin
cairo_reset_clip(Widget);
gdk_cairo_region(Self.Widget, ARgn.FHandle);
cairo_clip(Widget);
cairo_reset_clip(pcr);
gdk_cairo_region(pcr, ARgn.FHandle);
cairo_clip(pcr);
end;
end;
@ -2193,7 +2195,7 @@ var
R, G, B: double;
begin
TColorToRGB(AColor, R, G, B);
cairo_set_source_rgb(Widget, R, G, B);
cairo_set_source_rgb(pcr, R, G, B);
end;
procedure TGtk3DeviceContext.SetImage(AImage: TGtk3Image);
@ -2201,7 +2203,7 @@ var
APixBuf: PGdkPixbuf;
begin
FCurrentImage := AImage;
cairo_destroy(Widget);
cairo_destroy(pcr);
APixBuf := AImage.Handle;
if not Gtk3IsGdkPixbuf(APixBuf) then
begin
@ -2221,15 +2223,15 @@ begin
APixBuf^.get_width,
APixBuf^.get_height,
APixBuf^.rowstride);
Widget := cairo_create(CairoSurface);
pcr := cairo_create(CairoSurface);
FOwnsSurface := true;
end;
function TGtk3DeviceContext.ResetClip: Integer;
begin
Result := NullRegion;
if Assigned(Widget) then
cairo_reset_clip(Widget);
if Assigned(pcr) then
cairo_reset_clip(pcr);
end;
procedure TGtk3DeviceContext.TranslateCairoToDevice;
@ -2242,7 +2244,14 @@ end;
procedure TGtk3DeviceContext.Translate(APoint: TPoint);
begin
cairo_translate(Widget, APoint.X, APoint.Y);
cairo_translate(pcr, APoint.X, APoint.Y);
end;
procedure TGtk3DeviceContext.set_antialiasing(aamode: boolean);
const
caa:array[boolean] of cairo_antialias_t = (CAIRO_ANTIALIAS_NONE,CAIRO_ANTIALIAS_DEFAULT);
begin
cairo_set_antialias(pcr, caa[aamode]);
end;

View File

@ -1362,8 +1362,8 @@ begin
begin
// do resize to lcl size when mapping widget
gdk_window_set_events(AWindow, GDK_DEFAULT_EVENTS_MASK);
if not (wtWindow in TGtk3Widget(Data).WidgetType) then
begin
{ if not (wtWindow in TGtk3Widget(Data).WidgetType) then
begin }
with TGtk3Widget(Data).LCLObject do
begin
xx := Left;
@ -1375,12 +1375,12 @@ begin
AWindow^.move(xx, yy);
AWindow^.resize(w, h);
TGtk3Widget(Data).EndUpdate;
end else
{ end else
begin
// DebugLn('TGtk3Window is mapped , setting lclwidget property to PGdkWindow ...');
// now we set 'lclwidget' to our window.
// g_object_set_data(AWindow,'lclwidget', TGtk3Widget(Data));
end;
end;}
end else
begin
if wtMemo in TGtk3Widget(Data).WidgetType then
@ -1389,6 +1389,7 @@ begin
// gdk_window_get_position(AWindow, @xx,@yy);
// DebugLn(' ***** Window ',Format('x %d y %d w %d h %d',[xx,yy,w,h]),' lclobject ',dbgsName(TGtk3Widget(Data).LCLObject));
end;
end;
end;
@ -4151,8 +4152,11 @@ begin
else
gtb:=TGtkToolButton.new(wicon,PgChar(bs));
end;
gtb^.set_tooltip_text(PgChar(btn.Hint));
PgtkToolButton(gtb)^.set_use_underline(true);
if not (btn.Style in [tbsSeparator,tbsDivider]) then
begin
gtb^.set_tooltip_text(PgChar(btn.Hint));
PgtkToolButton(gtb)^.set_use_underline(true);
end;
PGtkToolBar(Result)^.add(gtb);
if not (btn.Style in [tbsSeparator,tbsDivider]) then

View File

@ -632,7 +632,7 @@ begin
exit;
end;
with aRect do
gtk_render_focus(Context ,TGtk3DeviceContext(DC).Widget, Left, Top, Right - Left, Bottom - Top);
gtk_render_focus(Context ,TGtk3DeviceContext(DC).pcr, Left, Top, Right - Left, Bottom - Top);
Result := True;
end;
@ -1522,7 +1522,7 @@ begin
exit;
end;
// get existing clip
gdk_cairo_get_clip_rectangle(GtkDC.Widget, @ARect);
gdk_cairo_get_clip_rectangle(GtkDC.pcr, @ARect);
R := RectFromGdkRect(ARect);
if IsRectEmpty(R) then
begin
@ -1557,7 +1557,7 @@ begin
//exit;
// when substracting we must have active clipregion
// with all of its rects.
gdk_cairo_get_clip_rectangle(GtkDC.Widget, @ARect);
gdk_cairo_get_clip_rectangle(GtkDC.pcr, @ARect);
R := RectFromGdkRect(ARect);
if IsRectEmpty(R) then
begin
@ -1663,7 +1663,7 @@ begin
end;
end;
cr := TGtk3DeviceContext(DC).Widget;
cr := TGtk3DeviceContext(DC).pcr;
cairo_save(cr);
try
cairo_set_line_width(cr, 1);
@ -1705,7 +1705,7 @@ begin
Result := 0;
if not IsValidDC(DC) then
exit;
cr := TGtk3DeviceContext(DC).Widget;
cr := TGtk3DeviceContext(DC).pcr;
cairo_rectangle(cr, ARect.Left+PixelOffset, ARect.Top+PixelOffset, ARect.Right-ARect.Left-1, ARect.Bottom-ARect.Top-1);
if IsValidGDIObject(hBr) then
TGtk3DeviceContext(DC).SetSourceColor(TGtk3Brush(HBR).Color);
@ -1842,7 +1842,7 @@ begin
if Result <> ERROR then
begin
cr := GtkDC.Widget;
cr := GtkDC.pcr;
if gdk_cairo_get_clip_rectangle(cr, @ARect) then
begin
lpRect^ := RectFromGdkRect(ARect);
@ -1861,7 +1861,7 @@ begin
Result := -1;
if not IsValidDC(DC) or (RGN = 0) then
exit;
gdk_cairo_get_clip_rectangle(TGtk3DeviceContext(DC).Widget, @ARect);
gdk_cairo_get_clip_rectangle(TGtk3DeviceContext(DC).pcr, @ARect);
// DebugLn('GetClipRgn ',dbgs(TGtk3Region(RGN).GetExtents),' clipRect ',dbgs(RectFromGdkRect(ARect)));
if IsRectEmpty(RectFromGdkRect(ARect)) then
exit(0)
@ -2026,9 +2026,9 @@ begin
p.Y := TGtk3DeviceContext(DC).ParentPixmap^.get_height;
Result := True;
end else
if TGtk3DeviceContext(DC).Widget <> nil then
if TGtk3DeviceContext(DC).pcr <> nil then
begin
gdk_cairo_get_clip_rectangle(TGtk3DeviceContext(DC).Widget, @ARect);
gdk_cairo_get_clip_rectangle(TGtk3DeviceContext(DC).pcr, @ARect);
p.X := ARect.Width;
p.Y := ARect.Height;
Result := True;
@ -2777,7 +2777,7 @@ begin
{$endif}
exit;
end;
cairo_get_matrix(TGtk3DeviceContext(DC).Widget, @Matrix);
cairo_get_matrix(TGtk3DeviceContext(DC).pcr, @Matrix);
dx := 0;
dy := 0;
cairo_matrix_transform_point(@Matrix, @dx, @dy);
@ -2946,7 +2946,7 @@ begin
// inherited LPtoDP(DC, Points, Count);
if not IsValidDC(DC) then
exit;
cr := TGtk3DeviceContext(DC).Widget;
cr := TGtk3DeviceContext(DC).pcr;
P := @Points;
while Count > 0 do
@ -3265,7 +3265,7 @@ begin
Result := False;
if not IsValidDC(DC) then
exit;
cairo_restore(TGtk3DeviceContext(DC).Widget);
cairo_restore(TGtk3DeviceContext(DC).pcr);
Result := True;
end;
@ -3286,7 +3286,7 @@ begin
Result := 0;
if not IsValidDC(DC) then
exit;
cairo_save(TGtk3DeviceContext(DC).Widget);
cairo_save(TGtk3DeviceContext(DC).pcr);
Result := 1;
end;
@ -3813,14 +3813,14 @@ begin
if IsValidDC(DC) then
begin
GetWindowOrgEx(dc, OldPoint);
cairo_get_matrix(TGtk3DeviceContext(DC).Widget, @Matrix);
cairo_get_matrix(TGtk3DeviceContext(DC).pcr, @Matrix);
//dx := 0;
//dy := 0;
// cairo_matrix_init_translate(Matrix, -NewX, -NewY);
cairo_matrix_translate(@Matrix,
-NewX - TGtk3DeviceContext(DC).fncOrigin.x,
-NewY - TGtk3DeviceContext(DC).fncOrigin.Y);
cairo_transform(TGtk3DeviceContext(DC).Widget, @Matrix);
cairo_transform(TGtk3DeviceContext(DC).pcr, @Matrix);
// cairo_set_matrix(TGtk3DeviceContext(DC).Widget, Matrix);
// DebugLn('TGtk3WidgetSet.SetWindowOrgEx NewX=',dbgs(NewX),' NewY=',dbgs(NewY));
Result := True;

View File

@ -328,7 +328,7 @@ begin
if not WSCheckHandleAllocated(AWincontrol, 'PaintTo') or (ADC = 0) then
Exit;
AWidget := TGtk3Widget(AWinControl.Handle);
cr := TGtk3DeviceContext(ADC).Widget;
cr := TGtk3DeviceContext(ADC).pcr;
cairo_save(cr);
cairo_translate(cr, X, Y);
gtk_widget_draw(AWidget.Widget, cr);
@ -537,20 +537,25 @@ begin
end;
class procedure TGtk3WSWinControl.ShowHide(const AWinControl: TWinControl);
var
wgt:TGtk3Widget;
begin
if not WSCheckHandleAllocated(AWinControl, 'ShowHide') then
Exit;
{$IFDEF GTK3DEBUGCORE}
DebugLn('TGtk3WSWinControl.ShowHide ',dbgsName(AWinControl));
{$ENDIF}
TGtk3Widget(AWinControl.Handle).Visible := AWinControl.HandleObjectShouldBeVisible;
if TGtk3Widget(AWinControl.Handle).Visible then
wgt:=TGtk3Widget(AWinControl.Handle);
wgt.Visible := AWinControl.HandleObjectShouldBeVisible;
if wgt.Visible then
begin
TGtk3Widget(AWinControl.Handle).ShowAll;
wgt.ShowAll;
// imediatelly realize (create widget handles), so we'll get updated bounds
// and everything just on time.
if not (wtScrollingWin in TGtk3Widget(AWinControl.Handle).WidgetType) then
PGtkWidget(TGtk3Widget(AWinControl.Handle).GetContainerWidget)^.realize;
if not (wtScrollingWin in wgt.WidgetType) then
begin
wgt.GetContainerWidget^.realize;
end;
end;
end;

View File

@ -1212,12 +1212,19 @@ class procedure TGtk3WSOpenDialog.CreatePreviewDialogControl(
var
PreviewWidget: PGtkWidget;
AControl: TPreviewFileControl;
alloc:TGtkAllocation;
begin
AControl := PreviewDialog.PreviewFileControl;
if AControl = nil then Exit;
PreviewWidget := TGtk3CustomControl(AControl.Handle).Widget;
g_object_set_data(PGObject(PreviewWidget),'LCLPreviewFixed',PreviewWidget);
gtk_widget_set_size_request(PreviewWidget,AControl.Width,AControl.Height);
{alloc.height:=AControl.Height;
alloc.width:=AControl.Width;
alloc.x:=0;
alloc.y:=0;
PreviewWidget^.size_allocate(@alloc);
PreviewWidget^.queue_resize;}
gtk_file_chooser_set_preview_widget(Chooser, PreviewWidget);
gtk_widget_show(PreviewWidget);
end;