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); // inherited DCSetAntialiasing(CanvasHandle, AEnabled);
if IsValidDC(CanvasHandle) then if IsValidDC(CanvasHandle) then
begin begin
if AEnabled then TGtk3DeviceContext(CanvasHandle).set_antialiasing(AEnabled);
cairo_set_antialias(TGtk3DeviceContext(CanvasHandle).Widget, CAIRO_ANTIALIAS_DEFAULT)
else
cairo_set_antialias(TGtk3DeviceContext(CanvasHandle).Widget, CAIRO_ANTIALIAS_NONE);
end; end;
end; end;

View File

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

View File

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

View File

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

View File

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

View File

@ -1212,12 +1212,19 @@ class procedure TGtk3WSOpenDialog.CreatePreviewDialogControl(
var var
PreviewWidget: PGtkWidget; PreviewWidget: PGtkWidget;
AControl: TPreviewFileControl; AControl: TPreviewFileControl;
alloc:TGtkAllocation;
begin begin
AControl := PreviewDialog.PreviewFileControl; AControl := PreviewDialog.PreviewFileControl;
if AControl = nil then Exit; if AControl = nil then Exit;
PreviewWidget := TGtk3CustomControl(AControl.Handle).Widget; PreviewWidget := TGtk3CustomControl(AControl.Handle).Widget;
g_object_set_data(PGObject(PreviewWidget),'LCLPreviewFixed',PreviewWidget); g_object_set_data(PGObject(PreviewWidget),'LCLPreviewFixed',PreviewWidget);
gtk_widget_set_size_request(PreviewWidget,AControl.Width,AControl.Height); 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_file_chooser_set_preview_widget(Chooser, PreviewWidget);
gtk_widget_show(PreviewWidget); gtk_widget_show(PreviewWidget);
end; end;