瀏覽代碼

CropArea Duplicate and SetSize; Duplicate on Demo

Massimo Magnano 2 年之前
父節點
當前提交
2373d83a48

+ 42 - 2
bgraimagemanipulation.pas

@@ -73,6 +73,7 @@ unit BGRAImageManipulation;
              - divide by zero in getImageRect on Component Loading
              - EmptyImage size to ClientRect when Width/Height=0; Mouse Events when Image is Empty
              - CropArea Rotate and Flip
+             - CropArea Duplicate and SetSize
   ============================================================================
 }
 
@@ -206,7 +207,9 @@ type
     constructor Create(AOwner: TBGRAImageManipulation; AArea: TRectF;
                        AAreaUnit: TResolutionUnit = ruNone; //Pixels
                        ARotate: double = 0;
-                       AUserData: Integer = 0);
+                       AUserData: Integer = 0); overload;
+    constructor Create(AOwner: TBGRAImageManipulation;
+                       DuplicateFrom: TCropArea; InsertInList:Boolean); overload;
     destructor Destroy; override;
 
     //ZOrder
@@ -223,6 +226,8 @@ type
     procedure FlipVUp;
     procedure FlipVDown;
 
+    procedure SetSize(AWidth, AHeight:Single);
+
     property Area:TRectF read rArea write setArea;
     property AreaUnit:TResolutionUnit read rAreaUnit write setAreaUnit;
     property Top:Single read getTop write setTop;
@@ -1264,7 +1269,7 @@ constructor TCropArea.Create(AOwner: TBGRAImageManipulation; AArea: TRectF;
 begin
   inherited Create;
   if (AOwner = Nil)
-  then raise Exception.Create('Owner TBGRAImageManipulation is Nil');
+  then raise Exception.Create('TCropArea Owner is Nil');
   OwnerList :=nil;
   fOwner :=AOwner;
   rAreaUnit :=AAreaUnit;
@@ -1278,6 +1283,26 @@ begin
   CopyAspectFromParent;
 end;
 
+constructor TCropArea.Create(AOwner: TBGRAImageManipulation;
+                             DuplicateFrom: TCropArea; InsertInList:Boolean);
+begin
+  if (DuplicateFrom = Nil)
+  then raise Exception.Create('TCropArea DuplicateFrom is Nil');
+
+  Create(AOwner, DuplicateFrom.Area, DuplicateFrom.AreaUnit, DuplicateFrom.Rotate, DuplicateFrom.UserData);
+
+  OwnerList :=nil;
+  rAspectX :=DuplicateFrom.rAspectX;
+  rAspectY :=DuplicateFrom.rAspectY;
+  rKeepAspectRatio :=DuplicateFrom.rKeepAspectRatio;
+  Loading:=False;
+  if rKeepAspectRatio=bParent
+  then CopyAspectFromParent;
+
+  if InsertInList and (DuplicateFrom.OwnerList<>nil)
+  then DuplicateFrom.OwnerList.add(Self);
+end;
+
 destructor TCropArea.Destroy;
 begin
   inherited Destroy;
@@ -1407,6 +1432,21 @@ begin
   ScaledArea :=newArea;
 end;
 
+procedure TCropArea.SetSize(AWidth, AHeight: Single);
+var
+   tempArea:TRectF;
+
+begin
+  if (AWidth=rArea.Width) and (AHeight=rArea.Height)
+  then exit;
+
+  tempArea :=rArea;
+  tempArea.Width:=AWidth;
+  tempArea.Height:=AHeight;
+  //CheckAreaOutOfBounds(tempArea);
+  Area :=tempArea;
+end;
+
 { TCropAreaList }
 
 procedure TCropAreaList.setLoading(AValue: Boolean);

+ 163 - 72
test/test_bgraimagemanipulation/unitbgraimagemanipulationdemo.lfm

@@ -1,17 +1,17 @@
 object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
-  Left = 261
+  Left = 262
   Height = 513
   Top = 125
-  Width = 898
+  Width = 926
   Caption = 'Demonstration of TBGRAImageManipulation'
   ClientHeight = 513
-  ClientWidth = 898
+  ClientWidth = 926
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
   ShowHint = True
   LCLVersion = '3.99.0.0'
   object Background: TBCPanel
-    Left = 650
+    Left = 678
     Height = 513
     Top = 0
     Width = 248
@@ -1604,7 +1604,7 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
     end
   end
   object BGRAImageManipulation: TBGRAImageManipulation
-    Left = 170
+    Left = 198
     Height = 513
     Top = 0
     Width = 480
@@ -1629,7 +1629,7 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
     Left = 0
     Height = 513
     Top = 0
-    Width = 170
+    Width = 198
     Align = alLeft
     Background.Color = clSilver
     Background.ColorOpacity = 35
@@ -1687,7 +1687,7 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
       ParentShowHint = False
     end
     object btBox_Del: TBGRASpeedButton
-      Left = 147
+      Left = 149
       Height = 22
       Hint = 'Remove this Box'
       Top = 21
@@ -1715,7 +1715,7 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
       Left = 1
       Height = 106
       Top = 406
-      Width = 168
+      Width = 196
       Align = alBottom
       Background.Color = clBtnFace
       Background.Gradient1.StartColor = clWhite
@@ -2200,7 +2200,7 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
       Left = 0
       Height = 360
       Top = 48
-      Width = 170
+      Width = 186
       Background.Color = clBtnFace
       Background.Gradient1.StartColor = clWhite
       Background.Gradient1.EndColor = clBlack
@@ -2817,39 +2817,39 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
         Width = 23
         Glyph.Data = {
           36040000424D3604000000000000360000002800000010000000100000000100
-          2000000000000004000000000000000000000000000000000000FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF0000820015068E039300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000480
-          003A1E9A1AF22CA529FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000480026F1F9D
-          1EFB07AD07FE18AB16FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00008000010C8209A71B9719FC01A4
-          01FF00BA00FF15B413FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00007100140F7D0DD4118210FB008F00FF00A5
-          00FF00BB00FF11B00FFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF000561003610700EED096809FB007500FF008A00FF009D
-          00FF00AE00FF0DA40CFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00035E00550E5C0DF8034703FE015B01FF026F02FF007F00FF0090
-          00FF009D00FF0A9609FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00005900521F671FF9397639FE337E33FF2F872FFF2D922DFF2799
-          27FF239E23FF1C931CFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF0000520032196618EB468746FC479447FF439943FF3E9D
-          3EFF3A9F3AFF248D24FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00004400120F5C0FCB4F934FFC5BA45BFF57A5
-          57FF52A552FF2D892DFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000800001075307994F8E4FFC70B3
-          70FF6BB16BFF3A853AFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00004E00604381
-          43F983C083FE458545FF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000048
-          0032327032ED4A844AFF00500009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF0000420012004E008700000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+          2000000000000004000000000000000000000000000000000000000000000000
+          0000000000000000000000000000000000000000000000000000000000000000
+          0000000000000000000000000000000000000000000000000000000000000000
+          0000000000000000000000000000000000000000000000000000000000002ECE
+          560114BE27021DC4360200000000000000000000000000000000000000000000
+          00000000000000000000000000000000000000000000000000002AC84F0123C5
+          43031CC1340A1DC3360E20B73A0F068C0C020000000000000000000000000000
+          0000000000000000000000000000000000000000000025C6460223C441041EC2
+          380817BF2C1610BB1E1C0ABA13221CA531250000000000000000000000000000
+          00000000000010BB1E0116BE29020000000024C443011FB73B051FBC380925C8
+          421011BC21260BB9152F04B608370CAD1343066F0B6000620012000000000000
+          00000000000009B812010EBB1B0821B73E0524AC4301006000080064003B026B
+          03680F921C6505B60A4500B4005000B4005A0A8A1095007C006F000000000000
+          00000000000010B7200115BA290523AA43040000000000000000000000000081
+          0015018601DB0CAE176B00B4006C00B40079099D11A4008C00CC007C0068007F
+          00CC008300DC008600EA008A00F8008C00FF008C00FF008C00ED008C002D0000
+          0000008D019F06970BB801B4018D03B5039C0AAF0FB0008C00F9008C01F01DB2
+          32F91FB633FD25B836FD24BA36FE20BC32FE21BD39FA008C00EA008C002A0000
+          0000008D019F08990DCB0BB50BB216B916C419B41DD7008C00F9018D01F422BD
+          27FF24BD26FF22BC23FF11B812FF0FAF17FF018D03F4008C004E00000000008C
+          001A018C01F40DAD12DD1DBB1EEC24BD26F81BA620FD018C01CF018D01F436C3
+          3EFF33C438FF2EC133FF05B505FF10A119FD018C02F4018C01B8018C02AD018B
+          02F60A970EFD17BB18FF33C438FF33C438FF169919FE008C0093018D02F446CA
+          50FF43CB4DFF43CB4DFF37C740FF12B914FF0DB514FF11A418FE099F10FE0AB0
+          0FFF20BE23FF43CB4CFF43CB4DFF3FC248FF028D02F5008C0033018D02F457D1
+          65FF58D266FF56D466FF55D465FF54D364FF54D25EFF34C83CFF31C63AFF49CF
+          55FF56D466FF55D465FF58D667FF109814F8008C008300000000018D02F44CC6
+          5CFF028F04F90F9A14FB58D069FF67DF7FFF67DF7FFF67DF7FFF67DF7FFF67DF
+          7FFF67DF7FFF5ED772FF119C17F8018D01C6008C000500000000028E03DB028E
+          02F4008C004E038E0566039005F72BAE35FF4EC65DFF6EDB85FF6EDB86FF48C4
+          58FF29AE32FF039004F5018D0176008C00020000000000000000008C0019008C
+          001B0000000000000000008C001D028E037B0B950FC109920AF0069108EE0491
+          07BD018D0180008C002500000000000000000000000000000000
         }
         OnClick = btCRotateLeftClick
       end
@@ -2864,36 +2864,36 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
           2000000000000004000000000000000000000000000000000000FFFFFF00FFFF
           FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
           FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF0006890351078A0366FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00159611BE2EA92CFF118F0CAC00800001FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF0013920FBB0BBC0BFF17B116FB159112D800770015FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF000F8D0CB809D509FF00C500FF0CB00CFC169214F00575
-          0038FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF000E880BB508D008FF00C400FF00B000FF059B05FE027E
-          00F90272006BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF000C8209B106BB06FF00B400FF00A600FF009400FF007F
-          00FF127A11FB086F06A200800001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00077C06AF04A604FF00A100FF009700FF018801FF0378
-          03FF006300FF0A5C0AFB086608CC00000001FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00057404AC2AA52AFF25A325FF2AA02AFF2E992EFF3190
-          31FF368836FF327A32FC0D630CCB00000001FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00036C02A93EA43EFF3CA23CFF40A240FF459E45FF499A
-          49FF327F32FB0559059900800001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00006200A655A855FF55A955FF59A959FF5CA75CFE2D78
-          2DF900500060FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00005700A66DB36DFF6DB46DFF6BAF6BFD236B23EB0049
-          0031FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00004E00A685C185FF70AC70FD195F19CD00440012FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00004E00A67BAD7BFE0D570D9B00800001FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00004F004A0852085CFFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+          FF00FFFFFF0000BF00001DC4360214BE27022ECE5601FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00068C0C0220B73A0F1DC3360E1CC1340A23C543032AC84F01FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000099
+          00001CA531250ABA132210BB1E1C17BF2C161EC2380823C4410425C64602FFFF
+          FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000620012066F
+          0B600CAD134304B608370BB9152F11BC212625C842101FBC38091FB73B0524C4
+          4301FFFFFF0016BE290210BB1E01FFFFFF00FFFFFF00FFFFFF00007C006F0A8A
+          109500B4005A00B4005005B60A450F921C65026B03680064003B0060000824AC
+          430121B73E050EBB1B0809B81201FFFFFF00FFFFFF00FFFFFF00008C00CC099D
+          11A400B4007900B4006C0CAE176B018601DB00810015FFFFFF00FFFFFF00FFFF
+          FF0023AA430415BA290510B72001FFFFFF00FFFFFF00FFFFFF00008C00F90AAF
+          0FB003B5039C01B4018D06970BB8008D019FFFFFFF00008C002D008C00ED008C
+          00FF008C00FF008A00F8008600EA008300DC007F00CC007C0068008C00F919B4
+          1DD716B916C40BB50BB208990DCB008D019FFFFFFF00008C002A008C00EA21BD
+          39FA20BC32FE24BA36FE25B836FD1FB633FD1DB232F9008C01F0018C01CF1BA6
+          20FD24BD26F81DBB1EEC0DAD12DD018C01F4008C001AFFFFFF00008C004E018D
+          03F40FAF17FF11B812FF22BC23FF24BD26FF22BD27FF018D01F4008C00931699
+          19FE33C438FF33C438FF17BB18FF0A970EFD018B02F6018C02AD018C01B8018C
+          02F410A119FD05B505FF2EC133FF33C438FF36C33EFF018D01F4008C0033028D
+          02F53FC248FF43CB4DFF43CB4CFF20BE23FF0AB00FFF099F10FE11A418FE0DB5
+          14FF12B914FF37C740FF43CB4DFF43CB4DFF46CA50FF018D02F4FFFFFF00008C
+          0083109814F858D667FF55D465FF56D466FF49CF55FF31C63AFF34C83CFF54D2
+          5EFF54D364FF55D465FF56D466FF58D266FF57D165FF018D02F4FFFFFF00008C
+          0005018D01C6119C17F85ED772FF67DF7FFF67DF7FFF67DF7FFF67DF7FFF67DF
+          7FFF67DF7FFF58D069FF0F9A14FB028F04F94CC65CFF018D02F4FFFFFF00FFFF
+          FF00008C0002018D0176039004F529AE32FF48C458FF6EDB86FF6EDB85FF4EC6
+          5DFF2BAE35FF039005F7038E0566008C004E028E02F4028E03DBFFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00008C0025018D0180049107BD069108EE09920AF00B95
+          0FC1028E037B008C001DFFFFFF00FFFFFF00008C001B008C0019
         }
         OnClick = btCRotateRightClick
       end
@@ -3080,6 +3080,97 @@ object FormBGRAImageManipulationDemo: TFormBGRAImageManipulationDemo
         }
         OnClick = btCFlipHRightClick
       end
+      object btCropDuplicateOp: TSpeedButton
+        Left = 161
+        Height = 22
+        Hint = 'Duplicate when Rotate/Flip'
+        Top = 192
+        Width = 23
+        AllowAllUp = True
+        Flat = True
+        Glyph.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000000000000000000000000000000000000000000000000
+          0000000000000000000000000012000000570000005B0000005B0000005B0000
+          005B0000005A0000002800000002000000000000000000000000000000000000
+          0000000000000000000000000046FBFBFBFEFFFFFFFFFFFFFFFFFFFFFFFFFDFC
+          FAFFEBEAE6FF797A79CE00000047000000040000000000000000000000000000
+          0000000000000000000000000048FFFFFFFFF9F9F9FFFBFBFBFFFCFCFCFFFEFE
+          FEFFEAEBEAFFF3F3F3FF727373D00000004E0000000200000000000000140000
+          005D00000062000000620000008EFFFFFFFFF8F8F8FFFAFAFAFFFCFCFCFFFDFD
+          FDFFE7E8E7FFFEFEFEFFF3F3F3FF6C6D6CCB00000034000000000000004BFBFB
+          FBFEFFFFFFFFFFFFFFFFB7B7B7FFFFFFFFFFF7F7F7FFFAFAFAFFFBFBFBFFFDFD
+          FDFFE4E4E4FFFEFEFEFFFEFEFEFFF3F4F4FF6F6F6FB9000000140000004DFFFF
+          FFFFFAFAFAFFFCFCFCFFB5B5B5FFFFFFFFFFF6F6F5FFF9F9F9FFFBFBFBFFFCFC
+          FCFFF8F8F8FFE4E4E4FFE9EAEAFFF3F3F3FFF4F3F1FE000000460000004DFFFF
+          FFFFFAFAFAFFFBFBFBFFB5B5B5FFFFFFFFFFF4F4F4FFF7F7F7FFFAFAFAFFFBFB
+          FBFFFCFCFCFFFCFCFCFFFDFDFDFFFDFDFDFFFFFFFFFF0000004A0000004DFFFF
+          FFFFF9F9F9FFFBFBFBFFB5B5B5FFFFFFFFFFF2F2F2FFF5F5F5FFF8F8F8FFFAFA
+          FAFFFBFBFBFFFBFBFBFFFCFCFCFFFCFCFCFFFFFFFFFF0000004A0000004DFFFF
+          FFFFF7F7F7FFFAFAFAFFB4B4B4FFFFFFFFFFF0F0F0FFF3F3F3FFF6F6F5FFF8F8
+          F8FFF9F9F9FFFAFAFAFFFAFAFAFFFAFAFAFFFFFFFFFF0000004A0000004DFFFF
+          FFFFF5F5F5FFF8F8F8FFB3B3B3FFFFFFFFFFEEEEEEFFF1F1F0FFF3F3F3FFF5F5
+          F5FFF6F6F6FFF8F8F7FFF8F8F8FFF8F8F8FFFFFFFFFF0000004A0000004DFFFF
+          FFFFF3F3F3FFF5F5F5FFB2B2B1FFFFFFFFFFECECEBFFEEEEEEFFF0F0F0FFF2F2
+          F2FFF4F4F3FFF5F5F4FFF5F5F5FFF5F5F5FFFFFFFFFF0000004A0000004DFFFF
+          FFFFF0F0F0FFF3F3F2FFB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000480000004DFFFF
+          FFFFEEEEEDFFF0F0EFFFE2E2E2FFB0B0B0FFB0B0B0FFB1B1B0FFB1B1B1FFB1B1
+          B1FFB8B8B8FF00000080000000470000004700000046000000100000004DFFFF
+          FFFFEBEBEAFFEDEDECFFEEEEEEFFF0F0EFFFF1F1F0FFF2F2F1FFF2F2F2FFF2F2
+          F2FFFFFFFFFF0000004E000000000000000000000000000000000000004CFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFF0000004D00000000000000000000000000000000000000120000
+          004B0000004C0000004C0000004C0000004C0000004C0000004C0000004C0000
+          004C0000004B0000001200000000000000000000000000000000
+        }
+        GroupIndex = 1
+      end
+    end
+    object btCropDuplicate: TSpeedButton
+      Left = 172
+      Height = 22
+      Hint = 'Duplicate this Area'
+      Top = 20
+      Width = 23
+      Flat = True
+      Glyph.Data = {
+        36040000424D3604000000000000360000002800000010000000100000000100
+        2000000000000004000000000000000000000000000000000000000000000000
+        0000000000000000000000000012000000570000005B0000005B0000005B0000
+        005B0000005A0000002800000002000000000000000000000000000000000000
+        0000000000000000000000000046FBFBFBFEFFFFFFFFFFFFFFFFFFFFFFFFFDFC
+        FAFFEBEAE6FF797A79CE00000047000000040000000000000000000000000000
+        0000000000000000000000000048FFFFFFFFF9F9F9FFFBFBFBFFFCFCFCFFFEFE
+        FEFFEAEBEAFFF3F3F3FF727373D00000004E0000000200000000000000140000
+        005D00000062000000620000008EFFFFFFFFF8F8F8FFFAFAFAFFFCFCFCFFFDFD
+        FDFFE7E8E7FFFEFEFEFFF3F3F3FF6C6D6CCB00000034000000000000004BFBFB
+        FBFEFFFFFFFFFFFFFFFFB7B7B7FFFFFFFFFFF7F7F7FFFAFAFAFFFBFBFBFFFDFD
+        FDFFE4E4E4FFFEFEFEFFFEFEFEFFF3F4F4FF6F6F6FB9000000140000004DFFFF
+        FFFFFAFAFAFFFCFCFCFFB5B5B5FFFFFFFFFFF6F6F5FFF9F9F9FFFBFBFBFFFCFC
+        FCFFF8F8F8FFE4E4E4FFE9EAEAFFF3F3F3FFF4F3F1FE000000460000004DFFFF
+        FFFFFAFAFAFFFBFBFBFFB5B5B5FFFFFFFFFFF4F4F4FFF7F7F7FFFAFAFAFFFBFB
+        FBFFFCFCFCFFFCFCFCFFFDFDFDFFFDFDFDFFFFFFFFFF0000004A0000004DFFFF
+        FFFFF9F9F9FFFBFBFBFFB5B5B5FFFFFFFFFFF2F2F2FFF5F5F5FFF8F8F8FFFAFA
+        FAFFFBFBFBFFFBFBFBFFFCFCFCFFFCFCFCFFFFFFFFFF0000004A0000004DFFFF
+        FFFFF7F7F7FFFAFAFAFFB4B4B4FFFFFFFFFFF0F0F0FFF3F3F3FFF6F6F5FFF8F8
+        F8FFF9F9F9FFFAFAFAFFFAFAFAFFFAFAFAFFFFFFFFFF0000004A0000004DFFFF
+        FFFFF5F5F5FFF8F8F8FFB3B3B3FFFFFFFFFFEEEEEEFFF1F1F0FFF3F3F3FFF5F5
+        F5FFF6F6F6FFF8F8F7FFF8F8F8FFF8F8F8FFFFFFFFFF0000004A0000004DFFFF
+        FFFFF3F3F3FFF5F5F5FFB2B2B1FFFFFFFFFFECECEBFFEEEEEEFFF0F0F0FFF2F2
+        F2FFF4F4F3FFF5F5F4FFF5F5F5FFF5F5F5FFFFFFFFFF0000004A0000004DFFFF
+        FFFFF0F0F0FFF3F3F2FFB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000480000004DFFFF
+        FFFFEEEEEDFFF0F0EFFFE2E2E2FFB0B0B0FFB0B0B0FFB1B1B0FFB1B1B1FFB1B1
+        B1FFB8B8B8FF00000080000000470000004700000046000000100000004DFFFF
+        FFFFEBEBEAFFEDEDECFFEEEEEEFFF0F0EFFFF1F1F0FFF2F2F1FFF2F2F2FFF2F2
+        F2FFFFFFFFFF0000004E000000000000000000000000000000000000004CFFFF
+        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+        FFFFFFFFFFFF0000004D00000000000000000000000000000000000000120000
+        004B0000004C0000004C0000004C0000004C0000004C0000004C0000004C0000
+        004C0000004B0000001200000000000000000000000000000000
+      }
+      OnClick = btCropDuplicateClick
     end
   end
   object OpenPictureDialog: TOpenPictureDialog

+ 70 - 12
test/test_bgraimagemanipulation/unitbgraimagemanipulationdemo.pas

@@ -80,6 +80,7 @@ type
     btCFlipHRight: TSpeedButton;
     btCFlipVUp: TSpeedButton;
     btCFlipVDown: TSpeedButton;
+    btCropDuplicate: TSpeedButton;
     btnEmptyImage: TBCButton;
     btnLoadCropList: TBCButton;
     btnSaveCropList: TBCButton;
@@ -126,10 +127,12 @@ type
     btZBack: TSpeedButton;
     btZDown: TSpeedButton;
     btZUp: TSpeedButton;
+    btCropDuplicateOp: TSpeedButton;
     procedure btCFlipHLeftClick(Sender: TObject);
     procedure btCFlipHRightClick(Sender: TObject);
     procedure btCFlipVDownClick(Sender: TObject);
     procedure btCFlipVUpClick(Sender: TObject);
+    procedure btCropDuplicateClick(Sender: TObject);
     procedure btCRotateLeftClick(Sender: TObject);
     procedure btCRotateRightClick(Sender: TObject);
     procedure btnEmptyImageClick(Sender: TObject);
@@ -268,8 +271,15 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.RotateLeft;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.RotateLeft;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btCFlipVDownClick(Sender: TObject);
@@ -278,8 +288,15 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.FlipVDown;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.FlipVDown;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btCFlipHLeftClick(Sender: TObject);
@@ -288,8 +305,15 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.FlipHLeft;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.FlipHLeft;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btCFlipHRightClick(Sender: TObject);
@@ -298,8 +322,15 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.FlipHRight;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.FlipHRight;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btCFlipVUpClick(Sender: TObject);
@@ -308,8 +339,28 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.FlipVUp;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.FlipVUp;
+  end;
+end;
+
+procedure TFormBGRAImageManipulationDemo.btCropDuplicateClick(Sender: TObject);
+var
+   newCropArea :TCropArea;
+
+begin
+  if BGRAImageManipulation.SelectedCropArea<>nil then
+  begin
+    newCropArea :=TCropArea.Create(BGRAImageManipulation, BGRAImageManipulation.SelectedCropArea, True);
+    BGRAImageManipulation.SelectedCropArea :=newCropArea;
+    newCropArea.BorderColor :=VGALime;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btCRotateRightClick(Sender: TObject);
@@ -318,8 +369,15 @@ var
 
 begin
   CropArea :=GetCurrentCropArea;
-  if CropArea<>nil
-  then CropArea.RotateRight;
+  if CropArea<>nil then
+  begin
+    if btCropDuplicateOp.Down then
+    begin
+      CropArea :=TCropArea.Create(BGRAImageManipulation, CropArea, True);
+      BGRAImageManipulation.SelectedCropArea :=CropArea;
+    end;
+    CropArea.RotateRight;
+  end;
 end;
 
 procedure TFormBGRAImageManipulationDemo.btnLoadCropListClick(Sender: TObject);