ImagingTypes.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. {
  2. $Id$
  3. Vampyre Imaging Library
  4. by Marek Mauder
  5. http://imaginglib.sourceforge.net
  6. The contents of this file are used with permission, subject to the Mozilla
  7. Public License Version 1.1 (the "License"); you may not use this file except
  8. in compliance with the License. You may obtain a copy of the License at
  9. http://www.mozilla.org/MPL/MPL-1.1.html
  10. Software distributed under the License is distributed on an "AS IS" basis,
  11. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  12. the specific language governing rights and limitations under the License.
  13. Alternatively, the contents of this file may be used under the terms of the
  14. GNU Lesser General Public License (the "LGPL License"), in which case the
  15. provisions of the LGPL License are applicable instead of those above.
  16. If you wish to allow use of your version of this file only under the terms
  17. of the LGPL License and not to allow others to use your version of this file
  18. under the MPL, indicate your decision by deleting the provisions above and
  19. replace them with the notice and other provisions required by the LGPL
  20. License. If you do not delete the provisions above, a recipient may use
  21. your version of this file under either the MPL or the LGPL License.
  22. For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
  23. }
  24. { This unit contains basic types and constants used by Imaging library.}
  25. unit ImagingTypes;
  26. {$I ImagingOptions.inc}
  27. interface
  28. const
  29. { Current Major version of Imaging.}
  30. ImagingVersionMajor = 0;
  31. { Current Minor version of Imaging.}
  32. ImagingVersionMinor = 26;
  33. { Current patch of Imaging.}
  34. ImagingVersionPatch = 0;
  35. { Imaging Option Ids whose values can be set/get by SetOption/
  36. GetOption functions.}
  37. { Defines Jpeg compression quality, ranges from 1 (ugly/small) to 100 (nice/large).
  38. Default value is 90.}
  39. ImagingJpegQuality = 10;
  40. { Specifies whether Jpeg images are saved in progressive format,
  41. can be 0 or 1. Default value is 0.}
  42. ImagingJpegProgressive = 11;
  43. { Specifies whether Windows Bitmaps are saved using RLE compression
  44. (only for 1/4/8 bit images), can be 0 or 1. Default value is 1.}
  45. ImagingBitmapRLE = 12;
  46. { Specifies whether Targa images are saved using RLE compression,
  47. can be 0 or 1. Default value is 0.}
  48. ImagingTargaRLE = 13;
  49. { Value of this option is non-zero if last loaded DDS file was cube map.}
  50. ImagingDDSLoadedCubeMap = 14;
  51. { Value of this option is non-zero if last loaded DDS file was volume texture.}
  52. ImagingDDSLoadedVolume = 15;
  53. { Value of this option is number of mipmap levels of last loaded DDS image.}
  54. ImagingDDSLoadedMipMapCount = 16;
  55. { Value of this option is depth (slices of volume texture or faces of
  56. cube map) of last loaded DDS image.}
  57. ImagingDDSLoadedDepth = 17;
  58. { If it is non-zero next saved DDS file should be stored as cube map.}
  59. ImagingDDSSaveCubeMap = 18;
  60. { If it is non-zero next saved DDS file should be stored as volume texture.}
  61. ImagingDDSSaveVolume = 19;
  62. { Sets the number of mipmaps which should be stored in the next saved DDS file.
  63. Only applies to cube maps and volumes, ordinary 2D textures save all
  64. levels present in input.}
  65. ImagingDDSSaveMipMapCount = 20;
  66. { Sets the depth (slices of volume texture or faces of cube map)
  67. of the next saved DDS file.}
  68. ImagingDDSSaveDepth = 21;
  69. { Sets precompression filter used when saving PNG images. Allowed values
  70. are: 0 (none), 1 (sub), 2 (up), 3 (average), 4 (paeth),
  71. 5 (use 0 for indexed/gray images and 4 for RGB/ARGB images),
  72. 6 (adaptive filtering - use best filter for each scanline - very slow).
  73. Note that filters 3 and 4 are much slower than filters 1 and 2.
  74. Default value is 5.}
  75. ImagingPNGPreFilter = 25;
  76. { Sets ZLib compression level used when saving PNG images.
  77. Allowed values are in range 0 (no compresstion) to 9 (best compression).
  78. Default value is 5.}
  79. ImagingPNGCompressLevel = 26;
  80. { Specifies whether MNG animation frames are saved with lossy or lossless
  81. compression. Lossless frames are saved as PNG images and lossy frames are
  82. saved as JNG images. Allowed values are 0 (False) and 1 (True).
  83. Default value is 0.}
  84. ImagingMNGLossyCompression = 28;
  85. { Defines whether alpha channel of lossy compressed MNG frames
  86. (when ImagingMNGLossyCompression is 1) is lossy compressed too.
  87. Allowed values are 0 (False) and 1 (True). Default value is 0.}
  88. ImagingMNGLossyAlpha = 29;
  89. { Sets precompression filter used when saving MNG frames as PNG images.
  90. For details look at ImagingPNGPreFilter.}
  91. ImagingMNGPreFilter = 30;
  92. { Sets ZLib compression level used when saving MNG frames as PNG images.
  93. For details look at ImagingPNGCompressLevel.}
  94. ImagingMNGCompressLevel = 31;
  95. { Specifies compression quality used when saving MNG frames as JNG images.
  96. For details look at ImagingJpegQuality.}
  97. ImagingMNGQuality = 32;
  98. { Specifies whether images are saved in progressive format when saving MNG
  99. frames as JNG images. For details look at ImagingJpegProgressive.}
  100. ImagingMNGProgressive = 33;
  101. { Specifies whether alpha channels of JNG images are lossy compressed.
  102. Allowed values are 0 (False) and 1 (True). Default value is 0.}
  103. ImagingJNGLossyAlpha = 40;
  104. { Sets precompression filter used when saving lossless alpha channels.
  105. For details look at ImagingPNGPreFilter.}
  106. ImagingJNGAlphaPreFilter = 41;
  107. { Sets ZLib compression level used when saving lossless alpha channels.
  108. For details look at ImagingPNGCompressLevel.}
  109. ImagingJNGAlphaCompressLevel = 42;
  110. { Defines compression quality used when saving JNG images (and lossy alpha channels).
  111. For details look at ImagingJpegQuality.}
  112. ImagingJNGQuality = 43;
  113. { Specifies whether JNG images are saved in progressive format.
  114. For details look at ImagingJpegProgressive.}
  115. ImagingJNGProgressive = 44;
  116. { Specifies whether PGM files are stored in text or in binary format.
  117. Allowed values are 0 (store as text - very! large files) and 1 (save binary).
  118. Default value is 1.}
  119. ImagingPGMSaveBinary = 50;
  120. { Specifies whether PPM files are stored in text or in binary format.
  121. Allowed values are 0 (store as text - very! large files) and 1 (save binary).
  122. Default value is 1.}
  123. ImagingPPMSaveBinary = 51;
  124. { Boolean option that specifies whether GIF images with more frames
  125. are animated by Imaging (according to frame disposal methods) or just
  126. raw frames are loaded and sent to user (if you want to animate GIF yourself).
  127. Default value is 1.}
  128. ImagingGIFLoadAnimated = 56;
  129. { This option is used when reducing number of colors used in
  130. image (mainly when converting from ARGB image to indexed
  131. format). Mask is 'anded' (bitwise AND) with every pixel's
  132. channel value when creating color histogram. If $FF is used
  133. all 8bits of color channels are used which can result in very
  134. slow proccessing of large images with many colors so you can
  135. use lower masks to speed it up (FC, F8 and F0 are good
  136. choices). Allowed values are in range <0, $FF> and default is
  137. $FE. }
  138. ImagingColorReductionMask = 128;
  139. { This option can be used to override image data format during image
  140. loading. If set to format different from ifUnknown all loaded images
  141. are automaticaly converted to this format. Useful when you have
  142. many files in various formats but you want them all in one format for
  143. further proccessing. Allowed values are in
  144. range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))> and
  145. default value is ifUnknown.}
  146. ImagingLoadOverrideFormat = 129;
  147. { This option can be used to override image data format during image
  148. saving. If set to format different from ifUnknown all images
  149. to be saved are automaticaly internaly converted to this format.
  150. Note that image file formats support only a subset of Imaging data formats
  151. so final saved file may in different format than this override.
  152. Allowed values are in range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))>
  153. and default value is ifUnknown.}
  154. ImagingSaveOverrideFormat = 130;
  155. { Specifies resampling filter used when generating mipmaps. It is used
  156. in GenerateMipMaps low level function and Direct3D and OpenGL extensions.
  157. Allowed values are in range
  158. <Ord(Low(ImagingFormats.TSamplingFilter)), Ord(High(ImagingFormats.TSamplingFilter))>
  159. and default value is 1 (linear filter).}
  160. ImagingMipMapFilter = 131;
  161. { Returned by GetOption if given Option Id is invalid.}
  162. InvalidOption = -$7FFFFFFF;
  163. { Indices that can be used to access channel values in array parts
  164. of structures like TColor32Rec. Note that this order can be
  165. used only for ARGB images. For ABGR image you must swap Red and Blue.}
  166. ChannelBlue = 0;
  167. ChannelGreen = 1;
  168. ChannelRed = 2;
  169. ChannelAlpha = 3;
  170. type
  171. { Enum defining image data format. In formats with more channels,
  172. first channel after "if" is stored in the most significant bits and channel
  173. before end is stored in the least significant.}
  174. TImageFormat = (
  175. ifUnknown = 0,
  176. ifDefault = 1,
  177. { Indexed formats using palette.}
  178. ifIndex8 = 10,
  179. { Grayscale/Luminance formats.}
  180. ifGray8 = 40,
  181. ifA8Gray8 = 41,
  182. ifGray16 = 42,
  183. ifGray32 = 43,
  184. ifGray64 = 44,
  185. ifA16Gray16 = 45,
  186. { ARGB formats.}
  187. ifX5R1G1B1 = 80,
  188. ifR3G3B2 = 81,
  189. ifR5G6B5 = 82,
  190. ifA1R5G5B5 = 83,
  191. ifA4R4G4B4 = 84,
  192. ifX1R5G5B5 = 85,
  193. ifX4R4G4B4 = 86,
  194. ifR8G8B8 = 87,
  195. ifA8R8G8B8 = 88,
  196. ifX8R8G8B8 = 89,
  197. ifR16G16B16 = 90,
  198. ifA16R16G16B16 = 91,
  199. ifB16G16R16 = 92,
  200. ifA16B16G16R16 = 93,
  201. { Floating point formats.}
  202. ifR32F = 170,
  203. ifA32R32G32B32F = 171,
  204. ifA32B32G32R32F = 172,
  205. ifR16F = 173,
  206. ifA16R16G16B16F = 174,
  207. ifA16B16G16R16F = 175,
  208. { Special formats.}
  209. ifDXT1 = 220,
  210. ifDXT3 = 221,
  211. ifDXT5 = 222,
  212. ifBTC = 223,
  213. ifATI1N = 224,
  214. ifATI2N = 225);
  215. { Color value for 32 bit images.}
  216. TColor32 = LongWord;
  217. PColor32 = ^TColor32;
  218. { Color value for 64 bit images.}
  219. TColor64 = type Int64;
  220. PColor64 = ^TColor64;
  221. { Color record for 24 bit images, which allows access to individual color
  222. channels.}
  223. TColor24Rec = packed record
  224. case LongInt of
  225. 0: (B, G, R: Byte);
  226. 1: (Channels: array[0..2] of Byte);
  227. end;
  228. PColor24Rec = ^TColor24Rec;
  229. TColor24RecArray = array[0..MaxInt div SizeOf(TColor24Rec) - 1] of TColor24Rec;
  230. PColor24RecArray = ^TColor24RecArray;
  231. { Color record for 32 bit images, which allows access to individual color
  232. channels.}
  233. TColor32Rec = packed record
  234. case LongInt of
  235. 0: (Color: TColor32);
  236. 1: (B, G, R, A: Byte);
  237. 2: (Channels: array[0..3] of Byte);
  238. 3: (Color24Rec: TColor24Rec);
  239. end;
  240. PColor32Rec = ^TColor32Rec;
  241. TColor32RecArray = array[0..MaxInt div SizeOf(TColor32Rec) - 1] of TColor32Rec;
  242. PColor32RecArray = ^TColor32RecArray;
  243. { Color record for 48 bit images, which allows access to individual color
  244. channels.}
  245. TColor48Rec = packed record
  246. case LongInt of
  247. 0: (B, G, R: Word);
  248. 1: (Channels: array[0..2] of Word);
  249. end;
  250. PColor48Rec = ^TColor48Rec;
  251. TColor48RecArray = array[0..MaxInt div SizeOf(TColor48Rec) - 1] of TColor48Rec;
  252. PColor48RecArray = ^TColor48RecArray;
  253. { Color record for 64 bit images, which allows access to individual color
  254. channels.}
  255. TColor64Rec = packed record
  256. case LongInt of
  257. 0: (Color: TColor64);
  258. 1: (B, G, R, A: Word);
  259. 2: (Channels: array[0..3] of Word);
  260. 3: (Color48Rec: TColor48Rec);
  261. end;
  262. PColor64Rec = ^TColor64Rec;
  263. TColor64RecArray = array[0..MaxInt div SizeOf(TColor64Rec) - 1] of TColor64Rec;
  264. PColor64RecArray = ^TColor64RecArray;
  265. { Color record for 128 bit floating point images, which allows access to
  266. individual color channels.}
  267. TColorFPRec = packed record
  268. case LongInt of
  269. 0: (B, G, R, A: Single);
  270. 1: (Channels: array[0..3] of Single);
  271. end;
  272. PColorFPRec = ^TColorFPRec;
  273. TColorFPRecArray = array[0..MaxInt div SizeOf(TColorFPRec) - 1] of TColorFPRec;
  274. PColorFPRecArray = ^TColorFPRecArray;
  275. { 16 bit floating-point value. It has 1 sign bit, 5 exponent bits,
  276. and 10 mantissa bits.}
  277. THalfFloat = type Word;
  278. PHalfFloat = ^THalfFloat;
  279. { Color record for 64 bit floating point images, which allows access to
  280. individual color channels.}
  281. TColorHFRec = packed record
  282. case LongInt of
  283. 0: (B, G, R, A: THalfFloat);
  284. 1: (Channels: array[0..3] of THalfFloat);
  285. end;
  286. PColorHFRec = ^TColorHFRec;
  287. TColorHFRecArray = array[0..MaxInt div SizeOf(TColorHFRec) - 1] of TColorHFRec;
  288. PColorHFRecArray = ^TColorHFRecArray;
  289. { Palette for indexed mode images with 32 bit colors.}
  290. TPalette32 = TColor32RecArray;
  291. TPalette32Size256 = array[0..255] of TColor32Rec;
  292. PPalette32 = ^TPalette32;
  293. { Palette for indexd mode images with 24 bit colors.}
  294. TPalette24 = TColor24RecArray;
  295. TPalette24Size256 = array[0..255] of TColor24Rec;
  296. PPalette24 = ^TPalette24;
  297. { Record that stores single image data and information describing it.}
  298. TImageData = packed record
  299. Width: LongInt; // Width of image in pixels
  300. Height: LongInt; // Height of image in pixels
  301. Format: TImageFormat; // Data format of image
  302. Size: LongInt; // Size of image bits in Bytes
  303. Bits: Pointer; // Pointer to memory containing image bits
  304. Palette: PPalette32; // Image palette for indexed images
  305. end;
  306. PImageData = ^TImageData;
  307. { Pixel format information used in conversions to/from 16 and 8 bit ARGB
  308. image formats.}
  309. TPixelFormatInfo = packed record
  310. ABitCount, RBitCount, GBitCount, BBitCount: Byte;
  311. ABitMask, RBitMask, GBitMask, BBitMask: LongWord;
  312. AShift, RShift, GShift, BShift: Byte;
  313. ARecDiv, RRecDiv, GRecDiv, BRecDiv: Byte;
  314. end;
  315. PPixelFormatInfo = ^TPixelFormatInfo;
  316. PImageFormatInfo = ^TImageFormatInfo;
  317. { Look at TImageFormatInfo.GetPixelsSize for details.}
  318. TFormatGetPixelsSizeFunc = function(Format: TImageFormat; Width,
  319. Height: LongInt): LongInt;
  320. { Look at TImageFormatInfo.CheckDimensions for details.}
  321. TFormatCheckDimensionsProc = procedure(Format: TImageFormat; var Width,
  322. Height: LongInt);
  323. { Function for getting pixel colors. Native pixel is read from Image and
  324. then translated to 32 bit ARGB.}
  325. TGetPixel32Func = function(Bits: Pointer; Info: PImageFormatInfo;
  326. Palette: PPalette32): TColor32Rec;
  327. { Function for getting pixel colors. Native pixel is read from Image and
  328. then translated to FP ARGB.}
  329. TGetPixelFPFunc = function(Bits: Pointer; Info: PImageFormatInfo;
  330. Palette: PPalette32): TColorFPRec;
  331. { Procedure for setting pixel colors. Input 32 bit ARGB color is translated to
  332. native format and then written to Image.}
  333. TSetPixel32Proc = procedure(Bits: Pointer; Info: PImageFormatInfo;
  334. Palette: PPalette32;const Color: TColor32Rec);
  335. { Procedure for setting pixel colors. Input FP ARGB color is translated to
  336. native format and then written to Image.}
  337. TSetPixelFPProc = procedure(Bits: Pointer; Info: PImageFormatInfo;
  338. Palette: PPalette32; const Color: TColorFPRec);
  339. { Additional information for each TImageFormat value.}
  340. TImageFormatInfo = packed record
  341. Format: TImageFormat; // Format described by this record
  342. Name: array[0..15] of Char; // Symbolic name of format
  343. BytesPerPixel: LongInt; // Number of bytes per pixel (note: it is
  344. // 0 for formats where BitsPerPixel < 8 (e.g. DXT).
  345. // Use GetPixelsSize function to get size of
  346. // image data.
  347. ChannelCount: LongInt; // Number of image channels (R, G, B, A, Gray)
  348. PaletteEntries: LongInt; // Number of palette entries
  349. HasGrayChannel: Boolean; // True if image has grayscale channel
  350. HasAlphaChannel: Boolean; // True if image has alpha channel
  351. IsFloatingPoint: Boolean; // True if image has floating point pixels
  352. UsePixelFormat: Boolean; // True if image uses pixel format
  353. IsRBSwapped: Boolean; // True if Red and Blue channels are swapped
  354. // e.g. A16B16G16R16 has IsRBSwapped True
  355. RBSwapFormat: TImageFormat; // Indicates supported format with swapped
  356. // Red and Blue channels, ifUnknown if such
  357. // format does not exist
  358. IsIndexed: Boolean; // True if image uses palette
  359. IsSpecial: Boolean; // True if image is in special format
  360. PixelFormat: PPixelFormatInfo; // Pixel format structure
  361. GetPixelsSize: TFormatGetPixelsSizeFunc; // Returns size in bytes of
  362. // Width * Height pixels of image
  363. CheckDimensions: TFormatCheckDimensionsProc; // some formats have limited
  364. // values of Width and Height. This
  365. // procedure checks and changes dimensions
  366. // to be valid for given format.
  367. GetPixel32: TGetPixel32Func; // 32bit ARGB pixel get function
  368. GetPixelFP: TGetPixelFPFunc; // FP ARGB pixel get function
  369. SetPixel32: TSetPixel32Proc; // 32bit ARGB pixel set procedure
  370. SetPixelFP: TSetPixelFPProc; // FP ARGB pixel set procedure
  371. SpecialNearestFormat: TImageFormat; // Regular image format used when
  372. // compressing/decompressing special images
  373. // as source/target
  374. end;
  375. { Handle to list of image data records.}
  376. TImageDataList = Pointer;
  377. PImageDataList = ^TImageDataList;
  378. { Handle to input/output.}
  379. TImagingHandle = Pointer;
  380. { Filters used in functions that resize images or their portions.}
  381. TResizeFilter = (
  382. rfNearest = 0,
  383. rfBilinear = 1,
  384. rfBicubic = 2);
  385. { Seek origin mode for IO function Seek.}
  386. TSeekMode = (
  387. smFromBeginning = 0,
  388. smFromCurrent = 1,
  389. smFromEnd = 2);
  390. { IO functions used for reading and writing images from/to input/output.}
  391. TOpenReadProc = function(Source: PChar): TImagingHandle; cdecl;
  392. TOpenWriteProc = function(Source: PChar): TImagingHandle; cdecl;
  393. TCloseProc = procedure(Handle: TImagingHandle); cdecl;
  394. TEofProc = function(Handle: TImagingHandle): Boolean; cdecl;
  395. TSeekProc = function(Handle: TImagingHandle; Offset: LongInt; Mode: TSeekMode): LongInt; cdecl;
  396. TTellProc = function(Handle: TImagingHandle): LongInt; cdecl;
  397. TReadProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
  398. TWriteProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
  399. implementation
  400. {
  401. File Notes:
  402. -- TODOS ----------------------------------------------------
  403. - add lookup tables to pixel formats for fast conversions
  404. -- 0.24.3 Changes/Bug Fixes ---------------------------------
  405. - Added ifATI1N and ifATI2N image data formats.
  406. -- 0.23 Changes/Bug Fixes -----------------------------------
  407. - Added ifBTC image format and SpecialNearestFormat field
  408. to TImageFormatInfo.
  409. -- 0.21 Changes/Bug Fixes -----------------------------------
  410. - Added option constants for PGM and PPM file formats.
  411. - Added TPalette32Size256 and TPalette24Size256 types.
  412. -- 0.19 Changes/Bug Fixes -----------------------------------
  413. - added ImagingVersionPatch constant so bug fix only releases
  414. can be distinguished from ordinary major/minor releases
  415. - renamed TPixelFormat to TPixelFormatInfo to avoid name collisions
  416. with Graphics.TPixelFormat
  417. - added new image data formats: ifR16F, ifA16R16G16B16F,
  418. ifA16B16G16R16F
  419. - added pixel get/set function pointers to TImageFormatInfo
  420. - added 16bit half float type and color record
  421. - renamed TColorFRec to TColorFPRec (and related types too)
  422. -- 0.17 Changes/Bug Fixes -----------------------------------
  423. - added option ImagingMipMapFilter which now controls resampling filter
  424. used when generating mipmaps
  425. - added TResizeFilter type
  426. - added ChannelCount to TImageFormatInfo
  427. - added new option constants for MNG and JNG images
  428. -- 0.15 Changes/Bug Fixes -----------------------------------
  429. - added RBSwapFormat to TImageFormatInfo for faster conversions
  430. between swapped formats (it just calls SwapChannels now if
  431. RBSwapFormat is not ifUnknown)
  432. - moved TImageFormatInfo and required types from Imaging unit
  433. here, removed TImageFormatShortInfo
  434. - added new options: ImagingLoadOverrideFormat, ImagingSaveOverrideFormat
  435. -- 0.13 Changes/Bug Fixes -----------------------------------
  436. - new ImagingColorReductionMask option added
  437. - new image format added: ifA16Gray16
  438. }
  439. end.