root / Imaging / ImagingExport.pas @ 0:95bd93c28625
History | View | Annotate | Download (26 kB)
| 1 | {
|
|---|---|
| 2 | $Id: ImagingExport.pas 71 2007-03-08 00:10:10Z galfar $ |
| 3 | Vampyre Imaging Library |
| 4 | by Marek Mauder |
| 5 | http://imaginglib.sourceforge.net |
| 6 | |
| 7 | The contents of this file are used with permission, subject to the Mozilla |
| 8 | Public License Version 1.1 (the "License"); you may not use this file except |
| 9 | in compliance with the License. You may obtain a copy of the License at |
| 10 | http://www.mozilla.org/MPL/MPL-1.1.html |
| 11 | |
| 12 | Software distributed under the License is distributed on an "AS IS" basis, |
| 13 | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
| 14 | the specific language governing rights and limitations under the License. |
| 15 | |
| 16 | Alternatively, the contents of this file may be used under the terms of the |
| 17 | GNU Lesser General Public License (the "LGPL License"), in which case the |
| 18 | provisions of the LGPL License are applicable instead of those above. |
| 19 | If you wish to allow use of your version of this file only under the terms |
| 20 | of the LGPL License and not to allow others to use your version of this file |
| 21 | under the MPL, indicate your decision by deleting the provisions above and |
| 22 | replace them with the notice and other provisions required by the LGPL |
| 23 | License. If you do not delete the provisions above, a recipient may use |
| 24 | your version of this file under either the MPL or the LGPL License. |
| 25 | |
| 26 | For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html |
| 27 | } |
| 28 | |
| 29 | { This function contains functions exported from Imaging dynamic link library.
|
| 30 | All string are exported as PChars and all var parameters are exported |
| 31 | as pointers. All posible exceptions getting out of dll are catched.} |
| 32 | unit ImagingExport;
|
| 33 | |
| 34 | {$I ImagingOptions.inc}
|
| 35 | |
| 36 | interface
|
| 37 | |
| 38 | uses
|
| 39 | ImagingTypes, |
| 40 | Imaging; |
| 41 | |
| 42 | { Returns version of Imaging library. }
|
| 43 | procedure ImGetVersion(var Major, Minor, Patch: LongInt); cdecl; |
| 44 | { Look at InitImage for details.}
|
| 45 | procedure ImInitImage(var Image: TImageData); cdecl; |
| 46 | { Look at NewImage for details.}
|
| 47 | function ImNewImage(Width, Height: LongInt; Format: TImageFormat;
|
| 48 | var Image: TImageData): Boolean; cdecl; |
| 49 | { Look at TestImage for details.}
|
| 50 | function ImTestImage(var Image: TImageData): Boolean; cdecl; |
| 51 | { Look at FreeImage for details.}
|
| 52 | function ImFreeImage(var Image: TImageData): Boolean; cdecl; |
| 53 | { Look at DetermineFileFormat for details. Ext should have enough space for
|
| 54 | result file extension.} |
| 55 | function ImDetermineFileFormat(FileName, Ext: PChar): Boolean; cdecl; |
| 56 | { Look at DetermineMemoryFormat for details. Ext should have enough space for
|
| 57 | result file extension.} |
| 58 | function ImDetermineMemoryFormat(Data: Pointer; Size: LongInt; Ext: PChar): Boolean; cdecl; |
| 59 | { Look at IsFileFormatSupported for details.}
|
| 60 | function ImIsFileFormatSupported(FileName: PChar): Boolean; cdecl; |
| 61 | { Look at EnumFileFormats for details.}
|
| 62 | function ImEnumFileFormats(var Index: LongInt; Name, DefaultExt, Masks: PChar; |
| 63 | var CanSave, IsMultiImageFormat: Boolean): Boolean; cdecl; |
| 64 | |
| 65 | { Inits image list.}
|
| 66 | function ImInitImageList(Size: LongInt; var ImageList: TImageDataList): Boolean; cdecl; |
| 67 | { Returns size of image list.}
|
| 68 | function ImGetImageListSize(ImageList: TImageDataList): LongInt; cdecl; |
| 69 | { Returns image list's element at given index. Output image is not cloned it's
|
| 70 | Bits point to Bits in list => do not free OutImage.} |
| 71 | function ImGetImageListElement(ImageList: TImageDataList; Index: LongInt;
|
| 72 | var OutImage: TImageData): Boolean; cdecl; |
| 73 | { Sets size of image list.}
|
| 74 | function ImSetImageListSize(ImageList: TImageDataList; NewSize: LongInt): Boolean; cdecl; |
| 75 | { Sets image list element at given index. Input image is not cloned - image in
|
| 76 | list will point to InImage's Bits.} |
| 77 | function ImSetImageListElement(ImageList: TImageDataList; Index: LongInt;
|
| 78 | const InImage: TImageData): Boolean; cdecl; |
| 79 | { Returns True if all images in list pass ImTestImage test. }
|
| 80 | function ImTestImagesInList(ImageList: TImageDataList): Boolean; cdecl; |
| 81 | { Frees image list and all images in it.}
|
| 82 | function ImFreeImageList(var ImageList: TImageDataList): Boolean; cdecl; |
| 83 | |
| 84 | { Look at LoadImageFromFile for details.}
|
| 85 | function ImLoadImageFromFile(FileName: PChar; var Image: TImageData): Boolean; cdecl; |
| 86 | { Look at LoadImageFromMemory for details.}
|
| 87 | function ImLoadImageFromMemory(Data: Pointer; Size: LongInt; var Image: TImageData): Boolean; cdecl; |
| 88 | { Look at LoadMultiImageFromFile for details.}
|
| 89 | function ImLoadMultiImageFromFile(FileName: PChar; var ImageList: TImageDataList): Boolean; cdecl; |
| 90 | { Look at LoadMultiImageFromMemory for details.}
|
| 91 | function ImLoadMultiImageFromMemory(Data: Pointer; Size: LongInt;
|
| 92 | var ImageList: TImageDataList): Boolean; cdecl; |
| 93 | |
| 94 | { Look at SaveImageToFile for details.}
|
| 95 | function ImSaveImageToFile(FileName: PChar; const Image: TImageData): Boolean; cdecl; |
| 96 | { Look at SaveImageToMemory for details.}
|
| 97 | function ImSaveImageToMemory(Ext: PChar; Data: Pointer; var Size: LongInt; |
| 98 | const Image: TImageData): Boolean; cdecl; |
| 99 | { Look at SaveMultiImageToFile for details.}
|
| 100 | function ImSaveMultiImageToFile(FileName: PChar; ImageList: TImageDataList): Boolean; cdecl; |
| 101 | { Look at SaveMultiImageToMemory for details.}
|
| 102 | function ImSaveMultiImageToMemory(Ext: PChar; Data: Pointer; Size: PLongInt;
|
| 103 | ImageList: TImageDataList): Boolean; cdecl;
|
| 104 | |
| 105 | { Look at CloneImage for details.}
|
| 106 | function ImCloneImage(const Image: TImageData; var Clone: TImageData): Boolean; cdecl; |
| 107 | { Look at ConvertImage for details.}
|
| 108 | function ImConvertImage(var Image: TImageData; DestFormat: TImageFormat): Boolean; cdecl; |
| 109 | { Look at FlipImage for details.}
|
| 110 | function ImFlipImage(var Image: TImageData): Boolean; cdecl; |
| 111 | { Look at MirrorImage for details.}
|
| 112 | function ImMirrorImage(var Image: TImageData): Boolean; cdecl; |
| 113 | { Look at ResizeImage for details.}
|
| 114 | function ImResizeImage(var Image: TImageData; NewWidth, NewHeight: LongInt; |
| 115 | Filter: TResizeFilter): Boolean; cdecl;
|
| 116 | { Look at SwapChannels for details.}
|
| 117 | function ImSwapChannels(var Image: TImageData; SrcChannel, DstChannel: LongInt): Boolean; cdecl; |
| 118 | { Look at ReduceColors for details.}
|
| 119 | function ImReduceColors(var Image: TImageData; MaxColors: LongInt): Boolean; cdecl; |
| 120 | { Look at GenerateMipMaps for details.}
|
| 121 | function ImGenerateMipMaps(const Image: TImageData; Levels: LongInt; |
| 122 | var MipMaps: TImageDataList): Boolean; cdecl; |
| 123 | { Look at MapImageToPalette for details.}
|
| 124 | function ImMapImageToPalette(var Image: TImageData; Pal: PPalette32; |
| 125 | Entries: LongInt): Boolean; cdecl;
|
| 126 | { Look at SplitImage for details.}
|
| 127 | function ImSplitImage(var Image: TImageData; var Chunks: TImageDataList; |
| 128 | ChunkWidth, ChunkHeight: LongInt; var XChunks, YChunks: LongInt;
|
| 129 | PreserveSize: Boolean; Fill: Pointer): Boolean; cdecl;
|
| 130 | { Look at MakePaletteForImages for details.}
|
| 131 | function ImMakePaletteForImages(Images: TImageDataList; Pal: PPalette32;
|
| 132 | MaxColors: LongInt; ConvertImages: Boolean): Boolean; cdecl;
|
| 133 | { Look at RotateImage for details.}
|
| 134 | function ImRotateImage(var Image: TImageData; Angle: LongInt): Boolean; cdecl; |
| 135 | |
| 136 | { Look at CopyRect for details.}
|
| 137 | function ImCopyRect(const SrcImage: TImageData; SrcX, SrcY, Width, Height: LongInt; |
| 138 | var DstImage: TImageData; DstX, DstY: LongInt): Boolean; cdecl; |
| 139 | { Look at FillRect for details.}
|
| 140 | function ImFillRect(var Image: TImageData; X, Y, Width, Height: LongInt; |
| 141 | Fill: Pointer): Boolean; cdecl;
|
| 142 | { Look at ReplaceColor for details.}
|
| 143 | function ImReplaceColor(var Image: TImageData; X, Y, Width, Height: LongInt; |
| 144 | OldPixel, NewPixel: Pointer): Boolean; cdecl;
|
| 145 | { Look at StretchRect for details.}
|
| 146 | function ImStretchRect(const SrcImage: TImageData; SrcX, SrcY, SrcWidth, |
| 147 | SrcHeight: LongInt; var DstImage: TImageData; DstX, DstY, DstWidth,
|
| 148 | DstHeight: LongInt; Filter: TResizeFilter): Boolean; cdecl;
|
| 149 | { Look at GetPixelDirect for details.}
|
| 150 | procedure ImGetPixelDirect(const Image: TImageData; X, Y: LongInt; Pixel: Pointer); cdecl; |
| 151 | { Look at SetPixelDirect for details.}
|
| 152 | procedure ImSetPixelDirect(const Image: TImageData; X, Y: LongInt; Pixel: Pointer); cdecl; |
| 153 | { Look at GetPixel32 for details.}
|
| 154 | function ImGetPixel32(const Image: TImageData; X, Y: LongInt): TColor32Rec; cdecl; |
| 155 | { Look at SetPixel32 for details.}
|
| 156 | procedure ImSetPixel32(const Image: TImageData; X, Y: LongInt; const Color: TColor32Rec); cdecl; |
| 157 | { Look at GetPixelFP for details.}
|
| 158 | function ImGetPixelFP(const Image: TImageData; X, Y: LongInt): TColorFPRec; cdecl; |
| 159 | { Look at SetPixelFP for details.}
|
| 160 | procedure ImSetPixelFP(const Image: TImageData; X, Y: LongInt; const Color: TColorFPRec); cdecl; |
| 161 | |
| 162 | { Look at NewPalette for details.}
|
| 163 | function ImNewPalette(Entries: LongInt; var Pal: PPalette32): Boolean; cdecl; |
| 164 | { Look at FreePalette for details.}
|
| 165 | function ImFreePalette(var Pal: PPalette32): Boolean; cdecl; |
| 166 | { Look at CopyPalette for details.}
|
| 167 | function ImCopyPalette(SrcPal, DstPal: PPalette32; SrcIdx, DstIdx, Count: LongInt): Boolean; cdecl; |
| 168 | { Look at FindColor for details.}
|
| 169 | function ImFindColor(Pal: PPalette32; Entries: LongInt; Color: TColor32): LongInt; cdecl; |
| 170 | { Look at FillGrayscalePalette for details.}
|
| 171 | function ImFillGrayscalePalette(Pal: PPalette32; Entries: LongInt): Boolean; cdecl; |
| 172 | { Look at FillCustomPalette for details.}
|
| 173 | function ImFillCustomPalette(Pal: PPalette32; Entries: LongInt; RBits, GBits,
|
| 174 | BBits: Byte; Alpha: Byte): Boolean; cdecl;
|
| 175 | { Look at SwapChannelsOfPalette for details.}
|
| 176 | function ImSwapChannelsOfPalette(Pal: PPalette32; Entries, SrcChannel,
|
| 177 | DstChannel: LongInt): Boolean; cdecl;
|
| 178 | |
| 179 | { Look at SetOption for details.}
|
| 180 | function ImSetOption(OptionId, Value: LongInt): Boolean; cdecl; |
| 181 | { Look at GetOption for details.}
|
| 182 | function ImGetOption(OptionId: LongInt): LongInt; cdecl; |
| 183 | { Look at PushOptions for details.}
|
| 184 | function ImPushOptions: Boolean; cdecl; |
| 185 | { Look at PopOptions for details.}
|
| 186 | function ImPopOptions: Boolean; cdecl; |
| 187 | |
| 188 | { Look at GetImageFormatInfo for details.}
|
| 189 | function ImGetImageFormatInfo(Format: TImageFormat; var Info: TImageFormatInfo): Boolean; cdecl; |
| 190 | { Look at GetPixelsSize for details.}
|
| 191 | function ImGetPixelsSize(Format: TImageFormat; Width, Height: LongInt): LongInt; cdecl; |
| 192 | |
| 193 | { Look at SetUserFileIO for details.}
|
| 194 | procedure ImSetUserFileIO(OpenReadProc: TOpenReadProc; OpenWriteProc:
|
| 195 | TOpenWriteProc; CloseProc: TCloseProc; EofProc: TEofProc; SeekProc: TSeekProc; |
| 196 | TellProc: TTellProc; ReadProc: TReadProc; WriteProc: TWriteProc); cdecl;
|
| 197 | { Look at ResetFileIO for details.}
|
| 198 | procedure ImResetFileIO; cdecl; |
| 199 | |
| 200 | { These are only for documentation generation reasons.}
|
| 201 | { Loads Imaging functions from dll/so library.}
|
| 202 | function ImLoadLibrary: Boolean;
|
| 203 | { Frees Imaging functions loaded from dll/so and releases library.}
|
| 204 | function ImFreeLibrary: Boolean;
|
| 205 | |
| 206 | implementation
|
| 207 | |
| 208 | uses
|
| 209 | SysUtils, |
| 210 | ImagingUtility; |
| 211 | |
| 212 | function ImLoadLibrary: Boolean; begin Result := True; end; |
| 213 | function ImFreeLibrary: Boolean; begin Result := True; end; |
| 214 | |
| 215 | type
|
| 216 | TInternalList = record
|
| 217 | List: TDynImageDataArray; |
| 218 | end;
|
| 219 | PInternalList = ^TInternalList; |
| 220 | |
| 221 | procedure ImGetVersion(var Major, Minor, Patch: LongInt); |
| 222 | begin
|
| 223 | Major := ImagingVersionMajor; |
| 224 | Minor := ImagingVersionMinor; |
| 225 | Patch := ImagingVersionPatch; |
| 226 | end;
|
| 227 | |
| 228 | procedure ImInitImage(var Image: TImageData); |
| 229 | begin
|
| 230 | try
|
| 231 | Imaging.InitImage(Image); |
| 232 | except
|
| 233 | end;
|
| 234 | end;
|
| 235 | |
| 236 | function ImNewImage(Width, Height: LongInt; Format: TImageFormat;
|
| 237 | var Image: TImageData): Boolean;
|
| 238 | begin
|
| 239 | try
|
| 240 | Result := Imaging.NewImage(Width, Height, Format, Image); |
| 241 | except
|
| 242 | Result := False; |
| 243 | end;
|
| 244 | end;
|
| 245 | |
| 246 | function ImTestImage(var Image: TImageData): Boolean; |
| 247 | begin
|
| 248 | try
|
| 249 | Result := Imaging.TestImage(Image); |
| 250 | except
|
| 251 | Result := False; |
| 252 | end;
|
| 253 | end;
|
| 254 | |
| 255 | function ImFreeImage(var Image: TImageData): Boolean; |
| 256 | begin
|
| 257 | try
|
| 258 | Imaging.FreeImage(Image); |
| 259 | Result := True; |
| 260 | except
|
| 261 | Result := False; |
| 262 | end;
|
| 263 | end;
|
| 264 | |
| 265 | function ImDetermineFileFormat(FileName, Ext: PChar): Boolean;
|
| 266 | var
|
| 267 | S: string;
|
| 268 | begin
|
| 269 | try
|
| 270 | S := Imaging.DetermineFileFormat(FileName); |
| 271 | Result := S <> '';
|
| 272 | StrCopy(Ext, PChar(S)); |
| 273 | except
|
| 274 | Result := False; |
| 275 | end;
|
| 276 | end;
|
| 277 | |
| 278 | function ImDetermineMemoryFormat(Data: Pointer; Size: LongInt; Ext: PChar): Boolean;
|
| 279 | var
|
| 280 | S: string;
|
| 281 | begin
|
| 282 | try
|
| 283 | S := Imaging.DetermineMemoryFormat(Data, Size); |
| 284 | Result := S <> '';
|
| 285 | StrCopy(Ext, PChar(S)); |
| 286 | except
|
| 287 | Result := False; |
| 288 | end;
|
| 289 | end;
|
| 290 | |
| 291 | function ImIsFileFormatSupported(FileName: PChar): Boolean;
|
| 292 | begin
|
| 293 | try
|
| 294 | Result := Imaging.IsFileFormatSupported(FileName); |
| 295 | except
|
| 296 | Result := False; |
| 297 | end;
|
| 298 | end;
|
| 299 | |
| 300 | function ImEnumFileFormats(var Index: LongInt; Name, DefaultExt, Masks: PChar; |
| 301 | var CanSave, IsMultiImageFormat: Boolean): Boolean;
|
| 302 | var
|
| 303 | StrName, StrDefaultExt, StrMasks: string;
|
| 304 | begin
|
| 305 | try
|
| 306 | Result := Imaging.EnumFileFormats(Index, StrName, StrDefaultExt, StrMasks, CanSave, |
| 307 | IsMultiImageFormat); |
| 308 | StrCopy(Name, PChar(StrName)); |
| 309 | StrCopy(DefaultExt, PChar(StrDefaultExt)); |
| 310 | StrCopy(Masks, PChar(StrMasks)); |
| 311 | except
|
| 312 | Result := False; |
| 313 | end;
|
| 314 | end;
|
| 315 | |
| 316 | function ImInitImageList(Size: LongInt; var ImageList: TImageDataList): Boolean; |
| 317 | var
|
| 318 | Int: PInternalList; |
| 319 | begin
|
| 320 | try
|
| 321 | try
|
| 322 | ImFreeImageList(ImageList); |
| 323 | except
|
| 324 | end;
|
| 325 | New(Int); |
| 326 | SetLength(Int.List, Size); |
| 327 | ImageList := TImageDataList(Int); |
| 328 | Result := True; |
| 329 | except
|
| 330 | Result := False; |
| 331 | ImageList := nil;
|
| 332 | end;
|
| 333 | end;
|
| 334 | |
| 335 | function ImGetImageListSize(ImageList: TImageDataList): LongInt;
|
| 336 | begin
|
| 337 | try
|
| 338 | Result := Length(PInternalList(ImageList).List); |
| 339 | except
|
| 340 | Result := -1;
|
| 341 | end;
|
| 342 | end;
|
| 343 | |
| 344 | function ImGetImageListElement(ImageList: TImageDataList; Index: LongInt;
|
| 345 | var OutImage: TImageData): Boolean;
|
| 346 | begin
|
| 347 | try
|
| 348 | Index := ClampInt(Index, 0, Length(PInternalList(ImageList).List) - 1); |
| 349 | ImCloneImage(PInternalList(ImageList).List[Index], OutImage); |
| 350 | Result := True; |
| 351 | except
|
| 352 | Result := False; |
| 353 | end;
|
| 354 | end;
|
| 355 | |
| 356 | function ImSetImageListSize(ImageList: TImageDataList; NewSize: LongInt):
|
| 357 | Boolean; |
| 358 | var
|
| 359 | I, OldSize: LongInt; |
| 360 | begin
|
| 361 | try
|
| 362 | OldSize := Length(PInternalList(ImageList).List); |
| 363 | if NewSize < OldSize then |
| 364 | for I := NewSize to OldSize - 1 do |
| 365 | Imaging.FreeImage(PInternalList(ImageList).List[I]); |
| 366 | SetLength(PInternalList(ImageList).List, NewSize); |
| 367 | Result := True; |
| 368 | except
|
| 369 | Result := False; |
| 370 | end;
|
| 371 | end;
|
| 372 | |
| 373 | function ImSetImageListElement(ImageList: TImageDataList; Index: LongInt;
|
| 374 | const InImage: TImageData): Boolean;
|
| 375 | begin
|
| 376 | try
|
| 377 | Index := ClampInt(Index, 0, Length(PInternalList(ImageList).List) - 1); |
| 378 | ImCloneImage(InImage, PInternalList(ImageList).List[Index]); |
| 379 | Result := True; |
| 380 | except
|
| 381 | Result := False; |
| 382 | end;
|
| 383 | end;
|
| 384 | |
| 385 | function ImTestImagesInList(ImageList: TImageDataList): Boolean;
|
| 386 | var
|
| 387 | I: LongInt; |
| 388 | Arr: TDynImageDataArray; |
| 389 | begin
|
| 390 | Arr := nil;
|
| 391 | try
|
| 392 | Arr := PInternalList(ImageList).List; |
| 393 | Result := True; |
| 394 | for I := 0 to Length(Arr) - 1 do |
| 395 | begin
|
| 396 | Result := Result and Imaging.TestImage(Arr[I]);
|
| 397 | if not Result then Break; |
| 398 | end;
|
| 399 | except
|
| 400 | Result := False; |
| 401 | end;
|
| 402 | end;
|
| 403 | |
| 404 | function ImFreeImageList(var ImageList: TImageDataList): Boolean; |
| 405 | var
|
| 406 | Int: PInternalList; |
| 407 | begin
|
| 408 | try
|
| 409 | if ImageList <> nil then |
| 410 | begin
|
| 411 | Int := PInternalList(ImageList); |
| 412 | FreeImagesInArray(Int.List); |
| 413 | Dispose(Int); |
| 414 | ImageList := nil;
|
| 415 | end;
|
| 416 | Result := True; |
| 417 | except
|
| 418 | Result := False; |
| 419 | end;
|
| 420 | end;
|
| 421 | |
| 422 | function ImLoadImageFromFile(FileName: PChar; var Image: TImageData): Boolean; |
| 423 | begin
|
| 424 | try
|
| 425 | Result := Imaging.LoadImageFromFile(FileName, Image); |
| 426 | except
|
| 427 | Result := False; |
| 428 | end;
|
| 429 | end;
|
| 430 | |
| 431 | function ImLoadImageFromMemory(Data: Pointer; Size: LongInt; var Image: TImageData): Boolean; |
| 432 | begin
|
| 433 | try
|
| 434 | Result := Imaging.LoadImageFromMemory(Data, Size, Image); |
| 435 | except
|
| 436 | Result := False; |
| 437 | end;
|
| 438 | end;
|
| 439 | |
| 440 | function ImLoadMultiImageFromFile(FileName: PChar; var ImageList: TImageDataList): |
| 441 | Boolean; |
| 442 | begin
|
| 443 | try
|
| 444 | ImInitImageList(0, ImageList);
|
| 445 | Result := Imaging.LoadMultiImageFromFile(FileName, |
| 446 | PInternalList(ImageList).List); |
| 447 | except
|
| 448 | Result := False; |
| 449 | end;
|
| 450 | end;
|
| 451 | |
| 452 | function ImLoadMultiImageFromMemory(Data: Pointer; Size: LongInt;
|
| 453 | var ImageList: TImageDataList): Boolean;
|
| 454 | begin
|
| 455 | try
|
| 456 | ImInitImageList(0, ImageList);
|
| 457 | Result := Imaging.LoadMultiImageFromMemory(Data, Size, PInternalList(ImageList).List); |
| 458 | except
|
| 459 | Result := False; |
| 460 | end;
|
| 461 | end;
|
| 462 | |
| 463 | function ImSaveImageToFile(FileName: PChar; const Image: TImageData): Boolean; |
| 464 | begin
|
| 465 | try
|
| 466 | Result := Imaging.SaveImageToFile(FileName, Image); |
| 467 | except
|
| 468 | Result := False; |
| 469 | end;
|
| 470 | end;
|
| 471 | |
| 472 | function ImSaveImageToMemory(Ext: PChar; Data: Pointer; var Size: LongInt; |
| 473 | const Image: TImageData): Boolean;
|
| 474 | begin
|
| 475 | try
|
| 476 | Result := Imaging.SaveImageToMemory(Ext, Data, Size, Image); |
| 477 | except
|
| 478 | Result := False; |
| 479 | end;
|
| 480 | end;
|
| 481 | |
| 482 | function ImSaveMultiImageToFile(FileName: PChar;
|
| 483 | ImageList: TImageDataList): Boolean; |
| 484 | begin
|
| 485 | try
|
| 486 | Result := Imaging.SaveMultiImageToFile(FileName, |
| 487 | PInternalList(ImageList).List); |
| 488 | except
|
| 489 | Result := False; |
| 490 | end;
|
| 491 | end;
|
| 492 | |
| 493 | function ImSaveMultiImageToMemory(Ext: PChar; Data: Pointer; Size: PLongInt;
|
| 494 | ImageList: TImageDataList): Boolean; |
| 495 | begin
|
| 496 | try
|
| 497 | Result := Imaging.SaveMultiImageToMemory(Ext, Data, Size^, |
| 498 | PInternalList(ImageList).List); |
| 499 | except
|
| 500 | Result := False; |
| 501 | end;
|
| 502 | end;
|
| 503 | |
| 504 | function ImCloneImage(const Image: TImageData; var Clone: TImageData): Boolean; |
| 505 | begin
|
| 506 | try
|
| 507 | Result := Imaging.CloneImage(Image, Clone); |
| 508 | except
|
| 509 | Result := False; |
| 510 | end;
|
| 511 | end;
|
| 512 | |
| 513 | function ImConvertImage(var Image: TImageData; DestFormat: TImageFormat): Boolean; |
| 514 | begin
|
| 515 | try
|
| 516 | Result := Imaging.ConvertImage(Image, DestFormat); |
| 517 | except
|
| 518 | Result := False; |
| 519 | end;
|
| 520 | end;
|
| 521 | |
| 522 | function ImFlipImage(var Image: TImageData): Boolean; |
| 523 | begin
|
| 524 | try
|
| 525 | Result := Imaging.FlipImage(Image); |
| 526 | except
|
| 527 | Result := False; |
| 528 | end;
|
| 529 | end;
|
| 530 | |
| 531 | function ImMirrorImage(var Image: TImageData): Boolean; |
| 532 | begin
|
| 533 | try
|
| 534 | Result := Imaging.MirrorImage(Image); |
| 535 | except
|
| 536 | Result := False; |
| 537 | end;
|
| 538 | end;
|
| 539 | |
| 540 | function ImResizeImage(var Image: TImageData; NewWidth, NewHeight: LongInt; |
| 541 | Filter: TResizeFilter): Boolean; |
| 542 | begin
|
| 543 | try
|
| 544 | Result := Imaging.ResizeImage(Image, NewWidth, NewHeight, Filter); |
| 545 | except
|
| 546 | Result := False; |
| 547 | end;
|
| 548 | end;
|
| 549 | |
| 550 | function ImSwapChannels(var Image: TImageData; SrcChannel, DstChannel: LongInt): |
| 551 | Boolean; |
| 552 | begin
|
| 553 | try
|
| 554 | Result := Imaging.SwapChannels(Image, SrcChannel, DstChannel); |
| 555 | except
|
| 556 | Result := False; |
| 557 | end;
|
| 558 | end;
|
| 559 | |
| 560 | function ImReduceColors(var Image: TImageData; MaxColors: LongInt): Boolean; |
| 561 | begin
|
| 562 | try
|
| 563 | Result := Imaging.ReduceColors(Image, MaxColors); |
| 564 | except
|
| 565 | Result := False; |
| 566 | end;
|
| 567 | end;
|
| 568 | |
| 569 | function ImGenerateMipMaps(const Image: TImageData; Levels: LongInt; |
| 570 | var MipMaps: TImageDataList): Boolean;
|
| 571 | begin
|
| 572 | try
|
| 573 | ImInitImageList(0, MipMaps);
|
| 574 | Result := Imaging.GenerateMipMaps(Image, Levels, |
| 575 | PInternalList(MipMaps).List); |
| 576 | except
|
| 577 | Result := False; |
| 578 | end;
|
| 579 | end;
|
| 580 | |
| 581 | function ImMapImageToPalette(var Image: TImageData; Pal: PPalette32; |
| 582 | Entries: LongInt): Boolean; |
| 583 | begin
|
| 584 | try
|
| 585 | Result := Imaging.MapImageToPalette(Image, Pal, Entries); |
| 586 | except
|
| 587 | Result := False; |
| 588 | end;
|
| 589 | end;
|
| 590 | |
| 591 | function ImSplitImage(var Image: TImageData; var Chunks: TImageDataList; |
| 592 | ChunkWidth, ChunkHeight: LongInt; var XChunks, YChunks: LongInt;
|
| 593 | PreserveSize: Boolean; Fill: Pointer): Boolean; |
| 594 | begin
|
| 595 | try
|
| 596 | ImInitImageList(0, Chunks);
|
| 597 | Result := Imaging.SplitImage(Image, PInternalList(Chunks).List, |
| 598 | ChunkWidth, ChunkHeight, XChunks, YChunks, PreserveSize, Fill); |
| 599 | except
|
| 600 | Result := False; |
| 601 | end;
|
| 602 | end;
|
| 603 | |
| 604 | function ImMakePaletteForImages(Images: TImageDataList; Pal: PPalette32;
|
| 605 | MaxColors: LongInt; ConvertImages: Boolean): Boolean; |
| 606 | begin
|
| 607 | try
|
| 608 | Result := Imaging.MakePaletteForImages(PInternalList(Images).List, |
| 609 | Pal, MaxColors, ConvertImages); |
| 610 | except
|
| 611 | Result := False; |
| 612 | end;
|
| 613 | end;
|
| 614 | |
| 615 | function ImRotateImage(var Image: TImageData; Angle: LongInt): Boolean; |
| 616 | begin
|
| 617 | try
|
| 618 | Result := Imaging.RotateImage(Image, Angle); |
| 619 | except
|
| 620 | Result := False; |
| 621 | end;
|
| 622 | end;
|
| 623 | |
| 624 | function ImCopyRect(const SrcImage: TImageData; SrcX, SrcY, Width, Height: LongInt; |
| 625 | var DstImage: TImageData; DstX, DstY: LongInt): Boolean; cdecl; |
| 626 | begin
|
| 627 | try
|
| 628 | Result := Imaging.CopyRect(SrcImage, SrcX, SrcY, Width, Height, |
| 629 | DstImage, DstX, DstY); |
| 630 | except
|
| 631 | Result := False; |
| 632 | end;
|
| 633 | end;
|
| 634 | |
| 635 | function ImFillRect(var Image: TImageData; X, Y, Width, Height: LongInt; |
| 636 | Fill: Pointer): Boolean; |
| 637 | begin
|
| 638 | try
|
| 639 | Result := Imaging.FillRect(Image, X, Y, Width, Height, Fill); |
| 640 | except
|
| 641 | Result := False; |
| 642 | end;
|
| 643 | end;
|
| 644 | |
| 645 | function ImReplaceColor(var Image: TImageData; X, Y, Width, Height: LongInt; |
| 646 | OldPixel, NewPixel: Pointer): Boolean; |
| 647 | begin
|
| 648 | try
|
| 649 | Result := Imaging.ReplaceColor(Image, X, Y, Width, Height, OldPixel, NewPixel); |
| 650 | except
|
| 651 | Result := False; |
| 652 | end;
|
| 653 | end;
|
| 654 | |
| 655 | function ImStretchRect(const SrcImage: TImageData; SrcX, SrcY, SrcWidth, |
| 656 | SrcHeight: LongInt; var DstImage: TImageData; DstX, DstY, DstWidth,
|
| 657 | DstHeight: LongInt; Filter: TResizeFilter): Boolean; cdecl;
|
| 658 | begin
|
| 659 | try
|
| 660 | Result := Imaging.StretchRect(SrcImage, SrcX, SrcY, SrcWidth, SrcHeight, |
| 661 | DstImage, DstX, DstY, DstWidth, DstHeight, Filter); |
| 662 | except
|
| 663 | Result := False; |
| 664 | end;
|
| 665 | end;
|
| 666 | |
| 667 | procedure ImGetPixelDirect(const Image: TImageData; X, Y: LongInt; Pixel: Pointer); |
| 668 | begin
|
| 669 | try
|
| 670 | Imaging.GetPixelDirect(Image, X, Y, Pixel); |
| 671 | except
|
| 672 | end;
|
| 673 | end;
|
| 674 | |
| 675 | procedure ImSetPixelDirect(const Image: TImageData; X, Y: LongInt; Pixel: Pointer); |
| 676 | begin
|
| 677 | try
|
| 678 | Imaging.SetPixelDirect(Image, X, Y, Pixel); |
| 679 | except
|
| 680 | end;
|
| 681 | end;
|
| 682 | |
| 683 | function ImGetPixel32(const Image: TImageData; X, Y: LongInt): TColor32Rec; cdecl; |
| 684 | begin
|
| 685 | try
|
| 686 | Result := Imaging.GetPixel32(Image, X, Y); |
| 687 | except
|
| 688 | Result.Color := 0;
|
| 689 | end;
|
| 690 | end;
|
| 691 | |
| 692 | procedure ImSetPixel32(const Image: TImageData; X, Y: LongInt; const Color: TColor32Rec); |
| 693 | begin
|
| 694 | try
|
| 695 | Imaging.SetPixel32(Image, X, Y, Color); |
| 696 | except
|
| 697 | end;
|
| 698 | end;
|
| 699 | |
| 700 | function ImGetPixelFP(const Image: TImageData; X, Y: LongInt): TColorFPRec; cdecl; |
| 701 | begin
|
| 702 | try
|
| 703 | Result := Imaging.GetPixelFP(Image, X, Y); |
| 704 | except
|
| 705 | FillChar(Result, SizeOf(Result), 0);
|
| 706 | end;
|
| 707 | end;
|
| 708 | |
| 709 | procedure ImSetPixelFP(const Image: TImageData; X, Y: LongInt; const Color: TColorFPRec); |
| 710 | begin
|
| 711 | try
|
| 712 | Imaging.SetPixelFP(Image, X, Y, Color); |
| 713 | except
|
| 714 | end;
|
| 715 | end;
|
| 716 | |
| 717 | function ImNewPalette(Entries: LongInt; var Pal: PPalette32): Boolean; |
| 718 | begin
|
| 719 | try
|
| 720 | Imaging.NewPalette(Entries, Pal); |
| 721 | Result := True; |
| 722 | except
|
| 723 | Result := False; |
| 724 | end;
|
| 725 | end;
|
| 726 | |
| 727 | function ImFreePalette(var Pal: PPalette32): Boolean; |
| 728 | begin
|
| 729 | try
|
| 730 | Imaging.FreePalette(Pal); |
| 731 | Result := True; |
| 732 | except
|
| 733 | Result := False; |
| 734 | end;
|
| 735 | end;
|
| 736 | |
| 737 | function ImCopyPalette(SrcPal, DstPal: PPalette32; SrcIdx, DstIdx, Count: LongInt): Boolean;
|
| 738 | begin
|
| 739 | try
|
| 740 | Imaging.CopyPalette(SrcPal, DstPal, SrcIdx, DstIdx, Count); |
| 741 | Result := True; |
| 742 | except
|
| 743 | Result := False; |
| 744 | end;
|
| 745 | end;
|
| 746 | |
| 747 | function ImFindColor(Pal: PPalette32; Entries: LongInt; Color: TColor32): LongInt;
|
| 748 | begin
|
| 749 | try
|
| 750 | Result := Imaging.FindColor(Pal, Entries, Color); |
| 751 | except
|
| 752 | Result := 0;
|
| 753 | end;
|
| 754 | end;
|
| 755 | |
| 756 | function ImFillGrayscalePalette(Pal: PPalette32; Entries: LongInt): Boolean;
|
| 757 | begin
|
| 758 | try
|
| 759 | Imaging.FillGrayscalePalette(Pal, Entries); |
| 760 | Result := True; |
| 761 | except
|
| 762 | Result := False; |
| 763 | end;
|
| 764 | end;
|
| 765 | |
| 766 | function ImFillCustomPalette(Pal: PPalette32; Entries: LongInt; RBits, GBits,
|
| 767 | BBits: Byte; Alpha: Byte): Boolean; |
| 768 | begin
|
| 769 | try
|
| 770 | Imaging.FillCustomPalette(Pal, Entries, RBits, GBits, BBits, Alpha); |
| 771 | Result := True; |
| 772 | except
|
| 773 | Result := False; |
| 774 | end;
|
| 775 | end;
|
| 776 | |
| 777 | function ImSwapChannelsOfPalette(Pal: PPalette32; Entries, SrcChannel,
|
| 778 | DstChannel: LongInt): Boolean; |
| 779 | begin
|
| 780 | try
|
| 781 | Imaging.SwapChannelsOfPalette(Pal, Entries, SrcChannel, DstChannel); |
| 782 | Result := True; |
| 783 | except
|
| 784 | Result := False; |
| 785 | end;
|
| 786 | end;
|
| 787 | |
| 788 | function ImSetOption(OptionId, Value: LongInt): Boolean;
|
| 789 | begin
|
| 790 | try
|
| 791 | Result := Imaging.SetOption(OptionId, Value); |
| 792 | except
|
| 793 | Result := False; |
| 794 | end;
|
| 795 | end;
|
| 796 | |
| 797 | function ImGetOption(OptionId: LongInt): LongInt;
|
| 798 | begin
|
| 799 | try
|
| 800 | Result := GetOption(OptionId); |
| 801 | except
|
| 802 | Result := InvalidOption; |
| 803 | end;
|
| 804 | end;
|
| 805 | |
| 806 | function ImPushOptions: Boolean;
|
| 807 | begin
|
| 808 | try
|
| 809 | Result := Imaging.PushOptions; |
| 810 | except
|
| 811 | Result := False; |
| 812 | end;
|
| 813 | end;
|
| 814 | |
| 815 | function ImPopOptions: Boolean;
|
| 816 | begin
|
| 817 | try
|
| 818 | Result := Imaging.PopOptions; |
| 819 | except
|
| 820 | Result := False; |
| 821 | end;
|
| 822 | end;
|
| 823 | |
| 824 | function ImGetImageFormatInfo(Format: TImageFormat; var Info: TImageFormatInfo): Boolean; |
| 825 | begin
|
| 826 | try
|
| 827 | Result := Imaging.GetImageFormatInfo(Format, Info); |
| 828 | except
|
| 829 | Result := False; |
| 830 | end;
|
| 831 | end;
|
| 832 | |
| 833 | function ImGetPixelsSize(Format: TImageFormat; Width, Height: LongInt): LongInt;
|
| 834 | begin
|
| 835 | try
|
| 836 | Result := Imaging.GetPixelsSize(Format, Width, Height); |
| 837 | except
|
| 838 | Result := 0;
|
| 839 | end;
|
| 840 | end;
|
| 841 | |
| 842 | procedure ImSetUserFileIO(OpenReadProc: TOpenReadProc; OpenWriteProc:
|
| 843 | TOpenWriteProc; CloseProc: TCloseProc; EofProc: TEofProc; SeekProc: TSeekProc; |
| 844 | TellProc: TTellProc; ReadProc: TReadProc; WriteProc: TWriteProc); |
| 845 | begin
|
| 846 | try
|
| 847 | Imaging.SetUserFileIO(OpenReadProc, OpenWriteProc, CloseProc, EofProc, |
| 848 | SeekProc, TellProc, ReadProc, WriteProc); |
| 849 | except
|
| 850 | end;
|
| 851 | end;
|
| 852 | |
| 853 | procedure ImResetFileIO;
|
| 854 | begin
|
| 855 | try
|
| 856 | Imaging.ResetFileIO; |
| 857 | except
|
| 858 | end;
|
| 859 | end;
|
| 860 | |
| 861 | {
|
| 862 | Changes/Bug Fixes: |
| 863 | |
| 864 | -- TODOS ---------------------------------------------------- |
| 865 | - nothing now |
| 866 | |
| 867 | -- 0.19 ----------------------------------------------------- |
| 868 | - updated to reflect changes in low level interface (added pixel set/get, ...) |
| 869 | - changed ImInitImage to procedure to reflect change in Imaging.pas |
| 870 | - added ImIsFileFormatSupported |
| 871 | |
| 872 | -- 0.15 ----------------------------------------------------- |
| 873 | - behaviour of ImGetImageListElement and ImSetImageListElement |
| 874 | has changed - list items are now cloned rather than referenced, |
| 875 | because of this ImFreeImageListKeepImages was no longer needed |
| 876 | and was removed |
| 877 | - many function headers were changed - mainly pointers were |
| 878 | replaced with var and const parameters |
| 879 | |
| 880 | -- 0.13 ----------------------------------------------------- |
| 881 | - added TestImagesInList function and new 0.13 functions |
| 882 | - images were not freed when image list was resized in ImSetImageListSize |
| 883 | - ImSaveMultiImageTo* recreated the input image list with size = 0 |
| 884 | |
| 885 | } |
| 886 | end.
|
| 887 |