mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 06:40:36 +02:00
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:
parent
c83c7f8279
commit
610353511b
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user