Стартовый пул

This commit is contained in:
2024-04-02 08:46:59 +03:00
parent fd57fffd3a
commit 3bb34d000b
5591 changed files with 3291734 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="grayscale"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="2">
<Item1 Name="Release" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="grayscale"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<RelocatableUnit Value="True"/>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="BGRABitmapPack"/>
</Item1>
</RequiredPackages>
<Units Count="1">
<Unit0>
<Filename Value="grayscale.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="grayscale"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<RelocatableUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,24 @@
library grayscale;
{$mode objfpc}{$H+}
uses
Classes, strings, BGRABitmap, BGRABitmapTypes;
procedure FilterName(s: pchar); cdecl;
begin
StrCopy(s, 'Grayscale');
end;
procedure ApplyFilter(BGRA: TBGRABitmap); cdecl;
begin
BGRA.InplaceGrayscale();
end;
exports
FilterName,
ApplyFilter;
begin
end.

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="invert"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="2">
<Item1 Name="Release" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="invert"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<RelocatableUnit Value="True"/>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="BGRABitmapPack"/>
</Item1>
</RequiredPackages>
<Units Count="1">
<Unit0>
<Filename Value="invert.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="invert"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<RelocatableUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,36 @@
library invert;
{$mode objfpc}{$H+}
uses
Classes, strings, BGRABitmap, BGRABitmapTypes;
procedure FilterName(s: pchar); cdecl;
begin
StrCopy(s, 'Invert');
end;
procedure ApplyFilter(BGRA: TBGRABitmap); cdecl;
var
i: integer;
p: PBGRAPixel;
begin
p := BGRA.Data;
for i := BGRA.NBPixels - 1 downto 0 do
begin
p^.red := not p^.red;
p^.green := not p^.green;
p^.blue := not p^.blue;
p^.alpha := p^.alpha;
Inc(p);
end;
end;
exports
FilterName,
ApplyFilter;
begin
end.

View File

@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="plugins"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="2">
<Item1 Name="Release" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="plugins"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="plugins.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="unit1.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Unit1"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="plugins"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program plugins;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,35 @@
object Form1: TForm1
Left = 470
Height = 240
Top = 181
Width = 320
Caption = 'Form1'
ClientHeight = 240
ClientWidth = 320
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.6.0.4'
object BGRAVirtualScreen1: TBGRAVirtualScreen
Left = 0
Height = 240
Top = 0
Width = 320
OnRedraw = BGRAVirtualScreen1Redraw
Align = alClient
Alignment = taLeftJustify
ClientHeight = 240
ClientWidth = 320
Color = clWhite
ParentColor = False
TabOrder = 0
object ComboBox1: TComboBox
Left = 8
Height = 28
Top = 8
Width = 100
ItemHeight = 20
OnSelect = ComboBox1Select
TabOrder = 0
end
end
end

View File

@@ -0,0 +1,112 @@
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, strings, Forms, Controls, Graphics, Dialogs, StdCtrls,
BGRABitmap, BGRABitmapTypes, BGRAVirtualScreen, dynlibs;
const
{$IFDEF WINDOWS}
LIBRARYEXT = '*.dll';
{$ENDIF}
{$IFDEF LINUX}
LIBRARYEXT = '*.so';
{$ENDIF}
{$IFDEF DARWIN}
LIBRARYEXT = '*.dylib';
{$ENDIF}
type
TFilterName = procedure(s: PChar); cdecl;
TApplyFilter = procedure(BGRA: TBGRABitmap); cdecl;
type
{ TForm1 }
TForm1 = class(TForm)
BGRAVirtualScreen1: TBGRAVirtualScreen;
ComboBox1: TComboBox;
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure ComboBox1Select(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
DLLnames: TStringList;
CurrentFilter: TApplyFilter;
dll: TLibHandle;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
Bitmap.Fill(BGRA(255, 0, 0));
if Assigned(CurrentFilter) then
CurrentFilter(Bitmap);
end;
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
if dll <> dynlibs.NilHandle then
if FreeLibrary(dll) then
dll := dynlibs.NilHandle;
dll := LoadLibrary(DLLnames[ComboBox1.ItemIndex]);
if dll <> dynlibs.NilHandle then
begin
CurrentFilter := TApplyFilter(GetProcAddress(dll, 'ApplyFilter'));
end;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
GetName: TFilterName;
s: PChar;
begin
DLLnames := FindAllFiles(ProgramDirectory, LIBRARYEXT, False);
for i := 0 to DLLnames.Count - 1 do
begin
DLLnames[i] := ExtractFileName(DLLnames[i]);
end;
s := stralloc(50);
for i := 0 to DLLnames.Count - 1 do
begin
dll := LoadLibrary(DLLnames[i]);
if dll <> dynlibs.NilHandle then
begin
GetName := TFilterName(GetProcAddress(dll, 'FilterName'));
if Assigned(GetName) then
begin
GetName(s);
ComboBox1.Items.Add(string(s));
end;
if FreeLibrary(dll) then
dll := dynlibs.NilHandle;
end;
end;
strdispose(s);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DLLnames.Free;
end;
end.

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="fading"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="fading"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerMessages>
<MsgFileName Value=""/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="fading.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="fading"/>
</Unit0>
<Unit1>
<Filename Value="unit1.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Unit1"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="fading"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerMessages>
<MsgFileName Value=""/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program fading;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,104 @@
object Form1: TForm1
Left = 353
Height = 240
Top = 169
Width = 501
Caption = 'Fading'
ClientHeight = 240
ClientWidth = 501
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.1'
object bgImage: TBGRAGraphicControl
Left = 15
Height = 108
Top = 16
Width = 185
OnRedraw = bgImageRedraw
Color = clWhite
ColorOpacity = 128
Alignment = taCenter
Caption = 'bgImage'
end
object cbFadingMode: TComboBox
Left = 208
Height = 23
Top = 16
Width = 180
ItemHeight = 15
OnChange = cbFadingModeChange
Style = csDropDownList
TabOrder = 0
end
object seFadingStep: TSpinEdit
Left = 208
Height = 23
Top = 45
Width = 114
MaxValue = 255
MinValue = 1
OnChange = seFadingStepChange
TabOrder = 1
Value = 5
end
object seTimerInterval: TSpinEdit
Left = 208
Height = 23
Top = 73
Width = 114
MaxValue = 1000
MinValue = 1
OnChange = seTimerIntervalChange
TabOrder = 2
Value = 16
end
object Label1: TLabel
Left = 336
Height = 15
Top = 49
Width = 62
Caption = 'Fading Step'
ParentColor = False
end
object Label2: TLabel
Left = 336
Height = 15
Top = 77
Width = 73
Caption = 'Timer Interval'
ParentColor = False
end
object Label3: TLabel
Left = 15
Height = 15
Top = 144
Width = 31
Caption = 'Alpha'
ParentColor = False
end
object seDuration: TSpinEdit
Left = 208
Height = 23
Top = 101
Width = 114
Increment = 100
MaxValue = 10000
OnChange = seDurationChange
TabOrder = 3
end
object Label4: TLabel
Left = 336
Height = 15
Top = 105
Width = 73
Caption = 'Duration (ms)'
ParentColor = False
end
object Timer1: TTimer
Interval = 33
OnTimer = Timer1Timer
left = 16
top = 16
end
end

View File

@@ -0,0 +1,149 @@
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, BGRAGraphicControl, BGRABitmap, BGRABitmapTypes, BCFilters, Spin, BCEffect;
type
{ TForm1 }
TForm1 = class(TForm)
bgImage: TBGRAGraphicControl;
cbFadingMode: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
seFadingStep: TSpinEdit;
seTimerInterval: TSpinEdit;
seDuration: TSpinEdit;
Timer1: TTimer;
procedure bgImageRedraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure cbFadingModeChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure seDurationChange(Sender: TObject);
procedure seFadingStepChange(Sender: TObject);
procedure seTimerIntervalChange(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
Fade: TFading;
{$ifdef Windows}
FadeForm: TFading;
{$endif}
Image: TBGRABitmap;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.bgImageRedraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
// set black background
Bitmap.Fill(BGRABlack);
// draw image with fading alpha
Bitmap.BlendImageOver(0, 0, Image, boLinearBlend, Fade.Alpha);
end;
procedure TForm1.cbFadingModeChange(Sender: TObject);
begin
// set fading mode
Fade.Mode := StrToTFadingMode(cbFadingMode.Caption);
// reset
Fade.Reset;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
{$ifdef Windows}
if (FadeForm.Alpha > 0) then
begin
FadeForm.Mode := fmFadeOut;
CanClose := False;
end
else
CanClose := True;
{$endif}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// add items to combo box
FadingModeStrList(cbFadingMode.Items);
// load step from spin edit
Fade.Step := seFadingStep.Value;
// load interval from spin edit
Timer1.Interval := seTimerInterval.Value;
// create test image
Image := TBGRABitmap.Create(bgImage.Width, bgImage.Height);
NoiseBWA(Image);
// fade form Windows
{$ifdef Windows}
Self.DoubleBuffered := True;
Self.AlphaBlend := True;
Self.AlphaBlendValue := 0;
FadeForm.Mode := fmFadeIn;
FadeForm.Duration := 300;
{$endif}
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// free test image
Image.Free;
end;
procedure TForm1.seDurationChange(Sender: TObject);
begin
Fade.Duration := seDuration.Value;
end;
procedure TForm1.seFadingStepChange(Sender: TObject);
begin
// set fading step
Fade.Step := seFadingStep.Value;
end;
procedure TForm1.seTimerIntervalChange(Sender: TObject);
begin
// change timer interval
Timer1.Interval := seTimerInterval.Value;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= false; //avoid freezing application
{ calculate fading // display alpha }
Label3.Caption := concat('FadingAlpha: ', IntToStr(Fade.Execute));
// update bitmap
bgImage.RedrawBitmap;
{$ifdef Windows}
if FadeForm.Mode <> fmSuspended then
Self.AlphaBlendValue := FadeForm.Execute;
if (FadeForm.Mode = fmSuspended) and (FadeForm.Alpha = 0) then
Close;
{$endif}
Timer1.Enabled:= true;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,624 @@
unit bgragame;
{$mode objfpc}{$H+}
interface
uses
Classes, Graphics, LCLType, BGRABitmap, BGRABitmapTypes,
SysUtils, Forms, Controls;
const
L1 = VK_LEFT;
R1 = VK_RIGHT;
U1 = VK_UP;
D1 = VK_DOWN;
L2 = VK_A;
R2 = VK_D;
U2 = VK_W;
D2 = VK_S;
type
TGameKey = (gkLeft, gkUp, gkRight, gkDown);
PGameMap = ^TGameMap;
TGameMap = record
mapGraphics: string;
mapProperty: string;
mapSolve: string;
mapPrevPos: string;
mapKeyChar: char;
mapSolidChar: char;
mapWidth: integer;
mapHeight: integer;
blockWidth: integer;
blockHeight: integer;
background: TBGRABitmap;
ballSphereMap: TBGRABitmap;
ballPosition,ballSpeed: TPointF;
ballPositionDefined: boolean;
mouseDown: boolean;
mousePos: TPointF;
mapKeysDown: set of TGameKey;
end;
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; redrawAll: boolean);
function ClickMapCell(var map: TGameMap; pos: TPoint): boolean;
procedure MouseDownMap(var map: TGameMap; pos: TPoint);
procedure MouseUpMap(var map: TGameMap; pos: TPoint);
function GetGameKey(var Key: word; invertLR, invertUD: boolean): TGameKey;
procedure KeyDownMap(var map: TGameMap; var Key: word);
procedure KeyUpMap(var map: TGameMap; var Key: word);
function KeyPressMapCell(var map: TGameMap; Key: TGameKey): boolean;
function KeyPressMapCell(var map: TGameMap; var Key: word): boolean;
function IsMapSolved(var map: TGameMap): boolean;
procedure ToggleFullScreen(Form: TForm; ARect: TRect);
procedure CenterControl(Control: TControl);
function CalculateAspectRatioH(const W1, H1, W2: integer): integer; //result H2
function CalculateAspectRatioW(const W1, H1, H2: integer): integer; //result W2
function CalculateDestRect(ImageW, ImageH, DestW, DestH: integer;
Stretch, Proportional, Center: boolean): TRect;
procedure HighDPI(FromDPI: integer);
procedure ScaleDPI(Control: TControl; FromDPI: integer);
procedure ScaleAspectRatio(Control: TControl; OriginalParentW, OriginalParentH: integer);
procedure ScaleAspectRatio(Control: TControl; DestW, DestH: integer;
Stretch, Proportional, Center: boolean);
implementation
uses BGRAGradients;
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; minx,miny,maxx,maxy: integer; fullbackground: boolean); forward;
procedure DrawBall(var map: TGameMap; bitmap: TBGRABitmap); forward;
procedure InvalidateMap(var map: TGameMap; ARect: TRect);
var minx,miny,maxx,maxy,xb,yb: integer;
begin
if map.blockWidth <> 0 then
minx := ARect.Left div map.blockWidth;
if map.blockWidth <> 0 then
maxx := (ARect.Right div map.blockWidth) +1;
if map.blockHeight <> 0 then
miny := ARect.top div map.blockHeight;
if map.blockHeight <> 0 then
maxy := (ARect.bottom div map.blockHeight) +1;
if miny < 0 then miny :=0;
if minx < 0 then minx := 0;
if maxx > map.mapWidth-1 then maxx := map.mapWidth-1;
if maxy > map.mapHeight-1 then maxy := map.mapHeight-1;
for yb := miny to maxy do
for xb := minx to maxx do
map.mapPrevPos[xb+yb*map.mapWidth+1] := '1';
end;
const acceleration = 0.01;
maxSpeed = 0.1;
procedure MoveBall(var map: TGameMap);
var speed: single;
ix,iy,nix,niy: integer;
dir: TPointF;
dirlen: single;
begin
if map.ballPositionDefined then
begin
if map.mouseDown then
begin
dir := map.mousePos-map.ballPosition;
dirlen := sqrt(dir*dir);
if dirlen > acceleration then dir *= acceleration/dirlen;
map.ballSpeed += dir;
end else
begin
if gkLeft in map.mapKeysDown then map.ballSpeed.x -= acceleration;
if gkRight in map.mapKeysDown then map.ballSpeed.x += acceleration;
if gkUp in map.mapKeysDown then map.ballSpeed.y -= acceleration;
if gkDown in map.mapKeysDown then map.ballSpeed.y += acceleration;
end;
speed := sqrt(map.ballSpeed*map.ballSpeed);
if speed > maxSpeed then map.ballSpeed *= maxSpeed/speed;
ix := round(map.ballPosition.x);
iy := round(map.ballPosition.y);
map.ballPosition += map.ballSpeed;
nix := round(map.ballPosition.x);
niy := round(map.ballPosition.y);
if nix > ix then
begin
if not KeyPressMapCell(map, gkRight) then
begin
map.ballPosition.X := ix+0.499;
map.ballSpeed.X := -abs(map.ballSpeed.X);
end;
end;
if nix < ix then
begin
if not KeyPressMapCell(map, gkLeft) then
begin
map.ballPosition.X := ix-0.499;
map.ballSpeed.X := abs(map.ballSpeed.X);
end;
end;
if niy > iy then
begin
if not KeyPressMapCell(map, gkDown) then
begin
map.ballPosition.y := iy+0.499;
map.ballSpeed.y := -abs(map.ballSpeed.y);
end;
end;
if niy < iy then
begin
if not KeyPressMapCell(map, gkUp) then
begin
map.ballPosition.y := iy-0.499;
map.ballSpeed.y := abs(map.ballSpeed.y);
end;
end;
end;
end;
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; redrawAll: boolean);
begin
MoveBall(map);
if redrawAll then
DrawMap(map,bitmap,0,0,map.mapWidth-1,map.mapHeight-1,true)
else
DrawMap(map,bitmap,0,0,map.mapWidth-1,map.mapHeight-1,false);
DrawBall(map, bitmap);
end;
procedure DrawBall(var map: TGameMap; bitmap: TBGRABitmap);
var phong: TPhongShading;
radius,xi,yi: integer;
r: TRect;
begin
if map.ballPositionDefined then
begin
phong := TPhongShading.Create;
phong.LightPosition := point(bitmap.Width div 2, bitmap.Height div 2);
radius := map.blockWidth;
if map.blockHeight < radius then radius := map.blockHeight;
radius := round(radius*0.3);
xi := round((map.ballPosition.X+0.5)*map.blockWidth);
yi := round((map.ballPosition.Y+0.5)*map.blockHeight);
r := rect(xi-radius,yi-radius,xi+radius+1,yi+radius+1);
if (map.ballSphereMap <> nil) and ((map.ballSphereMap.Width <> r.right-r.left) or (map.ballSphereMap.Height <> r.bottom-r.top)) then
FreeAndNil(map.ballSphereMap);
if map.ballSphereMap = nil then map.ballSphereMap := CreateSpherePreciseMap(r.right-r.left,r.bottom-r.top);
phong.Draw(bitmap,map.ballSphereMap,radius,r.left,r.top,CSSLightGray);
phong.Free;
InvalidateMap(map, rect(xi-radius,yi-radius,xi+radius+1,yi+radius+1));
end;
end;
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; minx,miny,maxx,maxy: integer; fullbackground: boolean);
var
n, nx, ny: integer;
r: TRect;
colorOscillation: single;
oldClip: TRect;
shouldRedraw: boolean;
begin
colorOscillation:= sin(frac(Now)*24*60*60 * 2*Pi)*0.5+0.5;
if minx < 0 then minx := 0;
if miny < 0 then miny := 0;
if maxx > map.mapWidth-1 then maxx := map.mapWidth-1;
if maxy > map.mapHeight-1 then maxy := map.mapHeight-1;
oldClip := bitmap.ClipRect;
bitmap.ClipRect := rect(map.blockWidth * minx, map.blockHeight * miny,
map.blockWidth * (maxx+1), map.blockHeight * (maxy+1));
if fullbackground then bitmap.PutImage(0, 0, map.background, dmSet);
if map.mapPrevPos = '' then
begin
setlength(map.mapPrevPos, map.mapWidth*map.mapHeight);
for n := 1 to length(map.mapPrevPos) do
map.mapPrevPos[n] := '0';
end;
r.Top := map.blockHeight * miny;
r.Bottom := r.Top + map.blockHeight;
for ny := miny to maxy do
begin
r.Left := map.blockWidth * minx;
r.Right := r.Left + map.blockWidth;
n := ny*map.mapWidth+minx+1;
for nx := minx to maxx do
begin
shouldRedraw:= (map.mapProperty[n] = map.mapKeyChar) or (map.mapGraphics[n] = 'X');
if fullbackground or shouldRedraw or (map.mapPrevPos[n] = '1') then
begin
if shouldRedraw then map.mapPrevPos[n] := '1' else map.mapPrevPos[n] := '0';
// begin to draw here
if not fullbackground then bitmap.PutImagePart(r.left, r.top, map.background, r, dmSet);
if map.mapProperty[n] = map.mapKeyChar then
begin
bitmap.Rectangle(r, BGRAPixelTransparent, BGRA(0, 255, 0, round(200*colorOscillation)),
dmDrawWithTransparency);
if not map.ballPositionDefined then
begin
map.ballPosition := pointF(nx,ny);
map.ballPositionDefined := true;
end;
end
else if map.mapProperty[n] = map.mapSolidChar then
bitmap.Rectangle(r, BGRAPixelTransparent, BGRA(0, 0, 0, 100),
dmDrawWithTransparency)
else
bitmap.Rectangle(r, BGRAPixelTransparent, BGRA(255, 255, 255, 200),
dmDrawWithTransparency);
if map.blockWidth > map.blockHeight then
bitmap.FontHeight := map.blockHeight
else
bitmap.FontHeight := map.blockWidth;
if map.mapGraphics[n] = 'X' then
bitmap.Rectangle(r, BGRAPixelTransparent, BGRA(255, 0, 0, round(200*colorOscillation)),
dmDrawWithTransparency);
// end to draw here
end;
Inc(n);
inc(r.Left,map.blockWidth);
inc(r.right,map.blockWidth);
end;
inc(r.top,map.blockHeight);
inc(r.bottom,map.blockHeight);
end;
bitmap.ClipRect := oldClip;
end;
function ClickMapCell(var map: TGameMap; pos: TPoint): boolean;
var
n, nx, ny: integer;
r: TRect;
begin
Result := False;
n := 1;
for ny := 0 to map.mapHeight - 1 do
begin
for nx := 0 to map.mapWidth - 1 do
begin
r.Left := map.blockWidth * nx;
r.Top := map.blockHeight * ny;
r.Right := r.Left + map.blockWidth;
r.Bottom := r.Top + map.blockHeight;
if (pos.x >= r.Left) and (pos.x <= r.Right) and (pos.y >= r.Top) and
(pos.y <= r.Bottom) then
begin
// begin here
// mapKeyChar is n
if (map.mapProperty[n] = map.mapKeyChar) then
exit;
// mapSolidChar is n
if (map.mapProperty[n] = map.mapSolidChar) then
exit;
// mapKeyChar is on the left, move to n
if (nx <> 0) then
if (map.mapProperty[n - 1] = map.mapKeyChar) then
begin
map.mapProperty[n - 1] := map.mapProperty[n];
map.mapProperty[n] := map.mapKeyChar;
end;
// mapKeyChar is on the right, move to n
if (nx <> map.mapWidth - 1) then
if (map.mapProperty[n + 1] = map.mapKeyChar) then
begin
map.mapProperty[n + 1] := map.mapProperty[n];
map.mapProperty[n] := map.mapKeyChar;
end;
// mapKeyChar is on top, move to n
if (map.mapProperty[n - map.mapWidth] = map.mapKeyChar) then
begin
map.mapProperty[n - map.mapWidth] := map.mapProperty[n];
map.mapProperty[n] := map.mapKeyChar;
end;
// mapKeyChar is on bottom, move to n
if (map.mapProperty[n + map.mapWidth] = map.mapKeyChar) then
begin
map.mapProperty[n + map.mapWidth] := map.mapProperty[n];
map.mapProperty[n] := map.mapKeyChar;
end;
// end here
Result := True;
exit;
end;
Inc(n);
end;
end;
end;
procedure MouseDownMap(var map: TGameMap; pos: TPoint);
begin
map.mouseDown := true;
map.mousePos := pointf(pos.x/map.blockWidth-0.5,pos.y/map.blockHeight-0.5);
end;
procedure MouseUpMap(var map: TGameMap; pos: TPoint);
begin
map.mouseDown := false;
map.mousePos := pointf(pos.x/map.blockWidth-0.5,pos.y/map.blockHeight-0.5);
end;
function GetGameKey(var Key: word; invertLR, invertUD: boolean): TGameKey;
begin
if (Key = L1) or (Key = L2) then
Result := gkLeft;
if (Key = R1) or (Key = R2) then
Result := gkRight;
if (Key = U1) or (Key = U2) then
Result := gkUp;
if (Key = D1) or (Key = D2) then
Result := gkDown;
if invertLR then
case Result of
gkLeft: Result := gkRight;
gkRight: Result := gkLeft;
end;
if invertUD then
case Result of
gkUp: Result := gkDown;
gkDown: Result := gkUp;
end;
end;
procedure KeyDownMap(var map: TGameMap; var Key: word);
begin
map.mapKeysDown := map.mapKeysDown + [GetGameKey(Key,false,false)];
end;
procedure KeyUpMap(var map: TGameMap; var Key: word);
begin
map.mapKeysDown := map.mapKeysDown - [GetGameKey(Key,false,false)];
end;
function KeyPressMapCell(var map: TGameMap; Key: TGameKey): boolean;
var
n, nx, ny: integer;
begin
Result := False;
n := 1;
for ny := 0 to map.mapHeight - 1 do
begin
for nx := 0 to map.mapWidth - 1 do
begin
if map.mapProperty[n] = map.mapKeyChar then
begin
// begin here
case Key of
gkLeft:
if (nx <> 0) and (map.mapProperty[n - 1] <> map.mapSolidChar) then
begin
map.mapProperty[n] := map.mapProperty[n - 1];
map.mapProperty[n - 1] := map.mapKeyChar;
Result := True;
end;
gkRight:
if (nx <> map.mapWidth - 1) and (map.mapProperty[n + 1] <>
map.mapSolidChar) then
begin
map.mapProperty[n] := map.mapProperty[n + 1];
map.mapProperty[n + 1] := map.mapKeyChar;
Result := True;
end;
gkUp:
if (ny <> 0) and (map.mapProperty[n - map.mapWidth] <> map.mapSolidChar) then
begin
map.mapProperty[n] := map.mapProperty[n - map.mapWidth];
map.mapProperty[n - map.mapWidth] := map.mapKeyChar;
Result := True;
end;
gkDown:
if (ny <> map.mapHeight - 1) and
(map.mapProperty[n + map.mapHeight] <> map.mapSolidChar) then
begin
map.mapProperty[n] := map.mapProperty[n + map.mapWidth];
map.mapProperty[n + map.mapWidth] := map.mapKeyChar;
Result := True;
end;
end;
// end here
if Result then
exit;
end;
Inc(n);
end;
end;
end;
function KeyPressMapCell(var map: TGameMap; var Key: word): boolean;
begin
Result := KeyPressMapCell(map, GetGameKey(Key, False, False));
if result then Key := 0;
end;
function IsMapSolved(var map: TGameMap): boolean;
begin
Result := map.mapProperty = map.mapSolve;
end;
procedure ToggleFullScreen(Form: TForm; ARect: TRect);
begin
Form.SetBounds(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
if Form.BorderStyle <> bsNone then
begin
Form.BorderStyle := bsNone;
Form.WindowState := wsMaximized;
end
else
begin
Form.BorderStyle := bsSizeable;
Form.WindowState := wsMaximized;
end;
end;
procedure CenterControl(Control: TControl);
begin
if not Control.HasParent then
Exit;
Control.SetBounds(
Round((Control.Parent.Width - Control.Width) div 2),
Round((Control.Parent.Height - Control.Height) div 2),
Control.Width, Control.Height);
end;
function CalculateAspectRatioH(const W1, H1, W2: integer): integer;
begin
Result := Round(H1 / W1 * W2);
end;
function CalculateAspectRatioW(const W1, H1, H2: integer): integer;
begin
Result := Round(W1 / H1 * H2);
end;
function CalculateDestRect(ImageW, ImageH, DestW, DestH: integer;
Stretch, Proportional, Center: boolean): TRect;
var
w: integer;
h: integer;
begin
// Stretch or Proportional when Image (Width or Height) is bigger than Destination
if Stretch or (Proportional and ((ImageW > DestW) or (ImageH > DestH))) then
begin
// Proportional when Image (Width or Height) is bigger than 0
if Proportional and (ImageW > 0) and (ImageH > 0) then
begin
w := DestW;
h := CalculateAspectRatioH(ImageW, ImageH, DestW);
if h > DestH then
begin
h := DestH;
w := CalculateAspectRatioW(ImageW, ImageH, DestH);
end;
ImageW := w;
ImageH := h;
end
// Stretch not Proportional or when Image (Width or Height) is 0
else
begin
ImageW := DestW;
ImageH := DestH;
end;
end;
Result := Rect(0, 0, ImageW, ImageH);
// Center: Destination (Width or Height) - Image divided by 2
if Center then
begin
Result.Left := Round((DestW - ImageW) div 2);
Result.Top := Round((DestH - ImageH) div 2);
end;
end;
procedure HighDPI(FromDPI: integer);
var
i: integer;
begin
if Screen.PixelsPerInch = FromDPI then
exit;
for i := 0 to Screen.FormCount - 1 do
ScaleDPI(Screen.Forms[i], FromDPI);
end;
procedure ScaleDPI(Control: TControl; FromDPI: integer);
var
i: integer;
WinControl: TWinControl;
begin
if Screen.PixelsPerInch = FromDPI then
exit;
with Control do
begin
Left := ScaleX(Left, FromDPI);
Top := ScaleY(Top, FromDPI);
Width := ScaleX(Width, FromDPI);
Height := ScaleY(Height, FromDPI);
end;
if Control is TWinControl then
begin
WinControl := TWinControl(Control);
if WinControl.ControlCount = 0 then
exit;
with WinControl.ChildSizing do
begin
HorizontalSpacing := ScaleX(HorizontalSpacing, FromDPI);
LeftRightSpacing := ScaleX(LeftRightSpacing, FromDPI);
TopBottomSpacing := ScaleY(TopBottomSpacing, FromDPI);
VerticalSpacing := ScaleY(VerticalSpacing, FromDPI);
end;
for i := 0 to WinControl.ControlCount - 1 do
ScaleDPI(WinControl.Controls[i], FromDPI);
end;
end;
procedure ScaleAspectRatio(Control: TControl; OriginalParentW, OriginalParentH: integer);
var
l, t, w, h: integer;
begin
l := MulDiv(Control.Left, Control.Parent.Width, OriginalParentW);
t := MulDiv(Control.Top, Control.Parent.Height, OriginalParentH);
w := MulDiv(Control.Width, Control.Parent.Width, OriginalParentW);
h := MulDiv(Control.Height, Control.Parent.Height, OriginalParentH);
Control.SetBounds(l, t, w, h);
end;
procedure ScaleAspectRatio(Control: TControl; DestW, DestH: integer;
Stretch, Proportional, Center: boolean);
var
i: integer;
r: TRect;
WinControl: TWinControl;
w, h: integer;
begin
if Control is TWinControl then
begin
WinControl := TWinControl(Control);
w := WinControl.Width;
h := WinControl.Height;
r := CalculateDestRect(WinControl.Width, WinControl.Height, DestW,
DestH, Stretch, Proportional, Center);
WinControl.SetBounds(r.Left, r.Top, r.Right, r.Bottom);
if WinControl.ControlCount = 0 then
exit;
for i := 0 to WinControl.ControlCount - 1 do
ScaleAspectRatio(WinControl.Controls[i], w, h);
end;
end;
end.

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="testbgragame"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="testbgragame"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<StripSymbols Value="True"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="3">
<Unit0>
<Filename Value="testbgragame.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="utestbgragame.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
<Unit2>
<Filename Value="bgragame.pas"/>
<IsPartOfProject Value="True"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="testbgragame"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<Optimizations>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<StripSymbols Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program testbgragame;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, utestbgragame, bgragame
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,35 @@
object Form1: TForm1
Left = 328
Height = 480
Top = 135
Width = 640
ClientHeight = 480
ClientWidth = 640
Color = clBlack
OnCreate = FormCreate
OnDestroy = FormDestroy
OnKeyDown = FormKeyDown
OnKeyUp = FormKeyUp
OnResize = FormResize
LCLVersion = '1.0.1.3'
object BGRAVirtualScreen1: TBGRAVirtualScreen
Left = 0
Height = 480
Top = 0
Width = 640
OnRedraw = BGRAVirtualScreen1Redraw
Alignment = taLeftJustify
Color = clWhite
ParentColor = False
TabOrder = 0
OnMouseDown = BGRAVirtualScreen1MouseDown
OnMouseMove = BGRAVirtualScreen1MouseMove
OnMouseUp = BGRAVirtualScreen1MouseUp
end
object Timer2: TTimer
Interval = 200
OnTimer = Timer2Timer
left = 24
top = 8
end
end

View File

@@ -0,0 +1,155 @@
unit utestbgragame;
{$mode objfpc}{$H+}
interface
uses
Classes, Forms, Controls, LCLType, ExtCtrls, BGRAVirtualScreen, BGRABitmap,
BGRABitmapTypes, Dialogs, bgragame;
type
{ TForm1 }
TForm1 = class(TForm)
BGRAVirtualScreen1: TBGRAVirtualScreen;
Timer2: TTimer;
procedure BGRAVirtualScreen1MouseDown(Sender: TObject;
Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: integer);
procedure BGRAVirtualScreen1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: integer);
procedure BGRAVirtualScreen1MouseUp(Sender: TObject; Button: TMouseButton;
{%H-}Shift: TShiftState; X, Y: Integer);
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: word; {%H-}Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ private declarations }
procedure UpdateVirtualScreen;
public
{ public declarations }
level1: TGameMap;
size: TRect;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
DrawMap(level1, bitmap, True);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Size := Rect(0, 0, 640, 480);
ToggleFullScreen(Self, Size);
level1.mapWidth := 20;
level1.mapHeight := 20;
level1.mapGraphics :=
'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000';
level1.mapProperty :=
'2222222222222222222220002020220200022022212022000020020000022020202022002202202220200000200202020002200202200020000220222200220022002020200220200020202220020022202022002002020002022200200000200022000220020200220020002022202220202002202000222000000020200020220222220222002020200002202020200200220220222200002020220000002220202020020222220002202020022000020002022000220000020002000222222222222222222222';
level1.mapSolve :=
'2222222222222222222220002020220200022022202022000020020000022020202022002202202220200000200202020002200202200020000220222200220022002020200220200020202220020022202022002002020002022200200000200022000220020200220020002022202220202002202000222000000020200020220222220222002020200002202020200200220220222200002020220000002221202020020222220002202020022000020002022000220000020002000222222222222222222222';
level1.mapKeyChar := '1'; // Player
level1.mapSolidChar := '2'; // Wall
level1.ballPositionDefined := false;
//see FormResize
Timer2.Interval:= 16;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
level1.background.Free;
level1.ballSphereMap.free;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
if (Key = VK_ESCAPE) then
Application.Terminate;
if (Key = VK_F11) then
ToggleFullScreen(Self, Size);
KeyDownMap(level1, Key);
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
KeyUpMap(level1, Key);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Size := Rect(0, 0, Width, Height);
ScaleAspectRatio(BGRAVirtualScreen1, Size.Right, Size.Bottom, True, True, True);
// this has scaling
level1.blockWidth := BGRAVirtualScreen1.Width div level1.mapWidth;
level1.blockHeight := BGRAVirtualScreen1.Height div level1.mapHeight;
// this has scaling
level1.background.Free;
level1.background := TBGRABitmap.Create('background.jpg');
BGRAReplace(level1.background, level1.background.Resample(BGRAVirtualScreen1.Width, BGRAVirtualScreen1.Height));
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:= false;
UpdateVirtualScreen;
if IsMapSolved(level1) then
begin
Timer2.Enabled := False;
ShowMessage('Win!');
Application.Terminate;
end;
Timer2.Enabled:= true;
end;
procedure TForm1.UpdateVirtualScreen;
begin
if Assigned(BGRAVirtualScreen1.Bitmap) then
begin
DrawMap(level1, BGRAVirtualScreen1.bitmap, false);
BGRAVirtualScreen1.Invalidate;
end;
end;
procedure TForm1.BGRAVirtualScreen1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: integer);
begin
if Button = mbLeft then
MouseDownMap(level1, Point(x, y));
end;
procedure TForm1.BGRAVirtualScreen1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: integer);
begin
if ssLeft in shift then
MouseDownMap(level1, Point(x, y));
end;
procedure TForm1.BGRAVirtualScreen1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
MouseUpMap(level1, Point(x, y));
end;
end.

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Puzzle!"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="puzzle"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="4">
<Unit0>
<Filename Value="maparray.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="unit1.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Unit1"/>
</Unit1>
<Unit2>
<Filename Value="ugraph.pas"/>
<IsPartOfProject Value="True"/>
</Unit2>
<Unit3>
<Filename Value="ugame.pas"/>
<IsPartOfProject Value="True"/>
</Unit3>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="puzzle"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program maparray;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, ugraph, ugame;
{$R *.res}
begin
Application.Title:='Puzzle!';
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Binary file not shown.

View File

@@ -0,0 +1,218 @@
unit ugame;
{$mode objfpc}{$H+}
interface
uses
{$IFDEF WINDOWS}Windows,{$ENDIF} Classes, SysUtils, Forms, Graphics, Controls, LCLType;
procedure ToggleFullScreen(Form: TForm; ARect: TRect);
procedure CenterControl(Control: TControl);
function CalculateAspectRatioH(const W1, H1, W2: integer): integer; //result H2
function CalculateAspectRatioW(const W1, H1, H2: integer): integer; //result W2
function CalculateDestRect(ImageW, ImageH, DestW, DestH: integer;
Stretch, Proportional, Center: boolean): TRect;
procedure HighDPI(FromDPI: integer);
procedure ScaleDPI(Control: TControl; FromDPI: integer);
procedure ScaleAspectRatio(Control: TControl; OriginalParentW, OriginalParentH: integer);
procedure ScaleAspectRatio(Control: TControl; DestW, DestH: integer;
Stretch, Proportional, Center: boolean);
{$IFDEF WINDOWS}
procedure SetScreenResolution(
const Width, Height: integer); overload;
procedure SetScreenResolution(const Width, Height, colorDepth: integer); overload;
{$ENDIF}
implementation
procedure ToggleFullScreen(Form: TForm; ARect: TRect);
begin
Form.SetBounds(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
if Form.BorderStyle <> bsNone then
begin
Form.BorderStyle := bsNone;
Form.WindowState := wsMaximized;
end
else
begin
Form.BorderStyle := bsDialog;
Form.WindowState := wsNormal;
end;
end;
procedure CenterControl(Control: TControl);
begin
if not Control.HasParent then
Exit;
Control.SetBounds(
Round((Control.Parent.Width - Control.Width) div 2),
Round((Control.Parent.Height - Control.Height) div 2),
Control.Width, Control.Height);
end;
function CalculateAspectRatioH(const W1, H1, W2: integer): integer;
begin
Result := Round(H1 / W1 * W2);
end;
function CalculateAspectRatioW(const W1, H1, H2: integer): integer;
begin
Result := Round(W1 / H1 * H2);
end;
function CalculateDestRect(ImageW, ImageH, DestW, DestH: integer;
Stretch, Proportional, Center: boolean): TRect;
var
w: integer;
h: integer;
begin
// Stretch or Proportional when Image (Width or Height) is bigger than Destination
if Stretch or (Proportional and ((ImageW > DestW) or (ImageH > DestH))) then
begin
// Proportional when Image (Width or Height) is bigger than 0
if Proportional and (ImageW > 0) and (ImageH > 0) then
begin
w := DestW;
h := CalculateAspectRatioH(ImageW, ImageH, DestW);
if h > DestH then
begin
h := DestH;
w := CalculateAspectRatioW(ImageW, ImageH, DestH);
end;
ImageW := w;
ImageH := h;
end
// Stretch not Proportional or when Image (Width or Height) is 0
else
begin
ImageW := DestW;
ImageH := DestH;
end;
end;
Result := Rect(0, 0, ImageW, ImageH);
// Center: Destination (Width or Height) - Image divided by 2
if Center then
begin
Result.Left := Round((DestW - ImageW) div 2);
Result.Top := Round((DestH - ImageH) div 2);
end;
end;
procedure HighDPI(FromDPI: integer);
var
i: integer;
begin
if Screen.PixelsPerInch = FromDPI then
exit;
for i := 0 to Screen.FormCount - 1 do
ScaleDPI(Screen.Forms[i], FromDPI);
end;
procedure ScaleDPI(Control: TControl; FromDPI: integer);
var
i: integer;
WinControl: TWinControl;
begin
if Screen.PixelsPerInch = FromDPI then
exit;
with Control do
begin
Left := ScaleX(Left, FromDPI);
Top := ScaleY(Top, FromDPI);
Width := ScaleX(Width, FromDPI);
Height := ScaleY(Height, FromDPI);
end;
if Control is TWinControl then
begin
WinControl := TWinControl(Control);
if WinControl.ControlCount = 0 then
exit;
with WinControl.ChildSizing do
begin
HorizontalSpacing := ScaleX(HorizontalSpacing, FromDPI);
LeftRightSpacing := ScaleX(LeftRightSpacing, FromDPI);
TopBottomSpacing := ScaleY(TopBottomSpacing, FromDPI);
VerticalSpacing := ScaleY(VerticalSpacing, FromDPI);
end;
for i := 0 to WinControl.ControlCount - 1 do
ScaleDPI(WinControl.Controls[i], FromDPI);
end;
end;
procedure ScaleAspectRatio(Control: TControl; OriginalParentW, OriginalParentH: integer);
var
l, t, w, h: integer;
begin
l := MulDiv(Control.Left, Control.Parent.Width, OriginalParentW);
t := MulDiv(Control.Top, Control.Parent.Height, OriginalParentH);
w := MulDiv(Control.Width, Control.Parent.Width, OriginalParentW);
h := MulDiv(Control.Height, Control.Parent.Height, OriginalParentH);
Control.SetBounds(l, t, w, h);
end;
procedure ScaleAspectRatio(Control: TControl; DestW, DestH: integer;
Stretch, Proportional, Center: boolean);
var
i: integer;
r: TRect;
WinControl: TWinControl;
w, h: integer;
begin
if Control is TWinControl then
begin
WinControl := TWinControl(Control);
w := WinControl.Width;
h := WinControl.Height;
r := CalculateDestRect(WinControl.Width, WinControl.Height, DestW,
DestH, Stretch, Proportional, Center);
WinControl.SetBounds(r.Left, r.Top, r.Right, r.Bottom);
if WinControl.ControlCount = 0 then
exit;
for i := 0 to WinControl.ControlCount - 1 do
ScaleAspectRatio(WinControl.Controls[i], w, h);
end;
end;
{$IFDEF WINDOWS}
procedure SetScreenResolution(
const Width, Height: integer); overload;
var
mode: TDevMode;
begin
zeroMemory(@mode, sizeof(TDevMode));
mode.dmSize := sizeof(TDevMode);
mode.dmPelsWidth := Width;
mode.dmPelsHeight := Height;
mode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
ChangeDisplaySettings(mode, 0);
end;
procedure SetScreenResolution(const Width, Height, colorDepth: integer); overload;
var
mode: TDevMode;
begin
zeroMemory(@mode, sizeof(TDevMode));
mode.dmSize := sizeof(TDevMode);
mode.dmPelsWidth := Width;
mode.dmPelsHeight := Height;
mode.dmBitsPerPel := colorDepth;
mode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
ChangeDisplaySettings(mode, 0);
end;
{$ENDIF}
end.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,35 @@
object Form1: TForm1
Left = 342
Height = 256
Top = 166
Width = 256
BorderStyle = bsDialog
Caption = 'Puzzle!'
ClientHeight = 256
ClientWidth = 256
Color = clBlack
OnCreate = FormCreate
OnDestroy = FormDestroy
OnKeyDown = FormKeyDown
OnResize = FormResize
Position = poDesktopCenter
LCLVersion = '1.1'
object BGRAVirtualScreen1: TBGRAVirtualScreen
Left = 0
Height = 256
Top = 0
Width = 256
OnRedraw = BGRAVirtualScreen1Redraw
Alignment = taLeftJustify
Color = clBlack
ParentColor = False
TabOrder = 0
OnClick = BGRAVirtualScreen1Click
end
object Timer1: TTimer
Interval = 100
OnTimer = Timer1Timer
left = 44
top = 34
end
end

View File

@@ -0,0 +1,734 @@
{ Puzzle! is a puzzle game using BGRABitmap
originally written in 2012 by lainz http://sourceforge.net/users/lainz
Thanks to circular and eny from the Lazarus forum for their contributions.
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes, ugame, LCLType,
ExtCtrls{$IFDEF WINDOWS},
mmsystem{$ENDIF};
const
// controls
L1 = VK_LEFT;
R1 = VK_RIGHT;
U1 = VK_UP;
D1 = VK_DOWN;
L2 = VK_A;
R2 = VK_D;
U2 = VK_W;
D2 = VK_S;
type
TArrayOfString = array of string;
TGameKey = (gkLeft, gkUp, gkRight, gkDown);
PGameMap = ^TGameMap;
TGameMap = record
map, solve: string;
mapW: integer;
mapH: integer;
blockW: integer;
blockH: integer;
background: TBGRABitmap;
end;
var
Game: array [1..12] of TGameMap;
GameOver: TGameMap = (map: 'Game-Over'; solve: 'GameOver-'; mapW: 3;
mapH: 3; blockW: 85; blockH: 85; background: nil);
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; texture: TBGRABitmap);
function ClickMap(var map: TGameMap; pos: TPoint): boolean;
function KeyPressMap(var map: TGameMap; var Key: word): boolean;
function IsMapSolved(var map: TGameMap): boolean;
function CalcularPosibles(str: string; showDebug: boolean = False): TarrayOfString;
type
{ TForm1 }
TForm1 = class(TForm)
BGRAVirtualScreen1: TBGRAVirtualScreen;
Timer1: TTimer;
procedure BGRAVirtualScreen1Click(Sender: TObject);
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
Size: TRect;
map: PGameMap;
current: integer;
texture: TBGRABitmap;
procedure OpenMap(num: integer);
procedure CloseMap;
procedure ScaleBlocks;
procedure GenerateTexture;
procedure PlayBlockSound;
end;
var
Form1: TForm1;
implementation
uses BGRAGradients, ugraph;
{ DRAWMAP }
procedure DrawMap(var map: TGameMap; bitmap: TBGRABitmap; texture: TBGRABitmap);
var
r: TRect;
n, n1, n2: integer;
phong: TPhongShading;
tile3D, empty3D: TBGRABitmap;
h: integer;
begin
if (bitmap = nil) or (texture = nil) then
exit;
phong := TPhongShading.Create;
if map.background = nil then
begin
map.background := TBGRABitmap.Create(map.BlockW * map.mapW, map.BlockH * map.mapH);
empty3D := TBGRABitmap.Create(texture.Width, texture.Height, BGRABlack);
for n1 := 1 to (map.background.Width + texture.Width - 1) div texture.Width do
for n2 := 1 to (map.background.Height + texture.Height - 1) div texture.Height do
phong.Draw(map.background, empty3D, 0, (n1 - 1) * texture.Width,
(n2 - 1) * texture.Height, texture);
empty3D.Free;
end;
h := (map.blockW + map.blockH) div 16;
tile3D := CreateRectanglePreciseMap(map.BlockW, map.BlockH, h, []);
bitmap.PutImage(0, 0, map.background, dmDrawWithTransparency);
n1 := 0;
n2 := 0;
for n := 1 to length(map.map) do
begin
r.Left := map.blockW * n1;
r.Top := map.blockH * n2;
r.Right := r.Left + map.blockW;
r.Bottom := r.Top + map.blockH;
// begin to draw here //
if map.map[n] <> '0' then
begin
phong.Draw(bitmap, tile3D, h, r.left, r.top, texture);
if map.blockH > map.blockW then
bitmap.FontHeight := round(map.blockW * 0.75)
else
bitmap.FontHeight := round(map.blockH * 0.75);
bitmap.TextRect(Rect(r.Left + 10, r.Top + 10, r.Right, r.Bottom),
map.map[n], taCenter, tlCenter, BGRA(0, 0, 0, 175));
bitmap.TextRect(r, map.map[n], taCenter, tlCenter, BGRABlack);
end;
{
if map.map[n] = '0' then
begin
bitmap.FontHeight := map.blockH div 4;
if (n1 <> 0) then
bitmap.TextRect(r, '►', taLeftJustify, tlCenter, BGRA(192, 192, 192));
if (n1 <> map.mapW - 1) then
bitmap.TextRect(r, '◄', taRightJustify, tlCenter, BGRA(192, 192, 192));
if (n2 <> 0) then
bitmap.TextRect(r, '▼', taCenter, tlTop, BGRA(192, 192, 192));
if (n2 <> map.mapH - 1) then
bitmap.TextRect(r, '▲', taCenter, tlBottom, BGRA(192, 192, 192));
end;
}
// end to draw here //
if n1 = map.mapW - 1 then
begin
n1 := -1;
Inc(n2);
end;
Inc(n1);
end;
tile3D.Free;
phong.Free;
end;
function ClickMap(var map: TGameMap; pos: TPoint): boolean;
var
n, n1, n2: integer;
r: TRect;
begin
Result := False;
n1 := 0;
n2 := 0;
for n := 1 to length(map.map) do
begin
r.Left := map.blockW * n1;
r.Top := map.blockH * n2;
r.Right := r.Left + map.blockW;
r.Bottom := r.Top + map.blockH;
{ SCALING }
r.Left += Form1.BGRAVirtualScreen1.Left;
r.Top += Form1.BGRAVirtualScreen1.Top;
r.Right += Form1.BGRAVirtualScreen1.Left;
r.Bottom += Form1.BGRAVirtualScreen1.Top;
if (pos.x >= r.Left) and (pos.x <= r.Right) and (pos.y >= r.Top) and
(pos.y <= r.Bottom) then
begin
// vacio
if map.map[n] = '0' then
exit;
// el vacio esta a la izquierda
if (n1 <> 0) then
if map.map[n - 1] = '0' then
begin
map.map[n - 1] := map.map[n];
map.map[n] := '0';
end;
// el vacio esta a la derecha
if (n1 <> map.mapW - 1) then
if map.map[n + 1] = '0' then
begin
map.map[n + 1] := map.map[n];
map.map[n] := '0';
end;
// el vacio esta arriba
if map.map[n - map.mapW] = '0' then
begin
map.map[n - map.mapW] := map.map[n];
map.map[n] := '0';
end;
// el vacio esta abajo
if map.map[n + map.mapW] = '0' then
begin
map.map[n + map.mapW] := map.map[n];
map.map[n] := '0';
end;
Result := True;
exit;
end;
if n1 = map.mapW - 1 then
begin
n1 := -1;
Inc(n2);
end;
Inc(n1);
end;
end;
function KeyPressMap(var map: TGameMap; var Key: word): boolean;
function GetGameKey(var Key: word; invertLR, invertUD: boolean): TGameKey;
begin
if (Key = L1) or (Key = L2) then
Result := gkLeft;
if (Key = R1) or (Key = R2) then
Result := gkRight;
if (Key = U1) or (Key = U2) then
Result := gkUp;
if (Key = D1) or (Key = D2) then
Result := gkDown;
if invertLR then
case Result of
gkLeft: Result := gkRight;
gkRight: Result := gkLeft;
end;
if invertUD then
case Result of
gkUp: Result := gkDown;
gkDown: Result := gkUp;
end;
end;
var
n, n1, n2: integer;
begin
n1 := 0;
n2 := 0;
Result := False;
for n := 1 to length(map.map) do
begin
if map.map[n] = '0' then
begin
case GetGameKey(Key, True, True) of
gkLeft:
// el de la izquierda
if (n1 <> 0) then
begin
map.map[n] := map.map[n - 1];
map.map[n - 1] := '0';
Result := True;
Key := 0;
end;
gkRight:
// el de la derecha
if (n1 <> map.mapW - 1) then
begin
map.map[n] := map.map[n + 1];
map.map[n + 1] := '0';
Result := True;
Key := 0;
end;
gkUp:
// el de arriba
if (n2 <> 0) then
begin
map.map[n] := map.map[n - map.mapW];
map.map[n - map.mapW] := '0';
Result := True;
Key := 0;
end;
gkDown:
// el de abajo
if (n2 <> map.mapH - 1) then
begin
map.map[n] := map.map[n + map.mapW];
map.map[n + map.mapW] := '0';
Result := True;
Key := 0;
end;
end;
if Result then
exit;
end;
if n1 = map.mapW - 1 then
begin
n1 := -1;
Inc(n2);
end;
Inc(n1);
end;
end;
function IsMapSolved(var map: TGameMap): boolean;
begin
Result := map.map = map.solve;
end;
function CalcularPosibles(str: string; showDebug: boolean = False): TarrayOfString;
function Factorial(number: integer): integer;
var
i: integer;
begin
Result := number;
for i := number - 1 downto 1 do
begin
Result := Result * i;
end;
end;
function MoverIzq(str: string; pos: integer): string;
var
s1, s2: char;
begin
Result := str;
s1 := Result[pos];
s2 := Result[pos - 1];
Result[pos] := s2;
Result[pos - 1] := s1;
end;
function MoverIni(str: string; pos: integer): string;
var
s1, s2: char;
begin
Result := str;
s1 := Result[pos];
s2 := Result[1];
Result[pos] := s2;
Result[1] := s1;
end;
var
nLargo, // numero de char en la string
nFactorial, // numero de combinaciones
nFactorialDivLargo, // primer char veces repetido
nFactorialm1DivLargom1, // segundo char veces repetido
nPosibles: integer; // numero de combinaciones jugables
n: integer;
rstr: string;
begin
// Los comentarios de los numeros son para str:=1230;
nLargo := length(str); // 4
if nLargo <= 1 then
exit;
nFactorial := Factorial(nLargo); // 24
//nFactorialDivLargo := nFactorial div nLargo; // 6
//nFactorialm1DivLargom1 := Factorial(nLargo - 1) div (nLargo - 1); // 2
nPosibles := nFactorial div 2; // 12
SetLength(Result, nPosibles);
//0 to 11
for n := 0 to nPosibles - 1 do
begin
// create a function here ;)
// start with '1'
if n = 0 then
Result[n] := str // 1230 (no clic)
else
if n = 1 then // 1203 (clic 3)
Result[n] := MoverIzq(Result[n - 1], nLargo); // 1203
if n = 2 then // 1032 (clic 2)
begin
Result[n] := MoverIzq(Result[n - 1], nLargo - 1); // 1023
Result[n] := MoverIzq(Result[n], nLargo); // 1032
end;
// start with '2' (the 2 positioned char)
if n = 3 then // 2310 (clic 3 2 1 3)
begin
Result[n] := MoverIni(Result[0], 2); // 2130
Result[n] := MoverIzq(Result[n], nLargo - 1); // 2310
end;
if n = 4 then // 2301
begin
Result[n] := MoverIzq(Result[n - 1], nLargo); // 2301
end;
if n = 5 then // 2013
begin
Result[n] := MoverIzq(Result[n - 1], nLargo - 1); // 2031
Result[n] := MoverIzq(Result[n], nLargo); // 2013
end;
// start with '3' (the 3 positioned char)
if n = 6 then // 3120
begin
Result[n] := MoverIni(Result[0], 3);
Result[n] := MoverIzq(Result[n], nLargo - 1); // 3120
end;
if n = 7 then // 3102
begin
Result[n] := MoverIzq(Result[n - 1], nLargo); // 3102
end;
if n = 8 then // 3021
begin
Result[n] := MoverIzq(Result[n - 1], nLargo - 1);
Result[n] := MoverIzq(Result[n], nLargo); // 3021
end;
// start with '0' (the 4 positioned char)
if n = 9 then // 0321
begin
Result[n] := MoverIni(Result[0], 4);
Result[n] := MoverIzq(Result[n], nLargo - 1); // 0321
end;
if n = 10 then // 0213
begin
Result[n] := MoverIzq(Result[n - 1], nLargo - 1);
Result[n] := MoverIzq(Result[n], nLargo); // 0213
end;
if n = 11 then // 0132
begin
Result[n] := MoverIzq(Result[n - 1], nLargo - 1);
Result[n] := MoverIzq(Result[n], nLargo); // 0232
end;
end;
// Debug
if showDebug then
begin
rstr := '';
for n := 0 to nPosibles - 1 do
begin
rstr := concat(rstr, LineEnding, Result[n]);
end;
ShowMessage(rstr);
ShowMessage(
concat('numero de char en la string: ', IntToStr(nLargo), LineEnding,
'numero de combinaciones: ', IntToStr(nFactorial), LineEnding,
//'primer char veces repetido: ', IntToStr(nFactorialDivLargo),
//LineEnding, 'segundo char veces repetido: ', IntToStr(nFactorialm1DivLargom1), LineEnding,
'numero de combinaciones jugables: ', IntToStr(nPosibles))
);
end;
end;
{$R *.lfm}
{ TForm1 }
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
DrawMap(map^, bitmap, texture);
end;
{ MOUSE }
procedure TForm1.BGRAVirtualScreen1Click(Sender: TObject);
var
pos: TPoint;
begin
pos := ScreenToClient(Mouse.CursorPos);
if ClickMap(map^, pos) then
begin
PlayBlockSound;
BGRAVirtualScreen1.DiscardBitmap;
end;
end;
{ CREATE }
procedure TForm1.FormCreate(Sender: TObject);
var
a: TArrayOfString;
i: integer;
begin
a := CalcularPosibles('1230'{, True});
// 0 is 1230 the solve
// 1 to 11
for i := 1 to length(a) - 1 do
begin
Game[i].map := a[i];
Game[i].solve := a[0];
Game[i].mapW := length(a[0]) div 2;
Game[i].mapH := length(a[0]) div 2;
Game[i].blockW := 128;
Game[i].blockH := 128;
end;
Game[length(Game)] := GameOver;
{ SCALING }
// FullScreen with current screen resolution
//Size := Rect(0, 0, Screen.Width, Screen.Height);
Size := Rect(0, 0, 640, 480);
SetBounds(Size.Left, Size.Top, Size.Right, Size.Bottom);
ScaleAspectRatio(BGRAVirtualScreen1, Size.Right, Size.Bottom, True, True, True);
ToggleFullScreen(Self, Size);
ScaleBlocks;
{ OPEN }
randomize; // to randomize the skin
OpenMap(1);
current := 1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseMap;
end;
{ KEYBOARD }
procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
if (Key = VK_ESCAPE) then
Application.Terminate;
if (Key = VK_F11) then
ToggleFullScreen(Self, Size);
if KeyPressMap(map^, Key) then
begin
PlayBlockSound;
BGRAVirtualScreen1.DiscardBitmap;
end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
CenterControl(BGRAVirtualScreen1);
end;
{ TIMER }
procedure TForm1.Timer1Timer(Sender: TObject);
{$IFDEF WINDOWS}
procedure JoyDown(const pKey: word);
var
Key: word;
begin
Key := pKey;
FormKeyDown(nil, Key, []);
end;
{$ENDIF}
var
nextGame: boolean;
{$IFDEF WINDOWS}
myJoy: TJoyInfoEx;
myJoyCaps: TJoyCaps;
ErrorResultC, ErrorResultP: MMRESULT;
{$ENDIF}
begin
if map <> nil then
begin
Caption := 'Level ' + IntToStr(current);
nextGame := IsMapSolved(map^);
if (current = length(Game)) and nextGame then
begin
Timer1.Enabled := False;
//ShowMessage('Game Win!');
exit;
end;
if nextGame then
begin
Timer1.Enabled := False;
OpenMap(current + 1);
//ShowMessage('Next: Level ' + IntToStr(current));
BGRAVirtualScreen1.DiscardBitmap;
Timer1.Enabled := True;
end;
{$IFDEF WINDOWS}
ErrorResultC := joyGetDevCaps(joystickid1, @myJoyCaps, sizeof(myJoyCaps));
ErrorResultP := joyGetPosEx(joystickid1, @MyJoy);
if (ErrorResultC = JOYERR_NOERROR) and (ErrorResultP = JOYERR_NOERROR) then
begin
if (myJoy.dwPOV = JOY_POVFORWARD) or (myJoy.wYpos = myJoyCaps.wYmin) then
JoyDown(U1)
else if (myJoy.dwPOV = JOY_POVBACKWARD) or (myJoy.wYpos = myJoyCaps.wYmax) then
JoyDown(D1)
else if (myJoy.dwPOV = JOY_POVLEFT) or (myJoy.wXpos = myJoyCaps.wXmin) then
JoyDown(L1)
else if (myJoy.dwPOV = JOY_POVRIGHT) or (myJoy.wXpos = myJoyCaps.wXmax) then
JoyDown(R1);
end;
{$ENDIF}
end;
end;
procedure TForm1.OpenMap(num: integer);
begin
CloseMap;
if (num < low(Game)) or (num > high(Game)) then
halt;
current := num;
map := @Game[current];
GenerateTexture;
end;
procedure TForm1.CloseMap;
begin
if map <> nil then
FreeAndNil(map^.background);
FreeAndNil(texture);
map := nil;
end;
procedure TForm1.ScaleBlocks;
var
i: integer;
begin
for i := low(game) to high(game) do
begin
Game[i].blockW := BGRAVirtualScreen1.Width div Game[i].mapW;
Game[i].blockH := BGRAVirtualScreen1.Height div Game[i].mapH;
end;
end;
procedure TForm1.GenerateTexture;
begin
if texture <> nil then
raise Exception.Create('Texture not freed');
case random(9) of
0: texture := CreatePlastikTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
1: texture := CreateCamouflageTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
2: texture := CreateSnowPrintTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
3: texture := CreateRoundStoneTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
4: texture := CreateStoneTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
5: texture := CreateWaterTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
6: texture := CreateMarbleTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
7: texture := CreateWoodTexture(BGRAVirtualScreen1.Width, BGRAVirtualScreen1.Height);
8: texture := CreateVerticalWoodTexture(BGRAVirtualScreen1.Width,
BGRAVirtualScreen1.Height);
end;
end;
procedure TForm1.PlayBlockSound;
begin
{$IFDEF WINDOWS}
PlaySound(PChar('move.wav'), 0, SND_ASYNC);
{$ENDIF}
end;
end.

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="circleanimation"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="circleanimation.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="umain.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="circleanimation"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program circleanimation;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, umain
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,59 @@
object Form1: TForm1
Left = 465
Height = 343
Top = 182
Width = 538
Caption = 'Form1'
ClientHeight = 343
ClientWidth = 538
Color = clWhite
LCLVersion = '1.6.0.4'
object Button1: TBGRAGraphicControl
Left = 48
Height = 57
Top = 48
Width = 196
OnRedraw = Button1Redraw
Color = clWhite
ColorOpacity = 128
Alignment = taCenter
OnMouseDown = Button1MouseDown
end
object BCMaterialDesignButton1: TBCMaterialDesignButton
Left = 48
Height = 152
Top = 112
Width = 414
TextColor = 8404992
TextSize = 22
TextStyle = [fsItalic]
TextFont = 'default'
Anchors = [akTop, akLeft, akRight, akBottom]
Caption = 'Material Design'
OnClick = BCMaterialDesignButton1Click
end
object BCMaterialDesignButton2: TBCMaterialDesignButton
Left = 458
Height = 53
Top = 284
Width = 66
RoundBorders = 25
NormalColor = 8404992
NormalColorEffect = clWhite
ShadowColor = clBlack
ShadowSize = 8
TextColor = clWhite
TextSize = 30
TextFont = 'default'
Anchors = [akRight, akBottom]
Caption = '@'
end
object Timer1: TTimer
Enabled = False
Interval = 15
OnTimer = Timer1Timer
OnStartTimer = Timer1StartTimer
left = 28
top = 14
end
end

View File

@@ -0,0 +1,103 @@
unit umain;
{$mode objfpc}{$H+}
interface
uses
Classes, Forms, Controls, ExtCtrls, Dialogs,
BGRAGraphicControl, BGRABitmap, BGRABitmapTypes,
BGRATextFX, bcmaterialdesignbutton;
type
{ TForm1 }
TForm1 = class(TForm)
BCMaterialDesignButton1: TBCMaterialDesignButton;
BCMaterialDesignButton2: TBCMaterialDesignButton;
Button1: TBGRAGraphicControl;
Timer1: TTimer;
procedure BCMaterialDesignButton1Click(Sender: TObject);
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
procedure Button1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure Timer1StartTimer(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
MouseP: TPoint;
CircleX: single;
CircleAlpha: byte;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
begin
Timer1.Enabled := False;
MouseP := Point(X, Y);
Timer1.Enabled := True;
end;
procedure TForm1.BCMaterialDesignButton1Click(Sender: TObject);
begin
//ShowMessage('Click');
end;
procedure TForm1.Button1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
var
temp: TBGRABitmap;
begin
{ Shadow }
Bitmap.Fill(BGRAPixelTransparent);
Bitmap.RoundRect(5, 5, Button1.Width - 5, Button1.Height - 5, 5, 5,
BGRA(100, 100, 100), BGRA(100, 100, 100));
temp := Bitmap.FilterBlurRadial(5, 5, rbFast) as TBGRABitmap;
Bitmap.Fill(BGRAPixelTransparent);
Bitmap.PutImage(0, 0, temp, dmDrawWithTransparency);
temp.Free;
{ Round Rectangle }
temp := TBGRABitmap.Create(Button1.Width, Button1.Height, BGRAWhite);
{ Circle Effect }
temp.EllipseAntialias(MouseP.X, MouseP.Y, CircleX, CircleX,
BGRA(100, 100, 100, CircleAlpha), 1, BGRA(100, 100, 100, CircleAlpha));
Bitmap.FillRoundRectAntialias(5, 0, Button1.Width - 5, Button1.Height -
5, 5, 5, temp, [rrDefault], False);
temp.Free;
{ Text }
temp := TextShadow(Button1.Width, Button1.Height, 'Material Design',
20, BGRABlack, BGRABlack, 2, 2, 2) as TBGRABitmap;
Bitmap.PutImage(0, 0, temp, dmDrawWithTransparency);
temp.Free;
end;
procedure TForm1.Timer1StartTimer(Sender: TObject);
begin
CircleAlpha := 255;
CircleX := 5;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
CircleX := CircleX + 4;
CircleAlpha := CircleAlpha - 5;
if CircleAlpha <= 0 then
Timer1.Enabled := False;
Button1.DiscardBitmap;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,713 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<g>
<polygon points="16 1.75, 16.5 2, 16.5 2.5, 16 2.75, 15.5 2.5, 15.5 2" style="fill:rgb(254,229,202); fill-opacity:0.0470588235294118;" />
<polygon points="17 1.75, 17.5 2, 17.5 2.5, 17 2.75, 16.5 2.5, 16.5 2" style="fill:rgb(255,231,207); fill-opacity:0.207843137254902;" />
<polygon points="18 1.75, 18.5 2, 18.5 2.5, 18 2.75, 17.5 2.5, 17.5 2" style="fill:rgb(255,233,213); fill-opacity:0.392156862745098;" />
<polygon points="19 1.75, 19.5 2, 19.5 2.5, 19 2.75, 18.5 2.5, 18.5 2" style="fill:rgb(255,234,214); fill-opacity:0.549019607843137;" />
<polygon points="20 1.75, 20.5 2, 20.5 2.5, 20 2.75, 19.5 2.5, 19.5 2" style="fill:rgb(255,231,206); fill-opacity:0.674509803921569;" />
<polygon points="21 1.75, 21.5 2, 21.5 2.5, 21 2.75, 20.5 2.5, 20.5 2" style="fill:rgb(253,228,201); fill-opacity:0.745098039215686;" />
<polygon points="22 1.75, 22.5 2, 22.5 2.5, 22 2.75, 21.5 2.5, 21.5 2" style="fill:rgb(254,229,204); fill-opacity:0.737254901960784;" />
<polygon points="23 1.75, 23.5 2, 23.5 2.5, 23 2.75, 22.5 2.5, 22.5 2" style="fill:rgb(253,227,202); fill-opacity:0.654901960784314;" />
<polygon points="24 1.75, 24.5 2, 24.5 2.5, 24 2.75, 23.5 2.5, 23.5 2" style="fill:rgb(254,229,204); fill-opacity:0.490196078431373;" />
<polygon points="25 1.75, 25.5 2, 25.5 2.5, 25 2.75, 24.5 2.5, 24.5 2" style="fill:rgb(244,219,195); fill-opacity:0.266666666666667;" />
<polygon points="26 1.75, 26.5 2, 26.5 2.5, 26 2.75, 25.5 2.5, 25.5 2" style="fill:rgb(190,172,152); fill-opacity:0.0392156862745098;" />
<polygon points="12.5 2.5, 13 2.75, 13 3.25, 12.5 3.5, 12 3.25, 12 2.75" style="fill:rgb(254,228,202); fill-opacity:0.0980392156862745;" />
<polygon points="13.5 2.5, 14 2.75, 14 3.25, 13.5 3.5, 13 3.25, 13 2.75" style="fill:rgb(254,229,206); fill-opacity:0.325490196078431;" />
<polygon points="14.5 2.5, 15 2.75, 15 3.25, 14.5 3.5, 14 3.25, 14 2.75" style="fill:rgb(252,230,207); fill-opacity:0.596078431372549;" />
<polygon points="15.5 2.5, 16 2.75, 16 3.25, 15.5 3.5, 15 3.25, 15 2.75" style="fill:rgb(250,227,207); fill-opacity:0.815686274509804;" />
<polygon points="16.5 2.5, 17 2.75, 17 3.25, 16.5 3.5, 16 3.25, 16 2.75" style="fill:rgb(236,216,188); fill-opacity:0.929411764705882;" />
<polygon points="17.5 2.5, 18 2.75, 18 3.25, 17.5 3.5, 17 3.25, 17 2.75" style="fill:rgb(210,203,145); fill-opacity:1;" />
<polygon points="18.5 2.5, 19 2.75, 19 3.25, 18.5 3.5, 18 3.25, 18 2.75" style="fill:rgb(204,199,137); fill-opacity:1;" />
<polygon points="19.5 2.5, 20 2.75, 20 3.25, 19.5 3.5, 19 3.25, 19 2.75" style="fill:rgb(235,213,184); fill-opacity:1;" />
<polygon points="20.5 2.5, 21 2.75, 21 3.25, 20.5 3.5, 20 3.25, 20 2.75" style="fill:rgb(253,228,204); fill-opacity:1;" />
<polygon points="21.5 2.5, 22 2.75, 22 3.25, 21.5 3.5, 21 3.25, 21 2.75" style="fill:rgb(252,227,201); fill-opacity:1;" />
<polygon points="22.5 2.5, 23 2.75, 23 3.25, 22.5 3.5, 22 3.25, 22 2.75" style="fill:rgb(252,227,201); fill-opacity:1;" />
<polygon points="23.5 2.5, 24 2.75, 24 3.25, 23.5 3.5, 23 3.25, 23 2.75" style="fill:rgb(254,229,203); fill-opacity:1;" />
<polygon points="24.5 2.5, 25 2.75, 25 3.25, 24.5 3.5, 24 3.25, 24 2.75" style="fill:rgb(252,227,202); fill-opacity:0.956862745098039;" />
<polygon points="25.5 2.5, 26 2.75, 26 3.25, 25.5 3.5, 25 3.25, 25 2.75" style="fill:rgb(235,215,191); fill-opacity:0.796078431372549;" />
<polygon points="26.5 2.5, 27 2.75, 27 3.25, 26.5 3.5, 26 3.25, 26 2.75" style="fill:rgb(180,167,148); fill-opacity:0.423529411764706;" />
<polygon points="27.5 2.5, 28 2.75, 28 3.25, 27.5 3.5, 27 3.25, 27 2.75" style="fill:rgb(92,80,69); fill-opacity:0.0431372549019608;" />
<polygon points="11 3.25, 11.5 3.5, 11.5 4, 11 4.25, 10.5 4, 10.5 3.5" style="fill:rgb(254,227,202); fill-opacity:0.156862745098039;" />
<polygon points="12 3.25, 12.5 3.5, 12.5 4, 12 4.25, 11.5 4, 11.5 3.5" style="fill:rgb(250,227,204); fill-opacity:0.533333333333333;" />
<polygon points="13 3.25, 13.5 3.5, 13.5 4, 13 4.25, 12.5 4, 12.5 3.5" style="fill:rgb(243,223,202); fill-opacity:0.854901960784314;" />
<polygon points="14 3.25, 14.5 3.5, 14.5 4, 14 4.25, 13.5 4, 13.5 3.5" style="fill:rgb(238,217,197); fill-opacity:1;" />
<polygon points="15 3.25, 15.5 3.5, 15.5 4, 15 4.25, 14.5 4, 14.5 3.5" style="fill:rgb(236,214,193); fill-opacity:1;" />
<polygon points="16 3.25, 16.5 3.5, 16.5 4, 16 4.25, 15.5 4, 15.5 3.5" style="fill:rgb(243,216,195); fill-opacity:1;" />
<polygon points="17 3.25, 17.5 3.5, 17.5 4, 17 4.25, 16.5 4, 16.5 3.5" style="fill:rgb(204,188,151); fill-opacity:1;" />
<polygon points="18 3.25, 18.5 3.5, 18.5 4, 18 4.25, 17.5 4, 17.5 3.5" style="fill:rgb(132,143,56); fill-opacity:1;" />
<polygon points="19 3.25, 19.5 3.5, 19.5 4, 19 4.25, 18.5 4, 18.5 3.5" style="fill:rgb(110,125,34); fill-opacity:1;" />
<polygon points="20 3.25, 20.5 3.5, 20.5 4, 20 4.25, 19.5 4, 19.5 3.5" style="fill:rgb(203,188,152); fill-opacity:1;" />
<polygon points="21 3.25, 21.5 3.5, 21.5 4, 21 4.25, 20.5 4, 20.5 3.5" style="fill:rgb(255,231,208); fill-opacity:1;" />
<polygon points="22 3.25, 22.5 3.5, 22.5 4, 22 4.25, 21.5 4, 21.5 3.5" style="fill:rgb(248,224,198); fill-opacity:1;" />
<polygon points="23 3.25, 23.5 3.5, 23.5 4, 23 4.25, 22.5 4, 22.5 3.5" style="fill:rgb(251,226,200); fill-opacity:1;" />
<polygon points="24 3.25, 24.5 3.5, 24.5 4, 24 4.25, 23.5 4, 23.5 3.5" style="fill:rgb(252,226,201); fill-opacity:1;" />
<polygon points="25 3.25, 25.5 3.5, 25.5 4, 25 4.25, 24.5 4, 24.5 3.5" style="fill:rgb(253,227,202); fill-opacity:1;" />
<polygon points="26 3.25, 26.5 3.5, 26.5 4, 26 4.25, 25.5 4, 25.5 3.5" style="fill:rgb(255,232,206); fill-opacity:1;" />
<polygon points="27 3.25, 27.5 3.5, 27.5 4, 27 4.25, 26.5 4, 26.5 3.5" style="fill:rgb(255,236,210); fill-opacity:1;" />
<polygon points="28 3.25, 28.5 3.5, 28.5 4, 28 4.25, 27.5 4, 27.5 3.5" style="fill:rgb(174,163,144); fill-opacity:0.741176470588235;" />
<polygon points="29 3.25, 29.5 3.5, 29.5 4, 29 4.25, 28.5 4, 28.5 3.5" style="fill:rgb(70,56,49); fill-opacity:0.125490196078431;" />
<polygon points="8.5 4, 9 4.25, 9 4.75, 8.5 5, 8 4.75, 8 4.25" style="fill:rgb(253,227,201); fill-opacity:0.0431372549019608;" />
<polygon points="9.5 4, 10 4.25, 10 4.75, 9.5 5, 9 4.75, 9 4.25" style="fill:rgb(252,227,202); fill-opacity:0.47843137254902;" />
<polygon points="10.5 4, 11 4.25, 11 4.75, 10.5 5, 10 4.75, 10 4.25" style="fill:rgb(239,216,196); fill-opacity:0.905882352941176;" />
<polygon points="11.5 4, 12 4.25, 12 4.75, 11.5 5, 11 4.75, 11 4.25" style="fill:rgb(226,205,186); fill-opacity:1;" />
<polygon points="12.5 4, 13 4.25, 13 4.75, 12.5 5, 12 4.75, 12 4.25" style="fill:rgb(226,203,181); fill-opacity:1;" />
<polygon points="13.5 4, 14 4.25, 14 4.75, 13.5 5, 13 4.75, 13 4.25" style="fill:rgb(231,206,183); fill-opacity:1;" />
<polygon points="14.5 4, 15 4.25, 15 4.75, 14.5 5, 14 4.75, 14 4.25" style="fill:rgb(236,212,187); fill-opacity:1;" />
<polygon points="15.5 4, 16 4.25, 16 4.75, 15.5 5, 15 4.75, 15 4.25" style="fill:rgb(242,216,192); fill-opacity:1;" />
<polygon points="16.5 4, 17 4.25, 17 4.75, 16.5 5, 16 4.75, 16 4.25" style="fill:rgb(236,213,186); fill-opacity:1;" />
<polygon points="17.5 4, 18 4.25, 18 4.75, 17.5 5, 17 4.75, 17 4.25" style="fill:rgb(220,198,171); fill-opacity:1;" />
<polygon points="18.5 4, 19 4.25, 19 4.75, 18.5 5, 18 4.75, 18 4.25" style="fill:rgb(200,183,149); fill-opacity:1;" />
<polygon points="19.5 4, 20 4.25, 20 4.75, 19.5 5, 19 4.75, 19 4.25" style="fill:rgb(234,212,183); fill-opacity:1;" />
<polygon points="20.5 4, 21 4.25, 21 4.75, 20.5 5, 20 4.75, 20 4.25" style="fill:rgb(249,223,199); fill-opacity:1;" />
<polygon points="21.5 4, 22 4.25, 22 4.75, 21.5 5, 21 4.75, 21 4.25" style="fill:rgb(248,223,199); fill-opacity:1;" />
<polygon points="22.5 4, 23 4.25, 23 4.75, 22.5 5, 22 4.75, 22 4.25" style="fill:rgb(250,224,199); fill-opacity:1;" />
<polygon points="23.5 4, 24 4.25, 24 4.75, 23.5 5, 23 4.75, 23 4.25" style="fill:rgb(250,224,199); fill-opacity:1;" />
<polygon points="24.5 4, 25 4.25, 25 4.75, 24.5 5, 24 4.75, 24 4.25" style="fill:rgb(251,225,200); fill-opacity:1;" />
<polygon points="25.5 4, 26 4.25, 26 4.75, 25.5 5, 25 4.75, 25 4.25" style="fill:rgb(250,224,199); fill-opacity:1;" />
<polygon points="26.5 4, 27 4.25, 27 4.75, 26.5 5, 26 4.75, 26 4.25" style="fill:rgb(252,226,201); fill-opacity:1;" />
<polygon points="27.5 4, 28 4.25, 28 4.75, 27.5 5, 27 4.75, 27 4.25" style="fill:rgb(255,247,219); fill-opacity:1;" />
<polygon points="28.5 4, 29 4.25, 29 4.75, 28.5 5, 28 4.75, 28 4.25" style="fill:rgb(150,135,120); fill-opacity:0.690196078431373;" />
<polygon points="29.5 4, 30 4.25, 30 4.75, 29.5 5, 29 4.75, 29 4.25" style="fill:rgb(67,51,45); fill-opacity:0.0235294117647059;" />
<polygon points="8 4.75, 8.5 5, 8.5 5.5, 8 5.75, 7.5 5.5, 7.5 5" style="fill:rgb(250,223,199); fill-opacity:0.164705882352941;" />
<polygon points="9 4.75, 9.5 5, 9.5 5.5, 9 5.75, 8.5 5.5, 8.5 5" style="fill:rgb(243,218,196); fill-opacity:0.737254901960784;" />
<polygon points="10 4.75, 10.5 5, 10.5 5.5, 10 5.75, 9.5 5.5, 9.5 5" style="fill:rgb(229,198,177); fill-opacity:1;" />
<polygon points="11 4.75, 11.5 5, 11.5 5.5, 11 5.75, 10.5 5.5, 10.5 5" style="fill:rgb(223,194,172); fill-opacity:1;" />
<polygon points="12 4.75, 12.5 5, 12.5 5.5, 12 5.75, 11.5 5.5, 11.5 5" style="fill:rgb(225,199,177); fill-opacity:1;" />
<polygon points="13 4.75, 13.5 5, 13.5 5.5, 13 5.75, 12.5 5.5, 12.5 5" style="fill:rgb(230,205,182); fill-opacity:1;" />
<polygon points="14 4.75, 14.5 5, 14.5 5.5, 14 5.75, 13.5 5.5, 13.5 5" style="fill:rgb(234,209,186); fill-opacity:1;" />
<polygon points="15 4.75, 15.5 5, 15.5 5.5, 15 5.75, 14.5 5.5, 14.5 5" style="fill:rgb(237,211,188); fill-opacity:1;" />
<polygon points="16 4.75, 16.5 5, 16.5 5.5, 16 5.75, 15.5 5.5, 15.5 5" style="fill:rgb(239,213,189); fill-opacity:1;" />
<polygon points="17 4.75, 17.5 5, 17.5 5.5, 17 5.75, 16.5 5.5, 16.5 5" style="fill:rgb(252,225,201); fill-opacity:1;" />
<polygon points="18 4.75, 18.5 5, 18.5 5.5, 18 5.75, 17.5 5.5, 17.5 5" style="fill:rgb(255,234,210); fill-opacity:1;" />
<polygon points="19 4.75, 19.5 5, 19.5 5.5, 19 5.75, 18.5 5.5, 18.5 5" style="fill:rgb(255,237,212); fill-opacity:1;" />
<polygon points="20 4.75, 20.5 5, 20.5 5.5, 20 5.75, 19.5 5.5, 19.5 5" style="fill:rgb(249,223,199); fill-opacity:1;" />
<polygon points="21 4.75, 21.5 5, 21.5 5.5, 21 5.75, 20.5 5.5, 20.5 5" style="fill:rgb(245,220,195); fill-opacity:1;" />
<polygon points="22 4.75, 22.5 5, 22.5 5.5, 22 5.75, 21.5 5.5, 21.5 5" style="fill:rgb(249,223,198); fill-opacity:1;" />
<polygon points="23 4.75, 23.5 5, 23.5 5.5, 23 5.75, 22.5 5.5, 22.5 5" style="fill:rgb(248,221,197); fill-opacity:1;" />
<polygon points="24 4.75, 24.5 5, 24.5 5.5, 24 5.75, 23.5 5.5, 23.5 5" style="fill:rgb(246,221,196); fill-opacity:1;" />
<polygon points="25 4.75, 25.5 5, 25.5 5.5, 25 5.75, 24.5 5.5, 24.5 5" style="fill:rgb(246,219,195); fill-opacity:1;" />
<polygon points="26 4.75, 26.5 5, 26.5 5.5, 26 5.75, 25.5 5.5, 25.5 5" style="fill:rgb(254,227,202); fill-opacity:1;" />
<polygon points="27 4.75, 27.5 5, 27.5 5.5, 27 5.75, 26.5 5.5, 26.5 5" style="fill:rgb(255,233,208); fill-opacity:1;" />
<polygon points="28 4.75, 28.5 5, 28.5 5.5, 28 5.75, 27.5 5.5, 27.5 5" style="fill:rgb(255,241,215); fill-opacity:1;" />
<polygon points="29 4.75, 29.5 5, 29.5 5.5, 29 5.75, 28.5 5.5, 28.5 5" style="fill:rgb(165,148,133); fill-opacity:0.894117647058824;" />
<polygon points="30 4.75, 30.5 5, 30.5 5.5, 30 5.75, 29.5 5.5, 29.5 5" style="fill:rgb(82,65,57); fill-opacity:0.0901960784313725;" />
<polygon points="6.5 5.5, 7 5.75, 7 6.25, 6.5 6.5, 6 6.25, 6 5.75" style="fill:rgb(246,219,195); fill-opacity:0.219607843137255;" />
<polygon points="7.5 5.5, 8 5.75, 8 6.25, 7.5 6.5, 7 6.25, 7 5.75" style="fill:rgb(230,206,185); fill-opacity:0.854901960784314;" />
<polygon points="8.5 5.5, 9 5.75, 9 6.25, 8.5 6.5, 8 6.25, 8 5.75" style="fill:rgb(198,182,169); fill-opacity:1;" />
<polygon points="9.5 5.5, 10 5.75, 10 6.25, 9.5 6.5, 9 6.25, 9 5.75" style="fill:rgb(130,194,197); fill-opacity:1;" />
<polygon points="10.5 5.5, 11 5.75, 11 6.25, 10.5 6.5, 10 6.25, 10 5.75" style="fill:rgb(87,202,210); fill-opacity:1;" />
<polygon points="11.5 5.5, 12 5.75, 12 6.25, 11.5 6.5, 11 6.25, 11 5.75" style="fill:rgb(211,198,178); fill-opacity:1;" />
<polygon points="12.5 5.5, 13 5.75, 13 6.25, 12.5 6.5, 12 6.25, 12 5.75" style="fill:rgb(237,208,183); fill-opacity:1;" />
<polygon points="13.5 5.5, 14 5.75, 14 6.25, 13.5 6.5, 13 6.25, 13 5.75" style="fill:rgb(231,206,183); fill-opacity:1;" />
<polygon points="14.5 5.5, 15 5.75, 15 6.25, 14.5 6.5, 14 6.25, 14 5.75" style="fill:rgb(233,208,184); fill-opacity:1;" />
<polygon points="15.5 5.5, 16 5.75, 16 6.25, 15.5 6.5, 15 6.25, 15 5.75" style="fill:rgb(235,209,186); fill-opacity:1;" />
<polygon points="16.5 5.5, 17 5.75, 17 6.25, 16.5 6.5, 16 6.25, 16 5.75" style="fill:rgb(194,171,153); fill-opacity:0.996078431372549;" />
<polygon points="17.5 5.5, 18 5.75, 18 6.25, 17.5 6.5, 17 6.25, 17 5.75" style="fill:rgb(160,142,128); fill-opacity:0.886274509803922;" />
<polygon points="18.5 5.5, 19 5.75, 19 6.25, 18.5 6.5, 18 6.25, 18 5.75" style="fill:rgb(183,163,147); fill-opacity:0.937254901960784;" />
<polygon points="19.5 5.5, 20 5.75, 20 6.25, 19.5 6.5, 19 6.25, 19 5.75" style="fill:rgb(242,216,192); fill-opacity:1;" />
<polygon points="20.5 5.5, 21 5.75, 21 6.25, 20.5 6.5, 20 6.25, 20 5.75" style="fill:rgb(249,222,197); fill-opacity:1;" />
<polygon points="21.5 5.5, 22 5.75, 22 6.25, 21.5 6.5, 21 6.25, 21 5.75" style="fill:rgb(243,217,193); fill-opacity:1;" />
<polygon points="22.5 5.5, 23 5.75, 23 6.25, 22.5 6.5, 22 6.25, 22 5.75" style="fill:rgb(238,213,189); fill-opacity:1;" />
<polygon points="23.5 5.5, 24 5.75, 24 6.25, 23.5 6.5, 23 6.25, 23 5.75" style="fill:rgb(238,212,189); fill-opacity:1;" />
<polygon points="24.5 5.5, 25 5.75, 25 6.25, 24.5 6.5, 24 6.25, 24 5.75" style="fill:rgb(247,222,197); fill-opacity:1;" />
<polygon points="25.5 5.5, 26 5.75, 26 6.25, 25.5 6.5, 25 6.25, 25 5.75" style="fill:rgb(229,205,182); fill-opacity:1;" />
<polygon points="26.5 5.5, 27 5.75, 27 6.25, 26.5 6.5, 26 6.25, 26 5.75" style="fill:rgb(188,167,148); fill-opacity:0.862745098039216;" />
<polygon points="27.5 5.5, 28 5.75, 28 6.25, 27.5 6.5, 27 6.25, 27 5.75" style="fill:rgb(143,124,111); fill-opacity:0.658823529411765;" />
<polygon points="28.5 5.5, 29 5.75, 29 6.25, 28.5 6.5, 28 6.25, 28 5.75" style="fill:rgb(98,79,71); fill-opacity:0.301960784313725;" />
<polygon points="29.5 5.5, 30 5.75, 30 6.25, 29.5 6.5, 29 6.25, 29 5.75" style="fill:rgb(92,74,65); fill-opacity:0.00392156862745098;" />
<polygon points="6 6.25, 6.5 6.5, 6.5 7, 6 7.25, 5.5 7, 5.5 6.5" style="fill:rgb(246,219,194); fill-opacity:0.235294117647059;" />
<polygon points="7 6.25, 7.5 6.5, 7.5 7, 7 7.25, 6.5 7, 6.5 6.5" style="fill:rgb(228,202,182); fill-opacity:0.901960784313726;" />
<polygon points="8 6.25, 8.5 6.5, 8.5 7, 8 7.25, 7.5 7, 7.5 6.5" style="fill:rgb(181,174,165); fill-opacity:1;" />
<polygon points="9 6.25, 9.5 6.5, 9.5 7, 9 7.25, 8.5 7, 8.5 6.5" style="fill:rgb(91,180,197); fill-opacity:1;" />
<polygon points="10 6.25, 10.5 6.5, 10.5 7, 10 7.25, 9.5 7, 9.5 6.5" style="fill:rgb(2,189,225); fill-opacity:1;" />
<polygon points="11 6.25, 11.5 6.5, 11.5 7, 11 7.25, 10.5 7, 10.5 6.5" style="fill:rgb(11,167,195); fill-opacity:1;" />
<polygon points="12 6.25, 12.5 6.5, 12.5 7, 12 7.25, 11.5 7, 11.5 6.5" style="fill:rgb(203,190,173); fill-opacity:1;" />
<polygon points="13 6.25, 13.5 6.5, 13.5 7, 13 7.25, 12.5 7, 12.5 6.5" style="fill:rgb(240,209,184); fill-opacity:1;" />
<polygon points="14 6.25, 14.5 6.5, 14.5 7, 14 7.25, 13.5 7, 13.5 6.5" style="fill:rgb(233,208,184); fill-opacity:1;" />
<polygon points="15 6.25, 15.5 6.5, 15.5 7, 15 7.25, 14.5 7, 14.5 6.5" style="fill:rgb(217,192,171); fill-opacity:1;" />
<polygon points="16 6.25, 16.5 6.5, 16.5 7, 16 7.25, 15.5 7, 15.5 6.5" style="fill:rgb(115,100,91); fill-opacity:0.752941176470588;" />
<polygon points="17 6.25, 17.5 6.5, 17.5 7, 17 7.25, 16.5 7, 16.5 6.5" style="fill:rgb(55,48,46); fill-opacity:0.309803921568627;" />
<polygon points="18 6.25, 18.5 6.5, 18.5 7, 18 7.25, 17.5 7, 17.5 6.5" style="fill:rgb(41,36,37); fill-opacity:0.129411764705882;" />
<polygon points="19 6.25, 19.5 6.5, 19.5 7, 19 7.25, 18.5 7, 18.5 6.5" style="fill:rgb(28,24,27); fill-opacity:0.192156862745098;" />
<polygon points="20 6.25, 20.5 6.5, 20.5 7, 20 7.25, 19.5 7, 19.5 6.5" style="fill:rgb(152,136,124); fill-opacity:0.717647058823529;" />
<polygon points="21 6.25, 21.5 6.5, 21.5 7, 21 7.25, 20.5 7, 20.5 6.5" style="fill:rgb(255,227,202); fill-opacity:1;" />
<polygon points="22 6.25, 22.5 6.5, 22.5 7, 22 7.25, 21.5 7, 21.5 6.5" style="fill:rgb(233,208,185); fill-opacity:1;" />
<polygon points="23 6.25, 23.5 6.5, 23.5 7, 23 7.25, 22.5 7, 22.5 6.5" style="fill:rgb(232,207,184); fill-opacity:1;" />
<polygon points="24 6.25, 24.5 6.5, 24.5 7, 24 7.25, 23.5 7, 23.5 6.5" style="fill:rgb(218,194,173); fill-opacity:1;" />
<polygon points="25 6.25, 25.5 6.5, 25.5 7, 25 7.25, 24.5 7, 24.5 6.5" style="fill:rgb(155,134,119); fill-opacity:0.776470588235294;" />
<polygon points="26 6.25, 26.5 6.5, 26.5 7, 26 7.25, 25.5 7, 25.5 6.5" style="fill:rgb(108,88,78); fill-opacity:0.384313725490196;" />
<polygon points="27 6.25, 27.5 6.5, 27.5 7, 27 7.25, 26.5 7, 26.5 6.5" style="fill:rgb(90,73,64); fill-opacity:0.105882352941176;" />
<polygon points="4.5 7, 5 7.25, 5 7.75, 4.5 8, 4 7.75, 4 7.25" style="fill:rgb(247,218,195); fill-opacity:0.137254901960784;" />
<polygon points="5.5 7, 6 7.25, 6 7.75, 5.5 8, 5 7.75, 5 7.25" style="fill:rgb(233,206,182); fill-opacity:0.870588235294118;" />
<polygon points="6.5 7, 7 7.25, 7 7.75, 6.5 8, 6 7.75, 6 7.25" style="fill:rgb(198,180,163); fill-opacity:1;" />
<polygon points="7.5 7, 8 7.25, 8 7.75, 7.5 8, 7 7.75, 7 7.25" style="fill:rgb(118,167,181); fill-opacity:1;" />
<polygon points="8.5 7, 9 7.25, 9 7.75, 8.5 8, 8 7.75, 8 7.25" style="fill:rgb(9,150,195); fill-opacity:1;" />
<polygon points="9.5 7, 10 7.25, 10 7.75, 9.5 8, 9 7.75, 9 7.25" style="fill:rgb(9,132,171); fill-opacity:1;" />
<polygon points="10.5 7, 11 7.25, 11 7.75, 10.5 8, 10 7.75, 10 7.25" style="fill:rgb(101,150,160); fill-opacity:1;" />
<polygon points="11.5 7, 12 7.25, 12 7.75, 11.5 8, 11 7.75, 11 7.25" style="fill:rgb(231,203,181); fill-opacity:1;" />
<polygon points="12.5 7, 13 7.25, 13 7.75, 12.5 8, 12 7.75, 12 7.25" style="fill:rgb(236,209,185); fill-opacity:1;" />
<polygon points="13.5 7, 14 7.25, 14 7.75, 13.5 8, 13 7.75, 13 7.25" style="fill:rgb(237,210,187); fill-opacity:1;" />
<polygon points="14.5 7, 15 7.25, 15 7.75, 14.5 8, 14 7.75, 14 7.25" style="fill:rgb(119,105,95); fill-opacity:0.764705882352941;" />
<polygon points="15.5 7, 16 7.25, 16 7.75, 15.5 8, 15 7.75, 15 7.25" style="fill:rgb(32,28,31); fill-opacity:0.0745098039215686;" />
<polygon points="19.5 7, 20 7.25, 20 7.75, 19.5 8, 19 7.75, 19 7.25" style="fill:rgb(131,118,108); fill-opacity:0.407843137254902;" />
<polygon points="20.5 7, 21 7.25, 21 7.75, 20.5 8, 20 7.75, 20 7.25" style="fill:rgb(246,219,194); fill-opacity:1;" />
<polygon points="21.5 7, 22 7.25, 22 7.75, 21.5 8, 21 7.75, 21 7.25" style="fill:rgb(229,205,182); fill-opacity:1;" />
<polygon points="22.5 7, 23 7.25, 23 7.75, 22.5 8, 22 7.75, 22 7.25" style="fill:rgb(200,176,157); fill-opacity:0.992156862745098;" />
<polygon points="23.5 7, 24 7.25, 24 7.75, 23.5 8, 23 7.75, 23 7.25" style="fill:rgb(108,89,79); fill-opacity:0.529411764705882;" />
<polygon points="24.5 7, 25 7.25, 25 7.75, 24.5 8, 24 7.75, 24 7.25" style="fill:rgb(75,58,50); fill-opacity:0.0470588235294118;" />
<polygon points="4 7.75, 4.5 8, 4.5 8.5, 4 8.75, 3.5 8.5, 3.5 8" style="fill:rgb(243,215,192); fill-opacity:0.0352941176470588;" />
<polygon points="5 7.75, 5.5 8, 5.5 8.5, 5 8.75, 4.5 8.5, 4.5 8" style="fill:rgb(236,208,186); fill-opacity:0.72156862745098;" />
<polygon points="6 7.75, 6.5 8, 6.5 8.5, 6 8.75, 5.5 8.5, 5.5 8" style="fill:rgb(215,188,167); fill-opacity:1;" />
<polygon points="7 7.75, 7.5 8, 7.5 8.5, 7 8.75, 6.5 8.5, 6.5 8" style="fill:rgb(188,181,169); fill-opacity:1;" />
<polygon points="8 7.75, 8.5 8, 8.5 8.5, 8 8.75, 7.5 8.5, 7.5 8" style="fill:rgb(60,134,169); fill-opacity:1;" />
<polygon points="9 7.75, 9.5 8, 9.5 8.5, 9 8.75, 8.5 8.5, 8.5 8" style="fill:rgb(25,106,148); fill-opacity:1;" />
<polygon points="10 7.75, 10.5 8, 10.5 8.5, 10 8.75, 9.5 8.5, 9.5 8" style="fill:rgb(140,156,160); fill-opacity:1;" />
<polygon points="11 7.75, 11.5 8, 11.5 8.5, 11 8.75, 10.5 8.5, 10.5 8" style="fill:rgb(222,199,180); fill-opacity:1;" />
<polygon points="12 7.75, 12.5 8, 12.5 8.5, 12 8.75, 11.5 8.5, 11.5 8" style="fill:rgb(237,208,185); fill-opacity:1;" />
<polygon points="13 7.75, 13.5 8, 13.5 8.5, 13 8.75, 12.5 8.5, 12.5 8" style="fill:rgb(237,209,188); fill-opacity:1;" />
<polygon points="14 7.75, 14.5 8, 14.5 8.5, 14 8.75, 13.5 8.5, 13.5 8" style="fill:rgb(227,200,179); fill-opacity:1;" />
<polygon points="15 7.75, 15.5 8, 15.5 8.5, 15 8.75, 14.5 8.5, 14.5 8" style="fill:rgb(73,65,62); fill-opacity:0.427450980392157;" />
<polygon points="19 7.75, 19.5 8, 19.5 8.5, 19 8.75, 18.5 8.5, 18.5 8" style="fill:rgb(159,144,129); fill-opacity:0.0470588235294118;" />
<polygon points="20 7.75, 20.5 8, 20.5 8.5, 20 8.75, 19.5 8.5, 19.5 8" style="fill:rgb(204,182,163); fill-opacity:0.72156862745098;" />
<polygon points="21 7.75, 21.5 8, 21.5 8.5, 21 8.75, 20.5 8.5, 20.5 8" style="fill:rgb(225,199,177); fill-opacity:1;" />
<polygon points="22 7.75, 22.5 8, 22.5 8.5, 22 8.75, 21.5 8.5, 21.5 8" style="fill:rgb(204,181,162); fill-opacity:1;" />
<polygon points="23 7.75, 23.5 8, 23.5 8.5, 23 8.75, 22.5 8.5, 22.5 8" style="fill:rgb(111,92,81); fill-opacity:0.588235294117647;" />
<polygon points="3.5 8.5, 4 8.75, 4 9.25, 3.5 9.5, 3 9.25, 3 8.75" style="fill:rgb(238,211,187); fill-opacity:0.470588235294118;" />
<polygon points="4.5 8.5, 5 8.75, 5 9.25, 4.5 9.5, 4 9.25, 4 8.75" style="fill:rgb(217,191,171); fill-opacity:1;" />
<polygon points="5.5 8.5, 6 8.75, 6 9.25, 5.5 9.5, 5 9.25, 5 8.75" style="fill:rgb(214,189,169); fill-opacity:1;" />
<polygon points="6.5 8.5, 7 8.75, 7 9.25, 6.5 9.5, 6 9.25, 6 8.75" style="fill:rgb(207,189,172); fill-opacity:1;" />
<polygon points="7.5 8.5, 8 8.75, 8 9.25, 7.5 9.5, 7 9.25, 7 8.75" style="fill:rgb(165,166,163); fill-opacity:1;" />
<polygon points="8.5 8.5, 9 8.75, 9 9.25, 8.5 9.5, 8 9.25, 8 8.75" style="fill:rgb(175,173,166); fill-opacity:1;" />
<polygon points="9.5 8.5, 10 8.75, 10 9.25, 9.5 9.5, 9 9.25, 9 8.75" style="fill:rgb(228,201,181); fill-opacity:1;" />
<polygon points="10.5 8.5, 11 8.75, 11 9.25, 10.5 9.5, 10 9.25, 10 8.75" style="fill:rgb(242,208,184); fill-opacity:1;" />
<polygon points="11.5 8.5, 12 8.75, 12 9.25, 11.5 9.5, 11 9.25, 11 8.75" style="fill:rgb(233,206,184); fill-opacity:1;" />
<polygon points="12.5 8.5, 13 8.75, 13 9.25, 12.5 9.5, 12 9.25, 12 8.75" style="fill:rgb(233,206,184); fill-opacity:1;" />
<polygon points="13.5 8.5, 14 8.75, 14 9.25, 13.5 9.5, 13 9.25, 13 8.75" style="fill:rgb(234,207,185); fill-opacity:1;" />
<polygon points="14.5 8.5, 15 8.75, 15 9.25, 14.5 9.5, 14 9.25, 14 8.75" style="fill:rgb(189,166,149); fill-opacity:0.592156862745098;" />
<polygon points="15.5 8.5, 16 8.75, 16 9.25, 15.5 9.5, 15 9.25, 15 8.75" style="fill:rgb(198,175,157); fill-opacity:0.0980392156862745;" />
<polygon points="16.5 8.5, 17 8.75, 17 9.25, 16.5 9.5, 16 9.25, 16 8.75" style="fill:rgb(159,143,130); fill-opacity:0.117647058823529;" />
<polygon points="17.5 8.5, 18 8.75, 18 9.25, 17.5 9.5, 17 9.25, 17 8.75" style="fill:rgb(181,161,146); fill-opacity:0.282352941176471;" />
<polygon points="18.5 8.5, 19 8.75, 19 9.25, 18.5 9.5, 18 9.25, 18 8.75" style="fill:rgb(211,187,168); fill-opacity:0.717647058823529;" />
<polygon points="19.5 8.5, 20 8.75, 20 9.25, 19.5 9.5, 19 9.25, 19 8.75" style="fill:rgb(230,203,182); fill-opacity:1;" />
<polygon points="20.5 8.5, 21 8.75, 21 9.25, 20.5 9.5, 20 9.25, 20 8.75" style="fill:rgb(204,179,160); fill-opacity:1;" />
<polygon points="21.5 8.5, 22 8.75, 22 9.25, 21.5 9.5, 21 9.25, 21 8.75" style="fill:rgb(179,156,140); fill-opacity:0.992156862745098;" />
<polygon points="22.5 8.5, 23 8.75, 23 9.25, 22.5 9.5, 22 9.25, 22 8.75" style="fill:rgb(67,53,46); fill-opacity:0.247058823529412;" />
<polygon points="3 9.25, 3.5 9.5, 3.5 10, 3 10.25, 2.5 10, 2.5 9.5" style="fill:rgb(235,207,185); fill-opacity:0.156862745098039;" />
<polygon points="4 9.25, 4.5 9.5, 4.5 10, 4 10.25, 3.5 10, 3.5 9.5" style="fill:rgb(227,199,178); fill-opacity:0.913725490196078;" />
<polygon points="5 9.25, 5.5 9.5, 5.5 10, 5 10.25, 4.5 10, 4.5 9.5" style="fill:rgb(211,187,168); fill-opacity:1;" />
<polygon points="6 9.25, 6.5 9.5, 6.5 10, 6 10.25, 5.5 10, 5.5 9.5" style="fill:rgb(146,170,169); fill-opacity:1;" />
<polygon points="7 9.25, 7.5 9.5, 7.5 10, 7 10.25, 6.5 10, 6.5 9.5" style="fill:rgb(200,182,168); fill-opacity:1;" />
<polygon points="8 9.25, 8.5 9.5, 8.5 10, 8 10.25, 7.5 10, 7.5 9.5" style="fill:rgb(223,198,179); fill-opacity:1;" />
<polygon points="9 9.25, 9.5 9.5, 9.5 10, 9 10.25, 8.5 10, 8.5 9.5" style="fill:rgb(229,198,176); fill-opacity:1;" />
<polygon points="10 9.25, 10.5 9.5, 10.5 10, 10 10.25, 9.5 10, 9.5 9.5" style="fill:rgb(216,204,187); fill-opacity:1;" />
<polygon points="11 9.25, 11.5 9.5, 11.5 10, 11 10.25, 10.5 10, 10.5 9.5" style="fill:rgb(211,204,186); fill-opacity:1;" />
<polygon points="12 9.25, 12.5 9.5, 12.5 10, 12 10.25, 11.5 10, 11.5 9.5" style="fill:rgb(236,205,183); fill-opacity:1;" />
<polygon points="13 9.25, 13.5 9.5, 13.5 10, 13 10.25, 12.5 10, 12.5 9.5" style="fill:rgb(233,205,184); fill-opacity:1;" />
<polygon points="14 9.25, 14.5 9.5, 14.5 10, 14 10.25, 13.5 10, 13.5 9.5" style="fill:rgb(235,207,185); fill-opacity:1;" />
<polygon points="15 9.25, 15.5 9.5, 15.5 10, 15 10.25, 14.5 10, 14.5 9.5" style="fill:rgb(240,211,189); fill-opacity:0.984313725490196;" />
<polygon points="16 9.25, 16.5 9.5, 16.5 10, 16 10.25, 15.5 10, 15.5 9.5" style="fill:rgb(227,200,179); fill-opacity:0.894117647058824;" />
<polygon points="17 9.25, 17.5 9.5, 17.5 10, 17 10.25, 16.5 10, 16.5 9.5" style="fill:rgb(226,200,183); fill-opacity:0.909803921568627;" />
<polygon points="18 9.25, 18.5 9.5, 18.5 10, 18 10.25, 17.5 10, 17.5 9.5" style="fill:rgb(233,208,191); fill-opacity:0.980392156862745;" />
<polygon points="19 9.25, 19.5 9.5, 19.5 10, 19 10.25, 18.5 10, 18.5 9.5" style="fill:rgb(242,213,193); fill-opacity:1;" />
<polygon points="20 9.25, 20.5 9.5, 20.5 10, 20 10.25, 19.5 10, 19.5 9.5" style="fill:rgb(215,189,168); fill-opacity:1;" />
<polygon points="21 9.25, 21.5 9.5, 21.5 10, 21 10.25, 20.5 10, 20.5 9.5" style="fill:rgb(193,169,151); fill-opacity:1;" />
<polygon points="22 9.25, 22.5 9.5, 22.5 10, 22 10.25, 21.5 10, 21.5 9.5" style="fill:rgb(191,167,149); fill-opacity:0.996078431372549;" />
<polygon points="23 9.25, 23.5 9.5, 23.5 10, 23 10.25, 22.5 10, 22.5 9.5" style="fill:rgb(101,88,79); fill-opacity:0.541176470588235;" />
<polygon points="24 9.25, 24.5 9.5, 24.5 10, 24 10.25, 23.5 10, 23.5 9.5" style="fill:rgb(196,188,181); fill-opacity:0.0313725490196078;" />
<polygon points="25 9.25, 25.5 9.5, 25.5 10, 25 10.25, 24.5 10, 24.5 9.5" style="fill:rgb(255,252,243); fill-opacity:0.0196078431372549;" />
<polygon points="26 9.25, 26.5 9.5, 26.5 10, 26 10.25, 25.5 10, 25.5 9.5" style="fill:rgb(242,224,210); fill-opacity:0.12156862745098;" />
<polygon points="27 9.25, 27.5 9.5, 27.5 10, 27 10.25, 26.5 10, 26.5 9.5" style="fill:rgb(250,233,221); fill-opacity:0.149019607843137;" />
<polygon points="28 9.25, 28.5 9.5, 28.5 10, 28 10.25, 27.5 10, 27.5 9.5" style="fill:rgb(179,164,153); fill-opacity:0.0470588235294118;" />
<polygon points="2.5 10, 3 10.25, 3 10.75, 2.5 11, 2 10.75, 2 10.25" style="fill:rgb(231,202,182); fill-opacity:0.572549019607843;" />
<polygon points="3.5 10, 4 10.25, 4 10.75, 3.5 11, 3 10.75, 3 10.25" style="fill:rgb(214,188,169); fill-opacity:1;" />
<polygon points="4.5 10, 5 10.25, 5 10.75, 4.5 11, 4 10.75, 4 10.25" style="fill:rgb(211,187,168); fill-opacity:1;" />
<polygon points="5.5 10, 6 10.25, 6 10.75, 5.5 11, 5 10.75, 5 10.25" style="fill:rgb(160,175,173); fill-opacity:1;" />
<polygon points="6.5 10, 7 10.25, 7 10.75, 6.5 11, 6 10.75, 6 10.25" style="fill:rgb(132,181,184); fill-opacity:1;" />
<polygon points="7.5 10, 8 10.25, 8 10.75, 7.5 11, 7 10.75, 7 10.25" style="fill:rgb(133,185,187); fill-opacity:1;" />
<polygon points="8.5 10, 9 10.25, 9 10.75, 8.5 11, 8 10.75, 8 10.25" style="fill:rgb(123,203,205); fill-opacity:1;" />
<polygon points="9.5 10, 10 10.25, 10 10.75, 9.5 11, 9 10.75, 9 10.25" style="fill:rgb(85,203,213); fill-opacity:1;" />
<polygon points="10.5 10, 11 10.25, 11 10.75, 10.5 11, 10 10.75, 10 10.25" style="fill:rgb(150,189,181); fill-opacity:1;" />
<polygon points="11.5 10, 12 10.25, 12 10.75, 11.5 11, 11 10.75, 11 10.25" style="fill:rgb(247,207,181); fill-opacity:1;" />
<polygon points="12.5 10, 13 10.25, 13 10.75, 12.5 11, 12 10.75, 12 10.25" style="fill:rgb(232,205,183); fill-opacity:1;" />
<polygon points="13.5 10, 14 10.25, 14 10.75, 13.5 11, 13 10.75, 13 10.25" style="fill:rgb(232,203,181); fill-opacity:1;" />
<polygon points="14.5 10, 15 10.25, 15 10.75, 14.5 11, 14 10.75, 14 10.25" style="fill:rgb(224,196,173); fill-opacity:1;" />
<polygon points="15.5 10, 16 10.25, 16 10.75, 15.5 11, 15 10.75, 15 10.25" style="fill:rgb(229,202,181); fill-opacity:1;" />
<polygon points="16.5 10, 17 10.25, 17 10.75, 16.5 11, 16 10.75, 16 10.25" style="fill:rgb(234,199,167); fill-opacity:1;" />
<polygon points="17.5 10, 18 10.25, 18 10.75, 17.5 11, 17 10.75, 17 10.25" style="fill:rgb(229,187,145); fill-opacity:1;" />
<polygon points="18.5 10, 19 10.25, 19 10.75, 18.5 11, 18 10.75, 18 10.25" style="fill:rgb(220,185,156); fill-opacity:1;" />
<polygon points="19.5 10, 20 10.25, 20 10.75, 19.5 11, 19 10.75, 19 10.25" style="fill:rgb(220,193,172); fill-opacity:1;" />
<polygon points="20.5 10, 21 10.25, 21 10.75, 20.5 11, 20 10.75, 20 10.25" style="fill:rgb(204,179,160); fill-opacity:1;" />
<polygon points="21.5 10, 22 10.25, 22 10.75, 21.5 11, 21 10.75, 21 10.25" style="fill:rgb(202,177,157); fill-opacity:1;" />
<polygon points="22.5 10, 23 10.25, 23 10.75, 22.5 11, 22 10.75, 22 10.25" style="fill:rgb(210,187,169); fill-opacity:0.984313725490196;" />
<polygon points="23.5 10, 24 10.25, 24 10.75, 23.5 11, 23 10.75, 23 10.25" style="fill:rgb(219,201,188); fill-opacity:0.737254901960784;" />
<polygon points="24.5 10, 25 10.25, 25 10.75, 24.5 11, 24 10.75, 24 10.25" style="fill:rgb(229,211,196); fill-opacity:0.733333333333333;" />
<polygon points="25.5 10, 26 10.25, 26 10.75, 25.5 11, 25 10.75, 25 10.25" style="fill:rgb(213,190,173); fill-opacity:0.874509803921569;" />
<polygon points="26.5 10, 27 10.25, 27 10.75, 26.5 11, 26 10.75, 26 10.25" style="fill:rgb(220,196,178); fill-opacity:0.901960784313726;" />
<polygon points="27.5 10, 28 10.25, 28 10.75, 27.5 11, 27 10.75, 27 10.25" style="fill:rgb(216,192,174); fill-opacity:0.788235294117647;" />
<polygon points="28.5 10, 29 10.25, 29 10.75, 28.5 11, 28 10.75, 28 10.25" style="fill:rgb(117,102,90); fill-opacity:0.333333333333333;" />
<polygon points="2 10.75, 2.5 11, 2.5 11.5, 2 11.75, 1.5 11.5, 1.5 11" style="fill:rgb(223,196,176); fill-opacity:0.125490196078431;" />
<polygon points="3 10.75, 3.5 11, 3.5 11.5, 3 11.75, 2.5 11.5, 2.5 11" style="fill:rgb(221,194,175); fill-opacity:0.894117647058824;" />
<polygon points="4 10.75, 4.5 11, 4.5 11.5, 4 11.75, 3.5 11.5, 3.5 11" style="fill:rgb(214,183,166); fill-opacity:1;" />
<polygon points="5 10.75, 5.5 11, 5.5 11.5, 5 11.75, 4.5 11.5, 4.5 11" style="fill:rgb(165,194,190); fill-opacity:1;" />
<polygon points="6 10.75, 6.5 11, 6.5 11.5, 6 11.75, 5.5 11.5, 5.5 11" style="fill:rgb(47,204,226); fill-opacity:1;" />
<polygon points="7 10.75, 7.5 11, 7.5 11.5, 7 11.75, 6.5 11.5, 6.5 11" style="fill:rgb(40,184,206); fill-opacity:1;" />
<polygon points="8 10.75, 8.5 11, 8.5 11.5, 8 11.75, 7.5 11.5, 7.5 11" style="fill:rgb(68,188,207); fill-opacity:1;" />
<polygon points="9 10.75, 9.5 11, 9.5 11.5, 9 11.75, 8.5 11.5, 8.5 11" style="fill:rgb(0,201,231); fill-opacity:1;" />
<polygon points="10 10.75, 10.5 11, 10.5 11.5, 10 11.75, 9.5 11.5, 9.5 11" style="fill:rgb(55,173,188); fill-opacity:1;" />
<polygon points="11 10.75, 11.5 11, 11.5 11.5, 11 11.75, 10.5 11.5, 10.5 11" style="fill:rgb(219,192,173); fill-opacity:1;" />
<polygon points="12 10.75, 12.5 11, 12.5 11.5, 12 11.75, 11.5 11.5, 11.5 11" style="fill:rgb(236,206,184); fill-opacity:1;" />
<polygon points="13 10.75, 13.5 11, 13.5 11.5, 13 11.75, 12.5 11.5, 12.5 11" style="fill:rgb(229,200,178); fill-opacity:1;" />
<polygon points="14 10.75, 14.5 11, 14.5 11.5, 14 11.75, 13.5 11.5, 13.5 11" style="fill:rgb(215,183,158); fill-opacity:1;" />
<polygon points="15 10.75, 15.5 11, 15.5 11.5, 15 11.75, 14.5 11.5, 14.5 11" style="fill:rgb(201,167,139); fill-opacity:1;" />
<polygon points="16 10.75, 16.5 11, 16.5 11.5, 16 11.75, 15.5 11.5, 15.5 11" style="fill:rgb(222,164,101); fill-opacity:1;" />
<polygon points="17 10.75, 17.5 11, 17.5 11.5, 17 11.75, 16.5 11.5, 16.5 11" style="fill:rgb(238,139,36); fill-opacity:1;" />
<polygon points="18 10.75, 18.5 11, 18.5 11.5, 18 11.75, 17.5 11.5, 17.5 11" style="fill:rgb(217,122,25); fill-opacity:1;" />
<polygon points="19 10.75, 19.5 11, 19.5 11.5, 19 11.75, 18.5 11.5, 18.5 11" style="fill:rgb(201,155,113); fill-opacity:1;" />
<polygon points="20 10.75, 20.5 11, 20.5 11.5, 20 11.75, 19.5 11.5, 19.5 11" style="fill:rgb(220,192,171); fill-opacity:1;" />
<polygon points="21 10.75, 21.5 11, 21.5 11.5, 21 11.75, 20.5 11.5, 20.5 11" style="fill:rgb(217,191,171); fill-opacity:1;" />
<polygon points="22 10.75, 22.5 11, 22.5 11.5, 22 11.75, 21.5 11.5, 21.5 11" style="fill:rgb(218,193,173); fill-opacity:1;" />
<polygon points="23 10.75, 23.5 11, 23.5 11.5, 23 11.75, 22.5 11.5, 22.5 11" style="fill:rgb(223,196,176); fill-opacity:1;" />
<polygon points="24 10.75, 24.5 11, 24.5 11.5, 24 11.75, 23.5 11.5, 23.5 11" style="fill:rgb(217,191,171); fill-opacity:1;" />
<polygon points="25 10.75, 25.5 11, 25.5 11.5, 25 11.75, 24.5 11.5, 24.5 11" style="fill:rgb(204,178,159); fill-opacity:1;" />
<polygon points="26 10.75, 26.5 11, 26.5 11.5, 26 11.75, 25.5 11.5, 25.5 11" style="fill:rgb(204,179,160); fill-opacity:1;" />
<polygon points="27 10.75, 27.5 11, 27.5 11.5, 27 11.75, 26.5 11.5, 26.5 11" style="fill:rgb(216,189,169); fill-opacity:1;" />
<polygon points="28 10.75, 28.5 11, 28.5 11.5, 28 11.75, 27.5 11.5, 27.5 11" style="fill:rgb(244,214,192); fill-opacity:1;" />
<polygon points="29 10.75, 29.5 11, 29.5 11.5, 29 11.75, 28.5 11.5, 28.5 11" style="fill:rgb(207,182,163); fill-opacity:0.952941176470588;" />
<polygon points="30 10.75, 30.5 11, 30.5 11.5, 30 11.75, 29.5 11.5, 29.5 11" style="fill:rgb(84,68,60); fill-opacity:0.235294117647059;" />
<polygon points="1.5 11.5, 2 11.75, 2 12.25, 1.5 12.5, 1 12.25, 1 11.75" style="fill:rgb(228,200,179); fill-opacity:0.396078431372549;" />
<polygon points="2.5 11.5, 3 11.75, 3 12.25, 2.5 12.5, 2 12.25, 2 11.75" style="fill:rgb(219,186,165); fill-opacity:1;" />
<polygon points="3.5 11.5, 4 11.75, 4 12.25, 3.5 12.5, 3 12.25, 3 11.75" style="fill:rgb(149,185,184); fill-opacity:1;" />
<polygon points="4.5 11.5, 5 11.75, 5 12.25, 4.5 12.5, 4 12.25, 4 11.75" style="fill:rgb(29,185,215); fill-opacity:1;" />
<polygon points="5.5 11.5, 6 11.75, 6 12.25, 5.5 12.5, 5 12.25, 5 11.75" style="fill:rgb(13,179,211); fill-opacity:1;" />
<polygon points="6.5 11.5, 7 11.75, 7 12.25, 6.5 12.5, 6 12.25, 6 11.75" style="fill:rgb(21,179,209); fill-opacity:1;" />
<polygon points="7.5 11.5, 8 11.75, 8 12.25, 7.5 12.5, 7 12.25, 7 11.75" style="fill:rgb(21,170,199); fill-opacity:1;" />
<polygon points="8.5 11.5, 9 11.75, 9 12.25, 8.5 12.5, 8 12.25, 8 11.75" style="fill:rgb(68,158,174); fill-opacity:1;" />
<polygon points="9.5 11.5, 10 11.75, 10 12.25, 9.5 12.5, 9 12.25, 9 11.75" style="fill:rgb(196,182,170); fill-opacity:1;" />
<polygon points="10.5 11.5, 11 11.75, 11 12.25, 10.5 12.5, 10 12.25, 10 11.75" style="fill:rgb(238,204,183); fill-opacity:1;" />
<polygon points="11.5 11.5, 12 11.75, 12 12.25, 11.5 12.5, 11 12.25, 11 11.75" style="fill:rgb(230,203,182); fill-opacity:1;" />
<polygon points="12.5 11.5, 13 11.75, 13 12.25, 12.5 12.5, 12 12.25, 12 11.75" style="fill:rgb(220,190,169); fill-opacity:1;" />
<polygon points="13.5 11.5, 14 11.75, 14 12.25, 13.5 12.5, 13 12.25, 13 11.75" style="fill:rgb(200,159,121); fill-opacity:1;" />
<polygon points="14.5 11.5, 15 11.75, 15 12.25, 14.5 12.5, 14 12.25, 14 11.75" style="fill:rgb(201,140,78); fill-opacity:1;" />
<polygon points="15.5 11.5, 16 11.75, 16 12.25, 15.5 12.5, 15 12.25, 15 11.75" style="fill:rgb(218,124,28); fill-opacity:1;" />
<polygon points="16.5 11.5, 17 11.75, 17 12.25, 16.5 12.5, 16 12.25, 16 11.75" style="fill:rgb(210,111,16); fill-opacity:1;" />
<polygon points="17.5 11.5, 18 11.75, 18 12.25, 17.5 12.5, 17 12.25, 17 11.75" style="fill:rgb(186,115,49); fill-opacity:1;" />
<polygon points="18.5 11.5, 19 11.75, 19 12.25, 18.5 12.5, 18 12.25, 18 11.75" style="fill:rgb(193,140,91); fill-opacity:1;" />
<polygon points="19.5 11.5, 20 11.75, 20 12.25, 19.5 12.5, 19 12.25, 19 11.75" style="fill:rgb(216,186,164); fill-opacity:1;" />
<polygon points="20.5 11.5, 21 11.75, 21 12.25, 20.5 12.5, 20 12.25, 20 11.75" style="fill:rgb(229,201,182); fill-opacity:1;" />
<polygon points="21.5 11.5, 22 11.75, 22 12.25, 21.5 12.5, 21 12.25, 21 11.75" style="fill:rgb(231,204,185); fill-opacity:1;" />
<polygon points="22.5 11.5, 23 11.75, 23 12.25, 22.5 12.5, 22 12.25, 22 11.75" style="fill:rgb(230,203,184); fill-opacity:1;" />
<polygon points="23.5 11.5, 24 11.75, 24 12.25, 23.5 12.5, 23 12.25, 23 11.75" style="fill:rgb(223,197,179); fill-opacity:1;" />
<polygon points="24.5 11.5, 25 11.75, 25 12.25, 24.5 12.5, 24 12.25, 24 11.75" style="fill:rgb(220,194,177); fill-opacity:1;" />
<polygon points="25.5 11.5, 26 11.75, 26 12.25, 25.5 12.5, 25 12.25, 25 11.75" style="fill:rgb(223,197,178); fill-opacity:1;" />
<polygon points="26.5 11.5, 27 11.75, 27 12.25, 26.5 12.5, 26 12.25, 26 11.75" style="fill:rgb(231,202,182); fill-opacity:1;" />
<polygon points="27.5 11.5, 28 11.75, 28 12.25, 27.5 12.5, 27 12.25, 27 11.75" style="fill:rgb(233,204,183); fill-opacity:1;" />
<polygon points="28.5 11.5, 29 11.75, 29 12.25, 28.5 12.5, 28 12.25, 28 11.75" style="fill:rgb(238,208,187); fill-opacity:1;" />
<polygon points="29.5 11.5, 30 11.75, 30 12.25, 29.5 12.5, 29 12.25, 29 11.75" style="fill:rgb(124,103,93); fill-opacity:0.580392156862745;" />
<polygon points="2 12.25, 2.5 12.5, 2.5 13, 2 13.25, 1.5 13, 1.5 12.5" style="fill:rgb(224,196,175); fill-opacity:0.654901960784314;" />
<polygon points="3 12.25, 3.5 12.5, 3.5 13, 3 13.25, 2.5 13, 2.5 12.5" style="fill:rgb(212,182,163); fill-opacity:1;" />
<polygon points="4 12.25, 4.5 12.5, 4.5 13, 4 13.25, 3.5 13, 3.5 12.5" style="fill:rgb(133,171,176); fill-opacity:1;" />
<polygon points="5 12.25, 5.5 12.5, 5.5 13, 5 13.25, 4.5 13, 4.5 12.5" style="fill:rgb(16,159,195); fill-opacity:1;" />
<polygon points="6 12.25, 6.5 12.5, 6.5 13, 6 13.25, 5.5 13, 5.5 12.5" style="fill:rgb(23,163,198); fill-opacity:1;" />
<polygon points="7 12.25, 7.5 12.5, 7.5 13, 7 13.25, 6.5 13, 6.5 12.5" style="fill:rgb(43,140,170); fill-opacity:1;" />
<polygon points="8 12.25, 8.5 12.5, 8.5 13, 8 13.25, 7.5 13, 7.5 12.5" style="fill:rgb(99,146,164); fill-opacity:1;" />
<polygon points="9 12.25, 9.5 12.5, 9.5 13, 9 13.25, 8.5 13, 8.5 12.5" style="fill:rgb(181,178,174); fill-opacity:1;" />
<polygon points="10 12.25, 10.5 12.5, 10.5 13, 10 13.25, 9.5 13, 9.5 12.5" style="fill:rgb(224,199,182); fill-opacity:1;" />
<polygon points="11 12.25, 11.5 12.5, 11.5 13, 11 13.25, 10.5 13, 10.5 12.5" style="fill:rgb(228,201,182); fill-opacity:1;" />
<polygon points="12 12.25, 12.5 12.5, 12.5 13, 12 13.25, 11.5 13, 11.5 12.5" style="fill:rgb(226,199,181); fill-opacity:1;" />
<polygon points="13 12.25, 13.5 12.5, 13.5 13, 13 13.25, 12.5 13, 12.5 12.5" style="fill:rgb(213,183,161); fill-opacity:1;" />
<polygon points="14 12.25, 14.5 12.5, 14.5 13, 14 13.25, 13.5 13, 13.5 12.5" style="fill:rgb(193,140,92); fill-opacity:1;" />
<polygon points="15 12.25, 15.5 12.5, 15.5 13, 15 13.25, 14.5 13, 14.5 12.5" style="fill:rgb(195,111,27); fill-opacity:1;" />
<polygon points="16 12.25, 16.5 12.5, 16.5 13, 16 13.25, 15.5 13, 15.5 12.5" style="fill:rgb(199,112,28); fill-opacity:1;" />
<polygon points="17 12.25, 17.5 12.5, 17.5 13, 17 13.25, 16.5 13, 16.5 12.5" style="fill:rgb(180,108,39); fill-opacity:1;" />
<polygon points="18 12.25, 18.5 12.5, 18.5 13, 18 13.25, 17.5 13, 17.5 12.5" style="fill:rgb(176,130,85); fill-opacity:1;" />
<polygon points="19 12.25, 19.5 12.5, 19.5 13, 19 13.25, 18.5 13, 18.5 12.5" style="fill:rgb(197,159,126); fill-opacity:1;" />
<polygon points="20 12.25, 20.5 12.5, 20.5 13, 20 13.25, 19.5 13, 19.5 12.5" style="fill:rgb(220,191,169); fill-opacity:1;" />
<polygon points="21 12.25, 21.5 12.5, 21.5 13, 21 13.25, 20.5 13, 20.5 12.5" style="fill:rgb(230,203,186); fill-opacity:1;" />
<polygon points="22 12.25, 22.5 12.5, 22.5 13, 22 13.25, 21.5 13, 21.5 12.5" style="fill:rgb(231,205,188); fill-opacity:1;" />
<polygon points="23 12.25, 23.5 12.5, 23.5 13, 23 13.25, 22.5 13, 22.5 12.5" style="fill:rgb(227,202,185); fill-opacity:1;" />
<polygon points="24 12.25, 24.5 12.5, 24.5 13, 24 13.25, 23.5 13, 23.5 12.5" style="fill:rgb(224,199,183); fill-opacity:1;" />
<polygon points="25 12.25, 25.5 12.5, 25.5 13, 25 13.25, 24.5 13, 24.5 12.5" style="fill:rgb(224,199,182); fill-opacity:1;" />
<polygon points="26 12.25, 26.5 12.5, 26.5 13, 26 13.25, 25.5 13, 25.5 12.5" style="fill:rgb(229,202,183); fill-opacity:1;" />
<polygon points="27 12.25, 27.5 12.5, 27.5 13, 27 13.25, 26.5 13, 26.5 12.5" style="fill:rgb(230,200,180); fill-opacity:1;" />
<polygon points="28 12.25, 28.5 12.5, 28.5 13, 28 13.25, 27.5 13, 27.5 12.5" style="fill:rgb(230,200,180); fill-opacity:1;" />
<polygon points="29 12.25, 29.5 12.5, 29.5 13, 29 13.25, 28.5 13, 28.5 12.5" style="fill:rgb(236,206,186); fill-opacity:1;" />
<polygon points="30 12.25, 30.5 12.5, 30.5 13, 30 13.25, 29.5 13, 29.5 12.5" style="fill:rgb(134,114,102); fill-opacity:0.713725490196078;" />
<polygon points="31 12.25, 31.5 12.5, 31.5 13, 31 13.25, 30.5 13, 30.5 12.5" style="fill:rgb(85,69,61); fill-opacity:0.00392156862745098;" />
<polygon points="1.5 13, 2 13.25, 2 13.75, 1.5 14, 1 13.75, 1 13.25" style="fill:rgb(216,187,168); fill-opacity:0.83921568627451;" />
<polygon points="2.5 13, 3 13.25, 3 13.75, 2.5 14, 2 13.75, 2 13.25" style="fill:rgb(199,174,158); fill-opacity:1;" />
<polygon points="3.5 13, 4 13.25, 4 13.75, 3.5 14, 3 13.75, 3 13.25" style="fill:rgb(164,166,163); fill-opacity:1;" />
<polygon points="4.5 13, 5 13.25, 5 13.75, 4.5 14, 4 13.75, 4 13.25" style="fill:rgb(49,151,186); fill-opacity:1;" />
<polygon points="5.5 13, 6 13.25, 6 13.75, 5.5 14, 5 13.75, 5 13.25" style="fill:rgb(17,142,186); fill-opacity:1;" />
<polygon points="6.5 13, 7 13.25, 7 13.75, 6.5 14, 6 13.75, 6 13.25" style="fill:rgb(58,137,168); fill-opacity:1;" />
<polygon points="7.5 13, 8 13.25, 8 13.75, 7.5 14, 7 13.75, 7 13.25" style="fill:rgb(137,165,178); fill-opacity:1;" />
<polygon points="8.5 13, 9 13.25, 9 13.75, 8.5 14, 8 13.75, 8 13.25" style="fill:rgb(190,185,179); fill-opacity:1;" />
<polygon points="9.5 13, 10 13.25, 10 13.75, 9.5 14, 9 13.75, 9 13.25" style="fill:rgb(225,198,180); fill-opacity:1;" />
<polygon points="10.5 13, 11 13.25, 11 13.75, 10.5 14, 10 13.75, 10 13.25" style="fill:rgb(226,199,181); fill-opacity:1;" />
<polygon points="11.5 13, 12 13.25, 12 13.75, 11.5 14, 11 13.75, 11 13.25" style="fill:rgb(221,195,178); fill-opacity:1;" />
<polygon points="12.5 13, 13 13.25, 13 13.75, 12.5 14, 12 13.75, 12 13.25" style="fill:rgb(213,179,153); fill-opacity:1;" />
<polygon points="13.5 13, 14 13.25, 14 13.75, 13.5 14, 13 13.75, 13 13.25" style="fill:rgb(185,140,99); fill-opacity:1;" />
<polygon points="14.5 13, 15 13.25, 15 13.75, 14.5 14, 14 13.75, 14 13.25" style="fill:rgb(174,113,51); fill-opacity:1;" />
<polygon points="15.5 13, 16 13.25, 16 13.75, 15.5 14, 15 13.75, 15 13.25" style="fill:rgb(166,98,31); fill-opacity:1;" />
<polygon points="16.5 13, 17 13.25, 17 13.75, 16.5 14, 16 13.75, 16 13.25" style="fill:rgb(170,122,77); fill-opacity:1;" />
<polygon points="17.5 13, 18 13.25, 18 13.75, 17.5 14, 17 13.75, 17 13.25" style="fill:rgb(190,153,119); fill-opacity:1;" />
<polygon points="18.5 13, 19 13.25, 19 13.75, 18.5 14, 18 13.75, 18 13.25" style="fill:rgb(209,177,152); fill-opacity:1;" />
<polygon points="19.5 13, 20 13.25, 20 13.75, 19.5 14, 19 13.75, 19 13.25" style="fill:rgb(225,200,182); fill-opacity:1;" />
<polygon points="20.5 13, 21 13.25, 21 13.75, 20.5 14, 20 13.75, 20 13.25" style="fill:rgb(230,206,190); fill-opacity:1;" />
<polygon points="21.5 13, 22 13.25, 22 13.75, 21.5 14, 21 13.75, 21 13.25" style="fill:rgb(229,205,190); fill-opacity:1;" />
<polygon points="22.5 13, 23 13.25, 23 13.75, 22.5 14, 22 13.75, 22 13.25" style="fill:rgb(225,202,187); fill-opacity:1;" />
<polygon points="23.5 13, 24 13.25, 24 13.75, 23.5 14, 23 13.75, 23 13.25" style="fill:rgb(223,199,183); fill-opacity:1;" />
<polygon points="24.5 13, 25 13.25, 25 13.75, 24.5 14, 24 13.75, 24 13.25" style="fill:rgb(226,198,179); fill-opacity:1;" />
<polygon points="25.5 13, 26 13.25, 26 13.75, 25.5 14, 25 13.75, 25 13.25" style="fill:rgb(226,196,177); fill-opacity:1;" />
<polygon points="26.5 13, 27 13.25, 27 13.75, 26.5 14, 26 13.75, 26 13.25" style="fill:rgb(225,195,175); fill-opacity:1;" />
<polygon points="27.5 13, 28 13.25, 28 13.75, 27.5 14, 27 13.75, 27 13.25" style="fill:rgb(226,197,176); fill-opacity:1;" />
<polygon points="28.5 13, 29 13.25, 29 13.75, 28.5 14, 28 13.75, 28 13.25" style="fill:rgb(231,201,180); fill-opacity:1;" />
<polygon points="29.5 13, 30 13.25, 30 13.75, 29.5 14, 29 13.75, 29 13.25" style="fill:rgb(128,108,97); fill-opacity:0.690196078431373;" />
<polygon points="30.5 13, 31 13.25, 31 13.75, 30.5 14, 30 13.75, 30 13.25" style="fill:rgb(84,68,60); fill-opacity:0.00392156862745098;" />
<polygon points="2 13.75, 2.5 14, 2.5 14.5, 2 14.75, 1.5 14.5, 1.5 14" style="fill:rgb(208,180,161); fill-opacity:0.917647058823529;" />
<polygon points="3 13.75, 3.5 14, 3.5 14.5, 3 14.75, 2.5 14.5, 2.5 14" style="fill:rgb(186,161,144); fill-opacity:1;" />
<polygon points="4 13.75, 4.5 14, 4.5 14.5, 4 14.75, 3.5 14.5, 3.5 14" style="fill:rgb(107,148,164); fill-opacity:1;" />
<polygon points="5 13.75, 5.5 14, 5.5 14.5, 5 14.75, 4.5 14.5, 4.5 14" style="fill:rgb(21,123,172); fill-opacity:1;" />
<polygon points="6 13.75, 6.5 14, 6.5 14.5, 6 14.75, 5.5 14.5, 5.5 14" style="fill:rgb(16,120,169); fill-opacity:1;" />
<polygon points="7 13.75, 7.5 14, 7.5 14.5, 7 14.75, 6.5 14.5, 6.5 14" style="fill:rgb(44,126,164); fill-opacity:1;" />
<polygon points="8 13.75, 8.5 14, 8.5 14.5, 8 14.75, 7.5 14.5, 7.5 14" style="fill:rgb(157,170,170); fill-opacity:1;" />
<polygon points="9 13.75, 9.5 14, 9.5 14.5, 9 14.75, 8.5 14.5, 8.5 14" style="fill:rgb(207,190,177); fill-opacity:1;" />
<polygon points="10 13.75, 10.5 14, 10.5 14.5, 10 14.75, 9.5 14.5, 9.5 14" style="fill:rgb(226,196,178); fill-opacity:1;" />
<polygon points="11 13.75, 11.5 14, 11.5 14.5, 11 14.75, 10.5 14.5, 10.5 14" style="fill:rgb(220,193,176); fill-opacity:1;" />
<polygon points="12 13.75, 12.5 14, 12.5 14.5, 12 14.75, 11.5 14.5, 11.5 14" style="fill:rgb(225,198,181); fill-opacity:1;" />
<polygon points="13 13.75, 13.5 14, 13.5 14.5, 13 14.75, 12.5 14.5, 12.5 14" style="fill:rgb(217,186,164); fill-opacity:1;" />
<polygon points="14 13.75, 14.5 14, 14.5 14.5, 14 14.75, 13.5 14.5, 13.5 14" style="fill:rgb(196,156,119); fill-opacity:1;" />
<polygon points="15 13.75, 15.5 14, 15.5 14.5, 15 14.75, 14.5 14.5, 14.5 14" style="fill:rgb(162,114,69); fill-opacity:1;" />
<polygon points="16 13.75, 16.5 14, 16.5 14.5, 16 14.75, 15.5 14.5, 15.5 14" style="fill:rgb(164,124,88); fill-opacity:1;" />
<polygon points="17 13.75, 17.5 14, 17.5 14.5, 17 14.75, 16.5 14.5, 16.5 14" style="fill:rgb(203,174,151); fill-opacity:1;" />
<polygon points="18 13.75, 18.5 14, 18.5 14.5, 18 14.75, 17.5 14.5, 17.5 14" style="fill:rgb(222,195,177); fill-opacity:1;" />
<polygon points="19 13.75, 19.5 14, 19.5 14.5, 19 14.75, 18.5 14.5, 18.5 14" style="fill:rgb(224,200,182); fill-opacity:1;" />
<polygon points="20 13.75, 20.5 14, 20.5 14.5, 20 14.75, 19.5 14.5, 19.5 14" style="fill:rgb(230,206,191); fill-opacity:1;" />
<polygon points="21 13.75, 21.5 14, 21.5 14.5, 21 14.75, 20.5 14.5, 20.5 14" style="fill:rgb(229,206,193); fill-opacity:1;" />
<polygon points="22 13.75, 22.5 14, 22.5 14.5, 22 14.75, 21.5 14.5, 21.5 14" style="fill:rgb(222,200,184); fill-opacity:1;" />
<polygon points="23 13.75, 23.5 14, 23.5 14.5, 23 14.75, 22.5 14.5, 22.5 14" style="fill:rgb(217,192,175); fill-opacity:1;" />
<polygon points="24 13.75, 24.5 14, 24.5 14.5, 24 14.75, 23.5 14.5, 23.5 14" style="fill:rgb(220,190,172); fill-opacity:1;" />
<polygon points="25 13.75, 25.5 14, 25.5 14.5, 25 14.75, 24.5 14.5, 24.5 14" style="fill:rgb(224,192,172); fill-opacity:1;" />
<polygon points="26 13.75, 26.5 14, 26.5 14.5, 26 14.75, 25.5 14.5, 25.5 14" style="fill:rgb(223,193,173); fill-opacity:1;" />
<polygon points="27 13.75, 27.5 14, 27.5 14.5, 27 14.75, 26.5 14.5, 26.5 14" style="fill:rgb(223,193,173); fill-opacity:1;" />
<polygon points="28 13.75, 28.5 14, 28.5 14.5, 28 14.75, 27.5 14.5, 27.5 14" style="fill:rgb(226,195,175); fill-opacity:1;" />
<polygon points="29 13.75, 29.5 14, 29.5 14.5, 29 14.75, 28.5 14.5, 28.5 14" style="fill:rgb(221,191,172); fill-opacity:1;" />
<polygon points="30 13.75, 30.5 14, 30.5 14.5, 30 14.75, 29.5 14.5, 29.5 14" style="fill:rgb(113,93,83); fill-opacity:0.576470588235294;" />
<polygon points="1.5 14.5, 2 14.75, 2 15.25, 1.5 15.5, 1 15.25, 1 14.75" style="fill:rgb(201,172,154); fill-opacity:0.929411764705882;" />
<polygon points="2.5 14.5, 3 14.75, 3 15.25, 2.5 15.5, 2 15.25, 2 14.75" style="fill:rgb(174,152,136); fill-opacity:1;" />
<polygon points="3.5 14.5, 4 14.75, 4 15.25, 3.5 15.5, 3 15.25, 3 14.75" style="fill:rgb(76,117,141); fill-opacity:1;" />
<polygon points="4.5 14.5, 5 14.75, 5 15.25, 4.5 15.5, 4 15.25, 4 14.75" style="fill:rgb(78,120,142); fill-opacity:1;" />
<polygon points="5.5 14.5, 6 14.75, 6 15.25, 5.5 15.5, 5 15.25, 5 14.75" style="fill:rgb(70,126,156); fill-opacity:1;" />
<polygon points="6.5 14.5, 7 14.75, 7 15.25, 6.5 15.5, 6 15.25, 6 14.75" style="fill:rgb(80,124,147); fill-opacity:1;" />
<polygon points="7.5 14.5, 8 14.75, 8 15.25, 7.5 15.5, 7 15.25, 7 14.75" style="fill:rgb(189,179,169); fill-opacity:1;" />
<polygon points="8.5 14.5, 9 14.75, 9 15.25, 8.5 15.5, 8 15.25, 8 14.75" style="fill:rgb(217,190,172); fill-opacity:1;" />
<polygon points="9.5 14.5, 10 14.75, 10 15.25, 9.5 15.5, 9 15.25, 9 14.75" style="fill:rgb(219,190,172); fill-opacity:1;" />
<polygon points="10.5 14.5, 11 14.75, 11 15.25, 10.5 15.5, 10 15.25, 10 14.75" style="fill:rgb(222,193,177); fill-opacity:1;" />
<polygon points="11.5 14.5, 12 14.75, 12 15.25, 11.5 15.5, 11 15.25, 11 14.75" style="fill:rgb(225,196,179); fill-opacity:1;" />
<polygon points="12.5 14.5, 13 14.75, 13 15.25, 12.5 15.5, 12 15.25, 12 14.75" style="fill:rgb(218,190,169); fill-opacity:1;" />
<polygon points="13.5 14.5, 14 14.75, 14 15.25, 13.5 15.5, 13 15.25, 13 14.75" style="fill:rgb(212,180,158); fill-opacity:1;" />
<polygon points="14.5 14.5, 15 14.75, 15 15.25, 14.5 15.5, 14 15.25, 14 14.75" style="fill:rgb(201,169,146); fill-opacity:1;" />
<polygon points="15.5 14.5, 16 14.75, 16 15.25, 15.5 15.5, 15 15.25, 15 14.75" style="fill:rgb(216,189,169); fill-opacity:1;" />
<polygon points="16.5 14.5, 17 14.75, 17 15.25, 16.5 15.5, 16 15.25, 16 14.75" style="fill:rgb(223,198,181); fill-opacity:1;" />
<polygon points="17.5 14.5, 18 14.75, 18 15.25, 17.5 15.5, 17 15.25, 17 14.75" style="fill:rgb(222,197,182); fill-opacity:1;" />
<polygon points="18.5 14.5, 19 14.75, 19 15.25, 18.5 15.5, 18 15.25, 18 14.75" style="fill:rgb(224,198,183); fill-opacity:1;" />
<polygon points="19.5 14.5, 20 14.75, 20 15.25, 19.5 15.5, 19 15.25, 19 14.75" style="fill:rgb(222,194,179); fill-opacity:1;" />
<polygon points="20.5 14.5, 21 14.75, 21 15.25, 20.5 15.5, 20 15.25, 20 14.75" style="fill:rgb(214,183,169); fill-opacity:1;" />
<polygon points="21.5 14.5, 22 14.75, 22 15.25, 21.5 15.5, 21 15.25, 21 14.75" style="fill:rgb(209,173,160); fill-opacity:1;" />
<polygon points="22.5 14.5, 23 14.75, 23 15.25, 22.5 15.5, 22 15.25, 22 14.75" style="fill:rgb(210,178,161); fill-opacity:1;" />
<polygon points="23.5 14.5, 24 14.75, 24 15.25, 23.5 15.5, 23 15.25, 23 14.75" style="fill:rgb(219,193,170); fill-opacity:1;" />
<polygon points="24.5 14.5, 25 14.75, 25 15.25, 24.5 15.5, 24 15.25, 24 14.75" style="fill:rgb(221,189,171); fill-opacity:1;" />
<polygon points="25.5 14.5, 26 14.75, 26 15.25, 25.5 15.5, 25 15.25, 25 14.75" style="fill:rgb(221,189,171); fill-opacity:1;" />
<polygon points="26.5 14.5, 27 14.75, 27 15.25, 26.5 15.5, 26 15.25, 26 14.75" style="fill:rgb(219,189,170); fill-opacity:1;" />
<polygon points="27.5 14.5, 28 14.75, 28 15.25, 27.5 15.5, 27 15.25, 27 14.75" style="fill:rgb(227,195,176); fill-opacity:1;" />
<polygon points="28.5 14.5, 29 14.75, 29 15.25, 28.5 15.5, 28 15.25, 28 14.75" style="fill:rgb(198,170,153); fill-opacity:0.996078431372549;" />
<polygon points="29.5 14.5, 30 14.75, 30 15.25, 29.5 15.5, 29 15.25, 29 14.75" style="fill:rgb(98,81,71); fill-opacity:0.356862745098039;" />
<polygon points="2 15.25, 2.5 15.5, 2.5 16, 2 16.25, 1.5 16, 1.5 15.5" style="fill:rgb(198,168,151); fill-opacity:0.929411764705882;" />
<polygon points="3 15.25, 3.5 15.5, 3.5 16, 3 16.25, 2.5 16, 2.5 15.5" style="fill:rgb(168,146,131); fill-opacity:1;" />
<polygon points="4 15.25, 4.5 15.5, 4.5 16, 4 16.25, 3.5 16, 3.5 15.5" style="fill:rgb(131,123,118); fill-opacity:1;" />
<polygon points="5 15.25, 5.5 15.5, 5.5 16, 5 16.25, 4.5 16, 4.5 15.5" style="fill:rgb(156,149,143); fill-opacity:1;" />
<polygon points="6 15.25, 6.5 15.5, 6.5 16, 6 16.25, 5.5 16, 5.5 15.5" style="fill:rgb(168,166,161); fill-opacity:1;" />
<polygon points="7 15.25, 7.5 15.5, 7.5 16, 7 16.25, 6.5 16, 6.5 15.5" style="fill:rgb(185,171,161); fill-opacity:1;" />
<polygon points="8 15.25, 8.5 15.5, 8.5 16, 8 16.25, 7.5 16, 7.5 15.5" style="fill:rgb(203,179,161); fill-opacity:1;" />
<polygon points="9 15.25, 9.5 15.5, 9.5 16, 9 16.25, 8.5 16, 8.5 15.5" style="fill:rgb(208,178,159); fill-opacity:1;" />
<polygon points="10 15.25, 10.5 15.5, 10.5 16, 10 16.25, 9.5 16, 9.5 15.5" style="fill:rgb(200,173,153); fill-opacity:1;" />
<polygon points="11 15.25, 11.5 15.5, 11.5 16, 11 16.25, 10.5 16, 10.5 15.5" style="fill:rgb(199,174,150); fill-opacity:1;" />
<polygon points="12 15.25, 12.5 15.5, 12.5 16, 12 16.25, 11.5 16, 11.5 15.5" style="fill:rgb(206,180,156); fill-opacity:1;" />
<polygon points="13 15.25, 13.5 15.5, 13.5 16, 13 16.25, 12.5 16, 12.5 15.5" style="fill:rgb(214,183,167); fill-opacity:1;" />
<polygon points="14 15.25, 14.5 15.5, 14.5 16, 14 16.25, 13.5 16, 13.5 15.5" style="fill:rgb(213,186,164); fill-opacity:1;" />
<polygon points="15 15.25, 15.5 15.5, 15.5 16, 15 16.25, 14.5 16, 14.5 15.5" style="fill:rgb(214,188,165); fill-opacity:1;" />
<polygon points="16 15.25, 16.5 15.5, 16.5 16, 16 16.25, 15.5 16, 15.5 15.5" style="fill:rgb(214,185,168); fill-opacity:1;" />
<polygon points="17 15.25, 17.5 15.5, 17.5 16, 17 16.25, 16.5 16, 16.5 15.5" style="fill:rgb(215,185,168); fill-opacity:1;" />
<polygon points="18 15.25, 18.5 15.5, 18.5 16, 18 16.25, 17.5 16, 17.5 15.5" style="fill:rgb(215,186,168); fill-opacity:1;" />
<polygon points="19 15.25, 19.5 15.5, 19.5 16, 19 16.25, 18.5 16, 18.5 15.5" style="fill:rgb(215,182,166); fill-opacity:1;" />
<polygon points="20 15.25, 20.5 15.5, 20.5 16, 20 16.25, 19.5 16, 19.5 15.5" style="fill:rgb(209,172,159); fill-opacity:1;" />
<polygon points="21 15.25, 21.5 15.5, 21.5 16, 21 16.25, 20.5 16, 20.5 15.5" style="fill:rgb(201,154,151); fill-opacity:1;" />
<polygon points="22 15.25, 22.5 15.5, 22.5 16, 22 16.25, 21.5 16, 21.5 15.5" style="fill:rgb(200,149,149); fill-opacity:1;" />
<polygon points="23 15.25, 23.5 15.5, 23.5 16, 23 16.25, 22.5 16, 22.5 15.5" style="fill:rgb(214,141,161); fill-opacity:1;" />
<polygon points="24 15.25, 24.5 15.5, 24.5 16, 24 16.25, 23.5 16, 23.5 15.5" style="fill:rgb(221,134,163); fill-opacity:1;" />
<polygon points="25 15.25, 25.5 15.5, 25.5 16, 25 16.25, 24.5 16, 24.5 15.5" style="fill:rgb(216,183,166); fill-opacity:1;" />
<polygon points="26 15.25, 26.5 15.5, 26.5 16, 26 16.25, 25.5 16, 25.5 15.5" style="fill:rgb(217,185,168); fill-opacity:1;" />
<polygon points="27 15.25, 27.5 15.5, 27.5 16, 27 16.25, 26.5 16, 26.5 15.5" style="fill:rgb(216,185,167); fill-opacity:1;" />
<polygon points="28 15.25, 28.5 15.5, 28.5 16, 28 16.25, 27.5 16, 27.5 15.5" style="fill:rgb(229,197,177); fill-opacity:1;" />
<polygon points="29 15.25, 29.5 15.5, 29.5 16, 29 16.25, 28.5 16, 28.5 15.5" style="fill:rgb(155,132,118); fill-opacity:0.882352941176471;" />
<polygon points="30 15.25, 30.5 15.5, 30.5 16, 30 16.25, 29.5 16, 29.5 15.5" style="fill:rgb(74,60,52); fill-opacity:0.105882352941176;" />
<polygon points="1.5 16, 2 16.25, 2 16.75, 1.5 17, 1 16.75, 1 16.25" style="fill:rgb(197,168,151); fill-opacity:0.905882352941176;" />
<polygon points="2.5 16, 3 16.25, 3 16.75, 2.5 17, 2 16.75, 2 16.25" style="fill:rgb(167,144,130); fill-opacity:1;" />
<polygon points="3.5 16, 4 16.25, 4 16.75, 3.5 17, 3 16.75, 3 16.25" style="fill:rgb(150,128,115); fill-opacity:1;" />
<polygon points="4.5 16, 5 16.25, 5 16.75, 4.5 17, 4 16.75, 4 16.25" style="fill:rgb(163,143,131); fill-opacity:1;" />
<polygon points="5.5 16, 6 16.25, 6 16.75, 5.5 17, 5 16.75, 5 16.25" style="fill:rgb(196,170,154); fill-opacity:1;" />
<polygon points="6.5 16, 7 16.25, 7 16.75, 6.5 17, 6 16.75, 6 16.25" style="fill:rgb(203,176,158); fill-opacity:1;" />
<polygon points="7.5 16, 8 16.25, 8 16.75, 7.5 17, 7 16.75, 7 16.25" style="fill:rgb(199,170,151); fill-opacity:1;" />
<polygon points="8.5 16, 9 16.25, 9 16.75, 8.5 17, 8 16.75, 8 16.25" style="fill:rgb(180,158,132); fill-opacity:1;" />
<polygon points="9.5 16, 10 16.25, 10 16.75, 9.5 17, 9 16.75, 9 16.25" style="fill:rgb(164,153,108); fill-opacity:1;" />
<polygon points="10.5 16, 11 16.25, 11 16.75, 10.5 17, 10 16.75, 10 16.25" style="fill:rgb(155,147,96); fill-opacity:1;" />
<polygon points="11.5 16, 12 16.25, 12 16.75, 11.5 17, 11 16.75, 11 16.25" style="fill:rgb(163,149,111); fill-opacity:1;" />
<polygon points="12.5 16, 13 16.25, 13 16.75, 12.5 17, 12 16.75, 12 16.25" style="fill:rgb(200,178,148); fill-opacity:1;" />
<polygon points="13.5 16, 14 16.25, 14 16.75, 13.5 17, 13 16.75, 13 16.25" style="fill:rgb(175,172,112); fill-opacity:1;" />
<polygon points="14.5 16, 15 16.25, 15 16.75, 14.5 17, 14 16.75, 14 16.25" style="fill:rgb(193,168,145); fill-opacity:1;" />
<polygon points="15.5 16, 16 16.25, 16 16.75, 15.5 17, 15 16.75, 15 16.25" style="fill:rgb(214,182,166); fill-opacity:1;" />
<polygon points="16.5 16, 17 16.25, 17 16.75, 16.5 17, 16 16.75, 16 16.25" style="fill:rgb(212,181,163); fill-opacity:1;" />
<polygon points="17.5 16, 18 16.25, 18 16.75, 17.5 17, 17 16.75, 17 16.25" style="fill:rgb(213,182,164); fill-opacity:1;" />
<polygon points="18.5 16, 19 16.25, 19 16.75, 18.5 17, 18 16.75, 18 16.25" style="fill:rgb(208,175,160); fill-opacity:1;" />
<polygon points="19.5 16, 20 16.25, 20 16.75, 19.5 17, 19 16.75, 19 16.25" style="fill:rgb(201,156,152); fill-opacity:1;" />
<polygon points="20.5 16, 21 16.25, 21 16.75, 20.5 17, 20 16.75, 20 16.25" style="fill:rgb(193,125,141); fill-opacity:1;" />
<polygon points="21.5 16, 22 16.25, 22 16.75, 21.5 17, 21 16.75, 21 16.25" style="fill:rgb(191,111,137); fill-opacity:1;" />
<polygon points="22.5 16, 23 16.25, 23 16.75, 22.5 17, 22 16.75, 22 16.25" style="fill:rgb(223,68,157); fill-opacity:1;" />
<polygon points="23.5 16, 24 16.25, 24 16.75, 23.5 17, 23 16.75, 23 16.25" style="fill:rgb(202,43,133); fill-opacity:1;" />
<polygon points="24.5 16, 25 16.25, 25 16.75, 24.5 17, 24 16.75, 24 16.25" style="fill:rgb(189,139,144); fill-opacity:1;" />
<polygon points="25.5 16, 26 16.25, 26 16.75, 25.5 17, 25 16.75, 25 16.25" style="fill:rgb(213,182,165); fill-opacity:1;" />
<polygon points="26.5 16, 27 16.25, 27 16.75, 26.5 17, 26 16.75, 26 16.25" style="fill:rgb(218,187,169); fill-opacity:1;" />
<polygon points="27.5 16, 28 16.25, 28 16.75, 27.5 17, 27 16.75, 27 16.25" style="fill:rgb(219,187,169); fill-opacity:1;" />
<polygon points="28.5 16, 29 16.25, 29 16.75, 28.5 17, 28 16.75, 28 16.25" style="fill:rgb(73,60,55); fill-opacity:0.545098039215686;" />
<polygon points="30.5 16, 31 16.25, 31 16.75, 30.5 17, 30 16.75, 30 16.25" style="fill:rgb(0,0,0); fill-opacity:0.0117647058823529;" />
<polygon points="31.5 16, 32 16.25, 32 16.75, 31.5 17, 31 16.75, 31 16.25" style="fill:rgb(0,0,0); fill-opacity:0.00392156862745098;" />
<polygon points="2 16.75, 2.5 17, 2.5 17.5, 2 17.75, 1.5 17.5, 1.5 17" style="fill:rgb(203,174,157); fill-opacity:0.756862745098039;" />
<polygon points="3 16.75, 3.5 17, 3.5 17.5, 3 17.75, 2.5 17.5, 2.5 17" style="fill:rgb(170,145,131); fill-opacity:1;" />
<polygon points="4 16.75, 4.5 17, 4.5 17.5, 4 17.75, 3.5 17.5, 3.5 17" style="fill:rgb(157,132,119); fill-opacity:1;" />
<polygon points="5 16.75, 5.5 17, 5.5 17.5, 5 17.75, 4.5 17.5, 4.5 17" style="fill:rgb(163,139,125); fill-opacity:1;" />
<polygon points="6 16.75, 6.5 17, 6.5 17.5, 6 17.75, 5.5 17.5, 5.5 17" style="fill:rgb(192,164,147); fill-opacity:1;" />
<polygon points="7 16.75, 7.5 17, 7.5 17.5, 7 17.75, 6.5 17.5, 6.5 17" style="fill:rgb(197,168,151); fill-opacity:1;" />
<polygon points="8 16.75, 8.5 17, 8.5 17.5, 8 17.75, 7.5 17.5, 7.5 17" style="fill:rgb(186,162,138); fill-opacity:1;" />
<polygon points="9 16.75, 9.5 17, 9.5 17.5, 9 17.75, 8.5 17.5, 8.5 17" style="fill:rgb(167,171,93); fill-opacity:1;" />
<polygon points="10 16.75, 10.5 17, 10.5 17.5, 10 17.75, 9.5 17.5, 9.5 17" style="fill:rgb(156,173,72); fill-opacity:1;" />
<polygon points="11 16.75, 11.5 17, 11.5 17.5, 11 17.75, 10.5 17.5, 10.5 17" style="fill:rgb(156,171,74); fill-opacity:1;" />
<polygon points="12 16.75, 12.5 17, 12.5 17.5, 12 17.75, 11.5 17.5, 11.5 17" style="fill:rgb(155,165,82); fill-opacity:1;" />
<polygon points="13 16.75, 13.5 17, 13.5 17.5, 13 17.75, 12.5 17.5, 12.5 17" style="fill:rgb(154,161,82); fill-opacity:1;" />
<polygon points="14 16.75, 14.5 17, 14.5 17.5, 14 17.75, 13.5 17.5, 13.5 17" style="fill:rgb(168,152,117); fill-opacity:1;" />
<polygon points="15 16.75, 15.5 17, 15.5 17.5, 15 17.75, 14.5 17.5, 14.5 17" style="fill:rgb(210,178,164); fill-opacity:1;" />
<polygon points="16 16.75, 16.5 17, 16.5 17.5, 16 17.75, 15.5 17.5, 15.5 17" style="fill:rgb(210,179,162); fill-opacity:1;" />
<polygon points="17 16.75, 17.5 17, 17.5 17.5, 17 17.75, 16.5 17.5, 16.5 17" style="fill:rgb(211,180,162); fill-opacity:1;" />
<polygon points="18 16.75, 18.5 17, 18.5 17.5, 18 17.75, 17.5 17.5, 17.5 17" style="fill:rgb(208,177,160); fill-opacity:1;" />
<polygon points="19 16.75, 19.5 17, 19.5 17.5, 19 17.75, 18.5 17.5, 18.5 17" style="fill:rgb(202,167,155); fill-opacity:1;" />
<polygon points="20 16.75, 20.5 17, 20.5 17.5, 20 17.75, 19.5 17.5, 19.5 17" style="fill:rgb(194,139,144); fill-opacity:1;" />
<polygon points="21 16.75, 21.5 17, 21.5 17.5, 21 17.75, 20.5 17.5, 20.5 17" style="fill:rgb(189,101,133); fill-opacity:1;" />
<polygon points="22 16.75, 22.5 17, 22.5 17.5, 22 17.75, 21.5 17.5, 21.5 17" style="fill:rgb(197,79,141); fill-opacity:1;" />
<polygon points="23 16.75, 23.5 17, 23.5 17.5, 23 17.75, 22.5 17.5, 22.5 17" style="fill:rgb(188,34,127); fill-opacity:1;" />
<polygon points="24 16.75, 24.5 17, 24.5 17.5, 24 17.75, 23.5 17.5, 23.5 17" style="fill:rgb(169,61,114); fill-opacity:1;" />
<polygon points="25 16.75, 25.5 17, 25.5 17.5, 25 17.75, 24.5 17.5, 24.5 17" style="fill:rgb(188,140,142); fill-opacity:1;" />
<polygon points="26 16.75, 26.5 17, 26.5 17.5, 26 17.75, 25.5 17.5, 25.5 17" style="fill:rgb(210,177,162); fill-opacity:1;" />
<polygon points="27 16.75, 27.5 17, 27.5 17.5, 27 17.75, 26.5 17.5, 26.5 17" style="fill:rgb(223,191,172); fill-opacity:1;" />
<polygon points="28 16.75, 28.5 17, 28.5 17.5, 28 17.75, 27.5 17.5, 27.5 17" style="fill:rgb(147,123,111); fill-opacity:0.905882352941176;" />
<polygon points="29 16.75, 29.5 17, 29.5 17.5, 29 17.75, 28.5 17.5, 28.5 17" style="fill:rgb(8,6,5); fill-opacity:0.254901960784314;" />
<polygon points="30 16.75, 30.5 17, 30.5 17.5, 30 17.75, 29.5 17.5, 29.5 17" style="fill:rgb(0,0,0); fill-opacity:0.105882352941176;" />
<polygon points="31 16.75, 31.5 17, 31.5 17.5, 31 17.75, 30.5 17.5, 30.5 17" style="fill:rgb(0,0,0); fill-opacity:0.101960784313725;" />
<polygon points="32 16.75, 32.5 17, 32.5 17.5, 32 17.75, 31.5 17.5, 31.5 17" style="fill:rgb(0,0,0); fill-opacity:0.0588235294117647;" />
<polygon points="1.5 17.5, 2 17.75, 2 18.25, 1.5 18.5, 1 18.25, 1 17.75" style="fill:rgb(213,181,164); fill-opacity:0.454901960784314;" />
<polygon points="2.5 17.5, 3 17.75, 3 18.25, 2.5 18.5, 2 18.25, 2 17.75" style="fill:rgb(176,149,134); fill-opacity:1;" />
<polygon points="3.5 17.5, 4 17.75, 4 18.25, 3.5 18.5, 3 18.25, 3 17.75" style="fill:rgb(167,141,127); fill-opacity:1;" />
<polygon points="4.5 17.5, 5 17.75, 5 18.25, 4.5 18.5, 4 18.25, 4 17.75" style="fill:rgb(173,146,132); fill-opacity:1;" />
<polygon points="5.5 17.5, 6 17.75, 6 18.25, 5.5 18.5, 5 18.25, 5 17.75" style="fill:rgb(188,159,143); fill-opacity:1;" />
<polygon points="6.5 17.5, 7 17.75, 7 18.25, 6.5 18.5, 6 18.25, 6 17.75" style="fill:rgb(187,159,141); fill-opacity:1;" />
<polygon points="7.5 17.5, 8 17.75, 8 18.25, 7.5 18.5, 7 18.25, 7 17.75" style="fill:rgb(163,157,101); fill-opacity:1;" />
<polygon points="8.5 17.5, 9 17.75, 9 18.25, 8.5 18.5, 8 18.25, 8 17.75" style="fill:rgb(146,168,54); fill-opacity:1;" />
<polygon points="9.5 17.5, 10 17.75, 10 18.25, 9.5 18.5, 9 18.25, 9 17.75" style="fill:rgb(145,165,54); fill-opacity:1;" />
<polygon points="10.5 17.5, 11 17.75, 11 18.25, 10.5 18.5, 10 18.25, 10 17.75" style="fill:rgb(148,168,54); fill-opacity:1;" />
<polygon points="11.5 17.5, 12 17.75, 12 18.25, 11.5 18.5, 11 18.25, 11 17.75" style="fill:rgb(129,146,49); fill-opacity:1;" />
<polygon points="12.5 17.5, 13 17.75, 13 18.25, 12.5 18.5, 12 18.25, 12 17.75" style="fill:rgb(125,122,71); fill-opacity:1;" />
<polygon points="13.5 17.5, 14 17.75, 14 18.25, 13.5 18.5, 13 18.25, 13 17.75" style="fill:rgb(184,156,137); fill-opacity:1;" />
<polygon points="14.5 17.5, 15 17.75, 15 18.25, 14.5 18.5, 14 18.25, 14 17.75" style="fill:rgb(205,174,155); fill-opacity:1;" />
<polygon points="15.5 17.5, 16 17.75, 16 18.25, 15.5 18.5, 15 18.25, 15 17.75" style="fill:rgb(209,177,160); fill-opacity:1;" />
<polygon points="16.5 17.5, 17 17.75, 17 18.25, 16.5 18.5, 16 18.25, 16 17.75" style="fill:rgb(207,176,159); fill-opacity:1;" />
<polygon points="17.5 17.5, 18 17.75, 18 18.25, 17.5 18.5, 17 18.25, 17 17.75" style="fill:rgb(201,170,155); fill-opacity:1;" />
<polygon points="18.5 17.5, 19 17.75, 19 18.25, 18.5 18.5, 18 18.25, 18 17.75" style="fill:rgb(198,164,151); fill-opacity:1;" />
<polygon points="19.5 17.5, 20 17.75, 20 18.25, 19.5 18.5, 19 18.25, 19 17.75" style="fill:rgb(199,136,149); fill-opacity:1;" />
<polygon points="20.5 17.5, 21 17.75, 21 18.25, 20.5 18.5, 20 18.25, 20 17.75" style="fill:rgb(192,82,140); fill-opacity:1;" />
<polygon points="21.5 17.5, 22 17.75, 22 18.25, 21.5 18.5, 21 18.25, 21 17.75" style="fill:rgb(168,34,116); fill-opacity:1;" />
<polygon points="22.5 17.5, 23 17.75, 23 18.25, 22.5 18.5, 22 18.25, 22 17.75" style="fill:rgb(158,56,107); fill-opacity:1;" />
<polygon points="23.5 17.5, 24 17.75, 24 18.25, 23.5 18.5, 23 18.25, 23 17.75" style="fill:rgb(180,108,131); fill-opacity:1;" />
<polygon points="24.5 17.5, 25 17.75, 25 18.25, 24.5 18.5, 24 18.25, 24 17.75" style="fill:rgb(201,154,152); fill-opacity:1;" />
<polygon points="25.5 17.5, 26 17.75, 26 18.25, 25.5 18.5, 25 18.25, 25 17.75" style="fill:rgb(219,184,168); fill-opacity:1;" />
<polygon points="26.5 17.5, 27 17.75, 27 18.25, 26.5 18.5, 26 18.25, 26 17.75" style="fill:rgb(190,160,145); fill-opacity:1;" />
<polygon points="27.5 17.5, 28 17.75, 28 18.25, 27.5 18.5, 27 18.25, 27 17.75" style="fill:rgb(39,32,28); fill-opacity:0.647058823529412;" />
<polygon points="28.5 17.5, 29 17.75, 29 18.25, 28.5 18.5, 28 18.25, 28 17.75" style="fill:rgb(0,0,0); fill-opacity:0.345098039215686;" />
<polygon points="29.5 17.5, 30 17.75, 30 18.25, 29.5 18.5, 29 18.25, 29 17.75" style="fill:rgb(0,0,0); fill-opacity:0.305882352941176;" />
<polygon points="30.5 17.5, 31 17.75, 31 18.25, 30.5 18.5, 30 18.25, 30 17.75" style="fill:rgb(0,0,0); fill-opacity:0.207843137254902;" />
<polygon points="31.5 17.5, 32 17.75, 32 18.25, 31.5 18.5, 31 18.25, 31 17.75" style="fill:rgb(0,0,0); fill-opacity:0.117647058823529;" />
<polygon points="2 18.25, 2.5 18.5, 2.5 19, 2 19.25, 1.5 19, 1.5 18.5" style="fill:rgb(217,184,167); fill-opacity:0.101960784313725;" />
<polygon points="3 18.25, 3.5 18.5, 3.5 19, 3 19.25, 2.5 19, 2.5 18.5" style="fill:rgb(194,164,148); fill-opacity:0.843137254901961;" />
<polygon points="4 18.25, 4.5 18.5, 4.5 19, 4 19.25, 3.5 19, 3.5 18.5" style="fill:rgb(163,138,124); fill-opacity:1;" />
<polygon points="5 18.25, 5.5 18.5, 5.5 19, 5 19.25, 4.5 19, 4.5 18.5" style="fill:rgb(177,149,134); fill-opacity:1;" />
<polygon points="6 18.25, 6.5 18.5, 6.5 19, 6 19.25, 5.5 19, 5.5 18.5" style="fill:rgb(184,155,140); fill-opacity:1;" />
<polygon points="7 18.25, 7.5 18.5, 7.5 19, 7 19.25, 6.5 19, 6.5 18.5" style="fill:rgb(173,149,128); fill-opacity:1;" />
<polygon points="8 18.25, 8.5 18.5, 8.5 19, 8 19.25, 7.5 19, 7.5 18.5" style="fill:rgb(142,140,79); fill-opacity:1;" />
<polygon points="9 18.25, 9.5 18.5, 9.5 19, 9 19.25, 8.5 19, 8.5 18.5" style="fill:rgb(136,155,40); fill-opacity:1;" />
<polygon points="10 18.25, 10.5 18.5, 10.5 19, 10 19.25, 9.5 19, 9.5 18.5" style="fill:rgb(129,148,37); fill-opacity:1;" />
<polygon points="11 18.25, 11.5 18.5, 11.5 19, 11 19.25, 10.5 19, 10.5 18.5" style="fill:rgb(123,143,35); fill-opacity:1;" />
<polygon points="12 18.25, 12.5 18.5, 12.5 19, 12 19.25, 11.5 19, 11.5 18.5" style="fill:rgb(99,103,41); fill-opacity:1;" />
<polygon points="13 18.25, 13.5 18.5, 13.5 19, 13 19.25, 12.5 19, 12.5 18.5" style="fill:rgb(133,125,81); fill-opacity:1;" />
<polygon points="14 18.25, 14.5 18.5, 14.5 19, 14 19.25, 13.5 19, 13.5 18.5" style="fill:rgb(171,164,111); fill-opacity:1;" />
<polygon points="15 18.25, 15.5 18.5, 15.5 19, 15 19.25, 14.5 19, 14.5 18.5" style="fill:rgb(195,165,145); fill-opacity:1;" />
<polygon points="16 18.25, 16.5 18.5, 16.5 19, 16 19.25, 15.5 19, 15.5 18.5" style="fill:rgb(206,174,159); fill-opacity:1;" />
<polygon points="17 18.25, 17.5 18.5, 17.5 19, 17 19.25, 16.5 19, 16.5 18.5" style="fill:rgb(200,170,153); fill-opacity:1;" />
<polygon points="18 18.25, 18.5 18.5, 18.5 19, 18 19.25, 17.5 19, 17.5 18.5" style="fill:rgb(198,169,151); fill-opacity:1;" />
<polygon points="19 18.25, 19.5 18.5, 19.5 19, 19 19.25, 18.5 19, 18.5 18.5" style="fill:rgb(191,140,145); fill-opacity:1;" />
<polygon points="20 18.25, 20.5 18.5, 20.5 19, 20 19.25, 19.5 19, 19.5 18.5" style="fill:rgb(167,71,123); fill-opacity:1;" />
<polygon points="21 18.25, 21.5 18.5, 21.5 19, 21 19.25, 20.5 19, 20.5 18.5" style="fill:rgb(147,46,102); fill-opacity:1;" />
<polygon points="22 18.25, 22.5 18.5, 22.5 19, 22 19.25, 21.5 19, 21.5 18.5" style="fill:rgb(157,59,106); fill-opacity:1;" />
<polygon points="23 18.25, 23.5 18.5, 23.5 19, 23 19.25, 22.5 19, 22.5 18.5" style="fill:rgb(182,92,128); fill-opacity:1;" />
<polygon points="24 18.25, 24.5 18.5, 24.5 19, 24 19.25, 23.5 19, 23.5 18.5" style="fill:rgb(193,127,140); fill-opacity:1;" />
<polygon points="25 18.25, 25.5 18.5, 25.5 19, 25 19.25, 24.5 19, 24.5 18.5" style="fill:rgb(210,169,160); fill-opacity:1;" />
<polygon points="26 18.25, 26.5 18.5, 26.5 19, 26 19.25, 25.5 19, 25.5 18.5" style="fill:rgb(208,175,158); fill-opacity:1;" />
<polygon points="27 18.25, 27.5 18.5, 27.5 19, 27 19.25, 26.5 19, 26.5 18.5" style="fill:rgb(73,59,53); fill-opacity:0.850980392156863;" />
<polygon points="28 18.25, 28.5 18.5, 28.5 19, 28 19.25, 27.5 19, 27.5 18.5" style="fill:rgb(0,0,0); fill-opacity:0.56078431372549;" />
<polygon points="29 18.25, 29.5 18.5, 29.5 19, 29 19.25, 28.5 19, 28.5 18.5" style="fill:rgb(0,0,0); fill-opacity:0.474509803921569;" />
<polygon points="30 18.25, 30.5 18.5, 30.5 19, 30 19.25, 29.5 19, 29.5 18.5" style="fill:rgb(0,0,0); fill-opacity:0.349019607843137;" />
<polygon points="31 18.25, 31.5 18.5, 31.5 19, 31 19.25, 30.5 19, 30.5 18.5" style="fill:rgb(0,0,0); fill-opacity:0.219607843137255;" />
<polygon points="32 18.25, 32.5 18.5, 32.5 19, 32 19.25, 31.5 19, 31.5 18.5" style="fill:rgb(0,0,0); fill-opacity:0.109803921568627;" />
<polygon points="2.5 19, 3 19.25, 3 19.75, 2.5 20, 2 19.75, 2 19.25" style="fill:rgb(212,179,162); fill-opacity:0.274509803921569;" />
<polygon points="3.5 19, 4 19.25, 4 19.75, 3.5 20, 3 19.75, 3 19.25" style="fill:rgb(182,154,139); fill-opacity:0.933333333333333;" />
<polygon points="4.5 19, 5 19.25, 5 19.75, 4.5 20, 4 19.75, 4 19.25" style="fill:rgb(161,135,122); fill-opacity:1;" />
<polygon points="5.5 19, 6 19.25, 6 19.75, 5.5 20, 5 19.75, 5 19.25" style="fill:rgb(169,143,128); fill-opacity:1;" />
<polygon points="6.5 19, 7 19.25, 7 19.75, 6.5 20, 6 19.75, 6 19.25" style="fill:rgb(164,140,122); fill-opacity:1;" />
<polygon points="7.5 19, 8 19.25, 8 19.75, 7.5 20, 7 19.75, 7 19.25" style="fill:rgb(148,147,73); fill-opacity:1;" />
<polygon points="8.5 19, 9 19.25, 9 19.75, 8.5 20, 8 19.75, 8 19.25" style="fill:rgb(123,148,17); fill-opacity:1;" />
<polygon points="9.5 19, 10 19.25, 10 19.75, 9.5 20, 9 19.75, 9 19.25" style="fill:rgb(109,113,46); fill-opacity:1;" />
<polygon points="10.5 19, 11 19.25, 11 19.75, 10.5 20, 10 19.75, 10 19.25" style="fill:rgb(111,109,56); fill-opacity:1;" />
<polygon points="11.5 19, 12 19.25, 12 19.75, 11.5 20, 11 19.75, 11 19.25" style="fill:rgb(112,109,58); fill-opacity:1;" />
<polygon points="12.5 19, 13 19.25, 13 19.75, 12.5 20, 12 19.75, 12 19.25" style="fill:rgb(147,153,72); fill-opacity:1;" />
<polygon points="13.5 19, 14 19.25, 14 19.75, 13.5 20, 13 19.75, 13 19.25" style="fill:rgb(144,155,69); fill-opacity:1;" />
<polygon points="14.5 19, 15 19.25, 15 19.75, 14.5 20, 14 19.75, 14 19.25" style="fill:rgb(189,159,145); fill-opacity:1;" />
<polygon points="15.5 19, 16 19.25, 16 19.75, 15.5 20, 15 19.75, 15 19.25" style="fill:rgb(200,169,154); fill-opacity:1;" />
<polygon points="16.5 19, 17 19.25, 17 19.75, 16.5 20, 16 19.75, 16 19.25" style="fill:rgb(193,163,148); fill-opacity:1;" />
<polygon points="17.5 19, 18 19.25, 18 19.75, 17.5 20, 17 19.75, 17 19.25" style="fill:rgb(196,166,149); fill-opacity:1;" />
<polygon points="18.5 19, 19 19.25, 19 19.75, 18.5 20, 18 19.75, 18 19.25" style="fill:rgb(195,154,148); fill-opacity:1;" />
<polygon points="19.5 19, 20 19.25, 20 19.75, 19.5 20, 19 19.75, 19 19.25" style="fill:rgb(167,111,123); fill-opacity:1;" />
<polygon points="20.5 19, 21 19.25, 21 19.75, 20.5 20, 20 19.75, 20 19.25" style="fill:rgb(175,113,128); fill-opacity:1;" />
<polygon points="21.5 19, 22 19.25, 22 19.75, 21.5 20, 21 19.75, 21 19.25" style="fill:rgb(193,128,141); fill-opacity:1;" />
<polygon points="22.5 19, 23 19.25, 23 19.75, 22.5 20, 22 19.75, 22 19.25" style="fill:rgb(192,132,142); fill-opacity:1;" />
<polygon points="23.5 19, 24 19.25, 24 19.75, 23.5 20, 23 19.75, 23 19.25" style="fill:rgb(208,162,156); fill-opacity:1;" />
<polygon points="24.5 19, 25 19.25, 25 19.75, 24.5 20, 24 19.75, 24 19.25" style="fill:rgb(204,168,155); fill-opacity:1;" />
<polygon points="25.5 19, 26 19.25, 26 19.75, 25.5 20, 25 19.75, 25 19.25" style="fill:rgb(85,70,62); fill-opacity:0.890196078431373;" />
<polygon points="26.5 19, 27 19.25, 27 19.75, 26.5 20, 26 19.75, 26 19.25" style="fill:rgb(0,0,0); fill-opacity:0.619607843137255;" />
<polygon points="27.5 19, 28 19.25, 28 19.75, 27.5 20, 27 19.75, 27 19.25" style="fill:rgb(0,0,0); fill-opacity:0.509803921568627;" />
<polygon points="28.5 19, 29 19.25, 29 19.75, 28.5 20, 28 19.75, 28 19.25" style="fill:rgb(0,0,0); fill-opacity:0.384313725490196;" />
<polygon points="29.5 19, 30 19.25, 30 19.75, 29.5 20, 29 19.75, 29 19.25" style="fill:rgb(0,0,0); fill-opacity:0.23921568627451;" />
<polygon points="30.5 19, 31 19.25, 31 19.75, 30.5 20, 30 19.75, 30 19.25" style="fill:rgb(0,0,0); fill-opacity:0.125490196078431;" />
<polygon points="31.5 19, 32 19.25, 32 19.75, 31.5 20, 31 19.75, 31 19.25" style="fill:rgb(0,0,0); fill-opacity:0.0509803921568627;" />
<polygon points="4 19.75, 4.5 20, 4.5 20.5, 4 20.75, 3.5 20.5, 3.5 20" style="fill:rgb(207,175,159); fill-opacity:0.270588235294118;" />
<polygon points="5 19.75, 5.5 20, 5.5 20.5, 5 20.75, 4.5 20.5, 4.5 20" style="fill:rgb(185,156,140); fill-opacity:0.850980392156863;" />
<polygon points="6 19.75, 6.5 20, 6.5 20.5, 6 20.75, 5.5 20.5, 5.5 20" style="fill:rgb(166,140,125); fill-opacity:1;" />
<polygon points="7 19.75, 7.5 20, 7.5 20.5, 7 20.75, 6.5 20.5, 6.5 20" style="fill:rgb(158,133,120); fill-opacity:1;" />
<polygon points="8 19.75, 8.5 20, 8.5 20.5, 8 20.75, 7.5 20.5, 7.5 20" style="fill:rgb(135,134,64); fill-opacity:1;" />
<polygon points="9 19.75, 9.5 20, 9.5 20.5, 9 20.75, 8.5 20.5, 8.5 20" style="fill:rgb(105,125,11); fill-opacity:1;" />
<polygon points="10 19.75, 10.5 20, 10.5 20.5, 10 20.75, 9.5 20.5, 9.5 20" style="fill:rgb(132,123,78); fill-opacity:1;" />
<polygon points="11 19.75, 11.5 20, 11.5 20.5, 11 20.75, 10.5 20.5, 10.5 20" style="fill:rgb(143,127,95); fill-opacity:1;" />
<polygon points="12 19.75, 12.5 20, 12.5 20.5, 12 20.75, 11.5 20.5, 11.5 20" style="fill:rgb(137,130,79); fill-opacity:1;" />
<polygon points="13 19.75, 13.5 20, 13.5 20.5, 13 20.75, 12.5 20.5, 12.5 20" style="fill:rgb(125,146,30); fill-opacity:1;" />
<polygon points="14 19.75, 14.5 20, 14.5 20.5, 14 20.75, 13.5 20.5, 13.5 20" style="fill:rgb(140,132,80); fill-opacity:1;" />
<polygon points="15 19.75, 15.5 20, 15.5 20.5, 15 20.75, 14.5 20.5, 14.5 20" style="fill:rgb(192,161,148); fill-opacity:1;" />
<polygon points="16 19.75, 16.5 20, 16.5 20.5, 16 20.75, 15.5 20.5, 15.5 20" style="fill:rgb(191,160,146); fill-opacity:1;" />
<polygon points="17 19.75, 17.5 20, 17.5 20.5, 17 20.75, 16.5 20.5, 16.5 20" style="fill:rgb(188,158,143); fill-opacity:1;" />
<polygon points="18 19.75, 18.5 20, 18.5 20.5, 18 20.75, 17.5 20.5, 17.5 20" style="fill:rgb(196,165,149); fill-opacity:1;" />
<polygon points="19 19.75, 19.5 20, 19.5 20.5, 19 20.75, 18.5 20.5, 18.5 20" style="fill:rgb(200,169,153); fill-opacity:1;" />
<polygon points="20 19.75, 20.5 20, 20.5 20.5, 20 20.75, 19.5 20.5, 19.5 20" style="fill:rgb(197,161,150); fill-opacity:1;" />
<polygon points="21 19.75, 21.5 20, 21.5 20.5, 21 20.75, 20.5 20.5, 20.5 20" style="fill:rgb(196,156,148); fill-opacity:1;" />
<polygon points="22 19.75, 22.5 20, 22.5 20.5, 22 20.75, 21.5 20.5, 21.5 20" style="fill:rgb(196,154,147); fill-opacity:1;" />
<polygon points="23 19.75, 23.5 20, 23.5 20.5, 23 20.75, 22.5 20.5, 22.5 20" style="fill:rgb(211,171,160); fill-opacity:1;" />
<polygon points="24 19.75, 24.5 20, 24.5 20.5, 24 20.75, 23.5 20.5, 23.5 20" style="fill:rgb(187,156,142); fill-opacity:1;" />
<polygon points="25 19.75, 25.5 20, 25.5 20.5, 25 20.75, 24.5 20.5, 24.5 20" style="fill:rgb(73,60,53); fill-opacity:0.854901960784314;" />
<polygon points="26 19.75, 26.5 20, 26.5 20.5, 26 20.75, 25.5 20.5, 25.5 20" style="fill:rgb(0,0,0); fill-opacity:0.596078431372549;" />
<polygon points="27 19.75, 27.5 20, 27.5 20.5, 27 20.75, 26.5 20.5, 26.5 20" style="fill:rgb(0,0,0); fill-opacity:0.447058823529412;" />
<polygon points="28 19.75, 28.5 20, 28.5 20.5, 28 20.75, 27.5 20.5, 27.5 20" style="fill:rgb(0,0,0); fill-opacity:0.313725490196078;" />
<polygon points="29 19.75, 29.5 20, 29.5 20.5, 29 20.75, 28.5 20.5, 28.5 20" style="fill:rgb(0,0,0); fill-opacity:0.188235294117647;" />
<polygon points="30 19.75, 30.5 20, 30.5 20.5, 30 20.75, 29.5 20.5, 29.5 20" style="fill:rgb(0,0,0); fill-opacity:0.0823529411764706;" />
<polygon points="31 19.75, 31.5 20, 31.5 20.5, 31 20.75, 30.5 20.5, 30.5 20" style="fill:rgb(0,0,0); fill-opacity:0.0235294117647059;" />
<polygon points="4.5 20.5, 5 20.75, 5 21.25, 4.5 21.5, 4 21.25, 4 20.75" style="fill:rgb(194,164,148); fill-opacity:0.105882352941176;" />
<polygon points="5.5 20.5, 6 20.75, 6 21.25, 5.5 21.5, 5 21.25, 5 20.75" style="fill:rgb(175,147,132); fill-opacity:0.541176470588235;" />
<polygon points="6.5 20.5, 7 20.75, 7 21.25, 6.5 21.5, 6 21.25, 6 20.75" style="fill:rgb(171,144,128); fill-opacity:0.882352941176471;" />
<polygon points="7.5 20.5, 8 20.75, 8 21.25, 7.5 21.5, 7 21.25, 7 20.75" style="fill:rgb(164,138,123); fill-opacity:1;" />
<polygon points="8.5 20.5, 9 20.75, 9 21.25, 8.5 21.5, 8 21.25, 8 20.75" style="fill:rgb(150,128,110); fill-opacity:1;" />
<polygon points="9.5 20.5, 10 20.75, 10 21.25, 9.5 21.5, 9 21.25, 9 20.75" style="fill:rgb(154,131,113); fill-opacity:1;" />
<polygon points="10.5 20.5, 11 20.75, 11 21.25, 10.5 21.5, 10 21.25, 10 20.75" style="fill:rgb(152,131,107); fill-opacity:1;" />
<polygon points="11.5 20.5, 12 20.75, 12 21.25, 11.5 21.5, 11 21.25, 11 20.75" style="fill:rgb(147,131,99); fill-opacity:1;" />
<polygon points="12.5 20.5, 13 20.75, 13 21.25, 12.5 21.5, 12 21.25, 12 20.75" style="fill:rgb(134,124,78); fill-opacity:1;" />
<polygon points="13.5 20.5, 14 20.75, 14 21.25, 13.5 21.5, 13 21.25, 13 20.75" style="fill:rgb(168,143,124); fill-opacity:1;" />
<polygon points="14.5 20.5, 15 20.75, 15 21.25, 14.5 21.5, 14 21.25, 14 20.75" style="fill:rgb(181,151,137); fill-opacity:1;" />
<polygon points="15.5 20.5, 16 20.75, 16 21.25, 15.5 21.5, 15 21.25, 15 20.75" style="fill:rgb(178,149,135); fill-opacity:1;" />
<polygon points="16.5 20.5, 17 20.75, 17 21.25, 16.5 21.5, 16 21.25, 16 20.75" style="fill:rgb(182,153,139); fill-opacity:1;" />
<polygon points="17.5 20.5, 18 20.75, 18 21.25, 17.5 21.5, 17 21.25, 17 20.75" style="fill:rgb(186,156,142); fill-opacity:1;" />
<polygon points="18.5 20.5, 19 20.75, 19 21.25, 18.5 21.5, 18 21.25, 18 20.75" style="fill:rgb(184,153,140); fill-opacity:1;" />
<polygon points="19.5 20.5, 20 20.75, 20 21.25, 19.5 21.5, 19 21.25, 19 20.75" style="fill:rgb(189,158,144); fill-opacity:1;" />
<polygon points="20.5 20.5, 21 20.75, 21 21.25, 20.5 21.5, 20 21.25, 20 20.75" style="fill:rgb(199,166,152); fill-opacity:1;" />
<polygon points="21.5 20.5, 22 20.75, 22 21.25, 21.5 21.5, 21 21.25, 21 20.75" style="fill:rgb(202,167,152); fill-opacity:1;" />
<polygon points="22.5 20.5, 23 20.75, 23 21.25, 22.5 21.5, 22 21.25, 22 20.75" style="fill:rgb(143,119,108); fill-opacity:0.988235294117647;" />
<polygon points="23.5 20.5, 24 20.75, 24 21.25, 23.5 21.5, 23 21.25, 23 20.75" style="fill:rgb(41,34,30); fill-opacity:0.764705882352941;" />
<polygon points="24.5 20.5, 25 20.75, 25 21.25, 24.5 21.5, 24 21.25, 24 20.75" style="fill:rgb(0,0,0); fill-opacity:0.486274509803922;" />
<polygon points="25.5 20.5, 26 20.75, 26 21.25, 25.5 21.5, 25 21.25, 25 20.75" style="fill:rgb(0,0,0); fill-opacity:0.317647058823529;" />
<polygon points="26.5 20.5, 27 20.75, 27 21.25, 26.5 21.5, 26 21.25, 26 20.75" style="fill:rgb(0,0,0); fill-opacity:0.168627450980392;" />
<polygon points="27.5 20.5, 28 20.75, 28 21.25, 27.5 21.5, 27 21.25, 27 20.75" style="fill:rgb(0,0,0); fill-opacity:0.0705882352941176;" />
<polygon points="28.5 20.5, 29 20.75, 29 21.25, 28.5 21.5, 28 21.25, 28 20.75" style="fill:rgb(0,0,0); fill-opacity:0.0156862745098039;" />
<polygon points="7 21.25, 7.5 21.5, 7.5 22, 7 22.25, 6.5 22, 6.5 21.5" style="fill:rgb(158,134,116); fill-opacity:0.125490196078431;" />
<polygon points="8 21.25, 8.5 21.5, 8.5 22, 8 22.25, 7.5 22, 7.5 21.5" style="fill:rgb(156,129,116); fill-opacity:0.435294117647059;" />
<polygon points="9 21.25, 9.5 21.5, 9.5 22, 9 22.25, 8.5 22, 8.5 21.5" style="fill:rgb(165,137,126); fill-opacity:0.729411764705882;" />
<polygon points="10 21.25, 10.5 21.5, 10.5 22, 10 22.25, 9.5 22, 9.5 21.5" style="fill:rgb(171,144,129); fill-opacity:0.949019607843137;" />
<polygon points="11 21.25, 11.5 21.5, 11.5 22, 11 22.25, 10.5 22, 10.5 21.5" style="fill:rgb(168,141,125); fill-opacity:1;" />
<polygon points="12 21.25, 12.5 21.5, 12.5 22, 12 22.25, 11.5 22, 11.5 21.5" style="fill:rgb(163,137,122); fill-opacity:1;" />
<polygon points="13 21.25, 13.5 21.5, 13.5 22, 13 22.25, 12.5 22, 12.5 21.5" style="fill:rgb(166,137,128); fill-opacity:1;" />
<polygon points="14 21.25, 14.5 21.5, 14.5 22, 14 22.25, 13.5 22, 13.5 21.5" style="fill:rgb(164,137,124); fill-opacity:1;" />
<polygon points="15 21.25, 15.5 21.5, 15.5 22, 15 22.25, 14.5 22, 14.5 21.5" style="fill:rgb(163,136,123); fill-opacity:1;" />
<polygon points="16 21.25, 16.5 21.5, 16.5 22, 16 22.25, 15.5 22, 15.5 21.5" style="fill:rgb(168,141,127); fill-opacity:1;" />
<polygon points="17 21.25, 17.5 21.5, 17.5 22, 17 22.25, 16.5 22, 16.5 21.5" style="fill:rgb(178,149,135); fill-opacity:1;" />
<polygon points="18 21.25, 18.5 21.5, 18.5 22, 18 22.25, 17.5 22, 17.5 21.5" style="fill:rgb(183,153,140); fill-opacity:1;" />
<polygon points="19 21.25, 19.5 21.5, 19.5 22, 19 22.25, 18.5 22, 18.5 21.5" style="fill:rgb(186,156,141); fill-opacity:1;" />
<polygon points="20 21.25, 20.5 21.5, 20.5 22, 20 22.25, 19.5 22, 19.5 21.5" style="fill:rgb(178,149,135); fill-opacity:1;" />
<polygon points="21 21.25, 21.5 21.5, 21.5 22, 21 22.25, 20.5 22, 20.5 21.5" style="fill:rgb(140,116,106); fill-opacity:0.909803921568627;" />
<polygon points="22 21.25, 22.5 21.5, 22.5 22, 22 22.25, 21.5 22, 21.5 21.5" style="fill:rgb(64,52,48); fill-opacity:0.717647058823529;" />
<polygon points="23 21.25, 23.5 21.5, 23.5 22, 23 22.25, 22.5 22, 22.5 21.5" style="fill:rgb(4,3,2); fill-opacity:0.427450980392157;" />
<polygon points="24 21.25, 24.5 21.5, 24.5 22, 24 22.25, 23.5 22, 23.5 21.5" style="fill:rgb(0,0,0); fill-opacity:0.196078431372549;" />
<polygon points="25 21.25, 25.5 21.5, 25.5 22, 25 22.25, 24.5 22, 24.5 21.5" style="fill:rgb(0,0,0); fill-opacity:0.0823529411764706;" />
<polygon points="26 21.25, 26.5 21.5, 26.5 22, 26 22.25, 25.5 22, 25.5 21.5" style="fill:rgb(0,0,0); fill-opacity:0.0156862745098039;" />
<polygon points="8.5 22, 9 22.25, 9 22.75, 8.5 23, 8 22.75, 8 22.25" style="fill:rgb(130,108,96); fill-opacity:0.0274509803921569;" />
<polygon points="9.5 22, 10 22.25, 10 22.75, 9.5 23, 9 22.75, 9 22.25" style="fill:rgb(123,101,89); fill-opacity:0.176470588235294;" />
<polygon points="10.5 22, 11 22.25, 11 22.75, 10.5 23, 10 22.75, 10 22.25" style="fill:rgb(129,106,95); fill-opacity:0.380392156862745;" />
<polygon points="11.5 22, 12 22.25, 12 22.75, 11.5 23, 11 22.75, 11 22.25" style="fill:rgb(146,120,109); fill-opacity:0.545098039215686;" />
<polygon points="12.5 22, 13 22.25, 13 22.75, 12.5 23, 12 22.75, 12 22.25" style="fill:rgb(149,123,111); fill-opacity:0.650980392156863;" />
<polygon points="13.5 22, 14 22.25, 14 22.75, 13.5 23, 13 22.75, 13 22.25" style="fill:rgb(149,124,112); fill-opacity:0.709803921568627;" />
<polygon points="14.5 22, 15 22.25, 15 22.75, 14.5 23, 14 22.75, 14 22.25" style="fill:rgb(146,121,109); fill-opacity:0.737254901960784;" />
<polygon points="15.5 22, 16 22.25, 16 22.75, 15.5 23, 15 22.75, 15 22.25" style="fill:rgb(149,124,112); fill-opacity:0.737254901960784;" />
<polygon points="16.5 22, 17 22.25, 17 22.75, 16.5 23, 16 22.75, 16 22.25" style="fill:rgb(139,116,104); fill-opacity:0.709803921568627;" />
<polygon points="17.5 22, 18 22.25, 18 22.75, 17.5 23, 17 22.75, 17 22.25" style="fill:rgb(133,109,99); fill-opacity:0.631372549019608;" />
<polygon points="18.5 22, 19 22.25, 19 22.75, 18.5 23, 18 22.75, 18 22.25" style="fill:rgb(125,103,92); fill-opacity:0.505882352941176;" />
<polygon points="19.5 22, 20 22.25, 20 22.75, 19.5 23, 19 22.75, 19 22.25" style="fill:rgb(77,63,56); fill-opacity:0.313725490196078;" />
<polygon points="20.5 22, 21 22.25, 21 22.75, 20.5 23, 20 22.75, 20 22.25" style="fill:rgb(13,10,9); fill-opacity:0.129411764705882;" />
<polygon points="21.5 22, 22 22.25, 22 22.75, 21.5 23, 21 22.75, 21 22.25" style="fill:rgb(4,4,3); fill-opacity:0.0235294117647059;" />
<polygon points="14 22.75, 14.5 23, 14.5 23.5, 14 23.75, 13.5 23.5, 13.5 23" style="fill:rgb(155,129,116); fill-opacity:0.0470588235294118;" />
<polygon points="15 22.75, 15.5 23, 15.5 23.5, 15 23.75, 14.5 23.5, 14.5 23" style="fill:rgb(121,99,89); fill-opacity:0.0745098039215686;" />
<polygon points="16 22.75, 16.5 23, 16.5 23.5, 16 23.75, 15.5 23.5, 15.5 23" style="fill:rgb(116,96,86); fill-opacity:0.0823529411764706;" />
<polygon points="17 22.75, 17.5 23, 17.5 23.5, 17 23.75, 16.5 23.5, 16.5 23" style="fill:rgb(110,91,81); fill-opacity:0.0549019607843137;" />
<polygon points="18 22.75, 18.5 23, 18.5 23.5, 18 23.75, 17.5 23.5, 17.5 23" style="fill:rgb(107,88,78); fill-opacity:0.00392156862745098;" />
<polygon points="9.5 23.5, 10 23.75, 10 24.25, 9.5 24.5, 9 24.25, 9 23.75" style="fill:rgb(156,130,117); fill-opacity:0.00392156862745098;" />
<polygon points="10.5 23.5, 11 23.75, 11 24.25, 10.5 24.5, 10 24.25, 10 23.75" style="fill:rgb(157,130,117); fill-opacity:0.00784313725490196;" />
<polygon points="11.5 23.5, 12 23.75, 12 24.25, 11.5 24.5, 11 24.25, 11 23.75" style="fill:rgb(175,146,131); fill-opacity:0.0117647058823529;" />
<polygon points="12.5 23.5, 13 23.75, 13 24.25, 12.5 24.5, 12 24.25, 12 23.75" style="fill:rgb(170,142,128); fill-opacity:0.0117647058823529;" />
<polygon points="13.5 23.5, 14 23.75, 14 24.25, 13.5 24.5, 13 24.25, 13 23.75" style="fill:rgb(170,142,129); fill-opacity:0.0117647058823529;" />
<polygon points="14.5 23.5, 15 23.75, 15 24.25, 14.5 24.5, 14 24.25, 14 23.75" style="fill:rgb(171,142,129); fill-opacity:0.00392156862745098;" />
<polygon points="15.5 23.5, 16 23.75, 16 24.25, 15.5 24.5, 15 24.25, 15 23.75" style="fill:rgb(171,143,130); fill-opacity:0.00392156862745098;" />
<polygon points="16.5 23.5, 17 23.75, 17 24.25, 16.5 24.5, 16 24.25, 16 23.75" style="fill:rgb(182,152,139); fill-opacity:0.0117647058823529;" />
<polygon points="17.5 23.5, 18 23.75, 18 24.25, 17.5 24.5, 17 24.25, 17 23.75" style="fill:rgb(183,154,139); fill-opacity:0.0196078431372549;" />
<polygon points="18.5 23.5, 19 23.75, 19 24.25, 18.5 24.5, 18 24.25, 18 23.75" style="fill:rgb(177,148,134); fill-opacity:0.0235294117647059;" />
<polygon points="19.5 23.5, 20 23.75, 20 24.25, 19.5 24.5, 19 24.25, 19 23.75" style="fill:rgb(167,139,127); fill-opacity:0.0196078431372549;" />
<polygon points="20.5 23.5, 21 23.75, 21 24.25, 20.5 24.5, 20 24.25, 20 23.75" style="fill:rgb(129,107,96); fill-opacity:0.0117647058823529;" />
<polygon points="21.5 23.5, 22 23.75, 22 24.25, 21.5 24.5, 21 24.25, 21 23.75" style="fill:rgb(110,90,80); fill-opacity:0.00392156862745098;" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Pix2svg"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="pix2svg.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="umain.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="pix2svg"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,22 @@
program pix2svg;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, umain
{ you can add units after this };
{$R *.res}
begin
Application.Title:='Pix2svg';
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,10 @@
object Form1: TForm1
Left = 712
Height = 240
Top = 193
Width = 320
Caption = 'Pix2svg'
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.2.4.0'
end

View File

@@ -0,0 +1,128 @@
unit umain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
BCFilters, BGRABitmap, BGRABitmapTypes;
type
TPix2SVGStyle = (pix2rectangle, pix2ellipse, pix2hexagon);
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
bitmap: TBGRABitmap;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
function Pix2svg(Bitmap: TBGRABitmap; mX, mY: single; Style: TPix2SVGStyle;
SkipTransparent: boolean): TStringList;
function BGRAtoRGBAstr(bgra: TBGRAPixel): string;
begin
Result := 'style="fill:rgb(' + IntToStr(bgra.red) + ',' +
IntToStr(bgra.green) + ',' + IntToStr(bgra.blue) + '); fill-opacity:' +
FloatToStr(bgra.alpha / 255) + ';';
end;
function hexagonStr(x, y: integer; p: PBGRAPixel): string;
var
p1, p2, p3, p4, p5, p6: string;
begin
if odd(y) then // impar
begin
p1 := FloatToStr(x + 1 / 2) + ' ' + FloatToStr(0.75 * y + 0.5 / 2) + ', ';
p2 := FloatToStr(x + 2 / 2) + ' ' + FloatToStr(0.75 * y + 1 / 2) + ', ';
p3 := FloatToStr(x + 2 / 2) + ' ' + FloatToStr(0.75 * y + 2 / 2) + ', ';
p4 := FloatToStr(x + 1 / 2) + ' ' + FloatToStr(0.75 * y + 2.5 / 2) + ', ';
p5 := FloatToStr(x + 0 / 2) + ' ' + FloatToStr(0.75 * y + 2 / 2) + ', ';
p6 := FloatToStr(x + 0 / 2) + ' ' + FloatToStr(0.75 * y + 1 / 2);
end
else // par
begin
p1 := FloatToStr(0.5 + x + 1 / 2) + ' ' + FloatToStr(0.75 * y + 0.5 / 2) + ', ';
p2 := FloatToStr(0.5 + x + 2 / 2) + ' ' + FloatToStr(0.75 * y + 1 / 2) + ', ';
p3 := FloatToStr(0.5 + x + 2 / 2) + ' ' + FloatToStr(0.75 * y + 2 / 2) + ', ';
p4 := FloatToStr(0.5 + x + 1 / 2) + ' ' + FloatToStr(0.75 * y + 2.5 / 2) + ', ';
p5 := FloatToStr(0.5 + x + 0 / 2) + ' ' + FloatToStr(0.75 * y + 2 / 2) + ', ';
p6 := FloatToStr(0.5 + x + 0 / 2) + ' ' + FloatToStr(0.75 * y + 1 / 2);
end;
Result := ' <polygon points="' + p1 + p2 + p3 + p4 + p5 +
p6 + '" ' + BGRAtoRGBAstr(p^) + '" />';
end;
var
x, y: integer;
p: PBGRAPixel;
begin
Result := TStringList.Create;
Result.Add('<?xml version="1.0" encoding="UTF-8" standalone="no"?>');
Result.Add('<svg '{width="' + IntToStr(bitmap.Width) + '" height="' +
IntToStr(bitmap.Height) + '" viewPort="0 0 ' + IntToStr(bitmap.Width) +
' ' + IntToStr(bitmap.Height) + '" '} +
'xmlns="http://www.w3.org/2000/svg" version="1.1">');
Result.Add(' <g>');
for y := 0 to Bitmap.Height - 1 do
begin
p := Bitmap.Scanline[y];
for x := 0 to Bitmap.Width - 1 do
begin
if (SkipTransparent) and (p^.alpha = 0) then
// nothing
else
case Style of
pix2ellipse: Result.Add(' <ellipse cx="' + FloatToStr(x * mX) +
'.5" cy="' + FloatToStr(y * mY) + '.5" rx="' +
FloatToStr(0.5 * mX) + '" ry="' + FloatToStr(0.5 * mY) +
'" ' + BGRAtoRGBAstr(p^) + '"/>');
pix2rectangle: Result.Add(' <rect x="' + FloatToStr(x * mX) +
'.5" y="' + FloatToStr(y * mY) + '.5" width="' +
FloatToStr(1 * mX) + '" height="' + FloatToStr(1 * mY) +
'" ' + BGRAtoRGBAstr(p^) + '"/>');
pix2hexagon: Result.Add(hexagonStr(x, y, p));
end;
Inc(p);
end;
end;
Result.Add(' </g>');
Result.Add('</svg>');
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
s: TStringList;
begin
DecimalSeparator := '.';
bitmap := TBGRABitmap.Create('lazpaint.png');
s := Pix2svg(bitmap, 1, 1, pix2hexagon, True);
s.SaveToFile('lazpaint.svg');
s.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bitmap.Free;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

View File

@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="project1"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="3">
<Item1 Name="Default" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
<Item3 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item3>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="unit1.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Unit1"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,42 @@
object Form1: TForm1
Left = 422
Height = 292
Top = 114
Width = 373
Caption = 'Form1'
ClientHeight = 292
ClientWidth = 373
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.0.10.0'
object TrackBar1: TTrackBar
Left = 0
Height = 25
Top = 1
Width = 372
Frequency = 100
Max = 1000
Position = 0
Anchors = [akTop, akLeft, akRight]
TabOrder = 0
end
object vsRain: TBGRAVirtualScreen
Left = 0
Height = 259
Top = 32
Width = 372
OnRedraw = RainRedraw
Alignment = taLeftJustify
Anchors = [akTop, akLeft, akRight, akBottom]
Color = clBlack
ParentColor = False
TabOrder = 1
end
object Timer1: TTimer
Interval = 15
OnTimer = Timer1Timer
left = 108
top = 85
end
end

View File

@@ -0,0 +1,245 @@
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
ComCtrls, BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes;
const
wind = -0.5; //1 means 45 degrees rain
rainDensity = 2; //strictly positive
type
{ TForm1 }
TForm1 = class(TForm)
vsRain: TBGRAVirtualScreen;
Timer1: TTimer;
TrackBar1: TTrackBar;
procedure RainRedraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
bkg,stretchedBkg: TBGRABitmap;
prevTime: TDateTime;
prevTimeDefined: boolean;
rainData: array of record
x,ystart,yend: single;
rainWidth, rainSpeed: single;
grad: TBGRACustomGradient;
active: boolean;
inactiveTime: double;
end;
procedure ClearRainData;
procedure PrepareRainArray(nbRain: integer; ScaleX: single);
function PrepareRainDrop(i: integer; rainSizeX, rainSizeY: single): single;
procedure NeedRainArray(w, h, rainProba: integer; rainSizeX, rainSizeY: single);
procedure RainElapse(elapsed: double; rainProba, w, h: integer);
procedure RenderRain(Bitmap: TBGRABitmap);
end;
var
Form1: TForm1;
implementation
uses BGRAGradientScanner, Math;
{$R *.lfm}
{ TForm1 }
procedure TForm1.RainRedraw(Sender: TObject; Bitmap: TBGRABitmap);
var
elapsed: double;
ratio: single;
x,y,w,h: integer;
begin
if not prevTimeDefined then
begin
elapsed := 0;
end else
begin
elapsed := (Now-prevTime)*86400*10;
if elapsed < 0 then elapsed := 0;
end;
prevTime := now;
prevTimeDefined := true;
if Assigned(stretchedBkg) and
((stretchedBkg.Width <> Bitmap.Width) or (stretchedBkg.Height <> Bitmap.Height)) then
FreeAndNil(stretchedBkg);
if not Assigned(stretchedBkg) then
begin
ratio := max(Bitmap.Width/bkg.Width,Bitmap.Height/bkg.Height);
stretchedBkg := TBGRABitmap.Create(Bitmap.Width,Bitmap.Height,BGRABlack);
w := round(bkg.Width*ratio);
h := round(bkg.Height*ratio);
x := (Bitmap.Width-w) div 2;
y := (Bitmap.Height-h) div 2;
stretchedBkg.StretchPutImage(rect(x,y,x+w,y+h),bkg,dmDrawWithTransparency);
end;
RainElapse(elapsed,TrackBar1.Position,Bitmap.Width,Bitmap.Height);
Bitmap.PutImage(0,0,stretchedBkg,dmSet);
RenderRain(Bitmap);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Timer1.Enabled := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
bkg := TBGRABitmap.Create('Lighthouse.jpg');
randomize;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bkg.Free;
FreeAndNil(stretchedBkg);
ClearRainData;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= false;
vsRain.RedrawBitmap;
Timer1.Enabled:= true;
end;
procedure TForm1.ClearRainData;
var i: integer;
begin
for i := 0 to high(rainData) do
rainData[i].grad.Free;
rainData := nil;
end;
procedure TForm1.RenderRain(Bitmap: TBGRABitmap);
var
i,h2: Integer;
scan: TBGRAGradientScanner;
begin
h2 := Bitmap.Height div 2;
for i:= 0 to high(rainData) do
with rainData[i] do
if active then
begin
scan := TBGRAGradientScanner.Create(grad, gtLinear, PointF(0,ystart),PointF(0,yend));
Bitmap.DrawLineAntialias(x+(ystart-h2)*wind,ystart,x+(yend-h2)*wind,yend,scan,rainWidth,true);
scan.Free;
end;
end;
//returns raindrop height
function TForm1.PrepareRainDrop(i: integer; rainSizeX,rainSizeY: single): single;
var dist: single;
begin
with rainData[i] do
begin
dist := (random(100)+10)/10;
rainSpeed := 1/dist;
rainWidth := rainSizeX/dist;
if rainWidth < 1 then rainWidth := 1;
result := rainSizeY/dist*(random(50)+75)/100;
end;
end;
procedure TForm1.NeedRainArray(w, h, rainProba: integer; rainSizeX,rainSizeY: single);
var
nbRain: Integer;
i: Integer;
begin
nbRain := (w+round(abs(wind)*h)) *rainDensity;
if length(rainData)<> nbRain then
begin
PrepareRainArray(nbRain,1/rainDensity);
for i := 0 to high(rainData) do
with rainData[i] do
begin
x -= abs(wind)*h/2;
if random(1000) < rainProba then
begin
active := true;
ystart := Random(h*2)-h/2;
yend := ystart + PrepareRainDrop(i, rainSizeX,rainSizeY);
end;
end;
end;
end;
procedure TForm1.RainElapse(elapsed: double; rainProba,w,h: integer);
var
i: integer;
rainSizeY,rainSizeX: single;
delta: single;
begin
rainSizeY := 2+h*TrackBar1.Position/1000;
rainSizeX := 7*TrackBar1.Position/1000;
if rainSizeX < 4 then rainSizeX := 4;
NeedRainArray(w,h, rainProba, rainSizeX,rainSizeY);
for i := 0 to high(rainData) do
with rainData[i] do
if active then
begin
delta := h*rainSpeed*elapsed;
ystart += delta;
yend += delta;
if ystart >= h then
begin
if random(1000) < rainProba then
begin
yend := -(ystart-h);
ystart := yend - PrepareRainDrop(i, rainSizeX,rainSizeY);
end else
begin
active := false;
inactiveTime:= 0;
end;
end;
end else
begin
inactiveTime+= elapsed;
if inactiveTime > 0.5 then
begin
inactiveTime -= 0.5;
if random(1000) < rainProba then
begin
active := true;
ystart := -random(h)/2;
yend := ystart + PrepareRainDrop(i, rainSizeX,rainSizeY);
end;
end;
end;
end;
procedure TForm1.PrepareRainArray(nbRain: integer; ScaleX: single);
var
i: Integer;
begin
ClearRainData;
setlength(rainData, nbRain);
for i := 0 to high(rainData) do
with rainData[i] do
begin
x := i*scaleX;
grad := TBGRAMultiGradient.Create([BGRAPixelTransparent, BGRA(255,255,255,random(20)+50), BGRAPixelTransparent],[0,0.9,1],True);
active:= false;
inactiveTime := 0;
end;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

View File

@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="project1"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="3">
<Item1 Name="Default" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
<Item3 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item3>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="unit1.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Unit1"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,31 @@
object Form1: TForm1
Left = 422
Height = 292
Top = 114
Width = 373
Caption = 'Form1'
ClientHeight = 292
ClientWidth = 373
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.2.4.0'
object BGRAGraphicControl1: TBGRAGraphicControl
Left = 0
Height = 292
Top = 0
Width = 373
Align = alClient
OnRedraw = BGRAGraphicControl1Redraw
Color = clWhite
ColorOpacity = 128
Alignment = taCenter
Caption = 'BGRAGraphicControl1'
end
object Timer1: TTimer
Interval = 15
OnTimer = Timer1Timer
left = 108
top = 85
end
end

View File

@@ -0,0 +1,82 @@
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
BGRAGraphicControl, BGRABitmap, BCTypes, BGRABitmapTypes;
type
{ TForm1 }
TForm1 = class(TForm)
BGRAGraphicControl1: TBGRAGraphicControl;
Timer1: TTimer;
procedure BGRAGraphicControl1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
bkg: TBGRABitmap;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.BGRAGraphicControl1Redraw(Sender: TObject; Bitmap: TBGRABitmap
);
var
i: integer;
bmp: TBGRABitmap;
begin
//Bitmap.Fill(BGRABlack);
Bitmap.FillTransparent;
for i:= 0 to Bitmap.Width -1 do
begin
Bitmap.DrawVertLine(i,{Random(Bitmap.Height)}0,Random(Bitmap.Height),BGRA(255,255,255,Random(25)));
Bitmap.DrawVertLine(i,Random(Bitmap.Height),Random(Bitmap.Height),BGRA(255,255,255,Random(50)));
end;
bmp := Bitmap.FilterBlurMotion(10,270,True) as TBGRABitmap;
BGRAReplace(bmp, bmp.FilterBlurRadial(1,rbFast));
Bitmap.BlendImageOver(0,0,bkg,boLinearBlend);
Bitmap.BlendImageOver(0,0,bmp,boLinearBlend);
bmp.Free;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Timer1.Enabled := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
bkg := TBGRABitmap.Create('Lighthouse.jpg');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bkg.Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
BGRAGraphicControl1.DiscardBitmap;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="shadow"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="shadow.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="umain.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="shadow"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program shadow;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, umain
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

View File

@@ -0,0 +1,24 @@
object Form1: TForm1
Left = 720
Height = 240
Top = 193
Width = 320
Caption = 'Form1'
ClientHeight = 240
ClientWidth = 320
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.2.4.0'
object BGRAVirtualScreen1: TBGRAVirtualScreen
Left = 0
Height = 240
Top = 0
Width = 320
OnRedraw = BGRAVirtualScreen1Redraw
Align = alClient
Alignment = taLeftJustify
Color = clWhite
ParentColor = False
TabOrder = 0
end
end

View File

@@ -0,0 +1,83 @@
unit umain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
BGRAVirtualScreen, BGRABitmap, BCTypes, BGRABitmapTypes;
type
{ TForm1 }
TForm1 = class(TForm)
BGRAVirtualScreen1: TBGRAVirtualScreen;
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
blurSize: integer;
offset: TPoint;
logo, logoShadow: TBGRABitmap;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure SingleColor(Bitmap: TBGRABitmap; Color: TBGRAPixel);
var
i: integer;
p: PBGRAPixel;
begin
p := Bitmap.Data;
for i := Bitmap.NBPixels - 1 downto 0 do
begin
p^.red := Color.Red;
p^.green := Color.Green;
p^.blue := Color.Blue;
Inc(p);
end;
end;
function Shadow(Source: TBGRABitmap; Color: TBGRAPixel; Blur: integer): TBGRABitmap;
begin
Result := TBGRABitmap.Create(Source.Width + (2 * Blur), Source.Height + (2 * Blur));
Result.PutImage(Blur, Blur, Source, dmDrawWithTransparency);
SingleColor(Result, Color);
BGRAReplace(Result, Result.FilterBlurRadial(Blur, rbFast));
end;
{ TForm1 }
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
Bitmap.PutImage(blurSize + offSet.x, blurSize + offset.y, logoShadow,
dmDrawWithTransparency);
Bitmap.PutImage(blurSize * 2, blurSize * 2, logo, dmDrawWithTransparency);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
blurSize := 5;
offSet := Point(5, 5);
logo := TBGRABitmap.Create('logo.png');
logoShadow := Shadow(logo, BGRA(0, 200, 200, 255), blurSize);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
logo.Free;
logoShadow.Free;
end;
end.

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="test_customdrawn_win7"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<StripSymbols Value="True"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="3">
<Unit0>
<Filename Value="test_customdrawn_win7.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="utest.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmTest"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
<Unit2>
<Filename Value="customdrawn_windows7.pas"/>
<IsPartOfProject Value="True"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="test_customdrawn_win7"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<Optimizations>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<StripSymbols Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,20 @@
program test_customdrawn_win7;
{$mode objfpc}{$H+}
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
cthreads, {$ENDIF} {$ENDIF}
Interfaces,
Forms,
utest,
customdrawn_windows7;
{$R *.res}
begin
//RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TfrmTest, frmTest);
Application.Run;
end.

View File

@@ -0,0 +1,612 @@
object frmTest: TfrmTest
Left = 278
Height = 514
Top = 101
Width = 970
Caption = 'Test Custom Drawn Windows 7'
ClientHeight = 514
ClientWidth = 970
Font.Height = -14
OnCreate = FormCreate
Position = poDesktopCenter
LCLVersion = '2.2.6.0'
WindowState = wsMaximized
object BGRAVirtualScreen1: TBGRAVirtualScreen
Left = 0
Height = 514
Top = 0
Width = 970
OnRedraw = BGRAVirtualScreen1Redraw
Align = alClient
Alignment = taLeftJustify
ClientHeight = 514
ClientWidth = 970
Color = clWhite
ParentColor = False
TabOrder = 0
object CDButton10: TCDButton
Left = 648
Height = 36
Top = 8
Width = 152
Caption = 'Enable / Disable'
DrawStyle = dsDefault
OnClick = CDButton10Click
TabOrder = 0
TabStop = True
end
object CDButton1: TCDButton
Left = 8
Height = 36
Top = 8
Width = 152
Caption = 'Change DPI'
DrawStyle = dsDefault
OnClick = CDButton1Click
TabOrder = 1
TabStop = True
end
object CDButton2: TCDButton
Left = 168
Height = 36
Top = 8
Width = 152
Caption = 'Extra Tickmark'
DrawStyle = dsDefault
OnClick = CDButton2Click
TabOrder = 2
TabStop = True
end
object CDButton3: TCDButton
Left = 808
Height = 95
Top = 8
Width = 152
Caption = 'w r o n g w a y'
DrawStyle = dsDefault
Glyph.Data = {
36090000424D3609000000000000360000002800000018000000180000000100
2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000020000
00050000000900000011000000180000001E0000002300000025000000270000
0027000000270000002700000027000000270000002700000026000000230000
001F00000019000000120000000B000000050000000200000001000000010000
000200000005000000090156ACFF0156ABFF0156ACFF0158ADFF015AAFFF015C
B0FF015EB2FF015FB3FF015FB3FF015EB2FF015CB1FF015AAFFF0157ADFF0155
ABFF0154AAFF0154A9FF00000006000000030000000100000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00025BAFFF44B8F3FF45B9F3FF46BAF3FF48BBF3FF49BD
F4FF4BBEF4FF4CBFF4FF4CBFF4FF4BBEF4FF4ABDF4FF48BBF3FF45B9F3FF43B7
F2FF42B7F2FF0158ACFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000362B2FF46BCF3FF20ACF1FF21ADF1FF22AFF1FF23B0
F2FF2CB7F3FF33BDF4FF33BDF4FF2CB7F3FF23B0F2FF22AFF1FF20ADF1FF1FAB
F0FF44BAF2FF035EAFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000468B6FF4AC0F4FF23B1F2FF23B2F2FF24B3F2FF25B4
F3FF24A3DAFF1291C5FF1291C5FF24A3DAFF25B4F3FF24B3F2FF23B1F2FF22AF
F2FF47BEF4FF0464B3FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00056FB9FF51C5F6FF2AB8F3FF2AB8F3FF2BB8F4FF28B7
F4FF1185BEFF128FC4FF128FC4FF1185BEFF28B7F4FF2BB8F4FF2AB7F3FF29B6
F3FF4EC2F5FF056AB5FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000674BBFF47BFF5FF23B0F1FF24B0F1FF24B1F2FF2ABA
F4FF1E9ED8FF128EC2FF128EC2FF1E9ED8FF2BBAF4FF24B1F2FF23AFF1FF22AE
F1FF44BDF3FF056FB7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00087ABDFF51C7F7FF2BB9F4FF2CBAF4FF2CBBF5FF2DBC
F5FF2EBDF5FF1287BFFF1288BFFF2FBDF5FF2EBCF5FF2CBAF5FF2BB9F4FF2AB8
F4FF4EC4F6FF0774B9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00087EBEFF53C9F7FF2EBBF4FF2EBBF4FF2FBCF4FF30BD
F5FF31BEF5FF127DB9FF127DB9FF32BFF5FF31BDF5FF2FBCF4FF2EBAF4FF2CB9
F4FF4FC6F6FF0778BAFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000982C0FF55C9F7FF31BCF4FF31BDF4FF32BDF4FF33BF
F4FF35C0F5FF35C0F5FF36C1F5FF35C0F5FF34BFF5FF32BDF4FF30BBF4FF2FBA
F4FF51C6F6FF087CBCFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000A86C2FF88E5FBFF88E4FBFF88E5FBFF89E5FBFF8BE5
FBFF8DE6FCFF8EE6FCFF8EE6FCFF8DE6FCFF8BE6FBFF89E5FBFF86E4FBFF84E3
FBFF83E3FBFF097FBDFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000B8AC3FF0A89C2FF0A88C2FF0A88C2FF0B8AC3FF0B8B
C4FF0B8DC5FF0B8EC6FF0B8EC6FF0B8DC5FF0B8BC4FF0A89C2FF0A86C0FF0A84
BFFF0983BEFF0983BEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008D8D8DFFE0E0E0FF8D8D
8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF008D8D8DFFE0E0E0FF8D8D8DFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008F8F8FFFE0E0E0FF8F8F
8FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF008F8F8FFFE0E0E0FF8F8F8FFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00919191F0DCDCDCFF9999
99FF91919118FFFFFF00FFFFFF0091919118999999FFDCDCDCFF919191F0FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00939393C3CACACAFFBABA
BAFF939393C09393933693939336939393C0BABABAFFC9C9C9FF939393C0FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009595953F959595FCE0E0
E0FFC7C7C7FFA5A5A5FFA5A5A5FFC7C7C7FFE0E0E0FF959595FC9595953CFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0097979778ACAC
ACFFD0D0D0FFE5E5E5FFE5E5E5FFD0D0D0FFACACACFF97979778FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009898
983F989898B1989898E4989898E4989898B19898983FFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
TabOrder = 3
TabStop = True
end
object CDEdit1: TCDEdit
Left = 808
Height = 36
Top = 112
Width = 152
DrawStyle = dsDefault
end
object CDGroupBox1: TCDGroupBox
Left = 8
Height = 128
Top = 56
Width = 217
AutoSize = True
Caption = 'Allow Grayed Enabled'
DrawStyle = dsDefault
end
object cb_a_u: TCDCheckBox
Left = 16
Height = 19
Top = 80
Width = 86
AllowGrayed = True
DrawStyle = dsDefault
Caption = 'Unchecked'
end
object cb_a_c: TCDCheckBox
Left = 16
Height = 19
Top = 112
Width = 71
AllowGrayed = True
Checked = True
DrawStyle = dsDefault
Caption = 'Checked'
State = cbChecked
end
object cb_a_g: TCDCheckBox
Left = 16
Height = 19
Top = 144
Width = 63
AllowGrayed = True
DrawStyle = dsDefault
Caption = 'Grayed'
State = cbGrayed
end
object CDGroupBox2: TCDGroupBox
Left = 7
Height = 128
Top = 192
Width = 217
AutoSize = True
Caption = 'Allow Grayed Disabled'
DrawStyle = dsDefault
end
object cbd_a_g: TCDCheckBox
Left = 16
Height = 19
Top = 280
Width = 63
AllowGrayed = True
DrawStyle = dsDefault
Caption = 'Grayed'
Enabled = False
State = cbGrayed
end
object cbd_a_c: TCDCheckBox
Left = 16
Height = 19
Top = 248
Width = 71
AllowGrayed = True
Checked = True
DrawStyle = dsDefault
Caption = 'Checked'
Enabled = False
State = cbChecked
end
object cbd_a_u: TCDCheckBox
Left = 16
Height = 19
Top = 216
Width = 86
AllowGrayed = True
DrawStyle = dsDefault
Caption = 'Unchecked'
Enabled = False
end
object CDRadioButton1: TCDRadioButton
Left = 480
Height = 19
Top = 80
Width = 86
Caption = 'Unchecked'
DrawStyle = dsDefault
end
object CDRadioButton2: TCDRadioButton
Left = 480
Height = 19
Top = 112
Width = 71
Caption = 'Checked'
DrawStyle = dsDefault
end
object CDRadioButton3: TCDRadioButton
Left = 480
Height = 19
Top = 144
Width = 86
Caption = 'Unchecked'
DrawStyle = dsDefault
Enabled = False
end
object CDRadioButton4: TCDRadioButton
Left = 480
Height = 19
Top = 176
Width = 71
Caption = 'Checked'
Checked = True
DrawStyle = dsDefault
Enabled = False
end
object CDGroupBox3: TCDGroupBox
Left = 240
Height = 128
Top = 56
Width = 217
AutoSize = True
Caption = 'Don''t Grayed Enabled'
DrawStyle = dsDefault
end
object CDGroupBox4: TCDGroupBox
Left = 240
Height = 128
Top = 192
Width = 217
AutoSize = True
Caption = 'Don''t Grayed Disabled'
DrawStyle = dsDefault
end
object cb_u: TCDCheckBox
Left = 248
Height = 19
Top = 80
Width = 86
DrawStyle = dsDefault
Caption = 'Unchecked'
end
object cb_c: TCDCheckBox
Left = 248
Height = 19
Top = 112
Width = 71
Checked = True
DrawStyle = dsDefault
Caption = 'Checked'
State = cbChecked
end
object cb_g: TCDCheckBox
Left = 248
Height = 19
Top = 144
Width = 63
Checked = True
DrawStyle = dsDefault
Caption = 'Grayed'
State = cbChecked
end
object cbd_u: TCDCheckBox
Left = 248
Height = 19
Top = 216
Width = 86
DrawStyle = dsDefault
Caption = 'Unchecked'
Enabled = False
end
object cbd_c: TCDCheckBox
Left = 248
Height = 19
Top = 248
Width = 71
Checked = True
DrawStyle = dsDefault
Caption = 'Checked'
Enabled = False
State = cbChecked
end
object cbd_g: TCDCheckBox
Left = 248
Height = 19
Top = 280
Width = 63
Checked = True
DrawStyle = dsDefault
Caption = 'Grayed'
Enabled = False
State = cbChecked
end
object CDStaticText1: TCDStaticText
Left = 648
Height = 36
Top = 112
Width = 152
Caption = 'CDStaticText1'
DrawStyle = dsDefault
end
object CDProgressBar1: TCDProgressBar
Left = 7
Height = 34
Top = 328
Width = 218
BarShowText = False
DrawStyle = dsDefault
Max = 100
Orientation = pbRightToLeft
Position = 50
Smooth = False
Style = pbstNormal
end
object CDProgressBar2: TCDProgressBar
Left = 7
Height = 34
Top = 368
Width = 218
BarShowText = False
DrawStyle = dsDefault
Max = 100
Orientation = pbHorizontal
Position = 50
Smooth = False
Style = pbstNormal
end
object CDProgressBar3: TCDProgressBar
Left = 240
Height = 176
Top = 328
Width = 34
BarShowText = False
DrawStyle = dsDefault
Max = 100
Orientation = pbVertical
Position = 50
Smooth = False
Style = pbstNormal
end
object CDProgressBar4: TCDProgressBar
Left = 281
Height = 176
Top = 328
Width = 34
BarShowText = False
DrawStyle = dsDefault
Max = 100
Orientation = pbTopDown
Position = 50
Smooth = False
Style = pbstNormal
end
object CDTrackBar1: TCDTrackBar
Left = 6
Height = 40
Top = 416
Width = 218
Max = 100
Min = 0
OnChange = CDTrackBar1Change
Position = 50
DrawStyle = dsDefault
end
object CDTrackBar2: TCDTrackBar
Left = 328
Height = 176
Top = 328
Width = 40
Max = 100
Min = 0
OnChange = CDTrackBar1Change
Position = 50
DrawStyle = dsDefault
Orientation = trVertical
end
object CDButton4: TCDButton
Left = 328
Height = 36
Top = 8
Width = 152
Caption = 'Change Folder'
DrawStyle = dsDefault
OnClick = CDButton4Click
TabOrder = 32
TabStop = True
end
object CDButton5: TCDButton
Left = 648
Height = 30
Top = 160
Width = 30
Caption = 'arrowleft'
DrawStyle = dsExtra1
TabOrder = 33
TabStop = True
end
object CDButton6: TCDButton
Left = 728
Height = 30
Top = 160
Width = 30
Caption = 'arrowright'
DrawStyle = dsExtra1
TabOrder = 34
TabStop = True
end
object CDButton7: TCDButton
Left = 808
Height = 20
Top = 160
Width = 20
Caption = 'arrow'
DrawStyle = dsExtra1
TabOrder = 35
TabStop = True
end
object CDButton8: TCDButton
Left = 872
Height = 16
Top = 160
Width = 17
Caption = 'closebutton'
DrawStyle = dsExtra1
TabOrder = 36
TabStop = True
end
object CDComboBox1: TCDComboBox
Left = 728
Height = 34
Top = 256
Width = 192
DrawStyle = dsDefault
ItemIndex = -1
KeyboardInputBehavior = kibAutomatic
end
object CDScrollBar1: TCDScrollBar
Left = 728
Height = 18
Top = 304
Width = 192
Max = 100
Min = 0
Position = 0
DrawStyle = dsDefault
Kind = sbHorizontal
PageSize = 0
TabStop = False
end
object CDScrollBar2: TCDScrollBar
Left = 928
Height = 114
Top = 208
Width = 18
Max = 100
Min = 0
Position = 0
DrawStyle = dsDefault
Kind = sbVertical
PageSize = 0
TabStop = False
end
object CDListView1: TCDListView
Left = 728
Height = 168
Top = 336
Width = 218
Columns = <>
ScrollBars = ssBoth
ViewStyle = vsIcon
end
object CDPageControl1: TCDPageControl
Left = 464
Height = 104
Top = 400
Width = 232
DrawStyle = dsDefault
Caption = 'CDPageControl1'
PageIndex = 0
Options = []
TabIndex = 0
end
object CDPageControl2: TCDPageControl
Left = 464
Height = 184
Top = 208
Width = 232
ActivePage = CDTabSheet1
DrawStyle = dsDefault
Caption = 'CDPageControl2'
PageIndex = 1
Options = []
TabIndex = 1
object CDTabSheet2: TCDTabSheet
Left = 2
Height = 155
Top = 27
Width = 228
Caption = 'CDTabSheet2'
TabVisible = False
end
object CDTabSheet1: TCDTabSheet
Left = 2
Height = 155
Top = 27
Width = 228
Caption = 'CDTabSheet1'
TabVisible = False
end
end
object CDSpinEdit1: TCDSpinEdit
Left = 728
Height = 40
Top = 208
Width = 192
DrawStyle = dsDefault
Lines.Strings = (
'0'
)
Increment = 1
MaxValue = 100
end
object CDTrackBar3: TCDTrackBar
Left = 376
Height = 176
Top = 328
Width = 40
Max = 100
Min = 0
OnChange = CDTrackBar1Change
Position = 50
DrawStyle = dsDefault
Enabled = False
Orientation = trVertical
end
object CDTrackBar4: TCDTrackBar
Left = 5
Height = 40
Top = 464
Width = 218
Max = 100
Min = 0
OnChange = CDTrackBar1Change
Position = 50
DrawStyle = dsDefault
Enabled = False
end
object CDButton9: TCDButton
Left = 488
Height = 36
Top = 8
Width = 152
Caption = 'Debug'
DrawStyle = dsDefault
OnClick = CDButton9Click
TabOrder = 46
TabStop = True
end
end
end

View File

@@ -0,0 +1,238 @@
unit utest;
{$mode objfpc}{$H+}
interface
uses
Forms, SysUtils,
{ Custom Drawn }
customdrawncontrols, customdrawndrawers, StdCtrls,
{ BGRABitmap }
BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes,
{ Custom Drawn + BGRABitmap }
customdrawn_windows7;
type
{ TfrmTest }
TfrmTest = class(TForm)
BGRAVirtualScreen1: TBGRAVirtualScreen;
cbd_a_c: TCDCheckBox;
cbd_a_g: TCDCheckBox;
cbd_a_u: TCDCheckBox;
cbd_c: TCDCheckBox;
cbd_g: TCDCheckBox;
cbd_u: TCDCheckBox;
cb_a_c: TCDCheckBox;
cb_a_g: TCDCheckBox;
cb_a_u: TCDCheckBox;
cb_c: TCDCheckBox;
cb_g: TCDCheckBox;
cb_u: TCDCheckBox;
CDButton1: TCDButton;
CDButton10: TCDButton;
CDButton2: TCDButton;
CDButton3: TCDButton;
CDButton4: TCDButton;
CDButton5: TCDButton;
CDButton6: TCDButton;
CDButton7: TCDButton;
CDButton8: TCDButton;
CDButton9: TCDButton;
CDComboBox1: TCDComboBox;
CDEdit1: TCDEdit;
CDGroupBox1: TCDGroupBox;
CDGroupBox2: TCDGroupBox;
CDGroupBox3: TCDGroupBox;
CDGroupBox4: TCDGroupBox;
CDListView1: TCDListView;
CDPageControl1: TCDPageControl;
CDPageControl2: TCDPageControl;
CDProgressBar1: TCDProgressBar;
CDProgressBar2: TCDProgressBar;
CDProgressBar3: TCDProgressBar;
CDProgressBar4: TCDProgressBar;
CDRadioButton1: TCDRadioButton;
CDRadioButton2: TCDRadioButton;
CDRadioButton3: TCDRadioButton;
CDRadioButton4: TCDRadioButton;
CDScrollBar1: TCDScrollBar;
CDScrollBar2: TCDScrollBar;
CDSpinEdit1: TCDSpinEdit;
CDStaticText1: TCDStaticText;
CDTabSheet1: TCDTabSheet;
CDTabSheet2: TCDTabSheet;
CDTrackBar1: TCDTrackBar;
CDTrackBar2: TCDTrackBar;
CDTrackBar3: TCDTrackBar;
CDTrackBar4: TCDTrackBar;
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure CDButton10Click(Sender: TObject);
procedure CDButton1Click(Sender: TObject);
procedure CDButton2Click(Sender: TObject);
procedure CDButton4Click(Sender: TObject);
procedure CDButton9Click(Sender: TObject);
procedure CDScrollBar1Change(Sender: TObject);
procedure CDTrackBar1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
frmTest: TfrmTest;
implementation
{$R *.lfm}
{ TfrmTest }
procedure TfrmTest.FormCreate(Sender: TObject);
begin
{ This code set the dsWindows7 style
that is registered in the unit customdrawn_windows7 }
DefaultStyle := dsWindows7;
{ Set the form color }
Color := WIN7_FORM_COLOR;
BGRAVirtualScreen1.Color := WIN7_FORM_COLOR;
end;
{ The code below is how to configure this drawer }
procedure TfrmTest.CDButton1Click(Sender: TObject);
begin
{ This code is for changing DPI }
if win7.dpi = 96 then
win7.dpi := 120
else if win7.dpi = 120 then
win7.dpi := 144
else if win7.dpi = 144 then
win7.dpi := 96
else
win7.dpi := 96;
{ This code is for scaling extra1 buttons }
// extra1 'arrowleft' in caption
CDButton5.Width := win7.ArrowLeft.SliceScalingArray[0].BitmapWidth;
CDButton5.Height := win7.ArrowLeft.SliceScalingArray[0].BitmapHeight;
// extra1 'arrowright' in caption
CDButton6.Width := win7.ArrowRight.SliceScalingArray[0].BitmapWidth;
CDButton6.Height := win7.ArrowRight.SliceScalingArray[0].BitmapHeight;
// extra1 'arrow' in caption
CDButton7.Width := win7.Arrow.SliceScalingArray[0].BitmapWidth;
CDButton7.Height := win7.Arrow.SliceScalingArray[0].BitmapHeight;
// extra1 'closebutton' in caption
CDButton8.Width := win7.CloseButton.SliceScalingArray[0].BitmapWidth;
CDButton8.Height := win7.CloseButton.SliceScalingArray[0].BitmapHeight;
{ Do changes visible }
Invalidate;
end;
procedure TfrmTest.CDButton2Click(Sender: TObject);
begin
{ This code is for using the extra tickmark }
win7.tickmark := not win7.tickmark;
{ Do changes visible }
Invalidate;
end;
procedure TfrmTest.CDButton4Click(Sender: TObject);
begin
{ This code is for changing the folder }
if win7.folder = 'aero.zip' then
win7.folder := 'aerow8.zip'
else if win7.folder = 'aerow8.zip' then
win7.folder := 'luna.zip'
else if win7.folder = 'luna.zip' then
win7.folder := 'extra.zip'
else if win7.folder = 'extra.zip' then
win7.folder := 'aerow11.zip'
else if win7.folder = 'aerow11.zip' then
win7.folder := 'aero.zip'
else
win7.folder := 'aero.zip';
{ Do changes visible }
Invalidate;
end;
procedure TfrmTest.CDButton9Click(Sender: TObject);
begin
{ This show / hide debug lines }
win7.debug := not win7.debug;
{ Do changes visible }
Invalidate;
end;
{ The code below is just for testing purposes }
procedure TfrmTest.CDButton10Click(Sender: TObject);
begin
CDButton5.Enabled := not CDButton5.Enabled;
CDButton6.Enabled := not CDButton6.Enabled;
CDButton7.Enabled := not CDButton7.Enabled;
CDButton8.Enabled := not CDButton8.Enabled;
CDScrollBar1.Enabled := not CDScrollBar1.Enabled;
CDScrollBar2.Enabled := not CDScrollBar2.Enabled;
CDComboBox1.Enabled := not CDComboBox1.Enabled;
CDStaticText1.Enabled := not CDStaticText1.Enabled;
CDSpinEdit1.Enabled := not CDSpinEdit1.Enabled;
CDListView1.Enabled := not CDListView1.Enabled;
CDButton3.Enabled := not CDButton3.Enabled;
CDEdit1.Enabled := not CDEdit1.Enabled;
CDPageControl1.Enabled := not CDPageControl1.Enabled;
CDPageControl2.Enabled := not CDPageControl2.Enabled;
end;
procedure TfrmTest.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure DrawTileBackground(ABitmap: TBGRABitmap; Multiply: integer);
var
temp: TBGRABitmap;
begin
temp := TBGRABitmap.Create(2, 2, BGRAWhite);
temp.SetPixel(0, 1, BGRA(220, 220, 220));
temp.SetPixel(1, 0, BGRA(220, 220, 220));
BGRAReplace(temp, temp.Resample(2 * Multiply, 2 * Multiply, rmSimpleStretch));
ABitmap.Fill(temp, dmSet);
temp.Free;
end;
begin
DrawTileBackground(Bitmap, 8);
//DrawIOSBackground(Bitmap);
end;
procedure TfrmTest.CDScrollBar1Change(Sender: TObject);
begin
CDProgressBar1.Position := TCDScrollBar(Sender).Position;
CDProgressBar2.Position := TCDScrollBar(Sender).Position;
CDProgressBar3.Position := TCDScrollBar(Sender).Position;
CDProgressBar4.Position := TCDScrollBar(Sender).Position;
end;
procedure TfrmTest.CDTrackBar1Change(Sender: TObject);
begin
CDProgressBar1.Position := TCDTrackBar(Sender).Position;
CDProgressBar2.Position := TCDTrackBar(Sender).Position;
CDProgressBar3.Position := TCDTrackBar(Sender).Position;
CDProgressBar4.Position := TCDTrackBar(Sender).Position;
CDTrackBar1.Position := CDProgressBar1.Position;
CDTrackBar2.Position := CDProgressBar1.Position;
CDTrackBar3.Position := CDProgressBar1.Position;
CDTrackBar4.Position := CDProgressBar1.Position;
end;
end.

View File

@@ -0,0 +1,235 @@
object Form1: TForm1
Left = 65
Height = 530
Top = 47
Width = 1191
Caption = 'Form1'
ClientHeight = 530
ClientWidth = 1191
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '1.1'
object Chart1: TChart
Left = 0
Height = 530
Top = 0
Width = 1069
AxisList = <
item
Minors = <>
Title.LabelFont.Orientation = 900
end
item
Alignment = calBottom
Minors = <>
end>
BackColor = clBlack
Foot.Brush.Color = clBtnFace
Foot.Font.Color = clBlue
Margins.Bottom = 0
Title.Brush.Color = clBtnFace
Title.Font.Color = clBlue
Title.Text.Strings = (
'TAChart'
)
Align = alClient
DoubleBuffered = True
ParentColor = False
object Chart1BarSeries1: TBarSeries
BarBrush.Color = 2183646
BarBrush.Style = bsClear
BarPen.Style = psClear
Source = ListChartSource1
OnBeforeDrawBar = Chart1BarSeries1BeforeDrawBar
end
end
object Panel1: TPanel
Left = 1069
Height = 530
Top = 0
Width = 122
Align = alRight
ClientHeight = 530
ClientWidth = 122
TabOrder = 1
object rgMethod: TRadioGroup
Left = 1
Height = 97
Top = 1
Width = 120
Align = alTop
AutoFill = True
Caption = ' Method '
ChildSizing.LeftRightSpacing = 6
ChildSizing.TopBottomSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
ClientHeight = 75
ClientWidth = 116
ItemIndex = 0
Items.Strings = (
'Grow'
'Add'
'Add then grow'
)
OnClick = rgMethodClick
TabOrder = 0
end
object btnStartStop: TButton
Left = 9
Height = 25
Top = 144
Width = 75
Caption = 'Start / stop'
OnClick = btnStartStopClick
TabOrder = 1
end
object lblSkipped: TLabel
Left = 9
Height = 1
Top = 340
Width = 1
ParentColor = False
end
object seTime: TSpinEdit
Left = 9
Height = 28
Top = 108
Width = 74
Increment = 100
MaxValue = 10000
MinValue = 100
OnChange = seTimeChange
TabOrder = 2
Value = 1000
end
object Image1: TImage
Left = 9
Height = 104
Top = 176
Width = 42
Picture.Data = {
1754506F727461626C654E6574776F726B477261706869636D0C000089504E47
0D0A1A0A0000000D494844520000007A0000012B080600000011FC970200000C
3449444154789CED9BDD6F1CD519879F77776D2724C1490089508AD77C5541A5
711042A288DA6E8B6855150CA8BD4014D652ABF68EE52F60F31F6CEE0A05692D
A45E4445904A6D2F682BBB1555D5A6C2B9EAED5AAA2805DAD89010278E7D7A71
66D88D598F77D7B3F3B1EFFB4823DBBBB373CECCB3E7FCCE39331614E1CE318E
A30680509307594BB74646ECB8BFF2A2FB1B17DCDF71EE1CCEFD830BEE1C2FA6
5DAFA490B42B3068DC5F98A64003A18CC0751B80D0042AF2004B69D531098656
B47B97090A3480998E820BC1CFD6EB8B8C5291FB5849BCB2093074A2DD39C659
A746816A5BABED4674F85E9D83D4E4AEE1CAEFA112EDFECC8B408D0287B775CF
BD880658A5404DEEE77412F54E82A110EDFEC4348E06851D73B837D1ADBF9B14
A9C8F1FCE777AE45BB7799608306D22187E311DDCA6FF29DDFB914EDDE619C12
35242287E315ED37479DB17CE677EE44BBDFF30205EAC82E393C08D1FEBD5584
AA7C8585019CDEC0C88D68F747A6D9A28E30D5879C384587DB324255EEC9477E
675EB4FB031381E0B94871C98B0E5F7B9B2255B933DBF99D59D1EE1DC6D9A28A
50EB4A5C7AA2C3DF6B403DABF99D49D1EE77BC806CCBE1EC8B6EE5F764F6F23B
53A2DD6F99861D72381FA2C36D992255F97276F23B13A2DD6F98805D72385FA2
FDE6789B51AA725BFAF99DAA68F70EE3AC7799C37914DD7AAFC601EA7234BDFC
4E4DB43BDB630EE75B3410E4F7EDE9E477E2A2DDAF99668B1AC24CE2173B4DD1
AD6D11A126C792CDEFC444BB3799A0400DA192FAC54EB3ECD67B0DF6519323C9
E4F7C045BB338C53A48A5F973E9C898B9D66D9D7BFB78A506764F0F93D50D1EE
57BC805F482867EA62A75976A7F7A049919ADC3CB8FC1E886877866924C8E12C
5EEC34CB8E3ED622256A7224FEFC8E55B47B930936A851087238AB173BCDB2BB
3B568342BCF91D8B68778671363BE470562F769A65777F2C9FDF87A98BEC3DBF
F72CDAFD322287B37AB1D32CBBF763352950931BF796DF7D8B766F7002A14E21
2287B37AB1D32CBBDF633916295195839CA70F7A16EDCE30CE3AF5AE7238AB17
3BCDB2F77A2C6870886AAFDD7961F75D5AB8377899759A08955E3E67C48850E1
224D7789977BFB5817B8059EC451FFFC71DAF093796D5569961DEF7934295195
31CEB20B91A2DDEB9C081EC49B19AA8B9D66D983398F458A546574E7FCEE28DA
BDC23825EAC8B61C1E968B9D66D9833D8F06A39DF3FB0B19ED5EE7654AFE3F0C
B7BF67649E0A1B34DDC617F3FBF316ED7ED1450E0F4BAB4AB3ECA4CEC3D1A440
554A3EBFC5FD9C13D0361FCE422587B9ECA4CF23C8EF12C232C63033C316CB3D
CDA38D9CE1828DB0E14BF09BECF4092357386093CF250394AEDBA15DF86672F5
32622214DC9ED301A50EBBFB9D4681AD6033B24D7B0BDEA167EE2C3AA418EC61
C2B3CB355AAD3862C4152D9AE000A5E0E735AEEBF78D14D90436D85570C8EEA2
430418C38BBEDA57D58C38D8A275FD3B64F14E742F3AA408DC806FDD1B3D7FDA
E897B0815DC3B7E01E27C6BD8B0E190DB6ABD8087DD05C05AEB0A72970FFA209
0ADD8FFFB65DC184C7CD35609DD6687A0FEC4D74481138C8F51533FA67137F1D
37896D212B1ED12123F801DB9560337A231C68ADD3570E4711AFE890FDC03E7C
856D84DE1DEBC067F43492EE85C18806FF6D3C88FF965EC277EBC617B98ABF3E
8E814986418A6E2FE1307E2A7611CBEF904DFCF5D820F66EBA1383171D3286EF
D22F0197D12B7C0BDF4587DD7442378A93131D7230D83E45DF80ED33FC794362
824392170DFE248FE0BBAD4F19FE15B62BF8F30C57B552B8EF9F8EE89031FCE8
FC32FE420CDB1DB26BF8F3BA4C22391C45BAA2430EE0D7CF2F311C03B62DBCE0
8B0C7424DD0BD9100DFEDB3E0E1C023EC14BCF23178135BCEC0C3D9E951DD121
25E066BCF035F23360BB8CAFEF55322538247BA243F6E1BBF3B08564F586C906
B04AE2D3A55EC9AEE89043B4A6639F909D01DB26BE3EE17F3965547048F64583
BF3B76149FE1FFC3B7F23459032EE0BF74196EC5EDE44374C808702BFE06C0C7
247FC3641DF888D6430039101C922FD1213700657CD7F91183EFCE37810FF1F1
919316BC9D7C8A0E19076EC40F863E1E50191FE1BBE9189EF248937C8B069FDF
B7E0EF907D487CF9FD09F01F627DCA234DF22F3A6414B8033F9FFD80FEE7DF97
F1823F2377391CC5F0880E3900DC8D1F19FF9BEEF37B33D87F95A168C1DB193E
D12147F0DDF97FF12DB49DED123FA095F143263864784583CFEF5B819B80F7F1
B9DBCE6AF07A9F0FC5E789E1161D320ADC891FA8BD8F5F74F917995FB68C1305
A7D8C621E038F04FD25F5D4B185DA21563A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560
A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A295
60A29560A29560A29560A29560A29560A29560A29560A29560A29560A29560A2
9560A29560A29560A29560A29560A29550C0510556D3AE88313056816A417EC6
691C651CF5B46B64C44E9D12652972BA00203F654D7EC24B38CAC062AA5533E2
609131CA32CA4B22ACC1B68C961FB322F3CC22CCE068A65245A37F1C4D0ACCC8
7E664558697FABE3604C9E67499E6712471567F99D035681AADCC8A4EC67A9D3
0E91A36EF911A719B1FCCE348E3AE394659CD351BBED3ABD921FB226CFF21225
CBEF8CB14891B2DCD4CAE128BA9E47CB33ACC80F82FCC6F23B457C0EDFC2AC1C
B93E87A3E879C1449E66499E6612B1FC4E1417E4F03126E596CE391C45DF2B63
F224A739401947A3DF63185DD3E00065B92D3A87A3D8D312A83CC69A3CC13C5B
4C61F93D081629322577302F4777CFE1286259EB96EF735EBECB2C3067F3EF18
F0F3E1399964566EE77C1C878CF5A6867C87B3F2389308356CFDBC1F56116A72
2F9332C9D9380F3C90BB57F22D4EB145192CBF7BA0C10865B987538338F8C06E
53CA63ACC92CF3142CBF776111C7941C675EEEDA5B0E4731F0FBD1F228E7E51B
CC22CC61F3EF769A0873723FB3F2D57872388AC41E3C9047382B5F6712D4E7B7
CFE12926E56BF1E67014893F61220F738AA2D2F9B7A381A32C270793C351A4F2
28913CC89A3CC47CB09CBA98461D12661161461E625E1E1C5C0E4791EA3363F2
004BF200B30895219D7F37112AF230B3F250EFCB967192898703E5040B1C620A
A80DC5FAB9F339CC3EA6E46116D2AE0E64443480DCC59ADCCFA9603AD648BB3E
7BA0C10853F228A7D2EAA63B9119D121721F2B729C798AB9CB6F9FC3B3CCCB23
DDDF3E4C8ACC890E917B58927B83FCCEF6FCBB89A322DF6656BE996E0E479159
D12172370B90C1FCF675A951644A1ECF460E47216957A017DCFB4C708D1A052A
14F0B52F04DB4EBFB7FF1DFE7CADC36B3BEDDBE975A141919A7C2F7B5DF44E64
BE45B723B7B1227704F9ED584EA10ACB0833F204F379920C39131D22C758922F
7112A890CC72EA2A5091394ECA13D9CDE12872293A448EB1C00865FCFAF9A0A8
B149599ECE7E0E4791AB8C8EC25D6002479D0273B16434BCCD185579265F5DF4
4EE4BA45B723475891A33C15437E2F0333F22C4F0D8B641822D12172882539CC
C960FDBCFBFCF6CB9615798E93F26C3E73388AA1131D220759E040D7F95DE306
CAF25CBE73583DCE31E1AEF096DBC0B94D9C7B05E75EC5B9D778CBBDC644DAF5
3362C66D30ED3679CFBDC27BEE55A6D3AE4F92FC1FB4C45EB54DA944FF000000
0049454E44AE426082
}
Proportional = True
Stretch = True
end
end
object ListChartSource1: TListChartSource
DataPoints.Strings = (
'1|2|?|'
'2|3|?|'
'3|5|?|'
'4|6|?|'
'5|9|?|'
'6|7|?|'
'7|8|?|'
)
left = 560
top = 292
end
end

View File

@@ -0,0 +1,131 @@
unit Main;
{$mode objfpc}{$H+}
interface
uses
Classes, ExtCtrls, Spin, StdCtrls, SysUtils, FileUtil, Forms, Controls,
Graphics, Dialogs, TACustomSource, TAGraph, TASeries, TASources,
TAAnimatedSource,
BGRABitmap, BGRABitmapTypes, BGRASliceScaling, types;
type
{ TForm1 }
TForm1 = class(TForm)
btnStartStop: TButton;
Chart1: TChart;
Chart1BarSeries1: TBarSeries;
Image1: TImage;
lblSkipped: TLabel;
ListChartSource1: TListChartSource;
Panel1: TPanel;
rgMethod: TRadioGroup;
seTime: TSpinEdit;
procedure btnStartStopClick(Sender: TObject);
procedure Chart1BarSeries1BeforeDrawBar(ASender: TBarSeries;
ACanvas: TCanvas; const ARect: TRect; APointIndex, AStackIndex: Integer;
var ADoDefaultDrawing: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure rgMethodClick(Sender: TObject);
procedure seTimeChange(Sender: TObject);
private
FAnimatedSource: TCustomAnimatedChartSource;
procedure OnGetItem(
ASource: TCustomAnimatedChartSource;
AIndex: Integer; var AItem: TChartDataItem);
procedure OnStop(ASource: TCustomAnimatedChartSource);
public
sliceScaling: TBGRASliceScaling;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
uses
Math;
{ TForm1 }
procedure TForm1.btnStartStopClick(Sender: TObject);
begin
if FAnimatedSource.IsAnimating then
FAnimatedSource.Stop
else
FAnimatedSource.Start;
end;
procedure TForm1.Chart1BarSeries1BeforeDrawBar(ASender: TBarSeries;
ACanvas: TCanvas; const ARect: TRect; APointIndex, AStackIndex: Integer;
var ADoDefaultDrawing: Boolean);
var
temp: TBGRABitmap;
begin
temp := TBGRABitmap.Create(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
sliceScaling.Draw(temp, 0, 0, temp.Width, temp.Height, False);
temp.Draw(ACanvas, ARect.Left, ARect.Top, False);
temp.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FAnimatedSource := TCustomAnimatedChartSource.Create(Self);
FAnimatedSource.Origin := ListChartSource1;
FAnimatedSource.AnimationInterval := 30;
FAnimatedSource.OnGetItem := @OnGetItem;
FAnimatedSource.OnStop := @OnStop;
seTimeChange(nil);
Chart1BarSeries1.Source := FAnimatedSource;
FAnimatedSource.Start;
sliceScaling := TBGRASliceScaling.Create(Image1.Picture.Bitmap, 70, 0, 35, 0);
//sliceScaling.ResampleMode := rmSimpleStretch;
sliceScaling.AutodetectRepeat;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
sliceScaling.Free;
end;
procedure TForm1.OnGetItem(
ASource: TCustomAnimatedChartSource;
AIndex: Integer; var AItem: TChartDataItem);
begin
case rgMethod.ItemIndex of
0: AItem.Y *= ASource.Progress;
1:
if ASource.Count * ASource.Progress < AIndex then
AItem.Y := 0;
2:
case Sign(Trunc(ASource.Count * ASource.Progress) - AIndex) of
0: AItem.Y *= Frac(ASource.Count * ASource.Progress);
-1: AItem.Y := 0;
end;
end;
end;
procedure TForm1.OnStop(ASource: TCustomAnimatedChartSource);
begin
lblSkipped.Caption := Format('Skipped frames: %d', [ASource.SkippedFramesCount]);
end;
procedure TForm1.rgMethodClick(Sender: TObject);
begin
FAnimatedSource.Start;
end;
procedure TForm1.seTimeChange(Sender: TObject);
begin
FAnimatedSource.AnimationTime := seTime.Value;
end;
end.

View File

@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="TAChart animated source demo"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="animatedemo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<StripSymbols Value="True"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerMessages>
<UseMsgFile Value="True"/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</Item2>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="4">
<Item1>
<PackageName Value="bgracontrols"/>
</Item1>
<Item2>
<PackageName Value="BGRABitmapPack"/>
</Item2>
<Item3>
<PackageName Value="TAChartLazarusPkg"/>
</Item3>
<Item4>
<PackageName Value="LCL"/>
</Item4>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="animatedemo.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="animatedemo"/>
</Unit0>
<Unit1>
<Filename Value="Main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="animatedemo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<Optimizations>
<VariablesInRegisters Value="True"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<StripSymbols Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerMessages>
<UseMsgFile Value="True"/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@@ -0,0 +1,21 @@
program animatedemo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Main, bgrabitmappack, tachartlazaruspkg;
{$R *.res}
begin
Application.Title := 'TAChart animated source demo';
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.