LazMapViewer: Complete unfinished LCL mapviewer (using only LCL drawing routines). Update "fulldemo_with_addons".

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9324 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-04-04 18:10:21 +00:00
parent 4f4248244a
commit c13251c57d
5 changed files with 132 additions and 26 deletions

View File

@ -727,6 +727,7 @@ object MainForm: TMainForm
'default' 'default'
'RGBGraphics' 'RGBGraphics'
'BGRABitmap' 'BGRABitmap'
'LCL'
) )
Style = csDropDownList Style = csDropDownList
TabOrder = 0 TabOrder = 0

View File

@ -7,8 +7,9 @@ interface
uses uses
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ComCtrls, Buttons, IntfGraphics, ColorBox, Spin, Grids, ExtDlgs, StdCtrls, ComCtrls, Buttons, IntfGraphics, ColorBox, Spin, Grids, ExtDlgs,
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine, mvDE_RGBGraphics, mvGeoNames, mvMapViewer, mvTypes, mvGpsObj,
mvDE_BGRA, mvDLEFPC, mvDLEWin, mvDLESynapse; mvDrawingEngine, mvDE_RGBGraphics, mvDE_BGRA, mvDE_LCL,
mvDLEFPC, mvDLEWin, mvDLESynapse;
type type
@ -142,6 +143,7 @@ type
private private
FRGBGraphicsDrawingEngine: TMvRGBGraphicsDrawingEngine; FRGBGraphicsDrawingEngine: TMvRGBGraphicsDrawingEngine;
FBGRADrawingEngine: TMvBGRADrawingEngine; FBGRADrawingEngine: TMvBGRADrawingEngine;
FLCLDrawingEngine: TMvLCLDrawingEngine;
FSynapseDownloadEngine: TMvDESynapse; FSynapseDownloadEngine: TMvDESynapse;
FFpHttpClientDownloadEngine: TMvDEFPC; FFpHttpClientDownloadEngine: TMvDEFPC;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
@ -406,6 +408,11 @@ begin
FBGRADrawingEngine := TMvBGRADrawingEngine.Create(self); FBGRADrawingEngine := TMvBGRADrawingEngine.Create(self);
MapView.DrawingEngine := FBGRADrawingEngine; MapView.DrawingEngine := FBGRADrawingEngine;
end; end;
3: begin
if FLCLDrawingEngine = nil then
FLCLDrawingEngine := TMvLCLDrawingEngine.Create(self);
MapView.DrawingEngine := FLCLDrawingEngine;
end;
end; end;
UpdateLayers; UpdateLayers;
end; end;

View File

@ -20,7 +20,7 @@
<Description Value="Component for viewing maps (Google, OpenStreetMap, etc). This is a fork of MapViewer by ti_dic (https://sourceforge.net/p/roadbook/code/ci/master/tree/mapviewer/) which itself is based on the MapViewer by Maciej Kaczkowski (https://github.com/maciejkaczkowski/mapviewer)."/> <Description Value="Component for viewing maps (Google, OpenStreetMap, etc). This is a fork of MapViewer by ti_dic (https://sourceforge.net/p/roadbook/code/ci/master/tree/mapviewer/) which itself is based on the MapViewer by Maciej Kaczkowski (https://github.com/maciejkaczkowski/mapviewer)."/>
<License Value="Modified LGPL with linking exception, like FreePascal RTL/FCL and Lazarus LCL"/> <License Value="Modified LGPL with linking exception, like FreePascal RTL/FCL and Lazarus LCL"/>
<Version Minor="2" Release="7"/> <Version Minor="2" Release="7"/>
<Files Count="20"> <Files Count="21">
<Item1> <Item1>
<Filename Value="source/mvcache.pas"/> <Filename Value="source/mvcache.pas"/>
<UnitName Value="mvCache"/> <UnitName Value="mvCache"/>
@ -103,6 +103,11 @@
<Filename Value="source/mvlayerspropeditform.pas"/> <Filename Value="source/mvlayerspropeditform.pas"/>
<UnitName Value="mvLayersPropEditForm"/> <UnitName Value="mvLayersPropEditForm"/>
</Item20> </Item20>
<Item21>
<Filename Value="source/mvde_lcl.pas"/>
<HasRegisterProc Value="True"/>
<UnitName Value="mvDE_LCL"/>
</Item21>
</Files> </Files>
<CompatibilityMode Value="True"/> <CompatibilityMode Value="True"/>
<RequiredPkgs Count="2"> <RequiredPkgs Count="2">

View File

@ -11,7 +11,8 @@ uses
mvCache, mvDownloadEngine, mvDragObj, mvEngine, mvGeoNames, mvGpsObj, mvCache, mvDownloadEngine, mvDragObj, mvEngine, mvGeoNames, mvGpsObj,
mvJobQueue, mvJobs, mvMapProvider, mvTypes, mvMapViewer, mvExtraData, mvJobQueue, mvJobs, mvMapProvider, mvTypes, mvMapViewer, mvExtraData,
mvDLEFpc, mvMapViewerReg, mvGPX, mvDrawingEngine, mvDE_IntfGraphics, mvDLEFpc, mvMapViewerReg, mvGPX, mvDrawingEngine, mvDE_IntfGraphics,
mvDLEWin, mvMapViewerPropEdits, mvLayersPropEditForm, LazarusPackageIntf; mvDLEWin, mvMapViewerPropEdits, mvLayersPropEditForm, mvDE_LCL,
LazarusPackageIntf;
implementation implementation
@ -19,6 +20,7 @@ procedure Register;
begin begin
RegisterUnit('mvMapViewerReg', @mvMapViewerReg.Register); RegisterUnit('mvMapViewerReg', @mvMapViewerReg.Register);
RegisterUnit('mvMapViewerPropEdits', @mvMapViewerPropEdits.Register); RegisterUnit('mvMapViewerPropEdits', @mvMapViewerPropEdits.Register);
RegisterUnit('mvDE_LCL', @mvDE_LCL.Register);
end; end;
initialization initialization

View File

@ -16,11 +16,26 @@ unit mvDE_LCL;
interface interface
uses uses
Classes, SysUtils, Graphics, Types, IntfGraphics, Classes, SysUtils, Graphics, Types, IntfGraphics, fpReadJPEG, fpReadPNG,
mvDrawingEngine; mvDrawingEngine, mvCache;
type type
{ TLCLCacheItem }
TLCLCacheItem = class(TPictureCacheItem)
private
FImage: TCustomBitmap;
function GetImage: TCustomBitmap;
protected
function GetImageObject: TObject; override;
public
constructor Create(AStream: TStream); override;
destructor Destroy; override;
property Image: TCustomBitmap read GetImage;
end;
{ TMvLCLDrawingEngine } { TMvLCLDrawingEngine }
TMvLCLDrawingEngine = class(TMvCustomDrawingEngine) TMvLCLDrawingEngine = class(TMvCustomDrawingEngine)
@ -48,25 +63,82 @@ type
procedure CreateBuffer(AWidth, AHeight: Integer); override; procedure CreateBuffer(AWidth, AHeight: Integer); override;
procedure DrawBitmap(X, Y: Integer; ABitmap: TCustomBitmap; procedure DrawBitmap(X, Y: Integer; ABitmap: TCustomBitmap;
{%H-}UseAlphaChannel: Boolean); override; {%H-}UseAlphaChannel: Boolean); override;
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); override; procedure DrawCacheItem(X, Y: Integer; AImg: TPictureCacheItem;
ADrawMode: TItemDrawMode = idmDraw; AOpacity: Single = 1.0 ); override;
procedure DrawScaledCacheItem(DestRect, SrcRect: TRect; ASrcImg: TPictureCacheItem); override;
procedure Ellipse(X1, Y1, X2, Y2: Integer); override; procedure Ellipse(X1, Y1, X2, Y2: Integer); override;
procedure FillPixels(X1, Y1, X2, Y2: Integer; AColor: TColor); override;
procedure FillRect(X1, Y1, X2, Y2: Integer); override; procedure FillRect(X1, Y1, X2, Y2: Integer); override;
procedure Line(X1, Y1, X2, Y2: Integer); override; procedure Line(X1, Y1, X2, Y2: Integer); override;
procedure Polyline(const Points: array of TPoint); override; procedure Polyline(const Points: array of TPoint); override;
procedure Polygon(const Points: array of TPoint); override; procedure Polygon(const Points: array of TPoint); override;
procedure PolyBezier(const Points: array of TPoint; Filled: Boolean = False; procedure PolyBezier(const Points: array of TPoint; Filled: Boolean = False;
Continuous: Boolean = True); override; Continuous: Boolean = True); override;
procedure PaintToCanvas(ACanvas: TCanvas); override; procedure PaintToCanvas(ACanvas: TCanvas; Origin: TPoint); override;
procedure Rectangle(X1, Y1, X2, Y2: Integer); override; procedure Rectangle(X1, Y1, X2, Y2: Integer); override;
function SaveToImage(AClass: TRasterImageClass): TRasterImage; override; function SaveToImage(AClass: TRasterImageClass): TRasterImage; override;
function TextExtent(const AText: String): TSize; override; function TextExtent(const AText: String): TSize; override;
procedure TextOut(X, Y: Integer; const AText: String); override; procedure TextOut(X, Y: Integer; const AText: String); override;
function GetCacheItemClass: TPictureCacheItemClass; override;
end; end;
procedure Register;
implementation implementation
uses uses
LCLType; LCLType, FPImage, mvTypes;
procedure Register;
begin
RegisterComponents(PALETTE_PAGE, [TMvLCLDrawingEngine]);
end;
{ TLCLCacheItem }
function TLCLCacheItem.GetImage: TCustomBitmap;
begin
Result := FImage;
end;
function TLCLCacheItem.GetImageObject: TObject;
begin
Result := FImage;
end;
constructor TLCLCacheItem.Create(AStream: TStream);
var
reader: TFPCustomImageReader;
begin
FImage := Nil;
reader := GetImageReader(AStream);
if reader is TFPReaderJPEG then
FImage := TJpegImage.Create
else
if reader is TFPReaderPNG then
FImage := TPortableNetworkGraphic.Create
else
raise EInvalidGraphic.Create('PNG/JPG expected.');
try
try
FImage.LoadFromStream(AStream);
except
FreeAndNil(FImage);
end;
finally
reader.Free;
end;
end;
destructor TLCLCacheItem.Destroy;
begin
FImage.Free;
inherited Destroy;
end;
{ TMvLCLDrawingEngine }
destructor TMvLCLDrawingEngine.Destroy; destructor TMvLCLDrawingEngine.Destroy;
begin begin
@ -88,23 +160,23 @@ begin
FBuffer.Canvas.Draw(X, Y, ABitmap); FBuffer.Canvas.Draw(X, Y, ABitmap);
end; end;
procedure TMvLCLDrawingEngine.DrawLazIntfImage(X, Y: Integer; procedure TMvLCLDrawingEngine.DrawCacheItem(X, Y: Integer;
AImg: TLazIntfImage); AImg: TPictureCacheItem; ADrawMode: TItemDrawMode; AOpacity: Single);
var var
bmp: TBitmap; item: TLCLCacheItem;
h, mh: HBITMAP;
begin begin
bmp := TBitmap.Create; item := AImg as TLCLCacheItem;
try FBuffer.Canvas.Draw(X, Y, item.Image);
bmp.PixelFormat := pf32Bit; end;
bmp.SetSize(AImg.Width, AImg.Height);
AImg.CreateBitmaps(h, mh); procedure TMvLCLDrawingEngine.DrawScaledCacheItem(DestRect,
bmp.Handle := h; SrcRect: TRect; ASrcImg: TPictureCacheItem);
bmp.MaskHandle := mh; var
FBuffer.Canvas.Draw(X, Y, bmp); item: TLCLCacheItem;
finally bmp: TBitmap;
bmp.Free; begin
end; item := ASrcImg as TLCLCacheItem;
FBuffer.Canvas.CopyRect(DestRect, item.Image.Canvas, SrcRect);
end; end;
procedure TMvLCLDrawingEngine.Ellipse(X1, Y1, X2, Y2: Integer); procedure TMvLCLDrawingEngine.Ellipse(X1, Y1, X2, Y2: Integer);
@ -112,6 +184,20 @@ begin
FBuffer.Canvas.Ellipse(X1,Y1, X2, Y2); FBuffer.Canvas.Ellipse(X1,Y1, X2, Y2);
end; end;
procedure TMvLCLDrawingEngine.FillPixels(X1, Y1, X2, Y2: Integer; AColor: TColor);
begin
if (X1 >= FBuffer.Width) or (X2 < 0) or (Y1 >= FBuffer.Height) or (Y2 < 0) then
exit;
if X1 < 0 then X1 := 0;
if Y1 < 0 then Y1 := 0;
if X2 >= FBuffer.Width then X2 := FBuffer.Width - 1;
if Y2 >= FBuffer.Height then Y2 := FBuffer.Height - 1;
FBuffer.Canvas.Brush.Color := AColor;
FBuffer.Canvas.FillRect(X1, Y1, X2, Y2);
end;
procedure TMvLCLDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer); procedure TMvLCLDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
begin begin
FBuffer.Canvas.FillRect(X1,Y1, X2, Y2); FBuffer.Canvas.FillRect(X1,Y1, X2, Y2);
@ -127,6 +213,11 @@ begin
Result := FBuffer.Canvas.Brush.Style Result := FBuffer.Canvas.Brush.Style
end; end;
function TMvLCLDrawingEngine.GetCacheItemClass: TPictureCacheItemClass;
begin
Result := TLCLCacheItem;
end;
function TMvLCLDrawingEngine.GetFontColor: TColor; function TMvLCLDrawingEngine.GetFontColor: TColor;
begin begin
Result := FBuffer.Canvas.Font.Color Result := FBuffer.Canvas.Font.Color
@ -178,9 +269,9 @@ begin
FBuffer.Canvas.PolyBezier(Points, Filled, Continuous); FBuffer.Canvas.PolyBezier(Points, Filled, Continuous);
end; end;
procedure TMvLCLDrawingEngine.PaintToCanvas(ACanvas: TCanvas); procedure TMvLCLDrawingEngine.PaintToCanvas(ACanvas: TCanvas; Origin: TPoint);
begin begin
ACanvas.Draw(0, 0, FBuffer); ACanvas.Draw(Origin.X, Origin.Y, FBuffer);
end; end;
procedure TMvLCLDrawingEngine.Rectangle(X1, Y1, X2, Y2: Integer); procedure TMvLCLDrawingEngine.Rectangle(X1, Y1, X2, Y2: Integer);