Forráskód Böngészése

handle original error

Johann 6 éve
szülő
commit
9a022bf153

+ 8 - 0
lazpaint/lazpaintmainform.pas

@@ -2711,6 +2711,14 @@ begin
           end;
           ptMoveLayer, ptRotateLayer, ptZoomLayer:
           begin
+            if image.LayerOriginalDefined[image.CurrentLayerIndex] and
+               image.LayerOriginalKnown[image.CurrentLayerIndex] and
+               (image.LayerOriginal[image.CurrentLayerIndex]=nil) then
+            begin
+              Tool := ptHand;
+              result := srException;
+            end;
+
             if image.CurrentLayerEquals(BGRAPixelTransparent) and not
               (image.LayerOriginalDefined[image.CurrentLayerIndex] and
                image.LayerOriginalKnown[image.CurrentLayerIndex] and

+ 4 - 0
lazpaint/release/i18n/lazpaint.ar.po

@@ -2919,6 +2919,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.cs.po

@@ -2906,6 +2906,10 @@ msgstr ""
 msgid "Error"
 msgstr "Chyba"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.de.po

@@ -2924,6 +2924,10 @@ msgstr ""
 msgid "Error"
 msgstr "Fehler"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr "Fehler beim Öffnen der Datei \"%1\""

+ 5 - 1
lazpaint/release/i18n/lazpaint.es.po

@@ -2904,6 +2904,10 @@ msgstr "Entradas"
 msgid "Error"
 msgstr "Error"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr "Error cargando el original pero se puedo pixelar la capa."
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr "Error abriendo archivo \"%1\""
@@ -3429,7 +3433,7 @@ msgstr "Demasiado capas"
 
 #: uresourcestrings.rstoomanyshapesinlayer
 msgid "Too many shapes in layer"
-msgstr ""
+msgstr "Demasiado figuras en la capa"
 
 #: uresourcestrings.rstotalimages
 msgid "Total images: %1"

+ 4 - 0
lazpaint/release/i18n/lazpaint.fi.po

@@ -2889,6 +2889,10 @@ msgstr ""
 msgid "Error"
 msgstr "Virhe"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr "Virhe avattaessa tiedostoa \"%1\""

+ 5 - 1
lazpaint/release/i18n/lazpaint.fr.po

@@ -2911,6 +2911,10 @@ msgstr "Entrées"
 msgid "Error"
 msgstr "Erreur"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr "Erreur au chargement de l'original alors le calque peut être pixelisé."
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr "Erreur lors de l'ouverture de \"%1\""
@@ -3436,7 +3440,7 @@ msgstr "Trop de calques"
 
 #: uresourcestrings.rstoomanyshapesinlayer
 msgid "Too many shapes in layer"
-msgstr ""
+msgstr "Trop de formes dans le calque"
 
 #: uresourcestrings.rstotalimages
 msgid "Total images: %1"

+ 4 - 0
lazpaint/release/i18n/lazpaint.ja.po

@@ -2912,6 +2912,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.lv.po

@@ -2907,6 +2907,10 @@ msgstr ""
 msgid "Error"
 msgstr "Kļūda"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr "Nevar atvērt failu \"%1\""

+ 4 - 0
lazpaint/release/i18n/lazpaint.nl.po

@@ -2933,6 +2933,10 @@ msgstr ""
 msgid "Error"
 msgstr "Fout"
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.po

@@ -2889,6 +2889,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.pt_BR.po

@@ -2915,6 +2915,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.ru.po

@@ -2909,6 +2909,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 4 - 0
lazpaint/release/i18n/lazpaint.sv.po

@@ -2897,6 +2897,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: uresourcestrings.rserrorloadingoriginal
+msgid "Error while loading original however layer can be rasterized."
+msgstr ""
+
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgstr ""

+ 8 - 5
lazpaint/ucanvassize.pas

@@ -68,11 +68,14 @@ begin
     if not repeatImage and layeredBmp.LayerOriginalDefined[i] and layeredBmp.LayerOriginalKnown[i] then
     begin
       orig := layeredBmp.LayerOriginal[i];
-      if result.IndexOfOriginal(orig)=-1 then result.AddOriginal(orig,false);
-      result.LayerOriginalGuid[idx] := orig.Guid;
-      newOrigin := ChangeCanvasSizeOrigin(layeredBmp.Width,layeredBmp.Height,newwidth,newHeight,anchor);
-      result.LayerOriginalMatrix[idx] := AffineMatrixTranslation(newOrigin.X,newOrigin.Y)*layeredBmp.LayerOriginalMatrix[i];
-      result.RenderLayerFromOriginal(idx);
+      if Assigned(orig) then
+      begin
+        if result.IndexOfOriginal(orig)=-1 then result.AddOriginal(orig,false);
+        result.LayerOriginalGuid[idx] := orig.Guid;
+        newOrigin := ChangeCanvasSizeOrigin(layeredBmp.Width,layeredBmp.Height,newwidth,newHeight,anchor);
+        result.LayerOriginalMatrix[idx] := AffineMatrixTranslation(newOrigin.X,newOrigin.Y)*layeredBmp.LayerOriginalMatrix[i];
+        result.RenderLayerFromOriginal(idx);
+      end;
     end;
   end;
 end;

+ 9 - 1
lazpaint/uimage.pas

@@ -1218,7 +1218,15 @@ end;
 
 function TLazPaintImage.GetLayerOriginal(AIndex: integer): TBGRALayerCustomOriginal;
 begin
-  result := FCurrentState.LayerOriginal[AIndex];
+  try
+    result := FCurrentState.LayerOriginal[AIndex];
+  except
+    on ex:exception do
+    begin
+      MessagePopup(rsErrorLoadingOriginal, 4000);
+      result := nil;
+    end;
+  end;
 end;
 
 function TLazPaintImage.GetLayerOriginalClass(AIndex: integer): TBGRALayerOriginalAny;

+ 5 - 5
lazpaint/uimagediff.pas

@@ -295,7 +295,7 @@ type
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function CreateOriginal(AState: TState; ALayerIndex: integer): TBGRALayerCustomOriginal; virtual; abstract;
   public
-    constructor Create(AFromState: TState; AIndex: integer);
+    constructor Create(AFromState: TState; AIndex: integer; AAlwaysStoreBitmap: boolean);
     function UsedMemory: int64; override;
     function TryCompress: boolean; override;
     procedure ApplyTo(AState: TState); override;
@@ -924,13 +924,13 @@ begin
 end;
 
 constructor TReplaceLayerByOriginalDifference.Create(
-  AFromState: TState; AIndex: integer);
+  AFromState: TState; AIndex: integer; AAlwaysStoreBitmap: boolean);
 var
   imgState: TImageState;
 begin
   inherited Create(AFromState);
   imgState := AFromState as TImageState;
-  FPreviousLayerContent := TStoredLayer.Create(imgState.LayeredBitmap, AIndex);
+  FPreviousLayerContent := TStoredLayer.Create(imgState.LayeredBitmap, AIndex, AAlwaysStoreBitmap);
   FSourceBounds := imgState.LayeredBitmap.LayerBitmap[AIndex].GetImageBounds;
   with FPreviousLayerContent.Offset do FPrevMatrix := AffineMatrixTranslation(x+FSourceBounds.Left,y+FSourceBounds.Top);
   FNextMatrix := FPrevMatrix;
@@ -1930,8 +1930,8 @@ begin
   with imgDest.LayeredBitmap do
   begin
     previousActiveLayerId:= LayerUniqueId[imgDest.SelectedImageLayerIndex];
-    layerOverCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex);
-    layerUnderCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex-1);
+    layerOverCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex, true);
+    layerUnderCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex-1, true);
   end;
 
   //select layer under and merge

+ 1 - 0
lazpaint/uresourcestrings.pas

@@ -30,6 +30,7 @@ resourcestring
   rsEnterLayerName='Enter layer name:';
   rsFileExtensionNotSupported='This file extension is not supported.';
   rsFileFormatNotRecognized='The file format has not been recognized.';
+  rsErrorLoadingOriginal='Error while loading original however layer can be rasterized.';
   rsFileName = 'Filename';
   rsFileSize = 'Size';
   rsFileType = 'Type';

+ 29 - 6
lazpaint/ustatetype.pas

@@ -5,7 +5,8 @@ unit UStateType;
 interface
 
 uses
-  Types, Classes, SysUtils, BGRABitmap, BGRABitmapTypes, BGRALayers, fgl;
+  Types, Classes, SysUtils, BGRABitmap, BGRABitmapTypes, BGRALayers,
+  BGRALayerOriginal, fgl;
 
 const MinSizeToCompress = 512; //set to 1 if you want always compression
 const MinSerializedSize = 16384;
@@ -199,12 +200,14 @@ type
     FInfo: TLayerInfo;
     FIndex: integer;
     FOriginalData: TMemoryStream;
-    FOriginalKnown: boolean;
+    FOriginalBitmapStored: boolean;
     FOriginalRenderStatus: TOriginalRenderStatus;
     FOriginalMatrix: TAffineMatrix;
     FOriginalDraft: boolean;
   public
     constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer);
+    constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer;
+                       AAlwaysStoreBitmap: boolean);
     procedure Restore(ALayeredImage: TBGRALayeredBitmap);
     procedure Replace(ALayeredImage: TBGRALayeredBitmap);
     property LayerIndex: integer read FIndex;
@@ -1023,15 +1026,35 @@ end;
 
 constructor TStoredLayer.Create(ALayeredImage: TBGRALayeredBitmap;
   AIndex: integer);
+var
+  {%H-}orig: TBGRALayerCustomOriginal;
+  alwaysStoreBitmap: Boolean;
+begin
+  alwaysStoreBitmap := false;
+  if (ALayeredImage.LayerOriginalGuid[AIndex]<>GUID_NULL) and
+    ALayeredImage.LayerOriginalKnown[AIndex] then
+  begin
+    try
+      orig := ALayeredImage.LayerOriginal[AIndex];
+    except
+      on ex:exception do
+        alwaysStoreBitmap:= true;
+    end;
+  end;
+  Create(ALayeredImage, AIndex, alwaysStoreBitmap);
+end;
+
+constructor TStoredLayer.Create(ALayeredImage: TBGRALayeredBitmap;
+  AIndex: integer; AAlwaysStoreBitmap: boolean);
 begin
   FIndex := AIndex;
   FInfo := GetLayerInfo(ALayeredImage, AIndex);
   if ALayeredImage.LayerOriginalGuid[AIndex]<>GUID_NULL then
   begin
-    FOriginalKnown := ALayeredImage.LayerOriginalKnown[AIndex];
+    FOriginalBitmapStored := AAlwaysStoreBitmap or not ALayeredImage.LayerOriginalKnown[AIndex];
     FOriginalRenderStatus:= ALayeredImage.LayerOriginalRenderStatus[AIndex];
 
-    if FOriginalKnown then
+    if not FOriginalBitmapStored then
       inherited Create(nil)
     else
       inherited Create(ALayeredImage.LayerBitmap[AIndex]);
@@ -1056,7 +1079,7 @@ begin
     FOriginalData.Position:= 0;
     idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, true);
 
-    if FOriginalKnown then
+    if not FOriginalBitmapStored then
     begin
       tempIdx := ALayeredImage.AddLayerFromOriginal(ALayeredImage.Original[idxOrig].Guid, FOriginalMatrix);
       ALayeredImage.RenderLayerFromOriginal(tempIdx, FOriginalDraft);
@@ -1082,7 +1105,7 @@ begin
   begin
     FOriginalData.Position:= 0;
     idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, true);
-    if FOriginalKnown then
+    if not FOriginalBitmapStored then
     begin
       ALayeredImage.LayerOriginalGuid[FIndex] := ALayeredImage.OriginalGuid[idxOrig];
       ALayeredImage.LayerOriginalMatrix[FIndex] := FOriginalMatrix;

+ 19 - 6
lazpaint/utoolbasic.pas

@@ -88,6 +88,7 @@ type
     FRightDown, FLeftDown: boolean;
     FLastPos: TPointF;
     FLastShapeTransform: TAffineMatrix;
+    FUseOriginal: boolean;
     function AlwaysRasterizeShape: boolean; virtual;
     function CreateShape: TVectorShape; virtual; abstract;
     function UseOriginal: boolean; virtual;
@@ -110,6 +111,7 @@ type
     function SlowShape: boolean; virtual;
     procedure QuickDefineEnd; virtual;
     procedure OnTryStop({%H-}sender: TCustomLayerAction); override;
+    procedure UpdateUseOriginal;
   public
     function ValidateShape: TRect;
     function CancelShape: TRect;
@@ -218,6 +220,17 @@ begin
   ValidateShape;
 end;
 
+procedure TVectorialTool.UpdateUseOriginal;
+begin
+  if not IsSelectingTool and Manager.Image.SelectionMaskEmpty and
+     Manager.Image.LayerOriginalDefined[Manager.Image.CurrentLayerIndex] and
+     Manager.Image.LayerOriginalKnown[Manager.Image.CurrentLayerIndex] and
+    (Manager.Image.LayerOriginalClass[Manager.Image.CurrentLayerIndex] = TVectorOriginal) then
+    FUseOriginal:= Assigned(Manager.Image.LayerOriginal[Manager.Image.CurrentLayerIndex])
+  else
+    FUseOriginal:= false;
+end;
+
 function TVectorialTool.ValidateShape: TRect;
 var
   diff: TComposedImageDifference;
@@ -248,9 +261,10 @@ begin
         begin
           transf := VectorTransform;
           diff := TComposedImageDifference.Create;
-          replaceDiff := TReplaceLayerByVectorOriginalDifference.Create(Manager.Image.CurrentState,Manager.Image.CurrentLayerIndex);
+          replaceDiff := TReplaceLayerByVectorOriginalDifference.Create(Manager.Image.CurrentState,Manager.Image.CurrentLayerIndex,
+                           Manager.Image.LayerOriginalClass[Manager.Image.CurrentLayerIndex]=TVectorOriginal);
           diff.Add(replaceDiff);
-          transf := AffineMatrixInverse(VectorTransform)*transf;
+          transf := AffineMatrixInverse(Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex])*transf;
           FShape.Transform(transf);
           addDiff := TAddShapeToVectorOriginalDifference.Create(Manager.Image.CurrentState,layerId,FShape);
           diff.Add(addDiff);
@@ -269,6 +283,7 @@ begin
     end;
     Cursor := crDefault;
     result := OnlyRenderChange;
+    UpdateUseOriginal;
   end else
     result := EmptyRect;
 end;
@@ -299,10 +314,7 @@ end;
 
 function TVectorialTool.UseOriginal: boolean;
 begin
-  result := not IsSelectingTool and Manager.Image.SelectionMaskEmpty and
-            Manager.Image.LayerOriginalDefined[Manager.Image.CurrentLayerIndex] and
-            Manager.Image.LayerOriginalKnown[Manager.Image.CurrentLayerIndex] and
-           (Manager.Image.LayerOriginalClass[Manager.Image.CurrentLayerIndex] = TVectorOriginal);
+  result := FUseOriginal;
 end;
 
 function TVectorialTool.GetCustomShapeBounds(ADestBounds: TRect; AMatrix: TAffineMatrix; ADraft: boolean): TRect;
@@ -534,6 +546,7 @@ end;
 constructor TVectorialTool.Create(AManager: TToolManager);
 begin
   inherited Create(AManager);
+  UpdateUseOriginal;
   FPreviousUpdateBounds := EmptyRect;
   FEditor := TVectorOriginalEditor.Create(nil);
   FEditor.GridMatrix := AffineMatrixScale(0.5,0.5);