LazMapViewer: Introduce fast FillPixels as new drawingengine method in order to avoid using the blank tile image.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8834 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
834d895879
commit
d9eb6e9065
@ -58,6 +58,7 @@ type
|
|||||||
UseAlphaChannel: Boolean); override;
|
UseAlphaChannel: Boolean); override;
|
||||||
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); override;
|
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); 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 PaintToCanvas(ACanvas: TCanvas); override;
|
procedure PaintToCanvas(ACanvas: TCanvas); override;
|
||||||
@ -142,6 +143,17 @@ begin
|
|||||||
FBuffer.CanvasBGRA.Ellipse(X1, Y1, X2, Y2);
|
FBuffer.CanvasBGRA.Ellipse(X1, Y1, X2, Y2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMvBGRADrawingEngine.FillPixels(X1, Y1, X2, Y2: Integer;
|
||||||
|
AColor: TColor);
|
||||||
|
var
|
||||||
|
savedColor: TColor;
|
||||||
|
begin
|
||||||
|
savedColor := FBuffer.CanvasBGRA.Brush.Color;
|
||||||
|
FBuffer.CanvasBGRA.Brush.Color := AColor;
|
||||||
|
FillRect(X1, Y1, X2, Y2);
|
||||||
|
FBuffer.CanvasBGRA.Brush.Color := savedColor;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMvBGRADrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
procedure TMvBGRADrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
||||||
begin
|
begin
|
||||||
FBuffer.CanvasBGRA.FillRect(X1, Y1, X2, Y2);
|
FBuffer.CanvasBGRA.FillRect(X1, Y1, X2, Y2);
|
||||||
|
@ -58,6 +58,7 @@ type
|
|||||||
UseAlphaChannel: Boolean); override;
|
UseAlphaChannel: Boolean); override;
|
||||||
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); override;
|
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); 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 PaintToCanvas(ACanvas: TCanvas); override;
|
procedure PaintToCanvas(ACanvas: TCanvas); override;
|
||||||
@ -152,6 +153,24 @@ begin
|
|||||||
FBuffer.Canvas.Ellipse(X1, Y1, X2, Y2);
|
FBuffer.Canvas.Ellipse(X1, Y1, X2, Y2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMvRGBGraphicsDrawingEngine.FillPixels(X1, Y1, X2, Y2: Integer;
|
||||||
|
AColor: TColor);
|
||||||
|
var
|
||||||
|
x, y: Integer;
|
||||||
|
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;
|
||||||
|
|
||||||
|
for y := Y1 to Y2 do
|
||||||
|
for x := X1 to X2 do
|
||||||
|
FBuffer.Set32Pixel(x, y, AColor);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMvRGBGraphicsDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
procedure TMvRGBGraphicsDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
||||||
begin
|
begin
|
||||||
FBuffer.Canvas.FillRect(X1, Y1, X2, Y2);
|
FBuffer.Canvas.FillRect(X1, Y1, X2, Y2);
|
||||||
|
@ -55,6 +55,7 @@ type
|
|||||||
UseAlphaChannel: Boolean); override;
|
UseAlphaChannel: Boolean); override;
|
||||||
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); override;
|
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); 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 PaintToCanvas(ACanvas: TCanvas); override;
|
procedure PaintToCanvas(ACanvas: TCanvas); override;
|
||||||
@ -228,6 +229,26 @@ begin
|
|||||||
FCanvas.Ellipse(X1,Y1, X2, Y2);
|
FCanvas.Ellipse(X1,Y1, X2, Y2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMvIntfGraphicsDrawingEngine.FillPixels(X1, Y1, X2, Y2: Integer;
|
||||||
|
AColor: TColor);
|
||||||
|
var
|
||||||
|
c: TFPColor;
|
||||||
|
x, y: Integer;
|
||||||
|
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;
|
||||||
|
|
||||||
|
c := TColorToFPColor(ColorToRGB(AColor));
|
||||||
|
for y := Y1 to Y2 do
|
||||||
|
for x := X1 to X2 do
|
||||||
|
FBuffer.Colors[x, y] := c;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMvIntfGraphicsDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
procedure TMvIntfGraphicsDrawingEngine.FillRect(X1, Y1, X2, Y2: Integer);
|
||||||
begin
|
begin
|
||||||
if FCanvas <> nil then
|
if FCanvas <> nil then
|
||||||
|
@ -44,6 +44,7 @@ type
|
|||||||
UseAlphaChannel: Boolean); virtual; abstract;
|
UseAlphaChannel: Boolean); virtual; abstract;
|
||||||
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); virtual; abstract;
|
procedure DrawLazIntfImage(X, Y: Integer; AImg: TLazIntfImage); virtual; abstract;
|
||||||
procedure Ellipse(X1, Y1, X2, Y2: Integer); virtual; abstract;
|
procedure Ellipse(X1, Y1, X2, Y2: Integer); virtual; abstract;
|
||||||
|
procedure FillPixels(X1, Y1, X2, Y2: Integer; AColor: TColor); virtual; abstract;
|
||||||
procedure FillRect(X1, Y1, X2, Y2: Integer); virtual; abstract;
|
procedure FillRect(X1, Y1, X2, Y2: Integer); virtual; abstract;
|
||||||
procedure Line(X1, Y1, X2, Y2: Integer); virtual; virtual; abstract;
|
procedure Line(X1, Y1, X2, Y2: Integer); virtual; virtual; abstract;
|
||||||
procedure PaintToCanvas(ACanvas: TCanvas); virtual; abstract;
|
procedure PaintToCanvas(ACanvas: TCanvas); virtual; abstract;
|
||||||
|
@ -63,7 +63,6 @@ type
|
|||||||
FCyclic: Boolean;
|
FCyclic: Boolean;
|
||||||
FDownloadEngine: TMvCustomDownloadEngine;
|
FDownloadEngine: TMvCustomDownloadEngine;
|
||||||
FDrawTitleInGuiThread: boolean;
|
FDrawTitleInGuiThread: boolean;
|
||||||
FEmptyTileImg: TLazIntfImage;
|
|
||||||
FOnCenterMove: TNotifyEvent;
|
FOnCenterMove: TNotifyEvent;
|
||||||
FOnChange: TNotifyEvent;
|
FOnChange: TNotifyEvent;
|
||||||
FOnDrawTile: TDrawTileEvent;
|
FOnDrawTile: TDrawTileEvent;
|
||||||
@ -107,7 +106,6 @@ type
|
|||||||
function IsCurrentWin(const aWin: TMapWindow) : boolean;
|
function IsCurrentWin(const aWin: TMapWindow) : boolean;
|
||||||
protected
|
protected
|
||||||
procedure AdjustZoomCenter(var AWin: TMapWindow);
|
procedure AdjustZoomCenter(var AWin: TMapWindow);
|
||||||
function CreateBlankImg: TLazIntfImage;
|
|
||||||
procedure ConstraintZoom(var aWin: TMapWindow);
|
procedure ConstraintZoom(var aWin: TMapWindow);
|
||||||
function GetTileName(const Id: TTileId): String;
|
function GetTileName(const Id: TTileId): String;
|
||||||
procedure evDownload(Data: TObject; Job: TJob);
|
procedure evDownload(Data: TObject; Job: TJob);
|
||||||
@ -383,7 +381,6 @@ begin
|
|||||||
Cache := TPictureCache.Create(self);
|
Cache := TPictureCache.Create(self);
|
||||||
lstProvider := TStringList.Create;
|
lstProvider := TStringList.Create;
|
||||||
FBkColor := colWhite;
|
FBkColor := colWhite;
|
||||||
FEmptyTileImg := CreateBlankImg;
|
|
||||||
RegisterProviders;
|
RegisterProviders;
|
||||||
Queue := TJobQueue.Create(8);
|
Queue := TJobQueue.Create(8);
|
||||||
Queue.OnIdle := @Cache.CheckCacheSize;
|
Queue.OnIdle := @Cache.CheckCacheSize;
|
||||||
@ -402,7 +399,6 @@ begin
|
|||||||
FreeAndNil(lstProvider);
|
FreeAndNil(lstProvider);
|
||||||
FreeAndNil(Cache);
|
FreeAndNil(Cache);
|
||||||
FreeAndNil(Queue);
|
FreeAndNil(Queue);
|
||||||
FreeAndNil(FEmptyTileImg);
|
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -493,22 +489,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMapViewerEngine.CreateBlankImg: TLazIntfImage;
|
|
||||||
var
|
|
||||||
rawImg: TRawImage;
|
|
||||||
begin
|
|
||||||
rawImg.Init;
|
|
||||||
{$IFDEF DARWIN}
|
|
||||||
rawImg.Description.Init_BPP32_A8R8G8B8_BIO_TTB(TILE_SIZE, TILE_SIZE);
|
|
||||||
{$ELSE}
|
|
||||||
rawImg.Description.Init_BPP32_B8G8R8_BIO_TTB(TILE_SIZE, TILE_SIZE);
|
|
||||||
{$ENDIF}
|
|
||||||
rawImg.CreateData(True);
|
|
||||||
|
|
||||||
Result := TLazIntfImage.Create(rawImg, true);
|
|
||||||
Result.FillPixels(FBkColor);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ Returns true when the visible window crosses the date line, i.e. the longitudes
|
{ Returns true when the visible window crosses the date line, i.e. the longitudes
|
||||||
at the left of the window are > 0, and those at the right are < 0. }
|
at the left of the window are > 0, and those at the right are < 0. }
|
||||||
function TMapViewerEngine.CrossesDateline: Boolean;
|
function TMapViewerEngine.CrossesDateline: Boolean;
|
||||||
@ -1088,7 +1068,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
py := AWin.Y + Y * TILE_SIZE;
|
py := AWin.Y + Y * TILE_SIZE;
|
||||||
px := AWin.X + X * TILE_SIZE;
|
px := AWin.X + X * TILE_SIZE;
|
||||||
DrawTile(Tiles[iTile], px, py, FEmptyTileImg);
|
DrawTile(Tiles[iTile], px, py, nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if IsValidTile(AWin, Tiles[iTile]) then
|
if IsValidTile(AWin, Tiles[iTile]) then
|
||||||
@ -1279,7 +1259,6 @@ procedure TMapViewerEngine.SetBkColor(AValue: TFPColor);
|
|||||||
begin
|
begin
|
||||||
if FBkColor = AValue then Exit;
|
if FBkColor = AValue then Exit;
|
||||||
FBkColor := AValue;
|
FBkColor := AValue;
|
||||||
FEmptyTileImg.FillPixels(FBkColor);
|
|
||||||
Redraw(MapWin);
|
Redraw(MapWin);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -830,12 +830,15 @@ begin
|
|||||||
if Assigned(TileImg) then begin
|
if Assigned(TileImg) then begin
|
||||||
DrawingEngine.DrawLazIntfImage(X, Y, TileImg);
|
DrawingEngine.DrawLazIntfImage(X, Y, TileImg);
|
||||||
end
|
end
|
||||||
else begin
|
else
|
||||||
|
DrawingEngine.FillPixels(X, Y, X + TILE_SIZE, Y + TILE_SIZE, InactiveColor);
|
||||||
|
{
|
||||||
DrawingEngine.BrushColor := InactiveColor;
|
DrawingEngine.BrushColor := InactiveColor;
|
||||||
DrawingEngine.BrushStyle := bsSolid;
|
DrawingEngine.BrushStyle := bsSolid;
|
||||||
|
|
||||||
DrawingEngine.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
DrawingEngine.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE);
|
||||||
end;
|
end;
|
||||||
|
}
|
||||||
if FDebugTiles then
|
if FDebugTiles then
|
||||||
DoDrawTileInfo(TileID, X, Y);
|
DoDrawTileInfo(TileID, X, Y);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user