Ignore:
Timestamp:
Apr 17, 2019, 12:58:41 AM (5 years ago)
Author:
chronos
Message:
  • Modified: Propagate project build mode options to used packages.
  • Added: Check memory leaks using heaptrc.
  • Modified: Update BGRABitmap package.
Location:
GraphicTest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GraphicTest

    • Property svn:ignore
      •  

        old new  
        88GraphicTest.lps
        99GraphicTest.dbg
         10heaptrclog.trc
  • GraphicTest/Packages/bgrabitmap/bgraopenraster.pas

    r494 r521  
    3737    procedure SetMemoryStreamAsString(AFilename: string; AContent: string);
    3838    function GetMemoryStreamAsString(AFilename: string): string;
    39     procedure UnzipFromStream(AStream: TStream);
     39    procedure UnzipFromStream(AStream: TStream; AFileList: TStrings = nil);
    4040    procedure UnzipFromFile(AFilenameUTF8: string);
    4141    procedure ZipToFile(AFilenameUTF8: string);
    4242    procedure ZipToStream(AStream: TStream);
    4343    procedure CopyThumbnailToMemoryStream(AMaxWidth, AMaxHeight: integer);
    44     procedure AnalyzeZip;
    45     procedure PrepareZipToSave;
     44    procedure AnalyzeZip; virtual;
     45    procedure PrepareZipToSave; virtual;
    4646    function GetMimeType: string; override;
    4747
    4848  public
    49     constructor Create; override; overload;
    50     constructor Create(AWidth, AHeight: integer); override; overload;
     49    constructor Create; overload; override;
     50    constructor Create(AWidth, AHeight: integer); overload; override;
    5151    procedure Clear; override;
    5252    function CheckMimeType(AStream: TStream): boolean;
     53    procedure LoadFlatImageFromStream(AStream: TStream;
     54              out ANbLayers: integer;
     55              out ABitmap: TBGRABitmap);
    5356    procedure LoadFromStream(AStream: TStream); override;
    5457    procedure LoadFromFile(const filenameUTF8: string); override;
     
    8790  UnzipperExt;
    8891
     92const
     93  MergedImageFilename = 'mergedimage.png';
     94  LayerStackFilename = 'stack.xml';
     95
    8996function IsZipStream(stream: TStream): boolean;
    9097var
     
    140147  oldPos := stream.Position;
    141148  {$PUSH}{$HINTS OFF}
    142   BytesRead := Stream.Read(magic,sizeof(magic));
     149  BytesRead := Stream.Read({%H-}magic,sizeof(magic));
    143150  {$POP}
    144151  stream.Position:= OldPos;
     
    163170  layeredImage := TBGRAOpenRasterDocument.Create;
    164171  try
    165     layeredImage.LoadFromStream(Stream);
    166     flat := layeredImage.ComputeFlatImage;
    167     try
     172    layeredImage.LoadFlatImageFromStream(Stream, FNbLayers, flat);
     173    if Assigned(flat) then
     174    begin
     175      FWidth := flat.Width;
     176      FHeight := flat.Height;
     177    end else
     178    begin
     179      layeredImage.LoadFromStream(Stream);
     180      flat := layeredImage.ComputeFlatImage;
    168181      FWidth:= layeredImage.Width;
    169182      FHeight:= layeredImage.Height;
    170183      FNbLayers:= layeredImage.NbLayers;
     184    end;
     185    try
    171186      if Img is TBGRACustomBitmap then
    172187        TBGRACustomBitmap(img).Assign(flat)
     
    181196      flat.free;
    182197    end;
    183     layeredImage.Free;
     198    FreeAndNil(layeredImage);
    184199  except
    185200    on ex: Exception do
     
    203218  gammastr: string;
    204219begin
     220  inherited Clear;
     221
    205222  if MimeType <> OpenRasterMimeType then
    206223    raise Exception.Create('Invalid mime type');
    207224
    208   StackStream := GetMemoryStream('stack.xml');
     225  StackStream := GetMemoryStream(LayerStackFilename);
    209226  if StackStream = nil then
    210227    raise Exception.Create('Layer stack not found');
     
    225242      attr := imagenode.Attributes[i];
    226243      if lowercase(attr.NodeName) = 'w' then
    227         w := strToInt(attr.NodeValue) else
     244        w := strToInt(string(attr.NodeValue)) else
    228245      if lowercase(attr.NodeName) = 'h' then
    229         h := strToInt(attr.NodeValue) else
     246        h := strToInt(string(attr.NodeValue)) else
    230247      if lowercase(attr.NodeName) = 'gamma-correction' then
    231248        linearBlend := (attr.NodeValue = 'no') or (attr.NodeValue = '0');
     
    265282          end else
    266283          if lowercase(attr.NodeName) = 'gamma-correction' then
    267             gammastr := attr.NodeValue else
     284            gammastr := string(attr.NodeValue) else
    268285          if lowercase(attr.NodeName) = 'visibility' then
    269286            LayerVisible[idx] := (attr.NodeValue = 'visible') or (attr.NodeValue = 'yes') or (attr.NodeValue = '1') else
     
    283300          if lowercase(attr.NodeName) = 'composite-op' then
    284301          begin
    285             opstr := StringReplace(lowercase(attr.NodeValue),'_','-',[rfReplaceAll]);
     302            opstr := StringReplace(lowercase(string(attr.NodeValue)),'_','-',[rfReplaceAll]);
    286303            if (pos(':',opstr) = 0) and (opstr <> 'xor') then opstr := 'svg:'+opstr;
    287304            //parse composite op
     
    373390  imageNode := TDOMElement(StackXML.CreateElement('image'));
    374391  StackXML.AppendChild(imageNode);
    375   imageNode.SetAttribute('w',inttostr(Width));
    376   imageNode.SetAttribute('h',inttostr(Height));
     392  imageNode.SetAttribute('w',widestring(inttostr(Width)));
     393  imageNode.SetAttribute('h',widestring(inttostr(Height)));
    377394  if LinearBlend then
    378395    imageNode.SetAttribute('gamma-correction','no')
     
    395412      layerNode.SetAttribute('name', UTF8Decode(LayerName[i]));
    396413      str(LayerOpacity[i]/255:0:3,strval);
    397       layerNode.SetAttribute('opacity',strval);
    398       layerNode.SetAttribute('src',layerFilename);
     414      layerNode.SetAttribute('opacity',widestring(strval));
     415      layerNode.SetAttribute('src',widestring(layerFilename));
    399416      if LayerVisible[i] then
    400417        layerNode.SetAttribute('visibility','visible')
    401418      else
    402419        layerNode.SetAttribute('visibility','hidden');
    403       layerNode.SetAttribute('x',inttostr(LayerOffset[i].x));
    404       layerNode.SetAttribute('y',inttostr(LayerOffset[i].y));
     420      layerNode.SetAttribute('x',widestring(inttostr(LayerOffset[i].x)));
     421      layerNode.SetAttribute('y',widestring(inttostr(LayerOffset[i].y)));
    405422      strval := '';
    406423      case BlendOperation[i] of
     
    428445        else strval := 'svg:src-over';
    429446      end;
    430       layerNode.SetAttribute('composite-op',strval);
     447      layerNode.SetAttribute('composite-op',widestring(strval));
    431448      if BlendOperation[i] <> boTransparent then //in 'transparent' case, linear blending depends on general setting
    432449      begin
     
    434451             boSubtract,boExclusion,boNegation] then
    435452          strval := 'yes' else strval := 'no';
    436         layerNode.SetAttribute('gamma-correction',strval);
     453        layerNode.SetAttribute('gamma-correction',widestring(strval));
    437454      end;
    438455    end;
     
    458475  PrepareZipToSave;
    459476  ZipToFile(filenameUTF8);
     477  ClearFiles;
    460478end;
    461479
     
    464482  PrepareZipToSave;
    465483  ZipToStream(AStream);
     484  ClearFiles;
    466485end;
    467486
     
    593612end;
    594613
    595 procedure TBGRAOpenRasterDocument.UnzipFromStream(AStream: TStream);
     614procedure TBGRAOpenRasterDocument.UnzipFromStream(AStream: TStream;
     615          AFileList: TStrings = nil);
    596616var unzip: TUnZipper;
    597617begin
    598   Clear;
     618  ClearFiles;
    599619  unzip := TUnZipper.Create;
    600620  try
     
    604624    unzip.OnCloseInputStream := @ZipOnCloseInputStream;
    605625    FZipInputStream := AStream;
    606     unzip.UnZipAllFiles;
     626    if Assigned(AFileList) then
     627    begin
     628      if AFileList.Count > 0 then
     629        unzip.UnZipFiles(AFileList);
     630    end else
     631      unzip.UnZipAllFiles;
    607632  finally
    608633    FZipInputStream := nil;
     
    614639var unzip: TUnZipper;
    615640begin
    616   Clear;
     641  ClearFiles;
    617642  unzip := TUnZipper.Create;
    618643  try
     
    661686  if (Width = 0) or (Height = 0) then exit;
    662687  thumbnail := ComputeFlatImage;
    663   CopyBitmapToMemoryStream(thumbnail,'mergedimage.png');
     688  CopyBitmapToMemoryStream(thumbnail,MergedImageFilename);
    664689  if (thumbnail.Width > AMaxWidth) or
    665690   (thumbnail.Height > AMaxHeight) then
     
    709734end;
    710735
     736procedure TBGRAOpenRasterDocument.LoadFlatImageFromStream(AStream: TStream; out
     737  ANbLayers: integer; out ABitmap: TBGRABitmap);
     738var fileList: TStringList;
     739  imgStream, stackStream: TMemoryStream;
     740  imageNode, stackNode: TDOMNode;
     741  i: integer;
     742begin
     743  fileList := TStringList.Create;
     744  fileList.Add(MergedImageFilename);
     745  fileList.Add(LayerStackFilename);
     746  imgStream := nil;
     747  try
     748    UnzipFromStream(AStream, fileList);
     749    imgStream := GetMemoryStream(MergedImageFilename);
     750    if imgStream = nil then
     751      ABitmap := nil
     752    else
     753      ABitmap := TBGRABitmap.Create(imgStream);
     754    ANbLayers := 1;
     755
     756    stackStream := GetMemoryStream(LayerStackFilename);
     757    ReadXMLFile(FStackXML, StackStream);
     758    imageNode := StackXML.FindNode('image');
     759    if Assigned(imagenode) then
     760    begin
     761      stackNode := imageNode.FindNode('stack');
     762      if Assigned(stackNode) then
     763      begin
     764        ANbLayers:= 0;
     765        for i := stackNode.ChildNodes.Length-1 downto 0 do
     766        begin
     767          if stackNode.ChildNodes[i].NodeName = 'layer' then
     768            inc(ANbLayers);
     769        end;
     770      end;
     771    end;
     772
     773  finally
     774    fileList.Free;
     775    ClearFiles;
     776  end;
     777end;
     778
    711779procedure TBGRAOpenRasterDocument.LoadFromStream(AStream: TStream);
    712780begin
     
    717785  finally
    718786    OnLayeredBitmapLoaded;
     787    ClearFiles;
    719788  end;
    720789end;
Note: See TracChangeset for help on using the changeset viewer.