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:
parent
4f4248244a
commit
c13251c57d
@ -727,6 +727,7 @@ object MainForm: TMainForm
|
|||||||
'default'
|
'default'
|
||||||
'RGBGraphics'
|
'RGBGraphics'
|
||||||
'BGRABitmap'
|
'BGRABitmap'
|
||||||
|
'LCL'
|
||||||
)
|
)
|
||||||
Style = csDropDownList
|
Style = csDropDownList
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
|
@ -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;
|
||||||
|
@ -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">
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user