You've already forked CEF4Delphi
mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2025-08-14 21:42:50 +02:00
Added canvas save and restore calls as suggested by viniciusfbb
Fixed resize issue in FMXSkiaBrowser FMXSkiaBrowser code cleanup.
This commit is contained in:
@@ -68,13 +68,6 @@ object MainForm: TMainForm
|
|||||||
Left = 40
|
Left = 40
|
||||||
Top = 137
|
Top = 137
|
||||||
end
|
end
|
||||||
object SaveDialog1: TSaveDialog
|
|
||||||
DefaultExt = 'bmp'
|
|
||||||
Filter = 'Bitmap files (*.bmp)|*.BMP'
|
|
||||||
Title = 'Save snapshot'
|
|
||||||
Left = 40
|
|
||||||
Top = 201
|
|
||||||
end
|
|
||||||
object Panel1: TPanel
|
object Panel1: TPanel
|
||||||
Align = Client
|
Align = Client
|
||||||
Size.Width = 945.000000000000000000
|
Size.Width = 945.000000000000000000
|
||||||
@@ -90,7 +83,7 @@ object MainForm: TMainForm
|
|||||||
OnMouseUp = Panel1MouseUp
|
OnMouseUp = Panel1MouseUp
|
||||||
OnMouseWheel = Panel1MouseWheel
|
OnMouseWheel = Panel1MouseWheel
|
||||||
OnMouseLeave = Panel1MouseLeave
|
OnMouseLeave = Panel1MouseLeave
|
||||||
OnResized = Panel1Resized
|
OnResize = Panel1Resize
|
||||||
object SkPaintBox1: TSkPaintBox
|
object SkPaintBox1: TSkPaintBox
|
||||||
Align = Client
|
Align = Client
|
||||||
Size.Width = 945.000000000000000000
|
Size.Width = 945.000000000000000000
|
||||||
|
@@ -44,7 +44,7 @@ interface
|
|||||||
uses
|
uses
|
||||||
{$IFDEF MSWINDOWS}Winapi.Messages, Winapi.Windows,{$ENDIF}
|
{$IFDEF MSWINDOWS}Winapi.Messages, Winapi.Windows,{$ENDIF}
|
||||||
System.Types, System.UITypes, System.Classes, System.SyncObjs,
|
System.Types, System.UITypes, System.Classes, System.SyncObjs,
|
||||||
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Edit, FMX.StdCtrls,
|
FMX.Types, FMX.Controls, FMX.Forms, FMX.Edit, FMX.StdCtrls,
|
||||||
FMX.Controls.Presentation, FMX.ComboEdit, {$IFDEF DELPHI17_UP}FMX.Graphics,{$ENDIF}
|
FMX.Controls.Presentation, FMX.ComboEdit, {$IFDEF DELPHI17_UP}FMX.Graphics,{$ENDIF}
|
||||||
uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler,
|
uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler,
|
||||||
uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore,
|
uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore,
|
||||||
@@ -57,7 +57,6 @@ type
|
|||||||
AddressPnl: TPanel;
|
AddressPnl: TPanel;
|
||||||
chrmosr: TFMXChromium;
|
chrmosr: TFMXChromium;
|
||||||
Timer1: TTimer;
|
Timer1: TTimer;
|
||||||
SaveDialog1: TSaveDialog;
|
|
||||||
GoBtn: TButton;
|
GoBtn: TButton;
|
||||||
AddressCb: TComboEdit;
|
AddressCb: TComboEdit;
|
||||||
SkPaintBox1: TSkPaintBox;
|
SkPaintBox1: TSkPaintBox;
|
||||||
@@ -75,7 +74,6 @@ type
|
|||||||
procedure Panel1MouseLeave(Sender: TObject);
|
procedure Panel1MouseLeave(Sender: TObject);
|
||||||
procedure Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
|
procedure Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
|
||||||
procedure Panel1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
|
procedure Panel1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
|
||||||
procedure Panel1Resized(Sender: TObject);
|
|
||||||
|
|
||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure FormDestroy(Sender: TObject);
|
procedure FormDestroy(Sender: TObject);
|
||||||
@@ -98,16 +96,14 @@ type
|
|||||||
procedure Timer1Timer(Sender: TObject);
|
procedure Timer1Timer(Sender: TObject);
|
||||||
procedure AddressEdtEnter(Sender: TObject);
|
procedure AddressEdtEnter(Sender: TObject);
|
||||||
procedure SkPaintBox1Draw(ASender: TObject; const ACanvas: ISkCanvas; const ADest: TRectF; const AOpacity: Single);
|
procedure SkPaintBox1Draw(ASender: TObject; const ACanvas: ISkCanvas; const ADest: TRectF; const AOpacity: Single);
|
||||||
|
procedure Panel1Resize(Sender: TObject);
|
||||||
|
|
||||||
protected
|
protected
|
||||||
FPopUpBitmap : TBitmap;
|
FPopUpBitmap : TBitmap;
|
||||||
FPopUpRect : TRect;
|
FPopUpRect : TRect;
|
||||||
FShowPopUp : boolean;
|
FShowPopUp : boolean;
|
||||||
FResizing : boolean;
|
|
||||||
FPendingResize : boolean;
|
|
||||||
FCanClose : boolean;
|
FCanClose : boolean;
|
||||||
FClosing : boolean;
|
FClosing : boolean;
|
||||||
FResizeCS : TCriticalSection;
|
|
||||||
FAtLeastWin8 : boolean;
|
FAtLeastWin8 : boolean;
|
||||||
FImage : ISkImage;
|
FImage : ISkImage;
|
||||||
FPopupImage : ISkImage;
|
FPopupImage : ISkImage;
|
||||||
@@ -121,14 +117,13 @@ type
|
|||||||
FLastClickPoint : TPointF;
|
FLastClickPoint : TPointF;
|
||||||
FLastClickButton : TMouseButton;
|
FLastClickButton : TMouseButton;
|
||||||
|
|
||||||
procedure LoadURL;
|
|
||||||
function getModifiers(Shift: TShiftState): TCefEventFlags;
|
function getModifiers(Shift: TShiftState): TCefEventFlags;
|
||||||
function GetButton(Button: TMouseButton): TCefMouseButtonType;
|
function GetButton(Button: TMouseButton): TCefMouseButtonType;
|
||||||
function GetMousePosition(var aPoint : TPointF) : boolean;
|
function GetMousePosition(var aPoint : TPointF) : boolean;
|
||||||
procedure InitializeLastClick;
|
procedure InitializeLastClick;
|
||||||
function CancelPreviousClick(const x, y : single; var aCurrentTime : integer) : boolean;
|
function CancelPreviousClick(const x, y : single; var aCurrentTime : integer) : boolean;
|
||||||
procedure DoResize;
|
|
||||||
procedure DoRedraw;
|
procedure DoRedraw;
|
||||||
|
procedure DoResize;
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
function SendCompMessage(aMsg : cardinal; aWParam : WPARAM = 0; aLParam : LPARAM = 0) : boolean;
|
function SendCompMessage(aMsg : cardinal; aWParam : WPARAM = 0; aLParam : LPARAM = 0) : boolean;
|
||||||
function ArePointerEventsSupported : boolean;
|
function ArePointerEventsSupported : boolean;
|
||||||
@@ -254,11 +249,8 @@ begin
|
|||||||
FPopUpBitmap := nil;
|
FPopUpBitmap := nil;
|
||||||
FPopUpRect := rect(0, 0, 0, 0);
|
FPopUpRect := rect(0, 0, 0, 0);
|
||||||
FShowPopUp := False;
|
FShowPopUp := False;
|
||||||
FResizing := False;
|
|
||||||
FPendingResize := False;
|
|
||||||
FCanClose := False;
|
FCanClose := False;
|
||||||
FClosing := False;
|
FClosing := False;
|
||||||
FResizeCS := TCriticalSection.Create;
|
|
||||||
|
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
FAtLeastWin8 := GetWindowsMajorMinorVersion(TempMajorVer, TempMinorVer) and
|
FAtLeastWin8 := GetWindowsMajorMinorVersion(TempMajorVer, TempMinorVer) and
|
||||||
@@ -280,8 +272,6 @@ end;
|
|||||||
|
|
||||||
procedure TMainForm.FormDestroy(Sender: TObject);
|
procedure TMainForm.FormDestroy(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
FResizeCS.Free;
|
|
||||||
|
|
||||||
if (FPopUpBitmap <> nil) then FreeAndNil(FPopUpBitmap);
|
if (FPopUpBitmap <> nil) then FreeAndNil(FPopUpBitmap);
|
||||||
|
|
||||||
FImage := nil;
|
FImage := nil;
|
||||||
@@ -332,16 +322,6 @@ end;
|
|||||||
|
|
||||||
procedure TMainForm.GoBtnClick(Sender: TObject);
|
procedure TMainForm.GoBtnClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
LoadURL;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TMainForm.LoadURL;
|
|
||||||
begin
|
|
||||||
FResizeCS.Acquire;
|
|
||||||
FResizing := False;
|
|
||||||
FPendingResize := False;
|
|
||||||
FResizeCS.Release;
|
|
||||||
|
|
||||||
chrmosr.LoadURL(AddressCb.Text);
|
chrmosr.LoadURL(AddressCb.Text);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -360,9 +340,9 @@ begin
|
|||||||
chrmosr.SetFocus(False);
|
chrmosr.SetFocus(False);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.Panel1Resized(Sender: TObject);
|
procedure TMainForm.Panel1Resize(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
DoResize;
|
chrmosr.WasResized;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.Panel1Click(Sender: TObject);
|
procedure TMainForm.Panel1Click(Sender: TObject);
|
||||||
@@ -528,10 +508,11 @@ begin
|
|||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
SendCompMessage(WM_CLOSE);
|
SendCompMessage(WM_CLOSE);
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
TThread.Queue(nil, procedure
|
TThread.ForceQueue(nil,
|
||||||
begin
|
procedure
|
||||||
close
|
begin
|
||||||
end);
|
close;
|
||||||
|
end);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -599,7 +580,7 @@ var
|
|||||||
begin
|
begin
|
||||||
TempPoint.x := viewX;
|
TempPoint.x := viewX;
|
||||||
TempPoint.y := viewY;
|
TempPoint.y := viewY;
|
||||||
// TFMXBufferPanel.ClientToScreen applies the scale factor. No need to call LogicalToDevice to set TempViewPt.
|
// LocalToScreen applies the scale factor. No need to call LogicalToDevice to set TempViewPt.
|
||||||
TempPoint := Panel1.LocalToScreen(TempPoint);
|
TempPoint := Panel1.LocalToScreen(TempPoint);
|
||||||
screenX := round(TempPoint.x);
|
screenX := round(TempPoint.x);
|
||||||
screenY := round(TempPoint.y);
|
screenY := round(TempPoint.y);
|
||||||
@@ -625,37 +606,28 @@ procedure TMainForm.chrmosrPaint( Sender : TObject;
|
|||||||
width : Integer;
|
width : Integer;
|
||||||
height : Integer);
|
height : Integer);
|
||||||
var
|
var
|
||||||
TempForcedResize : boolean;
|
TempMustResize : boolean;
|
||||||
TempImageInfo : TSkImageInfo;
|
TempImageInfo : TSkImageInfo;
|
||||||
begin
|
begin
|
||||||
try
|
case type_ of
|
||||||
FResizeCS.Acquire;
|
PET_VIEW :
|
||||||
|
begin
|
||||||
|
TempMustResize := (FImageInfo.Width <> width) or (FImageInfo.Height <> height);
|
||||||
|
FImageInfo := TSkImageInfo.Create(width, height);
|
||||||
|
FImage := TSkImage.MakeRasterCopy(FImageInfo, buffer, FImageInfo.MinRowBytes);
|
||||||
|
|
||||||
case type_ of
|
TThread.ForceQueue(nil, DoRedraw);
|
||||||
PET_VIEW :
|
|
||||||
begin
|
|
||||||
TempForcedResize := (FImageInfo.Width <> width) or (FImageInfo.Height <> height);
|
|
||||||
FImageInfo := TSkImageInfo.Create(width, height);
|
|
||||||
FImage := TSkImage.MakeRasterCopy(FImageInfo, buffer, FImageInfo.MinRowBytes);
|
|
||||||
|
|
||||||
TThread.ForceQueue(nil, DoRedraw);
|
if TempMustResize then
|
||||||
|
TThread.ForceQueue(nil, DoResize);
|
||||||
|
end;
|
||||||
|
|
||||||
if TempForcedResize or FPendingResize then
|
PET_POPUP :
|
||||||
TThread.ForceQueue(nil, DoResize);
|
begin
|
||||||
|
TempImageInfo := TSkImageInfo.Create(width, height);
|
||||||
FResizing := False;
|
FPopupImage := TSkImage.MakeRasterCopy(TempImageInfo, buffer, TempImageInfo.MinRowBytes);
|
||||||
FPendingResize := False;
|
TThread.ForceQueue(nil, DoRedraw);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
PET_POPUP :
|
|
||||||
begin
|
|
||||||
TempImageInfo := TSkImageInfo.Create(width, height);
|
|
||||||
FPopupImage := TSkImage.MakeRasterCopy(TempImageInfo, buffer, TempImageInfo.MinRowBytes);
|
|
||||||
TThread.ForceQueue(nil, DoRedraw);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
FResizeCS.Release;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -706,26 +678,7 @@ end;
|
|||||||
|
|
||||||
procedure TMainForm.DoResize;
|
procedure TMainForm.DoResize;
|
||||||
begin
|
begin
|
||||||
try
|
chrmosr.WasResized;
|
||||||
if (FResizeCS <> nil) then
|
|
||||||
begin
|
|
||||||
FResizeCS.Acquire;
|
|
||||||
|
|
||||||
if FResizing then
|
|
||||||
FPendingResize := True
|
|
||||||
else
|
|
||||||
if (FImageInfo.Width = round(SkPaintBox1.width)) and
|
|
||||||
(FImageInfo.Height = round(SkPaintBox1.height)) then
|
|
||||||
chrmosr.Invalidate(PET_VIEW)
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
FResizing := True;
|
|
||||||
chrmosr.WasResized;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
if (FResizeCS <> nil) then FResizeCS.Release;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
|
procedure TMainForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
|
||||||
@@ -744,26 +697,30 @@ procedure TMainForm.SkPaintBox1Draw(ASender: TObject; const ACanvas: ISkCanvas;
|
|||||||
var
|
var
|
||||||
TempRect : TRectF;
|
TempRect : TRectF;
|
||||||
begin
|
begin
|
||||||
if assigned(FImage) then
|
if not(assigned(FImage)) then exit;
|
||||||
begin
|
|
||||||
TempRect.Left := 0;
|
|
||||||
TempRect.Top := 0;
|
|
||||||
TempRect.Right := FImage.Width / GlobalCEFApp.DeviceScaleFactor;
|
|
||||||
TempRect.Bottom := FImage.Height / GlobalCEFApp.DeviceScaleFactor;
|
|
||||||
|
|
||||||
ACanvas.ClipRect(ADest);
|
ACanvas.Save;
|
||||||
ACanvas.DrawImageRect(FImage, TempRect);
|
try
|
||||||
|
TempRect.Left := 0;
|
||||||
|
TempRect.Top := 0;
|
||||||
|
TempRect.Right := FImage.Width / GlobalCEFApp.DeviceScaleFactor;
|
||||||
|
TempRect.Bottom := FImage.Height / GlobalCEFApp.DeviceScaleFactor;
|
||||||
|
|
||||||
if FShowPopUp and assigned(FPopupImage) then
|
ACanvas.ClipRect(ADest);
|
||||||
begin
|
ACanvas.DrawImageRect(FImage, TempRect);
|
||||||
TempRect.Left := FPopUpRect.Left / GlobalCEFApp.DeviceScaleFactor;
|
|
||||||
TempRect.Top := FPopUpRect.Top / GlobalCEFApp.DeviceScaleFactor;
|
|
||||||
TempRect.Right := TempRect.Left + (FPopupImage.Width / GlobalCEFApp.DeviceScaleFactor);
|
|
||||||
TempRect.Bottom := TempRect.Top + (FPopupImage.Height / GlobalCEFApp.DeviceScaleFactor);
|
|
||||||
|
|
||||||
ACanvas.DrawImageRect(FPopupImage, TempRect);
|
if FShowPopUp and assigned(FPopupImage) then
|
||||||
end;
|
begin
|
||||||
end;
|
TempRect.Left := FPopUpRect.Left / GlobalCEFApp.DeviceScaleFactor;
|
||||||
|
TempRect.Top := FPopUpRect.Top / GlobalCEFApp.DeviceScaleFactor;
|
||||||
|
TempRect.Right := TempRect.Left + (FPopupImage.Width / GlobalCEFApp.DeviceScaleFactor);
|
||||||
|
TempRect.Bottom := TempRect.Top + (FPopupImage.Height / GlobalCEFApp.DeviceScaleFactor);
|
||||||
|
|
||||||
|
ACanvas.DrawImageRect(FPopupImage, TempRect);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
ACanvas.Restore;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.NotifyMoveOrResizeStarted;
|
procedure TMainForm.NotifyMoveOrResizeStarted;
|
||||||
@@ -1026,7 +983,7 @@ begin
|
|||||||
TempPointF.x := TempPenInfo.pointerInfo.ptPixelLocation.x;
|
TempPointF.x := TempPenInfo.pointerInfo.ptPixelLocation.x;
|
||||||
TempPointF.y := TempPenInfo.pointerInfo.ptPixelLocation.y;
|
TempPointF.y := TempPenInfo.pointerInfo.ptPixelLocation.y;
|
||||||
TempPointF := Panel1.ScreenToLocal(TempPointF);
|
TempPointF := Panel1.ScreenToLocal(TempPointF);
|
||||||
// TFMXBufferPanel.ScreenToClient applies the scale factor. No need to call DeviceToLogical to set TempTouchEvent.
|
// ScreenToLocal applies the scale factor. No need to call DeviceToLogical to set TempTouchEvent.
|
||||||
TempTouchEvent.x := round(TempPointF.x);
|
TempTouchEvent.x := round(TempPointF.x);
|
||||||
TempTouchEvent.y := round(TempPointF.y);
|
TempTouchEvent.y := round(TempPointF.y);
|
||||||
|
|
||||||
@@ -1075,7 +1032,7 @@ begin
|
|||||||
TempPointF.x := TempTouchInfo.pointerInfo.ptPixelLocation.x;
|
TempPointF.x := TempTouchInfo.pointerInfo.ptPixelLocation.x;
|
||||||
TempPointF.y := TempTouchInfo.pointerInfo.ptPixelLocation.y;
|
TempPointF.y := TempTouchInfo.pointerInfo.ptPixelLocation.y;
|
||||||
TempPointF := Panel1.ScreenToLocal(TempPointF);
|
TempPointF := Panel1.ScreenToLocal(TempPointF);
|
||||||
// TFMXBufferPanel.ScreenToClient applies the scale factor. No need to call DeviceToLogical to set TempTouchEvent.
|
// ScreenToLocal applies the scale factor. No need to call DeviceToLogical to set TempTouchEvent.
|
||||||
TempTouchEvent.x := round(TempPointF.x);
|
TempTouchEvent.x := round(TempPointF.x);
|
||||||
TempTouchEvent.y := round(TempPointF.y);
|
TempTouchEvent.y := round(TempPointF.y);
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"UpdateLazPackages" : [
|
"UpdateLazPackages" : [
|
||||||
{
|
{
|
||||||
"ForceNotify" : true,
|
"ForceNotify" : true,
|
||||||
"InternalVersion" : 399,
|
"InternalVersion" : 400,
|
||||||
"Name" : "cef4delphi_lazarus.lpk",
|
"Name" : "cef4delphi_lazarus.lpk",
|
||||||
"Version" : "102.0.9.0"
|
"Version" : "102.0.9.0"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user