Changeset 521 for GraphicTest/Packages/bgrabitmap/bgraopenraster.pas
- Timestamp:
- Apr 17, 2019, 12:58:41 AM (5 years ago)
- Location:
- GraphicTest
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GraphicTest
- Property svn:ignore
-
old new 8 8 GraphicTest.lps 9 9 GraphicTest.dbg 10 heaptrclog.trc
-
- Property svn:ignore
-
GraphicTest/Packages/bgrabitmap/bgraopenraster.pas
r494 r521 37 37 procedure SetMemoryStreamAsString(AFilename: string; AContent: string); 38 38 function GetMemoryStreamAsString(AFilename: string): string; 39 procedure UnzipFromStream(AStream: TStream );39 procedure UnzipFromStream(AStream: TStream; AFileList: TStrings = nil); 40 40 procedure UnzipFromFile(AFilenameUTF8: string); 41 41 procedure ZipToFile(AFilenameUTF8: string); 42 42 procedure ZipToStream(AStream: TStream); 43 43 procedure CopyThumbnailToMemoryStream(AMaxWidth, AMaxHeight: integer); 44 procedure AnalyzeZip; 45 procedure PrepareZipToSave; 44 procedure AnalyzeZip; virtual; 45 procedure PrepareZipToSave; virtual; 46 46 function GetMimeType: string; override; 47 47 48 48 public 49 constructor Create; over ride; overload;50 constructor Create(AWidth, AHeight: integer); over ride; overload;49 constructor Create; overload; override; 50 constructor Create(AWidth, AHeight: integer); overload; override; 51 51 procedure Clear; override; 52 52 function CheckMimeType(AStream: TStream): boolean; 53 procedure LoadFlatImageFromStream(AStream: TStream; 54 out ANbLayers: integer; 55 out ABitmap: TBGRABitmap); 53 56 procedure LoadFromStream(AStream: TStream); override; 54 57 procedure LoadFromFile(const filenameUTF8: string); override; … … 87 90 UnzipperExt; 88 91 92 const 93 MergedImageFilename = 'mergedimage.png'; 94 LayerStackFilename = 'stack.xml'; 95 89 96 function IsZipStream(stream: TStream): boolean; 90 97 var … … 140 147 oldPos := stream.Position; 141 148 {$PUSH}{$HINTS OFF} 142 BytesRead := Stream.Read( magic,sizeof(magic));149 BytesRead := Stream.Read({%H-}magic,sizeof(magic)); 143 150 {$POP} 144 151 stream.Position:= OldPos; … … 163 170 layeredImage := TBGRAOpenRasterDocument.Create; 164 171 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; 168 181 FWidth:= layeredImage.Width; 169 182 FHeight:= layeredImage.Height; 170 183 FNbLayers:= layeredImage.NbLayers; 184 end; 185 try 171 186 if Img is TBGRACustomBitmap then 172 187 TBGRACustomBitmap(img).Assign(flat) … … 181 196 flat.free; 182 197 end; 183 layeredImage.Free;198 FreeAndNil(layeredImage); 184 199 except 185 200 on ex: Exception do … … 203 218 gammastr: string; 204 219 begin 220 inherited Clear; 221 205 222 if MimeType <> OpenRasterMimeType then 206 223 raise Exception.Create('Invalid mime type'); 207 224 208 StackStream := GetMemoryStream( 'stack.xml');225 StackStream := GetMemoryStream(LayerStackFilename); 209 226 if StackStream = nil then 210 227 raise Exception.Create('Layer stack not found'); … … 225 242 attr := imagenode.Attributes[i]; 226 243 if lowercase(attr.NodeName) = 'w' then 227 w := strToInt( attr.NodeValue) else244 w := strToInt(string(attr.NodeValue)) else 228 245 if lowercase(attr.NodeName) = 'h' then 229 h := strToInt( attr.NodeValue) else246 h := strToInt(string(attr.NodeValue)) else 230 247 if lowercase(attr.NodeName) = 'gamma-correction' then 231 248 linearBlend := (attr.NodeValue = 'no') or (attr.NodeValue = '0'); … … 265 282 end else 266 283 if lowercase(attr.NodeName) = 'gamma-correction' then 267 gammastr := attr.NodeValueelse284 gammastr := string(attr.NodeValue) else 268 285 if lowercase(attr.NodeName) = 'visibility' then 269 286 LayerVisible[idx] := (attr.NodeValue = 'visible') or (attr.NodeValue = 'yes') or (attr.NodeValue = '1') else … … 283 300 if lowercase(attr.NodeName) = 'composite-op' then 284 301 begin 285 opstr := StringReplace(lowercase( attr.NodeValue),'_','-',[rfReplaceAll]);302 opstr := StringReplace(lowercase(string(attr.NodeValue)),'_','-',[rfReplaceAll]); 286 303 if (pos(':',opstr) = 0) and (opstr <> 'xor') then opstr := 'svg:'+opstr; 287 304 //parse composite op … … 373 390 imageNode := TDOMElement(StackXML.CreateElement('image')); 374 391 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))); 377 394 if LinearBlend then 378 395 imageNode.SetAttribute('gamma-correction','no') … … 395 412 layerNode.SetAttribute('name', UTF8Decode(LayerName[i])); 396 413 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)); 399 416 if LayerVisible[i] then 400 417 layerNode.SetAttribute('visibility','visible') 401 418 else 402 419 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))); 405 422 strval := ''; 406 423 case BlendOperation[i] of … … 428 445 else strval := 'svg:src-over'; 429 446 end; 430 layerNode.SetAttribute('composite-op', strval);447 layerNode.SetAttribute('composite-op',widestring(strval)); 431 448 if BlendOperation[i] <> boTransparent then //in 'transparent' case, linear blending depends on general setting 432 449 begin … … 434 451 boSubtract,boExclusion,boNegation] then 435 452 strval := 'yes' else strval := 'no'; 436 layerNode.SetAttribute('gamma-correction', strval);453 layerNode.SetAttribute('gamma-correction',widestring(strval)); 437 454 end; 438 455 end; … … 458 475 PrepareZipToSave; 459 476 ZipToFile(filenameUTF8); 477 ClearFiles; 460 478 end; 461 479 … … 464 482 PrepareZipToSave; 465 483 ZipToStream(AStream); 484 ClearFiles; 466 485 end; 467 486 … … 593 612 end; 594 613 595 procedure TBGRAOpenRasterDocument.UnzipFromStream(AStream: TStream); 614 procedure TBGRAOpenRasterDocument.UnzipFromStream(AStream: TStream; 615 AFileList: TStrings = nil); 596 616 var unzip: TUnZipper; 597 617 begin 598 Clear ;618 ClearFiles; 599 619 unzip := TUnZipper.Create; 600 620 try … … 604 624 unzip.OnCloseInputStream := @ZipOnCloseInputStream; 605 625 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; 607 632 finally 608 633 FZipInputStream := nil; … … 614 639 var unzip: TUnZipper; 615 640 begin 616 Clear ;641 ClearFiles; 617 642 unzip := TUnZipper.Create; 618 643 try … … 661 686 if (Width = 0) or (Height = 0) then exit; 662 687 thumbnail := ComputeFlatImage; 663 CopyBitmapToMemoryStream(thumbnail, 'mergedimage.png');688 CopyBitmapToMemoryStream(thumbnail,MergedImageFilename); 664 689 if (thumbnail.Width > AMaxWidth) or 665 690 (thumbnail.Height > AMaxHeight) then … … 709 734 end; 710 735 736 procedure TBGRAOpenRasterDocument.LoadFlatImageFromStream(AStream: TStream; out 737 ANbLayers: integer; out ABitmap: TBGRABitmap); 738 var fileList: TStringList; 739 imgStream, stackStream: TMemoryStream; 740 imageNode, stackNode: TDOMNode; 741 i: integer; 742 begin 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; 777 end; 778 711 779 procedure TBGRAOpenRasterDocument.LoadFromStream(AStream: TStream); 712 780 begin … … 717 785 finally 718 786 OnLayeredBitmapLoaded; 787 ClearFiles; 719 788 end; 720 789 end;
Note:
See TracChangeset
for help on using the changeset viewer.