LazMapViewer: Initial version of a LCL drawing engine. Still buggy. Extend demo project to allow selection of drawing engines.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6924 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
330ea06238
commit
0418e4b8d4
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@ interface
|
||||
uses
|
||||
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs,
|
||||
ExtCtrls, StdCtrls, ComCtrls, Buttons,
|
||||
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine;
|
||||
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine, mvDE_LCL;
|
||||
|
||||
type
|
||||
|
||||
@ -27,15 +27,19 @@ type
|
||||
CbMouseCoords: TGroupBox;
|
||||
CbDistanceUnits: TComboBox;
|
||||
CbDebugTiles: TCheckBox;
|
||||
CbDrawingEngine: TComboBox;
|
||||
GbCenterCoords: TGroupBox;
|
||||
GbScreenSize: TGroupBox;
|
||||
GbSearch: TGroupBox;
|
||||
GbGPS: TGroupBox;
|
||||
InfoCenterLatitude: TLabel;
|
||||
InfoViewportHeight: TLabel;
|
||||
InfoCenterLongitude: TLabel;
|
||||
InfoBtnGPSPoints: TLabel;
|
||||
GPSPointInfo: TLabel;
|
||||
InfoViewportWidth: TLabel;
|
||||
Label8: TLabel;
|
||||
Label1: TLabel;
|
||||
LblSelectLocation: TLabel;
|
||||
LblCenterLatitude: TLabel;
|
||||
LblViewportHeight: TLabel;
|
||||
LblViewportWidth: TLabel;
|
||||
@ -48,10 +52,12 @@ type
|
||||
LblZoom: TLabel;
|
||||
MapView: TMapView;
|
||||
GeoNames: TMVGeoNames;
|
||||
ControlPanel: TPanel;
|
||||
BtnLoadMapProviders: TSpeedButton;
|
||||
BtnSaveMapProviders: TSpeedButton;
|
||||
OpenDialog: TOpenDialog;
|
||||
PageControl: TPageControl;
|
||||
PgData: TTabSheet;
|
||||
PgConfig: TTabSheet;
|
||||
ZoomTrackBar: TTrackBar;
|
||||
procedure BtnGoToClick(Sender: TObject);
|
||||
procedure BtnLoadGPXFileClick(Sender: TObject);
|
||||
@ -59,6 +65,7 @@ type
|
||||
procedure BtnGPSPointsClick(Sender: TObject);
|
||||
procedure BtnSaveToFileClick(Sender: TObject);
|
||||
procedure CbDebugTilesChange(Sender: TObject);
|
||||
procedure CbDrawingEngineChange(Sender: TObject);
|
||||
procedure CbDoubleBufferChange(Sender: TObject);
|
||||
procedure CbFoundLocationsDrawItem(Control: TWinControl; Index: Integer;
|
||||
ARect: TRect; State: TOwnerDrawState);
|
||||
@ -84,6 +91,7 @@ type
|
||||
procedure ZoomTrackBarChange(Sender: TObject);
|
||||
|
||||
private
|
||||
FLCLDrawingEngine: TLCLDrawingEngine;
|
||||
procedure ClearFoundLocations;
|
||||
procedure UpdateCoords(X, Y: Integer);
|
||||
procedure UpdateDropdownWidth(ACombobox: TCombobox);
|
||||
@ -105,7 +113,7 @@ implementation
|
||||
|
||||
uses
|
||||
LCLType, IniFiles, Math, FPCanvas, FPImage, IntfGraphics,
|
||||
mvEngine, mvExtraData, mvGPX,
|
||||
mvEngine, mvGPX,
|
||||
globals, gpslistform;
|
||||
|
||||
type
|
||||
@ -226,6 +234,17 @@ begin
|
||||
MapView.DebugTiles := CbDebugTiles.Checked;
|
||||
end;
|
||||
|
||||
procedure TMainForm.CbDrawingEngineChange(Sender: TObject);
|
||||
begin
|
||||
case CbDrawingEngine.ItemIndex of
|
||||
0: MapView.DrawingEngine := nil;
|
||||
1: begin
|
||||
if FLCLDrawingEngine = nil then FLCLDrawingEngine := TLCLDrawingEngine.Create(self);
|
||||
MapView.DrawingEngine := FLCLDrawingEngine;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMainForm.CbDoubleBufferChange(Sender: TObject);
|
||||
begin
|
||||
MapView.DoubleBuffered := CbDoubleBuffer.Checked;
|
||||
@ -296,10 +315,17 @@ begin
|
||||
CbProviders.ItemIndex := CbProviders.Items.Indexof(MapView.MapProvider);
|
||||
MapView.DoubleBuffered := true;
|
||||
MapView.Zoom := 1;
|
||||
ControlPanel.Caption := '';
|
||||
CbUseThreads.Checked := MapView.UseThreads;
|
||||
CbDoubleBuffer.Checked := MapView.DoubleBuffered;
|
||||
|
||||
InfoPositionLongitude.Caption := '';
|
||||
InfoPositionLatitude.Caption := '';
|
||||
InfoCenterLongitude.Caption := '';
|
||||
InfoCenterLatitude.Caption := '';
|
||||
InfoViewportWidth.Caption := '';
|
||||
InfoViewportHeight.Caption := '';
|
||||
GPSPointInfo.caption := '';
|
||||
|
||||
ReadFromIni;
|
||||
end;
|
||||
|
||||
@ -343,6 +369,7 @@ begin
|
||||
|
||||
// Draw the GPS point as a circle
|
||||
ADrawer.BrushColor := clRed;
|
||||
ADrawer.BrushStyle := bsSolid;
|
||||
ADrawer.Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R);
|
||||
|
||||
// Draw the caption of the GPS point
|
||||
|
@ -14,7 +14,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)."/>
|
||||
<License Value="GPL2 or later"/>
|
||||
<Files Count="17">
|
||||
<Files Count="18">
|
||||
<Item1>
|
||||
<Filename Value="source/mvcache.pas"/>
|
||||
<UnitName Value="mvCache"/>
|
||||
@ -74,16 +74,20 @@ This is a fork of MapViewer by ti_dic (https://sourceforge.net/p/roadbook/code/c
|
||||
</Item14>
|
||||
<Item15>
|
||||
<Filename Value="source/mvgpx.pas"/>
|
||||
<UnitName Value="mvgpx"/>
|
||||
<UnitName Value="mvGPX"/>
|
||||
</Item15>
|
||||
<Item16>
|
||||
<Filename Value="source/mvdrawingengine.pas"/>
|
||||
<UnitName Value="mvdrawingengine"/>
|
||||
<UnitName Value="mvDrawingEngine"/>
|
||||
</Item16>
|
||||
<Item17>
|
||||
<Filename Value="source/mvdeintfgraphics.pas"/>
|
||||
<UnitName Value="mvdeintfgraphics"/>
|
||||
<Filename Value="source/mvde_intfgraphics.pas"/>
|
||||
<UnitName Value="mvde_intfgraphics"/>
|
||||
</Item17>
|
||||
<Item18>
|
||||
<Filename Value="source/mvde_lcl.pas"/>
|
||||
<UnitName Value="mvde_lcl"/>
|
||||
</Item18>
|
||||
</Files>
|
||||
<RequiredPkgs Count="1">
|
||||
<Item1>
|
||||
|
@ -10,8 +10,8 @@ interface
|
||||
uses
|
||||
mvCache, mvDownloadEngine, mvDragObj, mvEngine, mvGeoNames, mvGpsObj,
|
||||
mvJobQueue, mvJobs, mvMapProvider, mvTypes, mvMapViewer, mvExtraData,
|
||||
mvDLEFpc, mvMapViewerReg, mvGPX, mvDrawingEngine, mvDEIntfGraphics,
|
||||
LazarusPackageIntf;
|
||||
mvDLEFpc, mvMapViewerReg, mvGPX, mvDrawingEngine, mvDE_IntfGraphics,
|
||||
mvDE_LCL, LazarusPackageIntf;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -20,21 +20,11 @@
|
||||
unit mvMapViewer;
|
||||
|
||||
{$MODE objfpc}{$H+}
|
||||
(*
|
||||
// Activate one of the following defines
|
||||
{$DEFINE USE_LAZINTFIMAGE}
|
||||
{.$DEFINE USE_RGBGRAPHICS} // NOTE: This needs package "rgb_graphics" in requirements
|
||||
|
||||
// Make sure that one of the USE_XXXX defines is active. Default is USE_LAZINTFIMAGE
|
||||
{$IFNDEF USE_RGBGRAPHICS}{$IFNDEF USE_LAZINTFIMAGE}{$DEFINE USE_LAZINTFIMAGES}{$ENDIF}{$ENDIF}
|
||||
{$IFDEF USE_RGBGRAPHICS}{$IFDEF USE_LAZINTFIMAGE}{$UNDEF USE_RGBGRAPHICS}{$ENDIF}{$ENDIF}
|
||||
*)
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Controls, Graphics, IntfGraphics,
|
||||
// {$IFDEF USE_RGBGRAPHICS}RGBGraphics,{$ENDIF}
|
||||
// {$IFDEF USE_LAZINTFIMAGE}FPCanvas,{$ENDIF}
|
||||
MvTypes, MvGPSObj, MvEngine, MvMapProvider, MvDownloadEngine, MvDrawingEngine;
|
||||
|
||||
Type
|
||||
@ -104,12 +94,6 @@ Type
|
||||
protected
|
||||
AsyncInvalidate : boolean;
|
||||
procedure ActivateEngine;
|
||||
(*
|
||||
{$IFDEF USE_LAZINTFIMAGE}
|
||||
procedure CreateLazIntfImageAndCanvas(out ABuffer: TLazIntfImage;
|
||||
out ACanvas: TFPCustomCanvas; AWidth, AHeight: Integer);
|
||||
{$ENDIF}
|
||||
*)
|
||||
procedure DblClick; override;
|
||||
procedure DoDrawTile(const TileId: TTileId; X,Y: integer; TileImg: TLazIntfImage);
|
||||
procedure DoDrawTileInfo(const TileID: TTileID; X,Y: Integer);
|
||||
@ -176,65 +160,7 @@ Type
|
||||
implementation
|
||||
|
||||
uses
|
||||
{$IFDEF USE_LAZINTFIMAGE}
|
||||
Math, FPImgCanv, FPImage, LCLVersion,
|
||||
{$ENDIF}
|
||||
GraphType, mvJobQueue, mvExtraData, mvDLEFpc, mvDEIntfGraphics;
|
||||
|
||||
(*
|
||||
{$IFDEF USE_LAZINTFIMAGE}
|
||||
// Workaround for http://mantis.freepascal.org/view.php?id=27144
|
||||
procedure CopyPixels(ASource, ADest: TLazIntfImage;
|
||||
XDst: Integer = 0; YDst: Integer = 0;
|
||||
AlphaMask: Boolean = False; AlphaTreshold: Word = 0);
|
||||
var
|
||||
SrcHasMask, DstHasMask: Boolean;
|
||||
x, y, xStart, yStart, xStop, yStop: Integer;
|
||||
c: TFPColor;
|
||||
SrcRawImage, DestRawImage: TRawImage;
|
||||
begin
|
||||
ASource.GetRawImage(SrcRawImage);
|
||||
ADest.GetRawImage(DestRawImage);
|
||||
|
||||
if DestRawImage.Description.IsEqual(SrcRawImage.Description) and (XDst = 0) and (YDst = 0) then
|
||||
begin
|
||||
// same description -> copy
|
||||
if DestRawImage.Data <> nil then
|
||||
System.Move(SrcRawImage.Data^, DestRawImage.Data^, DestRawImage.DataSize);
|
||||
if DestRawImage.Mask <> nil then
|
||||
System.Move(SrcRawImage.Mask^, DestRawImage.Mask^, DestRawImage.MaskSize);
|
||||
Exit;
|
||||
end;
|
||||
|
||||
// copy pixels
|
||||
XStart := IfThen(XDst < 0, -XDst, 0);
|
||||
YStart := IfThen(YDst < 0, -YDst, 0);
|
||||
XStop := IfThen(ADest.Width - XDst < ASource.Width, ADest.Width - XDst, ASource.Width) - 1;
|
||||
YStop := IfTHen(ADest.Height - YDst < ASource.Height, ADest.Height - YDst, ASource.Height) - 1;
|
||||
|
||||
SrcHasMask := SrcRawImage.Description.MaskBitsPerPixel > 0;
|
||||
DstHasMask := DestRawImage.Description.MaskBitsPerPixel > 0;
|
||||
|
||||
if DstHasMask then begin
|
||||
for y:= yStart to yStop do
|
||||
for x:=xStart to xStop do
|
||||
ADest.Masked[x+XDst,y+YDst] := SrcHasMask and ASource.Masked[x,y];
|
||||
end;
|
||||
|
||||
for y:=yStart to yStop do
|
||||
for x:=xStart to xStop do
|
||||
begin
|
||||
c := ASource.Colors[x,y];
|
||||
if not DstHasMask and SrcHasMask and (c.alpha = $FFFF) then // copy mask to alpha channel
|
||||
if ASource.Masked[x,y] then
|
||||
c.alpha := 0;
|
||||
|
||||
ADest.Colors[x+XDst,y+YDst] := c;
|
||||
if AlphaMask and (c.alpha < AlphaTreshold) then
|
||||
ADest.Masked[x+XDst,y+YDst] := True;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF} *)
|
||||
GraphType, mvJobQueue, mvExtraData, mvDLEFpc, mvDE_IntfGraphics;
|
||||
|
||||
Type
|
||||
|
||||
@ -462,6 +388,7 @@ begin
|
||||
FBuiltinDrawingEngine.CreateBuffer(0, 0);
|
||||
FDrawingEngine.CreateBuffer(ClientWidth, ClientHeight);
|
||||
end;
|
||||
Engine.Redraw;
|
||||
end;
|
||||
|
||||
procedure TMapView.SetInactiveColor(AValue: TColor);
|
||||
@ -822,6 +749,7 @@ begin
|
||||
end
|
||||
else begin
|
||||
DrawingEngine.BrushColor := clWhite;
|
||||
DrawingEngine.BrushStyle := bsSolid;
|
||||
DrawingEngine.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
(*
|
||||
{$IFDEF USE_RGBGRAPHICS}
|
||||
@ -849,28 +777,6 @@ begin
|
||||
DrawingEngine.Line(X, Y, X + TILE_SIZE, Y);
|
||||
DrawingEngine.Line(X + TILE_SIZE, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
DrawingEngine.Line(X, Y + TILE_SIZE, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
(*
|
||||
{$IFDEF USE_LCL}
|
||||
Buffer.Canvas.Pen.Color := clGray;
|
||||
Buffer.Canvas.Pen.Style := psSolid;
|
||||
Buffer.Canvas.Line(X, Y, X, Y + TILE_SIZE);
|
||||
Buffer.Canvas.Line(X, Y, X + TILE_SIZE, Y);
|
||||
Buffer.Canvas.Line(X + TILE_SIZE, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
Buffer.Canvas.Line(X + TILE_SIZE, Y + TILE_SIZE, X, Y + TILE_SIZE);
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF USE_RGBGRAPHICS}
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF USE_LAZINTFIMAGE}
|
||||
BufferCanvas.Pen.FPColor := colGray;
|
||||
BufferCanvas.Pen.Style := psSolid;
|
||||
BufferCanvas.Line(X, Y, X, Y + TILE_SIZE);
|
||||
BufferCanvas.Line(X, Y, X + TILE_SIZE, Y);
|
||||
BufferCanvas.Line(X + TILE_SIZE, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
BufferCanvas.Line(X, Y + TILE_SIZE, X + TILE_SIZE, Y + TILE_SIZE);
|
||||
{$ENDIF}
|
||||
*)
|
||||
end;
|
||||
|
||||
function TMapView.IsActive: Boolean;
|
||||
@ -889,7 +795,7 @@ begin
|
||||
FInactiveColor := clWhite;
|
||||
FEngine := TMapViewerEngine.Create(self);
|
||||
FBuiltinDownloadEngine := TMvDEFpc.Create(self);
|
||||
FBuiltinDownLoadEngine.Name := 'BuiltIn';
|
||||
FBuiltinDownloadEngine.Name := 'BuiltInDLE';
|
||||
FDefaultTrackColor := clRed;
|
||||
FDefaultTrackWidth := 1;
|
||||
(*
|
||||
@ -909,6 +815,7 @@ begin
|
||||
Width := 150;
|
||||
Height := 150;
|
||||
FBuiltinDrawingEngine := TIntfGraphicsDrawingEngine.Create(self);
|
||||
FBuiltinDrawingEngine.Name := 'BuiltInDE';
|
||||
FbuiltinDrawingEngine.CreateBuffer(Width, Height);
|
||||
end;
|
||||
|
||||
@ -924,26 +831,6 @@ begin
|
||||
FreeAndNil(FGPSItems);
|
||||
inherited Destroy;
|
||||
end;
|
||||
(*
|
||||
{$IFDEF USE_LAZINTFIMAGE}
|
||||
procedure TMapView.CreateLazIntfImageAndCanvas(out ABuffer: TLazIntfImage;
|
||||
out ACanvas: TFPCustomCanvas; AWidth, AHeight: Integer);
|
||||
var
|
||||
rawImg: TRawImage;
|
||||
begin
|
||||
rawImg.Init;
|
||||
{$IFDEF DARWIN}
|
||||
rawImg.Description.Init_BPP32_A8R8G8B8_BIO_TTB(AWidth, AHeight);
|
||||
{$ELSE}
|
||||
rawImg.Description.Init_BPP32_B8G8R8_BIO_TTB(AWidth, AHeight);
|
||||
{$ENDIF}
|
||||
rawImg.CreateData(True);
|
||||
ABuffer := TLazIntfImage.Create(rawImg, true);
|
||||
ACanvas := TFPImageCanvas.Create(ABuffer);
|
||||
ACanvas.Brush.FPColor := colWhite;
|
||||
ACanvas.FillRect(0, 0, AWidth, AHeight);
|
||||
end;
|
||||
{$ENDIF} *)
|
||||
|
||||
procedure TMapView.SaveToFile(AClass: TRasterImageClass; const AFileName: String);
|
||||
var
|
||||
|
Loading…
Reference in New Issue
Block a user