Browse Source

Merge pull request #202 from sganz/dev-bgracontrols

Added SuperGauge work, Images
Leandro Oscar Ezequiel Diaz 1 year ago
parent
commit
6c7ed32d3c

+ 10 - 1
bgracontrols.lpk

@@ -34,7 +34,7 @@
     <Description Value="BGRA Controls is a set of graphical UI elements that you can use with Lazarus LCL applications."/>
     <License Value="Modified LGPL"/>
     <Version Major="9" Release="1" Build="6"/>
-    <Files Count="79">
+    <Files Count="81">
       <Item1>
         <Filename Value="atshapelinebgra.pas"/>
         <HasRegisterProc Value="True"/>
@@ -421,6 +421,15 @@
         <HasRegisterProc Value="True"/>
         <UnitName Value="BCLeaEngrave"/>
       </Item79>
+      <Item80>
+        <Filename Value="supergauge.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="supergauge"/>
+      </Item80>
+      <Item81>
+        <Filename Value="supergaugecommon.pas"/>
+        <UnitName Value="supergaugecommon"/>
+      </Item81>
     </Files>
     <CompatibilityMode Value="True"/>
     <LazDoc Paths="fpdoc"/>

+ 2 - 1
bgracontrols.pas

@@ -25,7 +25,7 @@ uses
   dtthemedclock, dtthemedgauge, MaterialColors, bgrasvgimagelistform, 
   BCLeaLCDDisplay, BCLeaLED, BCLeaQLED, BCLeaRingSlider, BCLeaSelector, 
   BCLeaTheme, BCLeaLCDDisplay_EditorRegister, BCLeaBoard, BCLeaEngrave, 
-  LazarusPackageIntf;
+  supergauge, supergaugecommon, LazarusPackageIntf;
 
 implementation
 
@@ -93,6 +93,7 @@ begin
     @BCLeaLCDDisplay_EditorRegister.Register);
   RegisterUnit('BCLeaBoard', @BCLeaBoard.Register);
   RegisterUnit('BCLeaEngrave', @BCLeaEngrave.Register);
+  RegisterUnit('supergauge', @supergauge.Register);
 end;
 
 initialization

+ 58 - 0
icons/supergauge.lrs

@@ -0,0 +1,58 @@
+LazarusResources.Add('tsupergauge','PNG',[
+  #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+  +#202#0#0#3#0'PLTE'#255#255#255#255#255#255#128#128#128#185'wGooo~~~'#247#247
+  +#247'((('#5#5#5#18#18#18#253#253#253#16#16#16#12#12#12#174#174#174'555222{{{'
+  +#207#207#207#203#203#203'&&&333'#177#177#177#236#236#236#127#127#127#220#220
+  +#127'hhh'#231#231#231#134#134#128#9#9#9'>>>WWW'#214'))nnnTTTpppUUU'#13#13#13
+  +#217#217#217'vvvbbb'#214#214#214#222#222#222'sss'#218#218#218'ddd}}}www'#204
+  +#204#204#173#173#173#19#19#19'[[[jjj'#206#206#206'YYY'#212#212#212#223#223
+  +#223#202#202#202#132#132#132#180#180#180#141#141#141#220#220#220#252#252#252
+  +#245#245#245#163#163#163#183#183#183#134#134#134'!!!'#208#208#208#158#158#158
+  +'ZZZ'#130#130#130'+++'#172#172#172#227#227#227#152#152#152#159#159#159#145
+  +#145#145'rrr'#187#187#187#137#137#137#196#196#196#178#178#178#143#143#143#219
+  +#219#219#139#139#139'```'#149#149#149#149'kk'#167'xi'#210#210#210#205#205#205
+  +#160#159'{'#158#158#128'lll'#168#168#168#180'LL'#195#135'b'#164#164#128#158
+  +#158'|'#177#177#128#136#136#136#182#129'['#169'uO'#209'..'#198#181'w'#147#147
+  +#128#130#130'r'#199#198#127#185#129'X'#175'vM'#134'zz'#175#175#175#217#217
+  +#127'|||///xxx'#219#219#127#129#129#128'   '#198'99'#180'zc'#191#191#127'444'
+  +#175#175#128#178#178#128#176'OO'#196'A>'#242#242#242'SSS'#226#226#226'yyx'
+  +#211#210#127#157#157#128#143'pp'#206'11'#194'EA'#216#216#127#153#153#128#29
+  +#29#29'yyy,,,'#131#131#128#209#208#127#189#189#128#213'Z*'#205'32'#184#143'l'
+  +#151#151#128#225#225#225#166#166#166#165#165#128#215#214#127#210#209#127#188
+  +#188#128#212#146'G'#221#140'?'#208#205'~'#216#215#127#181#181#128#132#132#128
+  +'AAA'#133#133#128#155#155#128#204#137'G'#201#134'G'#137#137#128'BBB999666'''
+  +'''''zzz888'#30#30#30#164#164#164#184#184#184'aaa'#152#152#128#209#209#209
+  +#174#174#128#239#239#127#237#237#237#153'gg'#200'77'#246#9#9#201'66'#163#148
+  +'y'#138#138#138#194#194#127#167#167#128#198#198#127#239'`'#17#245#10#10#236
+  +#19#19#194'=='#157#128'q'#165#165#128#214#213#127#144#144#128#225's!'#231'p'
+  +#28#170#145's'#188#188#128#224#223#127#189#189#128#137#137#128#204#203#127
+  +#229#229#127#253#142' '#251#141' '#223#222#127#199#199#127#164#164#128#132
+  +#132#128'vvv'#182#182#182't'#0'x;'#0'*.'#0'pp'#0't;'#0'*.'#0'po'#0'tx'#0';*'
+  +#0'.p'#0'ot'#0'|M'#0'ic'#0'ro'#0'so'#0'ft'#0' X'#0'PS'#0' ('#0'*.'#0'xp'#0's'
+  +')'#0' |'#0'*.'#0'xp'#0's|'#0#0#216'4'#29#134#2#0#0#0#0#0#0#0#232'4'#29#134#2
+  +#0#0#0#0#0#0#0#248'4'#29#134#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Hw'#178#210#0
+  +#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#9'pHYs'#0#0#14#195#0#0#14#195#1#199'o'#168
+  +'d'#0#0#2'GIDAT('#145'b'#192#10#24#24#24#0#0#0#0#255#255#130'aF+'#29'vnnvW'#3
+  +'6'#16#143#129#129#1#0#0#0#255#255#130'b'#19'~v'#29#1#1#1#129#216#229'Nk'#25
+  +#24#24#24#24#24#0#0#0#0#255#255#130'`'#3'nWK('#136'eo`c```'#0#0#0#0#255#255#2
+  +'c+'#238'XKK'#203'E'#139#151','#181#180#180#20'X'#182#156#141#129#129#1#0#0#0
+  +#255#255#2#137'Kq'#235'XN'#155'>'#163#127#214#236'9'#211#231'YZZ.se``'#0#0#0
+  +#0#255#255#2'I4,'#179#156#211'oii'#201'<A'#190'm'#146'D'#166#165#0#251'Z'#6#6
+  +#0#0#0#0#255#255'b``'#208#148#17#152#190#8'd<3'#179'ek['#221#244'E'#150'ZNl'
+  +#12#0#0#0#0#255#255'b``'#208#226#175#6#25#0#150#176#180#172#173#147#176#180
+  +#228#183'b'#0#0#0#0#255#255'b``'#224'w'#149#128#184#8',aY^Qi'#25#235#202#0#0
+  +#0#0#255#255'b``'#224#206#202#134'H'#164#230#130#200'<'#249#233#150#2#236#12
+  +#0#0#0#0#255#255'b``'#144'I'#130#152#20#146#154'&'#0#162#219'22'#5'd'#24#0#0
+  +#0#0#255#255#2'K'#128#173#182#212#210#138#213#2#209#241#9#211#4'd'#24#0#0#0#0
+  +#255#255#2#25#5#242#29'X'#6#194#8#143#200#20'`g'#0#0#0#0#255#255#2'Y'#222#0
+  +'2G'#211'D'#211'*DSS'#195#4'$'#167#163#195#0#0#0#0#255#255'b``'#176'd'#183
+  +#180#180'4'#144#10's1'#208'0'#177#12#3'K'#176#251'1'#0#0#0#0#255#255'b``'#168
+  +#151#137#5#233'`d[[o`ib'#226'bi'#233#202#207#200#0#0#0#0#255#255#2#5#137#150
+  +#147#128#165#149#149#165#137#137#134#137#165#149#166#165'e,'#183#9#3#3#0#0#0
+  +#255#255#2'G'#18'?'#191#192'Z'#19#13#141#176#16#13'M'#147#0'K'#29'n'#3#6#6#6
+  +#0#0#0#0#255#255#2#7'{='#191#19#204'e'#150#2#203#184#13#24#24#24#24#0#0#0#0
+  +#255#255#130'F'#172#150#12'{C'#172#128'@'#172'+'#191'L'#131#20#3#3#3#3#3#0#0
+  +#0#255#255#130#225'z'#129#229#220'22'#220#252'Z'#154' '#30#3#3#3#0#0#0#255
+  +#255#194#142#25#24#24#0#0#0#0#255#255#194#142#25#24#24#0#0#0#0#255#255#3#0']'
+  +#22']'#217#225'\&c'#0#0#0#0'IEND'#174'B`'#130
+]);

BIN
images/bgracontrols_images.res


+ 4 - 1
images/bgracontrols_images_list.txt

@@ -133,4 +133,7 @@ TBCLeaBoard_150.png
 TBCLeaBoard_200.png
 TBCLeaEngrave.png
 TBCLeaEngrave_150.png
-TBCLeaEngrave_200.png
+TBCLeaEngrave_200.png
+tsupergauge.png
+tsupergauge_150.png
+tsupergauge_200.png

+ 28 - 0
images/svg/tsupergauge.svg

@@ -0,0 +1,28 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--Generator: Xara Designer (www.xara.com), SVG filter version: 6.7.0.0-->
+<svg fill="none" fill-rule="evenodd" stroke="black" stroke-width="0.501" stroke-linejoin="bevel" stroke-miterlimit="10" font-family="Times New Roman" font-size="16" style="font-variant-ligatures:none" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" overflow="visible" width="18pt" height="18pt" viewBox="0 -18 18 18">
+ <defs>
+  <image id="Bitmap" preserveAspectRatio="none" width="1" height="1" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAYAAABWKLW/AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAARElEQVQImWLctWvXyu/fv2vs37//BgAAAP//Yjl06JDaq1ev9E6dOvUPAAAA//9i/v37t9OePXv+vnv37iYAAAD//wMADLcbvYBdmiYAAAAASUVORK5CYII=">
+   <title>1</title>
+  </image>
+ </defs>
+ <g id="Layer 1" transform="scale(1 -1)">
+  <ellipse cx="9" cy="8.999" rx="7.5" ry="7.5" fill-rule="nonzero" stroke-linejoin="miter" stroke-width="0.75" fill="#808080" stroke="#000000"/>
+  <rect x="-8.9995" y="-8.9995" width="17.999" height="17.999" rx="0" ry="0" transform="matrix(1 0 0 1 8.999 8.998)" fill-rule="nonzero" stroke-linejoin="miter" stroke-width="0.75" stroke="none"/>
+  <path d="M 2.976,8.586 C 2.86,16.311 14.911,16.05 15.025,8.037" fill="none" stroke="#fffe7f" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M 9.374,13.389 C 12.432,12.811 14.043,10.924 14.264,8.048" fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="#ff0000"/>
+  <rect x="8.626" y="9" width="0.749" height="5.999" fill="#ff6b00" fill-rule="nonzero" stroke-linejoin="miter" stroke-width="0.75" stroke="none"/>
+  <text xml:space="preserve" transform="translate(5.475 3.941) scale(1 -1)" kerning="auto" fill="#ffffff" font-size="5.189" stroke="none" stroke-width="0.162" stroke-linecap="round" stroke-linejoin="round" font-family="Clarendon"><tspan x="0" y="0">SG</tspan></text>
+  <g id="Group_1" stroke="none">
+   <path d="M 8.413,9.764 C 8.834,10.088 9.44,10.008 9.764,9.587 C 10.088,9.166 10.008,8.56 9.587,8.236 C 9.166,7.912 8.56,7.992 8.236,8.413 C 7.912,8.834 7.992,9.44 8.413,9.764 Z" stroke-linejoin="miter" stroke-width="0.75" fill="#666666" marker-start="none" marker-end="none"/>
+   <clipPath id="clip-path">
+    <use xlink:href="#Shape"/>
+   </clipPath>
+   <g clip-path="url(#clip-path)">
+    <use xlink:href="#Bitmap" transform="translate(8.037 9.963) scale(1.926 -1.926)"/>
+   </g>
+   <path d="M 8.236,8.413 C 7.912,8.834 7.992,9.44 8.413,9.764 C 8.834,10.088 9.44,10.008 9.764,9.587 C 10.088,9.166 10.008,8.56 9.587,8.236 C 9.166,7.912 8.56,7.992 8.236,8.413 Z M 9.465,8.394 C 9.798,8.651 9.861,9.131 9.605,9.465 C 9.348,9.798 8.868,9.861 8.534,9.605 C 8.201,9.348 8.138,8.868 8.394,8.534 C 8.651,8.201 9.131,8.138 9.465,8.394 Z" stroke-width="0.05" marker-start="none" marker-end="none" fill="none" id="Shape"/>
+  </g>
+ </g>
+</svg>

BIN
images/tsupergauge.png


BIN
images/tsupergauge_150.png


BIN
images/tsupergauge_200.png


+ 2147 - 0
supergauge.pas

@@ -0,0 +1,2147 @@
+// SPDX-License-Identifier: LGPL-3.0-linking-exception
+{
+  Part of BGRA Controls. Made by third party.
+  For detailed information see readme.txt
+
+  Site: https://sourceforge.net/p/bgra-controls/
+  Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
+  Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
+
+}
+{******************************* CONTRIBUTOR(S) ******************************
+- Edivando S. Santos Brasil | [email protected]
+  (Compatibility with delphi VCL 11/2018)
+- Sandy Ganz | [email protected]
+  Evolved from DTAnalogCommon, specific for New Gauge Work
+  Massive overhaul, fixes and features, begat Super Gauge
+  Needed to split off as changes broke compatibility badly
+
+***************************** END CONTRIBUTOR(S) *****************************}
+unit supergauge;
+
+{$I bgracontrols.inc}
+
+interface
+
+uses
+  Classes, SysUtils, Graphics, {$IFDEF FPC}LResources,{$ELSE} BGRAGraphics, {$ENDIF} Forms, Controls, Dialogs, SuperGaugeCommon,
+  BGRABitmap, BGRABitmapTypes, BGRAVectorize, BGRAPath, math, bctypes, bctools;
+
+const
+  INTERNAL_GAUGE_MIN_VALUE = 0;   // internal lowest value
+  INTERNAL_GAUGE_MAX_VALUE = 270; // internal highest value
+  VERSIONSTR = '1.00';            // SG version, Should ALWAYS show as a delta when merging!
+
+type
+
+  { TSGCustomSuperGauge }
+
+  TBandsArray = array[0..3] of TSGBandSettings;
+  TTextsArray = array[0..2] of TSGTextSettings;
+  TMarkersArray = array[0..2] of TSGMarkerSettings;
+
+  TTextsBitmapArray = array[0..2] of TBGRABitmap;
+
+  TSGRangeStateErrorEvent = procedure(Sender: TObject; OutOfRangeValue: single) of object;  // called anytime out of range
+  TSGRangeStateOKEvent = procedure(Sender: TObject; RangeValue: single) of object;          // called only when back to in range
+  TSGRangeStateChangeEvent = procedure(Sender: TObject; Value: single) of object;           // called when state RangeLed Active changes to True
+
+  TSGCustomSuperGauge = class(TGraphicControl)
+  private
+    { Private declarations }
+    FDirty: boolean;
+
+    FFaceSettings: TSGFaceSettings;
+    FFrameSettings: TSGFrameSettings;
+    FPointerCapSettings: TSGPointerCapSettings;
+    FScaleSettings: TSGScaleSettings;
+    FBandsSettings: TBandsArray;
+    FTextsSettings: TTextsArray;
+    FPointerSettings: TSGPointerSettings;
+    FRangeLEDSettings: TSGRangeCheckLEDSettings;
+    FMarkersSettings: TMarkersArray;
+    FGaugeBitmap: TBGRABitmap;
+    FFrameBitmap: TBGRABitmap;
+    FFaceBitmap: TBGRABitmap;
+    FTextBitmap: TBGRABitmap;
+    FScaleBitmap: TBGRABitmap;
+    FBandBitmap: TBGRABitmap;
+    FTextsBitmaps: TTextsBitmapArray;
+
+    FMultiBitmap: TBGRABitmap;
+    FPointerBitmap: TBGRABitmap;
+    FMarkerBitmap: TBGRABitmap;
+    FPointerCapBitmap: TBGRABitmap;
+    FLEDActiveBitmap: TBGRABitmap;
+    FLEDInActiveBitmap: TBGRABitmap;
+
+    FMinValue: single;  // the min value mapped to lowest/leftmost angle on the gauge
+    FMaxValue: single;  // the max value mapped to highest/rightmost angle on the gauge
+    FValue: single;     // this is the VALUE not a position
+    FOutOfRange: TSGRangeStateErrorEvent;         // change of state ONLY
+    FBackInRange: TSGRangeStateOKEvent;           // change of state ONLY
+    FRangeLEDActive: TSGRangeStateChangeEvent;    // change of state ONLY
+    FRangeLEDInactive: TSGRangeStateChangeEvent;  // change of state ONLY
+    FOutOfRangeState: boolean;
+    FRangeLEDStateChanged: boolean;
+    FAutoScale: boolean;
+
+    procedure SetBandSettings1(AValue: TSGBandSettings);
+    procedure SetBandSettings2(AValue: TSGBandSettings);
+    procedure SetBandSettings3(AValue: TSGBandSettings);
+    procedure SetBandSettings4(AValue: TSGBandSettings);
+
+    procedure SetTextSettings1(AValue: TSGTextSettings);
+    procedure SetTextSettings2(AValue: TSGTextSettings);
+    procedure SetTextSettings3(AValue: TSGTextSettings);
+
+    procedure SetMarkerSettings1(AValue: TSGMarkerSettings);
+    procedure SetMarkerSettings2(AValue: TSGMarkerSettings);
+    procedure SetMarkerSettings3(AValue: TSGMarkerSettings);
+
+    procedure SetFaceSettings(AValue: TSGFaceSettings);
+    procedure SetScaleSettings(AValue: TSGScaleSettings);
+    procedure SetFrameSettings(AValue: TSGFrameSettings);
+    procedure SetPointerSettings(AValue: TSGPointerSettings);
+    procedure SetRangeLedSettings(AValue: TSGRangeCheckLEDSettings);
+    procedure SetPointerCapSettings(AValue: TSGPointerCapSettings);
+    procedure SetMaxValue(AValue: single);
+    procedure SetMinValue(AValue: single);
+    function GetMaxValue: single;
+    function GetMinValue: single;
+
+    procedure SetValue(AValue: single);
+    function GetValue: single;
+    procedure SetAutoScale(AValue: boolean);
+    function CheckOutOfRange(AValue: single): single;
+
+  protected
+    { Protected declarations }
+    procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
+    procedure DoChange({%H-}Sender: TObject);
+    procedure DoRangeLEDChange({%H-}Sender: TObject);
+    procedure DoPictureChange({%H-}Sender: TObject);
+    procedure DoChangeFont1({%H-}ASender: TObject; {%H-}AData: PtrInt); // Wrapper for FontEx DoChange
+    procedure DoChangeFont2({%H-}ASender: TObject; {%H-}AData: PtrInt); // Wrapper for FontEx DoChange
+    procedure DoChangeFont3({%H-}ASender: TObject; {%H-}AData: PtrInt); // Wrapper for FontEx DoChange
+    procedure SetAllBandsDirtyState(AValue: boolean);
+    procedure SetAllTextsDirtyState(AValue: boolean);
+    procedure SetAllMarkersDirtyState(AValue: boolean);
+    function IsAnyBandDirty: boolean;
+    function IsAnyMarkerDirty: boolean;
+    property Dirty: boolean read FDirty write FDirty;
+
+  public
+    { Public declarations }
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+
+    property PointerSettings: TSGPointerSettings read FPointerSettings write SetPointerSettings; // sjg added
+    property PointerCapSettings: TSGPointerCapSettings read FPointerCapSettings write SetPointerCapSettings;
+    property FaceSettings: TSGFaceSettings read FFaceSettings write SetFaceSettings;
+    property FrameSettings: TSGFrameSettings read FFrameSettings write SetFrameSettings;
+    property ScaleSettings: TSGScaleSettings read FScaleSettings write SetScaleSettings;
+    property BandSettings1: TSGBandSettings read FBandsSettings[0] write SetBandSettings1; // will need an array thing here
+    property BandSettings2: TSGBandSettings read FBandsSettings[1] write SetBandSettings2; // will need an array thing here
+    property BandSettings3: TSGBandSettings read FBandsSettings[2] write SetBandSettings3; // will need an array thing here
+    property BandSettings4: TSGBandSettings read FBandsSettings[3] write SetBandSettings4; // will need an array thing here
+    property TextSettings1: TSGTextSettings read FTextsSettings[0] write SetTextSettings1;
+    property TextSettings2: TSGTextSettings read FTextsSettings[1] write SetTextSettings2;
+    property TextSettings3: TSGTextSettings read FTextsSettings[2] write SetTextSettings3;
+    property RangeLedSettings: TSGRangeCheckLEDSettings read FRangeLEDSettings write SetRangeLedSettings;
+    property MarkerSettings1: TSGMarkerSettings read FMarkersSettings[0] write SetMarkerSettings1;
+    property MarkerSettings2: TSGMarkerSettings read FMarkersSettings[1] write SetMarkerSettings2;
+    property MarkerSettings3: TSGMarkerSettings read FMarkersSettings[2] write SetMarkerSettings3;
+    property MinValue: single read GetMinValue write SetMinValue default 0.0;
+    property MaxValue: single read GetMaxValue write SetMaxValue default 100.0;
+    property AutoScale: boolean read FAutoScale write SetAutoScale default False;
+    property Value: single read GetValue write SetValue default 0.0;
+    property OutOfRange: TSGRangeStateErrorEvent read FOutOfRange write FOutOfRange;
+    property BackInRange: TSGRangeStateOKEvent read FBackInRange write FBackInRange;
+    property RangeLEDActive: TSGRangeStateChangeEvent read FRangeLEDActive write FRangeLEDActive;
+    property RangeLEDInActive: TSGRangeStateChangeEvent read FRangeLEDInactive write FRangeLEDInactive;
+    function RemapRange(OldValue: single; OldMin, OldMax, NewMin, NewMax: single): single;
+    function GaugeToUser(GaugeValue: single): single;
+    function UserToGauge(UserValue: single): single;
+
+    procedure Paint; override;
+    procedure DrawFrame;
+    procedure DrawFace;
+    procedure DrawScale;
+    procedure DrawBand(const BandSettings: TSGBandSettings);
+    procedure DrawBands;
+    procedure DrawMulti;
+    procedure DrawText(TextBitmap: TBGRABitmap; const TextSettings: TSGTextSettings);
+    procedure DrawLed;
+    procedure DrawMarker(MarkerBitmap: TBGRABitmap; const MarkerSettings: TSGMarkerSettings);
+    procedure DrawMarkers;
+    procedure DrawPointer;
+    procedure DrawPointerCap;
+    function CheckRangeLED(AValue: single): boolean;
+  end;
+
+  { TSuperGauge }
+
+  TSuperGauge = class(TSGCustomSuperGauge)
+  private
+    { Private declarations }
+  protected
+    { Protected declarations }
+  public
+    { Public declarations }
+  published
+    { Published declarations }
+    property MinValue;
+    property MaxValue;
+    property FaceSettings;
+    property BandSettings1;
+    property BandSettings2;
+    property BandSettings3;
+    property BandSettings4;
+    property TextSettings1;
+    property TextSettings2;
+    property TextSettings3;
+    property FrameSettings;
+    property ScaleSettings;
+    property RangeLedSettings;
+
+    property MarkerSettings1;
+    property MarkerSettings2;
+    property MarkerSettings3;
+
+    property PointerSettings;
+    property PointerCapSettings;
+    property AutoScale;
+    property Value;
+    property OutOfRange;
+    property BackInRange;
+    property RangeLEDActive;
+    property RangeLEDInactive;
+
+    // Added missing events
+    property Anchors;
+    property OnClick;
+    property OnDblClick;
+    property OnMouseDown;
+    property OnMouseUp;
+    property OnMouseMove;
+    property OnMouseEnter;
+    property OnMouseLeave;
+  end;
+
+  {$IFDEF FPC}procedure Register;{$ENDIF}
+
+implementation
+{$IFDEF FPC}
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TSuperGauge]);
+end;
+{$ENDIF}
+
+{ TSGCustomSuperGauge }
+
+constructor TSGCustomSuperGauge.Create(AOwner: TComponent);
+var
+    i: integer;
+begin
+  inherited Create(AOwner);
+
+  Width := 240;
+  Height := 240;
+
+  FFaceSettings := TSGFaceSettings.Create;
+  FaceSettings.OnChange := DoChange;
+  FaceSettings.Picture.OnChange := DoPictureChange; // need to set this so we can catch changes to the picture!
+
+  FFrameSettings := TSGFrameSettings.Create;
+  FrameSettings.OnChange := DoChange;
+
+  FScaleSettings := TSGScaleSettings.Create;
+  ScaleSettings.OnChange := DoChange;
+
+  for i := low(FBandsSettings) to high(FBandsSettings) do
+  begin
+    FBandsSettings[i] := TSGBandSettings.Create;
+    FBandsSettings[i].OnChange := DoChange;
+    FBandsSettings[i].Text := 'Band ' + IntToStr(i + 1);
+  end;
+
+  for i := low(FTextsSettings) to high(FTextsSettings) do
+  begin
+    FTextsSettings[i] := TSGTextSettings.Create;
+    FTextsSettings[i].OnChange := DoChange;
+    FTextsBitmaps[i] := TBGRABitmap.Create;
+  end;
+
+  // Set Text font change events and defaults
+
+  FTextsSettings[0].FontEx.OnChange := DoChangeFont1;
+  FTextsSettings[1].FontEx.OnChange := DoChangeFont2;
+  FTextsSettings[2].FontEx.OnChange := DoChangeFont3;
+  FTextsSettings[0].Text := 'Text1';
+  FTextsSettings[1].Text := 'Text2';
+  FTextsSettings[2].Text := 'Text3';
+
+  // Pointer Cap
+
+  FPointerCapSettings := TSGPointerCapSettings.Create;
+  FPointerCapSettings.OnChange := DoChange;
+
+  // Pointer
+
+  FPointerSettings := TSGPointerSettings.Create;
+  FPointerSettings.OnChange := DoChange;
+  FPointerSettings.Color := BGRA(255, 127, 63); // orange
+
+  // RangeLED
+
+  FRangeLEDSettings := TSGRangeCheckLEDSettings.Create;
+  FRangeLEDSettings.OnChange := DoRangeLEDChange;
+
+  // Markers
+
+  for i := low(FMarkersSettings) to high(FMarkersSettings) do
+  begin
+    FMarkersSettings[i] := TSGMarkerSettings.Create;
+    FMarkersSettings[i].OnChange := DoChange;
+  end;
+
+  // make marker each different to save confusion
+
+  FMarkersSettings[0].Color := clLime;
+  FMarkersSettings[1].Color := clRed;
+  FMarkersSettings[2].Color := clYellow;
+
+  // create needed bitmaps, Don't Forget to FREE!!!
+
+  FFaceBitmap := TBGRABitmap.Create;
+  FFrameBitmap := TBGRABitmap.Create;
+  FGaugeBitmap := TBGRABitmap.Create;
+  FTextBitmap := TBGRABitmap.Create;
+  FPointerBitmap := TBGRABitmap.Create;
+  FPointerCapBitmap := TBGRABitmap.Create;
+  FScaleBitmap := TBGRABitmap.Create;
+  FBandBitmap := TBGRABitmap.Create;
+  FMultiBitmap := TBGRABitmap.Create;
+  FLEDActiveBitmap := TBGRABitmap.Create;
+  FLEDInActiveBitmap := TBGRABitmap.Create;
+  FMarkerBitmap := TBGRABitmap.Create;
+
+  // initialized (some above)
+
+  FOutOfRangeState := False;
+  FRangeLEDStateChanged := False;
+  FValue := 0;
+  FAutoScale := false;
+  FMinValue := 0;
+  FMaxValue := 100;
+
+  FDirty := True;   // Always force initial paint/draw on everything!
+end;
+
+destructor TSGCustomSuperGauge.Destroy;
+var
+    i: integer;
+begin
+
+  FPointerCapSettings.OnChange := nil;
+  FPointerCapSettings.Free;
+
+  FPointerSettings.OnChange := nil;
+  FPointerSettings.Free;
+
+  FRangeLEDSettings.OnChange := nil;
+  FRangeLEDSettings.Free;
+
+  ScaleSettings.OnChange := nil;
+  FScaleSettings.Free;
+
+  for i := low(FTextsSettings) to high(FTextsSettings) do
+  begin
+   FBandsSettings[i].OnChange := nil;
+   FBandsSettings[i].Free;
+  end;
+
+  for i := low(FTextsSettings) to high(FTextsSettings) do
+  begin
+   FTextsSettings[i].OnChange := nil;
+   FTextsSettings[i].FontEx.OnChange := nil;
+   FTextsSettings[i].Free;
+   FTextsBitmaps[i].Free;
+  end;
+
+  for i := low(FMarkersSettings) to high(FMarkersSettings) do
+  begin
+   FMarkersSettings[i].OnChange := nil;
+   FMarkersSettings[i].Free;
+  end;
+
+  FFaceSettings.OnChange := nil;
+  FFaceSettings.Free;
+
+  FFrameSettings.OnChange := nil;
+  FFrameSettings.Free;
+
+  // now clean bitmaps, should match what's in creat method
+
+  FLEDActiveBitmap.Free;
+  FLEDInactiveBitmap.Free;
+  FMarkerBitmap.Free;
+  FBandBitmap.Free;
+  FScaleBitmap.Free;
+  FPointerBitmap.Free;
+  FPointerCapBitmap.Free;
+  FTextBitmap.Free;
+  FFaceBitmap.Free;
+  FMultiBitmap.Free;
+  FFrameBitmap.Free;
+  FGaugeBitmap.Free;
+
+  inherited Destroy;
+end;
+
+function TSGCustomSuperGauge.RemapRange(OldValue: single; OldMin, OldMax, NewMin, NewMax: single): single;
+begin
+  // Generic mapping of ranges. Value is the number to remap, returns number
+  // in the new range. Looks for odd div by 0 condition and fixes
+
+  if OldMin = OldMax then
+  begin
+    // need to return something reasonable
+
+    if OldValue <= OldMin then
+      Exit(NewMin)
+    else
+      Exit(NewMax);
+  end;
+
+  Result := (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin;
+end;
+
+function TSGCustomSuperGauge.GaugeToUser(GaugeValue: single): single;
+begin
+  // Helper to translates internal gauge value to external user value
+
+  Result := RemapRange(GaugeValue, INTERNAL_GAUGE_MIN_VALUE, INTERNAL_GAUGE_MAX_VALUE, FMinValue, FMaxValue);
+end;
+
+function TSGCustomSuperGauge.UserToGauge(UserValue: single): single;
+begin
+  // Helper to translates external user value to internal gauge value
+
+  Result := RemapRange(UserValue, FMinValue, FMaxValue, INTERNAL_GAUGE_MIN_VALUE, INTERNAL_GAUGE_MAX_VALUE);
+end;
+
+function TSGCustomSuperGauge.GetValue: single;
+begin
+  // Scale from internal back to user range
+
+  Result := GaugeToUser(FValue);
+end;
+
+procedure TSGCustomSuperGauge.SetValue(AValue: single);
+var
+    gaugeValue: single;
+begin
+
+  // Tricky case here, since we are calling the RangeLED range check
+  // here too, if that is in any way dirty we should process the value
+  // and not skip. Triggering any change on RangeLEDSettings should call this.
+
+  // Get the user value into gauge value space
+
+  gaugeValue := UserToGauge(AValue);
+
+  // skip if a few conditions exit. This is a bit tricky as the gauge value will reset
+  // to min or max values on overload so need to always update if that's the case. Should
+  // not affect performance. Similar for LED, if dirty no skip.
+
+  if (FValue = gaugeValue) and (not FRangeLEDSettings.Dirty) and (not FOutOfRangeState) then
+    Exit;
+
+  // If out of range conditions are at play the gauge Value (FValue) will never
+  // be out of range. This value is passed to the out of range handler for the
+  // user to deal with and DO SOMETHING to indicate it.
+
+  FValue := CheckOutOfRange(gaugeValue);
+
+  // If we have a change in the of the LED's Active property we need
+  // to call the event handlers too. Also we will check it's values and set
+  // if needed. NOTE : that if the range type is set to rtNone, it will always
+  // return the state of the RangeLEDSettings.Active, otherwise it will calculate
+  // the needed value for a range check as set. FRangeLEDStateChanged is set in
+  // IsRangeLEDActive function so should be called before this!
+
+  // MUST NOT CALL .Active as this will cause a recursive call, use the
+  // hacked ActiveNoDoChange which will just set the property value with
+  // no side effects
+
+  // True if LED Should be On, False if not, AValue is in User space for LED's
+
+  FRangeLEDSettings.ActiveNoDoChange := CheckRangeLED(AValue);
+
+  // We must dirty the Pointer here or no redraw
+
+  PointerSettings.Dirty := True;
+  DoChange(self);
+end;
+
+function TSGCustomSuperGauge.CheckOutOfRange(AValue: single): Single;
+begin
+  // These values are in gauge space, so typically never less than 0, or > 270
+
+  Result := AValue; // SAFE so always will return a value
+
+  if AValue < INTERNAL_GAUGE_MIN_VALUE then
+  begin
+    // Under Range event
+
+    FOutOfRangeState := True;
+    if Assigned(FOutOfRange) then
+      FOutOfRange(Self, GaugeToUser(AValue));
+    Result := INTERNAL_GAUGE_MIN_VALUE;
+  end
+    else
+      if AValue > INTERNAL_GAUGE_MAX_VALUE then
+      begin
+        // Over Range event
+
+        FOutOfRangeState := True;
+        if Assigned(FOutOfRange) then
+          FOutOfRange(Self, GaugeToUser(AValue)); // must translate back to user space
+        Result := INTERNAL_GAUGE_MAX_VALUE;
+      end
+      else
+        begin
+          // If NOT over/under flow then will need to clear
+          // that state/flag and reset any indicators if was in a overange state
+
+          if FOutOfRangeState then
+          begin
+            if Assigned(FBackInRange) then
+              FBackInRange(self, GaugeToUser(AValue)); // here to, get into user space
+
+            FOutOfRangeState := False;  // reset so no more calls
+          end;
+      end;
+end;
+
+procedure TSGCustomSuperGauge.SetAutoScale(AValue: boolean);
+begin
+  if FAutoScale = AValue then
+    exit;
+
+  FAutoScale := AValue;
+  FScaleSettings.Dirty := True;  // set it, as it will need a repaint
+
+  DoChange(self);
+end;
+
+function TSGCustomSuperGauge.GetMaxValue: single;
+begin
+  Result := FMaxValue;
+end;
+
+procedure TSGCustomSuperGauge.SetMaxValue(AValue: single);
+var
+    currUser: single;
+begin
+  // Note : MinValue and MaxValue can span negative ranges and be increasing
+  //        or decreasing
+
+  // Min and Max out of order, bounce
+
+  if (FMinValue >= AValue) then
+    exit;
+
+  // If changing min/max must refresh the value to adjust
+
+  currUser := GaugeToUser(FValue);
+  FMaxValue := AValue;  // setting this will change UserToGauge() in SetValue!
+
+  // Recompute
+
+  SetValue(currUser);
+end;
+
+function TSGCustomSuperGauge.GetMinValue: single;
+begin
+  Result := FMinValue;
+end;
+
+procedure TSGCustomSuperGauge.SetMinValue(AValue: single);
+var
+    currUser: single;
+begin
+  // Note : MinValue and MaxValue can span negative ranges and be increasing
+  //        or decreasing
+
+  // Min and Max out of order, bounce
+
+  if (FMaxValue <= AValue) then
+    exit;
+
+  // If changing min/max must refresh the value to adjust
+
+  currUser := GaugeToUser(FValue);
+  FMinValue := AValue;  // setting this will change UserToGauge() in SetValue!
+
+  // Recompute
+
+  SetValue(currUser);
+end;
+
+procedure TSGCustomSuperGauge.SetFaceSettings(AValue: TSGFaceSettings);
+begin
+  if FFaceSettings = AValue then
+    Exit;
+
+  FFaceSettings := AValue;
+  FFaceSettings.Dirty := True;  // set it, as it will need a repaint
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetFrameSettings(AValue: TSGFrameSettings);
+begin
+  if FFrameSettings = AValue then
+    Exit;
+
+  FFrameSettings := AValue;
+  FFrameSettings.Dirty := True;  // set it, as it will need a repaint
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetScaleSettings(AValue: TSGScaleSettings);
+begin
+  if FScaleSettings = AValue then
+    Exit;
+
+  FScaleSettings := AValue;
+  FScaleSettings.Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetAllBandsDirtyState(AValue: boolean);
+var
+  i: integer;
+begin
+  // helper to just set all bands to a specific state!
+
+  for i := low(FBandsSettings) to high(FBandsSettings) do
+    FBandsSettings[i].Dirty := AValue;
+end;
+
+function TSGCustomSuperGauge.IsAnyBandDirty : boolean;
+var
+  i: integer;
+begin
+  // helper to just see if any band has a dirty flag
+
+  for i := low(FBandsSettings) to high(FBandsSettings) do
+  begin
+    if FBandsSettings[i].Dirty then
+      exit(True);
+  end;
+
+  result := False;
+end;
+
+procedure TSGCustomSuperGauge.SetBandSettings1(AValue: TSGBandSettings);
+begin
+  if FBandsSettings[0] = AValue then
+    Exit;
+
+  FBandsSettings[0] := AValue;
+  FBandsSettings[0].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetBandSettings2(AValue: TSGBandSettings);
+begin
+  if FBandsSettings[1] = AValue then
+    Exit;
+
+  FBandsSettings[1] := AValue;
+  FBandsSettings[1].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetBandSettings3(AValue: TSGBandSettings);
+begin
+  if FBandsSettings[2] = AValue then
+    Exit;
+
+  FBandsSettings[2] := AValue;
+  FBandsSettings[2].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetBandSettings4(AValue: TSGBandSettings);
+begin
+  if FBandsSettings[3] = AValue then
+    Exit;
+
+  FBandsSettings[3] := AValue;
+  FBandsSettings[3].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetAllTextsDirtyState(AValue: boolean);
+var
+  i: integer;
+begin
+  // helper to just set all texts to a specific state!
+
+  for i := low(FTextsSettings) to high(FTextsSettings) do
+    FTextsSettings[i].Dirty := AValue;
+end;
+
+procedure TSGCustomSuperGauge.SetTextSettings1(AValue: TSGTextSettings);
+begin
+  if FTextsSettings[0] = AValue then
+    Exit;
+
+  FTextsSettings[0] := AValue;
+  FTextsSettings[0].Dirty := True;  // set it, as it will need a repaint
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetTextSettings2(AValue: TSGTextSettings);
+begin
+  if FTextsSettings[1] = AValue then
+    Exit;
+
+  FTextsSettings[1] := AValue;
+  FTextsSettings[1].Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetTextSettings3(AValue: TSGTextSettings);
+begin
+  if FTextsSettings[2] = AValue then
+    Exit;
+
+  FTextsSettings[2] := AValue;
+  FTextsSettings[2].Dirty := True;
+
+  DoChange(self);
+end;
+
+function TSGCustomSuperGauge.IsAnyMarkerDirty: boolean;
+var
+  i: integer;
+begin
+  // helper to just see if any band has a dirty flag
+
+  for i := low(FMarkersSettings) to high(FMarkersSettings) do
+  begin
+    if FMarkersSettings[i].Dirty then
+      exit(True);
+  end;
+
+  result := False;
+end;
+
+procedure TSGCustomSuperGauge.SetAllMarkersDirtyState(AValue: boolean);
+var
+  i: integer;
+begin
+  // helper to just set all markers to a specific state!
+
+  for i := low(FMarkersSettings) to high(FMarkersSettings) do
+    FMarkersSettings[i].Dirty := AValue;
+end;
+
+procedure TSGCustomSuperGauge.SetMarkerSettings1(AValue: TSGMarkerSettings);
+begin
+  if FMarkersSettings[0] = AValue then
+    Exit;
+
+  FMarkersSettings[0] := AValue;
+  FMarkersSettings[0].Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetMarkerSettings2(AValue: TSGMarkerSettings);
+begin
+  if FMarkersSettings[1] = AValue then
+    Exit;
+
+  FMarkersSettings[1] := AValue;
+  FMarkersSettings[1].Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetMarkerSettings3(AValue: TSGMarkerSettings);
+begin
+  if FMarkersSettings[2] = AValue then
+    Exit;
+
+  FMarkersSettings[2] := AValue;
+  FMarkersSettings[2].Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetPointerSettings(AValue: TSGPointerSettings);
+begin
+  if FPointerSettings = AValue then
+    Exit;
+
+  FPointerSettings := AValue;
+  FPointerSettings.Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetRangeLedSettings(AValue: TSGRangeCheckLEDSettings);
+begin
+  if FRangeLEDSettings = AValue then
+    Exit;
+
+  FRangeLEDSettings := AValue;
+  FRangeLEDSettings.Dirty := True;
+
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.SetPointerCapSettings(AValue: TSGPointerCapSettings);
+begin
+  if FPointerCapSettings = AValue then
+    Exit;
+
+  FPointerCapSettings := AValue;
+  FPointerCapSettings.Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.DoSetBounds(ALeft, ATop, AWidth, AHeight: Integer);
+begin
+  inherited;
+  FDirty := true; // Called on Resize of component
+end;
+
+procedure TSGCustomSuperGauge.DoChange(Sender: TObject);
+begin
+  Invalidate;
+end;
+
+procedure TSGCustomSuperGauge.DoRangeLEDChange(Sender: TObject);
+begin
+  // This is needed as anytime a RangeLED settings is updated we
+  // MAY need to update and call event handlers. update as the RangeLEDSettings.Dirty
+
+  CheckRangeLED(Value); // Tricky may not work!
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.DoPictureChange(Sender: TObject);
+begin
+  // This is similar to DoRangeLEDChange, if we have a picture change this
+  // is how we can propagate it up to the gauge to tell if a repaint is needed.
+
+  FaceSettings.Dirty := True;  // trigger a redraw since the image has changed
+  DoChange(Sender);
+end;
+
+
+procedure TSGCustomSuperGauge.DoChangeFont1(ASender: TObject; AData: PtrInt);
+begin
+  // Simlar to the regular dochange but needed a different procedure signature
+  // so just a wrapper, TObject is not a gauge so use Self here for DoChange()
+
+  FTextsSettings[0].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.DoChangeFont2(ASender: TObject; AData: PtrInt);
+begin
+  // Simlar to the regular dochange but needed a different procedure signature
+  // so just a wrapper, TObject is not a gauge so use Self here for DoChange()
+
+  FTextsSettings[1].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.DoChangeFont3(ASender: TObject; AData: PtrInt);
+begin
+  // Simlar to the regular dochange but needed a different procedure signature
+  // so just a wrapper, TObject is not a gauge so use Self here for DoChange()
+
+  FTextsSettings[2].Dirty := True;
+  DoChange(self);
+end;
+
+procedure TSGCustomSuperGauge.Paint;
+var
+  i: integer;
+  offsetX, offsetY: integer;
+  gaugeCenX, gaugeCenY: integer;
+begin
+  inherited Paint;
+
+  // IF the component is resized OR moved (this is safer) we
+  // need to make sure EVERYTHING redraws. The base class will
+  // also do it's own thing to invalidate and redraw it all.
+
+  if FDirty then
+  begin
+    FFrameSettings.Dirty := True;
+    FFaceSettings.Dirty := True;
+    FScaleSettings.Dirty := True;
+    SetAllBandsDirtyState(True);
+    SetAllTextsDirtyState(True);
+    FRangeLEDSettings.Dirty := True;
+    FPointerCapSettings.Dirty := True;
+    FPointerSettings.Dirty := True;
+    SetAllMarkersDirtyState(True);
+    FDirty := False;  // everything here marked, so can reset
+  end;
+
+  // Now start Drawing into the offscreen bitmaps. IF the particular
+  // subcomponent is not changed, the DrawXXXX will just leave it as is
+  // and not waste cycles to redraw it.
+
+  FGaugeBitmap.Fill(BGRA(0, 0, 0, 0));
+  FGaugeBitmap.SetSize(Width, Height);
+  gaugeCenX := FGaugeBitmap.Width div 2;
+  gaugeCenY := FGaugeBitmap.Height div 2;
+
+  // Face, Frame, Scale and Bands are usually static, so do yet another
+  // bitmap for these that will require less Blend Images.
+
+  DrawMulti;
+  FGaugeBitmap.BlendImage(0, 0, FMultiBitmap, boLinearBlend);
+
+  // now draw any texts if enabled and dirty
+
+  for i := low(FTextsSettings) to high(FTextsSettings) do
+  begin
+    if FTextsSettings[i].Enabled then
+    begin
+      DrawText(FTextsBitmaps[i], FTextsSettings[i]);
+      offsetX := FTextsSettings[i].OffsetX + gaugeCenX - FTextsBitmaps[i].Width div 2;
+      offsetY := FTextsSettings[i].OffsetY + gaugeCenY - FTextsBitmaps[i].Height div 2;
+      FGaugeBitmap.BlendImage(offsetX, offsetY, FTextsBitmaps[i], boLinearBlend);
+    end;
+  end;
+
+  FGaugeBitmap.BlendImage(offsetX, offsetY, FTextBitmap, boLinearBlend);
+
+  // Draw range LED, small bitmap so center and move
+
+  DrawLed;
+  offsetX := FRangeLEDSettings.OffsetX + gaugeCenX - FLEDActiveBitmap.Width div 2;
+  offsetY := FRangeLEDSettings.OffsetY + gaugeCenY - FLEDActiveBitmap.height div 2;
+
+  // set up the led, if user sets Active state will keep led on even if
+  // the out of range state is set.
+
+  if FRangeLEDSettings.Active then
+    FGaugeBitmap.BlendImage(offsetX, offsetY, FLEDActiveBitmap, boLinearBlend)
+  else
+    FGaugeBitmap.BlendImage(offsetX, offsetY, FLEDInActiveBitmap, boLinearBlend);
+
+  // Draw Markers BEFORE the pointer(s)
+
+  DrawMarkers;
+  FGaugeBitmap.BlendImage(0, 0, FMarkerBitmap,boLinearBlend);
+
+  // draw cap over or under the pointer. Note that the pointer is a special
+  // case when drawing since it's almost always dirty.
+
+  if PointerCapSettings.CapStyle <> csNone then
+    begin
+      DrawPointerCap;
+      offsetX := gaugeCenX  - FPointerCapBitmap.Width div 2;
+      offsetY := gaugeCenY - FPointerCapBitmap.Height div 2;
+
+      if PointerCapSettings.CapPosition = cpOver then
+        begin
+          DrawPointer;
+          FGaugeBitmap.BlendImage(offsetX, offsetY, FPointerCapBitmap, boLinearBlend); // Cap on top
+        end
+      else
+        begin
+          FGaugeBitmap.BlendImage(offsetX, offsetY, FPointerCapBitmap, boLinearBlend); // Cap on Bottom
+          DrawPointer;
+        end;
+    end
+      else
+        DrawPointer;
+
+  // make it all visable to the user!
+
+  FGaugeBitmap.Draw(Canvas, 0, 0, False);
+end;
+
+procedure TSGCustomSuperGauge.DrawMulti;
+begin
+  // The strategy here is that these typically only change infrequently
+  // so if so, just draw as a bundle and saves some blendimages calls. Each of the
+  // drawXXX still handles it's own dirty flag. The bitmap will be set up
+  // as on instantiation so all of the others have their dirty flag set True, so no
+  // need to do any initialization. Makes painting much faster even
+  // with the individual dirty flags!
+
+  if FFrameSettings.Dirty or FFaceSettings.Dirty or FScaleSettings.Dirty or IsAnyBandDirty then
+    begin
+      Initializebitmap(FMultiBitmap, Width, Height);
+
+      DrawFrame;
+      FMultiBitmap.BlendImage(0, 0, FFrameBitmap, boLinearBlend);
+
+      DrawFace;
+      FMultiBitmap.BlendImage(0, 0, FFaceBitmap, boLinearBlend);
+
+      DrawBands; // will handle the enable/disable and draw of each band
+      FMultiBitmap.BlendImage(0, 0, FBandBitmap, boLinearBlend);
+
+      DrawScale;
+      FMultiBitmap.BlendImage(0, 0, FScaleBitmap, boLinearBlend);
+    end;
+end;
+
+procedure TSGCustomSuperGauge.DrawFrame;
+var
+  Origin: TSGOrigin;
+  r: integer;
+begin
+  if not FrameSettings.Dirty then
+    Exit;
+
+  FrameSettings.Dirty := False;
+
+  Origin := Initializebitmap(FFrameBitmap, Width, Height);
+
+  // Always fills the space so AutoScale is sorta' always on
+
+  r := round(Origin.Radius * 0.95);
+
+  // Draw Bitmap frame
+
+  FFrameBitmap.FillEllipseAntialias(Origin.CenterPoint.x,
+    Origin.CenterPoint.y,
+    r, r, FFrameSettings.FrameColor);
+
+  // Draw thin antialiased border to smooth against background
+
+  FFrameBitmap.EllipseAntialias(Origin.CenterPoint.x,
+    Origin.CenterPoint.y,
+    r, r, FFrameSettings.BorderColor, FFrameSettings.BorderRadius);
+end;
+
+procedure TSGCustomSuperGauge.DrawFace;
+var
+  OriginFace: TSGOrigin;
+  r: integer;
+  image: TBGRABitmap;
+
+begin
+
+  if not FaceSettings.Dirty then
+    Exit;
+
+  FaceSettings.Dirty := False;
+
+  OriginFace := Initializebitmap(FFaceBitmap, Width, Height);
+
+  // Always fills the space so AutoScale is sorta' always on for the face
+
+  r := round(OriginFace.Radius * 0.95) - 5;
+
+  case FFaceSettings.FillStyle of
+    fsGradient:
+      FFaceBitmap.FillEllipseLinearColorAntialias(OriginFace.CenterPoint.x,
+        OriginFace.CenterPoint.y, r, r, FFaceSettings.OuterColor,
+        FFaceSettings.InnerColor);
+
+    fsNone:
+      FFaceBitmap.FillEllipseAntialias(OriginFace.CenterPoint.x, OriginFace.CenterPoint.y,
+        r, r, FFaceSettings.OuterColor);
+  end;
+
+  // see if valid size and enabled, draw if so!
+
+  if ((FaceSettings.Picture.Width > 0) or (FaceSettings.Picture.Height > 0)) and (FFaceSettings.PictureEnabled) then
+  begin
+
+    image := TBGRABitmap.Create(FaceSettings.Picture.Bitmap);
+    FFaceBitmap.BlendImage(
+                OriginFace.CenterPoint.X + FaceSettings.PictureOffsetX,
+                OriginFace.CenterPoint.y + FaceSettings.PictureOffsetY,
+                image,
+                boLinearBlend);
+    image.Free; // needed!
+  end;
+end;
+
+procedure TSGCustomSuperGauge.DrawBands;
+var
+  i: integer;
+begin
+  // Draw mult bands on the same bitmap. we can do this since
+  // we are drawing over the entire fullsized bitmap. Since
+  // this is the case, you can draw all of the bands here in one shot
+  // and on one bitmap. Init bitmap here!
+
+  // Only change if something dirty
+  // nothing dirty, no init, no draw, just bounce!
+
+  if not IsAnyBandDirty then
+    exit;
+
+  Initializebitmap(FBandBitmap, Width, Height); // clear it before we draw anything
+
+  for i := low(FBandsSettings) to high(FBandsSettings) do
+  begin
+    FBandsSettings[i].Dirty := True;  // force draw, if any band is dirty they are are dirty
+    DrawBand(FBandsSettings[i]);      // will clear any dirty for specific band
+  end;
+end;
+
+procedure TSGCustomSuperGauge.DrawBand(const BandSettings : TSGBandSettings);
+var
+  BandRadius, TextRadius: single;
+  TextSize: integer;
+  baseAngle, startAngle, endAngle: single;
+  cenX, cenY: integer;
+  fontRenderer: TBGRAVectorizedFontRenderer;
+  TextPath: TBGRAPath;
+begin
+
+  // TODO : Maybe be removed since calling here always paints them all
+  if not BandSettings.Dirty then
+    Exit;
+
+  BandSettings.Dirty := False;
+
+  // Now, if not enabled we can leave if flag reset!
+
+  if not BandSettings.Enabled then
+    exit;
+
+  TextSize := BandSettings.TextSize * 15;
+
+  // Origin := Initializebitmap(FBandBitmap, Width, Height); drawbands needs to set this up
+
+  cenX := Width div 2;
+  cenY := Height div 2;
+
+  BandRadius := BandSettings.BandRadius - BandSettings.Thickness div 2;    // may need to adjust for band thickness
+  TextRadius := BandSettings.TextRadius - BandSettings.TextSize div 2 - BandSettings.Thickness div 2; // offset to center
+
+  // Start = 225 degree is 0 on gague scale (Not the angle), and -45 degree is 100 on scale
+
+  // 270, down (gauge angle 0)180 flat, increase moves towards 0 decrease towards 100
+  // 0 is flat line, right most end. Increase goes backwards towards 0, -45 is 100 percent on scale
+
+  baseAngle := 225 * PI / 180;
+  startAngle := baseAngle - ((BandSettings.StartValue * 270 / 100) * PI / 180);
+  endAngle := baseAngle - ((BandSettings.EndValue * 270 / 100) * PI / 180);
+
+  FBandBitmap.LineCap := pecFlat; // caps should be flat
+  FBandBitmap.Arc(
+                   cenX, cenY,
+                   BandRadius + 0.5, BandRadius + 0.5, // push down a bit
+                   // (360-135) 225, -45
+                   // 3.92699,-0.785398, // must use start and end angle, internally Point calcs won't work due to arcsin2() limits
+                   startAngle, endAngle,
+                   BandSettings.BandColor,
+                   BandSettings.Thickness,
+                   false,
+                   BGRA(0,0,0,0) // last param is alpha, so no interior color, inner routings ONLY draw the arc, no fill
+  );
+
+  if BandSettings.EnableText then
+  begin
+    FontRenderer := TBGRAVectorizedFontRenderer.Create;
+    FBandBitmap.FontRenderer := fontRenderer;     // assign text vectorial font renderer
+    FBandBitmap.FontHeight := round(TextSize * 0.09);
+    FBandBitmap.FontQuality := fqFineAntialiasing;
+    FBandBitmap.FontName := BandSettings.TextFont;
+    FBandBitmap.FontStyle := BandSettings.TextStyle;
+    FontRenderer.OutlineColor := BGRABlack;
+    FontRenderer.OutlineWidth := TextSize / 600;
+    FontRenderer.OutlineVisible := true;
+    FBandBitmap.FontVerticalAnchor := fvaBaseline;
+    TextPath := TBGRAPath.Create;
+
+    // drawing is backwards on textpath
+
+    TextPath.Arc(cenX, cenY, TextRadius, -startAngle, -endAngle, False);
+    FBandBitmap.TextOutCurved(TextPath, BandSettings.Text, BandSettings.TextColor, taCenter, 0);
+  end;
+end;
+
+procedure TSGCustomSuperGauge.DrawText(TextBitmap: TBGRABitmap; const TextSettings: TSGTextSettings);
+var
+  TextBoxWidth, TextBoxHeight: integer;
+  TextRect: TRect;
+begin
+
+  if not TextSettings.Dirty then
+    Exit;
+
+  TextSettings.Dirty := False;
+
+  // get the bounding box so we can create a SMALLER bitmap. This will be referenced
+  // to the Center of the text and gauge
+
+  CalculateTextSize(TextSettings.Text, TextSettings.FontEx, TextBoxWidth, TextBoxHeight, TextSettings.FontEx.Shadow);
+  Initializebitmap(TextBitmap, TextBoxWidth, TextBoxHeight);
+
+  // Set up text bounding box,
+
+  TextRect.Left := 0;
+  TextRect.Top := 0;
+  TextRect.Height := TextBoxHeight;
+  TextRect.Width := TextBoxWidth;
+
+  // Draw into the TextBitmap for later use
+
+  RenderText(TextRect, TextSettings.FontEx, TextSettings.Text, TextBitmap, Enabled);
+end;
+
+procedure TSGCustomSuperGauge.DrawScale;
+var
+  Origin: TSGOrigin;
+  i, n, x, y, xt, yt: integer;
+  scaleStartValue, scaleBump: integer;
+  ScaleRadius, TextRadius: single;
+  TextSize: integer;
+  pStart, pEnd: TPointF;
+  startAngle, endAngle: single;
+  innerTicRadius: single;
+begin
+  // if nothing dirty then skip it, we have a bitmap with
+  // the scale already drawn. This is slow so saves a lot of time
+  // as scales are slow to draw
+
+  if not ScaleSettings.Dirty then
+    Exit;
+
+  ScaleSettings.Dirty := False;  // mark as clean, so next run will not need a rebuild!
+
+  Origin := Initializebitmap(FScaleBitmap, Width, Height);
+
+  // Calc radius for scale and text or set it from the user
+
+  if FAutoScale then
+  begin
+    ScaleRadius := Round(Origin.Radius * 0.90);
+    TextRadius := Round(Origin.Radius * 0.65);
+    TextSize := Round(Origin.Radius * 0.15);
+
+    // fix up scaling for small or large gauges
+
+    if (Width < 250) or (Height < 250) then
+    begin
+      TextSize := 15;
+      TextRadius := TextRadius - 10;
+    end
+    else
+      begin
+        if (Width > 500) or (Height > 500) then
+        begin
+          TextSize := TextSize + 5;
+          TextRadius := TextRadius + 10;
+        end;
+      end;
+    end
+  else
+    begin
+      ScaleRadius := ScaleSettings.ScaleRadius;
+      TextRadius := ScaleSettings.TextRadius;
+      TextSize := ScaleSettings.TextSize;
+    end;
+
+  // Draw SubTicks
+
+  if ScaleSettings.EnableSubTicks then
+  begin
+    n := ScaleSettings.MainTickCount * ScaleSettings.SubTickCount;
+
+    for i := 0 to n do
+    begin
+      // Calculate draw from point
+
+      X := Origin.CenterPoint.x - Round(ScaleRadius * cos((-45 + i * 270 / n) * Pi / 180));
+      Y := Origin.CenterPoint.y - Round(ScaleRadius * sin((-45 + i * 270 / n) * Pi / 180));
+
+      // Calculate draw to point
+
+      Xt := Origin.CenterPoint.x - Round((ScaleRadius - ScaleSettings.LengthSubTick) *
+        cos((-45 + i * 270 / n) * Pi / 180));
+      Yt := Origin.CenterPoint.y - Round((ScaleRadius - ScaleSettings.LengthSubTick) *
+        sin((-45 + i * 270 / n) * Pi / 180));
+
+      FScaleBitmap.DrawLineAntialias(x, y, xt, yt, ScaleSettings.TickColor, ScaleSettings.ThicknessSubTick);
+
+      if (ScaleSettings.TickArcStyle = taboth) and (not ScaleSettings.EnableMainTicks) then
+        begin
+          // need caps on the ends so the gauge doesn't look stupid if both inner and outer
+          // tic arcs are visiable
+
+          if (i = 0) or (i = n) then
+            begin
+              if not ScaleSettings.EnableMainTicks then
+                innerTicRadius := ScaleSettings.LengthSubTick
+              else
+                innerTicRadius := ScaleSettings.LengthMainTick;
+
+              // draw end pieces in the MainTick thickness to match
+
+              Xt := Origin.CenterPoint.x - Round((ScaleRadius - innerTicRadius) *
+                cos((-45 + i * 270 / n) * Pi / 180));
+              Yt := Origin.CenterPoint.y - Round((ScaleRadius - innerTicRadius) *
+                sin((-45 + i * 270 / n) * Pi / 180));
+
+              FScaleBitmap.DrawLineAntialias(x, y, xt, yt, ScaleSettings.TickColor,
+                ScaleSettings.ThicknessMainTick);
+            end;
+        end;
+    end;
+  end;
+
+  // Draw after the sub-tics
+
+  if ScaleSettings.EnableMainTicks then
+  begin
+    n := ScaleSettings.MainTickCount;
+
+    for i := 0 to n do
+    begin
+
+      // Draw main ticks
+      // Calculate draw from point bottom
+
+      x := Origin.CenterPoint.x - Round(ScaleRadius * cos((-45 + i * 270 / n) * Pi / 180));
+      y := Origin.CenterPoint.y - Round(ScaleRadius * sin((-45 + i * 270 / n) * Pi / 180));
+
+      // Calculate draw to point top
+
+      xt := Origin.CenterPoint.x - Round((ScaleRadius - ScaleSettings.LengthMainTick) *
+        cos((-45 + i * 270 / n) * Pi / 180));
+      yt := Origin.CenterPoint.y - Round((ScaleRadius - ScaleSettings.LengthMainTick) *
+        sin((-45 + i * 270 / n) * Pi / 180));
+
+      FScaleBitmap.DrawLineAntialias(x, y, xt, yt, ScaleSettings.TickColor, ScaleSettings.ThicknessMainTick);
+    end;
+  end;
+
+  // Draw text, these are only for the Main Ticks
+
+  if ScaleSettings.EnableScaleText then
+    begin
+
+      FScaleBitmap.FontName := ScaleSettings.TextFont;
+      FScaleBitmap.FontHeight := TextSize;
+      FScaleBitmap.FontQuality := fqFineAntialiasing;
+      FScaleBitmap.FontStyle := FScaleSettings.TextStyle;
+
+      n := ScaleSettings.MainTickCount;
+
+      // if draw the scale reversed, do some tricky stuff so we can
+      // count up or down. Start is swapped with the actual end value here
+
+      if ScaleSettings.ReverseScale then
+      begin
+        scaleBump := -1;
+        scaleStartValue := n * ScaleSettings.Step + ScaleSettings.Start;
+      end
+      else
+      begin
+        scaleBump := 1;
+        scaleStartValue := ScaleSettings.Start;
+      end;
+
+      // Draw text for main ticks
+
+      for i := 0 to n do
+      begin
+        xt := Origin.CenterPoint.x - Round(TextRadius * cos((-45 + i * 270 / n) * Pi / 180));
+        yt := Origin.CenterPoint.y - Round(TextRadius * sin((-45 + i * 270 / n) * Pi / 180));
+
+        FScaleBitmap.TextOut(xt, yt - (FScaleBitmap.FontHeight / 1.7),
+          IntToStr(scaleStartValue + i * ScaleSettings.Step * scaleBump),
+          ScaleSettings.TextColor, taCenter);
+      end;
+    end;
+
+    // draw outer rings/bands
+
+    if (ScaleSettings.TickArcStyle = taOuter) or (ScaleSettings.TickArcStyle = taboth) then
+    begin
+      // draw arc OUSIDE on the tics, doesn't matter main or sub, all at the top
+      // inner of tic
+
+      pStart.x := Origin.CenterPoint.x - Round(ScaleRadius * cos(-45 * Pi / 180));
+      pStart.y := Origin.CenterPoint.y - Round(ScaleRadius * sin(-45 * Pi / 180));
+
+      startAngle := arctan2((Origin.CenterPoint.y - pStart.y),(Origin.CenterPoint.x - pStart.x)) + 4.71239; // add 270
+
+      // Calculate draw to point outer
+
+      pEnd.x := Origin.CenterPoint.x - Round((ScaleRadius - ScaleSettings.LengthMainTick) * cos(225 * Pi / 180));
+      pEnd.y := Origin.CenterPoint.y - Round((ScaleRadius - ScaleSettings.LengthMainTick) * sin(225 * Pi / 180));
+
+      endAngle :=  -arctan2((pEnd.y - Origin.CenterPoint.y),(pEnd.x - Origin.CenterPoint.x));
+      FScaleBitmap.Arc(
+                     Origin.CenterPoint.x, Origin.CenterPoint.y,
+                     ScaleRadius + 0.5, ScaleRadius + 0.5, // push down a bit
+                     startAngle, endAngle,
+                     ScaleSettings.TickColor,
+                     ScaleSettings.ThicknessMainTick,
+                     false,
+                     BGRA(0,0,0,0) // last param is alpha, so no interior color, inner routings ONLY draw the arc, no fill
+                     );
+    end;
+
+    if (ScaleSettings.TickArcStyle = taInner) or (ScaleSettings.TickArcStyle = taBoth) then
+    begin
+      // Inner will chose main tics (for now) if both main and sub tics on)
+      // will need to find out the radius for what selected... or do something
+      // like use what ever tic is LONGER (logic here will need a change)
+
+      // draw arc OUSIDE on the tics, doesn't matter main or sub, all at the top
+
+      // inner of tick
+
+      pStart.x := Origin.CenterPoint.x - Round(ScaleRadius * cos(-45 * Pi / 180));
+      pStart.y := Origin.CenterPoint.y - Round(ScaleRadius * sin(-45 * Pi / 180));
+
+      startAngle := arctan2((Origin.CenterPoint.y - pStart.y),(Origin.CenterPoint.x - pStart.x)) + 4.71239; // add 270
+
+      // Calculate draw to point outer
+
+      pEnd.x := Origin.CenterPoint.x - Round((ScaleRadius - ScaleSettings.LengthMainTick) * cos(225 * Pi / 180));
+      pEnd.y := Origin.CenterPoint.y - Round((ScaleRadius - ScaleSettings.LengthMainTick) * sin(225 * Pi / 180));
+
+      endAngle := -arctan2((pEnd.y - Origin.CenterPoint.y),(pEnd.x - Origin.CenterPoint.x));
+
+      // be nice and if not displaying main tics, use the sub tic length to bottom
+      // up against them
+
+      if not ScaleSettings.EnableMainTicks then
+        innerTicRadius := ScaleSettings.LengthSubTick
+     else
+        innerTicRadius := ScaleSettings.LengthMainTick;
+
+      FScaleBitmap.Arc(
+                     Origin.CenterPoint.x, Origin.CenterPoint.y,
+                     ScaleRadius - 0.5 - innerTicRadius, ScaleRadius - 0.5 - innerTicRadius,
+                     startAngle, endAngle,
+                     ScaleSettings.TickColor,
+                     ScaleSettings.ThicknessMainTick,
+                     false,
+                     BGRA(0,0,0,0) // last param is alpha, so no interior color, inner routings ONLY draw the arc, no fill
+                     );
+    end;
+end;
+
+procedure TSGCustomSuperGauge.DrawPointer;
+var
+  Origin: TSGOrigin;
+  x, y, x1, y1, extLen: integer;
+  commonSubEx: single;
+  PointerLength: single;
+  startAngle, endAngle: single;
+  bandRadius: single;
+
+begin
+  // Note : Min and max values are the GAUGE Settings, not the Scales,
+  //        the scale display is independant of the value of the gauge to
+  //        allow for multiple pointers if later needed
+
+  if not PointerSettings.Dirty then
+    Exit;
+
+  Origin.CenterPoint.X:= FGaugeBitmap.Width div 2;
+  Origin.CenterPoint.Y:= FGaugeBitmap.Height div 2;
+
+  // radius is smaller of the 2 dimensions
+
+  if Origin.CenterPoint.x < Origin.CenterPoint.y then
+    Origin.Radius := Origin.CenterPoint.x
+  else
+    Origin.Radius := Origin.CenterPoint.Y;
+
+  // Set the pointer length, does not apply to arc
+
+  if FAutoScale then
+    begin
+      PointerLength := Round(Origin.Radius * 0.85);
+    end
+    else
+      begin
+        PointerLength := PointerSettings.Length;
+      end;
+
+  // draw the arc style of pointer
+
+  if PointerSettings.Style = psArc then
+    begin
+      // drawn arc pointer, ensure not negative or crash, zero no need to draw
+
+      if FValue <= 0.0 then
+        Exit;
+
+       BandRadius := PointerLength - PointerSettings.Thickness div 2;    // adjust for band thickness so end of pointer is top
+
+       // Start = 225 degree is 0 on gague scale (Not the angle), and -45 degree is 100 on scale
+       // 270, down (gauge angle 0)180 flat, increase moves towards 0 decrease towards 100
+       // 0 is flat line, right most end. Increase goes backwards towards 0, -45 is 100 percent on scale
+
+       startAngle := 225 * PI / 180;  // start at 0 on the gauge
+       endAngle := startAngle - FValue * PI / 180;
+
+       FGaugeBitMap.LineCap := pecFlat; // caps should be flat, rounded does not align to scales well
+       FGaugeBitMap.Arc(
+                        Origin.CenterPoint.x, Origin.CenterPoint.y,
+                        BandRadius + 0.5, BandRadius + 0.5, // push down a bit
+                        startAngle, endAngle,
+                        PointerSettings.Color,
+                        PointerSettings.Thickness,
+                        false,
+                        BGRA(0,0,0,0) // last param is alpha, so no interior color, inner routings ONLY draw the arc, no fill
+                   );
+    end
+      else
+      begin
+        // if we are need to draw the extension behind the cap, we can
+        // recalc the ending point to just do one line draw instead of
+        // 2 discrete lines from the center. That is easier, but slower
+        // If extension len is 0, skip as will show a partial pixel
+
+        FGaugeBitMap.LineCap := pecRound; // caps should be round for line type pointers
+
+        if (PointerSettings.Style = psLineExt) and (PointerSettings.ExtensionLength > 0) then
+          begin
+            // The extension is always pixels visable from the center or edge of the
+            // cap, fix as needed. Makes nice for the user.
+
+            if PointerCapSettings.CapStyle = csNone then
+              extLen := PointerSettings.ExtensionLength
+            else
+              extLen := PointerSettings.ExtensionLength + PointerCapSettings.Radius;
+
+            // compute end point of pointer if an extension
+
+            commonSubEx := (-225 + FValue) * Pi / 180;
+            x1 := Origin.CenterPoint.x - Round(extLen * cos(commonSubEx));
+            y1 := Origin.CenterPoint.y - Round(extLen * sin(commonSubEx));
+
+          end
+            else
+              begin
+                // no extension or extension length is 0, just draw to center
+
+                x1 := Origin.CenterPoint.x;
+                y1 := Origin.CenterPoint.y;
+              end;
+
+        // computer start point of pointer
+
+        commonSubEx := (-45 + FValue) * Pi / 180;
+        x := Origin.CenterPoint.x - Round(PointerLength * cos(commonSubEx));
+        y := Origin.CenterPoint.y - Round(PointerLength * sin(commonSubEx));
+
+        // finally draw it
+
+        FGaugeBitMap.DrawLineAntialias(x, y, x1, y1, PointerSettings.Color, PointerSettings.Thickness)
+      end;
+end;
+
+procedure TSGCustomSuperGauge.DrawPointerCap;
+var
+  Origin: TSGOrigin;
+  sizeWH : integer;
+  pCapEdge : integer;
+  tx, ty: integer;
+  h: single;
+  d2: single;
+  v: TPointF;
+  p: PBGRAPixel;
+  Center: TPointF;
+  yb: integer;
+  xb: integer;
+  mask: TBGRABitmap;
+  Map: TBGRABitmap;
+
+begin
+
+  // skip drawing if nothing changed
+
+  if not PointerCapSettings.Dirty then
+    Exit;
+
+  PointerCapSettings.Dirty := False;
+
+  // drawing is the size of the cap, not of the entire gauge!
+
+  sizeWH := (PointerCapSettings.Radius + PointerCapSettings.EdgeThickness) * 2 + 2;
+  Origin := Initializebitmap(FPointerCapBitmap, SizeWH, SizeWH);
+  pCapEdge := PointerCapSettings.Radius + PointerCapSettings.EdgeThickness div 2;
+
+  if PointerCapSettings.CapStyle = csFlat then
+    begin
+      // Draw the flat cap, but make sure size is similar to the shaded below or will be odd
+
+      FPointerCapBitmap.EllipseAntialias(Origin.CenterPoint.x, Origin.CenterPoint.y,
+        pCapEdge,
+        pCapEdge,
+        PointerCapSettings.EdgeColor,
+        PointerCapSettings.EdgeThickness,
+        PointerCapSettings.FillColor);
+    end
+    else
+      begin
+
+        tx := PointerCapSettings.Radius * 2; // keeps size consistent with flat cap
+        ty := tx;
+
+        if (tx = 0) or (ty = 0) then
+          Exit;
+
+        if PointerCapSettings.CapStyle = csPhong then
+          begin
+            //compute knob height map
+
+            Center := PointF((tx - 1) / 2, (ty - 1) / 2);
+            Map := TBGRABitmap.Create(tx, ty);
+
+            for yb := 0 to ty - 1 do
+            begin
+              p := map.ScanLine[yb];
+              for xb := 0 to tx - 1 do
+              begin
+
+                //compute vector between center and current pixel
+
+                v := PointF(xb, yb) - Center;
+
+                //scale down to unit circle (with 1 pixel margin for soft border)
+
+                v.x := v.x / (tx / 2 + 1);
+                v.y := v.y / (ty / 2 + 1);
+
+                //compute squared distance with scalar product
+
+                d2 := v {$if FPC_FULLVERSION < 30203}*{$ELSE}**{$ENDIF} v;
+
+                //interpolate as quadratic curve and apply power function
+                if d2 > 1 then
+                  h := 0
+                else
+                  h := power(1 - d2, PointerCapSettings.CurveExponent);
+                p^ := MapHeightToBGRA(h, 255);
+                Inc(p);
+              end;
+            end;
+
+            // mask image round with and antialiased border
+
+            mask := TBGRABitmap.Create(tx, ty, BGRABlack);
+            Mask.FillEllipseAntialias(Center.x, Center.y, tx / 2, ty / 2, BGRAWhite);
+            map.ApplyMask(mask);
+            Mask.Free;
+
+            // now draw on the pointer bitmap, not sure if this is going to work since
+            // it's the pointer not just thje cap, mayh need to do a different
+            // bitmap and overlay, or how the needle will look????
+
+            PointerCapSettings.FPhong.Draw(FPointerCapBitmap, Map, 30,
+                    origin.CenterPoint.x - tx div 2, origin.CenterPoint.y - ty div 2,
+                    PointerCapSettings.FillColor);
+            Map.Free;
+
+            // Draw a flat radius around the cap if set, must be alpha 0 or will not
+            // be an outline
+
+            if PointerCapSettings.EdgeThickness > 0 then
+              FPointerCapBitmap.EllipseAntialias(origin.CenterPoint.x, origin.CenterPoint.y,
+                pCapEdge,
+                pCapEdge,
+                PointerCapSettings.EdgeColor,
+                PointerCapSettings.EdgeThickness, BGRA(0,0,0,0));
+          end
+        else
+          begin
+            // Regular shading
+
+            FPointerCapBitmap.FillEllipseLinearColorAntialias(origin.CenterPoint.x, origin.CenterPoint.y,
+              pCapEdge,
+              pCapEdge,
+              PointerCapSettings.FillColor,
+              PointerCapSettings.EdgeColor
+              );
+
+            // draw edge since the shading is backwards ending on fill color not Edge
+
+            FPointerCapBitmap.EllipseAntialias(origin.CenterPoint.x, origin.CenterPoint.y,
+              pCapEdge,
+              pCapEdge,
+              PointerCapSettings.EdgeColor,
+              PointerCapSettings.EdgeThickness, BGRA(0,0,0,0)
+              );
+
+          end;
+      end;
+end;
+
+// Pass in the FRangeLEDSettings with the index or the entire array??
+
+procedure TSGCustomSuperGauge.DrawLed;
+var
+  Origin: TSGOrigin;
+  sizeWH : integer;
+  mask: TBGRABitmap;
+begin
+
+  // skip drawing if nothing changed or not drawn
+
+  if not FRangeLEDSettings.Dirty then
+    Exit;
+
+  FRangeLEDSettings.Dirty := False;
+
+  // compute the size needed NOT a full gauge bitmap
+
+  sizeWH := FRangeLEDSettings.Size * 2 + 2; // square size at lease LED radius and a bit more
+  Origin := Initializebitmap(FLEDActiveBitmap, sizeWH, sizeWH);
+  Initializebitmap(FLEDInActiveBitmap, sizeWH, sizeWH);
+
+  // offset must be done later in the Paint proc to
+  // keep bitmap small so the center point is the centerpoint of the bitmap
+  // The caller MUST move to the correct offset
+
+  // draw both active and inactive so we never need to do either unless props changed
+  // need to find/get x, y to place the LED
+
+  if RangeLEDSettings.Shape = lshRound then
+    begin
+    if FRangeLEDSettings.Style = lsFlat then
+      begin
+        FLEDActiveBitmap.EllipseAntialias(Origin.CenterPoint.x, Origin.CenterPoint.y,
+          FRangeLEDSettings.Size,
+          FRangeLEDSettings.Size,
+          FRangeLEDSettings.BorderColor,
+          1,
+          FRangeLEDSettings.ActiveColor);
+      end
+    else
+      if FRangeLEDSettings.Style = lsShaded then
+        begin
+          // draw shaded, could do better here but good for starts
+
+          FLEDActiveBitmap.FillEllipseLinearColorAntialias(
+            Origin.CenterPoint.x,
+            Origin.CenterPoint.y,
+            FRangeLEDSettings.Size,
+            FRangeLEDSettings.Size,
+            FRangeLEDSettings.InactiveColor,
+            FRangeLEDSettings.ActiveColor);
+
+          // draw border
+
+          FLEDActiveBitmap.EllipseAntialias(
+            Origin.CenterPoint.x, Origin.CenterPoint.y,
+            FRangeLEDSettings.Size,
+            FRangeLEDSettings.Size,
+            FRangeLEDSettings.BorderColor,
+            1,
+            BGRA(0,0,0,0));  // fill transparent
+        end;
+
+    // Simple flat round for inactive always
+
+    if RangeLedSettings.Style <> lsNone then
+      begin
+        FLEDInactiveBitmap.EllipseAntialias(Origin.CenterPoint.x, Origin.CenterPoint.y,
+          FRangeLEDSettings.Size,
+          FRangeLEDSettings.Size,
+          FRangeLEDSettings.BorderColor,
+          1,
+          FRangeLEDSettings.InActiveColor);
+      end;
+    end // Round
+      else
+        if RangeLEDSettings.Shape = lshSquare then
+          begin
+            // draw a Square LED
+
+            if FRangeLEDSettings.Style = lsFlat then
+              begin
+                // Flat
+
+                FLEDActiveBitmap.FillRoundRectAntialias(
+                    0, 0,
+                    FLEDActiveBitmap.Width,
+                    FLEDActiveBitmap.Height,
+                    Origin.Radius / 2,
+                    Origin.Radius / 2,
+                    FRangeLEDSettings.ActiveColor);
+
+                // draw border for Flat
+
+                FLEDActiveBitmap.RoundRectAntialias(
+                    0,0,
+                    FLEDActiveBitmap.Width - 1,
+                    FLEDActiveBitmap.Height - 1,
+                    Origin.Radius / 2,
+                    Origin.Radius / 2,
+                    FRangeLEDSettings.BorderColor,
+                    1);
+              end
+            else
+              if FRangeLEDSettings.Style = lsShaded then
+                begin
+                  // draw shaded
+
+                  FLEDActiveBitmap.GradientFill(
+                      0, 0,
+                      FLEDActiveBitmap.Width,
+                      FLEDActiveBitmap.Height,
+                      FRangeLEDSettings.ActiveColor,
+                      BGRA(0,0,0),
+                      gtRadial,
+                      PointF(FLEDActiveBitmap.Width / 2, FLEDActiveBitmap.Height / 2),
+                      PointF(FLEDActiveBitmap.Width * 1.5,FLEDActiveBitmap.Height * 1.5),
+                      dmSet);
+
+                  mask := TBGRABitmap.Create(FLEDActiveBitmap.Width, FLEDActiveBitmap.Height, BGRABlack);
+                  mask.FillRoundRectAntialias(
+                      0, 0,
+                      FLEDActiveBitmap.Width,
+                      FLEDActiveBitmap.Height,
+                      Origin.Radius / 2,
+                      Origin.Radius / 2,
+                      BGRAWhite);
+
+                  FLEDActiveBitmap.ApplyMask(mask);
+                  mask.Free;
+
+                  // draw border for shaded
+
+                  FLEDActiveBitmap.RoundRectAntialias(
+                            0, 0,
+                            FLEDActiveBitmap.Width - 1,
+                            FLEDActiveBitmap.Height - 1,
+                            Origin.Radius / 2,
+                            Origin.Radius / 2,
+                            FRangeLEDSettings.BorderColor,
+                            1);
+                end;
+
+            // Simple flat square for inactive always
+
+            if RangeLEDSettings.Style <> lsNone then
+              begin
+                // Need to draw the filled
+                FLEDInactiveBitmap.FillRoundRectAntialias(
+                    0, 0,
+                    FLEDActiveBitmap.Width,
+                    FLEDActiveBitmap.Height,
+                    Origin.Radius / 2,
+                    Origin.Radius / 2,
+                    FRangeLEDSettings.InactiveColor);
+
+                // Now the border
+                FLEDInactiveBitmap.RoundRectAntialias(
+                          0, 0,
+                          FLEDActiveBitmap.Width - 1,
+                          FLEDActiveBitmap.Height - 1,
+                          Origin.Radius / 2,
+                          Origin.Radius / 2,
+                          FRangeLEDSettings.BorderColor,
+                          1);
+              end;
+          end // square
+        else
+          if RangeLEDSettings.Shape = lshTriangle then
+            begin
+              // draw a triangle and border
+
+              if FRangeLEDSettings.Style = lsFlat then  // TODO : add lsShaded
+                begin
+                  FLEDActiveBitmap.DrawPolyLineAntialias(
+                      [ PointF(FLEDActiveBitmap.Width / 2, 1),
+                        PointF(FLEDActiveBitmap.Width - 1, FLEDActiveBitmap.Height - 1),
+                        PointF(1, FLEDActiveBitmap.Height - 1),
+                        PointF(FLEDActiveBitmap.Width / 2, 1) // close it for border
+                      ],
+                      FRangeLEDSettings.BorderColor,
+                      1,
+                      FRangeLEDSettings.ActiveColor);
+
+                end
+              else
+                if FRangeLEDSettings.Style = lsShaded then
+                  begin
+                    // draw shaded
+                     FLEDActiveBitmap.FillPolyLinearColor(
+                          [ PointF(FLEDActiveBitmap.Width / 2, 1),
+                          PointF(FLEDActiveBitmap.Width - 1, FLEDActiveBitmap.Height - 1),
+                          PointF(1, FLEDActiveBitmap.Height - 1)],
+                          [FRangeLEDSettings.InactiveColor,
+                          FRangeLEDSettings.ActiveColor,
+                          FRangeLEDSettings.ActiveColor]);
+                    // draw border
+                     FLEDActiveBitmap.DrawPolyLineAntialias(
+                         [ PointF(FLEDActiveBitmap.Width / 2, 1),
+                           PointF(FLEDActiveBitmap.Width - 1, FLEDActiveBitmap.Height - 1),
+                           PointF(1, FLEDActiveBitmap.Height - 1),
+                           PointF(FLEDActiveBitmap.Width / 2, 1) // close it for border
+                         ],
+                         FRangeLEDSettings.BorderColor,
+                         1,
+                         BGRA(0,0,0,0));
+                  end;
+                if RangeLEDSettings.Style <> lsNone then
+                  begin
+                    FLEDInactiveBitmap.DrawPolyLineAntialias(
+                        [ PointF(FLEDActiveBitmap.Width / 2, 1),
+                          PointF(FLEDActiveBitmap.Width - 1, FLEDActiveBitmap.Height - 1),
+                          PointF(1, FLEDActiveBitmap.Height - 1),
+                          PointF(FLEDActiveBitmap.Width / 2, 1) // close it for border
+                        ],
+                        FRangeLEDSettings.BorderColor,
+                        1,
+                        FRangeLEDSettings.InactiveColor);
+                  end;
+            end // triangle
+          else
+            if RangeLEDSettings.Shape = lshDownTriangle then
+              begin
+                  // draw a downward pointing triangle and border
+                  if FRangeLEDSettings.Style = lsFlat then
+                    begin
+                      FLEDActiveBitmap.DrawPolyLineAntialias(
+                        [ PointF(1,1),
+                          PointF(FLEDActiveBitmap.Width / 2, FLEDActiveBitmap.Height  - 1),
+                          PointF(FLEDActiveBitmap.Width - 1, 1),
+                          PointF(1,1)
+                        ],
+                        FRangeLEDSettings.BorderColor,
+                        1,
+                        FRangeLEDSettings.ActiveColor);
+                      end
+                    else
+                      if FRangeLEDSettings.Style = lsShaded then
+                        begin
+                          // draw shaded
+
+                          FLEDActiveBitmap.FillPolyLinearColor(
+                             [ PointF(1,1),
+                               PointF(FLEDActiveBitmap.Width / 2, FLEDActiveBitmap.Height  - 1),
+                               PointF(FLEDActiveBitmap.Width - 1, 1)
+                             ],
+                             [FRangeLEDSettings.InactiveColor,
+                             FRangeLEDSettings.ActiveColor,
+                             FRangeLEDSettings.ActiveColor]);
+
+                          // draw border
+
+                          FLEDActiveBitmap.DrawPolyLineAntialias(
+                             [ PointF(1,1),
+                               PointF(FLEDActiveBitmap.Width / 2, FLEDActiveBitmap.Height  - 1),
+                               PointF(FLEDActiveBitmap.Width - 1, 1),
+                               PointF(1,1)
+                             ],
+                               FRangeLEDSettings.BorderColor,
+                               1,
+                               BGRA(0,0,0,0));
+                        end;
+                  // Draw Inactive DownTri
+                  if RangeLEDSettings.Style <> lsNone then
+                  begin
+                    FLEDInactiveBitmap.DrawPolyLineAntialias(
+                      [ PointF(1,1),
+                        PointF(FLEDActiveBitmap.Width / 2, FLEDActiveBitmap.Height  - 1),
+                        PointF(FLEDActiveBitmap.Width - 1, 1),
+                        PointF(1,1)
+                      ],
+                      FRangeLEDSettings.BorderColor,
+                      1,
+                      FRangeLEDSettings.InactiveColor);
+                  end;
+
+              end;
+end;
+
+procedure TSGCustomSuperGauge.DrawMarkers;
+var
+  i: integer;
+begin
+  if not IsAnyMarkerDirty then
+    exit;
+
+  Initializebitmap(FMarkerBitmap, Width, Height); // clear it before we draw anything
+
+  // Draws low to high, so if overlapping, last will be visible
+
+  for i := low(FMarkersSettings) to high(FMArkersSettings) do
+  begin
+    FMarkersSettings[i].Dirty := True; // need to dirty them all
+    DrawMarker(FMarkerBitmap, FMarkersSettings[i]);    // will clear any dirty
+  end;
+end;
+
+procedure TSGCustomSuperGauge.DrawMarker(MarkerBitmap: TBGRABitmap; const MarkerSettings: TSGMarkerSettings);
+var
+  x1, y1, x2, y2: integer;
+  cenX, cenY: integer;
+  j, vecLen: single;
+  A, B, U, V: TPointF;
+
+begin
+  // skip drawing if nothing changed or not drawn
+
+  if not MarkerSettings.Dirty then
+    Exit;
+
+  MarkerSettings.Dirty := False;
+
+  if not MarkerSettings.Enabled then
+    Exit;
+
+  // Center of bitmap
+
+  cenX := MarkerBitmap.Width div 2;
+  cenY := MarkerBitmap.Height div 2;
+
+  j := (180 - 270) / 2;
+  x1 := cenX - Round(MarkerSettings.Radius * cos((j + MarkerSettings.Value * 270 / 100) * Pi / 180));
+  y1 := cenY - Round(MarkerSettings.Radius * sin((j + MarkerSettings.Value * 270 / 100) * Pi / 180));
+  A := PointF(x1,y1);
+
+  // Calculate draw to point top
+
+  x2 := cenX - Round((MarkerSettings.Radius - MarkerSettings.Height) * cos((j + MarkerSettings.Value * 270 / 100) * Pi / 180));
+  y2 := cenY - Round((MarkerSettings.Radius - MarkerSettings.Height) * sin((j + MarkerSettings.Value * 270 / 100) * Pi / 180));
+  B := PointF(X2, y2);
+
+  // set line cap just in case
+
+  FMarkerBitmap.LineCap := pecRound; // Ensure Round Cap
+
+  // This is the vector that runs from outer to inner
+
+  U := B - A;
+
+  // build the perpendicular vector
+  // (clockwise in screen coordinates while the opposite would be counter clockwise)
+
+  V := PointF(-U.y, U.x);
+
+  // scale it to set the new segment length
+
+  vecLen := VectLen(V);
+
+  // catch odd case of zero len vector, do nothing
+
+  if vecLen = 0.0 then
+    Exit;
+
+  V := V * (MarkerSettings.Width / vecLen);
+
+  case MarkerSettings.Style of
+    msCenter: // triangle centered on the value
+      begin
+        MarkerBitmap.FillPolyAntialias([B, A + V, A - V], MarkerSettings.Color);
+      end;
+
+    msLeft:   // triangle left side only (if looking at it at half way on the gauge)
+      begin
+        MarkerBitmap.FillPolyAntialias([B, A + V, A], MarkerSettings.Color);
+      end;
+
+    msRight:
+      begin   // triangle right side only
+        MarkerBitmap.FillPolyAntialias([B, A, A - V], MarkerSettings.Color);
+      end;
+  end;
+end;
+
+/////////////////
+
+function TSGCustomSuperGauge.CheckRangeLED(AValue: single): boolean;
+begin
+  // If a single value is used for both StartRangeValue and
+  // EndRangeValue the option for rcBetween makes no sense and is a not valid
+  // and will never trigger. Also Manually setting the .Active prop will ONLY
+  // work if rcNone is set, otherwise the range checks will prevail as the
+  // way the Active state is set and overide the manual setting.
+  //
+  // Current List
+  // TSGRangeCheckType = (rcNone, rcBetween, rcBothInclusive, rcStartInclusive,
+  //                      rcEndInclusive, rcBothBetweenOutside,
+  //                      rcBothInclusiveOutside, rcGreaterStart, RangeEndValue);
+  //
+  // NOTE - rcGreaterStart, RangeEndValue ignore RangeEnd and RangeStart respectivly
+
+  if FRangeLEDSettings.RangeType = rcNone then
+  begin
+    Result := FRangeLEDSettings.Active;   // need to always return the current state here, Will never trigger RangeLED Events
+  end
+  else
+    if FRangeLEDSettings.Rangetype = rcGaugeOutOfRange then     // Special case to ONLY look at the gauge state, ignores the start/end
+      Result := FOutOfRangeState                                // Will NOT trigger any events for RangeLED, this is handled elsewhere
+    else
+      if FRangeLEDSettings.RangeType = rcGreaterStart then
+        Result := (AValue > FRangeLEDSettings.RangeStartValue)  // ignore range end, most common case
+      else
+        if FRangeLEDSettings.RangeType = rcLessEnd then
+          Result := (AValue < FRangeLEDSettings.RangeEndValue)  // ignor range start
+        else
+          if FRangeLEDSettings.RangeType = rcBetween then
+            Result := (AValue > FRangeLEDSettings.RangeStartValue) and (AValue < FRangeLEDSettings.RangeEndValue)
+          else
+            if FRangeLEDSettings.Rangetype = rcBothInclusive then
+              Result := (AValue >= FRangeLEDSettings.RangeStartValue) and (AValue <= FRangeLEDSettings.RangeEndValue)
+            else
+              if FRangeLEDSettings.Rangetype = rcBothBetweenOutside then
+                Result := (AValue < FRangeLEDSettings.RangeStartValue) or (AValue > FRangeLEDSettings.RangeEndValue)
+              else
+                if FRangeLEDSettings.Rangetype = rcStartInclusive then
+                  Result := (AValue >= FRangeLEDSettings.RangeStartValue) and (AValue < FRangeLEDSettings.RangeEndValue)
+                else
+                  if FRangeLEDSettings.Rangetype = rcEndInclusive then
+                    Result := (AValue > FRangeLEDSettings.RangeStartValue) and (AValue <= FRangeLEDSettings.RangeEndValue)
+                  else
+                    if FRangeLEDSettings.Rangetype = rcBothInclusiveOutside then
+                      Result := (AValue <= FRangeLEDSettings.RangeStartValue) or (AValue >= FRangeLEDSettings.RangeEndValue);
+
+  // Now set the flag we have changed so others SetValue() can update as needed
+
+  FRangeLEDStateChanged := FRangeLEDStateChanged or (Result <> FRangeLEDSettings.Active);
+
+  // Try the callbacks now, should hit one or the other depending on Active state
+  // if they are assigned! Rember some will NEVER casuse a call back, rcNone and
+  // rcGaugeOutOfRange
+
+  if FRangeLEDStateChanged and (FRangeLEDSettings.RangeType <> rcNone)
+    and (FRangeLEDSettings.RangeType <> rcGaugeOutOfRange) then
+  begin
+      if Assigned(FRangeLedActive) and Result then
+        FRangeLEDActive(Self, AValue)
+      else
+        if Assigned(FRangeLedActive) and (not Result) then
+          FRangeLEDInactive(Self, AValue);
+
+      FRangeLEDStateChanged := False;   // clear the state
+  end;
+
+  FRangeLEDSettings.ActiveNoDoChange := Result;
+end;
+
+end.

+ 1644 - 0
supergaugecommon.pas

@@ -0,0 +1,1644 @@
+// SPDX-License-Identifier: LGPL-3.0-linking-exception
+{
+  Part of BGRA Controls. Made by third party.
+  For detailed information see readme.txt
+
+  Site: https://sourceforge.net/p/bgra-controls/
+  Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
+  Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
+
+}
+{******************************* CONTRIBUTOR(S) ******************************
+- Edivando S. Santos Brasil | [email protected]
+  (Compatibility with delphi VCL 11/2018)
+- Sandy Ganz | [email protected]
+  Evolved from DTAnalogCommon, specific for New Gauge Work
+  Massive overhaul, fixes and features, begat Super Gauge
+  Needed to split off as changes broke compatibility badly
+
+***************************** END CONTRIBUTOR(S) *****************************}
+unit supergaugecommon;
+
+{$I bgracontrols.inc}
+
+interface
+
+uses
+  Classes, SysUtils, {$IFDEF FPC}LResources,{$ELSE}Types, {$ENDIF} Forms, Controls, Graphics, Dialogs,
+  BGRABitmap, BGRABitmapTypes, BGRAGradients, BCTypes;
+
+type
+  TSGFillStyle = (fsNone, fsGradient{, fsTexture}); // Add more if needed here
+  TSGPointerStyle = (psLine, psLineExt, psArc {, nsTriangle, nsTriangleExt}); // Todo : Add others at some point
+  TSGLEDStyle = (lsNone, lsFlat, lsShaded);
+  TSGLEDShape = (lshRound, lshSquare, lshTriangle, lshDownTriangle);
+  TSGPointerCapPosition = (cpUnder, cpOver);
+  TSGCapStyle = (csNone, csFlat, csShaded, csPhong);
+  TSGTickArc = (taNone, taOuter, taInner, taBoth); // Arc above or below ticks, inner/both is automatic on inner, main if exist, minor othewise
+  TSGRangeCheckType = (rcNone, rcGaugeOutOfRange, rcBetween, rcBothInclusive, rcStartInclusive,
+                      rcEndInclusive, rcBothBetweenOutside, rcBothInclusiveOutside,
+                      rcGreaterStart, rcLessEnd); // added for range check led, see code for details
+  TSGMarkerStyle = (msCenter, msLeft, msRight);
+
+  { TSGOrigin }
+
+  TSGOrigin = packed record
+    CenterPoint: TPoint;
+    Radius: integer;
+  end;
+
+  { TSGPointerCapSettings }
+
+  TSGPointerCapSettings = class(TPersistent)
+  private
+    FEdgeColor: TColor;
+    FEdgeThickness: integer;
+    FFillColor: TColor;
+    FOnChange: TNotifyEvent;
+    FRadius: integer;
+    FCurveExponent: single;
+    FCapStyle: TSGCapStyle;
+    FCapPosition: TSGPointerCapPosition;
+    FDirty: boolean;
+
+    procedure SetEdgeColor(AValue: TColor);
+    procedure SetEdgeThickness(AValue: integer);
+    procedure SetFillColor(AValue: TColor);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure SetRadius(AValue: integer);
+    procedure SetLightIntensity(const AValue: integer);
+    function GetLightIntensity: integer;
+    procedure SetCurveExponent(const AValue: single);
+    procedure SetCapStyle(const AValue: TSGCapStyle);
+    procedure SetPointerCapPos(const AValue: TSGPointerCapPosition);
+    procedure DirtyOnChange;
+  protected
+  public
+    FPhong: TPhongShading;
+    property Dirty: boolean read FDirty write FDirty;
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+
+  published
+    property EdgeColor: TColor read FEdgeColor write SetEdgeColor default clGray;
+    property FillColor: TColor read FFillColor write SetFillColor default clBlack;
+    property Radius: integer read FRadius write SetRadius default 30;
+    property EdgeThickness: integer read FEdgeThickness write SetEdgeThickness default 2;
+    property LightIntensity: integer read GetLightIntensity write SetLightIntensity default 300;
+    property CurveExponent: single read FCurveExponent write SetCurveExponent default 0.05;
+    property CapStyle: TSGCapStyle read FCapStyle write SetCapStyle default csPhong;
+    property CapPosition: TSGPointerCapPosition read FCapPosition write SetPointerCapPos default cpUnder;
+  end;
+
+  { TSGPointerSettings }
+
+  TSGPointerSettings = class(TPersistent)
+  private
+    FColor: TColor;
+    FLength: integer;
+    FExtensionLength: integer;
+    FOnChange: TNotifyEvent;
+    FThickness: integer;
+    FStyle: TSGPointerStyle;
+    FDirty: boolean;
+
+    procedure SetColor(AValue: TColor);
+    procedure SetLength(AValue: integer);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure SetThickness(AValue: integer);
+    procedure SetStyle(AValue: TSGPointerStyle);
+    procedure SetExtensionLength(AValue: integer);
+    procedure DirtyOnChange;
+
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property Color: TColor read FColor write SetColor;
+    property Length: integer read FLength write SetLength default 160;
+    property ExtensionLength: integer read FExtensionLength write SetExtensionLength default 20;
+    property Thickness: integer read FThickness write SetThickness default 5;
+    property Style: TSGPointerStyle read FStyle write SetStyle default psLineExt;
+  end;
+
+  { TSGScaleSettings }
+
+  TSGScaleSettings = class(TPersistent)
+  private
+    FEnableScaleText: boolean;
+    FStart: integer;
+    FStep: integer;
+    FMaximum: integer;
+    FMinimum: integer;
+    FTextFont: string;
+    FTextRadius: integer;
+    FTextSize: integer;
+    FTextStyle: TFontStyles;
+    FTickColor: TColor;
+    FEnableMainTicks: boolean;
+    FEnableSubTicks: boolean;
+    FReverseScale: boolean;
+    FThicknessMainTick: integer;
+    FThicknessSubTick: integer;
+    FLengthMainTick: integer;
+    FLengthSubTick: integer;
+    FMainTickCount: integer;
+    FOnChange: TNotifyEvent;
+    FSubTickCount: integer;
+    FTextColor: TColor;
+    FScaleRadius: integer;
+    FTickArcStyle: TSGTickArc;
+    FDirty: boolean;
+
+    procedure SetEnableScaleText(AValue: boolean);
+    procedure SetStart(AValue: integer);
+    procedure SetStep(AValue: integer);
+    procedure SetMaximum(AValue: integer);
+    procedure SetMinimum(AValue: integer);
+    procedure SetTextFont(AValue: string);
+    procedure SetTextRadius(AValue: integer);
+    procedure SetTextSize(AValue: integer);
+    procedure SetTextStyle(AValue: TFontStyles);
+    procedure SetTickColor(AValue: TColor);
+    procedure SetEnableMainTicks(AValue: boolean);
+    procedure SetEnableSubTicks(AValue: boolean);
+    procedure SetReverseScale(AValue: boolean);
+    procedure SetLengthMainTick(AValue: integer);
+    procedure SetLengthSubTick(AValue: integer);
+    procedure SetMainTickCount(AValue: integer);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure SetSubTickCount(AValue: integer);
+    procedure SetTextColor(AValue: TColor);
+    procedure SetThicknessMainTick(AValue: integer);
+    procedure SetThicknessSubTick(AValue: integer);
+    procedure SetTickArcStyle(AValue: TSGTickArc);
+    procedure SetScaleRadius(AValue: integer);
+    procedure DirtyOnChange;
+
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property TickColor: TColor read FTickColor write SetTickColor;
+    property TextColor: TColor read FTextColor write SetTextColor;
+    property TextSize: integer read FTextSize write SetTextSize default 20;
+    property TextStyle: TFontStyles read FTextStyle write SetTextStyle;
+    property TextFont: string read FTextFont write SetTextFont;
+    property EnableMainTicks: boolean read FEnableMainTicks write SetEnableMainTicks;
+    property EnableSubTicks: boolean read FEnableSubTicks write SetEnableSubTicks;
+    property EnableScaleText: boolean read FEnableScaleText write SetEnableScaleText;
+    property ReverseScale: boolean read FReverseScale write SetReverseScale default False;
+    property Start: integer read FStart write SetStart default 0;
+    property Step: integer read FStep write SetStep default 1;
+    property MainTickCount: integer read FMainTickCount write SetMainTickCount;
+    property SubTickCount: integer read FSubTickCount write SetSubTickCount;
+    property LengthMainTick: integer read FLengthMainTick write SetLengthMainTick;
+    property LengthSubTick: integer read FLengthSubTick write SetLengthSubTick;
+    property ThicknessMainTick: integer read FThicknessMainTick write SetThicknessMainTick;
+    property ThicknessSubTick: integer read FThicknessSubTick write SetThicknessSubTick;
+    property TextRadius: integer read FTextRadius write SetTextRadius default 120;
+    property ScaleRadius: integer read FScaleRadius write SetScaleRadius;
+    property TickArcStyle : TSGTickArc read FTickArcStyle write SetTickArcStyle default taOuter;
+  end;
+
+  { TSGBandSettings }
+
+  TSGBandSettings = class(TPersistent)
+  private
+    FEnabled: boolean;
+    FStartValue: single;
+    FEndValue: single;
+    FEnableText: boolean;
+    FText: TCaption;
+    FTextFont: string;
+    FTextStyle: TFontStyles;
+    FTextRadius: integer;
+    FTextSize: integer;
+    FTextColor: TColor;
+    FOnChange: TNotifyEvent;
+    FBandThickness: integer;
+    FBandRadius: integer;       // defines the outer Radius length in pixels, likely center of width/thickness
+    FBandColor: TColor;
+    FDirty: boolean;
+
+    procedure SetEnabled(AValue: boolean);
+    procedure SetStartValue(AValue: single);
+    procedure SetEndValue(AValue: single);
+    procedure SetEnableText(AValue: boolean);
+    procedure SetText(AValue: TCaption);
+    procedure SetTextSize(AValue: integer);
+    procedure SetTextFont(AValue: string);
+    procedure SetTextStyle(AValue: TFontStyles);
+    procedure SetTextRadius(AValue: integer);
+    procedure SetTextColor(AValue: TColor);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure SetBandThickness(AValue: integer);
+    procedure SetBandRadius(AValue: integer);
+    procedure SetBandColor(AValue: TColor);
+    procedure DirtyOnChange;
+
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property Enabled: boolean read FEnabled write SetEnabled default False;
+    property StartValue: single read FStartValue write SetStartValue default 0.0;
+    property EndValue: single read FEndValue write SetEndValue default 100.0;
+    property EnableText: boolean read FEnableText write SetEnableText;
+    property Text: TCaption read FText write SetText;
+    property TextSize: integer read FTextSize write SetTextSize default 20;
+    property TextFont: string read FTextFont write SetTextFont;
+    property TextStyle: TFontStyles read FTextStyle write SetTextStyle;
+    property TextRadius: integer read FTextRadius write SetTextRadius;
+    property TextColor: TColor read FTextColor write SetTextColor;
+    property Thickness: integer read FBandThickness write SetBandThickness;
+    property BandRadius: integer read FBandRadius write SetBandRadius;
+    Property BandColor: TColor read FBandColor write SetBandColor;
+  end;
+
+  { TSGFaceSettings }
+
+  TSGFaceSettings = class(TPersistent)
+  private
+    FInnerColor: TColor;
+    FOuterColor: TColor;
+    FFillStyle: TSGFillStyle;
+    FPicture: TPicture;
+    FPictureEnabled: boolean;
+    FPictureOffsetX, FPictureOffsetY: integer;
+    FOnChange: TNotifyEvent;
+    FDirty: boolean;
+
+    procedure SetInnerColor(AValue: TColor);
+    procedure SetOuterColor(AValue: TColor);
+    procedure SetFillStyle(AValue: TSGFillStyle);
+    procedure SetPicture(AValue: TPicture);
+    procedure SetPictureEnabled(AValue: boolean);
+    procedure SetPictureOffsetX(AValue: integer);
+    procedure SetPictureOffsetY(AValue: integer);
+
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure DirtyOnChange;
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property FillStyle: TSGFillStyle read FFillStyle write SetFillStyle;
+    property InnerColor: TColor read FInnerColor write SetInnerColor;
+    property OuterColor: TColor read FOuterColor write SetOuterColor;
+    property Picture: TPicture read FPicture write SetPicture;
+    property PictureEnabled: boolean read FPictureEnabled write SetPictureEnabled;
+    property PictureOffsetX: integer read FPictureOffsetX write SetPictureOffsetX default 0;
+    property PictureOffsetY: integer read FPictureOffsetY write SetPictureOffsetY default 0;
+  end;
+
+  { TSGFrameSettings }
+
+  TSGFrameSettings = class(TPersistent)
+  private
+    FFrameColor: TColor;
+    FBorderColor: TColor;
+    FBorderRadius: integer;
+    FOnChange: TNotifyEvent;
+    FDirty: boolean;
+
+    procedure SetBorderRadius(AValue: integer);
+    procedure SetFrameColor(AValue: TColor);
+    procedure SetBorderColor(AValue: TColor);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure DirtyOnChange;
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property BorderRadius: integer read FBorderRadius write SetBorderRadius;
+    property FrameColor: TColor read FFrameColor write SetFrameColor;
+    property BorderColor: TColor read FBorderColor write SetBorderColor;
+  end;
+
+  { TSGLEDSettings }
+
+  TSGLEDSettings = class(TPersistent)
+  private
+    FActiveColor: TColor;
+    FInactiveColor: TColor;
+    FBorderColor: TColor;
+    FSize: integer;
+    FOffsetX, FOffsetY: integer;
+    FStyle: TSGLEDStyle;
+    FShape: TSGLEDShape;
+    FOnChange: TNotifyEvent;
+    FActive: boolean;
+    FDirty: boolean;
+
+    procedure SetActive(AValue: boolean);
+    procedure SetActiveNoDoChange(AValue: boolean);
+    procedure SetActiveColor(AValue: TColor);
+    procedure SetInactiveColor(AValue: TColor);
+    procedure SetBorderColor(AValue: TColor);
+    procedure SetSize(AValue: integer);
+    procedure SetOffsetX(AValue: integer);
+    procedure SetOffsetY(AValue: integer);
+    procedure SetStyle(AValue: TSGLEDStyle);
+    procedure SetShape(AValue: TSGLEDShape);
+    procedure SetOnChange(AValue: TNotifyEvent);
+    procedure DirtyOnChange;
+
+  protected
+  public
+    constructor Create;
+    destructor Destroy; override;
+    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+    property Dirty: boolean read FDirty write FDirty;
+
+  published
+    property ActiveColor: TColor read FActiveColor write SetActiveColor;
+    property InactiveColor: TColor read FInactiveColor write SetInactiveColor;
+    property BorderColor: TColor read FBorderColor write SetBorderColor;
+    property Size: integer read FSize write SetSize default 10;
+    property OffsetX: integer read FOffsetX write SetOffsetX default 0;
+    property OffsetY: integer read FOffsetY write SetOffsetY default 50;
+    property Style: TSGLEDStyle read FStyle write SetStyle default lsShaded;
+    property Shape: TSGLEDShape read FShape write SetShape default lshRound;
+    property Active: boolean read FActive write SetActive;
+    property ActiveNoDoChange: boolean read FActive write SetActiveNoDoChange;
+  end;
+
+  { TSGRangeCheckLEDSettings }
+
+  TSGRangeCheckLEDSettings = class(TSGLEDSettings)
+    private
+      FRangeStartValue : single;
+      FRangeEndValue : single;
+      FRangeType: TSGRangeCheckType;
+      procedure SetRangeStartValue(AValue: single);
+      procedure SetRangeEndValue(AValue: single);
+      procedure SetRangeType(AValue: TSGRangeCheckType);
+
+    protected
+    public
+      constructor Create;
+      destructor Destroy; override;
+
+    published
+      property RangeStartValue: single read FRangeStartValue write SetRangeStartValue default 0;
+      property RangeEndValue: single read FRangeEndValue write SetRangeEndValue default 100;
+      property RangeType: TSGRangeCheckType read FRangeType write SetRangeType;
+      property ActiveColor;
+      property InactiveColor;
+      property BorderColor;
+      property Size;
+      property OffsetX;   // origin at center based offset
+      property OffsetY;
+      property Style;
+  end;
+
+{ TSGTextSettings }
+
+TSGTextSettings = class(TPersistent)
+private
+  FEnabled: boolean;
+  FFontEx: TBCFont;
+  FText : TCaption;
+  FOffsetX, FOffsetY: integer;
+  FOnChange: TNotifyEvent;
+  FDirty: boolean;
+
+  procedure SetEnabled(AValue: boolean);
+  procedure SetOffsetX(AValue: integer);
+  procedure SetOffsetY(AValue: integer);
+  procedure SetOnChange(AValue: TNotifyEvent);
+  procedure DirtyOnChange;
+  procedure SetText(AValue: TCaption);
+  procedure SetFontEx(AValue: TBCFont);
+
+protected
+public
+  constructor Create;
+  destructor Destroy; override;
+  property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+  property Dirty: boolean read FDirty write FDirty;
+
+published
+  property Enabled: boolean read FEnabled write SetEnabled default False;
+  property FontEx: TBCFont read FFontEx write SetFontEx;
+  property Text: TCaption read FText write SetText;
+  property OffsetX: integer read FOffsetX write SetOffsetX;
+  property OffsetY: integer read FOffsetY write SetOffsetY;
+end;
+
+{ TSGMarkerSettings }
+
+//  Marker can be left or right or centered. The flat side should
+//  be aligned with the markers value or in the case of centered, will
+//  be the center of the marker. Like -  \| - Left, |/ - Right, \/ - Centered
+
+TSGMarkerSettings = class(TPersistent)
+private
+  FValue: single;     // this is the internal gauge value not user value
+  FEnabled: boolean;
+  FColor: TColor;
+  FHeight: integer;
+  FRadius: integer;
+  FWidth: integer;
+  FStyle: TSGMarkerStyle;
+  FOnChange: TNotifyEvent;
+  FDirty: boolean;
+
+  procedure SetValue(AValue: single);
+  procedure SetEnabled(AValue: boolean);
+  procedure SetColor(AValue: TColor);
+  procedure SetHeight(AValue: integer);
+  procedure SetRadius(AValue: integer);
+  procedure SetWidth(AValue: integer);
+  procedure SetOnChange(AValue: TNotifyEvent);
+  procedure SetStyle(AValue: TSGMarkerStyle);
+  procedure DirtyOnChange;
+
+protected
+public
+  constructor Create;
+  destructor Destroy; override;
+  property OnChange: TNotifyEvent read FOnChange write SetOnChange;
+  property Dirty: boolean read FDirty write FDirty;
+
+published
+  property Value: single read FValue write SetValue default 0.0;
+  property Enabled: boolean read FEnabled write SetEnabled default False;
+  property Color: TColor read FColor write SetColor;
+  property Height: integer read FHeight write SetHeight;
+  property Radius: integer read FRadius write SetRadius;
+  property Width: integer read FWidth write SetWidth;
+  property Style: TSGMarkerStyle read FStyle write SetStyle default msCenter;
+end;
+
+function Initializebitmap(var Bitmap: TBGRABitmap; Width, Height: integer): TSGOrigin;
+
+implementation
+
+function Initializebitmap(var Bitmap: TBGRABitmap; Width, Height: integer): TSGOrigin;
+begin
+  Bitmap.SetSize(Width, Height);
+
+  // Clear bitmap to transparent
+
+  BitMap.Fill(BGRA(0, 0, 0, 0));
+
+  // Get origin information
+
+  Result.CenterPoint.x := Width div 2;
+  Result.CenterPoint.y := Height div 2;
+
+  // Take the smallest so radius will always fit
+
+  if Result.CenterPoint.x < Result.CenterPoint.y then
+    Result.Radius := Result.CenterPoint.x
+  else
+    Result.Radius := Result.CenterPoint.y;
+end;
+
+{ TSGPointerCapSettings }
+
+procedure TSGPointerCapSettings.SetCapStyle(const AValue: TSGCapStyle);
+begin
+  if FCapStyle = AValue then
+    Exit;
+
+  FCapStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetPointerCapPos(const AValue: TSGPointerCapPosition);
+begin
+  if FCapPosition = AValue then
+    Exit;
+
+  FCapPosition := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetLightIntensity(const AValue: integer);
+begin
+  if AValue = FPhong.LightSourceIntensity then
+    Exit;
+
+  FPhong.LightSourceIntensity := AValue;
+  DirtyOnChange;
+end;
+
+function TSGPointerCapSettings.GetLightIntensity: integer;
+begin
+  Result := round(FPhong.LightSourceIntensity);
+end;
+
+procedure TSGPointerCapSettings.SetCurveExponent(const AValue: single);
+begin
+  if FCurveExponent = AValue then
+    Exit;
+
+  FCurveExponent := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetEdgeColor(AValue: TColor);
+begin
+  if FEdgeColor = AValue then
+    Exit;
+
+  FEdgeColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetEdgeThickness(AValue: integer);
+begin
+  if FEdgeThickness = AValue then
+    Exit;
+
+  FEdgeThickness := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetFillColor(AValue: TColor);
+begin
+  if FFillColor = AValue then
+    Exit;
+
+  FFillColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerCapSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  // no dirty needed possibly, call directly
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGPointerCapSettings.SetRadius(AValue: integer);
+begin
+  if FRadius = AValue then
+    Exit;
+
+  FRadius := AValue;
+  DirtyOnChange;
+end;
+
+constructor TSGPointerCapSettings.Create;
+begin
+  // create a phong shader, will need to delete on clean up
+
+  FPhong := TPhongShading.Create;
+
+  FPhong.LightPositionZ := 100;
+  FPhong.LightSourceIntensity := 300;
+  FPhong.NegativeDiffusionFactor := 0.8;
+  FPhong.AmbientFactor := 0.5;
+  FPhong.DiffusionFactor := 0.6;
+  FCurveExponent := 0.05;
+  FCapStyle := csPhong;
+  FCapPosition := cpUnder;
+  FEdgeColor := clGray;
+  FFillColor := clBlack;
+  FRadius := 20;
+  FEdgeThickness := 2;
+  FDirty := True;
+end;
+
+destructor TSGPointerCapSettings.Destroy;
+begin
+  FPhong.Free;
+  inherited Destroy;
+end;
+
+procedure TSGPointerCapSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here some props must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGPointerSettings }
+
+procedure TSGPointerSettings.SetColor(AValue: TColor);
+begin
+  if FColor = AValue then
+    Exit;
+
+  FColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerSettings.SetLength(AValue: integer);
+begin
+  if FLength = AValue then
+    Exit;
+
+  FLength := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGPointerSettings.SetThickness(AValue: integer);
+begin
+  if FThickness = AValue then
+    Exit;
+
+  FThickness := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerSettings.SetStyle(AValue: TSGPointerStyle);
+begin
+  if FStyle = AValue then
+    Exit;
+
+  FStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGPointerSettings.SetExtensionLength(AValue: integer);
+begin
+  if FExtensionLength = AValue then
+    Exit;
+
+  FExtensionLength := AValue;
+  DirtyOnChange;
+end;
+
+constructor TSGPointerSettings.Create;
+begin
+  FColor := BGRA(255, 127, 63); // Orange pointer
+  FLength := 160;
+  FThickness := 5;
+  FExtensionLength := 20;
+  FStyle := psLineExt;
+  FDirty := True;
+end;
+
+procedure TSGPointerSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here a prop must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+destructor TSGPointerSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+{ TSGScaleSettings }
+
+constructor TSGScaleSettings.Create;
+begin
+  FTickColor := BGRA(223, 196, 125);  // Tan
+  FTextColor := BGRA(140, 208, 211);  // Light Blue
+  FTextFont := 'Calibri';
+  FTextSize := 20;
+  FTextRadius := 120;
+  FEnableMainTicks := True;
+  FEnableSubTicks := True;
+  FEnableScaleText := True;
+  FReverseScale := False;
+  FMainTickCount := 10;
+  FSubTickCount := 5;
+  FStart := 0;
+  FStep := 1;
+  FLengthMainTick := 15;
+  FLengthSubTick := 8;
+  FThicknessMainTick := 3;
+  FThicknessSubTick := 1;
+  FTickArcStyle := taOuter;
+  FScaleRadius := 155;
+  FDirty := True;
+end;
+
+destructor TSGScaleSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGScaleSettings.SetTextFont(AValue: string);
+begin
+  if FTextFont = AValue then
+    Exit;
+  FTextFont := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetEnableScaleText(AValue: boolean);
+begin
+  if FEnableScaleText = AValue then
+    Exit;
+  FEnableScaleText := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetReverseScale(AValue: boolean);
+begin
+  if FReverseScale = AValue then
+    Exit;
+  FReverseScale := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetScaleRadius(AValue: integer);
+begin
+  if (FScaleRadius = AValue) or (AValue < 1) then
+    Exit;
+
+  FScaleRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetMaximum(AValue: integer);
+begin
+  if (FMaximum = AValue) or (AValue <= FMinimum) then
+    Exit;
+
+  FMaximum := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetStart(AValue: integer);
+begin
+  if (FStart = AValue)then
+    Exit;
+
+  FStart := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetStep(AValue: integer);
+begin
+  if (FStep = AValue)then
+    Exit;
+
+  FStep := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetMinimum(AValue: integer);
+begin
+  if (FMinimum = AValue) then
+    Exit;
+
+  FMinimum := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTextRadius(AValue: integer);
+begin
+  if (FTextRadius = AValue) or (AValue < 1) then
+    Exit;
+
+  FTextRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTextSize(AValue: integer);
+begin
+  if (FTextSize = AValue) or (AValue < 1) then
+    Exit;
+
+  FTextSize := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTickColor(AValue: TColor);
+begin
+  if FTickColor = AValue then
+    Exit;
+
+  FTickColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTickArcStyle(AValue: TSGTickArc);
+begin
+  if FTickArcStyle = AValue then
+     exit;
+
+  FTickArcStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetEnableMainTicks(AValue: boolean);
+begin
+  if FEnableMainTicks = AValue then
+    Exit;
+
+  FEnableMainTicks := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetEnableSubTicks(AValue: boolean);
+begin
+  if FEnableSubTicks = AValue then
+    Exit;
+
+  FEnableSubTicks := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetLengthMainTick(AValue: integer);
+begin
+  if (FLengthMainTick = AValue) or (AValue < 1) then
+    Exit;
+
+  FLengthMainTick := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetLengthSubTick(AValue: integer);
+begin
+  if (FLengthSubTick = AValue) or (AValue < 1) then
+    Exit;
+
+  FLengthSubTick := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetMainTickCount(AValue: integer);
+begin
+  if (FMainTickCount = AValue) or (AValue < 1) then
+    Exit;
+
+  FMainTickCount := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGScaleSettings.SetSubTickCount(AValue: integer);
+begin
+  if (FSubTickCount = AValue) or (AValue < 1) then
+    Exit;
+
+  FSubTickCount := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTextColor(AValue: TColor);
+begin
+  if FTextColor = AValue then
+    Exit;
+
+  FTextColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetTextStyle(AValue: TFontStyles);
+begin
+  if FTextStyle = AValue then
+    Exit;
+
+  FTextStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetThicknessMainTick(AValue: integer);
+begin
+  if (FThicknessMainTick = AValue) or (AValue < 1) then
+    Exit;
+
+  FThicknessMainTick := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.SetThicknessSubTick(AValue: integer);
+begin
+  if (FThicknessSubTick = AValue) or (AValue < 1)  then
+    Exit;
+
+  FThicknessSubTick := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGScaleSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here a prop must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGBandSettings}
+
+constructor TSGBandSettings.Create;
+begin
+  FEnabled := False;
+  FEnableText := False;
+  FText := '';
+  FTextColor := clBlack;
+  FTextFont := 'default';
+  FTextStyle := [];
+  FTextSize := 20;
+  FTextRadius := 100;
+  FStartValue := 0;
+  FEndValue := 20;
+  FBandRadius := 100;
+  FBandColor := clGreen;
+  FBandThickness := 40;
+  FStartValue := 0;
+  FEndValue := 100;
+
+  FDirty := True;
+end;
+
+destructor TSGBandSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGBandSettings.SetEnabled(AValue: boolean);
+begin
+  if FEnabled = AValue then
+    Exit;
+
+  FEnabled := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetTextFont(AValue: string);
+begin
+  if FTextFont = AValue then
+    Exit;
+
+  FTextFont := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetTextStyle(AValue: TFontStyles);
+begin
+  if FTextStyle = AValue then
+    Exit;
+
+  FTextStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetEnableText(AValue: boolean);
+begin
+  if FEnableText = AValue then
+    Exit;
+
+  FEnableText := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetText(AValue: TCaption);
+begin
+  if FText = AValue then
+    Exit;
+
+  FText := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetTextRadius(AValue: integer);
+begin
+  if (FTextRadius = AValue) or (AValue < 1) then
+    Exit;
+
+  FTextRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetBandRadius(AValue: integer);
+begin
+  if (FBandRadius = AValue) or (AValue < 1) then
+    Exit;
+
+  FBandRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetStartValue(AValue: single);
+begin
+  if (FStartValue = AValue) or (AValue >= FEndValue) then
+    Exit;
+
+  FStartValue := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetEndValue(AValue: single);
+begin
+  if (FEndValue = AValue) or (AValue <= FStartValue) then
+    Exit;
+
+  FEndValue := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetTextSize(AValue: integer);
+begin
+  if (FTextSize = AValue) or (AValue < 1) then
+    Exit;
+
+  FTextSize := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGBandSettings.SetTextColor(AValue: TColor);
+begin
+  if FTextColor = AValue then
+    Exit;
+
+  FTextColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetBandColor(AValue: TColor);
+begin
+  if FBandColor = AValue then
+    Exit;
+
+  FBandColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.SetBandThickness(AValue: integer);
+begin
+  if (FBandThickness = AValue) or (AValue < 1) then
+    Exit;
+
+  FBandThickness := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGBandSettings.DirtyOnChange;
+begin
+  FDirty := True;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGFaceSettings }
+
+constructor TSGFaceSettings.Create;
+begin
+  FOuterColor := clBlack;
+  FInnerColor := clGray;
+  FFillStyle := fsGradient;
+  FPicture := TPicture.Create;
+  FPictureEnabled := FALSE;
+  FPictureOffsetX := 0;
+  FPictureOffsetY := 0;
+
+  FDirty := True;
+end;
+
+destructor TSGFaceSettings.Destroy;
+begin
+  FPicture.Free;
+  inherited Destroy;
+end;
+
+procedure TSGFaceSettings.SetInnerColor(AValue: TColor);
+begin
+  if FInnerColor = AValue then
+    Exit;
+
+  FInnerColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetOuterColor(AValue: TColor);
+begin
+  if FOuterColor = AValue then
+    Exit;
+
+  FOuterColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetFillStyle(AValue: TSGFillStyle);
+begin
+  if FFillStyle = AValue then
+    Exit;
+
+  FFillStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetPicture(AValue: TPicture);
+begin
+  if FPicture = AValue then
+    Exit;
+
+  FPicture := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetPictureEnabled(AValue: boolean);
+begin
+
+  if FPictureEnabled = AValue then
+    Exit;
+
+  FPictureEnabled := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetPictureOffsetX(AValue: integer);
+begin
+  if FPictureOffsetX = AValue then
+    Exit;
+
+  FPictureOffsetX := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetPictureOffsetY(AValue: integer);
+begin
+  if FPictureOffsetY = AValue then
+    Exit;
+
+  FPictureOffsetY := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFaceSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGFaceSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here a prop must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGFrameSettings }
+
+constructor TSGFrameSettings.Create;
+begin
+  FFrameColor := clBlack;
+  FBorderColor := clGray;
+  FBorderRadius := 2;
+  FDirty := True;
+end;
+
+destructor TSGFrameSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGFrameSettings.SetBorderRadius(AValue: integer);
+begin
+  if (FBorderRadius = AValue) or (AValue < 0) then
+    Exit;
+
+  FBorderRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFrameSettings.SetFrameColor(AValue: TColor);
+begin
+  if FFrameColor = AValue then
+    Exit;
+
+  FFrameColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFrameSettings.SetBorderColor(AValue: TColor);
+begin
+  if FBorderColor = AValue then
+    Exit;
+
+  FBorderColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGFrameSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGFrameSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here a prop must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGLEDSettings }
+
+constructor TSGLEDSettings.Create;
+begin
+  FActiveColor := clRed;
+  FInActiveColor := clBlack;
+  FBorderColor := clGray;
+  FSize := 10;
+  FOffsetX := 0;
+  FOffsetY := 50;
+  FStyle := lsShaded;
+
+  FDirty := True;
+end;
+
+destructor TSGLEDSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGLEDSettings.SetActive(AValue: boolean);
+begin
+  if FActive = AValue then
+    Exit;
+
+  FActive := AValue;
+  DirtyOnChange;
+end;
+
+// HACK, need to have a way to NOT dirty on change
+
+procedure TSGLEDSettings.SetActiveNoDoChange(AValue: boolean);
+begin
+  if FActive = AValue then
+    Exit;
+
+  FActive := AValue;
+end;
+
+procedure TSGLEDSettings.SetActiveColor(AValue: TColor);
+begin
+  if FActiveColor = AValue then
+    Exit;
+
+  FActiveColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetInactiveColor(AValue: TColor);
+begin
+  if FInactiveColor = AValue then
+    Exit;
+
+  FInActiveColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetBorderColor(AValue: TColor);
+begin
+  if FBorderColor = AValue then
+    Exit;
+
+  FBorderColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetSize(AValue: integer);
+begin
+  if FSize = AValue then
+    Exit;
+
+  FSize := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetOffsetX(AValue: integer);
+begin
+  if FOffsetX = AValue then
+    Exit;
+
+  FOffsetX := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetOffsetY(AValue: integer);
+begin
+  if FOffsetY = AValue then
+    Exit;
+
+  FOffsetY := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetStyle(AValue: TSGLEDStyle);
+begin
+  if FStyle = AValue then
+    Exit;
+
+  FStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetShape(AValue: TSGLEDShape);
+begin
+  if FShape = AValue then
+    Exit;
+
+  FShape := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGLEDSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  // this will not dirty it, may need to not sure
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGLEDSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here a prop must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+{ TSGRangeCheckLEDSettings }
+
+constructor TSGRangeCheckLEDSettings.Create;
+begin
+  inherited Create;
+
+  FRangeStartValue := 0;
+  FRangeEndValue := 100;
+  FRangeType := rcNone;
+  FOffsetX := 90;
+  FOffsetY := 120;
+end;
+
+destructor TSGRangeCheckLEDSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGRangeCheckLEDSettings.SetRangeStartValue(AValue: single);
+begin
+  if (FRangeStartValue = AValue) or (AValue > FRangeEndValue) then
+    Exit;
+
+  FRangeStartValue := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGRangeCheckLEDSettings.SetRangeEndValue(AValue: single);
+begin
+  if (FRangeEndValue = AValue) or (AValue < FRangeStartValue) then
+    Exit;
+
+  FRangeEndValue := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGRangeCheckLEDSettings.SetRangeType(AValue: TSGRangeCheckType);
+begin
+  if FRangeType = AValue then
+    Exit;
+
+  FRangeType := AValue;
+  DirtyOnChange;
+end;
+
+{ TSGTextSettings }
+
+constructor TSGTextSettings.Create;
+begin
+  FText := 'Gauge';
+  OffsetX := 0;
+  OffsetY := 50; // default should be clear of default cap radius when it's drawn
+  FDirty := True;
+
+  // create font, must free in dtor
+
+  FFontEx := TBCFont.Create(nil);
+  FFontEx.Color := clWhite;
+  FFontEx.Style := [fsBold];
+  FFontEx.Height := 24;
+end;
+
+destructor TSGTextSettings.Destroy;
+begin
+  FFontEx.Free;
+
+  inherited Destroy;
+end;
+
+procedure TSGTextSettings.SetEnabled(AValue: boolean);
+begin
+  if FEnabled = AValue then
+    Exit;
+
+  FEnabled := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGTextSettings.SetText(AValue: TCaption);
+begin
+  if FText = AValue then
+    Exit;
+
+  FText := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGTextSettings.SetOffsetX(AValue: integer);
+begin
+  if FOffsetX = AValue then
+    Exit;
+
+  FOffsetX := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGTextSettings.SetOffsetY(AValue: integer);
+begin
+  if FOffsetY = AValue then
+    Exit;
+
+  FOffsetY := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGTextSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  // this will not dirty it, may need to not sure
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGTextSettings.DirtyOnChange;
+begin
+  FDirty := True;
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGTextSettings.SetFontEx(AValue: TBCFont);
+begin
+  FFontEx.Assign(AValue);
+  FDirty := True;
+  DirtyOnChange;
+end;
+
+{TSGMarkerSettings}
+
+constructor TSGMarkerSettings.Create;
+begin
+  FEnabled := False;
+  FColor := clLime;
+  FHeight := 20;
+  FWidth := 10;
+  FRadius := 165;
+  FStyle := msCenter;
+  FDirty := True;
+  FValue := 0.0;
+end;
+
+destructor TSGMarkerSettings.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSGMarkerSettings.SetValue(AValue: single);
+begin
+  if FValue = AValue then
+    Exit;
+
+  FValue := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetEnabled(AValue: boolean);
+begin
+  if FEnabled = AValue then
+    Exit;
+
+  FEnabled := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetColor(AValue: TColor);
+begin
+  if FColor = AValue then
+    Exit;
+
+  FColor := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetHeight(AValue: integer);
+begin
+  if FHeight = AValue then
+    Exit;
+
+  FHeight := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetRadius(AValue: integer);
+begin
+  if FRadius = AValue then
+    Exit;
+
+  FRadius := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetWidth(AValue: integer);
+begin
+  if FWidth = AValue then
+    Exit;
+
+  FWidth := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.SetOnChange(AValue: TNotifyEvent);
+begin
+  FOnChange := AValue;
+
+  // no dirty needed possibly, call directly
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TSGMarkerSettings.SetStyle(AValue: TSGMarkerStyle);
+begin
+  if FStyle = AValue then
+    Exit;
+
+  FStyle := AValue;
+  DirtyOnChange;
+end;
+
+procedure TSGMarkerSettings.DirtyOnChange;
+begin
+  FDirty := True;   // if we get here some props must have changed, mark dirty
+
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+end.

+ 324 - 0
test/test_supergauge/about.lfm

@@ -0,0 +1,324 @@
+object AboutFrm: TAboutFrm
+  Left = 1927
+  Height = 653
+  Top = 212
+  Width = 615
+  BorderStyle = bsSingle
+  Caption = 'About Super Gauge'
+  ClientHeight = 653
+  ClientWidth = 615
+  DesignTimePPI = 144
+  FormStyle = fsStayOnTop
+  Icon.Data = {
+    9E09000000000100010018180000010020008809000016000000280000001800
+    0000300000000100200000000000000900006400000064000000000000000000
+    0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F2F2
+    F2FF7B7B7BFF393939FF101010FF090909FF090909FF101010FF323232FF7373
+    73FFDEDEDEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF737373FF0909
+    09FF282828FF535353FF6C6C6CFF7B7B7BFF7B7B7BFF6C6C6CFF5A5A5AFF3232
+    32FF090909FF535353FFE7E7E7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F2F2F2FF323232FF212121FF6C6C
+    6CFF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
+    84FF7B7B7BFF424242FF101010FFADADADFFFFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF323232FF323232FF7B7B7BFFA4A4
+    A4FFCECECEFFD6D6D6FFD6D6D6FF959595FF8B8B8BFFD6D6D6FFDEDEDEFFCECE
+    CEFFC4C4C4FF848484FF646464FF101010FFADADADFFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00737373FF212121FF7B7B7BFF848484FFB4B4
+    B4FFB4B4B4FF848484FFCECECEFFCECECEFFD6D6D6FFCECECEFF848484FFB4B4
+    B4FFDEDEDEFF848484FF848484FF6C6C6CFF101010FFCECECEFFFFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00F2F2F2FF090909FF6C6C6CFF848484FF848484FF8B8B
+    8BFFDEDEDEFFFFFFFFFFF7F7F7FFA4A4A4FFF2F2F2FFADADADFF848484FFCECE
+    CEFFCECECEFF9E9E9EFF848484FF848484FF5A5A5AFF323232FFFFFFFFFFFFFF
+    FF00FFFFFF00FFFFFF00848484FF282828FF848484FF848484FF848484FFADAD
+    ADFFE7E7E7FF959595FF9E9E9EFFADADADFFD6D6D6FFCECECEFF848484FF9595
+    95FFCECECEFF848484FF848484FF848484FF848484FF282828FFBBBBBBFFFFFF
+    FF00FFFFFF00FFFFFF00323232FF535353FF848484FF848484FF848484FF8B8B
+    8BFFDEDEDEFFCECECEFFDEDEDEFFB4B4B4FF8B8B8BFFDEDEDEFFDEDEDEFFD6D6
+    D6FFCECECEFF848484FF848484FF848484FF848484FF646464FF646464FFFFFF
+    FF00FFFFFF00FFFFFF00101010FF6C6C6CFF848484FF848484FF848484FF8484
+    84FF848484FF848484FF848484FF737373FF6C6C6CFF848484FF848484FF8484
+    84FF848484FF848484FF6B6B95FF6978A7FF809393FF7B7B7BFF282828FFFFFF
+    FF00FFFFFF00FFFFFF00090909FF7C9E9EFF809B9BFF848484FF848484FF8484
+    84FF848484FF848484FF737373FF737373FF6C6C6CFF737373FF848484FF8484
+    84FF848484FF848484FF4C4CB4FF6287C3FF80A5A5FF7B7B7BFF090909FFFFFF
+    FF00FFFFFF00FFFFFF00090909FF7C9E9EFF80B5B5FF848484FF848484FF8484
+    84FF848484FF848484FF8B8B8BFF5B81B6FF4F75A9FF7B7B7BFF848484FF8484
+    84FF848484FF848484FF3131CEFF77B5C6FF809393FF7B7B7BFF090909FFFFFF
+    FF00FFFFFF00FFFFFF00101010FF728282FF7FC6C7FF848484FF848484FF8484
+    84FF848484FF848484FF848484FF5B81B6FF4D76AFFF848484FF848484FF8484
+    84FF848484FF7A7A86FF2929D6FF7FD6D7FF848484FF7B7B7BFF282828FFFFFF
+    FF00FFFFFF00FFFFFF00323232FF5A5A5AFF7FDCDCFF848484FF848484FF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF848484FF8484
+    84FF848484FF3939C6FF637AB4FF7FBFBFFF848484FF6C6C6CFF5A5A5AFFFFFF
+    FF00FFFFFF00FFFFFF00737373FF323232FF80AFAFFF80B5B5FF848484FF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF848484FF8484
+    84FF4F4FB0FF3E41C4FF7FDCDCFF848484FF848484FF323232FFB4B4B4FFFFFF
+    FF00FFFFFF00FFFFFF00DEDEDEFF090909FF7B7B7BFF7FD6D7FF809B9BFF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF70708FFF3131
+    CEFF3E41C4FF7FD6D7FF809B9BFF848484FF737373FF212121FFF7F7F7FFFFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00535353FF424242FF848484FF7ECDD0FF80BD
+    BDFF848484FF848484FF848484FF4777B9FF2A5AD5FF2929D6FF3131CEFF6C8F
+    B8FF7FDCDCFF809393FF848484FF7B7B7BFF282828FFA4A4A4FFFFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00E7E7E7FF101010FF646464FF848484FF80A5
+    A5FF7FD6D7FF7FD1D2FF80BDBDFF4792D4FF3F8CDDFF7ECDD0FF7FD6D7FF80B5
+    B5FF848484FF848484FF848484FF424242FF5A5A5AFFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B4B4B4FF101010FF6C6C6CFF8484
+    84FF848484FF848484FF809B9BFF4789CCFF4786C9FF808989FF848484FF8484
+    84FF848484FF7B7B7BFF424242FF393939FFF7F7F7FFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ADADADFF101010FF5A5A
+    5AFF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
+    84FF6C6C6CFF282828FF535353FFF7F7F7FFFFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CECECEFF3232
+    32FF282828FF646464FF7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF6C6C6CFF3939
+    39FF212121FFA4A4A4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FFFFB4B4B4FF646464FF282828FF101010FF101010FF282828FF5A5A5AFFADAD
+    ADFFF7F7F7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000
+  }
+  OnCreate = FormCreate
+  Position = poMainFormCenter
+  LCLVersion = '3.6.0.0'
+  object Panel1: TPanel
+    Left = 0
+    Height = 53
+    Top = 600
+    Width = 615
+    Align = alBottom
+    ClientHeight = 53
+    ClientWidth = 615
+    TabOrder = 1
+    object CloseBtn: TBitBtn
+      Left = 480
+      Height = 45
+      Top = 3
+      Width = 113
+      Caption = 'Close'
+      Images = SGTestFrm.ImageList1
+      ImageIndex = 6
+      OnClick = CloseBtnClick
+      TabOrder = 0
+    end
+  end
+  object SGVersionLbl: TLabel
+    Left = 16
+    Height = 45
+    Top = 208
+    Width = 185
+    Caption = 'SGVersionLbl'
+    Font.CharSet = ANSI_CHARSET
+    Font.Height = -32
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    ParentFont = False
+  end
+  object NameLbl: TLabel
+    Left = 16
+    Height = 54
+    Top = 64
+    Width = 524
+    Caption = 'Super Gauge Test Program'
+    Font.CharSet = ANSI_CHARSET
+    Font.Height = -40
+    Font.Name = 'Segoe UI Black'
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object NameLbl1: TLabel
+    Left = 16
+    Height = 54
+    Top = 160
+    Width = 407
+    Caption = 'Super Gauge Version'
+    Font.CharSet = ANSI_CHARSET
+    Font.Height = -40
+    Font.Name = 'Segoe UI Black'
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object SGTestVersionLbl: TLabel
+    Left = 16
+    Height = 45
+    Top = 112
+    Width = 241
+    Caption = 'SGTestVersionLbl'
+    Font.CharSet = ANSI_CHARSET
+    Font.Height = -32
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    ParentFont = False
+  end
+  object Memo1: TMemo
+    Left = 0
+    Height = 280
+    Top = 320
+    Width = 615
+    Align = alBottom
+    Lines.Strings = (
+      'Super Gage About (Keep Scrolling)'
+      ''
+      'This started out as the BGRAThemedGauge/Analog guage.'
+      ''
+      'Credit to the original author for getting this going. '
+      ''
+      'This gauge is NOT drop in compatible, but has many of the'
+      'original features.'
+      ''
+      'A few fixes in code (And I''m suire I added some bugs!) but'
+      'many enhancements to the gauge to make is more useable.'
+      ''
+      'Some notable features of SG'
+      ''
+      '* 5x Faster drawing and caching of non-changing layers'
+      '* All propterties will update in design time (or should!!)'
+      '* More options on drawing and shading overall'
+      '* Images'
+      '* Seperations of Min/Max gauge values and scale drawing'
+      '* Support for ANY range of gauge values and scale'
+      '* Multiple Inner Bands with Text, range and color'
+      '* Several Pointer styles including arc style'
+      '* Multiple Text'
+      '* Range Led with many triggers and call backs'
+      '* Overall Gauge Overange callbacks'
+      '* Scale markers for use as desired'
+      '* AND THIS TEST PROGRAM'
+      ''
+      '-- TEST PROGRAM OPERATION --'
+      'Try each tab, most all of the gauge properties can be'
+      'changes while operational. The code for this test program'
+      'is a lot of cut and past, so feel free to clean as you see fit.'
+      ''
+      'Sizing of the gauge is not totally dynamic, you must resize '
+      'some elements to make fit. Their is an experimental autosize'
+      'options, but it''s not well implemented. '
+      ''
+      'Again, play with the settings!'
+      ''
+      'Twisting the knob will show a lot of operational aspects '
+      'of the gauge, including overr ange and under range.'
+      ''
+      'Looing at the code also will give some clues on whats'
+      'going on, for example the peak and hold markers which'
+      'the this program does the work.'
+      ''
+      '-- TO DO''s (Feel Free to do them and submit) --'
+      '* Code cleaning, always in need from an expert'
+      '* Break out some components so can be used alone like a SGPointer Object'
+      '* User Scale settings for things like LOG scales'
+      '* Possibly auto peak and hold markers in gauge'
+      '* More variety of Pointers, like an Arrow Head type'
+      '* Linux Testing (ARM and x86)'
+    )
+    ReadOnly = True
+    ScrollBars = ssBoth
+    TabOrder = 0
+    TabStop = False
+  end
+  object Image1: TImage
+    Left = 16
+    Height = 50
+    Top = 22
+    Width = 54
+    Picture.Data = {
+      1754506F727461626C654E6574776F726B477261706869638708000089504E47
+      0D0A1A0A0000000D494844520000003000000030080300000060DC09B5000003
+      00504C5445FFFFFFFFFFFF8080800000006A6A6A7D7D7DF7F7F7757575FF6B00
+      DEDEDE383838111111CECECE161616292929FEFD7F535353C6C6C6D6D6D64B4B
+      4B9D9D9D080808BFBFBFF7F77FADADADD6D67FF0EF7FE7E77FFE02028B8B8093
+      93802E2E2EB4B480B5B5B5DFDE7FA3A3A3E8E8E8959595CCCC7FF80707A4A480
+      656565B64A4AACAC80252525877A7A9D63638A8A8AC93636BCBC809C9C80D42B
+      2BC4C47FEFEFEFE01F1FA45B5BBA4646D03030AF5151908D7FE41C1CC0C07F8C
+      73733F3F3FDB8E56D2D17F93917F8F877CD2834ABA6C34575757F10E0E8C7876
+      907070897B79BA6E366A007032003B2A002E6A003263003B2A002E6A00326B00
+      3B2A002E6A007078003B2A002E6A007066002920000050004446002C20005044
+      00462F00582000282A002E700064660029200000570065620073690074650020
+      28004854004D4C00292000282A002E6800746D003B2A002E6800746D006C2900
+      2000004D69006372006F73006F6600742000576F007264002028002A2E00646F
+      006378003B2A002E64006F6300292000004D00696300726F00736F0066740020
+      50006F7700657200506F00696E00742000282A002E7000707400783B002A2E00
+      707000743B002A2E00706F007478003B2A002E70006F7400292000004D006963
+      00726F00736F006674002058005053002028002A2E0078700073290020000052
+      6900636800205400657800742000466F00726D00617400202800525400462900
+      2028002A2E00727400662900200000454D00462F00574D00462000284E006577
+      00292000282A002E65006D66003B2A002E77006D66002920000053006361006C
+      6100626C006520005665006374006F7200204700726100706800696300732000
+      282A002E73007667003B2A002E73007667007A29002000004164006F62006520
+      00496C006C7500737400726100746F00722000282A002E6100693B002A2E0065
+      7000732900200000434D005820003620002D2D00203300322000626900742000
+      282A002E63006D78002920000000000000000000000000000000000000000000
+      00000000002669B8BF0000000174524E530040E6D86600000009704859730000
+      1D8700001D87018FE5F1650000052049444154488962200930303000000000FF
+      FF220D33303000000000FFFF220D33303000000000FFFFC2C46C62AC027CBCCC
+      CCBC7C02AC626CA8F20C0C0C00000000FFFF42C73C2CDCCC48809B8507590503
+      0303000000FFFF42C53CC2CCCCCCBC5C022CECACACEC2C025CBCCCCCCCC2485A
+      18181800000000FFFF42C66CECCCCCA25C2C4C4880854B9499991DEE30060606
+      00000000FFFF42C29CF2CCCC5CECC8CA41809D8B99599E13AA84818101000000
+      FFFF4260416E666E84E91C1C70260B3733B720440D030303000000FFFF82631E
+      51663E56880A230543130E0E052359A80E563E6651884718181800000000FFFF
+      82614E6E6679B07A0D49717E7129690E0E717E7E6943881E5679666EB0AB1818
+      1800000000FFFF82F9978F5907A45E5B8A5F49410EEC2473670D35717E471087
+      895587990FE47306060600000000FFFF826216666E56262659257E35B0029006
+      1919332D2F6D297E43B00E6E661606060606060600000000FFFF826021666616
+      26263929292384A7EDAC8CD5D50D3C0CF99540EE626166166260606060000000
+      00FFFF826061662E2626397125446882434957CB5DDDCA484A1AA4838B599881
+      81818101000000FFFF828410B3283B1393B43452F0438355D740C6C05A0A24C1
+      2ECACCC3C0C0C000000000FFFF82FA808B89C9441C168C28F1602E63E924AE06
+      B6828581818101000000FFFF02071137330B932CBF0272042322CE5CC6429B5F
+      03E40B6E3606060600000000FFFF02691063E66562329142491148316D21A327
+      0972142FB320030303000000FFFF02696005B9481C1C7CD834309999C981ACE0
+      626665606000000000FFFF82849100931C3F3402B068D093D153926462126016
+      66606000000000FFFF0269E063666152104751CFE4E0024D58206063ACC00FF2
+      041F030303000000FFFF0269E065666752430E532626116F5776840E2D756B7E
+      0D2676665E06060600000000FFFF026960666665929444D1C0AEA9C9AE09E779
+      CAE8892B30B1323333303000000000FFFF8269003912493DBBA6268B0082AFAE
+      A5A406D2C0C0C000000000FFFF823949411B5903AB1B0B8B3D52E6B331909404
+      3989818101000000FFFF82791A0DB00A082367564B63354990A7191818000000
+      00FFFF82052B7EA0ABCB240B0A5606060600000000FFFF82471C0C48A8303272
+      2A0A81589C6C8C9CCA9C2230192E665606060600000000FFFF82270D28906014
+      121111626463621264641454146264548649F1320B32303000000000FFFF8227
+      3E28E064049928C4C624C2C828C1C4C42406D7004A7C0C0C0C00000000FFFF42
+      246F08506134155366121163E201D9C2C4A4CF067312287933303000000000FF
+      FF42CA4060A0C8080242AA4C9C8C9C4C4CFA12121212102BC019888181010000
+      00FFFF42CAA2D044C1C3C6C8C8C8A60FD620620AD20DB5409881818181010000
+      00FFFF422E04C07E106462521563645416843889935110EA035021C0C0C00000
+      0000FFFF422966407E60536562623265545565645404FB09AC015ACC30303000
+      000000FFFF422BC89854D8D878C4C0CE516464E4E45161036B8015640C0C0C00
+      000000FFFF422F2A25542584388540663389F070720AEA2B8A2015950C0C0C00
+      000000FFFFC2561863242C7861CCC0C000000000FFFFC255DC2301A4E29E8181
+      01000000FFFF42C24454280C0C0C00000000FFFF42F139C12A8B818101000000
+      FFFF42F308814A91818101000000FFFFC2F03BDE6A97818101000000FFFFC2E2
+      303C153B030303000000FFFF220D33303000000000FFFF220D33303000000000
+      FFFF220D33303000000000FFFF0300606437DBB49D20A00000000049454E44AE
+      426082
+    }
+  end
+  object AuthorLbl: TLabel
+    Left = 72
+    Height = 32
+    Top = 264
+    Width = 429
+    Caption = 'Author : Sandy Ganz, [email protected]'
+    Font.CharSet = ANSI_CHARSET
+    Font.Height = -24
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    ParentFont = False
+  end
+end

+ 54 - 0
test/test_supergauge/about.pas

@@ -0,0 +1,54 @@
+unit about;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
+  Buttons, SuperGauge;
+
+type
+
+  { TAboutFrm }
+
+  TAboutFrm = class(TForm)
+    CloseBtn: TBitBtn;
+    Image1: TImage;
+    AuthorLbl: TLabel;
+    Memo1: TMemo;
+    NameLbl: TLabel;
+    NameLbl1: TLabel;
+    Panel1: TPanel;
+    SGVersionLbl: TLabel;
+    SGTestVersionLbl: TLabel;
+    procedure CloseBtnClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+  private
+
+  public
+
+  end;
+
+var
+  AboutFrm: TAboutFrm;
+
+implementation
+
+{$R *.lfm}
+
+{ TAboutFrm }
+
+procedure TAboutFrm.FormCreate(Sender: TObject);
+begin
+  SGTestVersionLbl.Caption := VERSIONSTR;
+  SGVersionLbl.Caption := SuperGauge.VERSIONSTR;
+end;
+
+procedure TAboutFrm.CloseBtnClick(Sender: TObject);
+begin
+  Close;
+end;
+
+end.
+

BIN
test/test_supergauge/project1.ico


+ 107 - 0
test/test_supergauge/project1.lpi

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="12"/>
+    <PathDelim Value="\"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <Title Value="project1"/>
+      <Scaled Value="True"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <XPManifest>
+        <DpiAware Value="True"/>
+      </XPManifest>
+      <Icon Value="0"/>
+    </General>
+    <BuildModes>
+      <Item Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <UseFileFilters Value="True"/>
+    </PublishOptions>
+    <RunParams>
+      <FormatVersion Value="2"/>
+    </RunParams>
+    <RequiredPackages>
+      <Item>
+        <PackageName Value="LazControls"/>
+      </Item>
+      <Item>
+        <PackageName Value="LazControlDsgn"/>
+      </Item>
+      <Item>
+        <PackageName Value="jujiboutils"/>
+      </Item>
+      <Item>
+        <PackageName Value="uEControls"/>
+      </Item>
+      <Item>
+        <PackageName Value="bgracontrols"/>
+      </Item>
+      <Item>
+        <PackageName Value="LCL"/>
+      </Item>
+    </RequiredPackages>
+    <Units>
+      <Unit>
+        <Filename Value="project1.lpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit>
+      <Unit>
+        <Filename Value="sgtest.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="SGTestFrm"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit>
+      <Unit>
+        <Filename Value="about.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="AboutFrm"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <PathDelim Value="\"/>
+    <Target>
+      <Filename Value="project1"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <CodeGeneration>
+      <Optimizations>
+        <OptimizationLevel Value="2"/>
+      </Optimizations>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <DebugInfoType Value="dsDwarf3"/>
+      </Debugging>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions>
+      <Item>
+        <Name Value="EAbort"/>
+      </Item>
+      <Item>
+        <Name Value="ECodetoolError"/>
+      </Item>
+      <Item>
+        <Name Value="EFOpenError"/>
+      </Item>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 26 - 0
test/test_supergauge/project1.lpr

@@ -0,0 +1,26 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}
+  cthreads,
+  {$ENDIF}
+  {$IFDEF HASAMIGA}
+  athreads,
+  {$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, lazcontrols, uecontrols, sgtest, about
+  { you can add units after this };
+
+{$R *.res}
+
+begin
+  RequireDerivedFormResource:=True;
+  Application.Scaled:=True;
+  Application.Initialize;
+  Application.CreateForm(TSGTestFrm, SGTestFrm);
+  Application.CreateForm(TAboutFrm, AboutFrm);
+  Application.Run;
+end.
+

+ 5443 - 0
test/test_supergauge/sgtest.lfm

@@ -0,0 +1,5443 @@
+object SGTestFrm: TSGTestFrm
+  Left = 585
+  Height = 851
+  Top = 206
+  Width = 1323
+  Caption = 'Super Gauge Test Application Test v0.0'
+  ClientHeight = 851
+  ClientWidth = 1323
+  DesignTimePPI = 144
+  Icon.Data = {
+    9E09000000000100010018180000010020008809000016000000280000001800
+    0000300000000100200000000000000900006400000064000000000000000000
+    0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F2F2
+    F2FF7B7B7BFF393939FF101010FF090909FF090909FF101010FF323232FF7373
+    73FFDEDEDEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF737373FF0909
+    09FF282828FF535353FF6C6C6CFF7B7B7BFF7B7B7BFF6C6C6CFF5A5A5AFF3232
+    32FF090909FF535353FFE7E7E7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F2F2F2FF323232FF212121FF6C6C
+    6CFF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
+    84FF7B7B7BFF424242FF101010FFADADADFFFFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF323232FF323232FF7B7B7BFFA4A4
+    A4FFCECECEFFD6D6D6FFD6D6D6FF959595FF8B8B8BFFD6D6D6FFDEDEDEFFCECE
+    CEFFC4C4C4FF848484FF646464FF101010FFADADADFFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00737373FF212121FF7B7B7BFF848484FFB4B4
+    B4FFB4B4B4FF848484FFCECECEFFCECECEFFD6D6D6FFCECECEFF848484FFB4B4
+    B4FFDEDEDEFF848484FF848484FF6C6C6CFF101010FFCECECEFFFFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00F2F2F2FF090909FF6C6C6CFF848484FF848484FF8B8B
+    8BFFDEDEDEFFFFFFFFFFF7F7F7FFA4A4A4FFF2F2F2FFADADADFF848484FFCECE
+    CEFFCECECEFF9E9E9EFF848484FF848484FF5A5A5AFF323232FFFFFFFFFFFFFF
+    FF00FFFFFF00FFFFFF00848484FF282828FF848484FF848484FF848484FFADAD
+    ADFFE7E7E7FF959595FF9E9E9EFFADADADFFD6D6D6FFCECECEFF848484FF9595
+    95FFCECECEFF848484FF848484FF848484FF848484FF282828FFBBBBBBFFFFFF
+    FF00FFFFFF00FFFFFF00323232FF535353FF848484FF848484FF848484FF8B8B
+    8BFFDEDEDEFFCECECEFFDEDEDEFFB4B4B4FF8B8B8BFFDEDEDEFFDEDEDEFFD6D6
+    D6FFCECECEFF848484FF848484FF848484FF848484FF646464FF646464FFFFFF
+    FF00FFFFFF00FFFFFF00101010FF6C6C6CFF848484FF848484FF848484FF8484
+    84FF848484FF848484FF848484FF737373FF6C6C6CFF848484FF848484FF8484
+    84FF848484FF848484FF6B6B95FF6978A7FF809393FF7B7B7BFF282828FFFFFF
+    FF00FFFFFF00FFFFFF00090909FF7C9E9EFF809B9BFF848484FF848484FF8484
+    84FF848484FF848484FF737373FF737373FF6C6C6CFF737373FF848484FF8484
+    84FF848484FF848484FF4C4CB4FF6287C3FF80A5A5FF7B7B7BFF090909FFFFFF
+    FF00FFFFFF00FFFFFF00090909FF7C9E9EFF80B5B5FF848484FF848484FF8484
+    84FF848484FF848484FF8B8B8BFF5B81B6FF4F75A9FF7B7B7BFF848484FF8484
+    84FF848484FF848484FF3131CEFF77B5C6FF809393FF7B7B7BFF090909FFFFFF
+    FF00FFFFFF00FFFFFF00101010FF728282FF7FC6C7FF848484FF848484FF8484
+    84FF848484FF848484FF848484FF5B81B6FF4D76AFFF848484FF848484FF8484
+    84FF848484FF7A7A86FF2929D6FF7FD6D7FF848484FF7B7B7BFF282828FFFFFF
+    FF00FFFFFF00FFFFFF00323232FF5A5A5AFF7FDCDCFF848484FF848484FF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF848484FF8484
+    84FF848484FF3939C6FF637AB4FF7FBFBFFF848484FF6C6C6CFF5A5A5AFFFFFF
+    FF00FFFFFF00FFFFFF00737373FF323232FF80AFAFFF80B5B5FF848484FF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF848484FF8484
+    84FF4F4FB0FF3E41C4FF7FDCDCFF848484FF848484FF323232FFB4B4B4FFFFFF
+    FF00FFFFFF00FFFFFF00DEDEDEFF090909FF7B7B7BFF7FD6D7FF809B9BFF8484
+    84FF848484FF848484FF848484FF4777B9FF4777B9FF848484FF70708FFF3131
+    CEFF3E41C4FF7FD6D7FF809B9BFF848484FF737373FF212121FFF7F7F7FFFFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00535353FF424242FF848484FF7ECDD0FF80BD
+    BDFF848484FF848484FF848484FF4777B9FF2A5AD5FF2929D6FF3131CEFF6C8F
+    B8FF7FDCDCFF809393FF848484FF7B7B7BFF282828FFA4A4A4FFFFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00E7E7E7FF101010FF646464FF848484FF80A5
+    A5FF7FD6D7FF7FD1D2FF80BDBDFF4792D4FF3F8CDDFF7ECDD0FF7FD6D7FF80B5
+    B5FF848484FF848484FF848484FF424242FF5A5A5AFFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B4B4B4FF101010FF6C6C6CFF8484
+    84FF848484FF848484FF809B9BFF4789CCFF4786C9FF808989FF848484FF8484
+    84FF848484FF7B7B7BFF424242FF393939FFF7F7F7FFFFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ADADADFF101010FF5A5A
+    5AFF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
+    84FF6C6C6CFF282828FF535353FFF7F7F7FFFFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CECECEFF3232
+    32FF282828FF646464FF7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF6C6C6CFF3939
+    39FF212121FFA4A4A4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FFFFB4B4B4FF646464FF282828FF101010FF101010FF282828FF5A5A5AFFADAD
+    ADFFF7F7F7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000
+  }
+  Menu = MainMenu1
+  OnCreate = FormCreate
+  LCLVersion = '3.6.0.0'
+  object GaugeTs: TPageControl
+    Left = 561
+    Height = 851
+    Top = 0
+    Width = 762
+    ActivePage = BasicTab
+    Align = alRight
+    HotTrack = True
+    TabIndex = 0
+    TabOrder = 0
+    object BasicTab: TTabSheet
+      Caption = 'Basic'
+      ClientHeight = 813
+      ClientWidth = 754
+      object GroupBox1: TGroupBox
+        Left = 8
+        Height = 232
+        Top = 16
+        Width = 248
+        Caption = 'Size'
+        ClientHeight = 202
+        ClientWidth = 244
+        TabOrder = 0
+        object WidthAddBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Increase Width'
+          Top = 40
+          Width = 113
+          Caption = 'Width'
+          Images = ImageList1
+          ImageIndex = 0
+          OnClick = WidthAddBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+        end
+        object WidthSubBtn: TBitBtn
+          Left = 128
+          Height = 45
+          Hint = 'Decrease Width'
+          Top = 40
+          Width = 113
+          Caption = 'Width'
+          Images = ImageList1
+          ImageIndex = 1
+          OnClick = WidthSubBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object HeightAddBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Increase Height'
+          Top = 88
+          Width = 113
+          Caption = 'Height'
+          Images = ImageList1
+          ImageIndex = 0
+          OnClick = HeightAddBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+        end
+        object HeightSubBtn: TBitBtn
+          Left = 128
+          Height = 45
+          Hint = 'Decrease Height'
+          Top = 88
+          Width = 113
+          Caption = 'Height'
+          Images = ImageList1
+          ImageIndex = 1
+          OnClick = HeightSubBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+        end
+        object ResetSizeBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Reset to Default'
+          Top = 152
+          Width = 232
+          Caption = 'Reset Size'
+          Images = ImageList1
+          ImageIndex = 7
+          OnClick = ResetSizeBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+        end
+        object WidthLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 0
+          Width = 62
+          Caption = 'Width : '
+        end
+        object WidthValLbl: TLabel
+          Left = 72
+          Height = 25
+          Top = 0
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object HeightLbl: TLabel
+          Left = 128
+          Height = 25
+          Top = 0
+          Width = 67
+          Caption = 'Height : '
+        end
+        object HeightValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 0
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+      end
+      object GroupBox2: TGroupBox
+        Left = 264
+        Height = 232
+        Top = 16
+        Width = 248
+        Caption = 'Position'
+        ClientHeight = 202
+        ClientWidth = 244
+        TabOrder = 1
+        object LeftAddBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Increase Left'
+          Top = 40
+          Width = 113
+          Caption = 'Left'
+          Images = ImageList1
+          ImageIndex = 0
+          OnClick = LeftAddBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+        end
+        object TopSubBtn: TBitBtn
+          Left = 120
+          Height = 45
+          Hint = 'Decrease Top'
+          Top = 88
+          Width = 113
+          Caption = 'Top'
+          Images = ImageList1
+          ImageIndex = 1
+          OnClick = TopSubBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object TopAddBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Increase Top'
+          Top = 88
+          Width = 113
+          Caption = 'Top'
+          Images = ImageList1
+          ImageIndex = 0
+          OnClick = TopAddBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+        end
+        object LeftSubBtn: TBitBtn
+          Left = 120
+          Height = 45
+          Hint = 'Decrease Left'
+          Top = 40
+          Width = 113
+          Caption = 'Left'
+          Images = ImageList1
+          ImageIndex = 1
+          OnClick = LeftSubBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+        end
+        object ResetPositionBtn: TBitBtn
+          Left = 8
+          Height = 45
+          Hint = 'Reset To Default'
+          Top = 152
+          Width = 232
+          Caption = 'Reset Position'
+          Images = ImageList1
+          ImageIndex = 7
+          OnClick = ResetPositionBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+        end
+        object LeftLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 0
+          Width = 43
+          Caption = 'Left : '
+        end
+        object LeftValLbl: TLabel
+          Left = 72
+          Height = 25
+          Top = 0
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object TopLbl: TLabel
+          Left = 128
+          Height = 25
+          Top = 0
+          Width = 43
+          Caption = 'Top : '
+        end
+        object TopValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 0
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+      end
+      object AutoScaleCb: TCheckBox
+        Left = 8
+        Height = 29
+        Hint = 'Enable Auto Scale'#13#10'NOTE :  Only a few items are currently'#13#10'set to react to the AutoScale property.'
+        Top = 432
+        Width = 225
+        Caption = 'Auto Scale (Experimental)'
+        TabOrder = 2
+        OnChange = AutoScaleCbChange
+      end
+      object MinValueSpe: TFloatSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Minimum Value for Gauge'
+        Top = 296
+        Width = 89
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+        OnChange = MinValueSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+      end
+      object MaxValueSpe: TFloatSpinEditEx
+        Left = 168
+        Height = 33
+        Hint = 'Maximum Value of the Gauge'
+        Top = 296
+        Width = 89
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+        OnChange = MaxValueSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+      end
+      object RangeLEDRangeStartLbl2: TLabel
+        Left = 8
+        Height = 25
+        Top = 272
+        Width = 123
+        Caption = 'Minimum Value'
+      end
+      object RangeLEDRangeEnd1: TLabel
+        Left = 168
+        Height = 25
+        Top = 272
+        Width = 126
+        Caption = 'Maximum Value'
+      end
+      object ResetMinMaxBtn: TBitBtn
+        Left = 8
+        Height = 45
+        Top = 336
+        Width = 249
+        Caption = 'Reset Min and Max'
+        Images = ImageList1
+        ImageIndex = 7
+        OnClick = ResetMinMaxBtnClick
+        TabOrder = 5
+      end
+      object Memo2: TMemo
+        Left = 336
+        Height = 520
+        Top = 256
+        Width = 385
+        Lines.Strings = (
+          'Basic Settings'
+          ''
+          'The Minimum and Maximum values set the '
+          'RANGE of the gauge. It does NOT affect '
+          'the scale which is independant of the range.'
+          ''
+          'See the SCALE Tab for more information.'
+          ''
+          'Also an interesting note is to see performance '
+          'IF the gauge overlaps any window controls'
+          'as it will cause a slow refrresh of all the components'
+          'in the tabs. '
+          ''
+          'Performance test is super simple, but shows '
+          'over 5x improvement over the original''s slow '
+          'redraw.'
+          ''
+          'Auto scale is only minimally implemented!'
+        )
+        TabOrder = 6
+      end
+    end
+    object FrameTab: TTabSheet
+      Caption = 'Frame'
+      ClientHeight = 813
+      ClientWidth = 754
+      object FrameFrameColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 25
+        Width = 97
+        Caption = 'Frame Color'
+      end
+      object FrameBorderColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 57
+        Width = 101
+        Caption = 'Border Color'
+      end
+      object FrameBorderColorCb: TColorBox
+        Left = 136
+        Height = 26
+        Hint = 'Frame Border Color'
+        Top = 57
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = FrameBorderColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 0
+      end
+      object FrameFrameColorCb: TColorBox
+        Left = 136
+        Height = 26
+        Hint = 'Frame Color'
+        Top = 24
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = FrameFrameColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+      end
+      object FrameRadiusSpe: TSpinEditEx
+        Left = 136
+        Height = 33
+        Hint = 'Set Frame Radius'
+        Top = 96
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        OnChange = FrameRadiusSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object FrameRadiusLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 104
+        Width = 111
+        Caption = 'Border Radius'
+      end
+    end
+    object FaceTab: TTabSheet
+      Caption = 'Face'
+      ClientHeight = 813
+      ClientWidth = 754
+      object FaceInnerColorCb: TColorBox
+        Left = 120
+        Height = 26
+        Hint = 'Inner Color, not used for fsNone Style'
+        Top = 64
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = FaceInnerColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 0
+      end
+      object FaceOuterColorCb: TColorBox
+        Left = 120
+        Height = 26
+        Hint = 'Outer Gradient or Solid Color if Fill Style is set to fsNone'
+        Top = 96
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = FaceOuterColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+      end
+      object FaceOuterColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 97
+        Width = 93
+        Caption = 'Outer Color'
+      end
+      object FaceInnerColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 63
+        Width = 88
+        Caption = 'Inner Color'
+      end
+      object FaceFillStyleLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 24
+        Width = 63
+        Caption = 'Fill Style'
+      end
+      object FaceFillStyleCb: TComboBox
+        Left = 120
+        Height = 33
+        Hint = 'Fill Style of Face'
+        Top = 16
+        Width = 168
+        ItemHeight = 25
+        Items.Strings = (
+          'fsNone'
+          'fsGradient'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        Text = 'lsNone'
+        OnChange = FaceFillStyleCbChange
+      end
+      object FacePictureResetOffsetBtn: TBitBtn
+        Left = 8
+        Height = 44
+        Hint = 'Reset to Default'
+        Top = 248
+        Width = 264
+        Caption = 'Reset Picture XY Offset'
+        Images = ImageList1
+        ImageIndex = 7
+        OnClick = FacePictureResetOffsetBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+      end
+      object FacePictureOffsetXSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'LED X Offset from Center'
+        Top = 208
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+        OnChange = FacePictureOffsetXSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object FacePictureOffsetYSpe: TSpinEditEx
+        Left = 169
+        Height = 33
+        Hint = 'LED Y Offset from Center'
+        Top = 208
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 5
+        OnChange = FacePictureOffsetYSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object FacePictureOffsetYLbl: TLabel
+        Left = 169
+        Height = 25
+        Top = 184
+        Width = 122
+        Caption = 'Picture Offset Y'
+      end
+      object FacePictureOffsetXLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 184
+        Width = 123
+        Caption = 'Picture Offset X'
+      end
+      object LoadImageBtn: TBitBtn
+        Left = 9
+        Height = 44
+        Hint = 'Load Face Image'
+        Top = 296
+        Width = 257
+        Caption = 'Load Image'
+        Images = ImageList1
+        ImageIndex = 11
+        OnClick = LoadImageBtnClick
+        TabOrder = 6
+      end
+      object FacePictureEnabledCb: TCheckBox
+        Left = 8
+        Height = 29
+        Hint = 'Show or Hide the Face Picture'
+        Top = 144
+        Width = 135
+        Caption = 'Picture Enable'
+        TabOrder = 7
+        OnChange = FacePictureEnabledCbChange
+      end
+    end
+    object ScaleTab: TTabSheet
+      Caption = 'Scale'
+      ClientHeight = 813
+      ClientWidth = 754
+      object ScaleEnableMainTicsCb: TCheckBox
+        Left = 8
+        Height = 29
+        Top = 24
+        Width = 155
+        Caption = 'Enable Main Tics'
+        TabOrder = 0
+        OnChange = ScaleEnableMainTicsCbChange
+      end
+      object EnableScaleTextCb: TCheckBox
+        Left = 8
+        Height = 29
+        Top = 64
+        Width = 114
+        Caption = 'Enable Text'
+        TabOrder = 1
+        OnChange = EnableScaleTextCbChange
+      end
+      object ScaleEnableSubTicsCb: TCheckBox
+        Left = 200
+        Height = 29
+        Top = 24
+        Width = 142
+        Caption = 'Enable SubTics'
+        TabOrder = 2
+        OnChange = ScaleEnableSubTicsCbChange
+      end
+      object ScaleLengthMainTickSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Length of the Main Tick Marks'
+        Top = 288
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+        OnChange = ScaleLengthMainTickSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleLenghtMainTickLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 256
+        Width = 133
+        Caption = 'Length Main Tick'
+      end
+      object ScaleLenghtSubTickLbl: TLabel
+        Left = 176
+        Height = 25
+        Top = 256
+        Width = 120
+        Caption = 'Length SubTick'
+      end
+      object ScaleLengthSubTickSpe: TSpinEditEx
+        Left = 176
+        Height = 33
+        Hint = 'Length of the SubTick Marks'
+        Top = 288
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+        OnChange = ScaleLengthSubTickSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleMainTickCountSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Count of Main Ticks spread over the gauge'
+        Top = 216
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 5
+        OnChange = ScaleMainTickCountSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleMainTickCountLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 184
+        Width = 127
+        Caption = 'Main Tick Count'
+      end
+      object ScaleSubTickCountLbl: TLabel
+        Left = 176
+        Height = 25
+        Top = 184
+        Width = 114
+        Caption = 'SubTick Count'
+      end
+      object ScaleSubTickCountSpe: TSpinEditEx
+        Left = 176
+        Height = 33
+        Hint = 'Count of the SubTicks spread over the gauge'
+        Top = 216
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 6
+        OnChange = ScaleSubTickCountSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleStartSpe: TSpinEditEx
+        Left = 9
+        Height = 33
+        Hint = 'Scale Starting value. Can be negative.'#13#10'Does not impact the value of the gauge, this is '#13#10'just for the SCALE'
+        Top = 144
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 7
+        OnChange = ScaleStartSpeChange
+        MaxValue = 10000
+        MinValue = -10000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleStartLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 112
+        Width = 81
+        Caption = 'Scale Start'
+      end
+      object ScaleRadiusSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Radius of the Ticks, and Arc '
+        Top = 456
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 8
+        OnChange = ScaleRadiusSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleRadiusLbol: TLabel
+        Left = 8
+        Height = 25
+        Top = 424
+        Width = 98
+        Caption = 'Scale Radius'
+      end
+      object ScaleTickColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 504
+        Width = 78
+        Caption = 'Tick Color'
+      end
+      object ScaleTickColorColorCb: TColorBox
+        Left = 125
+        Height = 26
+        Hint = 'Sets the Ticks and the Arc color'
+        Top = 504
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = ScaleTickColorColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 9
+      end
+      object ScaleRadiusLbol1: TLabel
+        Left = 8
+        Height = 25
+        Top = 544
+        Width = 88
+        Caption = 'Text Radius'
+      end
+      object ScaleTextRadiusSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Radius of the Text Scale'
+        Top = 576
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 10
+        OnChange = ScaleTextRadiusSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleTextColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 624
+        Width = 78
+        Caption = 'Text Color'
+      end
+      object ScaleTextColorColorCb: TColorBox
+        Left = 125
+        Height = 26
+        Hint = 'Sets the Color of the Text'
+        Top = 624
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = ScaleTextColorColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 11
+      end
+      object ScaleSetFontBtn: TBitBtn
+        Left = 224
+        Height = 33
+        Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+        Top = 576
+        Width = 72
+        Caption = 'Font'
+        Images = ImageList1
+        ImageIndex = 10
+        OnClick = ScaleSetFontBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 12
+      end
+      object ScaleTextStyleLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 659
+        Width = 72
+        Caption = 'Text Style'
+      end
+      object ScaleTextStyleDDCb: TCheckComboBox
+        Left = 125
+        Height = 31
+        Hint = 'Select Text Style'
+        Top = 656
+        Width = 171
+        DropDownCount = 4
+        ItemHeight = 25
+        ItemIndex = 0
+        Items.Strings = (
+          'Bold'
+          'Italic'
+          'Underline'
+          'Strike Out'
+        )
+        OnItemChange = ScaleTextStyleDDCbItemChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 13
+        Text = 'Bold'
+      end
+      object ScaleTextSizeSpe: TSpinEditEx
+        Left = 128
+        Height = 33
+        Hint = 'Radius of the Text Scale'
+        Top = 576
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 14
+        OnChange = ScaleTextSizeSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleRadiusLbol2: TLabel
+        Left = 128
+        Height = 25
+        Top = 544
+        Width = 66
+        Caption = 'Text Size'
+      end
+      object ScaleMainTickThicknessSpe: TSpinEditEx
+        Left = 8
+        Height = 33
+        Hint = 'Width of Main Ticks'
+        Top = 376
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 15
+        OnChange = ScaleMainTickThicknessSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleMainTickThicknessLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 344
+        Width = 127
+        Caption = 'Main Tick Width'
+      end
+      object ScaleSubTickThicknessSpe: TSpinEditEx
+        Left = 176
+        Height = 33
+        Hint = 'Width of Sub Ticks'
+        Top = 376
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 16
+        OnChange = ScaleSubTickThicknessSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleSubTickThicknessLbl: TLabel
+        Left = 176
+        Height = 25
+        Top = 344
+        Width = 114
+        Caption = 'SubTick Width'
+      end
+      object ScaleTickArcStyleCb: TComboBox
+        Left = 125
+        Height = 33
+        Hint = 'Allows choice of none, inner, outer or both scale arcs to be drawn'
+        Top = 456
+        Width = 171
+        ItemHeight = 25
+        Items.Strings = (
+          'taNone'
+          'taOuter'
+          'taInner'
+          'taBoth'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 17
+        OnChange = ScaleTickArcStyleCbChange
+      end
+      object TickArcStyleLbl: TLabel
+        Left = 128
+        Height = 25
+        Top = 424
+        Width = 103
+        Caption = 'Tick Arc Style'
+      end
+      object ScaleStepSpe: TSpinEditEx
+        Left = 176
+        Height = 33
+        Hint = 'Scale Step value. '#13#10'Does not impact the value of the gauge, this is '#13#10'just for the SCALE and only the Main Tics with labels'
+        Top = 144
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 18
+        OnChange = ScaleStepSpeChange
+        MaxValue = 10000
+        MinValue = -10000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object ScaleStepLbl: TLabel
+        Left = 176
+        Height = 25
+        Top = 112
+        Width = 80
+        Caption = 'Scale Step'
+      end
+      object ScaleReversedCb: TCheckBox
+        Left = 200
+        Height = 29
+        Top = 64
+        Width = 131
+        Caption = 'Reverse Scale'
+        TabOrder = 19
+        OnChange = ScaleReversedCbChange
+      end
+      object Memo1: TMemo
+        Left = 296
+        Height = 672
+        Top = 120
+        Width = 448
+        Lines.Strings = (
+          '*******************************************'
+          'NOTE : Setting the scale is INDEPENDANT '
+          'of the gauge MinValue and MaxValue. '
+          '*******************************************'
+          'Setting negative values for the scale start can'
+          'tricky IF you expect a 0 value to show up'
+          ''
+          'For example IF the step value will ''step over'' Zero'
+          'as rolls around the gauge it will NOT show. '
+          ''
+          'Here is an example with Negative value start '
+          'with a ZERO'
+          'ScaleStart=-5, ScaleStep=5'
+          ''
+          'Here is an example with Negative value start skipping ZERO'
+          'ScaleStart=-5, ScaleStep=10, it will increment by it.'
+          ''
+          'ScaleStep of 1 will generally always show the Zero'
+          ''
+          'MainTick count is used for the ScaleText, so changing '
+          'that will, of course, impact the number of Text items.'
+        )
+        TabOrder = 20
+      end
+    end
+    object PointerTab: TTabSheet
+      Caption = 'Pointer'
+      ClientHeight = 813
+      ClientWidth = 754
+      object PointerColorLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 17
+        Width = 43
+        Caption = 'Color'
+      end
+      object PointerColorCb: TColorBox
+        Left = 121
+        Height = 26
+        Hint = 'Pointer Color'
+        Top = 16
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = PointerColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 0
+      end
+      object PointerThicknessSpe: TSpinEditEx
+        Left = 195
+        Height = 33
+        Hint = 'Thickness of the pointer'
+        Top = 168
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+        OnChange = PointerThicknessSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object PointerThicknessLbl: TLabel
+        Left = 10
+        Height = 25
+        Top = 176
+        Width = 75
+        Caption = 'Thickness'
+      end
+      object PointerLengthSpe: TSpinEditEx
+        Left = 194
+        Height = 33
+        Hint = 'Pointer Length, not Included tail/extension'
+        Top = 48
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        OnChange = PointerLengthSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object PointerLengthLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 56
+        Width = 54
+        Caption = 'Length'
+      end
+      object PointerExtensionLengthLbl: TLabel
+        Left = 10
+        Height = 25
+        Top = 96
+        Width = 134
+        Caption = 'Extension Length'
+      end
+      object PointerExtensionLengthSpe: TSpinEditEx
+        Left = 195
+        Height = 33
+        Hint = 'Extension Length (the tail)'
+        Top = 88
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+        OnChange = PointerExtensionLengthSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object PointerStyleCb: TComboBox
+        Left = 142
+        Height = 33
+        Hint = 'Pointer style'
+        Top = 128
+        Width = 150
+        ItemHeight = 25
+        Items.Strings = (
+          'psLine'
+          'psLineExt'
+          'psArc'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+        OnChange = PointerStyleCbChange
+      end
+      object PointerStyleLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 136
+        Width = 37
+        Caption = 'Style'
+      end
+    end
+    object CapTab: TTabSheet
+      Caption = 'Cap'
+      ClientHeight = 813
+      ClientWidth = 754
+      object CapPositionLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 24
+        Width = 63
+        Caption = 'Position'
+      end
+      object CapPositionCb: TComboBox
+        Left = 141
+        Height = 33
+        Hint = 'Cap Position with respect to the pointer'
+        Top = 16
+        Width = 150
+        ItemHeight = 25
+        Items.Strings = (
+          'cpUnder'
+          'cpOver'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 0
+        OnChange = CapPositionCbChange
+      end
+      object CapStyleLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 64
+        Width = 37
+        Caption = 'Style'
+      end
+      object CapStyleCb: TComboBox
+        Left = 141
+        Height = 33
+        Hint = 'Cap Style'
+        Top = 56
+        Width = 150
+        ItemHeight = 25
+        Items.Strings = (
+          'csNone'
+          'csFlat'
+          'csShaded'
+          'csPhong'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+        OnChange = CapStyleCbChange
+      end
+      object CapCurveExponentSpe: TFloatSpinEditEx
+        Left = 202
+        Height = 33
+        Hint = 'Shader Curve, Typically for Phong shader'
+        Top = 96
+        Width = 89
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        OnChange = CapCurveExponentSpeChange
+        Increment = 0.01
+        MaxValue = 10
+        MinValue = -10
+        MinRepeatValue = 10
+      end
+      object CapCurveExponentLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 104
+        Width = 124
+        Caption = 'Curve Exponent'
+      end
+      object CapEdgeColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 144
+        Width = 88
+        Caption = 'Edge Color'
+      end
+      object CapEdgeColorCb: TColorBox
+        Left = 120
+        Height = 26
+        Hint = 'Edge Color'
+        Top = 144
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = CapEdgeColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+      end
+      object CapFillColorLbl: TLabel
+        Left = 8
+        Height = 25
+        Top = 184
+        Width = 69
+        Caption = 'Fill Color'
+      end
+      object CapFillColorCb: TColorBox
+        Left = 120
+        Height = 26
+        Hint = 'Fill Color'
+        Top = 183
+        Width = 171
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = CapFillColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+      end
+      object CapLightIntensitySpe: TSpinEditEx
+        Left = 194
+        Height = 33
+        Hint = 'X Offset from Center'
+        Top = 216
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 5
+        OnChange = CapLightIntensitySpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object CapLightIntensityLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 224
+        Width = 111
+        Caption = 'Light Intensity'
+      end
+      object CapRadiusLbl: TLabel
+        Left = 9
+        Height = 25
+        Top = 264
+        Width = 53
+        Caption = 'Radius'
+      end
+      object CapRadiusSpe: TSpinEditEx
+        Left = 194
+        Height = 33
+        Hint = 'X Offset from Center'
+        Top = 256
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 6
+        OnChange = CapRadiusSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+    end
+    object TextTab: TTabSheet
+      Caption = 'Text'
+      ClientHeight = 813
+      ClientWidth = 754
+      object TextGb1: TGroupBox
+        Left = 8
+        Height = 288
+        Top = 8
+        Width = 294
+        Caption = 'Text 1'
+        ClientHeight = 258
+        ClientWidth = 290
+        TabOrder = 0
+        object Text1EnabledCb: TCheckBox
+          Left = 8
+          Height = 29
+          Top = 0
+          Width = 77
+          Caption = 'Enable'
+          TabOrder = 0
+          OnChange = Text1EnabledCbChange
+        end
+        object Text1SetFontBtn1: TBitBtn
+          Left = 104
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 0
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Text1SetFontBtn1Click
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Text1TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 46
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Text1TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 40
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Text1TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          Text = 'Bold'
+        end
+        object Text1ColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 80
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Text1ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+        end
+        object Text1TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 81
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Text1TextSizeLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 116
+          Width = 66
+          Caption = 'Text Size'
+        end
+        object Text1TextSizeSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 112
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Text1TextSizeSpeChange
+          MaxValue = 200
+          MinValue = -100
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text1TextLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 220
+          Width = 30
+          Caption = 'Text'
+        end
+        object Text1TextEdt: TEdit
+          Left = 66
+          Height = 33
+          Hint = 'Display Text'
+          Top = 216
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Text1TextEdt'
+          OnChange = Text1TextEdtChange
+        end
+        object Text1OffsetXSpe: TSpinEditEx
+          Left = 8
+          Height = 33
+          Hint = 'X Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Text1OffsetXSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text1OffsetYSpe: TSpinEditEx
+          Left = 121
+          Height = 33
+          Hint = 'Y Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Text1OffsetYSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text1OffsetYLbl: TLabel
+          Left = 120
+          Height = 25
+          Top = 152
+          Width = 64
+          Caption = 'Offset Y'
+        end
+        object Text1OffsetXLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 152
+          Width = 65
+          Caption = 'Offset X'
+        end
+      end
+      object Text2Gb: TGroupBox
+        Left = 312
+        Height = 288
+        Top = 8
+        Width = 294
+        Caption = 'Text 2'
+        ClientHeight = 258
+        ClientWidth = 290
+        ParentBackground = False
+        ParentColor = False
+        TabOrder = 1
+        object Text2EnabledCb: TCheckBox
+          Left = 9
+          Height = 29
+          Top = 0
+          Width = 77
+          Caption = 'Enable'
+          TabOrder = 0
+          OnChange = Text2EnabledCbChange
+        end
+        object Text2SetFontBtn: TBitBtn
+          Left = 104
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 0
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Text2SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Text2TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 46
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Text2TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 40
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Text2TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          Text = 'Bold'
+        end
+        object Text2ColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 80
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Text2ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+        end
+        object Text2TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 81
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Text1TextSizeLbl1: TLabel
+          Left = 8
+          Height = 25
+          Top = 116
+          Width = 66
+          Caption = 'Text Size'
+        end
+        object Text2TextSizeSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 112
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Text2TextSizeSpeChange
+          MaxValue = 200
+          MinValue = -100
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text2TextLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 220
+          Width = 30
+          Caption = 'Text'
+        end
+        object Text2TextEdt: TEdit
+          Left = 66
+          Height = 33
+          Hint = 'Display Text'
+          Top = 216
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Text2TextEdt'
+          OnChange = Text2TextEdtChange
+        end
+        object Text2OffsetXSpe: TSpinEditEx
+          Left = 9
+          Height = 33
+          Hint = 'X Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Text2OffsetXSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text2OffsetYSpe: TSpinEditEx
+          Left = 121
+          Height = 33
+          Hint = 'Y Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Text2OffsetYSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text2OffsetYLbl: TLabel
+          Left = 120
+          Height = 25
+          Top = 152
+          Width = 64
+          Caption = 'Offset Y'
+        end
+        object Text2OffsetXLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 152
+          Width = 65
+          Caption = 'Offset X'
+        end
+      end
+      object Text3Gb: TGroupBox
+        Left = 8
+        Height = 288
+        Top = 312
+        Width = 294
+        Caption = 'Text 3'
+        ClientHeight = 258
+        ClientWidth = 290
+        ParentBackground = False
+        ParentColor = False
+        TabOrder = 2
+        object Text3EnabledCb: TCheckBox
+          Left = 8
+          Height = 29
+          Top = 0
+          Width = 77
+          Caption = 'Enable'
+          TabOrder = 0
+          OnChange = Text3EnabledCbChange
+        end
+        object Text3SetFontBtn: TBitBtn
+          Left = 104
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 0
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Text3SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Text3TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 46
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Text3TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 40
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Text3TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          Text = 'Bold'
+        end
+        object Text3ColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 80
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Text3ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+        end
+        object Text3TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 81
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Text3TextSizeLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 116
+          Width = 66
+          Caption = 'Text Size'
+        end
+        object Text3TextSizeSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 112
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Text3TextSizeSpeChange
+          MaxValue = 200
+          MinValue = -100
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text3TextLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 220
+          Width = 30
+          Caption = 'Text'
+        end
+        object Text3TextEdt: TEdit
+          Left = 66
+          Height = 33
+          Hint = 'Display Text'
+          Top = 216
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Text3TextEdt'
+          OnChange = Text3TextEdtChange
+        end
+        object Text3OffsetXSpe: TSpinEditEx
+          Left = 8
+          Height = 33
+          Hint = 'X Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Text3OffsetXSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text3OffsetYSpe: TSpinEditEx
+          Left = 121
+          Height = 33
+          Hint = 'Y Offset from Center'
+          Top = 176
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Text3OffsetYSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Text3OffsetYLbl: TLabel
+          Left = 120
+          Height = 25
+          Top = 152
+          Width = 64
+          Caption = 'Offset Y'
+        end
+        object Text3OffsetXLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 152
+          Width = 65
+          Caption = 'Offset X'
+        end
+      end
+    end
+    object BandTab: TTabSheet
+      Caption = 'Band'
+      ClientHeight = 813
+      ClientWidth = 754
+      object Band1Gb: TGroupBox
+        Left = 8
+        Height = 368
+        Top = 0
+        Width = 296
+        Caption = 'Band 1'
+        ClientHeight = 338
+        ClientWidth = 292
+        TabOrder = 0
+        object Band1EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Band'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = BandEnabledCbChange
+        end
+        object Band1ColorCb: TColorBox
+          Left = 120
+          Height = 26
+          Hint = 'Set Band Color'
+          Top = 24
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band1ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Band1ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Band1EnabledTextCb: TCheckBox
+          Left = 160
+          Height = 29
+          Hint = 'Enable or Disable the Text in this Band'
+          Top = -8
+          Width = 125
+          Caption = 'Enabled Text'
+          TabOrder = 2
+          OnChange = Band1EnabledTextCbChange
+        end
+        object Band1StartLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 48
+          Width = 91
+          Caption = 'Range Start'
+        end
+        object Band1StartValueSpe: TFloatSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Value of the band'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Band1StartValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band1EndValueSpe: TFloatSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'End Value of the Band'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Band1EndValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band1RangeEndLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 48
+          Width = 85
+          Caption = 'Range End'
+        end
+        object Band1TextLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 168
+          Width = 30
+          Caption = 'Text'
+        end
+        object Band1TextEdt: TEdit
+          Left = 48
+          Height = 33
+          Hint = 'Text for the Band'
+          Top = 164
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Band1TextEdt'
+          OnChange = Band1TextEdtChange
+        end
+        object Band1TextColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 240
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band1TextColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+        end
+        object Band1TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 241
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Band1BandRadiusSpe: TSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'Band Radius'
+          Top = 128
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Band1BandRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band1TextSizeSpe: TSpinEditEx
+          Left = 8
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 296
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 8
+          OnChange = Band1TextSizeSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band1ThicknessSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Thickness of the Band'
+          Top = 128
+          Width = 88
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 9
+          OnChange = Band1ThicknessSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band1BandRadiusLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 104
+          Width = 98
+          Caption = 'Band Radius'
+        end
+        object Band1TextSizeLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 272
+          Width = 31
+          Caption = 'Size'
+        end
+        object Band1ThicknessLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 104
+          Width = 75
+          Caption = 'Thickness'
+        end
+        object Band1TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 200
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Band1TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 10
+          Text = 'Bold'
+        end
+        object Band1TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 206
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Band1SetFontBtn: TBitBtn
+          Left = 203
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 164
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Band1SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 11
+        end
+        object Band1TextRadiusSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Text Radius'
+          Top = 296
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 12
+          OnChange = Band1TextRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band1TextRadiusLbl: TLabel
+          Left = 107
+          Height = 25
+          Top = 272
+          Width = 88
+          Caption = 'Text Radius'
+        end
+      end
+      object Band2Gb: TGroupBox
+        Left = 312
+        Height = 368
+        Top = 0
+        Width = 296
+        Caption = 'Band 2'
+        ClientHeight = 338
+        ClientWidth = 292
+        TabOrder = 1
+        object Band2EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Band'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Band2EnabledCbChange
+        end
+        object Band2ColorCb: TColorBox
+          Left = 120
+          Height = 26
+          Hint = 'Set Band Color'
+          Top = 24
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band2ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Band2ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Band2EnabledTextCb: TCheckBox
+          Left = 160
+          Height = 29
+          Hint = 'Enable or Disable the Text in this Band'
+          Top = -8
+          Width = 125
+          Caption = 'Enabled Text'
+          TabOrder = 2
+          OnChange = Band2EnabledTextCbChange
+        end
+        object BandStartLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 48
+          Width = 91
+          Caption = 'Range Start'
+        end
+        object Band2StartValueSpe: TFloatSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Value of the band'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Band2StartValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band2EndValueSpe: TFloatSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'End Value of the Band'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Band2EndValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band2RangeEndLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 48
+          Width = 85
+          Caption = 'Range End'
+        end
+        object Band2TextLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 168
+          Width = 30
+          Caption = 'Text'
+        end
+        object Band2TextEdt: TEdit
+          Left = 48
+          Height = 33
+          Hint = 'Text for the Band'
+          Top = 164
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Band1TextEdt'
+          OnChange = Band2TextEdtChange
+        end
+        object Band2TextColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 240
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band2TextColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+        end
+        object Band2TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 241
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Band2BandRadiusSpe: TSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'Band Radius'
+          Top = 128
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Band2BandRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band2TextSizeSpe: TSpinEditEx
+          Left = 9
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 296
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 8
+          OnChange = Band2TextSizeSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band2ThicknessSpe: TSpinEditEx
+          Left = 13
+          Height = 33
+          Hint = 'Thickness of the Band'
+          Top = 128
+          Width = 88
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 9
+          OnChange = Band2ThicknessSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band2BandRadiusLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 104
+          Width = 98
+          Caption = 'Band Radius'
+        end
+        object Band2TextSizeLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 272
+          Width = 31
+          Caption = 'Size'
+        end
+        object Band2ThicknessLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 104
+          Width = 75
+          Caption = 'Thickness'
+        end
+        object Band2TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 200
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Band2TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 10
+          Text = 'Bold'
+        end
+        object Band2TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 206
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Band2SetFontBtn: TBitBtn
+          Left = 203
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 164
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Band2SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 11
+        end
+        object Band2TextRadiusSpe: TSpinEditEx
+          Left = 107
+          Height = 33
+          Hint = 'Text Radius'
+          Top = 296
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 12
+          OnChange = Band2TextRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band2TextRadiusLbl: TLabel
+          Left = 107
+          Height = 25
+          Top = 272
+          Width = 88
+          Caption = 'Text Radius'
+        end
+      end
+      object Band3Gb: TGroupBox
+        Left = 8
+        Height = 368
+        Top = 376
+        Width = 296
+        Caption = 'Band 3'
+        ClientHeight = 338
+        ClientWidth = 292
+        ParentBackground = False
+        ParentColor = False
+        TabOrder = 2
+        object Band3EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Band'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Band3EnabledCbChange
+        end
+        object Band3ColorCb: TColorBox
+          Left = 120
+          Height = 26
+          Hint = 'Set Band Color'
+          Top = 24
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band3ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Band3ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Band3EnabledTextCb: TCheckBox
+          Left = 160
+          Height = 29
+          Hint = 'Enable or Disable the Text in this Band'
+          Top = -8
+          Width = 125
+          Caption = 'Enabled Text'
+          TabOrder = 2
+          OnChange = Band3EnabledTextCbChange
+        end
+        object Band3StartLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 48
+          Width = 91
+          Caption = 'Range Start'
+        end
+        object Band3StartValueSpe: TFloatSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Value of the band'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Band3StartValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band3EndValueSpe: TFloatSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'End Value of the Band'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Band3EndValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band3RangeEndLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 48
+          Width = 85
+          Caption = 'Range End'
+        end
+        object Band3TextLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 168
+          Width = 30
+          Caption = 'Text'
+        end
+        object Band3TextEdt: TEdit
+          Left = 48
+          Height = 33
+          Hint = 'Text for the Band'
+          Top = 164
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Band1TextEdt'
+          OnChange = Band3TextEdtChange
+        end
+        object Band3TextColorCb: TColorBox
+          Left = 106
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 240
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band3TextColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+        end
+        object Band3TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 240
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Band3BandRadiusSpe: TSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'Band Radius'
+          Top = 128
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Band3BandRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band3TextSizeSpe: TSpinEditEx
+          Left = 10
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 296
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 8
+          OnChange = Band3TextSizeSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band3ThicknessSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Thickness of the Band'
+          Top = 128
+          Width = 88
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 9
+          OnChange = Band3ThicknessSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band3BandRadiusLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 104
+          Width = 98
+          Caption = 'Band Radius'
+        end
+        object Band3TextSizeLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 272
+          Width = 31
+          Caption = 'Size'
+        end
+        object Band3ThicknessLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 104
+          Width = 75
+          Caption = 'Thickness'
+        end
+        object Band3TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 200
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Band3TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 10
+          Text = 'Bold'
+        end
+        object Band1TextStyleLbl1: TLabel
+          Left = 8
+          Height = 25
+          Top = 206
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Band3SetFontBtn: TBitBtn
+          Left = 203
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 164
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Band3SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 11
+        end
+        object Band3TextRadiusSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Text Radius'
+          Top = 296
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 12
+          OnChange = Band3TextRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band3TextRadiusLbl: TLabel
+          Left = 107
+          Height = 25
+          Top = 272
+          Width = 88
+          Caption = 'Text Radius'
+        end
+      end
+      object Band4Gb: TGroupBox
+        Left = 312
+        Height = 368
+        Top = 376
+        Width = 296
+        Caption = 'Band 4'
+        ClientHeight = 338
+        ClientWidth = 292
+        ParentBackground = False
+        ParentColor = False
+        TabOrder = 3
+        object Band4EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Band'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Band4EnabledCbChange
+        end
+        object Band4ColorCb: TColorBox
+          Left = 120
+          Height = 26
+          Hint = 'Set Band Color'
+          Top = 23
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band4ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Band4ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 24
+          Width = 43
+          Caption = 'Color'
+        end
+        object Band4EnabledTextCb: TCheckBox
+          Left = 160
+          Height = 29
+          Hint = 'Enable or Disable the Text in this Band'
+          Top = -8
+          Width = 125
+          Caption = 'Enabled Text'
+          TabOrder = 2
+          OnChange = Band4EnabledTextCbChange
+        end
+        object Band4StartLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 48
+          Width = 91
+          Caption = 'Range Start'
+        end
+        object Band4StartValueSpe: TFloatSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Value of the band'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Band4StartValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band4EndValueSpe: TFloatSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'End Value of the Band'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Band4EndValueSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+        end
+        object Band4RangeEndLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 48
+          Width = 85
+          Caption = 'Range End'
+        end
+        object Band4TextLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 168
+          Width = 30
+          Caption = 'Text'
+        end
+        object Band4TextEdt: TEdit
+          Left = 48
+          Height = 33
+          Hint = 'Text for the Band'
+          Top = 164
+          Width = 152
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          Text = 'Band1TextEdt'
+          OnChange = Band4TextEdtChange
+        end
+        object Band4TextColorCb: TColorBox
+          Left = 104
+          Height = 26
+          Hint = 'Set Text Color'
+          Top = 239
+          Width = 171
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Band4TextColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+        end
+        object Band4TextColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 241
+          Width = 78
+          Caption = 'Text Color'
+        end
+        object Band4BandRadiusSpe: TSpinEditEx
+          Left = 136
+          Height = 33
+          Hint = 'Band Radius'
+          Top = 128
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+          OnChange = Band4BandRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band4TextSizeSpe: TSpinEditEx
+          Left = 8
+          Height = 33
+          Hint = 'Size of the Text'
+          Top = 296
+          Width = 90
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 8
+          OnChange = Band4TextSizeSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band4ThicknessSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Thickness of the Band'
+          Top = 128
+          Width = 88
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 9
+          OnChange = Band4ThicknessSpeChange
+          MaxValue = 200
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band4BandRadiusLbl: TLabel
+          Left = 136
+          Height = 25
+          Top = 104
+          Width = 98
+          Caption = 'Band Radius'
+        end
+        object Band4TextSizeLbl: TLabel
+          Left = 10
+          Height = 25
+          Top = 272
+          Width = 31
+          Caption = 'Size'
+        end
+        object Band4ThicknessLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 104
+          Width = 75
+          Caption = 'Thickness'
+        end
+        object Band4TextStyleDDCb: TCheckComboBox
+          Left = 104
+          Height = 31
+          Hint = 'Select Text Style'
+          Top = 200
+          Width = 171
+          DropDownCount = 4
+          ItemHeight = 25
+          ItemIndex = 0
+          Items.Strings = (
+            'Bold'
+            'Italic'
+            'Underline'
+            'Strike Out'
+          )
+          OnItemChange = Band4TextStyleDDCbItemChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 10
+          Text = 'Bold'
+        end
+        object Band4TextStyleLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 206
+          Width = 72
+          Caption = 'Text Style'
+        end
+        object Band4SetFontBtn: TBitBtn
+          Left = 203
+          Height = 33
+          Hint = 'Select the Font for the Text in the Band. '#13#10'NOTE: This only sets the Font Name and not'#13#10'possible to set it back to ''default'''
+          Top = 164
+          Width = 72
+          Caption = 'Font'
+          Images = ImageList1
+          ImageIndex = 10
+          OnClick = Band4SetFontBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 11
+        end
+        object Band4TextRadiusSpe: TSpinEditEx
+          Left = 106
+          Height = 33
+          Hint = 'Text Radius'
+          Top = 296
+          Width = 85
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 12
+          OnChange = Band4TextRadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Band4TextRadiusLbl: TLabel
+          Left = 107
+          Height = 25
+          Top = 272
+          Width = 88
+          Caption = 'Text Radius'
+        end
+      end
+    end
+    object LedTab: TTabSheet
+      Caption = 'RangeLED'
+      ClientHeight = 813
+      ClientWidth = 754
+      object LedOnBtn: TBitBtn
+        Left = 32
+        Height = 38
+        Hint = 'Set LED ON'#13#10'State Set to Active'
+        Top = 32
+        Width = 113
+        Caption = 'Led On'
+        Images = ImageList1
+        ImageIndex = 8
+        OnClick = LedOnBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 0
+      end
+      object LedOffBtn: TBitBtn
+        Left = 152
+        Height = 38
+        Hint = 'Turn LED Off'#13#10'State set to False'
+        Top = 32
+        Width = 113
+        Caption = 'Led Off'
+        Images = ImageList1
+        ImageIndex = 9
+        OnClick = LedOffBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+      end
+      object TestLedShape: TBGRAShape
+        Left = 32
+        Height = 33
+        Top = 88
+        Width = 32
+        Angle = 45
+        BorderColor = clWindowText
+        BorderGradient.StartColor = clWhite
+        BorderGradient.EndColor = clBlack
+        BorderGradient.GradientType = gtLinear
+        BorderGradient.Point1XPercent = 0
+        BorderGradient.Point1YPercent = 0
+        BorderGradient.Point2XPercent = 100
+        BorderGradient.Point2YPercent = 100
+        FillColor = clRed
+        FillOpacity = 255
+        FillGradient.StartColor = clRed
+        FillGradient.EndColor = clBlack
+        FillGradient.GradientType = gtRadial
+        FillGradient.Point1XPercent = 50
+        FillGradient.Point1YPercent = 50
+        FillGradient.Point2XPercent = 100
+        FillGradient.Point2YPercent = 100
+        UseFillGradient = True
+        ShapeType = stEllipse
+        Caption = 'Test LED'
+      end
+      object RangeLEDStyleCb: TComboBox
+        Left = 88
+        Height = 33
+        Hint = 'Select Range Pointer Cap Fill Style'
+        Top = 96
+        Width = 150
+        ItemHeight = 25
+        ItemIndex = 0
+        Items.Strings = (
+          'lsNone'
+          'lsFlat'
+          'lsShaded'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        Text = 'lsNone'
+        OnChange = RangeLEDStyleCbChange
+      end
+      object Label2: TLabel
+        Left = 32
+        Height = 25
+        Top = 8
+        Width = 48
+        Caption = 'Active'
+      end
+      object FillStyleLbl: TLabel
+        Left = 88
+        Height = 25
+        Top = 72
+        Width = 63
+        Caption = 'Fill Style'
+      end
+      object RangeLEDActiveColorCb: TColorBox
+        Left = 32
+        Height = 26
+        Hint = 'Set Active Color For Fill'
+        Top = 216
+        Width = 206
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = RangeLEDActiveColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+      end
+      object Label4: TLabel
+        Left = 32
+        Height = 25
+        Top = 192
+        Width = 96
+        Caption = 'Active Color'
+      end
+      object Label8: TLabel
+        Left = 32
+        Height = 25
+        Top = 248
+        Width = 108
+        Caption = 'Inactive Color'
+      end
+      object RangeLEDInactiveColorCb: TColorBox
+        Left = 32
+        Height = 26
+        Hint = 'Set Inactive Color for Fill'#13#10'Note That when off Gradient fill '#13#10'just uses a flat fill at this time'
+        Top = 272
+        Width = 206
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = RangeLEDInactiveColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 4
+      end
+      object Label9: TLabel
+        Left = 32
+        Height = 25
+        Top = 304
+        Width = 101
+        Caption = 'Border Color'
+      end
+      object RangeLEDBorderColorCb: TColorBox
+        Left = 32
+        Height = 26
+        Hint = 'Sets Border Color'
+        Top = 328
+        Width = 206
+        Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+        ColorDialog = ColorDialog1
+        ItemHeight = 20
+        OnChange = RangeLEDBorderColorCbChange
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 5
+      end
+      object GroupBox3: TGroupBox
+        Left = 280
+        Height = 427
+        Top = 24
+        Width = 432
+        Caption = 'Active RangeLed Properties'
+        ClientHeight = 397
+        ClientWidth = 428
+        TabOrder = 6
+        object RangeLEDFillStyleLbl: TLabel
+          Left = 106
+          Height = 25
+          Top = 40
+          Width = 72
+          Caption = 'Fill Style :'
+        end
+        object RangeLEDFillStyleValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 40
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDStateLbl: TLabel
+          Left = 121
+          Height = 25
+          Top = 16
+          Width = 57
+          Caption = 'Active :'
+        end
+        object RangeLEDStateValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 16
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDActiveColorLbl: TLabel
+          Left = 73
+          Height = 25
+          Top = 88
+          Width = 105
+          Caption = 'Active Color :'
+        end
+        object RangeLEDActiveColorValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 88
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDInactiveColorLbl: TLabel
+          Left = 70
+          Height = 25
+          Top = 112
+          Width = 108
+          Caption = 'Inctive Color :'
+        end
+        object RangeLEDInactiveColorValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 112
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDBorderColorLbl: TLabel
+          Left = 68
+          Height = 25
+          Top = 136
+          Width = 110
+          Caption = 'Border Color :'
+        end
+        object RangeLEDBorderColorValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 136
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDOffsetX1Lbl1: TLabel
+          Left = 104
+          Height = 25
+          Top = 160
+          Width = 74
+          Caption = 'Offset X :'
+          ParentShowHint = False
+        end
+        object RangeLEDOffsetXValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 160
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDOffsetYLbl1: TLabel
+          Left = 105
+          Height = 25
+          Top = 184
+          Width = 73
+          Caption = 'Offset Y :'
+          ParentShowHint = False
+        end
+        object RangeLEDOffsetYValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 184
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDRangeStartLbl1: TLabel
+          Left = 78
+          Height = 25
+          Top = 232
+          Width = 100
+          Caption = 'Range Start :'
+          ParentShowHint = False
+        end
+        object RangeLEDRangeEndLbl1: TLabel
+          Left = 84
+          Height = 25
+          Top = 256
+          Width = 94
+          Caption = 'Range End :'
+          ParentShowHint = False
+        end
+        object RangeLEDRangeEndValLbl1: TLabel
+          Left = 192
+          Height = 25
+          Top = 256
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDRangeStartValLbl1: TLabel
+          Left = 192
+          Height = 25
+          Top = 232
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDRangeTypeLbl1: TLabel
+          Left = 77
+          Height = 25
+          Top = 208
+          Width = 101
+          Caption = 'Range Type :'
+          ParentShowHint = False
+        end
+        object RangeLEDRangeTypeValLbl1: TLabel
+          Left = 192
+          Height = 25
+          Top = 208
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDCallBackLed: TuELED
+          Left = 8
+          Height = 56
+          Top = 296
+          Width = 56
+          Debug = False
+          Active = True
+          LedType = ledRound
+          Bright = False
+          Reflection = False
+          Color = clGreen
+          ParentColor = False
+        end
+        object RangeLEDCallbackValueLbl: TLabel
+          Left = 80
+          Height = 25
+          Top = 327
+          Width = 104
+          Caption = 'Active Value :'
+          ParentShowHint = False
+        end
+        object RangeLEDCallbackValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 327
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDCallbackNameLbl: TLabel
+          Left = 105
+          Height = 25
+          Top = 304
+          Width = 74
+          Caption = 'Callback :'
+          ParentShowHint = False
+        end
+        object RangeLEDCallbackNameValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 304
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object RangeLEDShapeLbl: TLabel
+          Left = 120
+          Height = 25
+          Top = 64
+          Width = 58
+          Caption = 'Shape :'
+        end
+        object RangeLEDShapeValLbl: TLabel
+          Left = 192
+          Height = 25
+          Top = 64
+          Width = 35
+          Caption = 'N/A'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+      end
+      object RangeLEDOffsetXLbl: TLabel
+        Left = 33
+        Height = 25
+        Top = 424
+        Width = 65
+        Caption = 'Offset X'
+      end
+      object RangeLEDOffsetYLbl: TLabel
+        Left = 168
+        Height = 25
+        Hint = 'LED Y Offset from Center'
+        Top = 424
+        Width = 64
+        Caption = 'Offset Y'
+      end
+      object RangeLEDOffsetXSpe: TSpinEditEx
+        Left = 32
+        Height = 33
+        Hint = 'LED X Offset from Center'
+        Top = 448
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 7
+        OnChange = RangeLEDOffsetXSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object RangeLEDOffsetYSpe: TSpinEditEx
+        Left = 141
+        Height = 33
+        Hint = 'LED Y Offset from Center'
+        Top = 448
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 8
+        OnChange = RangeLEDOffsetYSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object RangeLedResetOffsetBtn: TBitBtn
+        Left = 32
+        Height = 45
+        Hint = 'Reset to Default'
+        Top = 488
+        Width = 206
+        Caption = 'Reset XY Offset'
+        Images = ImageList1
+        ImageIndex = 7
+        OnClick = RangeLedResetOffsetBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 9
+      end
+      object RangeLEDRangeTypeCb: TComboBox
+        Left = 33
+        Height = 33
+        Hint = 'Select Range Error Type'#13#10'rcNone - Not Used'#13#10'rcGaugeOutOfRange - Ignores Start, End uses Gauge Range'#13#10'rcBetween - Between Start and End, not including them'#13#10'rcBothInclusive - Between Start and End, not including them'#13#10'rcStartInclusive - Between and Including Start, up to and not including End'#13#10'rcEndInclusive - Between Start, Not Including It, and Including End'#13#10'rcBothBetweenOutside - Outside of Start and End, not including them'#13#10'rcBothInclusiveOutside - Outside of Start and End, Including them'#13#10'rcGreaterStart - Ignor End Value, anything greater then the start'#13#10'rcLessEnd - Less than the End value, ignorts start'
+        Top = 568
+        Width = 206
+        ItemHeight = 25
+        ItemIndex = 0
+        Items.Strings = (
+          'rcNone'
+          'rcGaugeOutOfRange'
+          'rcBetween'
+          'rcBothInclusive'
+          'rcStartInclusive'
+          'rcEndInclusive'
+          'rcBothBetweenOutside'
+          'rcBothInclusiveOutside'
+          'rcGreaterStart'
+          'rcLessEnd'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 10
+        Text = 'rcNone'
+        OnChange = RangeLEDRangeTypeCbChange
+      end
+      object RangeLedRangeTypeLbl: TLabel
+        Left = 32
+        Height = 25
+        Top = 544
+        Width = 92
+        Caption = 'Range Type'
+      end
+      object RangeLEDRangeStartLbl: TLabel
+        Left = 32
+        Height = 25
+        Top = 600
+        Width = 91
+        Caption = 'Range Start'
+      end
+      object RangeLEDRangeStartSpe: TFloatSpinEditEx
+        Left = 32
+        Height = 33
+        Hint = 'Range Start Value'#13#10'This is used by the active'#13#10'Range Check Type as the'#13#10'Starting Value, May be inclusive'#13#10'or Exclusive.'
+        Top = 624
+        Width = 89
+        Color = clInactiveCaption
+        MaxLength = 0
+        ParentShowHint = False
+        ReadOnly = True
+        ShowHint = True
+        TabOrder = 11
+        OnChange = RangeLEDRangeStartSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+      end
+      object RangeLEDRangeEndSpe: TFloatSpinEditEx
+        Left = 150
+        Height = 33
+        Hint = 'Range End Value'#13#10'This is used by the active'#13#10'Range Check Type as the'#13#10'Starting Value, May be inclusive'#13#10'or Exclusive.'
+        Top = 624
+        Width = 89
+        Color = clInactiveCaption
+        MaxLength = 0
+        ParentShowHint = False
+        ReadOnly = True
+        ShowHint = True
+        TabOrder = 12
+        OnChange = RangeLEDRangeEndSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+      end
+      object RangeLEDRangeEnd: TLabel
+        Left = 147
+        Height = 25
+        Top = 600
+        Width = 85
+        Caption = 'Range End'
+      end
+      object RangeLedResetRangesBtn: TBitBtn
+        Left = 32
+        Height = 45
+        Hint = 'Reset to Default'
+        Top = 664
+        Width = 206
+        Caption = 'Reset Ranges'
+        Images = ImageList1
+        ImageIndex = 7
+        OnClick = RangeLedResetRangesBtnClick
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 13
+      end
+      object RangeLEDShapeCb: TComboBox
+        Left = 88
+        Height = 33
+        Hint = 'Select Range LED Fill Style'
+        Top = 160
+        Width = 150
+        ItemHeight = 25
+        ItemIndex = 0
+        Items.Strings = (
+          'lshRound'
+          'lshSquare'
+          'lshTriangle'
+          'lshDownTriangle'
+        )
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 14
+        Text = 'lshRound'
+        OnChange = RangeLEDShapeCbChange
+      end
+      object ShapeLbl: TLabel
+        Left = 88
+        Height = 25
+        Top = 136
+        Width = 49
+        Caption = 'Shape'
+      end
+      object RangeLEDOffsetXLbl1: TLabel
+        Left = 32
+        Height = 25
+        Top = 360
+        Width = 31
+        Caption = 'Size'
+      end
+      object RangeLEDSizeSpe: TSpinEditEx
+        Left = 33
+        Height = 33
+        Hint = 'Size or Radius'
+        Top = 384
+        Width = 97
+        MaxLength = 0
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 15
+        OnChange = RangeLEDSizeSpeChange
+        MaxValue = 1000
+        MinValue = -1000
+        MinRepeatValue = 10
+        NullValue = 0
+        Value = 0
+      end
+      object RangeLEDMemo: TMemo
+        Left = 248
+        Height = 368
+        Top = 416
+        Width = 488
+        Lines.Strings = (
+          'Select Range Error Type'
+          'rcNone - Not Used'
+          'rcGaugeOutOfRange - Ignores Start, End uses Gauge Range'
+          'rcBetween - Between Start and End, not including them'
+          'rcBothInclusive - Between Start and End, not including them'
+          'rcStartInclusive - Between and Including Start, up to and not including End'
+          'rcEndInclusive - Between Start, Not Including It, and Including End'
+          'rcBothBetweenOutside - Outside of Start and End, not including them'
+          'rcBothInclusiveOutside - Outside of Start and End, Including them'
+          'rcGreaterStart - Ignor End Value, anything greater then the start'
+          'rcLessEnd - Less than the End value, ignorts start'
+          ''
+          'NOTE : IF THE GAUGE OVERVFLOWS/UNDERFLOWS THESE VALUES WILL BE CHECKED IN THE RANGE TEST SO SET RANGE START AND RANGE END ACCORDINGLY TO ENSURE THE LED IS SET IN THESE CONDITIONS IF DESIRED'
+        )
+        ScrollBars = ssVertical
+        TabOrder = 16
+      end
+    end
+    object TabSheet1: TTabSheet
+      Caption = 'Markers'
+      ClientHeight = 813
+      ClientWidth = 754
+      object Marker1Gb1: TGroupBox
+        Left = 8
+        Height = 280
+        Hint = 'Set the height of the Marker'
+        Top = 0
+        Width = 296
+        Caption = 'Marker 1'
+        ClientHeight = 250
+        ClientWidth = 292
+        TabOrder = 0
+        object Marker1EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Marker'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Marker1EnabledCbChange
+        end
+        object Marker1ColorCb: TColorBox
+          Left = 102
+          Height = 26
+          Hint = 'Set Marker Color'
+          Top = 25
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Marker1ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Marker1ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Marker1WidthLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 48
+          Width = 48
+          Caption = 'Width'
+        end
+        object Marker1HeightLbl: TLabel
+          Left = 153
+          Height = 25
+          Top = 48
+          Width = 53
+          Caption = 'Height'
+        end
+        object Marker1RadiusSpe: TSpinEditEx
+          Left = 102
+          Height = 33
+          Hint = 'Marker Radius'
+          Top = 120
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          OnChange = Marker1RadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker1RadiusLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 120
+          Width = 53
+          Caption = 'Radius'
+        end
+        object Marker1StyleCb: TComboBox
+          Left = 102
+          Height = 33
+          Hint = 'Marker Style '#13#10'msCenter - Point centered on value'#13#10'msLeft - Left Edge Centered on value'#13#10'msRight - Right Centered on value'
+          Top = 160
+          Width = 150
+          ItemHeight = 25
+          Items.Strings = (
+            'msCenter'
+            'msLeft'
+            'msRight'
+          )
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Marker1StyleCbChange
+        end
+        object Marker1StyleLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 168
+          Width = 37
+          Caption = 'Style'
+        end
+        object Marker1WidthSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Width of the marker'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Marker1WidthSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker1HeightSpe: TSpinEditEx
+          Left = 152
+          Height = 33
+          Hint = 'Height of the Marker'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          OnChange = Marker1HeightSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker1ValueSpe: TFloatSpinEditEx
+          Left = 104
+          Height = 33
+          Hint = 'Value of the marker, not the scale setting. Matches Gauge scaling'
+          Top = 208
+          Width = 104
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Marker1ValueSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+        end
+        object Marker1ValueLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 216
+          Width = 42
+          Caption = 'Value'
+        end
+        object Marker1ValueClrBtn: TBitBtn
+          Left = 208
+          Height = 37
+          Hint = 'Reset Marker to Zero'
+          Top = 208
+          Width = 33
+          Images = ImageList1
+          ImageIndex = 13
+          OnClick = Marker1ValueClrBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+        end
+      end
+      object Marker1Gb2: TGroupBox
+        Left = 320
+        Height = 280
+        Hint = 'Set the height of the Marker'
+        Top = 0
+        Width = 296
+        Caption = 'Marker 2'
+        ClientHeight = 250
+        ClientWidth = 292
+        TabOrder = 1
+        object Marker2EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Marker'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Marker2EnabledCbChange
+        end
+        object Marker2ColorCb: TColorBox
+          Left = 102
+          Height = 26
+          Hint = 'Set Marker Color'
+          Top = 25
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Marker2ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Marker2ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Marker2WidthLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 48
+          Width = 48
+          Caption = 'Width'
+        end
+        object Marker2HeightLbl: TLabel
+          Left = 153
+          Height = 25
+          Top = 48
+          Width = 53
+          Caption = 'Height'
+        end
+        object Marker2RadiusSpe: TSpinEditEx
+          Left = 104
+          Height = 33
+          Hint = 'Marker Radius'
+          Top = 120
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          OnChange = Marker2RadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker2RadiusLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 120
+          Width = 53
+          Caption = 'Radius'
+        end
+        object Marker2StyleCb: TComboBox
+          Left = 102
+          Height = 33
+          Hint = 'Marker Style '#13#10'msCenter - Point centered on value'#13#10'msLeft - Left Edge Centered on value'#13#10'msRight - Right Centered on value'
+          Top = 160
+          Width = 150
+          ItemHeight = 25
+          Items.Strings = (
+            'msCenter'
+            'msLeft'
+            'msRight'
+          )
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Marker2StyleCbChange
+        end
+        object Marker2StyleLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 168
+          Width = 37
+          Caption = 'Style'
+        end
+        object Marker2WidthSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Width of the marker'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Marker2WidthSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker2HeightSpe: TSpinEditEx
+          Left = 152
+          Height = 33
+          Hint = 'Height of the Marker'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          OnChange = Marker2HeightSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker2ValueSpe: TFloatSpinEditEx
+          Left = 102
+          Height = 33
+          Hint = 'Value of the marker, not the scale setting. Matches Gauge scaling'
+          Top = 208
+          Width = 104
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Marker2ValueSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+        end
+        object Marker2ValueLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 216
+          Width = 42
+          Caption = 'Value'
+        end
+        object Marker2ValueClrBtn: TBitBtn
+          Left = 208
+          Height = 37
+          Hint = 'Reset Marker to Zero'
+          Top = 208
+          Width = 33
+          Images = ImageList1
+          ImageIndex = 13
+          OnClick = Marker2ValueClrBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+        end
+      end
+      object Marker1Gb3: TGroupBox
+        Left = 8
+        Height = 280
+        Hint = 'Set the height of the Marker'
+        Top = 280
+        Width = 296
+        Caption = 'Marker 3'
+        ClientHeight = 250
+        ClientWidth = 292
+        TabOrder = 2
+        object Marker3EnabledCb: TCheckBox
+          Left = 11
+          Height = 29
+          Hint = 'Enable or Disable this Marker'
+          Top = -8
+          Width = 88
+          Caption = 'Enabled'
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 0
+          OnChange = Marker3EnabledCbChange
+        end
+        object Marker3ColorCb: TColorBox
+          Left = 102
+          Height = 26
+          Hint = 'Set Marker Color'
+          Top = 25
+          Width = 160
+          Style = [cbStandardColors, cbExtendedColors, cbCustomColor]
+          ColorDialog = ColorDialog1
+          ItemHeight = 20
+          OnChange = Marker3ColorCbChange
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+        end
+        object Marker3ColorLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 25
+          Width = 43
+          Caption = 'Color'
+        end
+        object Marker3WidthLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 48
+          Width = 48
+          Caption = 'Width'
+        end
+        object Marker3HeightLbl: TLabel
+          Left = 153
+          Height = 25
+          Top = 48
+          Width = 53
+          Caption = 'Height'
+        end
+        object Marker3RadiusSpe: TSpinEditEx
+          Left = 102
+          Height = 33
+          Hint = 'Marker Radius'
+          Top = 120
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 2
+          OnChange = Marker3RadiusSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker3RadiusLbl: TLabel
+          Left = 8
+          Height = 25
+          Top = 120
+          Width = 53
+          Caption = 'Radius'
+        end
+        object Marker3StyleCb: TComboBox
+          Left = 102
+          Height = 33
+          Hint = 'Marker Style '#13#10'msCenter - Point centered on value'#13#10'msLeft - Left Edge Centered on value'#13#10'msRight - Right Centered on value'
+          Top = 160
+          Width = 150
+          ItemHeight = 25
+          Items.Strings = (
+            'msCenter'
+            'msLeft'
+            'msRight'
+          )
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 3
+          OnChange = Marker3StyleCbChange
+        end
+        object Marker3StyleLbl: TLabel
+          Left = 11
+          Height = 25
+          Top = 168
+          Width = 37
+          Caption = 'Style'
+        end
+        object Marker3WidthSpe: TSpinEditEx
+          Left = 11
+          Height = 33
+          Hint = 'Start Width of the marker'
+          Top = 72
+          Width = 97
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 4
+          OnChange = Marker3WidthSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker3HeightSpe: TSpinEditEx
+          Left = 152
+          Height = 33
+          Hint = 'Height of the Marker'
+          Top = 72
+          Width = 96
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 5
+          OnChange = Marker3HeightSpeChange
+          MaxValue = 1000
+          MinRepeatValue = 10
+          NullValue = 0
+          Value = 0
+        end
+        object Marker3ValueSpe: TFloatSpinEditEx
+          Left = 102
+          Height = 33
+          Hint = 'Value of the marker, not the scale setting. Matches Gauge scaling'
+          Top = 208
+          Width = 104
+          MaxLength = 0
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 6
+          OnChange = Marker3ValueSpeChange
+          MaxValue = 1000
+          MinValue = -1000
+          MinRepeatValue = 10
+        end
+        object Marker3ValueLbl: TLabel
+          Left = 9
+          Height = 25
+          Top = 216
+          Width = 42
+          Caption = 'Value'
+        end
+        object Marker3ValueClrBtn: TBitBtn
+          Left = 208
+          Height = 37
+          Hint = 'Reset Marker to Zero'
+          Top = 208
+          Width = 33
+          Images = ImageList1
+          ImageIndex = 13
+          OnClick = Marker3ValueClrBtnClick
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 7
+        end
+      end
+      object MarkerRandomTestBtn: TBitBtn
+        Left = 320
+        Height = 48
+        Top = 300
+        Width = 360
+        Caption = 'Toggle Random Test (Enables Markers)'
+        Images = ImageList1
+        ImageIndex = 12
+        OnClick = MarkerRandomTestBtnClick
+        TabOrder = 3
+      end
+      object MarkerZeroAllBtn: TBitBtn
+        Left = 320
+        Height = 45
+        Top = 352
+        Width = 360
+        Caption = 'Zero All Marker Values'
+        Images = ImageList1
+        ImageIndex = 7
+        OnClick = MarkerZeroAllBtnClick
+        TabOrder = 4
+      end
+      object MarkerMemo: TMemo
+        Left = 320
+        Height = 280
+        Top = 512
+        Width = 416
+        Font.CharSet = ANSI_CHARSET
+        Font.Height = -16
+        Font.Pitch = fpVariable
+        Font.Quality = fqDraft
+        Lines.Strings = (
+          '''Random Test'' button to see marker movement'
+          '   Red - Local Minimum '
+          '   Green - Local Maximum'
+          '   Yellow - Maximum Peak (does not go down)'
+          ''
+          'Each Marker has a Value, this can also be set, or just hit the ERASER button to reset to 0'
+          'OR hit ''Zero All Marker Value Button'' to reset all at once'
+          ''
+          'This uses the Main Toggle Random Button State so will interact with it.'
+        )
+        ParentFont = False
+        TabOrder = 5
+      end
+      object DisableAllMarkersBtn: TBitBtn
+        Left = 320
+        Height = 45
+        Top = 448
+        Width = 360
+        Caption = 'Disable All Markers'
+        Images = ImageList1
+        ImageIndex = 6
+        OnClick = DisableAllMarkersBtnClick
+        TabOrder = 6
+      end
+      object EnableAllMarkersBtn: TBitBtn
+        Left = 320
+        Height = 45
+        Top = 400
+        Width = 360
+        Caption = 'Enable All Markers'
+        Images = ImageList1
+        ImageIndex = 8
+        OnClick = EnableAllMarkersBtnClick
+        TabOrder = 7
+      end
+    end
+  end
+  object GroupBox4: TGroupBox
+    Left = 8
+    Height = 368
+    Top = 464
+    Width = 540
+    Caption = 'Set Gauge Value'
+    ClientHeight = 338
+    ClientWidth = 536
+    TabOrder = 1
+    object BGRAKnob: TBGRAKnob
+      Left = 32
+      Height = 104
+      Top = 24
+      Width = 112
+      CurveExponent = 0.200000002980232
+      MinValue = -10
+      MaxValue = 110
+      Value = 0
+      OnValueChanged = BGRAKnobValueChanged
+      WheelSpeed = 1
+      SlowSnap = True
+    end
+    object GaugeValLbl: TLabel
+      Left = 232
+      Height = 25
+      Top = 56
+      Width = 93
+      Caption = 'GaugeValue'
+    end
+    object KnobValLbl: TLabel
+      Left = 232
+      Height = 25
+      Top = 32
+      Width = 84
+      Caption = 'KnobValue'
+    end
+    object Label6: TLabel
+      Left = 168
+      Height = 25
+      Top = 80
+      Width = 64
+      Caption = 'Range : '
+    end
+    object OutOfRangeLbl: TLabel
+      Left = 232
+      Height = 25
+      Top = 80
+      Width = 79
+      Caption = 'Range OK'
+    end
+    object Label1: TLabel
+      Left = 168
+      Height = 25
+      Top = 32
+      Width = 51
+      Caption = 'Knob :'
+    end
+    object GaugeLbl: TLabel
+      Left = 168
+      Height = 25
+      Top = 56
+      Width = 60
+      Caption = 'Gauge :'
+    end
+    object RandomBtn: TBitBtn
+      Left = 32
+      Height = 38
+      Hint = 'Toggles Random Values'
+      Top = 216
+      Width = 152
+      Caption = 'Toggle Random'
+      Images = ImageList1
+      ImageIndex = 14
+      OnClick = RandomBtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 0
+    end
+    object PerfTestBtn: TBitBtn
+      Left = 32
+      Height = 38
+      Hint = 'Runs a performance test.'
+      Top = 256
+      Width = 152
+      Caption = 'Perf Test'
+      Images = ImageList1
+      ImageIndex = 15
+      OnClick = PerfTestBtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 1
+    end
+    object OverloadPosBtn: TBitBtn
+      Left = 184
+      Height = 38
+      Hint = 'Force an overload with large positive number.'#13#10'May not work if Maximum Value is over this.'#13#10#13#10'Note : When an overload occurs, the gauges value '#13#10'is reset to the min or max value depending on'#13#10'the direction of the overload'
+      Top = 216
+      Width = 152
+      Caption = 'Overload Pos'
+      Images = ImageList1
+      ImageIndex = 0
+      OnClick = OverloadPosBtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 2
+    end
+    object OverloadNegBtn: TBitBtn
+      Left = 184
+      Height = 38
+      Hint = 'Force an overload with large negative  number.'#13#10'May not work if Minimum Value is unser this.'#13#10#13#10'Note : When an overload occurs, the gauges value '#13#10'is reset to the min or max value depending on'#13#10'the direction of the overload'
+      Top = 256
+      Width = 152
+      Caption = 'Overload Neg'
+      Images = ImageList1
+      ImageIndex = 1
+      OnClick = OverloadNegBtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 3
+    end
+    object MinValueBtn: TBitBtn
+      Left = 336
+      Height = 38
+      Top = 216
+      Width = 152
+      Caption = 'Min Value'
+      Images = ImageList1
+      ImageIndex = 5
+      OnClick = MinValueBtnClick
+      TabOrder = 4
+    end
+    object MaxValueBtn: TBitBtn
+      Left = 336
+      Height = 38
+      Top = 256
+      Width = 152
+      Caption = 'Max Value'
+      Images = ImageList1
+      ImageIndex = 4
+      OnClick = MaxValueBtnClick
+      TabOrder = 5
+    end
+    object Label3: TLabel
+      Left = 168
+      Height = 25
+      Top = 104
+      Width = 123
+      Caption = 'User To Gauge :'
+    end
+    object UserToGaugeLbl: TLabel
+      Left = 296
+      Height = 25
+      Top = 103
+      Width = 127
+      Caption = 'UserToGaugeLbl'
+    end
+    object MinLbl: TLabel
+      Left = 168
+      Height = 25
+      Top = 152
+      Width = 72
+      Caption = 'Min Val : '
+    end
+    object MinValLbl: TLabel
+      Left = 248
+      Height = 25
+      Top = 152
+      Width = 123
+      Caption = 'Minimum Value'
+    end
+    object ValuePlus1Btn: TBitBtn
+      Left = 32
+      Height = 38
+      Hint = 'Add 1 to Value'
+      Top = 296
+      Width = 56
+      Caption = '1'
+      Images = ImageList1
+      ImageIndex = 0
+      OnClick = ValuePlus1BtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 6
+    end
+    object ValueMinus1Btn: TBitBtn
+      Left = 88
+      Height = 38
+      Hint = 'Subtract 1 from Value'
+      Top = 296
+      Width = 56
+      Caption = '1'
+      Images = ImageList1
+      ImageIndex = 1
+      OnClick = ValueMinus1BtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 7
+    end
+    object ValueZeroBtn: TBitBtn
+      Left = 256
+      Height = 38
+      Hint = 'Runs a performance test.'
+      Top = 296
+      Width = 80
+      Caption = 'Zero'
+      Images = ImageList1
+      ImageIndex = 6
+      OnClick = ValueZeroBtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 8
+    end
+    object ValuePlus10Btn: TBitBtn
+      Left = 144
+      Height = 38
+      Hint = 'Add 10 to Value'
+      Top = 296
+      Width = 56
+      Caption = '10'
+      Images = ImageList1
+      ImageIndex = 0
+      OnClick = ValuePlus10BtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 9
+    end
+    object ValueMinus10Btn: TBitBtn
+      Left = 200
+      Height = 38
+      Hint = 'Subtract 10 from Value'
+      Top = 296
+      Width = 56
+      Caption = '10'
+      Images = ImageList1
+      ImageIndex = 1
+      OnClick = ValueMinus10BtnClick
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 10
+    end
+    object RoundBtn: TButton
+      Left = 336
+      Height = 38
+      Hint = 'Try to Round Gauge Value.'#13#10'Does Nothing IF ''Try to Round CB is checked'''
+      Top = 296
+      Width = 153
+      Caption = 'Round Value'
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 11
+      OnClick = RoundBtnClick
+    end
+    object MaxLbl: TLabel
+      Left = 168
+      Height = 25
+      Top = 176
+      Width = 75
+      Caption = 'Max Val : '
+    end
+    object MaxValLbl: TLabel
+      Left = 248
+      Height = 25
+      Top = 176
+      Width = 126
+      Caption = 'Maximum Value'
+    end
+    object TryToRoundValueCb: TCheckBox
+      Left = 344
+      Height = 29
+      Hint = 'Forces knob (and callers of the knob onchange rounting) '#13#10'to always force a Round number. This is not always'#13#10'possible due to floating point limitations.'
+      Top = 32
+      Width = 186
+      Caption = 'Always try to Round'
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 12
+    end
+    object uELED1: TuELED
+      Left = 32
+      Height = 36
+      Hint = 'Random Mode Indicator'
+      Top = 176
+      Width = 36
+      Debug = False
+      Active = False
+      LedType = ledRound
+      Bright = True
+      Reflection = True
+      Color = clLime
+      ParentColor = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+    object uELED2: TuELED
+      Left = 72
+      Height = 36
+      Hint = 'Overload Mode Indicator'
+      Top = 176
+      Width = 36
+      Debug = False
+      Active = False
+      LedType = ledRound
+      Bright = True
+      Reflection = True
+      Color = clRed
+      ParentColor = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+  end
+  object SuperGauge: TSuperGauge
+    Left = 40
+    Height = 360
+    Top = 25
+    Width = 360
+    FaceSettings.FillStyle = fsGradient
+    FaceSettings.InnerColor = clGray
+    FaceSettings.OuterColor = clBlack
+    FaceSettings.Picture.Data = {
+      07544269746D617036400000424D364000000000000036000000280000004000
+      0000400000000100200000000000004000006400000064000000000000000000
+      00008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF007F7FFF008080FF007F7FFF007F7FFF008080FF008080FF007D7D
+      FF028181FF028F8FFF008585FF008080FF006C6CFF056666FF078080FF008383
+      FF008F8FFF008282FF007D7DFF037F7FFF008080FF007F7FFF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007F7FFF008181FF008383FF007F7FFF027D7DFF038787
+      FF007676FF003F3FFF4C1515FFA50505FFD80101FFF10000FFF40505FFE11010
+      FFB63838FF647070FF0B8787FF008080FF017F7FFF008080FF007F7FFF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF007F7FFF007F7FFF008181FF007676FF0A6E6EFF0A8282FF008989FF004B4B
+      FF300B0BFFBF0000FFFF0000FFFF0000FFFF0101FFFE0202FFFE0000FFFF0000
+      FFFF0000FFFF0606FFDA3E3EFF547F7FFF008181FF027E7EFF008080FF007F7F
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF007D7DFF028888FF002929FF700101FFDE1E1EFF9F3030FF7E0000
+      FFF40000FFFF0202FFF90000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0303FFF90000FFFF0000FFFF1B1BFF7A7D7DFF008181FF027F7FFF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF007F7FFF008080FF017C7CFF000E0EFFB20000FFFF0000FFFF0000FFFF0000
+      FFFF0101FFFA0000FFFF0000FFE41919FF944040FF644343FF5F2222FF850707
+      FFD30000FFFF0101FFFC0202FFFB0000FFFF3333FF638686FF007E7EFF017F7F
+      FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF007E7EFF008585FF006767FF0B0000FFE40000FFFD0101FFF90101FFFB0101
+      FFFB0000FFFF1515FF936A6AFF118282FF008989FF008888FF008787FF007474
+      FF032828FF6E0000FFFB0000FFFB0101FFFC0000FFF55454FF228686FF047B7B
+      FF037F7FFF007F7FFF007F7FFF007F7FFF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007F7F
+      FF007E7EFF018888FF004A4AFF370000FFFE0202FFFD0000FFFE0000FFFB0000
+      FFFF1616FF8D7D7DFF008686FF007E7EFF037E7EFF037E7EFF037E7EFF038282
+      FF008B8BFF003939FF5A0000FFFE0101FFFA0000FFFF1818FF9A8989FF008888
+      FF008484FF008080FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF007D7DFF028787FF002A2AFF720000FFFE0101FFFA0000FFFC0000FFFE0707
+      FFD46F6FFF038585FF027C7CFF018080FF008080FF007F7FFF008080FF007E7E
+      FF008080FF047F7FFF000E0EFFA60000FFFF0101FFFB0202FFF32B2BFF735050
+      FF366B6BFF0D7E7EFF008080FF007F7FFF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007F7F
+      FF008181FF017C7CFF000E0EFFB00000FFFE0000FFFB0101FFFA0000FFFF2E2E
+      FF708888FF007C7CFF038080FF007F7FFF008080FF008080FF007F7FFF008080
+      FF007C7CFF028888FF014A4AFF3C0000FFFE0101FFFC0000FFFF0000FFFF0000
+      FFFF0C0CFFB17979FF008181FF017E7EFF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007D7D
+      FF008686FF006565FF090101FFE40000FFFF0000FFFC0202FFFD0000FFFE5050
+      FF3B8787FF007D7DFF027F7FFF008080FF008080FF008080FF008080FF007F7F
+      FF007E7EFF018686FF006363FF130000FFED0000FFFF0000FFFC0202FFF60202
+      FFFE2525FF908787FF007D7DFF028080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007C7C
+      FF028989FF005353FF320000FFFB0101FFFC0000FFFD0101FFFF0000FFFF5252
+      FF328787FF007D7DFF017F7FFF008080FF008080FF008080FF008080FF008080
+      FF007E7EFF008686FF005F5FFF0C0000FFE50000FFFF0000FFFC0101FFFB0000
+      FFFF4646FF4D8989FF007D7DFF027F7FFF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007C7C
+      FF048989FF002D2DFF7C0000FFFF0000FFFF0000FFFD0202FFFB0000FFFE4848
+      FF4C8787FF017C7CFF038080FF007F7FFF008080FF008080FF008080FF007F7F
+      FF007D7DFF018686FF006161FF200000FFF60101FFFE0000FFFD0000FFFE0000
+      FFF46363FF1A8686FF007D7DFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF007F7FFF007F7F
+      FF028181FF003B3BFF501212FFB10000FFE30000FFFF0101FFF90000FFFF1D1D
+      FF9A8787FF007D7DFF047F7FFF008080FF007F7FFF008080FF007F7FFF008080
+      FF007C7CFF038A8AFF003232FF620000FFFF0101FFFB0000FFFC0000FFFF0D0D
+      FFC97A7AFF008181FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF007F7FFF008080
+      FF007F7FFF008585FF007E7EFF006C6CFF0D1313FFB50000FFFF0202FFFB0000
+      FFF54E4EFF2C8B8BFF007C7CFF047E7EFF007F7FFF007F7FFF007F7FFF007B7B
+      FF038B8BFF006363FF090202FFD80000FFFE0000FFFC0101FFFA0000FFFE1C1C
+      FF8E8585FF007F7FFF028080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF007F7F
+      FF008080FF007F7FFF027E7EFF048C8CFF004F4FFF320000FFFD0101FFFB0000
+      FFFF0000FFD65252FF1D8C8CFF008585FF008181FF008181FF008585FF008A8A
+      FF006969FF081414FFAF0000FFFF0101FFFC0000FFFF0202FFFC0000FFFF3A3A
+      FF508989FF007D7DFF027F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF007F7FFF007F7FFF007E7EFF008080FF027676FF000909FFC10000FFFF0000
+      FFFA0000FFFF0000FFE43030FF646666FF157A7AFF007D7DFF006969FF0D3838
+      FF4E0202FFCB0000FFFF0101FFF90000FFFF0000FFFE0202FFFB0000FFF25A5A
+      FF1B8787FF007D7DFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007C7CFF038A8AFF003232FF6B0000FFFF0101
+      FFFB0000FFFC0000FFFF0000FFFF0000FFEC0E0EFFC91111FFC70000FFE40000
+      FFFF0000FFFF0101FFF90000FFFF0000FFFF0000FFFB0000FFFF0404FFD27474
+      FF008282FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007F7FFF007D7DFF028787FF005252FF2E0000FFFC0101
+      FFFD0000FFFE0000FFFD0101FFFB0000FFFF0000FFFF0000FFFF0000FFFF0101
+      FFFC0101FFF80000FFFF0404FFCE5252FF3B5A5AFF2A3636FF752D2DFF5E8282
+      FF007F7FFF018080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF018585FF006767FF0A0000FFE50000
+      FFFF0000FFFD0000FFFE0000FFFE0000FFFE0000FFFC0000FFFC0000FFFD0101
+      FFFB0000FFFF1212FFAA6262FF0C8B8BFF008686FF008787FF008484FF007F7F
+      FF008080FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF008080FF007C7CFF000E0EFFCB0000
+      FFFE0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0101FFFB0000
+      FFFF1A1AFFA57C7CFF008585FF007C7CFF027E7EFF017E7EFF037F7FFF027F7F
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007F7FFF007F7FFF007F7FFF001010FFB80000
+      FFFF0101FFFB0000FFFF0000FFFF0000FFFE0000FFFF0000FFFC0000FFFF0606
+      FFC17070FF028787FF007D7DFF018080FF007F7FFF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF008080FF017E7EFF000F0FFFB50000
+      FFFF0000FFFB0000FFFF0000FFFF0000FFFF0000FFFD0101FFFC0000FFEB5757
+      FF1C8787FF007C7CFF018080FF007F7FFF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007F7FFF007F7FFF008080FF001010FFBE0000
+      FFFF0101FFFB0000FFFF0000FFFE0000FFFE0000FFFB0000FFFF2A2AFF668989
+      FF007C7CFF037F7FFF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF008181FF007777FF000C0CFFD50000
+      FFFE0000FFFC0000FFFF0000FFFF0000FFFC0000FFFE0101FFD36969FF038585
+      FF017D7DFF008080FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF018585FF006464FF120000FFEC0000
+      FFFF0000FFFD0000FFFF0000FFFE0101FFFB0000FFFF2B2BFF638888FF007D7D
+      FF028080FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007D7DFF028787FF005555FF300000FFFD0101
+      FFFE0000FFFE0000FFFE0000FFFD0000FFFE0000FFEB6767FF118585FF007E7E
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007F7FFF007C7CFF038A8AFF003939FF590000FFFF0202
+      FFFB0000FFFE0000FFFF0000FFFA0000FFFE1515FFA38181FF007E7EFF027F7F
+      FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF007E7EFF048585FF002020FF890000FFFE0101
+      FFFA0000FFFF0000FFFE0101FFFC0000FFFF3E3EFF528888FF007D7DFF028080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007F7FFF008080FF017C7CFF000F0FFFBA0000FFFE0000
+      FFFB0000FFFE0000FFFD0000FFFF0000FFED6666FF128585FF007D7DFF007F7F
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007E7EFF008383FF006A6AFF0A0000FFE40000FFFF0000
+      FFFD0000FFFE0000FFFB0000FFFE1414FFB18080FF007F7FFF017F7FFF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF007D7DFF018787FF005252FF2E0000FFFD0101FFFE0000
+      FFFE0000FFFF0101FFFB0000FFFF3030FF688787FF007D7DFF028080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF007F7FFF007D7DFF028888FF003C3CFF610000FFFF0202FFFB0000
+      FFFF0000FFFE0000FFFE0000FFFA5B5BFF268686FF007D7DFF017F7FFF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007F7FFF007F7F
+      FF017F7FFF017F7FFF017F7FFF017F7FFF008080FF007F7FFF008080FF008080
+      FF008080FF008080FF007E7EFF028383FF001F1FFF980000FFFE0101FFFB0000
+      FFFE0000FFFC0000FFFF0505FFD17272FF028181FF017D7DFF027F7FFF017F7F
+      FF017F7FFF008080FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF007F7FFF008080FF008585
+      FF008585FF008585FF008585FF008181FF007F7FFF008080FF008080FF008080
+      FF008080FF007E7EFF008282FF007575FF010606FFCC0000FFFE0000FFFC0000
+      FFFF0101FFFA0000FFFE2424FF908686FF008282FF008585FF008585FF008585
+      FF008383FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007D7DFF006A6A
+      FF216A6AFF286B6BFF266A6AFF297878FF0B8181FF007F7FFF008080FF008080
+      FF008080FF007D7DFF008686FF005A5AFF1B0000FFF40000FFFF0000FFFD0000
+      FFFE0101FFFC0000FFFF4444FF4D8989FF006A6AFF1C6A6AFF2A6B6BFF266A6A
+      FF2A7474FF148181FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007D7DFF008484FF006F6FFF030000
+      FFD80000FFFF0000FFFB0000FFFF5555FF438888FF007E7EFF027F7FFF008080
+      FF007F7FFF007D7DFF028989FF004444FF4C0000FFFF0202FFFC0000FFFE0000
+      FFFD0000FFFE0000FFF06464FF188585FF010E0EFFA00000FFFF0101FFF80000
+      FFFF3737FF838A8AFF007C7CFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008383FF007070FF040101
+      FFD70000FFFE0202FFF80000FFFE3F3FFF4F8A8AFF027C7CFF047F7FFF007F7F
+      FF007F7FFF007C7CFF028787FF002929FF840101FFFD0202FFF90101FFFD0202
+      FFFA0101FFFD0B0BFFBF7979FF018282FF001010FFAF0000FFFE0303FFF70000
+      FFFE3939FF828989FF007D7DFF038080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF030101
+      FFD70000FFFE0101FFF80000FFFF1010FFAB7C7CFF008686FF008181FF028383
+      FF028282FF028484FF037B7BFF030707FFC70000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF2424FF829595FF005959FF1E0101FFED0000FFFE0202FFF90000
+      FFFF3939FF828A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFD0000FFFF1F1FFF816F6FFF0B7676FF007474
+      FF007575FF007676FF006F6FFF004A4AFF244B4BFF2C4B4BFF2A4B4BFF2B4B4B
+      FF2A4A4AFF2D6161FF0B5959FF280606FFC80000FFFF0000FFFC0101FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFE0000FFFE0000FFFF0000FFE10505FFBA0404
+      FFB90404FFB90404FFB90505FFB90D0DFFAE0D0DFFAC0D0DFFAC0D0DFFAC0D0D
+      FFAC0D0DFFAA0A0AFFBF0000FFF90000FFFF0000FFFD0000FFFF0202FFFA0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFB0000FFFF0000FFFE0101FFFC0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0101FFFF0000FFFC0000FFFF0000FFFE0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFE0000FFFE0000FFFE0000FFFD0000FFFC0000
+      FFFC0000FFFC0000FFFC0000FFFC0000FFFC0000FFFC0000FFFC0000FFFC0000
+      FFFC0000FFFC0000FFFC0000FFFE0000FFFF0000FFFE0000FFFE0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFE0000FFFE0000FFFE0000FFFD0101FFFB0101FFFB0000FFFE0000FFFF0000
+      FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFE0000
+      FFFF0000FFFF0000FFFD0000FFFF0000FFFF0000FFFF0000FFFF0000FFFD0000
+      FFFF0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFE0000FFFD0000FFFF0303FFD62626FF9C1D1DFFAA0000FFF40000FFFF0000
+      FFFD0000FFFF0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFE0000
+      FFFC0000FFFF1616FF967171FF088686FF008383FF005757FF2A0707FFD90000
+      FFFE0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFC0000
+      FFFE0101FFDA6D6DFF028888FF007C7CFF047C7CFF058F8FFF004646FF470000
+      FFFE0101FFFC0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFA0000
+      FFFF1F1FFF9D8585FF017D7DFF037F7FFF007D7DFF008484FF015F5FFF0F0000
+      FFED0000FFFF0000FFFD0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFB0000
+      FFFF1313FFB18282FF007E7EFF057D7DFF007B7BFF038787FF035E5EFF1A0000
+      FFF40101FFFE0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF040101
+      FFD80000FFFF0000FFFC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFD0101
+      FFFD0000FFF55353FF2B8E8EFF008686FF008888FF008484FF002323FF830000
+      FFFF0101FFFB0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0202FFFB0000
+      FFFF3939FF838A8AFF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008484FF007070FF030101
+      FFD60000FFFD0000FFFA0000FFFD0000FFFD0000FFFD0000FFFD0000FFFD0000
+      FFFB0000FFFE0101FFDF3C3CFF515959FF145959FF212121FF820000FFFC0000
+      FFFB0000FFFC0000FFFD0000FFFD0000FFFD0000FFFD0000FFFD0202FFF90000
+      FFFD3939FF828A8AFF007D7DFF038080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008383FF007070FF040101
+      FFDE0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFF90000FFFF0000FFFF0101FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0202FFFF0000
+      FFFF3939FF868989FF007D7DFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007D7DFF008484FF006F6FFF030000
+      FFC30000FFE70000FFE40000FFE70000FFE70000FFE70000FFE70000FFE70000
+      FFE60000FFE70000FFE50000FFE40000FFEA0000FFE80000FFE30000FFE60000
+      FFE70000FFE70000FFE70000FFE70000FFE70000FFE70000FFE70000FFE30000
+      FFE73535FF768A8AFF007C7CFF038080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007D7DFF006E6E
+      FF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6D
+      FF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6D
+      FF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006D6DFF006E6EFF006D6D
+      FF007575FF008181FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008181FF007878FF014646
+      FF4B4545FF5A4545FF584545FF594545FF594545FF594545FF594545FF594545
+      FF594545FF594545FF594545FF594545FF594545FF594545FF594545FF594545
+      FF594545FF594545FF594545FF594545FF594545FF594545FF594646FF584545
+      FF5B5F5FFF2E8484FF007E7EFF018080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007D7DFF008484FF006D6DFF040000
+      FFF20000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF2D2DFF938B8BFF007C7CFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008181FF007A7AFF015555
+      FF455555FF545555FF515555FF525555FF525555FF525555FF525555FF525555
+      FF525555FF525555FF525555FF525555FF525555FF525555FF525555FF525555
+      FF525555FF525555FF525555FF525555FF525555FF525555FF525555FF515555
+      FF566868FF2A8383FF007E7EFF018080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007F7FFF007E7E
+      FF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7D
+      FF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7D
+      FF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007D7DFF007E7EFF007D7D
+      FF007E7EFF008080FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007E7EFF008383FF007070FF030303
+      FFC70202FFEC0202FFE80202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202
+      FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202
+      FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0202FFEB0404FFE70202
+      FFEF3A3AFF788989FF007D7DFF038080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007D7DFF008484FF006F6FFF040000
+      FFDD0000FFFF0000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0101FFFD0000
+      FFFF3838FF878A8AFF007C7CFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007D7DFF008383FF007070FF030000
+      FFD80000FFFF0000FFFF0000FFFF0202FFFD0202FFF90202FFFA0101FFFA0101
+      FFFB0101FFFB0101FFFC0000FFFC0000FFFC0000FFFC0101FFFC0101FFFC0101
+      FFFB0101FFFA0101FFFA0202FFF90202FFFA0101FFFF0000FFFF0000FFFF0000
+      FFFF3636FF808A8AFF007C7CFF048080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007E7EFF005252
+      FF2B3535FF721010FFB30000FFE50000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFF90505FFD41D1DFF9C3C3C
+      FF566E6EFF118282FF007E7EFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF007F7FFF008080FF008888
+      FF008888FF007B7BFF006565FF104F4FFF373B3BFF662525FF8F1616FFB30808
+      FFC80808FFD90909FFE50505FFEC0000FFEE0101FFEE0808FFEA0808FFE10808
+      FFD30B0BFFC12222FFA82424FF7E4444FF565656FF277272FF048383FF008888
+      FF008383FF007F7FFF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF007F7FFF008080FF007F7FFF007C7C
+      FF037C7CFF078282FF038A8AFF009292FF008F8FFF009090FF007C7CFF006B6B
+      FF006A6AFF0F6F6FFF1F5252FF282828FF2E3535FF2C6C6CFF256B6BFF196B6B
+      FF086E6EFF008C8CFF008E8EFF009090FF008F8FFF008585FF007E7EFF057C7C
+      FF067E7EFF018080FF007F7FFF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF008080FF008080FF008080FF008080FF008080FF008080FF008080FF008080
+      FF00
+    }
+    FaceSettings.PictureEnabled = False
+    FaceSettings.PictureOffsetX = -25
+    FaceSettings.PictureOffsetY = 75
+    BandSettings1.Enabled = True
+    BandSettings1.EndValue = 45
+    BandSettings1.EnableText = True
+    BandSettings1.Text = 'GOOD'
+    BandSettings1.TextFont = 'default'
+    BandSettings1.TextStyle = [fsBold]
+    BandSettings1.TextRadius = 100
+    BandSettings1.TextColor = clWhite
+    BandSettings1.Thickness = 40
+    BandSettings1.BandRadius = 100
+    BandSettings1.BandColor = clGreen
+    BandSettings2.Enabled = True
+    BandSettings2.StartValue = 45
+    BandSettings2.EndValue = 55
+    BandSettings2.EnableText = True
+    BandSettings2.Text = '?'
+    BandSettings2.TextFont = 'default'
+    BandSettings2.TextStyle = [fsBold]
+    BandSettings2.TextRadius = 100
+    BandSettings2.TextColor = clBlack
+    BandSettings2.Thickness = 40
+    BandSettings2.BandRadius = 100
+    BandSettings2.BandColor = clYellow
+    BandSettings3.Enabled = True
+    BandSettings3.StartValue = 55
+    BandSettings3.EnableText = True
+    BandSettings3.Text = 'BAD'
+    BandSettings3.TextFont = 'default'
+    BandSettings3.TextStyle = [fsBold]
+    BandSettings3.TextRadius = 100
+    BandSettings3.TextColor = clWhite
+    BandSettings3.Thickness = 40
+    BandSettings3.BandRadius = 100
+    BandSettings3.BandColor = clRed
+    BandSettings4.EnableText = False
+    BandSettings4.Text = 'Band 4'
+    BandSettings4.TextFont = 'default'
+    BandSettings4.TextStyle = [fsBold]
+    BandSettings4.TextRadius = 100
+    BandSettings4.TextColor = clBlack
+    BandSettings4.Thickness = 40
+    BandSettings4.BandRadius = 100
+    BandSettings4.BandColor = clGreen
+    TextSettings1.Enabled = True
+    TextSettings1.FontEx.Color = clWhite
+    TextSettings1.FontEx.FontQuality = fqSystemClearType
+    TextSettings1.FontEx.Height = 24
+    TextSettings1.FontEx.Shadow = False
+    TextSettings1.FontEx.ShadowRadius = 5
+    TextSettings1.FontEx.ShadowOffsetX = 5
+    TextSettings1.FontEx.ShadowOffsetY = 5
+    TextSettings1.FontEx.Style = [fsBold]
+    TextSettings1.Text = 'RPM'
+    TextSettings1.OffsetX = 0
+    TextSettings1.OffsetY = -40
+    TextSettings2.Enabled = True
+    TextSettings2.FontEx.Color = clWhite
+    TextSettings2.FontEx.FontQuality = fqSystemClearType
+    TextSettings2.FontEx.Height = 24
+    TextSettings2.FontEx.Shadow = False
+    TextSettings2.FontEx.ShadowRadius = 5
+    TextSettings2.FontEx.ShadowOffsetX = 5
+    TextSettings2.FontEx.ShadowOffsetY = 5
+    TextSettings2.FontEx.Style = [fsBold]
+    TextSettings2.Text = '--'
+    TextSettings2.OffsetX = 0
+    TextSettings2.OffsetY = 40
+    TextSettings3.FontEx.Color = clWhite
+    TextSettings3.FontEx.FontQuality = fqSystemClearType
+    TextSettings3.FontEx.Height = 16
+    TextSettings3.FontEx.Shadow = False
+    TextSettings3.FontEx.ShadowRadius = 5
+    TextSettings3.FontEx.ShadowOffsetX = 5
+    TextSettings3.FontEx.ShadowOffsetY = 5
+    TextSettings3.FontEx.Style = [fsBold]
+    TextSettings3.Text = 'x100'
+    TextSettings3.OffsetX = 0
+    TextSettings3.OffsetY = 60
+    FrameSettings.BorderRadius = 2
+    FrameSettings.FrameColor = clBlack
+    FrameSettings.BorderColor = clGray
+    ScaleSettings.TickColor = 8242399
+    ScaleSettings.TextColor = clSkyBlue
+    ScaleSettings.TextStyle = []
+    ScaleSettings.TextFont = 'default'
+    ScaleSettings.EnableMainTicks = True
+    ScaleSettings.EnableSubTicks = True
+    ScaleSettings.EnableScaleText = True
+    ScaleSettings.MainTickCount = 10
+    ScaleSettings.SubTickCount = 5
+    ScaleSettings.LengthMainTick = 15
+    ScaleSettings.LengthSubTick = 8
+    ScaleSettings.ThicknessMainTick = 3
+    ScaleSettings.ThicknessSubTick = 1
+    ScaleSettings.ScaleRadius = 153
+    RangeLedSettings.ActiveColor = clRed
+    RangeLedSettings.InactiveColor = clBlack
+    RangeLedSettings.BorderColor = clGray
+    RangeLedSettings.OffsetX = 90
+    RangeLedSettings.OffsetY = 120
+    RangeLedSettings.Style = lsFlat
+    RangeLedSettings.Active = False
+    RangeLedSettings.ActiveNoDoChange = False
+    RangeLedSettings.RangeStartValue = 55
+    RangeLedSettings.RangeType = rcBothInclusive
+    MarkerSettings1.Enabled = True
+    MarkerSettings1.Color = clLime
+    MarkerSettings1.Height = 20
+    MarkerSettings1.Radius = 165
+    MarkerSettings1.Width = 15
+    MarkerSettings1.Style = msRight
+    MarkerSettings2.Enabled = True
+    MarkerSettings2.Color = clRed
+    MarkerSettings2.Height = 20
+    MarkerSettings2.Radius = 165
+    MarkerSettings2.Width = 15
+    MarkerSettings2.Style = msLeft
+    MarkerSettings3.Enabled = True
+    MarkerSettings3.Color = clYellow
+    MarkerSettings3.Height = 15
+    MarkerSettings3.Radius = 169
+    MarkerSettings3.Width = 5
+    PointerSettings.Color = 4227327
+    PointerSettings.ExtensionLength = 10
+    PointerCapSettings.Radius = 20
+    OutOfRange = SuperGaugeOutOfRange
+    BackInRange = SuperGaugeBackInRange
+    RangeLEDActive = SuperGaugeRangeLEDActive
+    RangeLEDInactive = SuperGaugeRangeLEDInactive
+    OnDblClick = SuperGaugeDblClick
+  end
+  object Timer1: TTimer
+    Enabled = False
+    OnTimer = Timer1Timer
+    Left = 368
+    Top = 8
+  end
+  object ColorDialog1: TColorDialog
+    Color = clBlack
+    CustomColors.Strings = (
+      'ColorA=000000'
+      'ColorB=000080'
+      'ColorC=008000'
+      'ColorD=008080'
+      'ColorE=800000'
+      'ColorF=800080'
+      'ColorG=808000'
+      'ColorH=808080'
+      'ColorI=C0C0C0'
+      'ColorJ=0000FF'
+      'ColorK=00FF00'
+      'ColorL=00FFFF'
+      'ColorM=FF0000'
+      'ColorN=FF00FF'
+      'ColorO=FFFF00'
+      'ColorP=FFFFFF'
+      'ColorQ=C0DCC0'
+      'ColorR=F0CAA6'
+      'ColorS=F0FBFF'
+      'ColorT=A4A0A0'
+    )
+    Left = 448
+    Top = 312
+  end
+  object FontDialog1: TFontDialog
+    Font.CharSet = ANSI_CHARSET
+    Font.Name = 'Arial'
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    MinFontSize = 0
+    MaxFontSize = 0
+    Options = [fdNoFaceSel, fdNoSizeSel, fdNoStyleSel, fdNoVectorFonts]
+    PreviewText = 'Gauge'
+    Left = 448
+    Top = 232
+  end
+  object ImageList1: TBGRAImageList
+    UseBGRADraw = False
+    Left = 448
+    Top = 152
+    Bitmap = {
+      4C7A100000001000000010000000611600000000000078DAED9B0B5C4ED9FAC7
+      776F737119628ECC8C199718CC08E18C19CC4C62189719D78663308C5B382E43
+      A4DC2A9752547289081DB98F4BA84C88123A2E6FE1AD7457E99E222AEA8D7EFF
+      E759ED376FAF423EFFCFE77FE67F667F3EBFCFDA7BADE7BBD6B3D77A9EB5F7EE
+      2249FF994790C3B832958F2D54BB972168F5CF65B5E555BB9703091781B810A8
+      BC17A3D6BCF712202608883E0DD5CE45B5E78941E429E0961F545E96AFE48356
+      8D2953EDB21163A9762C44EE1F9BCB71C317083F825C3FD772D5D6D9506D9905
+      95C74C04D90E2B7BD9781A0ED70F0157F703577C80306FE0D20E20741B549BA6
+      BDE08FCA6BC12B39847800E73742B561F20B7CD00AF332D5B6DFA0F29C0BF635
+      E7984325977BD8AE5CB571AAE054EE9310B4F48757AEA76AB3C54BC77B25BF71
+      0A10B41E38B30EAAF5136BCFBBFF0A043A01A71CA0721D5F6B3E68C9A032E654
+      AEE310B4646099F4D7F1D7518BFCE77C546D9F0FED9CFA33E5BFC657D5E6E934
+      9E05B4F3FFECD2C1E57FADF87FC601E0459516374261AE391EE52E90652EEAAA
+      B3ADCA1922236E1B526FA84B2FEFC1637F27149D74C493D05D284F8D50539B27
+      D934A9813546467472E9E9F578E8D4070FECBB237F5957E45A7740E6FC36489B
+      DF1605876D4136A964DBE1C571A3539FEC9F8FA235BD51ECDC07454EA678B8B2
+      87E823C7EA33A4CF6981640B4364BB8FA23EA252AAF8413E9704AE27A6374ADC
+      0640BDE1072ABF4791EB40A8A3CEE0D1E1A5C898678494191F20E1D706B87F60
+      31901EEB59395774BFEC338FCB6CF9D69150BB0FC6939DF40C918F8223B6C47F
+      88C45F1B226EF2FB284F0957136BC0735B7AD947DC6FD11A5394B87E2F582E8B
+      1CBF1573A839EE1F5C22C6BF3D461F8567B680D66824AFCF633F27BACF2E283E
+      4039FC548D971DD9DBA723FA1F0AE4EDB582667D8B4E388A797EB467EE2BF9AC
+      6D53113D4A42DEBE45CC5BA2F09E39AF6FE6FCD6C8B66A4FFD18E39E4D475166
+      2F6C8F8774DF40B960737D2C85EF51C4179E95FDA7F9E3D848B76C87F4B92DC4
+      3C67CE6B2DCA6CC77E325B4EEC7CC48C7D478C1D33B1A13C7F4506620D682D1E
+      1EB517EBCB6B944AF32CCA39AD5078F528B2BD6654B0A3253176FE7E1B5EBFAD
+      5AF1D3846382632381D687D788E7397E427DC48EAB237CE671994D5F3B946330
+      E58538E698CC884AE2358A9FD2A48219ADA8E4622634A471ADAB8FDFCA3E8A9A
+      B05FE529116A5EDFBC7D56423C575C277CAE297FAAFA6240EB3252AC4FC51A8D
+      1475AFE2FECAFFCAFC2F3BED8AB2DBE750E0608A5C1BE3DAE57FE876395BCAF1
+      C8E31F221F383F5E27FFCB823655E65AC969373CB0FB42E452C66FCFC7AF29FF
+      1F9F58F5D2DC45592932DCCC6BCCFFA2A3B62FC5CB894F7719FED2FC2FF45D59
+      69FFC87795C8E5BBB33E46F2B426944FEFBD56FE8B7596F33E73A59960F9BE6B
+      93FF79BB7F43D1B56348FE677324D0B87FE5FF7F5FFE733E704CBF51FE9F7B9E
+      8785271CDE30FF51EBE77F59A06B4DD92762FA65F9CFFB1DEF5962EF08747B9E
+      87C7560ABEE8FA3111D335E53FF751E0D85BEC59BCEF680ECEE1CC95BD913CAB
+      39E5C3BBAFFDFCD71CB5CD7FCDF35F73BC49FE73C9FB15EB4DF33FC3ED27A4B9
+      8CF82BFFFFA4F95F7C60A178A77DD3F77FF12E4CAAF5F35F7EFFD71CB579FE6B
+      BFFF6B8ED77DFE73FE17D337CB931DBF8ABE2ADFF9E93D3CDBF13BA4D0FBF0AB
+      F29FBF77F8781CB0B6927F78D44EEC1F85F43C7D55FEF3B752757B178BDFC36B
+      F7FC7FCED7F6FD3F7FFFA24A3A47C3D632FFB3BDA623CB73EA7F5DFE1717A351
+      6E2ECC490B649973DD6B70867171D876E346B97ACF9E223839E5C1D13117BB76
+      3D4044C43335B579924D931A58E3E86824AF5FFF087DFAA4A37BF71474ED9A88
+      0E1DA2D1A64D38DAB6BD025BDBBB209B54B2EDA03B2ED7CF9F7F1FBD7BE7109F
+      0753D31CF4E891467D24E0B3CF22D1A2C555181A0663D4A85B888A428AB61FEC
+      338FCBECA8518FE0E5552A4A53D36C7CF14532BEF9260E0E0E69D44F181A3408
+      C4E2C589888D85A766AEF87ED9671E97593E52529E61F8F03C0C1C988EC4C48A
+      3A3BBB24346C1888F7DFF74778F85335B1063CB73E3E45E27ED9671E3739F999
+      B0BF73A70C494915DFE3F1F18FF1F9E7FF16E3EBEB1FC3962D99207624AF0FCF
+      73972E09E27EB90F1E3729A9AC32FE13129EA05BB7703469128CFAF54F41A138
+      022BAB3868D6D7D13147CC33F7D1BD7B32060C48AF1C57C377EE7C158D1B9FC5
+      BBEF9E84241DC6A24582B7BC770FE6BCBEAD5B87A37D7B9598AB848452D9E727
+      888B7B22CE63638BD0B26590F05D927EAFF49FE78F63A35DBBAB628D56AF4E13
+      F671718F69EDC2D1A9D335C4C41489BA850B2305DBB0E171317F45451031CD6B
+      616F9F46EB1B22D688E7B9438730B1DEEC338F6B651589BFFDED84E06D6CE279
+      FDB66AC54F138E098E0D5E1F16CF33CF559D3A27659F0F0B76E8D0AB1C8329BA
+      71CC31497D242D599244F31C20189E670DC73E5B5BC7571BBF1AD1FD3461BF22
+      229EAA797E788D587CCE75DC5653FEE8F86240EBC2B16129AF11CFF3EB3FFF65
+      65C546E8D796890CD8D5D57741FF5DD7772ECE8B3CE0F8ECE61EFBD2734E13C3
+      CEAD9F353B2736BC0EDBE4C4851B1C98F1D5656D2E2525440ADE346F69C2898D
+      65E5A937E8A5318292E83A25C11520F1321E5D3D5A7EC975CADD731BFE392270
+      F9F0ABE11E73A0CD5F18D56D75FA69AF677187D7A995DB173C507ACECF8DF259
+      569A1FECFD0C9101C0AD9340842FEE1E5EFD4C7D7937549ECFF9F3EBA70FF55F
+      3AF4D1F98D73EC6EF97B7DA2A98F3AE653DF6FCBF89FCFD80EBF92E7E7F20C97
+      ABFE0C5D63B77FE6577BAF9D716B59D39C441DF36C7C7AC9A08C8ADF47B90081
+      CE50AD9F80D799CF9C38A541E0A2FE57D5C7E999E84FEFF17EF6422AD7B1AFC7
+      C787F754F96DB7D355A49FD7328D0D5D2F25D9EA8AD81EAF3386F045F68B7D64
+      5F03ADFB5F25DF1BBD16EFF68B9813313734473C5711FE5B1AD7389FC7F7B4A4
+      39DF53C96FB2A8F8FD04AF0DAD513EAD15AF99BFC7F89F238FF9BC57199B7E5E
+      2D4236CCB60F583AB430C865FA8F953CC582FAD26E111BE277201C2BAA00DCA7
+      D889F2595EAADC669917EE6555107FC4459D767AFBD30B9BE7AFD0F687639163
+      926393623485639563164914BB294AD0FB2138A6E37D37A88337CDB541484895
+      FBE15CE09CE0F3ECB8F03A41EEB36605AD9970E9868F7D896ABF03AE7BD9E41E
+      B3ECEF1515B0B3536DF3F14D647FD3BE91FD757B73D20259E65CF72A2E2423C4
+      50F290B6499E925ADA23413A248BCFB9CE53F2249B6AF72FB3CB66C6D2162959
+      D89F2385E8E8BCDCD71629D56C9F598717C6A57AE944359CAE4E883E52B4FD10
+      3E1F7A3957EF62BDE7D787C4FD6CD5CC95B8B77335B3866186882C8AC4EAD4D5
+      15756CBB5552136BC0732BE6A786B1342C1F5CD6BF58BFA28D186247F2FA68FB
+      6E9F628FE8E2687C10F6411596EB9A8635AD720F9AF5D5F0DCB7F658DAE7DC57
+      95FBAAE02D75FDD71EB34696E523FB5FCDFC69FA78C1678DCE55C493FD657B91
+      33D266BA3AF4E29C573B2EEB20699BB4552B7E9A704CBC69FCC8F1DB81EA936A
+      8CDF73F2B81CBF97CD3AD4903F4D38473836AAE48F4F45BC704B4DF953257F2F
+      8BB81A29AF8FA5380FB3AFF5F3DFDEBEDC88F5A6FB88425F7D86F5BAF62121E5
+      CDF5F4D5417A8AD24D321FC2E273AEA3B6B36C53134BB6774905667DCB86EBF2
+      5CC76D6C43B69F5465A97F7D75B060CDCA3B6AF95FC98B3ECCCA3BD1F543B23D
+      AFCDAF58F1CC8CEAE9FD5F6DA173FF5578569F3E6533D876C58A72534D9D9EE2
+      A9BB42A12E0A097956E7553CF95E876C8B8971ABB453949D22BB6BBA73D2B76F
+      D94C5635EBA224264087BF5E8B75255EEDAFE5FFFA0AFFCBEBBEC61AD7655B66
+      B4E6CFB462FECAA6BF8AAF6EFE840FFAEA73BC36B4469D6B62B98DD7986D79CD
+      75FCFA58133F34C64CEDB5E073AED38A9F6635DCDB27B21F2015F39CCAE27354
+      8C5B35F65EECA3623E787D695DFC597CCE75BA3EFF7F919E9E5E47D2112DFD83
+      24BD4A5ABC832C3E5F4D3A5E4B5EA3FE2467D2A95AF21F92F691F6925C4941B5
+      E47F272D96EB2791426BC95F23D9F1DF7350E9295F3793EDDE268D2679C9D2CC
+      75254FC75CD21D594348274807647E28693FA993ACFD9AF9D5F0D6FDFE2EE5AC
+      9A3478E6976DA58EEFD795C6B76D22756FDA40E327FBB354CBEFA59AF9D5F0F7
+      9D2C98F7BD32B56F77DF41EDA5C041ED113FAEA759AF8F1AB3FD1FA4A95AFC54
+      CDFCEAF0ED890F3F3AB0DD53E253888765D7566CEF23C784A4151FA1BAFE5BF5
+      ED2A4DED6624ADFAF21331BECF771DCC7A7ED488ED7F269D277D21EBBC3CBFDA
+      F327A69EA44F7A9B5487549F6440FA90B49474857495345C9E6783D7E4DF2719
+      923E207D446A466AAACDFF992599796C2329DF50DB24D38DCA3B77EEE04DC4AC
+      F4B59B3225250570E905B87E03B8F70136F507D6F706DCE811B3953E13BDE9FB
+      76377DAF07D0F76DC461407900CC302BF558A74C4B4B030ED263F6C86F6443DF
+      E9211B81934B803F56559C876C004ED127E3CDA3C0BD44204305669895BA3B2A
+      B3B2B270C96F1532948780187A5DBA7D9A4A52FA4D3A0F248EBE4923FD80840B
+      405634703F15CC302B755DA9BC77EF1E26ADE88D59CE83107486C6CAB8556177
+      2F01C88DAFB87E403EE6DD010AD281E2FB608659A9F372E583070FF0F52F1FE1
+      87D99F63FCB25ED87D74258243BD91181588FCBB1128CE8E212EAD827D7C1F28
+      7B026698953AD8280B0B0B317AE8FB183BA229268F6D8185B3BB60F9C29E70B2
+      ED87CDCEC3F12F8FF138BA7B26CE1EB341F4450F14C49E0233CC4AED2C954F9E
+      3CC1F6E95FE05F737AE1C0C23E3861FB03CEAD1B836BDBA723F6B00D32829C51
+      70DD132571FBF12CFD04DD57209861566A3D4759565656853FBE7C30CEACF909
+      97364CC08D1D33117F6021D24FD822FFCC1A1487AEC7D3AB5BC00CB392E12FCA
+      F2F272BC899895DEE9B9537A77B0F28DC4AC24BD23E773B35A8A9977FEAFF3B7
+      9DC25FD61FED49E34896A4C55AB2224D230D6AA738F511DBB6559C241D933E56
+      AC24EE24F3DF0DE91CB6719F7B5E4CF0D1E2C7174F3E066B9B5312AEFCF14CED
+      BFFB61D65ACBD40BFDDB863A93ED60E2EB32FFA9E228F573FCF31F3B5DF43873
+      F051D1E983F7F1C7FE3C5C3B5D8EC003F942DC075F9F39741F6453BCE0E7685F
+      627E21BE2EF39F2A8E4CF15E97151FB0370FFF3E5506FF3DF770787B7AE539EB
+      FCD1C2CAF3358B944FE78DBE7592B8619F2A0E4B6D14075604EC7DF0C4DB2D01
+      C7BD73C8EF12ECDD74074ED661D8EA1889DFB7A5C37757B668635FB8F4DB9DFF
+      D8CCE8D466629BB756F8AC3CB23DB7F08857163C564761A74B3C6CA69FC66EF7
+      3BE0BA9D2E09F05A1B87439EE9E29A75744736965B445E2376B49162E7D839A3
+      C22E72FD56C7DB983DCE17DB9D63E1609D8A0E9FDEC6FC699138B5EF01F9904B
+      F795855DAE89E45F2ABC5D52EF11BBCC48B1BDA191BEA7F5CF6681410B279DCF
+      FAE7185FF556E7088C1EB20BF6B4DD19B70FC61687DBB0B63803878561D4773C
+      7C36DCC5BECDE965C46D265E6AA5EF51AFA5FEA6012DF5372E6FFAC5AE133673
+      778AFC1C356423A68FBD287CDAB4329AC64E610E3BD6DD117D90BD77E33E3E52
+      63F3835223F303929ECF99DE6FB91C0D5B9CF904464D87DC6A5E67FEA996FAAE
+      FB36D8470AD675D94D9A8B3B3427C9586F7B0BDC26D91D92F4F69C15ACDED6E3
+      01CCEA2DF7086EF0ADD5F016FACE5D49235AE83BFDCE73CFB29D132A4AAEA3B6
+      6F04AFCDDA7A9C972C9DFB35F8668144ED2427A9B9FE6AD3E6FAAB7C357DF039
+      D7711BF19FEAB2528F7E55FEC6B6A9FE24E9137D5B7F66B9FC44DFAEB781A26F
+      45E302CFC57145209F37074B237E1D4C35F5480D488DB49FFD1FEB2F09649E4B
+      B9AE81FCAE00BD61338EE87DFD633FB9EE6FF27B424BD2A7A4CF499D1A2A4C27
+      34D3B73E4BE544B98E6DEA6AFB696464244D9B364D5AB76E1DE7959CA77E949F
+      015F51DE2D6DABF05F46D73DDA2A7C396F28F60F0AAE79F3E6D2F8F1E3257B7B
+      7BC9D1D15197277BBF6557039F893C6CAB38614B7C4F0D3F72E44869C18205D2
+      E2C58BABE37BB27D58C0538AE13CCAE78ADCA6BC5D41FCD7CCCF9E3DBB269ED8
+      E37697FCCAE0E7938B80BDF774FA38E448FCB7D5F16BD7AE35717272B2B870BC
+      54E4EBC9DD3955FAF05C9348797D1F6D14FBD6EAF20E0E0E26AB56ADB2282929
+      417171318EEDCCAED287C7EA38CAD304CAE77CB456EC76D5E6EDECEC4C962F5F
+      6EF1F8F1633C7AF4A8529A3E36AEB88DCDAB62B1DF2397586F77521F0D6F6363
+      63B268D1228BA2A222F16CD695DB7215DCEDA2B067631628EF371A2976F43552
+      EC12F367696969326FDE3C0B7E26E7E5E5BDA0888808DCBC7913DE6E69C47A79
+      50CE7F47BCC4FCAC59B34C66CE9C69F1F0E143E4E4E4BCA06BD7AE41A9542231
+      31115F7EF9A5452B7DCFFE468A6D92869F32658A454141013233335F50585818
+      AE5CB982D8D858B46FDFDEA24D9B3626ADF4B74ACC7FA4B0921AEB0D93C68C19
+      23787E9FD2566868282E5DBA84A8A828346BD6CCA269D3A626AD5AB5923ED49F
+      2FD5D16B5719F303070E34F9F6DB6F451FA9A9A942C1C1C108A18FED5BB76EC1
+      C0C0C0E2BDF7DE33A152AA53A7CE0B7F3FDFA85123A9458B16DCB7457272B298
+      2B8DDE7EFB6D0B854261427AD99FE03726B5AB5BB7EEC07AF5EA59C88C057D5F
+      5850BD19A9859CAB9CD70DE59CE5BCD7745A576E6B26DB7D28BF1B3491F70F03
+      795FE07DE55D99D597BF3774BF7F7B92B6E87C8B6BB4456EAFF2EDA9C36F9D3E
+      7D7A16E5102807E1EEEE0E373737383B3B8362248BDB6BE07D35A21C02C5243A
+      77EE0C5A3351F235D76BDBE9F07FA75B091F3E7C38287FD0AF5F3FD0BAE2B7DF
+      7E13255F733DB7B31DDBEBFA4F077FDBF92D59B204A6A6A69833670EACACAC44
+      C9D75CCFEDB25D4DF77FCADADA1A23468CC0E8D1A341B9214ABEE67AED9F2BE8
+      F0811AF1986C6F626282962D5B8A92AFB95EDB4E87FF8AFC8AEFDFBF3F2897D1
+      A74F1F0C183000B4978B92AFB99EDBD98EEDABB9FF1EFC6D3B77EE5CF4EDDB17
+      93274F06ADA528F99AEBB95DB6ABE9FE2FF03DB3BFB4AF63E2C489A2E46BAEE7
+      F61AEEFF9246142782E9D1A3078C8D8D45C9D75CAF6DA7C37F4D7EE5F6ECD913
+      161616F8FEFBEFD1725E4B18EE3614255F733DB7B31DDB5773FF5FF3773DED47
+      225E8C038D617CC958947CCDF5DC2EDB55FD86D5FA37AA499326E1C71F7F446F
+      FA7E1C143D48947CCDF5DC5EDDFFDDC8B9C9797B89C67A326AD4280C1D3A54F8
+      CD255F733DB7CB395E5F87E75CEF429A415292B2AB91526EEFCAFBC3FFE63700
+      F928516E49E6E6E6D24F3FFDD480FCFD8A644E9A2C8BCFBFE236B6615B66AAE1
+      3F9B3CF9D799DEDE5B7E8F895126E7E56594B0F89CEBB88D6D6AE03F9B31639A
+      4D4444705A5656021E3EBC870B17CE8B92C575DC468F2A1BB6D5E6870C19D2F0
+      975FC6CD0E0F0F4E4B49B98982821CC1B8B8B854F25CC76D376E84A64D98307E
+      36331A7EF0E0C1BDB66F773F9294A4A4E7567C25B37AF5EACA7316B725274760
+      E7CE2D4798D1F0B4CE63AF5F3F97CABCB6E89D0ABA752C95EADFA9CC3CFF397F
+      DF590909CA124DBB66BC61C3865519FFC1832CD17EF7EEED1266343CED6F7392
+      92224AB4D9EEDDBB8B3D8BF74F8E3FDE07780F3874E85FC8C8882B6146C3F7EA
+      D56B424444E85D6D3E393951E42E97CF9580B8382562626EDC6546C3D358BD37
+      6F76F3E3F9651FB5FBD0F5FFEEDD4878796DF36346C377EBD6AD51BF7EDF5947
+      455DCBCCCF4FAFC2682B3F3F03F1F1D199B40F5A33A3E1BB74E92275ECD8D1E4
+      871F063B737B61E1FD1758AEBB7327219372D9996D99D1CE7F7A764B868686DD
+      68BF5EE1EAEA72362E2E86FA79505A5858501A1F1F9B49CFC1B3C4AC601BB6D5
+      DE03E8784BFEF99EF15B6FBDF50DBD0B4CA0770E1BD21A59365CC76DFC2E2FEF
+      156F69F1FC2EF0DE6BFE1CE103D956C1ECFF0018A27FCF
+    }
+  end
+  object OpenPictureDialog1: TOpenPictureDialog
+    Title = 'Open Picture'
+    FileName = 'C:\Users\gt350\Documents\lazarus\piston-64x.png'
+    InitialDir = 'C:\Users\gt350\Documents\lazarus\'
+    Left = 448
+    Top = 80
+  end
+  object Timer2: TTimer
+    Enabled = False
+    Interval = 250
+    OnTimer = Timer2Timer
+    Left = 448
+    Top = 8
+  end
+  object MainMenu1: TMainMenu
+    Left = 30
+    Top = 16
+    object FileMenu: TMenuItem
+      Caption = 'File'
+      object AboutSubMenu: TMenuItem
+        Caption = 'About'
+        OnClick = AboutSubMenuClick
+      end
+      object Separator1: TMenuItem
+        Caption = '-'
+      end
+      object ExitSubMenu: TMenuItem
+        Caption = 'Exit'
+        OnClick = ExitSubMenuClick
+      end
+    end
+  end
+end

+ 2797 - 0
test/test_supergauge/sgtest.pas

@@ -0,0 +1,2797 @@
+// SPDX-License-Identifier: LGPL-3.0-linking-exception
+{
+  Part of BGRA Controls. Made by third party.
+  For detailed information see readme.txt
+
+  Site: https://sourceforge.net/p/bgra-controls/
+  Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
+  Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
+
+}
+{******************************* CONTRIBUTOR(S) ******************************
+- Sandy Ganz | [email protected]
+  Test Program for SuperGauge
+***************************** END CONTRIBUTOR(S) *****************************}
+
+unit sgtest;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
+  ComCtrls, Buttons, ColorBox, ComboEx, ExtDlgs, Menus, SpinEx, ueLED, BGRAKnob,
+  BGRAShape, BGRAImageList, SuperGaugeCommon, SuperGauge,about;
+
+const
+  VERSIONSTR = '1.00';            // SG TEST version, Should ALWAYS show as a delta when merging!
+
+type
+  { TSGTestFrm }
+
+  TSGTestFrm = class(TForm)
+    BGRAKnob: TBGRAKnob;
+    DisableAllMarkersBtn: TBitBtn;
+    SuperGauge: TSuperGauge;
+    EnableAllMarkersBtn: TBitBtn;
+    MainMenu1: TMainMenu;
+    Memo1: TMemo;
+    Memo2: TMemo;
+    FileMenu: TMenuItem;
+    AboutSubMenu: TMenuItem;
+    ExitSubMenu: TMenuItem;
+    ScaleReversedCb: TCheckBox;
+    ScaleStepLbl: TLabel;
+    ScaleStepSpe: TSpinEditEx;
+    Separator1: TMenuItem;
+    TryToRoundValueCb: TCheckBox;
+    MaxLbl: TLabel;
+    MaxValLbl: TLabel;
+    RoundBtn: TButton;
+    Label3: TLabel;
+    MinLbl: TLabel;
+    MinValLbl: TLabel;
+    uELED1: TuELED;
+    uELED2: TuELED;
+    ValuePlus1Btn: TBitBtn;
+    ValueMinus1Btn: TBitBtn;
+    ValuePlus10Btn: TBitBtn;
+    ValueMinus10Btn: TBitBtn;
+    ValueZeroBtn: TBitBtn;
+    UserToGaugeLbl: TLabel;
+    ResetMinMaxBtn: TBitBtn;
+    MinValueBtn: TBitBtn;
+    MaxValueBtn: TBitBtn;
+    GaugeLbl: TLabel;
+    GaugeValLbl: TLabel;
+    GroupBox4: TGroupBox;
+    KnobValLbl: TLabel;
+    Label1: TLabel;
+    Label6: TLabel;
+    MarkerZeroAllBtn: TBitBtn;
+    Marker1ValueClrBtn: TBitBtn;
+    Marker3ValueClrBtn: TBitBtn;
+    Marker2ValueClrBtn: TBitBtn;
+    MarkerMemo: TMemo;
+    MarkerRandomTestBtn: TBitBtn;
+    Marker2ColorLbl: TLabel;
+    Marker3ColorLbl: TLabel;
+    Marker2HeightLbl: TLabel;
+    Marker3HeightLbl: TLabel;
+    Marker2WidthLbl: TLabel;
+    Marker3WidthLbl: TLabel;
+    LoadImageBtn: TBitBtn;
+    FrameFrameColorCb: TColorBox;
+    FrameFrameColorLbl: TLabel;
+    FaceOuterColorCb: TColorBox;
+    FrameBorderColorCb: TColorBox;
+    FaceOuterColorLbl: TLabel;
+    FaceInnerColorCb: TColorBox;
+    FaceInnerColorLbl: TLabel;
+    FaceFillStyleLbl: TLabel;
+    FrameBorderColorLbl: TLabel;
+    FrameRadiusLbl: TLabel;
+    FrameRadiusSpe: TSpinEditEx;
+    Marker2ColorCb: TColorBox;
+    Marker3ColorCb: TColorBox;
+    Marker2EnabledCb: TCheckBox;
+    Marker3EnabledCb: TCheckBox;
+    Marker1Gb2: TGroupBox;
+    Marker1Gb3: TGroupBox;
+    Marker1HeightSpe: TSpinEditEx;
+    Marker2HeightSpe: TSpinEditEx;
+    Marker3HeightSpe: TSpinEditEx;
+    Marker1RadiusLbl: TLabel;
+    Marker2RadiusLbl: TLabel;
+    Marker3RadiusLbl: TLabel;
+    Marker1RadiusSpe: TSpinEditEx;
+    Marker1ColorCb: TColorBox;
+    Marker1ColorLbl: TLabel;
+    Marker1EnabledCb: TCheckBox;
+    Marker1Gb1: TGroupBox;
+    Marker1HeightLbl: TLabel;
+    Marker1WidthLbl: TLabel;
+    FrameTab: TTabSheet;
+    Marker2RadiusSpe: TSpinEditEx;
+    Marker3RadiusSpe: TSpinEditEx;
+    Marker1StyleCb: TComboBox;
+    Marker2StyleCb: TComboBox;
+    Marker3StyleCb: TComboBox;
+    Marker1StyleLbl: TLabel;
+    Marker2StyleLbl: TLabel;
+    Marker3StyleLbl: TLabel;
+    Marker1ValueLbl: TLabel;
+    Marker2ValueLbl: TLabel;
+    Marker3ValueLbl: TLabel;
+    Marker2ValueSpe: TFloatSpinEditEx;
+    Marker3ValueSpe: TFloatSpinEditEx;
+    Marker1WidthSpe: TSpinEditEx;
+    FaceFillStyleCb: TComboBox;
+    FacePictureOffsetXLbl: TLabel;
+    FacePictureOffsetXSpe: TSpinEditEx;
+    FacePictureOffsetYLbl: TLabel;
+    FacePictureOffsetYSpe: TSpinEditEx;
+    FacePictureResetOffsetBtn: TBitBtn;
+    Marker2WidthSpe: TSpinEditEx;
+    Marker3WidthSpe: TSpinEditEx;
+    OutOfRangeLbl: TLabel;
+    OverloadNegBtn: TBitBtn;
+    OverloadPosBtn: TBitBtn;
+    PerfTestBtn: TBitBtn;
+    RandomBtn: TBitBtn;
+    RangeLEDMemo: TMemo;
+    OpenPictureDialog1: TOpenPictureDialog;
+    Marker1ValueSpe: TFloatSpinEditEx;
+    RangeLEDRangeEnd1: TLabel;
+    MaxValueSpe: TFloatSpinEditEx;
+    RangeLEDRangeStartLbl2: TLabel;
+    MinValueSpe: TFloatSpinEditEx;
+    TabSheet1: TTabSheet;
+    FacePictureEnabledCb: TCheckBox;
+    TickArcStyleLbl: TLabel;
+    ScaleTickArcStyleCb: TComboBox;
+    ScaleMainTickThicknessLbl: TLabel;
+    ScaleMainTickThicknessSpe: TSpinEditEx;
+    ScaleRadiusLbol2: TLabel;
+    ScaleSubTickThicknessLbl: TLabel;
+    ScaleSubTickThicknessSpe: TSpinEditEx;
+    ScaleTextSizeSpe: TSpinEditEx;
+    ScaleTextStyleDDCb: TCheckComboBox;
+    ScaleTextStyleLbl: TLabel;
+    ScaleSetFontBtn: TBitBtn;
+    Band3BandRadiusLbl: TLabel;
+    CapEdgeColorCb: TColorBox;
+    CapFillColorCb: TColorBox;
+    CapEdgeColorLbl: TLabel;
+    ScaleRadiusLbol1: TLabel;
+    ScaleTextRadiusSpe: TSpinEditEx;
+    ScaleTickColorColorCb: TColorBox;
+    ScaleTextColorColorCb: TColorBox;
+    ScaleTickColorLbl: TLabel;
+    ScaleLenghtMainTickLbl: TLabel;
+    ScaleMainTickCountLbl: TLabel;
+    ScaleLenghtSubTickLbl: TLabel;
+    ScaleStartLbl: TLabel;
+    ScaleRadiusLbol: TLabel;
+    ScaleStartSpe: TSpinEditEx;
+    ScaleRadiusSpe: TSpinEditEx;
+    ScaleSubTickCountLbl: TLabel;
+    ScaleLengthMainTickSpe: TSpinEditEx;
+    ScaleEnableSubTicsCb: TCheckBox;
+    EnableScaleTextCb: TCheckBox;
+    ScaleEnableMainTicsCb: TCheckBox;
+    PointerStyleCb: TComboBox;
+    PointerStyleLbl: TLabel;
+    PointerLengthLbl: TLabel;
+    PointerExtensionLengthLbl: TLabel;
+    PointerLengthSpe: TSpinEditEx;
+    PointerColorCb: TColorBox;
+    CapFillColorLbl: TLabel;
+    PointerColorLbl: TLabel;
+    PointerThicknessLbl: TLabel;
+    PointerThicknessSpe: TSpinEditEx;
+    CapPositionLbl: TLabel;
+    CapStyleLbl: TLabel;
+    PointerExtensionLengthSpe: TSpinEditEx;
+    RangeLEDStyleCb: TComboBox;
+    CapCurveExponentLbl: TLabel;
+    CapCurveExponentSpe: TFloatSpinEditEx;
+    CapPositionCb: TComboBox;
+    CapStyleCb: TComboBox;
+    ScaleMainTickCountSpe: TSpinEditEx;
+    ScaleLengthSubTickSpe: TSpinEditEx;
+    ScaleSubTickCountSpe: TSpinEditEx;
+    ScaleTextColorLbl: TLabel;
+    Text2ColorCb: TColorBox;
+    Text3ColorCb: TColorBox;
+    Text2EnabledCb: TCheckBox;
+    Text3EnabledCb: TCheckBox;
+    Text1OffsetXLbl: TLabel;
+    Text2OffsetXLbl: TLabel;
+    Text3OffsetXLbl: TLabel;
+    Text1OffsetXSpe: TSpinEditEx;
+    Text2OffsetXSpe: TSpinEditEx;
+    CapLightIntensityLbl: TLabel;
+    CapRadiusLbl: TLabel;
+    Text3OffsetXSpe: TSpinEditEx;
+    Text1OffsetYLbl: TLabel;
+    Text2OffsetYLbl: TLabel;
+    CapLightIntensitySpe: TSpinEditEx;
+    CapRadiusSpe: TSpinEditEx;
+    Text3OffsetYLbl: TLabel;
+    Text1OffsetYSpe: TSpinEditEx;
+    Text2OffsetYSpe: TSpinEditEx;
+    Text3OffsetYSpe: TSpinEditEx;
+    Text2SetFontBtn: TBitBtn;
+    Text3SetFontBtn: TBitBtn;
+    Text2TextColorLbl: TLabel;
+    Text3TextColorLbl: TLabel;
+    Text1TextEdt: TEdit;
+    Text2TextEdt: TEdit;
+    Text3TextEdt: TEdit;
+    Text1TextLbl: TLabel;
+    Text1ColorCb: TColorBox;
+    Text1TextColorLbl: TLabel;
+    Text2TextLbl: TLabel;
+    Text3TextLbl: TLabel;
+    Text1TextSizeLbl: TLabel;
+    Text1TextSizeLbl1: TLabel;
+    Text3TextSizeLbl: TLabel;
+    Text1TextSizeSpe: TSpinEditEx;
+    Text2TextSizeSpe: TSpinEditEx;
+    Text3TextSizeSpe: TSpinEditEx;
+    Text1TextStyleDDCb: TCheckComboBox;
+    Text2TextStyleDDCb: TCheckComboBox;
+    Text3TextStyleDDCb: TCheckComboBox;
+    Text1TextStyleLbl: TLabel;
+    Text1SetFontBtn1: TBitBtn;
+
+    BandRadiusLbl: TLabel;
+    Band4BandRadiusLbl: TLabel;
+    Band3BandRadiusSpe: TSpinEditEx;
+    Band4BandRadiusSpe: TSpinEditEx;
+    Band3ColorCb: TColorBox;
+    Band4ColorCb: TColorBox;
+    Band3ColorLbl: TLabel;
+    Band4ColorLbl: TLabel;
+    Band3EnabledCb: TCheckBox;
+    Band4EnabledCb: TCheckBox;
+    Band3EnabledTextCb: TCheckBox;
+    Band4EnabledTextCb: TCheckBox;
+    Band3EndValueSpe: TFloatSpinEditEx;
+    Band4EndValueSpe: TFloatSpinEditEx;
+    Band4Gb: TGroupBox;
+    Band4RangeEndLbl: TLabel;
+    Band4SetFontBtn: TBitBtn;
+    Band4StartLbl: TLabel;
+    Band4StartValueSpe: TFloatSpinEditEx;
+    Band4TextColorCb: TColorBox;
+    Band4TextColorLbl: TLabel;
+    Band4TextEdt: TEdit;
+    Band4TextLbl: TLabel;
+    Band4TextRadiusLbl: TLabel;
+    Band4TextRadiusSpe: TSpinEditEx;
+    Band4TextSizeLbl: TLabel;
+    Band4TextSizeSpe: TSpinEditEx;
+    Band4TextStyleDDCb: TCheckComboBox;
+    Band4TextStyleLbl: TLabel;
+    Band4ThicknessLbl: TLabel;
+    Band4ThicknessSpe: TSpinEditEx;
+    Band3Gb: TGroupBox;
+    Band3RangeEndLbl: TLabel;
+    Band3SetFontBtn: TBitBtn;
+    Band3StartLbl: TLabel;
+    Band3StartValueSpe: TFloatSpinEditEx;
+    Band3TextColorCb: TColorBox;
+    Band3TextColorLbl: TLabel;
+    Band3TextEdt: TEdit;
+    Band3TextLbl: TLabel;
+    Band3TextRadiusLbl: TLabel;
+    Band3TextRadiusSpe: TSpinEditEx;
+    Band3TextSizeLbl: TLabel;
+    Band3TextSizeSpe: TSpinEditEx;
+    Band3TextStyleDDCb: TCheckComboBox;
+    Band1TextStyleLbl1: TLabel;
+    Band3ThicknessLbl: TLabel;
+    Band3ThicknessSpe: TSpinEditEx;
+    Band2BandRadiusLbl: TLabel;
+    Band2BandRadiusSpe: TSpinEditEx;
+    Band2ColorCb: TColorBox;
+    Band2ColorLbl: TLabel;
+    Band2EnabledCb: TCheckBox;
+    Band2EnabledTextCb: TCheckBox;
+    Band2EndValueSpe: TFloatSpinEditEx;
+    Band2Gb: TGroupBox;
+    Band2RangeEndLbl: TLabel;
+    Band2SetFontBtn: TBitBtn;
+    BandStartLbl: TLabel;
+    Band2StartValueSpe: TFloatSpinEditEx;
+    Band2TextColorCb: TColorBox;
+    Band2TextColorLbl: TLabel;
+    Band2TextEdt: TEdit;
+    Band2TextLbl: TLabel;
+    Band1TextRadiusLbl: TLabel;
+    Band2TextRadiusLbl: TLabel;
+    Band1TextRadiusSpe: TSpinEditEx;
+    Band1TextColorCb: TColorBox;
+    Band1TextColorLbl: TLabel;
+    Band1EnabledCb: TCheckBox;
+    Band1EnabledTextCb: TCheckBox;
+    Band1SetFontBtn: TBitBtn;
+    Band2TextRadiusSpe: TSpinEditEx;
+    Band2TextSizeLbl: TLabel;
+    Band2TextSizeSpe: TSpinEditEx;
+    Band2TextStyleDDCb: TCheckComboBox;
+    Band2TextStyleLbl: TLabel;
+    Band2ThicknessLbl: TLabel;
+    Band2ThicknessSpe: TSpinEditEx;
+    Band1Gb: TGroupBox;
+    Band1ColorLbl: TLabel;
+    Band1ColorCb: TColorBox;
+    Band1TextLbl: TLabel;
+    Band1TextEdt: TEdit;
+    Band1TextStyleDDCb: TCheckComboBox;
+    FontDialog1: TFontDialog;
+    Band1TextSizeLbl: TLabel;
+    Band1ThicknessLbl: TLabel;
+    Band1TextStyleLbl: TLabel;
+    Band1BandRadiusLbl: TLabel;
+    Text1EnabledCb: TCheckBox;
+    Text2TextStyleLbl: TLabel;
+    Text3TextStyleLbl: TLabel;
+    TextGb1: TGroupBox;
+    ImageList1: TBGRAImageList;
+    RangeLEDOffsetXLbl1: TLabel;
+    Band1BandRadiusSpe: TSpinEditEx;
+    Band1TextSizeSpe: TSpinEditEx;
+    Band1ThicknessSpe: TSpinEditEx;
+    Band1RangeEndLbl: TLabel;
+    Band1EndValueSpe: TFloatSpinEditEx;
+    Band1StartLbl: TLabel;
+    Band1StartValueSpe: TFloatSpinEditEx;
+    RangeLEDSizeSpe: TSpinEditEx;
+    ShapeLbl: TLabel;
+    RangeLEDCallBackLED: TuELED;
+    RangeLEDCallbackNameValLbl: TLabel;
+    RangeLEDCallbackValueLbl: TLabel;
+    RangeLEDCallbackNameLbl: TLabel;
+    RangeLEDCallbackValLbl: TLabel;
+    RangeLEDShapeValLbl: TLabel;
+    RangeLEDShapeLbl: TLabel;
+    RangeLEDRangeStartLbl1: TLabel;
+    RangeLEDRangeTypeLbl1: TLabel;
+    RangeLEDRangeStartValLbl1: TLabel;
+    RangeLEDRangeEndLbl1: TLabel;
+    RangeLEDRangeEndValLbl1: TLabel;
+    RangeLEDRangeEnd: TLabel;
+    RangeLEDRangeStartSpe: TFloatSpinEditEx;
+    RangeLEDRangeEndSpe: TFloatSpinEditEx;
+    RangeLEDRangeTypeValLbl1: TLabel;
+    RangeLEDRangeTypeLbl: TLabel;
+    RangeLEDRangeStartLbl: TLabel;
+    RangeLEDRangeTypeCb: TComboBox;
+    RangeLEDOffsetYValLbl: TLabel;
+    RangeLEDOffsetX1Lbl1: TLabel;
+    RangeLEDOffsetXValLbl: TLabel;
+    RangeLEDOffsetYLbl1: TLabel;
+    RangeLEDOffsetYLbl: TLabel;
+    AutoScaleCb: TCheckBox;
+    GroupBox3: TGroupBox;
+    RangeLEDOffsetXLbl: TLabel;
+    RangeLEDActiveColorCb: TColorBox;
+    RangeLEDActiveColorLbl: TLabel;
+    RangeLEDBorderColorLbl: TLabel;
+    RangeLEDActiveColorValLbl: TLabel;
+    RangeLEDBorderColorValLbl: TLabel;
+    RangeLEDInactiveColorCb: TColorBox;
+    RangeLEDBorderColorCb: TColorBox;
+    ColorDialog1: TColorDialog;
+    Label2: TLabel;
+    FillStyleLbl: TLabel;
+    Label4: TLabel;
+    Label8: TLabel;
+    Label9: TLabel;
+    RangeLEDInactiveColorLbl: TLabel;
+    RangeLEDInactiveColorValLbl: TLabel;
+    RangeLEDFillStyleLbl: TLabel;
+    RangeLEDStateLbl: TLabel;
+    RangeLEDStateValLbl: TLabel;
+    RangeLEDFillStyleValLbl: TLabel;
+    RangeLEDOffsetXSpe: TSpinEditEx;
+    RangeLEDOffsetYSpe: TSpinEditEx;
+    RangeLEDResetOffsetBtn: TBitBtn;
+    RangeLEDResetRangesBtn: TBitBtn;
+    RangeLEDShapeCb: TComboBox;
+    TestLEDShape: TBGRAShape;
+    LEDOnBtn: TBitBtn;
+    LEDOffBtn: TBitBtn;
+    HeightLbl: TLabel;
+    Text2Gb: TGroupBox;
+    Text3Gb: TGroupBox;
+    Timer2: TTimer;
+    TopLbl: TLabel;
+    TopValLbl: TLabel;
+    LeftLbl: TLabel;
+    WidthValLbl: TLabel;
+    WidthLbl: TLabel;
+    LeftAddBtn: TBitBtn;
+    LeftSubBtn: TBitBtn;
+    TopAddBtn: TBitBtn;
+    TopSubBtn: TBitBtn;
+    HeightAddBtn: TBitBtn;
+    HeightSubBtn: TBitBtn;
+    ResetSizeBtn: TBitBtn;
+    GroupBox2: TGroupBox;
+    ResetPositionBtn: TBitBtn;
+    WidthSubBtn: TBitBtn;
+    WidthAddBtn: TBitBtn;
+    GroupBox1: TGroupBox;
+    GaugeTs: TPageControl;
+    BasicTab: TTabSheet;
+    LEDTab: TTabSheet;
+    FaceTab: TTabSheet;
+    ScaleTab: TTabSheet;
+    PointerTab: TTabSheet;
+    CapTab: TTabSheet;
+    BandTab: TTabSheet;
+    TextTab: TTabSheet;
+    Timer1: TTimer;
+    HeightValLbl: TLabel;
+    LeftValLbl: TLabel;
+
+    procedure AboutSubMenuClick(Sender: TObject);
+    procedure AutoScaleCbChange(Sender: TObject);
+    procedure Band1ColorCbChange(Sender: TObject);
+    procedure Band1EndValueSpeChange(Sender: TObject);
+    procedure Band1SetFontBtnClick(Sender: TObject);
+    procedure Band1StartValueSpeChange(Sender: TObject);
+    procedure Band1TextColorCbChange(Sender: TObject);
+    procedure Band1TextEdtChange(Sender: TObject);
+    procedure Band1EnabledTextCbChange(Sender: TObject);
+    procedure Band1BandRadiusSpeChange(Sender: TObject);
+    procedure Band1TextRadiusSpeChange(Sender: TObject);
+    procedure Band1TextSizeSpeChange(Sender: TObject);
+    procedure Band1TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Band2BandRadiusSpeChange(Sender: TObject);
+    procedure Band2EnabledCbChange(Sender: TObject);
+    procedure Band2EnabledTextCbChange(Sender: TObject);
+    procedure Band2EndValueSpeChange(Sender: TObject);
+    procedure Band2SetFontBtnClick(Sender: TObject);
+    procedure Band2StartValueSpeChange(Sender: TObject);
+    procedure Band2TextColorCbChange(Sender: TObject);
+    procedure Band2TextEdtChange(Sender: TObject);
+    procedure Band2TextRadiusSpeChange(Sender: TObject);
+    procedure Band2TextSizeSpeChange(Sender: TObject);
+    procedure Band2TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Band2ThicknessSpeChange(Sender: TObject);
+    procedure Band2ColorCbChange(Sender: TObject);
+    procedure Band3BandRadiusSpeChange(Sender: TObject);
+    procedure Band3ColorCbChange(Sender: TObject);
+    procedure Band3EnabledCbChange(Sender: TObject);
+    procedure Band3EnabledTextCbChange(Sender: TObject);
+    procedure Band3EndValueSpeChange(Sender: TObject);
+    procedure Band3SetFontBtnClick(Sender: TObject);
+    procedure Band3StartValueSpeChange(Sender: TObject);
+    procedure Band3TextColorCbChange(Sender: TObject);
+    procedure Band3TextEdtChange(Sender: TObject);
+    procedure Band3TextRadiusSpeChange(Sender: TObject);
+    procedure Band3TextSizeSpeChange(Sender: TObject);
+    procedure Band3TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Band3ThicknessSpeChange(Sender: TObject);
+    procedure Band4BandRadiusSpeChange(Sender: TObject);
+    procedure Band4ColorCbChange(Sender: TObject);
+    procedure Band4EnabledCbChange(Sender: TObject);
+    procedure Band4EnabledTextCbChange(Sender: TObject);
+    procedure Band4EndValueSpeChange(Sender: TObject);
+    procedure Band4SetFontBtnClick(Sender: TObject);
+    procedure Band4StartValueSpeChange(Sender: TObject);
+    procedure Band4TextColorCbChange(Sender: TObject);
+    procedure Band4TextEdtChange(Sender: TObject);
+    procedure Band4TextRadiusSpeChange(Sender: TObject);
+    procedure Band4TextSizeSpeChange(Sender: TObject);
+    procedure Band4TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Band4ThicknessSpeChange(Sender: TObject);
+    procedure BGRAKnobValueChanged(Sender: TObject; Value: single);
+    procedure BandEnabledCbChange(Sender: TObject);
+    procedure DisableAllMarkersBtnClick(Sender: TObject);
+    procedure EnableAllMarkersBtnClick(Sender: TObject);
+    procedure ExitSubMenuClick(Sender: TObject);
+    procedure RoundBtnClick(Sender: TObject);
+    procedure LoadImageBtnClick(Sender: TObject);
+    procedure MarkerZeroAllBtnClick(Sender: TObject);
+    procedure Marker1ValueClrBtnClick(Sender: TObject);
+    procedure Marker3ValueClrBtnClick(Sender: TObject);
+    procedure Marker2ValueClrBtnClick(Sender: TObject);
+    procedure MaxValueBtnClick(Sender: TObject);
+    procedure MaxValueSpeChange(Sender: TObject);
+    procedure MinValueBtnClick(Sender: TObject);
+    procedure MinValueSpeChange(Sender: TObject);
+    procedure RandomBtnClick(Sender: TObject);
+    procedure MarkerRandomTestBtnClick(Sender: TObject);
+    procedure CapCurveExponentSpeChange(Sender: TObject);
+    procedure CapEdgeColorCbChange(Sender: TObject);
+    procedure CapFillColorCbChange(Sender: TObject);
+    procedure CapLightIntensitySpeChange(Sender: TObject);
+    procedure CapPositionCbChange(Sender: TObject);
+    procedure CapRadiusSpeChange(Sender: TObject);
+    procedure CapStyleCbChange(Sender: TObject);
+    procedure EnableScaleTextCbChange(Sender: TObject);
+    procedure FaceInnerColorCbChange(Sender: TObject);
+    procedure FaceOuterColorCbChange(Sender: TObject);
+    procedure FaceFillStyleCbChange(Sender: TObject);
+    procedure FacePictureEnabledCbChange(Sender: TObject);
+    procedure FacePictureOffsetXSpeChange(Sender: TObject);
+    procedure FacePictureOffsetYSpeChange(Sender: TObject);
+    procedure FrameBorderColorCbChange(Sender: TObject);
+    procedure FrameFrameColorCbChange(Sender: TObject);
+    procedure FrameRadiusSpeChange(Sender: TObject);
+    procedure Marker1ColorCbChange(Sender: TObject);
+    procedure Marker1EnabledCbChange(Sender: TObject);
+    procedure Marker1HeightSpeChange(Sender: TObject);
+    procedure Marker1RadiusSpeChange(Sender: TObject);
+    procedure Marker1StyleCbChange(Sender: TObject);
+    procedure Marker1ValueSpeChange(Sender: TObject);
+    procedure Marker1WidthSpeChange(Sender: TObject);
+    procedure Marker2ColorCbChange(Sender: TObject);
+    procedure Marker2EnabledCbChange(Sender: TObject);
+    procedure Marker2HeightSpeChange(Sender: TObject);
+    procedure Marker2RadiusSpeChange(Sender: TObject);
+    procedure Marker2StyleCbChange(Sender: TObject);
+    procedure Marker2ValueSpeChange(Sender: TObject);
+    procedure Marker2WidthSpeChange(Sender: TObject);
+    procedure Marker3ColorCbChange(Sender: TObject);
+    procedure Marker3EnabledCbChange(Sender: TObject);
+    procedure Marker3HeightSpeChange(Sender: TObject);
+    procedure Marker3RadiusSpeChange(Sender: TObject);
+    procedure Marker3StyleCbChange(Sender: TObject);
+    procedure Marker3ValueSpeChange(Sender: TObject);
+    procedure Marker3WidthSpeChange(Sender: TObject);
+    procedure PointerColorCbChange(Sender: TObject);
+    procedure PointerExtensionLengthSpeChange(Sender: TObject);
+    procedure PointerLengthSpeChange(Sender: TObject);
+    procedure PointerStyleCbChange(Sender: TObject);
+    procedure PointerThicknessSpeChange(Sender: TObject);
+    procedure FacePictureResetOffsetBtnClick(Sender: TObject);
+    procedure ResetMinMaxBtnClick(Sender: TObject);
+    procedure ScaleEnableMainTicsCbChange(Sender: TObject);
+    procedure ScaleEnableSubTicsCbChange(Sender: TObject);
+    procedure ScaleLengthSubTickSpeChange(Sender: TObject);
+    procedure ScaleLengthMainTickSpeChange(Sender: TObject);
+    procedure ScaleMainTickCountSpeChange(Sender: TObject);
+    procedure ScaleMainTickThicknessSpeChange(Sender: TObject);
+    procedure ScaleReversedCbChange(Sender: TObject);
+    procedure ScaleStartSpeChange(Sender: TObject);
+    procedure ScaleRadiusSpeChange(Sender: TObject);
+    procedure ScaleSetFontBtnClick(Sender: TObject);
+    procedure ScaleStepSpeChange(Sender: TObject);
+    procedure ScaleSubTickCountSpeChange(Sender: TObject);
+    procedure ScaleSubTickThicknessSpeChange(Sender: TObject);
+    procedure ScaleTextColorColorCbChange(Sender: TObject);
+    procedure ScaleTextRadiusSpeChange(Sender: TObject);
+    procedure ScaleTextSizeSpeChange(Sender: TObject);
+    procedure ScaleTextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure ScaleTickArcStyleCbChange(Sender: TObject);
+    procedure ScaleTickColorColorCbChange(Sender: TObject);
+    procedure Text1EnabledCbChange(Sender: TObject);
+    procedure SuperGaugeRangeLEDActive(Sender: TObject; Value: single);
+    procedure SuperGaugeRangeLEDInactive(Sender: TObject; Value: single);
+    procedure RangeLEDActiveColorCbChange(Sender: TObject);
+    procedure RangeLEDBorderColorCbChange(Sender: TObject);
+    procedure Band1ThicknessSpeChange(Sender: TObject);
+    procedure RangeLEDRangeTypeCbChange(Sender: TObject);
+    procedure RangeLEDInactiveColorCbChange(Sender: TObject);
+    procedure RangeLEDRangeEndSpeChange(Sender: TObject);
+    procedure RangeLEDRangeStartSpeChange(Sender: TObject);
+    procedure RangeLEDShapeCbChange(Sender: TObject);
+    procedure RangeLEDSizeSpeChange(Sender: TObject);
+    procedure RangeLEDStyleCbChange(Sender: TObject);
+    procedure LeftAddBtnClick(Sender: TObject);
+    procedure HeightSubBtnClick(Sender: TObject);
+    procedure HeightAddBtnClick(Sender: TObject);
+    procedure LeftSubBtnClick(Sender: TObject);
+    procedure RangeLEDOffsetXSpeChange(Sender: TObject);
+    procedure RangeLEDOffsetYSpeChange(Sender: TObject);
+    procedure ResetPositionBtnClick(Sender: TObject);
+    procedure RangeLEDResetOffsetBtnClick(Sender: TObject);
+    procedure RangeLEDResetRangesBtnClick(Sender: TObject);
+    procedure ResetSizeBtnClick(Sender: TObject);
+    procedure Text1OffsetXSpeChange(Sender: TObject);
+    procedure Text1OffsetYSpeChange(Sender: TObject);
+    procedure Text1SetFontBtn1Click(Sender: TObject);
+    procedure Text1ColorCbChange(Sender: TObject);
+    procedure Text1TextEdtChange(Sender: TObject);
+    procedure Text1TextSizeSpeChange(Sender: TObject);
+    procedure Text1TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Text2ColorCbChange(Sender: TObject);
+    procedure Text2EnabledCbChange(Sender: TObject);
+    procedure Text2OffsetXSpeChange(Sender: TObject);
+    procedure Text2OffsetYSpeChange(Sender: TObject);
+    procedure Text2SetFontBtnClick(Sender: TObject);
+    procedure Text2TextEdtChange(Sender: TObject);
+    procedure Text2TextSizeSpeChange(Sender: TObject);
+    procedure Text2TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Text3ColorCbChange(Sender: TObject);
+    procedure Text3EnabledCbChange(Sender: TObject);
+    procedure Text3OffsetXSpeChange(Sender: TObject);
+    procedure Text3OffsetYSpeChange(Sender: TObject);
+    procedure Text3SetFontBtnClick(Sender: TObject);
+    procedure Text3TextEdtChange(Sender: TObject);
+    procedure Text3TextSizeSpeChange(Sender: TObject);
+    procedure Text3TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+    procedure Timer2Timer(Sender: TObject);
+    procedure TopAddBtnClick(Sender: TObject);
+    procedure TopSubBtnClick(Sender: TObject);
+    procedure ValueMinus10BtnClick(Sender: TObject);
+    procedure ValueMinus1BtnClick(Sender: TObject);
+    procedure ValuePlus10BtnClick(Sender: TObject);
+    procedure ValuePlus1BtnClick(Sender: TObject);
+    procedure ValueZeroBtnClick(Sender: TObject);
+    procedure WidthAddBtnClick(Sender: TObject);
+    procedure PerfTestBtnClick(Sender: TObject);
+    procedure LEDOnBtnClick(Sender: TObject);
+    procedure LEDOffBtnClick(Sender: TObject);
+    procedure OverloadPosBtnClick(Sender: TObject);
+    procedure OverloadNegBtnClick(Sender: TObject);
+    procedure SuperGaugeBackInRange(Sender: TObject; RangeValue: single);
+    procedure SuperGaugeDblClick(Sender: TObject);
+    procedure SuperGaugeOutOfRange(Sender: TObject;OutOfRangeValue: single);
+    procedure FormCreate(Sender: TObject);
+    procedure Timer1Timer(Sender: TObject);
+    procedure WidthSubBtnClick(Sender: TObject);
+  private
+
+  public
+    TimerState: boolean;
+    GaugeRangeError : boolean;
+    FrameTest : TSGFrameSettings;
+    ResetTics : integer;
+    ResetLoTics : integer;
+    ResetHiTics : integer;
+    procedure UpdateWHStats;
+    procedure UpdateMinMaxStats;
+    procedure UpdateLTStats;
+    procedure UpdatePositionStats;
+    procedure UpdateRangeLEDStats;
+    procedure UpdateBandStats;
+    procedure UpdateTextStats;
+    procedure UpdateCapStats;
+    procedure UpdatePointerStats;
+    procedure UpdateScaleStats;
+    procedure UpdateMarkerStats;
+    procedure UpdateFaceStats;
+    procedure UpdateFrameStats;
+
+  end;
+
+var
+  SGTestFrm: TSGTestFrm;
+
+implementation
+
+{$R *.lfm}
+
+{ TSGTestFrm }
+
+procedure TSGTestFrm.FormCreate(Sender: TObject);
+begin
+      Caption := 'Super Gauge Test Application ' + VERSIONSTR;
+      TimerState := false;
+      GaugeRangeError := false;
+      ResetTics := 0;
+      ResetLoTics := 0;
+      ResetHiTics := 0;
+
+      UpdateWHStats;
+      UpdateMinMaxStats;
+      UpdateLTStats;
+      UpdateRangeLEDStats;
+      UpdateMarkerStats;
+      UpdateBandStats;
+      UpdateTextStats;
+      UpdateCapStats;
+      UpdatePointerStats;
+      UpdateScaleStats;
+      UpdateFaceStats;
+      UpdateFrameStats;
+      UpdatePositionStats;
+
+      // hack to sync combo boxes
+      RangeLEDRangeTypeCbChange(Nil); // force a quick call so can update
+
+
+end;
+
+procedure TSGTestFrm.PerfTestBtnClick(Sender: TObject);
+var
+i,j: integer;
+begin
+
+  for j := 0 to 10 do
+  begin
+      for i := 0 to 100 do
+      begin
+        SuperGauge.Value := i;
+        Application.ProcessMessages;
+      end;
+  end;
+  beep;
+end;
+
+procedure TSGTestFrm.UpdateWHStats;
+begin
+    WidthValLbl.Caption := IntToStr(SuperGauge.Width);
+    HeightValLbl.Caption := IntToStr(SuperGauge.Height);
+end;
+
+procedure TSGTestFrm.UpdateMinMaxStats;
+begin
+  MinValueSpe.Value := SuperGauge.MinValue;
+  MaxValueSpe.Value := SuperGauge.MaxValue;
+end;
+
+procedure TSGTestFrm.UpdateLTStats;
+begin
+    LeftValLbl.Caption := IntToStr(SuperGauge.Left);
+    TopValLbl.Caption := IntToStr(SuperGauge.Top);
+end;
+
+procedure TSGTestFrm.UpdatePositionStats;
+begin
+  GaugeValLbl.Caption := FloatToStr(SuperGauge.Value);
+  KnobValLbl.Caption := FloatToStr(BGRAKnob.Value);
+  UserToGaugeLbl.Caption := FloatToStr(SuperGauge.UserToGauge(BGRAKnob.Value));
+  MinValLbl.Caption := FloatToStr(SuperGauge.MinValue);
+  MaxValLbl.Caption := FloatToStr(SuperGauge.MaxValue);
+
+  // extra stuff if needed, might be better to attach to text page to enable/disable
+  SuperGauge.TextSettings2.Text:= FormatFloat('###0', SuperGauge.Value * 100);
+  Text2TextEdt.Text := SuperGauge.TextSettings2.Text; // update the edit box to be nice!
+
+end;
+
+procedure TSGTestFrm.UpdateRangeLEDStats;
+begin
+  // RangeLED Settings
+  // Get the State
+
+  if SuperGauge.RangeLEDSettings.Active then
+    RangeLEDStateValLbl.Caption := 'True'
+  else
+    RangeLEDStateValLbl.Caption := 'False';
+
+  // Get the LED Style and stuff the ComboBox
+
+  RangeLEDStyleCb.ItemIndex := ord(SuperGauge.RangeLEDSettings.Style);
+  RangeLEDFillStyleValLbl.Caption := IntToStr(ord(SuperGauge.RangeLEDSettings.Style)); // just the int for now
+
+  RangeLEDShapeCb.ItemIndex := ord(SuperGauge.RangeLEDSettings.Shape);
+  RangeLEDShapeValLbl.Caption := IntToStr(ord(SuperGauge.RangeLEDSettings.Shape)); // just the int for now
+
+  // read settings from the gauge and set to the shape as our makeshift
+  // LED for testings.
+  // Be Fancy and if setting LED as shaded do the same for the test
+
+  TestLEDShape.UseFillGradient := (SuperGauge.RangeLEDSettings.Style = lsShaded);
+
+  case SuperGauge.RangeLEDSettings.Shape of
+    lshRound:
+        begin
+          TestLEDShape.ShapeType := stEllipse;
+        end;
+    lshSquare:
+        begin
+          TestLEDShape.ShapeType := stRegularPolygon;
+          TestLEDShape.SideCount := 4;
+          TestLEDShape.Angle := 45;
+        end;
+    lshTriangle:
+        begin
+          TestLEDShape.ShapeType := stRegularPolygon;
+          TestLEDShape.SideCount := 3;
+          TestLEDShape.Angle := 0;
+        end;
+    lshDownTriangle:
+        begin
+          TestLEDShape.ShapeType := stRegularPolygon;
+          TestLEDShape.SideCount := 3;
+          TestLEDShape.Angle := 180;
+        end
+  else
+    TestLEDShape.ShapeType := stEllipse;
+  end;
+
+  if SuperGauge.RangeLEDSettings.Active then
+    begin
+      TestLEDShape.FillColor := SuperGauge.RangeLEDSettings.ActiveColor;
+      TestLEDShape.FillGradient.StartColor := SuperGauge.RangeLEDSettings.ActiveColor;
+      TestLEDShape.FillGradient.EndColor := SuperGauge.RangeLEDSettings.InactiveColor;
+    end
+  else
+    begin
+       TestLEDShape.FillColor := clBlack;
+       TestLEDShape.FillGradient.StartColor := SuperGauge.RangeLEDSettings.InactiveColor;
+       TestLEDShape.FillGradient.EndColor := clGray;
+    end;
+
+  // Now the colors, note Lazarus is ordered $00BBGGRR, ColorToString is your friend!
+
+  RangeLEDActiveColorCb.Selected := SuperGauge.RangeLEDSettings.ActiveColor;
+  RangeLEDActiveColorValLbl.Caption := ColorToString(SuperGauge.RangeLEDSettings.ActiveColor);
+  RangeLEDInactiveColorCb.Selected := SuperGauge.RangeLEDSettings.InactiveColor;
+  RangeLEDInactiveColorValLbl.Caption := ColorToString(SuperGauge.RangeLEDSettings.InactiveColor);
+  RangeLEDBorderColorCb.Selected := SuperGauge.RangeLEDSettings.BorderColor;
+  RangeLEDBorderColorValLbl.Caption := ColorToString(SuperGauge.RangeLEDSettings.BorderColor);
+
+  RangeLEDSizeSpe.Value := SuperGauge.RangeLEDSettings.Size;
+  RangeLEDOffsetXSpe.Value := SuperGauge.RangeLEDSettings.OffsetX;
+  RangeLEDOffsetYSpe.Value := SuperGauge.RangeLEDSettings.OffsetY;
+  RangeLEDOffsetXValLbl.Caption := IntToStr(SuperGauge.RangeLEDSettings.OffsetX);
+  RangeLEDOffsetYValLbl.Caption := IntToStr(SuperGauge.RangeLEDSettings.OffsetY);
+
+  // Range Check Stuff
+
+  RangeLEDRangeTypeCb.ItemIndex := ord(SuperGauge.RangeLEDSettings.RangeType);
+  RangeLEDRangeTypeValLbl1.Caption := IntToStr(ord(SuperGauge.RangeLEDSettings.RangeType));
+  RangeLEDRangeStartSpe.Value := SuperGauge.RangeLEDSettings.RangeStartValue;
+  RangeLEDRangeEndSpe.Value := SuperGauge.RangeLEDSettings.RangeEndValue;
+  RangeLEDRangeStartValLbl1.Caption := FloatToStr(SuperGauge.RangeLEDSettings.RangeStartValue);
+  RangeLEDRangeEndValLbl1.Caption := FloatToStr(SuperGauge.RangeLEDSettings.RangeEndValue);
+end;
+
+procedure TSGTestFrm.UpdateMarkerStats;
+begin
+  Marker1EnabledCb.Checked := SuperGauge.MarkerSettings1.Enabled;
+  Marker1ColorCb.Selected := SuperGauge.MarkerSettings1.Color;
+  Marker1WidthSpe.Value := SuperGauge.MarkerSettings1.Width;
+  Marker1HeightSpe.Value := SuperGauge.MarkerSettings1.Height;
+  Marker1RadiusSpe.Value := SuperGauge.MarkerSettings1.Radius;
+  Marker1ValueSpe.Value := SuperGauge.MarkerSettings1.Value;
+
+  // msCenter = 0, msLeft = 1, msRight = 2
+  Marker1StyleCb.ItemIndex := ord(SuperGauge.MarkerSettings1.Style);
+
+  Marker2EnabledCb.Checked := SuperGauge.MarkerSettings2.Enabled;
+  Marker2ColorCb.Selected := SuperGauge.MarkerSettings2.Color;
+  Marker2WidthSpe.Value := SuperGauge.MarkerSettings2.Width;
+  Marker2HeightSpe.Value := SuperGauge.MarkerSettings2.Height;
+  Marker2RadiusSpe.Value := SuperGauge.MarkerSettings2.Radius;
+  Marker2ValueSpe.Value := SuperGauge.MarkerSettings2.Value;
+
+  // msCenter = 0, msLeft = 1, msRight = 2
+  Marker2StyleCb.ItemIndex := ord(SuperGauge.MarkerSettings2.Style);
+
+  Marker3EnabledCb.Checked := SuperGauge.MarkerSettings3.Enabled;
+  Marker3ColorCb.Selected := SuperGauge.MarkerSettings3.Color;
+  Marker3WidthSpe.Value := SuperGauge.MarkerSettings3.Width;
+  Marker3HeightSpe.Value := SuperGauge.MarkerSettings3.Height;
+  Marker3RadiusSpe.Value := SuperGauge.MarkerSettings3.Radius;
+  Marker3ValueSpe.Value := SuperGauge.MarkerSettings3.Value;
+
+  // msCenter = 0, msLeft = 1, msRight = 2
+  Marker3StyleCb.ItemIndex := ord(SuperGauge.MarkerSettings3.Style);
+end;
+
+procedure TSGTestFrm.UpdateBandStats;
+begin
+  // Band Settings
+  // Band 1 edits setup
+
+  Band1EnabledCb.Checked := SuperGauge.BandSettings1.Enabled;
+  Band1EnabledTextCb.Checked := SuperGauge.BandSettings1.EnableText;
+  Band1ColorCb.Selected := SuperGauge.BandSettings1.BandColor;
+  Band1StartValueSpe.Value := SuperGauge.BandSettings1.StartValue;
+  Band1EndValueSpe.Value := SuperGauge.BandSettings1.EndValue;
+  Band1ThicknessSpe.Value := SuperGauge.BandSettings1.Thickness;
+  Band1BandRadiusSpe.Value := SuperGauge.BandSettings1.BandRadius;
+  Band1TextEdt.Text := SuperGauge.BandSettings1.Text;
+  Band1TextColorCb.Selected := SuperGauge.BandSettings1.TextColor;
+  Band1TextSizeSpe.Value := SuperGauge.BandSettings1.TextSize;
+  Band1TextRadiusSpe.Value := SuperGauge.BandSettings1.TextRadius;
+
+  // 0 = Bold=fsBold, 1 = Italic=fsItalic, 2 = Underline=fsUnderline 3 = Strike Out=fsStrikeOut,
+  // if the order in the dropdown changes this is hosed
+
+  // Setting each of these will call the onChange handler!
+
+  Band1TextStyleDDCb.Checked[0] := fsBold in SuperGauge.BandSettings1.TextStyle;
+  Band1TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.BandSettings1.TextStyle;
+  Band1TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.BandSettings1.TextStyle;
+  Band1TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.BandSettings1.TextStyle;
+
+  // Band 2 edits setup
+
+  Band2EnabledCb.Checked := SuperGauge.BandSettings2.Enabled;
+  Band2EnabledTextCb.Checked := SuperGauge.BandSettings2.EnableText;
+  Band2ColorCb.Selected := SuperGauge.BandSettings2.BandColor;
+  Band2StartValueSpe.Value := SuperGauge.BandSettings2.StartValue;
+  Band2EndValueSpe.Value := SuperGauge.BandSettings2.EndValue;
+  Band2ThicknessSpe.Value := SuperGauge.BandSettings2.Thickness;
+  Band2BandRadiusSpe.Value := SuperGauge.BandSettings2.BandRadius;
+  Band2TextEdt.Text := SuperGauge.BandSettings2.Text;
+  Band2TextColorCb.Selected := SuperGauge.BandSettings2.TextColor;
+  Band2TextSizeSpe.Value := SuperGauge.BandSettings2.TextSize;
+  Band2TextRadiusSpe.Value := SuperGauge.BandSettings2.TextRadius;
+  Band2TextStyleDDCb.Checked[0] := fsBold in SuperGauge.BandSettings2.TextStyle;
+  Band2TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.BandSettings2.TextStyle;
+  Band2TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.BandSettings2.TextStyle;
+  Band2TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.BandSettings2.TextStyle;
+
+  // Band 3 edits setup
+
+  Band3EnabledCb.Checked := SuperGauge.BandSettings3.Enabled;
+  Band3EnabledTextCb.Checked := SuperGauge.BandSettings3.EnableText;
+  Band3ColorCb.Selected := SuperGauge.BandSettings3.BandColor;
+  Band3StartValueSpe.Value := SuperGauge.BandSettings3.StartValue;
+  Band3EndValueSpe.Value := SuperGauge.BandSettings3.EndValue;
+  Band3ThicknessSpe.Value := SuperGauge.BandSettings3.Thickness;
+  Band3BandRadiusSpe.Value := SuperGauge.BandSettings3.BandRadius;
+  Band3TextEdt.Text := SuperGauge.BandSettings3.Text;
+  Band3TextColorCb.Selected := SuperGauge.BandSettings3.TextColor;
+  Band3TextSizeSpe.Value := SuperGauge.BandSettings3.TextSize;
+  Band3TextRadiusSpe.Value := SuperGauge.BandSettings3.TextRadius;
+  Band3TextStyleDDCb.Checked[0] := fsBold in SuperGauge.BandSettings3.TextStyle;
+  Band3TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.BandSettings3.TextStyle;
+  Band3TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.BandSettings3.TextStyle;
+  Band3TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.BandSettings3.TextStyle;
+
+  // Band 4 edits setup
+
+  Band4EnabledCb.Checked := SuperGauge.BandSettings4.Enabled;
+  Band4EnabledTextCb.Checked := SuperGauge.BandSettings4.EnableText;
+  Band4ColorCb.Selected := SuperGauge.BandSettings4.BandColor;
+  Band4StartValueSpe.Value := SuperGauge.BandSettings4.StartValue;
+  Band4EndValueSpe.Value := SuperGauge.BandSettings4.EndValue;
+  Band4ThicknessSpe.Value := SuperGauge.BandSettings4.Thickness;
+  Band4BandRadiusSpe.Value := SuperGauge.BandSettings4.BandRadius;
+  Band4TextEdt.Text := SuperGauge.BandSettings4.Text;
+  Band4TextColorCb.Selected := SuperGauge.BandSettings4.TextColor;
+  Band4TextSizeSpe.Value := SuperGauge.BandSettings4.TextSize;
+  Band4TextRadiusSpe.Value := SuperGauge.BandSettings4.TextRadius;
+  Band4TextStyleDDCb.Checked[0] := fsBold in SuperGauge.BandSettings4.TextStyle;
+  Band4TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.BandSettings4.TextStyle;
+  Band4TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.BandSettings4.TextStyle;
+  Band4TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.BandSettings4.TextStyle;
+
+end;
+
+procedure TSGTestFrm.UpdateTextStats;
+begin
+  // Text Settings
+  // Band 1 edits setup
+
+  Text1EnabledCb.Checked := SuperGauge.TextSettings1.Enabled;
+  Text1ColorCb.Selected := SuperGauge.TextSettings1.FontEx.Color;
+  Text1TextEdt.Text := SuperGauge.TextSettings1.Text;
+  Text1TextSizeSpe.Value := SuperGauge.TextSettings1.FontEx.Height;
+  Text1OffsetXSpe.Value := SuperGauge.TextSettings1.OffsetX;
+  Text1OffsetYSpe.Value := SuperGauge.TextSettings1.OffsetY;
+
+  // 0 = Bold=fsBold, 1 = Italic=fsItalic, 2 = Underline=fsUnderline 3 = Strike Out=fsStrikeOut
+  // if the order in the dropdown changes this is hosed
+
+  // Setting each of these will call the onChange handler!
+
+  Text1TextStyleDDCb.Checked[0] := fsBold in SuperGauge.TextSettings1.FontEx.Style;
+  Text1TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.TextSettings1.FontEx.Style;
+  Text1TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.TextSettings1.FontEx.Style;
+  Text1TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.TextSettings1.FontEx.Style;
+
+  Text2EnabledCb.Checked := SuperGauge.TextSettings2.Enabled;
+  Text2ColorCb.Selected := SuperGauge.TextSettings2.FontEx.Color;
+  Text2TextEdt.Text := SuperGauge.TextSettings2.Text;
+  Text2TextSizeSpe.Value := SuperGauge.TextSettings2.FontEx.Height;
+  Text2OffsetXSpe.Value := SuperGauge.TextSettings2.OffsetX;
+  Text2OffsetYSpe.Value := SuperGauge.TextSettings2.OffsetY;
+  Text2TextStyleDDCb.Checked[0] := fsBold in SuperGauge.TextSettings2.FontEx.Style;
+  Text2TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.TextSettings2.FontEx.Style;
+  Text2TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.TextSettings2.FontEx.Style;
+  Text2TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.TextSettings2.FontEx.Style;
+
+  Text3EnabledCb.Checked := SuperGauge.TextSettings3.Enabled;
+  Text3ColorCb.Selected := SuperGauge.TextSettings3.FontEx.Color;
+  Text3TextEdt.Text := SuperGauge.TextSettings3.Text;
+  Text3TextSizeSpe.Value := SuperGauge.TextSettings3.FontEx.Height;
+  Text3OffsetXSpe.Value := SuperGauge.TextSettings3.OffsetX;
+  Text3OffsetYSpe.Value := SuperGauge.TextSettings3.OffsetY;
+  Text3TextStyleDDCb.Checked[0] := fsBold in SuperGauge.TextSettings3.FontEx.Style;
+  Text3TextStyleDDCb.Checked[1] := fsItalic in SuperGauge.TextSettings3.FontEx.Style;
+  Text3TextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.TextSettings3.FontEx.Style;
+  Text3TextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.TextSettings3.FontEx.Style;
+end;
+
+procedure TSGTestFrm.UpdateCapStats;
+begin
+  // Pointer Cap Settings
+
+  CapPositionCb.ItemIndex := ord(SuperGauge.PointerCapSettings.CapPosition);
+  CapStyleCb.ItemIndex := ord(SuperGauge.PointerCapSettings.CapStyle);
+  CapCurveExponentSpe.Value := SuperGauge.PointerCapSettings.CurveExponent;
+  CapEdgeColorCb.Selected := SuperGauge.PointerCapSettings.EdgeColor;
+  CapFillColorCb.Selected := SuperGauge.PointerCapSettings.FillColor;
+  CapLightIntensitySpe.Value := SuperGauge.PointerCapSettings.LightIntensity;
+  CapRadiusSpe.Value := SuperGauge.PointerCapSettings.Radius;
+end;
+
+procedure TSGTestFrm.UpdatePointerStats;
+begin
+  // Pointer Settings
+
+  PointerColorCb.Selected := SuperGauge.PointerSettings.Color;
+  PointerLengthSpe.Value := SuperGauge.PointerSettings.Length;
+  PointerExtensionLengthSpe.Value := SuperGauge.PointerSettings.ExtensionLength;
+  PointerStyleCb.ItemIndex := ord(SuperGauge.PointerSettings.Style);
+  PointerThicknessSpe.Value := SuperGauge.PointerSettings.Thickness;
+end;
+
+procedure TSGTestFrm.UpdateScaleStats;
+begin
+  // Scale Settings
+
+  ScaleEnableMainTicsCb.Checked := SuperGauge.ScaleSettings.EnableMainTicks;
+  ScaleEnableSubTicsCb.Checked := SuperGauge.ScaleSettings.EnableSubTicks;
+  EnableScaleTextCb.Checked := SuperGauge.ScaleSettings.EnableScaleText;
+  ScaleReversedCb.Checked := SuperGauge.ScaleSettings.ReverseScale;
+  ScaleLengthMainTickSpe.Value := SuperGauge.ScaleSettings.LengthMainTick;
+  ScaleLengthSubTickSpe.Value := SuperGauge.ScaleSettings.LengthSubTick;
+  ScaleMainTickCountSpe.Value := SuperGauge.ScaleSettings.MainTickCount;
+  ScaleSubTickCountSpe.Value := SuperGauge.ScaleSettings.SubTickCount;
+  ScaleStartSpe.Value := SuperGauge.ScaleSettings.Start;
+  ScaleStepSpe.Value := SuperGauge.ScaleSettings.Step;
+
+  ScaleSubTickCountSpe.Value := SuperGauge.ScaleSettings.SubTickCount;
+  ScaleRadiusSpe.Value := SuperGauge.ScaleSettings.ScaleRadius;
+  ScaleTickColorColorCb.Selected := SuperGauge.ScaleSettings.TickColor;
+  ScaleTextRadiusSpe.Value := SuperGauge.ScaleSettings.TextRadius;
+  ScaleTextColorColorCb.Selected := SuperGauge.ScaleSettings.TextColor;
+
+  ScaleTextStyleDDCb.Checked[0] := fsBold in SuperGauge.ScaleSettings.TextStyle;
+  ScaleTextStyleDDCb.Checked[1] := fsItalic in SuperGauge.ScaleSettings.TextStyle;
+  ScaleTextStyleDDCb.Checked[2] := fsUnderline in SuperGauge.ScaleSettings.TextStyle;
+  ScaleTextStyleDDCb.Checked[3] := fsStrikeOut in SuperGauge.ScaleSettings.TextStyle;
+
+  ScaleTextSizeSpe.Value := SuperGauge.ScaleSettings.TextSize;
+  ScaleMainTickThicknessSpe.Value := SuperGauge.ScaleSettings.ThicknessMainTick;
+  ScaleSubTickThicknessSpe.Value := SuperGauge.ScaleSettings.ThicknessSubTick;
+  ScaleTickArcStyleCb.ItemIndex := ord(SuperGauge.ScaleSettings.TickArcStyle);
+
+end;
+
+procedure TSGTestFrm.UpdateFaceStats;
+begin
+  // Face Settings
+
+  FaceFillStyleCb.ItemIndex := ord(SuperGauge.FaceSettings.FillStyle);
+  FaceOuterColorCb.Selected := SuperGauge.FaceSettings.OuterColor;
+  FaceInnerColorCb.Selected := SuperGauge.FaceSettings.InnerColor;
+  FacePictureEnabledCb.Checked := SuperGauge.FaceSettings.PictureEnabled;
+  FacePictureOffsetXSpe.Value := SuperGauge.FaceSettings.PictureOffsetX;
+  FacePictureOffsetYSpe.Value := SuperGauge.FaceSettings.PictureOffsetY;
+end;
+
+procedure TSGTestFrm.UpdateFrameStats;
+begin
+  FrameBorderColorCb.Selected := SuperGauge.FrameSettings.BorderColor;
+  FrameFrameColorCb.Selected :=  SuperGauge.FrameSettings.FrameColor;
+  FrameRadiusSpe.Value := SuperGauge.FrameSettings.BorderRadius;
+end;
+
+procedure TSGTestFrm.LEDOnBtnClick(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.Active:=True;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.LEDOffBtnClick(Sender: TObject);
+begin
+    SuperGauge.RangeLEDSettings.Active:=False;
+    UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDOffsetXSpeChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.OffsetX := RangeLEDOffsetXSpe.Value;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDOffsetYSpeChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.OffsetY := RangeLEDOffsetYSpe.Value;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDActiveColorCbChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.ActiveColor := RangeLEDActiveColorCb.Selected;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDBorderColorCbChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.BorderColor := RangeLEDBorderColorCb.Selected;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.Band1ThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.Thickness := Band1ThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.RangeLEDRangeTypeCbChange(Sender: TObject);
+begin
+  // Range Types -
+  //          rcNone, rcGaugeOutOfRange, rcBetween, rcBothInclusive,
+  //          rcStartInclusive, rcEndInclusive, rcBothBetweenOutside,
+  //          rcBothInclusiveOutside, rcGreaterStart, rcLessEnd
+
+  RangeLEDRangeStartSpe.ReadOnly := False;
+  RangeLEDRangeEndSpe.ReadOnly := False;
+  RangeLEDRangeStartSpe.Color := clWindow;
+  RangeLEDRangeEndSpe.Color := clWindow;
+
+  case RangeLEDRangeTypeCb.ItemIndex of
+    0 : {rcNone}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcNone;
+          RangeLEDFillStyleValLbl.Caption := 'rcNone';
+          RangeLEDRangeStartSpe.ReadOnly := True;
+          RangeLEDRangeEndSpe.ReadOnly := True;
+          RangeLEDRangeStartSpe.Color := clInactiveCaption;
+          RangeLEDRangeEndSpe.Color := clInactiveCaption;
+        end;
+
+    1 : {rcGaugeOutOfRange} // uses gauge range only, ignores RangeLED start/end
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcGaugeOutOfRange;
+          RangeLEDFillStyleValLbl.Caption := 'rcGaugeOutOfRange';
+          RangeLEDRangeStartSpe.ReadOnly := True;
+          RangeLEDRangeEndSpe.ReadOnly := True;
+          RangeLEDRangeStartSpe.Color := clInactiveCaption;
+          RangeLEDRangeEndSpe.Color := clInactiveCaption;
+        end;
+    2 : {rcBetween}
+        begin
+            SuperGauge.RangeLEDSettings.RangeType := rcBetween;
+            RangeLEDFillStyleValLbl.Caption := 'rcBetween';
+        end;
+    3 : {rcBothInclusive}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcBothInclusive;
+          RangeLEDFillStyleValLbl.Caption := 'rcBothInclusive';
+        end;
+    4 : {rcStartInclusive}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcStartInclusive;
+          RangeLEDFillStyleValLbl.Caption := 'rcStartInclusive';
+        end;
+    5 : {rcEndInclusive}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcEndInclusive;
+          RangeLEDFillStyleValLbl.Caption := 'rcEndInclusive';
+        end;
+    6 : {rcBothBetweenOutside}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcBothBetweenOutside;
+          RangeLEDFillStyleValLbl.Caption := 'rcBothBetweenOutside';
+        end;
+    7 : {rcBothInclusiveOutside}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcBothInclusiveOutside;
+          RangeLEDFillStyleValLbl.Caption := 'rcBothInclusiveOutside';
+        end;
+
+    // These last cases are really just making it so you only look at start or end
+    // You could use the above with a LARGE number (Max integer) for the end, or Min Integer
+    // and get the same results, but this just ensures it to work looking only at one value
+
+    8 : {rcGreaterStart}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcGreaterStart;
+          RangeLEDFillStyleValLbl.Caption := 'rcGreaterStart';
+          RangeLEDRangeEndSpe.ReadOnly := True;
+          RangeLEDRangeEndSpe.Color := clInactiveCaption;
+        end;
+    9 : {rcLessEnd}
+        begin
+          SuperGauge.RangeLEDSettings.RangeType := rcLessEnd;
+          RangeLEDFillStyleValLbl.Caption := 'rcLessEnd';
+          RangeLEDRangeStartSpe.ReadOnly := True;
+          RangeLEDRangeStartSpe.Color := clInactiveCaption;
+        end;
+  else
+    RangeLEDFillStyleValLbl.Caption := 'Gauge Has Unknown Range Type';
+  end;
+
+  UpdateRangeLEDStats;
+
+end;
+
+procedure TSGTestFrm.RangeLEDInactiveColorCbChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.InactiveColor := RangeLEDInactiveColorCb.Selected;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDRangeStartSpeChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.RangeStartValue := RangeLEDRangeStartSpe.Value;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDRangeEndSpeChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.RangeEndValue := RangeLEDRangeEndSpe.Value;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDStyleCbChange(Sender: TObject);
+begin
+  // Set the Fill Style of the LED, update the stats
+  // lsNone = 0, lsFlat = 1, lsShaded = 2
+
+  case RangeLEDStyleCb.ItemIndex of
+    0 : {lsNone}
+        begin
+          SuperGauge.RangeLEDSettings.Style := lsNone;
+          RangeLEDFillStyleValLbl.Caption := 'lsNone';
+        end;
+    1 : {lsFlat}
+        begin
+            SuperGauge.RangeLEDSettings.Style := lsFlat;
+            RangeLEDFillStyleValLbl.Caption := 'lsFlat';
+        end;
+    2 : {lsShaded}
+        begin
+          SuperGauge.RangeLEDSettings.Style := lsShaded;
+          RangeLEDFillStyleValLbl.Caption := 'lsShaded';
+        end
+  else
+    RangeLEDFillStyleValLbl.Caption := 'Gauge Has Unknown LED Fill Type';
+  end;
+
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDShapeCbChange(Sender: TObject);
+begin
+  // Set the Shape of the LED, update the stats
+  // lshRound = 0, lshSquare = 1, lshTriangle = 2, lshDownTriangle = 3
+
+  case RangeLEDShapeCb.ItemIndex of
+    0 : {lshRound}
+        begin
+          SuperGauge.RangeLEDSettings.Shape := lshRound;
+          RangeLEDShapeValLbl.Caption := 'lshRound';
+        end;
+    1 : {lshSquare}
+        begin
+            SuperGauge.RangeLEDSettings.Shape := lshSquare;
+            RangeLEDShapeValLbl.Caption := 'lshSquare';
+        end;
+    2 : {lshTriangle}
+        begin
+          SuperGauge.RangeLEDSettings.Shape := lshTriangle;
+          RangeLEDShapeValLbl.Caption := 'lshTriangle';
+        end;
+    3 : {lshDownTriangle}
+        begin
+          SuperGauge.RangeLEDSettings.Shape := lshDownTriangle;
+          RangeLEDShapeValLbl.Caption := 'lshDownTriangle';
+        end
+  else
+    RangeLEDShapeValLbl.Caption := 'Gauge Has Unknown LED Shape Type';
+  end;
+
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.Size := RangeLEDSizeSpe.Value;
+  UpdateRangeLEDStats;
+end;
+
+
+procedure TSGTestFrm.RangeLEDResetOffsetBtnClick(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.OffsetX := 90;
+  SuperGauge.RangeLEDSettings.OffsetY := 120;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.RangeLEDResetRangesBtnClick(Sender: TObject);
+begin
+  SuperGauge.RangeLEDSettings.RangeStartValue := 0.0;
+  SuperGauge.RangeLEDSettings.RangeEndValue := 100.0;
+  UpdateRangeLEDStats;
+end;
+
+procedure TSGTestFrm.OverloadPosBtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, 250);
+end;
+
+procedure TSGTestFrm.OverloadNegBtnClick(Sender: TObject);
+begin
+   BGRAKnobValueChanged(Sender, -250);
+end;
+
+procedure TSGTestFrm.SuperGaugeDblClick(Sender: TObject);
+begin
+  Beep;
+end;
+
+procedure TSGTestFrm.SuperGaugeBackInRange(Sender: TObject; RangeValue: single);
+begin
+  // ONLY calLED once when the previous state of the gauge was out of range.
+  // This is done to eliminate calling this on every change of the gauge value
+
+  OutOfRangeLbl.Caption := FloatToStr(RangeValue) + ' In Range' ;
+//  SuperGauge.RangeLEDSettings.Active := False; // Turn off the LED
+  SuperGauge.BandSettings3.TextColor := clWhite;
+  GaugeRangeError := False;
+  Timer1.EnabLED:=False;
+  TimerState := True; // force call to always clean
+  Timer1Timer(self);
+end;
+
+procedure TSGTestFrm.SuperGaugeOutOfRange(Sender: TObject; OutOfRangeValue: single);
+begin
+  // CalLED any time the guage value is out of range. Will only be reset
+  // once the value is in range, and that is handled by the BackInRange event, that
+  // by the way if you read above is only callled once on state change to a valid value.
+
+  OutOfRangeLbl.Caption := FloatToStr(OutOfRangeValue) + ' Out of Range';
+//  SuperGauge.RangeLEDSettings.Active := True; // Turn on the LED
+  GaugeRangeError := True;
+  TimerState := False;
+  Timer1.EnabLED := True;
+  TimerState := False; // force call to always set, next tic will be turning off
+  Timer1Timer(self);
+end;
+
+procedure TSGTestFrm.SuperGaugeRangeLEDInactive(Sender: TObject; Value: single);
+begin
+  RangeLEDCallBackLED.Color := SuperGauge.RangeLEDSettings.InactiveColor;
+  RangeLEDCallbackNameValLbl.Caption := 'Inactive at ' + FloatToStr(Value);;
+end;
+
+procedure TSGTestFrm.SuperGaugeRangeLEDActive(Sender: TObject; Value: single);
+begin
+  RangeLEDCallBackLED.Color := SuperGauge.RangeLEDSettings.ActiveColor;
+  RangeLEDCallbackNameValLbl.Caption := 'Active at ' + FloatToStr(Value);
+end;
+
+procedure TSGTestFrm.AutoScaleCbChange(Sender: TObject);
+begin
+  SuperGauge.AutoScale := AutoScaleCb.checked;
+end;
+
+procedure TSGTestFrm.AboutSubMenuClick(Sender: TObject);
+begin
+  AboutFrm.show;
+end;
+
+procedure TSGTestFrm.Band1ColorCbChange(Sender: TObject);
+begin
+    SuperGauge.BandSettings1.BandColor := Band1ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band1EndValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.EndValue := Band1EndValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band1SetFontBtnClick(Sender: TObject);
+begin
+  if FontDialog1.Execute then
+    SuperGauge.BandSettings1.TextFont := FontDialog1.Font.Name;
+end;
+
+procedure TSGTestFrm.Band1StartValueSpeChange(Sender: TObject);
+begin
+    SuperGauge.BandSettings1.StartValue := Band1StartValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band1TextColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.TextColor := Band1TextColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band1TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.Text := Band1TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Band1EnabledTextCbChange(Sender: TObject);
+begin
+    SuperGauge.BandSettings1.EnableText := Band1EnabledTextCb.Checked;
+end;
+
+procedure TSGTestFrm.Band1BandRadiusSpeChange(Sender: TObject);
+begin
+    SuperGauge.BandSettings1.BandRadius := Band1BandRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band1TextRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.TextRadius := Band1TextRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band1TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.TextSize := Band1TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Band1TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.BandSettings1.TextStyle;
+
+    if Band1TextStyleDDCb.Checked[AIndex] then
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.BandSettings1.TextStyle := TextStyle;
+end;
+
+procedure TSGTestFrm.Band2BandRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.BandRadius := Band2BandRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.Enabled := Band2EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.Band2EnabledTextCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.EnableText := Band2EnabledTextCb.Checked;
+end;
+
+procedure TSGTestFrm.Band2EndValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.EndValue := Band2EndValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2SetFontBtnClick(Sender: TObject);
+begin
+  if FontDialog1.Execute then
+    SuperGauge.BandSettings2.TextFont := FontDialog1.Font.Name;
+end;
+
+procedure TSGTestFrm.Band2StartValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.StartValue := Band2StartValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2TextColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.TextColor := Band2TextColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band2TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.Text := Band2TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Band2TextRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.TextRadius := Band2TextRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.TextSize := Band2TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.BandSettings2.TextStyle;
+
+    if Band1TextStyleDDCb.Checked[AIndex] then
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.BandSettings2.TextStyle := TextStyle;
+end;
+
+procedure TSGTestFrm.Band2ThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.Thickness := Band2ThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.Band2ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings2.BandColor := Band2ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band3BandRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.BandRadius := Band3BandRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band3ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.BandColor := Band3ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band3EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.Enabled := Band3EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.Band3EnabledTextCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.EnableText := Band3EnabledTextCb.Checked;
+end;
+
+procedure TSGTestFrm.Band3EndValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.EndValue := Band3EndValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band3SetFontBtnClick(Sender: TObject);
+begin
+  if FontDialog1.Execute then
+    SuperGauge.BandSettings3.TextFont := FontDialog1.Font.Name;
+end;
+
+procedure TSGTestFrm.Band3StartValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.StartValue := Band3StartValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band3TextColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.TextColor := Band3TextColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band3TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.Text := Band3TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Band3TextRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.TextRadius := Band3TextRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band3TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.TextSize := Band3TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Band3TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.BandSettings3.TextStyle;
+
+    if Band1TextStyleDDCb.Checked[AIndex] then
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.BandSettings3.TextStyle := TextStyle;
+end;
+
+procedure TSGTestFrm.Band3ThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings3.Thickness := Band3ThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4BandRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.BandRadius := Band4BandRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.BandColor := Band4ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band4EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.Enabled := Band4EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.Band4EnabledTextCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.EnableText := Band4EnabledTextCb.Checked;
+end;
+
+procedure TSGTestFrm.Band4EndValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.EndValue := Band4EndValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4SetFontBtnClick(Sender: TObject);
+begin
+  if FontDialog1.Execute then
+    SuperGauge.BandSettings4.TextFont := FontDialog1.Font.Name;
+end;
+
+procedure TSGTestFrm.Band4StartValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.StartValue := Band4StartValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4TextColorCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.TextColor := Band4TextColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Band4TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.Text := Band4TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Band4TextRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.TextRadius := Band4TextRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.TextSize := Band4TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Band4TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.BandSettings4.TextStyle;
+
+    if Band1TextStyleDDCb.Checked[AIndex] then
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Band1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.BandSettings4.TextStyle := TextStyle;
+end;
+procedure TSGTestFrm.Band4ThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings4.Thickness := Band4ThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.BGRAKnobValueChanged(Sender: TObject; Value: single);
+begin
+
+  if TryToRoundValueCb.State = cbChecked then
+    SuperGauge.Value := Round(Value)
+  else
+    SuperGauge.Value := Value;
+
+  // Move markers, the timer tics allow the markers have a peak
+  // and hold effect. The reset counters will reset if the values
+  // have updated. If no updates the counters will eventually
+  // trigger a reset and the markers will snap back to the pointer.
+  //
+  // Why is this not part of the gauge? It might be but I was concerned
+  // with a situation with having a bunch of gauges each with a timer. The
+  // better solution is to have an external controller doing the reset with
+  // one timer reseting all the gauges. Was thinking about a TSGController or
+  // something like that TBD, but for now here is what I did here.
+
+  // Move the High side valve (Red)
+
+  if SuperGauge.Value > SuperGauge.MarkerSettings1.Value  then
+  begin
+    SuperGauge.MarkerSettings1.Value := SuperGauge.Value;
+    ResetHiTics := 0; // reset since we just bumped
+  end;
+
+  // Move Sticky Peak (Yellow)
+
+  if SuperGauge.Value > SuperGauge.MarkerSettings3.Value  then
+  begin
+    SuperGauge.MarkerSettings3.Value := SuperGauge.Value;
+  end;
+
+  // Move the Low side valve (Green)
+
+  if SuperGauge.Value < SuperGauge.MarkerSettings2.Value  then
+  begin
+    SuperGauge.MarkerSettings2.Value := SuperGauge.Value;
+    ResetLoTics := 0; // reset since we just bumped
+  end;
+
+  // if we have 10 tics without a bump, reset them
+
+  if ResetHiTics > 9 then
+  begin
+    ResetHiTics := 0;
+    SuperGauge.MarkerSettings1.Value := SuperGauge.Value;
+  end;
+
+  if ResetLoTics > 9 then
+  begin
+    ResetLoTics := 0;
+    SuperGauge.MarkerSettings2.Value := SuperGauge.Value;
+  end;
+
+  UpdatePositionStats;
+end;
+
+procedure TSGTestFrm.BandEnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.BandSettings1.Enabled := Band1EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.DisableAllMarkersBtnClick(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Enabled := False;
+  SuperGauge.MarkerSettings2.Enabled := False;
+  SuperGauge.MarkerSettings3.Enabled := False;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.EnableAllMarkersBtnClick(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Enabled := True;
+  SuperGauge.MarkerSettings2.Enabled := True;
+  SuperGauge.MarkerSettings3.Enabled := True;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.ExitSubMenuClick(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TSGTestFrm.RoundBtnClick(Sender: TObject);
+begin
+  // try to round floating point, not always possible
+  BGRAKnobValueChanged(Sender, Round(SuperGauge.Value));
+end;
+
+procedure TSGTestFrm.LoadImageBtnClick(Sender: TObject);
+begin
+  // Load face picture
+
+  if OpenPictureDialog1.Execute then
+  begin
+    if fileExists(OpenPictureDialog1.Filename) then
+    begin
+      SuperGauge.FaceSettings.Picture.LoadFromFile(OpenPictureDialog1.Filename);
+    end;
+  end
+else
+  ShowMessage('No Picture Selected');
+end;
+
+procedure TSGTestFrm.MarkerZeroAllBtnClick(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Value := 0;
+  SuperGauge.MarkerSettings2.Value := 0;
+  SuperGauge.MarkerSettings3.Value := 0;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker1ValueClrBtnClick(Sender: TObject);
+begin
+  Marker1ValueSpe.Value := 0.0;
+  SuperGauge.MarkerSettings1.Value := 0.0;
+end;
+
+procedure TSGTestFrm.Marker2ValueClrBtnClick(Sender: TObject);
+begin
+    Marker2ValueSpe.Value := 0.0;
+    SuperGauge.MarkerSettings2.Value := 0.0;
+end;
+
+procedure TSGTestFrm.MaxValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.MaxValue := MaxValueSpe.Value;
+  UpdatePositionStats;
+end;
+
+procedure TSGTestFrm.MinValueBtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.MinValue);
+end;
+
+procedure TSGTestFrm.MaxValueBtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.MaxValue);
+end;
+
+procedure TSGTestFrm.MinValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.MinValue := MinValueSpe.Value;
+  UpdatePositionStats;
+end;
+
+procedure TSGTestFrm.Marker3ValueClrBtnClick(Sender: TObject);
+begin
+  Marker3ValueSpe.Value := 0.0;
+  SuperGauge.MarkerSettings3.Value := 0.0;
+end;
+
+procedure TSGTestFrm.RandomBtnClick(Sender: TObject);
+begin
+  // similar to the MarkerRandomTestBTN code except it doesn't force markers
+  // to be on. By default they are in the gauge props
+
+  SuperGauge.Value := 0.0;              // Always reset
+  ResetLoTics := 10;                    // 10 forces update now unless timer stopped
+  ResetHiTics := 10;
+  Timer2.Enabled := not Timer2.Enabled; // toggle timer
+  uELED1.Active:=Timer2.Enabled;
+end;
+
+procedure TSGTestFrm.MarkerRandomTestBtnClick(Sender: TObject);
+begin
+  // turn on marks and then random it up, like RandomBtnClick
+
+  SuperGauge.MarkerSettings1.Enabled := True;
+  SuperGauge.MarkerSettings2.Enabled := True;
+  SuperGauge.MarkerSettings3.Enabled := True;
+  MarkerZeroAllBtnClick(Sender);
+  RandomBtn.Click;
+end;
+
+procedure TSGTestFrm.CapCurveExponentSpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerCapSettings.CurveExponent := CapCurveExponentSpe.Value;
+end;
+
+procedure TSGTestFrm.CapEdgeColorCbChange(Sender: TObject);
+begin
+  SuperGauge.PointerCapSettings.EdgeColor := CapEdgeColorCb.Selected;
+end;
+
+procedure TSGTestFrm.CapFillColorCbChange(Sender: TObject);
+begin
+  SuperGauge.PointerCapSettings.FillColor := CapFillColorCb.Selected;
+end;
+
+procedure TSGTestFrm.CapLightIntensitySpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerCapSettings.LightIntensity := CapLightIntensitySpe.Value;
+  UpdateCapStats;
+end;
+
+procedure TSGTestFrm.CapPositionCbChange(Sender: TObject);
+begin
+  // Set the Pointer Cap position over the pointer or under it
+  // cpUnder = 0, cpOver = 1
+
+  case CapPositionCb.ItemIndex of
+    0 : {cpUnder}
+        begin
+          SuperGauge.PointerCapSettings.CapPosition := cpUnder;
+        end;
+    1 : {cpOver}
+        begin
+          SuperGauge.PointerCapSettings.CapPosition := cpOver;
+        end;
+  else
+    // Unknown type, warn somewhere...
+  end;
+
+  UpdateCapStats;
+end;
+
+procedure TSGTestFrm.CapRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerCapSettings.Radius := CapRadiusSpe.Value;
+  UpdateCapStats;
+end;
+
+procedure TSGTestFrm.CapStyleCbChange(Sender: TObject);
+begin
+  // csNone = 0, csFlat = 1, csShaded = 2, csPhong = 3
+  case CapStyleCb.ItemIndex of
+    0 : {csNone}
+        begin
+          SuperGauge.PointerCapSettings.CapStyle := csNone;
+        end;
+    1 : {csFlat}
+        begin
+          SuperGauge.PointerCapSettings.CapStyle := csFlat;
+        end;
+    2 : {csShaded}
+        begin
+          SuperGauge.PointerCapSettings.CapStyle := csShaded;
+        end;
+    3 : {csPhong}
+        begin
+          SuperGauge.PointerCapSettings.CapStyle := csPhong;
+        end;
+  else
+    // Unknown type, warn somewhere...
+  end;
+
+  UpdateCapStats;
+end;
+
+procedure TSGTestFrm.EnableScaleTextCbChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.EnableScaleText := EnableScaleTextCb.Checked;
+end;
+
+procedure TSGTestFrm.FaceInnerColorCbChange(Sender: TObject);
+begin
+  // update end color
+
+  SuperGauge.FaceSettings.InnerColor := FaceInnerColorCb.Selected;
+end;
+
+procedure TSGTestFrm.FaceOuterColorCbChange(Sender: TObject);
+begin
+  // update start color
+
+  SuperGauge.FaceSettings.OuterColor := FaceOuterColorCb.Selected;
+end;
+
+procedure TSGTestFrm.FaceFillStyleCbChange(Sender: TObject);
+begin
+  // update Face fill style
+  // fsNone = 0, fsGradient = 1
+
+  case FaceFillStyleCb.ItemIndex of
+    0 : {fsNone}
+        begin
+          SuperGauge.FaceSettings.FillStyle := fsNone;
+        end;
+    1 : {fsGradient}
+        begin
+          SuperGauge.FaceSettings.FillStyle := fsGradient;
+        end;
+  else
+    // Unknown type, warn somewhere...
+  end;
+
+  UpdateFaceStats;
+
+end;
+
+procedure TSGTestFrm.FacePictureEnabledCbChange(Sender: TObject);
+begin
+  // Enable/Disable Picture on Face
+  SuperGauge.FaceSettings.PictureEnabled := FacePictureEnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.FacePictureOffsetXSpeChange(Sender: TObject);
+begin
+  // update face picture x offset
+  SuperGauge.FaceSettings.PictureOffsetX := FacePictureOffsetXSpe.Value;
+end;
+
+procedure TSGTestFrm.FacePictureOffsetYSpeChange(Sender: TObject);
+begin
+  // update face picture y offset
+  SuperGauge.FaceSettings.PictureOffsetY := FacePictureOffsetYSpe.Value;
+end;
+
+procedure TSGTestFrm.FrameBorderColorCbChange(Sender: TObject);
+begin
+  // update frame border color
+  SuperGauge.FrameSettings.BorderColor := FrameBorderColorCb.Selected;
+end;
+
+procedure TSGTestFrm.FrameFrameColorCbChange(Sender: TObject);
+begin
+  // update frame color
+  SuperGauge.FrameSettings.FrameColor := FrameFrameColorCb.Selected;
+end;
+
+procedure TSGTestFrm.FrameRadiusSpeChange(Sender: TObject);
+begin
+  // update frame radius
+  SuperGauge.FrameSettings.BorderRadius := FrameRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker1ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Color := Marker1ColorCb.Selected;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker1EnabledCbChange(Sender: TObject);
+begin
+    SuperGauge.MarkerSettings1.Enabled := Marker1EnabledCb.Checked;
+    UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker1HeightSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Height := Marker1HeightSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker1RadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Radius := Marker1RadiusSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker1StyleCbChange(Sender: TObject);
+begin
+  // msCenter = 0, msLeft = 1, msRight = 2
+
+  case Marker1StyleCb.ItemIndex of
+    0 : {msCenter}
+        begin
+          SuperGauge.MarkerSettings1.Style := msCenter;
+        end;
+    1 : {msLeft}
+        begin
+            SuperGauge.MarkerSettings1.Style := msLeft;
+        end;
+    2 : {msRight}
+        begin
+          SuperGauge.MarkerSettings1.Style := msRight;
+        end
+  else
+      // some error message with invalid marker setting
+  end;
+
+  UpdateMarkerStats;
+
+end;
+
+procedure TSGTestFrm.Marker1ValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Value := Marker1ValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker1WidthSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings1.Width := Marker1WidthSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker2ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Color := Marker2ColorCb.Selected;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker2EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Enabled := Marker2EnabledCb.Checked;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker2HeightSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Height := Marker2HeightSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker2RadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Radius := Marker2RadiusSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker2StyleCbChange(Sender: TObject);
+begin
+  // msCenter = 0, msLeft = 1, msRight = 2
+
+  case Marker2StyleCb.ItemIndex of
+    0 : {msCenter}
+        begin
+          SuperGauge.MarkerSettings2.Style := msCenter;
+        end;
+    1 : {msLeft}
+        begin
+            SuperGauge.MarkerSettings2.Style := msLeft;
+        end;
+    2 : {msRight}
+        begin
+          SuperGauge.MarkerSettings2.Style := msRight;
+        end
+  else
+      // some error message with invalid marker setting
+  end;
+
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker2ValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Value := Marker2ValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker2WidthSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings2.Width := Marker2WidthSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker3ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Color := Marker3ColorCb.Selected;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker3EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Enabled := Marker3EnabledCb.Checked;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker3HeightSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Height := Marker3HeightSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker3RadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Radius := Marker3RadiusSpe.Value;
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker3StyleCbChange(Sender: TObject);
+begin
+  // msCenter = 0, msLeft = 1, msRight = 2
+
+  case Marker3StyleCb.ItemIndex of
+    0 : {msCenter}
+        begin
+          SuperGauge.MarkerSettings3.Style := msCenter;
+        end;
+    1 : {msLeft}
+        begin
+            SuperGauge.MarkerSettings3.Style := msLeft;
+        end;
+    2 : {msRight}
+        begin
+          SuperGauge.MarkerSettings3.Style := msRight;
+        end
+  else
+      // some error message with invalid marker setting
+  end;
+
+  UpdateMarkerStats;
+end;
+
+procedure TSGTestFrm.Marker3ValueSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Value := Marker3ValueSpe.Value;
+end;
+
+procedure TSGTestFrm.Marker3WidthSpeChange(Sender: TObject);
+begin
+  SuperGauge.MarkerSettings3.Width := Marker3WidthSpe.Value;
+end;
+
+procedure TSGTestFrm.PointerColorCbChange(Sender: TObject);
+begin
+  SuperGauge.PointerSettings.Color := PointerColorCb.Selected;
+end;
+
+procedure TSGTestFrm.PointerExtensionLengthSpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerSettings.ExtensionLength := PointerExtensionLengthSpe.Value;
+  UpdatePointerStats;
+end;
+
+procedure TSGTestFrm.PointerLengthSpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerSettings.Length := PointerLengthSpe.Value;
+  UpdatePointerStats;
+end;
+
+procedure TSGTestFrm.PointerStyleCbChange(Sender: TObject);
+begin
+  // Set the Pointer Style
+  // psLine = 0, psLineExt = 1, psArc = 2
+
+  case PointerStyleCb.ItemIndex of
+    0 : {psLine}
+        begin
+          SuperGauge.PointerSettings.Style := psLine;
+        end;
+    1 : {psLineExt}
+        begin
+          SuperGauge.PointerSettings.Style := psLineExt;
+        end;
+    2 : {psArc}
+        begin
+          SuperGauge.PointerSettings.Style := psArc;
+        end;
+
+  else
+    // Unknown type, warn somewhere...
+  end;
+
+  UpdatePointerStats;
+end;
+
+procedure TSGTestFrm.PointerThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.PointerSettings.Thickness := PointerThicknessSpe.Value;
+  UpdatePointerStats;
+end;
+
+procedure TSGTestFrm.FacePictureResetOffsetBtnClick(Sender: TObject);
+begin
+  SuperGauge.FaceSettings.PictureOffsetX := 0;
+  SuperGauge.FaceSettings.PictureOffsetY := 0;
+  UpdateFaceStats;
+end;
+
+procedure TSGTestFrm.ResetMinMaxBtnClick(Sender: TObject);
+begin
+  SuperGauge.MinValue := 0.0;
+  SuperGauge.MaxValue := 100.0;
+  UpdateMinMaxStats;
+end;
+
+procedure TSGTestFrm.ScaleEnableMainTicsCbChange(Sender: TObject);
+begin
+    SuperGauge.ScaleSettings.EnableMainTicks := ScaleEnableMainTicsCb.Checked;
+end;
+
+procedure TSGTestFrm.ScaleEnableSubTicsCbChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.EnableSubTicks := ScaleEnableSubTicsCb.Checked;
+end;
+
+procedure TSGTestFrm.ScaleLengthSubTickSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.LengthSubTick := ScaleLengthSubTickSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleLengthMainTickSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.LengthMainTick := ScaleLengthMainTickSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleMainTickCountSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.MainTickCount := ScaleMainTickCountSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleMainTickThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.ThicknessMainTick := ScaleMainTickThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleReversedCbChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.ReverseScale := ScaleReversedCb.Checked;
+end;
+
+procedure TSGTestFrm.ScaleSubTickCountSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.SubTickCount := ScaleSubTickCountSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleSubTickThicknessSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.ThicknessSubTick := ScaleSubTickThicknessSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleTextColorColorCbChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.TextColor := ScaleTextColorColorCb.Selected;
+end;
+
+procedure TSGTestFrm.ScaleTextRadiusSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.TextRadius := ScaleTextRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleTextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.TextSize := ScaleTextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleTextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.ScaleSettings.TextStyle;
+
+    if ScaleTextStyleDDCb.Checked[AIndex] then
+      case ScaleTextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case ScaleTextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.ScaleSettings.TextStyle := TextStyle;
+end;
+
+procedure TSGTestFrm.ScaleTickArcStyleCbChange(Sender: TObject);
+begin
+  // Set Arc type 0=taNone, 1=taOuter, 2=taInner, 3=taBoth
+
+  case ScaleTickArcStyleCb.ItemIndex of
+    0 {taNone} : SuperGauge.ScaleSettings.TickArcStyle := taNone;
+    1 {taOuter}: SuperGauge.ScaleSettings.TickArcStyle := taOuter;
+    2 {taInner}: SuperGauge.ScaleSettings.TickArcStyle := taInner;
+    3 {taBoth} : SuperGauge.ScaleSettings.TickArcStyle := taBoth;
+  else
+    // Unknown type, warn somewhere...
+  end;
+
+  UpdateScaleStats;
+end;
+
+procedure TSGTestFrm.ScaleTickColorColorCbChange(Sender: TObject);
+begin
+    SuperGauge.ScaleSettings.TickColor := ScaleTickColorColorCb.Selected;
+end;
+
+procedure TSGTestFrm.ScaleStartSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.Start := ScaleStartSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleRadiusSpeChange(Sender: TObject);
+begin
+     SuperGauge.ScaleSettings.ScaleRadius := ScaleRadiusSpe.Value;
+end;
+
+procedure TSGTestFrm.ScaleSetFontBtnClick(Sender: TObject);
+begin
+  if FontDialog1.Execute then
+    SuperGauge.ScaleSettings.TextFont := FontDialog1.Font.Name;
+end;
+
+procedure TSGTestFrm.ScaleStepSpeChange(Sender: TObject);
+begin
+  SuperGauge.ScaleSettings.Step := ScaleStepSpe.Value;
+end;
+
+procedure TSGTestFrm.Text1EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings1.Enabled := Text1EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.LeftAddBtnClick(Sender: TObject);
+begin
+  SuperGauge.Left := SuperGauge.Left + 5;
+  UpdateLTStats;
+end;
+
+procedure TSGTestFrm.LeftSubBtnClick(Sender: TObject);
+begin
+  SuperGauge.Left := SuperGauge.Left - 5;
+  UpdateLTStats;
+end;
+
+procedure TSGTestFrm.TopAddBtnClick(Sender: TObject);
+begin
+  SuperGauge.Top := SuperGauge.Top + 5;
+  UpdateLTStats;
+end;
+
+procedure TSGTestFrm.TopSubBtnClick(Sender: TObject);
+begin
+  SuperGauge.Top := SuperGauge.Top - 5;
+  UpdateLTStats;
+end;
+
+procedure TSGTestFrm.ValueMinus10BtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.Value - 10.0);
+end;
+
+procedure TSGTestFrm.ValueMinus1BtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.Value - 1.0);
+end;
+
+procedure TSGTestFrm.ValuePlus10BtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.Value + 10.0);
+end;
+
+procedure TSGTestFrm.ValuePlus1BtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, SuperGauge.Value + 1.0);
+end;
+
+procedure TSGTestFrm.ValueZeroBtnClick(Sender: TObject);
+begin
+  BGRAKnobValueChanged(Sender, 0);
+end;
+
+procedure TSGTestFrm.ResetPositionBtnClick(Sender: TObject);
+begin
+  // where placed on form
+
+  SuperGauge.Left := 40;
+  SuperGauge.Top := 25;
+  UpdateLTStats;
+end;
+
+procedure TSGTestFrm.WidthAddBtnClick(Sender: TObject);
+begin
+    SuperGauge.Width := SuperGauge.Width + 25;
+    UpdateWHStats;
+end;
+
+procedure TSGTestFrm.WidthSubBtnClick(Sender: TObject);
+begin
+  SuperGauge.Width := SuperGauge.Width - 25;
+  UpdateWHStats;
+end;
+
+procedure TSGTestFrm.HeightAddBtnClick(Sender: TObject);
+begin
+  SuperGauge.Height := SuperGauge.Height + 25;
+  UpdateWHStats;
+end;
+
+procedure TSGTestFrm.HeightSubBtnClick(Sender: TObject);
+begin
+  SuperGauge.Height := SuperGauge.Height - 25;
+  UpdateWHStats;
+end;
+
+procedure TSGTestFrm.ResetSizeBtnClick(Sender: TObject);
+begin
+  // default size
+
+  SuperGauge.Width := 360;
+  SuperGauge.Height := 360;
+  UpdateWHStats;
+end;
+
+procedure TSGTestFrm.Text1OffsetXSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings1.OffsetX := Text1OffsetXSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text1OffsetYSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings1.OffsetY := Text1OffsetYSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text1SetFontBtn1Click(Sender: TObject);
+begin
+  // try to preload the dialog, not sure it matters
+
+  FontDialog1.Font.Name := SuperGauge.TextSettings1.FontEx.Name;
+  FontDialog1.Font.Height := SuperGauge.TextSettings1.FontEx.Height;
+
+  if FontDialog1.Execute then
+    begin
+      // Just set these for now
+      SuperGauge.TextSettings1.FontEx.Name := FontDialog1.Font.Name;
+      SuperGauge.TextSettings1.FontEx.Height := FontDialog1.Font.Height;
+    end;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text1ColorCbChange(Sender: TObject);
+begin
+    SuperGauge.TextSettings1.FontEx.Color := Text1ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Text1TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings1.Text := Text1TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Text1TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings1.FontEx.Height := Text1TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Text1TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.TextSettings1.FontEx.Style;
+
+    if Text1TextStyleDDCb.Checked[AIndex] then
+      case Text1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Text1TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.TextSettings1.FontEx.Style := TextStyle;
+end;
+
+procedure TSGTestFrm.Text2ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.FontEx.Color := Text2ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Text2EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.Enabled := Text2EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.Text2OffsetXSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.OffsetX := Text2OffsetXSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text2OffsetYSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.OffsetY := Text2OffsetYSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text2SetFontBtnClick(Sender: TObject);
+begin
+    // try to preload the dialog, not sure it matters
+
+  FontDialog1.Font.Name := SuperGauge.TextSettings2.FontEx.Name;
+  FontDialog1.Font.Height := SuperGauge.TextSettings2.FontEx.Height;
+
+  if FontDialog1.Execute then
+    begin
+      // Just set these for now
+      SuperGauge.TextSettings2.FontEx.Name := FontDialog1.Font.Name;
+      SuperGauge.TextSettings2.FontEx.Height := FontDialog1.Font.Height;
+    end;
+  UpdateTextStats;
+
+end;
+
+procedure TSGTestFrm.Text2TextEdtChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.Text := Text2TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Text2TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings2.FontEx.Height := Text2TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Text2TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.TextSettings2.FontEx.Style;
+
+    if Text2TextStyleDDCb.Checked[AIndex] then
+      case Text2TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Text2TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.TextSettings2.FontEx.Style := TextStyle;
+end;
+
+procedure TSGTestFrm.Text3ColorCbChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings3.FontEx.Color := Text3ColorCb.Selected;
+end;
+
+procedure TSGTestFrm.Text3EnabledCbChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings3.Enabled := Text3EnabledCb.Checked;
+end;
+
+procedure TSGTestFrm.Text3OffsetXSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings3.OffsetX := Text3OffsetXSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text3OffsetYSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings3.OffsetY := Text3OffsetYSpe.Value;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text3SetFontBtnClick(Sender: TObject);
+begin
+    // try to preload the dialog, not sure it matters
+
+  FontDialog1.Font.Name := SuperGauge.TextSettings3.FontEx.Name;
+  FontDialog1.Font.Height := SuperGauge.TextSettings3.FontEx.Height;
+
+  if FontDialog1.Execute then
+    begin
+      // Just set these for now
+      SuperGauge.TextSettings3.FontEx.Name := FontDialog1.Font.Name;
+      SuperGauge.TextSettings3.FontEx.Height := FontDialog1.Font.Height;
+    end;
+  UpdateTextStats;
+end;
+
+procedure TSGTestFrm.Text3TextEdtChange(Sender: TObject);
+begin
+    SuperGauge.TextSettings3.Text := Text3TextEdt.Text;
+end;
+
+procedure TSGTestFrm.Text3TextSizeSpeChange(Sender: TObject);
+begin
+  SuperGauge.TextSettings3.FontEx.Height := Text3TextSizeSpe.Value;
+end;
+
+procedure TSGTestFrm.Text3TextStyleDDCbItemChange(Sender: TObject; AIndex: Integer);
+var
+  TextStyle: TFontStyles;
+begin
+
+  // Bold=fsBold, Italic=fsItalic, Strike Out=fsStrikeOut, Underline=fsUnderline
+  // Changing the order in the dropdown will break this
+
+  TextStyle := SuperGauge.TextSettings3.FontEx.Style;
+
+    if Text3TextStyleDDCb.Checked[AIndex] then
+      case Text3TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Include(TextStyle, fsBold);
+        'Italic'  :  Include(TextStyle, fsItalic);
+        'Strike Out' :  Include(TextStyle, fsStrikeOut);
+        'Underline'  :  Include(TextStyle, fsUnderline); // may not work bug in BGRA??
+      end
+    else
+      case Text3TextStyleDDCb.Items[AIndex] of
+        'Bold'    : Exclude(TextStyle, fsBold);
+        'Italic'  :  Exclude(TextStyle, fsItalic);
+        'Strike Out' :  Exclude(TextStyle, fsStrikeOut);
+        'Underline'  :  Exclude(TextStyle, fsUnderline);
+      end;
+
+  SuperGauge.TextSettings1.FontEx.Style := TextStyle;
+end;
+
+procedure TSGTestFrm.Timer2Timer(Sender: TObject);
+var
+  GaugeValue, offset : single;
+
+begin
+  // Generate some numbers to move the pointer up and down
+  // IF marker1 and marker2 are enabled will cause them to track
+  // and reset after 10 tics. Current timer2 is 250ms.
+  // Marker 3 will just always remain the MAX value hit, no reset
+
+  offset := Random() * 10.0 - 5.0;
+
+  // some range checks to keep things moving
+
+  if SuperGauge.Value + offset < 0 then
+    GaugeValue := 10
+  else
+    if SuperGauge.Value + offset > 100 then
+      GaugeValue := 90
+    else
+      GaugeValue := SuperGauge.Value + offset;
+
+  // Bump counters to reset
+
+  inc(ResetHiTics);
+  inc(ResetLoTics);
+
+  // Call common update to catch markers and value change for gauge
+
+  BGRAKnobValueChanged(Sender, GaugeValue);
+
+end;
+
+// Blink stuff when activated, typically on overrangem
+// NOTE : Overange is not the same as RangeLED different events
+
+procedure TSGTestFrm.Timer1Timer(Sender: TObject);
+begin
+  TimerState := not TimerState;
+  uELED2.Active := TimerState;
+
+  if TimerState then
+    begin
+      SuperGauge.ScaleSettings.TickColor := clRed;
+      SuperGauge.PointerCapSettings.FillColor := clRed;
+      SuperGauge.BandSettings3.TextColor := clBlack;
+      SuperGauge.FrameSettings.BorderColor := clRed;
+      SuperGauge.FaceSettings.PictureEnabled := True;
+    end
+  else
+    begin
+      SuperGauge.ScaleSettings.TickColor := $007DC4DF;
+      SuperGauge.PointerCapSettings.FillColor := clBlack;
+      SuperGauge.BandSettings3.TextColor := clWhite;
+      SuperGauge.FrameSettings.BorderColor := clGray;
+      SuperGauge.FaceSettings.PictureEnabled := False;
+end;
+end;
+
+end.
+

BIN
test/test_supergauge/sunbeam-tiger-transparent1.png