image_compressor_pack 1.0.0.1-universal-darwin-16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/lib/.paths.yml +12 -0
  4. data/lib/image_compressor_pack/dynamically_linked_recipes.yml +102 -0
  5. data/lib/image_compressor_pack/recipes.rb +42 -0
  6. data/lib/image_compressor_pack/statically_linked_recipes.yml +109 -0
  7. data/lib/image_compressor_pack/version.rb +3 -0
  8. data/lib/image_compressor_pack.rb +24 -0
  9. data/ports/advancecomp-1.22-x86_64-apple-darwin16.1.0.installed +0 -0
  10. data/ports/gifsicle-1.88-x86_64-apple-darwin16.1.0.installed +0 -0
  11. data/ports/jhead-3.0-x86_64-apple-darwin16.1.0.installed +0 -0
  12. data/ports/jpeg-archive-2.1.1-x86_64-apple-darwin16.1.0.installed +0 -0
  13. data/ports/jpegoptim-1.4.4-x86_64-apple-darwin16.1.0.installed +0 -0
  14. data/ports/lcms2-2.8-x86_64-apple-darwin16.1.0.installed +0 -0
  15. data/ports/libpng-1.6.26-x86_64-apple-darwin16.1.0.installed +0 -0
  16. data/ports/mozjpeg-3.1-x86_64-apple-darwin16.1.0.installed +0 -0
  17. data/ports/nasm-2.12.02-x86_64-apple-darwin16.1.0.installed +0 -0
  18. data/ports/optipng-0.7.6-x86_64-apple-darwin16.1.0.installed +0 -0
  19. data/ports/pngcrush-1.8.10-x86_64-apple-darwin16.1.0.installed +0 -0
  20. data/ports/pngquant-2.8.0-x86_64-apple-darwin16.1.0.installed +0 -0
  21. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/bin/advdef +0 -0
  22. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/bin/advmng +0 -0
  23. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/bin/advpng +0 -0
  24. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/bin/advzip +0 -0
  25. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/share/man/man1/advdef.1 +83 -0
  26. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/share/man/man1/advmng.1 +197 -0
  27. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/share/man/man1/advpng.1 +93 -0
  28. data/ports/x86_64-apple-darwin16.1.0/advancecomp/1.22/share/man/man1/advzip.1 +116 -0
  29. data/ports/x86_64-apple-darwin16.1.0/gifsicle/1.88/bin/gifsicle +0 -0
  30. data/ports/x86_64-apple-darwin16.1.0/gifsicle/1.88/share/man/man1/gifsicle.1 +1318 -0
  31. data/ports/x86_64-apple-darwin16.1.0/jhead/3.0/bin/jhead +0 -0
  32. data/ports/x86_64-apple-darwin16.1.0/jpeg-archive/2.1.1/bin/jpeg-archive +40 -0
  33. data/ports/x86_64-apple-darwin16.1.0/jpeg-archive/2.1.1/bin/jpeg-compare +0 -0
  34. data/ports/x86_64-apple-darwin16.1.0/jpeg-archive/2.1.1/bin/jpeg-hash +0 -0
  35. data/ports/x86_64-apple-darwin16.1.0/jpeg-archive/2.1.1/bin/jpeg-recompress +0 -0
  36. data/ports/x86_64-apple-darwin16.1.0/jpegoptim/1.4.4/bin/jpegoptim +0 -0
  37. data/ports/x86_64-apple-darwin16.1.0/jpegoptim/1.4.4/share/man/man1/jpegoptim.1 +186 -0
  38. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/bin/linkicc +0 -0
  39. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/bin/psicc +0 -0
  40. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/bin/transicc +0 -0
  41. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/include/lcms2.h +1903 -0
  42. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/include/lcms2_plugin.h +665 -0
  43. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/lib/liblcms2.a +0 -0
  44. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/lib/liblcms2.la +41 -0
  45. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/lib/pkgconfig/lcms2.pc +11 -0
  46. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/share/man/man1/jpgicc.1 +122 -0
  47. data/ports/x86_64-apple-darwin16.1.0/lcms2/2.8/share/man/man1/tificc.1 +117 -0
  48. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/libpng16/png.h +3266 -0
  49. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/libpng16/pngconf.h +622 -0
  50. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/libpng16/pnglibconf.h +213 -0
  51. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/png.h +3266 -0
  52. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/pngconf.h +622 -0
  53. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/include/pnglibconf.h +213 -0
  54. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/lib/libpng.a +0 -0
  55. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/lib/libpng.la +41 -0
  56. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/lib/libpng16.a +0 -0
  57. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/lib/libpng16.la +41 -0
  58. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/lib/pkgconfig/libpng16.pc +11 -0
  59. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/share/man/man3/libpng.3 +6179 -0
  60. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/share/man/man3/libpngpf.3 +18 -0
  61. data/ports/x86_64-apple-darwin16.1.0/libpng/1.6.26/share/man/man5/png.5 +74 -0
  62. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/cjpeg +0 -0
  63. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/djpeg +0 -0
  64. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/jpegtran +0 -0
  65. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/rdjpgcom +0 -0
  66. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/tjbench +0 -0
  67. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/bin/wrjpgcom +0 -0
  68. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/include/jconfig.h +71 -0
  69. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/include/jerror.h +320 -0
  70. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/include/jmorecfg.h +390 -0
  71. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/include/jpeglib.h +1185 -0
  72. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/include/turbojpeg.h +1538 -0
  73. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/lib/libjpeg.a +0 -0
  74. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/lib/libjpeg.la +41 -0
  75. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/lib/libturbojpeg.a +0 -0
  76. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/lib/libturbojpeg.la +41 -0
  77. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/README +281 -0
  78. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/README-mozilla.txt +194 -0
  79. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/README-turbo.txt +363 -0
  80. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/example.c +433 -0
  81. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/libjpeg.txt +3015 -0
  82. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/structure.txt +906 -0
  83. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/usage.txt +649 -0
  84. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/doc/wizard.txt +211 -0
  85. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/man/man1/cjpeg.1 +352 -0
  86. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/man/man1/djpeg.1 +278 -0
  87. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/man/man1/jpegtran.1 +269 -0
  88. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/man/man1/rdjpgcom.1 +63 -0
  89. data/ports/x86_64-apple-darwin16.1.0/mozjpeg/3.1/share/man/man1/wrjpgcom.1 +103 -0
  90. data/ports/x86_64-apple-darwin16.1.0/nasm/2.12.02/bin/nasm +0 -0
  91. data/ports/x86_64-apple-darwin16.1.0/nasm/2.12.02/bin/ndisasm +0 -0
  92. data/ports/x86_64-apple-darwin16.1.0/nasm/2.12.02/share/man/man1/nasm.1 +429 -0
  93. data/ports/x86_64-apple-darwin16.1.0/nasm/2.12.02/share/man/man1/ndisasm.1 +120 -0
  94. data/ports/x86_64-apple-darwin16.1.0/optipng/0.7.6/bin/optipng +0 -0
  95. data/ports/x86_64-apple-darwin16.1.0/optipng/0.7.6/man/man1/optipng.1 +343 -0
  96. data/ports/x86_64-apple-darwin16.1.0/pngcrush/1.8.10/bin/pngcrush +0 -0
  97. data/ports/x86_64-apple-darwin16.1.0/pngquant/2.8.0/bin/pngquant +0 -0
  98. data/ports/x86_64-apple-darwin16.1.0/pngquant/2.8.0/share/man/man1/pngquant.1 +127 -0
  99. data/ports/x86_64-apple-darwin16.1.0/zlib/1.2.8/include/zconf.h +511 -0
  100. data/ports/x86_64-apple-darwin16.1.0/zlib/1.2.8/include/zlib.h +1768 -0
  101. data/ports/x86_64-apple-darwin16.1.0/zlib/1.2.8/lib/libz.a +0 -0
  102. data/ports/x86_64-apple-darwin16.1.0/zlib/1.2.8/lib/pkgconfig/zlib.pc +13 -0
  103. data/ports/x86_64-apple-darwin16.1.0/zlib/1.2.8/share/man/man3/zlib.3 +151 -0
  104. data/ports/zlib-1.2.8-x86_64-apple-darwin16.1.0.installed +0 -0
  105. metadata +219 -0
@@ -0,0 +1,1538 @@
1
+ /*
2
+ * Copyright (C)2009-2014 D. R. Commander. All Rights Reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions are met:
6
+ *
7
+ * - Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * - Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ * - Neither the name of the libjpeg-turbo Project nor the names of its
13
+ * contributors may be used to endorse or promote products derived from this
14
+ * software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ * POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ #ifndef __TURBOJPEG_H__
30
+ #define __TURBOJPEG_H__
31
+
32
+ #if defined(_WIN32) && defined(DLLDEFINE)
33
+ #define DLLEXPORT __declspec(dllexport)
34
+ #else
35
+ #define DLLEXPORT
36
+ #endif
37
+ #define DLLCALL
38
+
39
+
40
+ /**
41
+ * @addtogroup TurboJPEG
42
+ * TurboJPEG API. This API provides an interface for generating, decoding, and
43
+ * transforming planar YUV and JPEG images in memory.
44
+ *
45
+ * @anchor YUVnotes
46
+ * YUV Image Format Notes
47
+ * ----------------------
48
+ * Technically, the JPEG format uses the YCbCr colorspace (which is technically
49
+ * not a colorspace but a color transform), but per the convention of the
50
+ * digital video community, the TurboJPEG API uses "YUV" to refer to an image
51
+ * format consisting of Y, Cb, and Cr image planes.
52
+ *
53
+ * Each plane is simply a 2D array of bytes, each byte representing the value
54
+ * of one of the components (Y, Cb, or Cr) at a particular location in the
55
+ * image. The width and height of each plane are determined by the image
56
+ * width, height, and level of chrominance subsampling. The luminance plane
57
+ * width is the image width padded to the nearest multiple of the horizontal
58
+ * subsampling factor (2 in the case of 4:2:0 and 4:2:2, 4 in the case of
59
+ * 4:1:1, 1 in the case of 4:4:4 or grayscale.) Similarly, the luminance plane
60
+ * height is the image height padded to the nearest multiple of the vertical
61
+ * subsampling factor (2 in the case of 4:2:0 or 4:4:0, 1 in the case of 4:4:4
62
+ * or grayscale.) This is irrespective of any additional padding that may be
63
+ * specified as an argument to the various YUV functions. The chrominance
64
+ * plane width is equal to the luminance plane width divided by the horizontal
65
+ * subsampling factor, and the chrominance plane height is equal to the
66
+ * luminance plane height divided by the vertical subsampling factor.
67
+ *
68
+ * For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is
69
+ * used, then the luminance plane would be 36 x 35 bytes, and each of the
70
+ * chrominance planes would be 18 x 35 bytes. If you specify a line padding of
71
+ * 4 bytes on top of this, then the luminance plane would be 36 x 35 bytes, and
72
+ * each of the chrominance planes would be 20 x 35 bytes.
73
+ *
74
+ * @{
75
+ */
76
+
77
+
78
+ /**
79
+ * The number of chrominance subsampling options
80
+ */
81
+ #define TJ_NUMSAMP 6
82
+
83
+ /**
84
+ * Chrominance subsampling options.
85
+ * When pixels are converted from RGB to YCbCr (see #TJCS_YCbCr) or from CMYK
86
+ * to YCCK (see #TJCS_YCCK) as part of the JPEG compression process, some of
87
+ * the Cb and Cr (chrominance) components can be discarded or averaged together
88
+ * to produce a smaller image with little perceptible loss of image clarity
89
+ * (the human eye is more sensitive to small changes in brightness than to
90
+ * small changes in color.) This is called "chrominance subsampling".
91
+ */
92
+ enum TJSAMP
93
+ {
94
+ /**
95
+ * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG or
96
+ * YUV image will contain one chrominance component for every pixel in the
97
+ * source image.
98
+ */
99
+ TJSAMP_444=0,
100
+ /**
101
+ * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one
102
+ * chrominance component for every 2x1 block of pixels in the source image.
103
+ */
104
+ TJSAMP_422,
105
+ /**
106
+ * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one
107
+ * chrominance component for every 2x2 block of pixels in the source image.
108
+ */
109
+ TJSAMP_420,
110
+ /**
111
+ * Grayscale. The JPEG or YUV image will contain no chrominance components.
112
+ */
113
+ TJSAMP_GRAY,
114
+ /**
115
+ * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one
116
+ * chrominance component for every 1x2 block of pixels in the source image.
117
+ *
118
+ * @note 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.
119
+ */
120
+ TJSAMP_440,
121
+ /**
122
+ * 4:1:1 chrominance subsampling. The JPEG or YUV image will contain one
123
+ * chrominance component for every 4x1 block of pixels in the source image.
124
+ * JPEG images compressed with 4:1:1 subsampling will be almost exactly the
125
+ * same size as those compressed with 4:2:0 subsampling, and in the
126
+ * aggregate, both subsampling methods produce approximately the same
127
+ * perceptual quality. However, 4:1:1 is better able to reproduce sharp
128
+ * horizontal features.
129
+ *
130
+ * @note 4:1:1 subsampling is not fully accelerated in libjpeg-turbo.
131
+ */
132
+ TJSAMP_411
133
+ };
134
+
135
+ /**
136
+ * MCU block width (in pixels) for a given level of chrominance subsampling.
137
+ * MCU block sizes:
138
+ * - 8x8 for no subsampling or grayscale
139
+ * - 16x8 for 4:2:2
140
+ * - 8x16 for 4:4:0
141
+ * - 16x16 for 4:2:0
142
+ * - 32x8 for 4:1:1
143
+ */
144
+ static const int tjMCUWidth[TJ_NUMSAMP] = {8, 16, 16, 8, 8, 32};
145
+
146
+ /**
147
+ * MCU block height (in pixels) for a given level of chrominance subsampling.
148
+ * MCU block sizes:
149
+ * - 8x8 for no subsampling or grayscale
150
+ * - 16x8 for 4:2:2
151
+ * - 8x16 for 4:4:0
152
+ * - 16x16 for 4:2:0
153
+ * - 32x8 for 4:1:1
154
+ */
155
+ static const int tjMCUHeight[TJ_NUMSAMP] = {8, 8, 16, 8, 16, 8};
156
+
157
+
158
+ /**
159
+ * The number of pixel formats
160
+ */
161
+ #define TJ_NUMPF 12
162
+
163
+ /**
164
+ * Pixel formats
165
+ */
166
+ enum TJPF
167
+ {
168
+ /**
169
+ * RGB pixel format. The red, green, and blue components in the image are
170
+ * stored in 3-byte pixels in the order R, G, B from lowest to highest byte
171
+ * address within each pixel.
172
+ */
173
+ TJPF_RGB=0,
174
+ /**
175
+ * BGR pixel format. The red, green, and blue components in the image are
176
+ * stored in 3-byte pixels in the order B, G, R from lowest to highest byte
177
+ * address within each pixel.
178
+ */
179
+ TJPF_BGR,
180
+ /**
181
+ * RGBX pixel format. The red, green, and blue components in the image are
182
+ * stored in 4-byte pixels in the order R, G, B from lowest to highest byte
183
+ * address within each pixel. The X component is ignored when compressing
184
+ * and undefined when decompressing.
185
+ */
186
+ TJPF_RGBX,
187
+ /**
188
+ * BGRX pixel format. The red, green, and blue components in the image are
189
+ * stored in 4-byte pixels in the order B, G, R from lowest to highest byte
190
+ * address within each pixel. The X component is ignored when compressing
191
+ * and undefined when decompressing.
192
+ */
193
+ TJPF_BGRX,
194
+ /**
195
+ * XBGR pixel format. The red, green, and blue components in the image are
196
+ * stored in 4-byte pixels in the order R, G, B from highest to lowest byte
197
+ * address within each pixel. The X component is ignored when compressing
198
+ * and undefined when decompressing.
199
+ */
200
+ TJPF_XBGR,
201
+ /**
202
+ * XRGB pixel format. The red, green, and blue components in the image are
203
+ * stored in 4-byte pixels in the order B, G, R from highest to lowest byte
204
+ * address within each pixel. The X component is ignored when compressing
205
+ * and undefined when decompressing.
206
+ */
207
+ TJPF_XRGB,
208
+ /**
209
+ * Grayscale pixel format. Each 1-byte pixel represents a luminance
210
+ * (brightness) level from 0 to 255.
211
+ */
212
+ TJPF_GRAY,
213
+ /**
214
+ * RGBA pixel format. This is the same as @ref TJPF_RGBX, except that when
215
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
216
+ * interpreted as an opaque alpha channel.
217
+ */
218
+ TJPF_RGBA,
219
+ /**
220
+ * BGRA pixel format. This is the same as @ref TJPF_BGRX, except that when
221
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
222
+ * interpreted as an opaque alpha channel.
223
+ */
224
+ TJPF_BGRA,
225
+ /**
226
+ * ABGR pixel format. This is the same as @ref TJPF_XBGR, except that when
227
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
228
+ * interpreted as an opaque alpha channel.
229
+ */
230
+ TJPF_ABGR,
231
+ /**
232
+ * ARGB pixel format. This is the same as @ref TJPF_XRGB, except that when
233
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
234
+ * interpreted as an opaque alpha channel.
235
+ */
236
+ TJPF_ARGB,
237
+ /**
238
+ * CMYK pixel format. Unlike RGB, which is an additive color model used
239
+ * primarily for display, CMYK (Cyan/Magenta/Yellow/Key) is a subtractive
240
+ * color model used primarily for printing. In the CMYK color model, the
241
+ * value of each color component typically corresponds to an amount of cyan,
242
+ * magenta, yellow, or black ink that is applied to a white background. In
243
+ * order to convert between CMYK and RGB, it is necessary to use a color
244
+ * management system (CMS.) A CMS will attempt to map colors within the
245
+ * printer's gamut to perceptually similar colors in the display's gamut and
246
+ * vice versa, but the mapping is typically not 1:1 or reversible, nor can it
247
+ * be defined with a simple formula. Thus, such a conversion is out of scope
248
+ * for a codec library. However, the TurboJPEG API allows for compressing
249
+ * CMYK pixels into a YCCK JPEG image (see #TJCS_YCCK) and decompressing YCCK
250
+ * JPEG images into CMYK pixels.
251
+ */
252
+ TJPF_CMYK
253
+ };
254
+
255
+
256
+ /**
257
+ * Red offset (in bytes) for a given pixel format. This specifies the number
258
+ * of bytes that the red component is offset from the start of the pixel. For
259
+ * instance, if a pixel of format TJ_BGRX is stored in <tt>char pixel[]</tt>,
260
+ * then the red component will be <tt>pixel[tjRedOffset[TJ_BGRX]]</tt>.
261
+ */
262
+ static const int tjRedOffset[TJ_NUMPF] = {0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1, -1};
263
+ /**
264
+ * Green offset (in bytes) for a given pixel format. This specifies the number
265
+ * of bytes that the green component is offset from the start of the pixel.
266
+ * For instance, if a pixel of format TJ_BGRX is stored in
267
+ * <tt>char pixel[]</tt>, then the green component will be
268
+ * <tt>pixel[tjGreenOffset[TJ_BGRX]]</tt>.
269
+ */
270
+ static const int tjGreenOffset[TJ_NUMPF] = {1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2, -1};
271
+ /**
272
+ * Blue offset (in bytes) for a given pixel format. This specifies the number
273
+ * of bytes that the Blue component is offset from the start of the pixel. For
274
+ * instance, if a pixel of format TJ_BGRX is stored in <tt>char pixel[]</tt>,
275
+ * then the blue component will be <tt>pixel[tjBlueOffset[TJ_BGRX]]</tt>.
276
+ */
277
+ static const int tjBlueOffset[TJ_NUMPF] = {2, 0, 2, 0, 1, 3, 0, 2, 0, 1, 3, -1};
278
+
279
+ /**
280
+ * Pixel size (in bytes) for a given pixel format.
281
+ */
282
+ static const int tjPixelSize[TJ_NUMPF] = {3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4};
283
+
284
+
285
+ /**
286
+ * The number of JPEG colorspaces
287
+ */
288
+ #define TJ_NUMCS 5
289
+
290
+ /**
291
+ * JPEG colorspaces
292
+ */
293
+ enum TJCS
294
+ {
295
+ /**
296
+ * RGB colorspace. When compressing the JPEG image, the R, G, and B
297
+ * components in the source image are reordered into image planes, but no
298
+ * colorspace conversion or subsampling is performed. RGB JPEG images can be
299
+ * decompressed to any of the extended RGB pixel formats or grayscale, but
300
+ * they cannot be decompressed to YUV images.
301
+ */
302
+ TJCS_RGB=0,
303
+ /**
304
+ * YCbCr colorspace. YCbCr is not an absolute colorspace but rather a
305
+ * mathematical transformation of RGB designed solely for storage and
306
+ * transmission. YCbCr images must be converted to RGB before they can
307
+ * actually be displayed. In the YCbCr colorspace, the Y (luminance)
308
+ * component represents the black & white portion of the original image, and
309
+ * the Cb and Cr (chrominance) components represent the color portion of the
310
+ * original image. Originally, the analog equivalent of this transformation
311
+ * allowed the same signal to drive both black & white and color televisions,
312
+ * but JPEG images use YCbCr primarily because it allows the color data to be
313
+ * optionally subsampled for the purposes of reducing bandwidth or disk
314
+ * space. YCbCr is the most common JPEG colorspace, and YCbCr JPEG images
315
+ * can be compressed from and decompressed to any of the extended RGB pixel
316
+ * formats or grayscale, or they can be decompressed to YUV planar images.
317
+ */
318
+ TJCS_YCbCr,
319
+ /**
320
+ * Grayscale colorspace. The JPEG image retains only the luminance data (Y
321
+ * component), and any color data from the source image is discarded.
322
+ * Grayscale JPEG images can be compressed from and decompressed to any of
323
+ * the extended RGB pixel formats or grayscale, or they can be decompressed
324
+ * to YUV planar images.
325
+ */
326
+ TJCS_GRAY,
327
+ /**
328
+ * CMYK colorspace. When compressing the JPEG image, the C, M, Y, and K
329
+ * components in the source image are reordered into image planes, but no
330
+ * colorspace conversion or subsampling is performed. CMYK JPEG images can
331
+ * only be decompressed to CMYK pixels.
332
+ */
333
+ TJCS_CMYK,
334
+ /**
335
+ * YCCK colorspace. YCCK (AKA "YCbCrK") is not an absolute colorspace but
336
+ * rather a mathematical transformation of CMYK designed solely for storage
337
+ * and transmission. It is to CMYK as YCbCr is to RGB. CMYK pixels can be
338
+ * reversibly transformed into YCCK, and as with YCbCr, the chrominance
339
+ * components in the YCCK pixels can be subsampled without incurring major
340
+ * perceptual loss. YCCK JPEG images can only be compressed from and
341
+ * decompressed to CMYK pixels.
342
+ */
343
+ TJCS_YCCK
344
+ };
345
+
346
+
347
+ /**
348
+ * The uncompressed source/destination image is stored in bottom-up (Windows,
349
+ * OpenGL) order, not top-down (X11) order.
350
+ */
351
+ #define TJFLAG_BOTTOMUP 2
352
+ /**
353
+ * When decompressing an image that was compressed using chrominance
354
+ * subsampling, use the fastest chrominance upsampling algorithm available in
355
+ * the underlying codec. The default is to use smooth upsampling, which
356
+ * creates a smooth transition between neighboring chrominance components in
357
+ * order to reduce upsampling artifacts in the decompressed image.
358
+ */
359
+ #define TJFLAG_FASTUPSAMPLE 256
360
+ /**
361
+ * Disable buffer (re)allocation. If passed to #tjCompress2() or
362
+ * #tjTransform(), this flag will cause those functions to generate an error if
363
+ * the JPEG image buffer is invalid or too small rather than attempting to
364
+ * allocate or reallocate that buffer. This reproduces the behavior of earlier
365
+ * versions of TurboJPEG.
366
+ */
367
+ #define TJFLAG_NOREALLOC 1024
368
+ /**
369
+ * Use the fastest DCT/IDCT algorithm available in the underlying codec. The
370
+ * default if this flag is not specified is implementation-specific. For
371
+ * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast
372
+ * algorithm by default when compressing, because this has been shown to have
373
+ * only a very slight effect on accuracy, but it uses the accurate algorithm
374
+ * when decompressing, because this has been shown to have a larger effect.
375
+ */
376
+ #define TJFLAG_FASTDCT 2048
377
+ /**
378
+ * Use the most accurate DCT/IDCT algorithm available in the underlying codec.
379
+ * The default if this flag is not specified is implementation-specific. For
380
+ * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast
381
+ * algorithm by default when compressing, because this has been shown to have
382
+ * only a very slight effect on accuracy, but it uses the accurate algorithm
383
+ * when decompressing, because this has been shown to have a larger effect.
384
+ */
385
+ #define TJFLAG_ACCURATEDCT 4096
386
+
387
+
388
+ /**
389
+ * The number of transform operations
390
+ */
391
+ #define TJ_NUMXOP 8
392
+
393
+ /**
394
+ * Transform operations for #tjTransform()
395
+ */
396
+ enum TJXOP
397
+ {
398
+ /**
399
+ * Do not transform the position of the image pixels
400
+ */
401
+ TJXOP_NONE=0,
402
+ /**
403
+ * Flip (mirror) image horizontally. This transform is imperfect if there
404
+ * are any partial MCU blocks on the right edge (see #TJXOPT_PERFECT.)
405
+ */
406
+ TJXOP_HFLIP,
407
+ /**
408
+ * Flip (mirror) image vertically. This transform is imperfect if there are
409
+ * any partial MCU blocks on the bottom edge (see #TJXOPT_PERFECT.)
410
+ */
411
+ TJXOP_VFLIP,
412
+ /**
413
+ * Transpose image (flip/mirror along upper left to lower right axis.) This
414
+ * transform is always perfect.
415
+ */
416
+ TJXOP_TRANSPOSE,
417
+ /**
418
+ * Transverse transpose image (flip/mirror along upper right to lower left
419
+ * axis.) This transform is imperfect if there are any partial MCU blocks in
420
+ * the image (see #TJXOPT_PERFECT.)
421
+ */
422
+ TJXOP_TRANSVERSE,
423
+ /**
424
+ * Rotate image clockwise by 90 degrees. This transform is imperfect if
425
+ * there are any partial MCU blocks on the bottom edge (see
426
+ * #TJXOPT_PERFECT.)
427
+ */
428
+ TJXOP_ROT90,
429
+ /**
430
+ * Rotate image 180 degrees. This transform is imperfect if there are any
431
+ * partial MCU blocks in the image (see #TJXOPT_PERFECT.)
432
+ */
433
+ TJXOP_ROT180,
434
+ /**
435
+ * Rotate image counter-clockwise by 90 degrees. This transform is imperfect
436
+ * if there are any partial MCU blocks on the right edge (see
437
+ * #TJXOPT_PERFECT.)
438
+ */
439
+ TJXOP_ROT270
440
+ };
441
+
442
+
443
+ /**
444
+ * This option will cause #tjTransform() to return an error if the transform is
445
+ * not perfect. Lossless transforms operate on MCU blocks, whose size depends
446
+ * on the level of chrominance subsampling used (see #tjMCUWidth
447
+ * and #tjMCUHeight.) If the image's width or height is not evenly divisible
448
+ * by the MCU block size, then there will be partial MCU blocks on the right
449
+ * and/or bottom edges. It is not possible to move these partial MCU blocks to
450
+ * the top or left of the image, so any transform that would require that is
451
+ * "imperfect." If this option is not specified, then any partial MCU blocks
452
+ * that cannot be transformed will be left in place, which will create
453
+ * odd-looking strips on the right or bottom edge of the image.
454
+ */
455
+ #define TJXOPT_PERFECT 1
456
+ /**
457
+ * This option will cause #tjTransform() to discard any partial MCU blocks that
458
+ * cannot be transformed.
459
+ */
460
+ #define TJXOPT_TRIM 2
461
+ /**
462
+ * This option will enable lossless cropping. See #tjTransform() for more
463
+ * information.
464
+ */
465
+ #define TJXOPT_CROP 4
466
+ /**
467
+ * This option will discard the color data in the input image and produce
468
+ * a grayscale output image.
469
+ */
470
+ #define TJXOPT_GRAY 8
471
+ /**
472
+ * This option will prevent #tjTransform() from outputting a JPEG image for
473
+ * this particular transform (this can be used in conjunction with a custom
474
+ * filter to capture the transformed DCT coefficients without transcoding
475
+ * them.)
476
+ */
477
+ #define TJXOPT_NOOUTPUT 16
478
+
479
+
480
+ /**
481
+ * Scaling factor
482
+ */
483
+ typedef struct
484
+ {
485
+ /**
486
+ * Numerator
487
+ */
488
+ int num;
489
+ /**
490
+ * Denominator
491
+ */
492
+ int denom;
493
+ } tjscalingfactor;
494
+
495
+ /**
496
+ * Cropping region
497
+ */
498
+ typedef struct
499
+ {
500
+ /**
501
+ * The left boundary of the cropping region. This must be evenly divisible
502
+ * by the MCU block width (see #tjMCUWidth.)
503
+ */
504
+ int x;
505
+ /**
506
+ * The upper boundary of the cropping region. This must be evenly divisible
507
+ * by the MCU block height (see #tjMCUHeight.)
508
+ */
509
+ int y;
510
+ /**
511
+ * The width of the cropping region. Setting this to 0 is the equivalent of
512
+ * setting it to the width of the source JPEG image - x.
513
+ */
514
+ int w;
515
+ /**
516
+ * The height of the cropping region. Setting this to 0 is the equivalent of
517
+ * setting it to the height of the source JPEG image - y.
518
+ */
519
+ int h;
520
+ } tjregion;
521
+
522
+ /**
523
+ * Lossless transform
524
+ */
525
+ typedef struct tjtransform
526
+ {
527
+ /**
528
+ * Cropping region
529
+ */
530
+ tjregion r;
531
+ /**
532
+ * One of the @ref TJXOP "transform operations"
533
+ */
534
+ int op;
535
+ /**
536
+ * The bitwise OR of one of more of the @ref TJXOPT_CROP "transform options"
537
+ */
538
+ int options;
539
+ /**
540
+ * Arbitrary data that can be accessed within the body of the callback
541
+ * function
542
+ */
543
+ void *data;
544
+ /**
545
+ * A callback function that can be used to modify the DCT coefficients
546
+ * after they are losslessly transformed but before they are transcoded to a
547
+ * new JPEG image. This allows for custom filters or other transformations
548
+ * to be applied in the frequency domain.
549
+ *
550
+ * @param coeffs pointer to an array of transformed DCT coefficients. (NOTE:
551
+ * this pointer is not guaranteed to be valid once the callback returns, so
552
+ * applications wishing to hand off the DCT coefficients to another function
553
+ * or library should make a copy of them within the body of the callback.)
554
+ *
555
+ * @param arrayRegion #tjregion structure containing the width and height of
556
+ * the array pointed to by <tt>coeffs</tt> as well as its offset relative to
557
+ * the component plane. TurboJPEG implementations may choose to split each
558
+ * component plane into multiple DCT coefficient arrays and call the callback
559
+ * function once for each array.
560
+ *
561
+ * @param planeRegion #tjregion structure containing the width and height of
562
+ * the component plane to which <tt>coeffs</tt> belongs
563
+ *
564
+ * @param componentID ID number of the component plane to which
565
+ * <tt>coeffs</tt> belongs (Y, Cb, and Cr have, respectively, ID's of 0, 1,
566
+ * and 2 in typical JPEG images.)
567
+ *
568
+ * @param transformID ID number of the transformed image to which
569
+ * <tt>coeffs</tt> belongs. This is the same as the index of the transform
570
+ * in the <tt>transforms</tt> array that was passed to #tjTransform().
571
+ *
572
+ * @param transform a pointer to a #tjtransform structure that specifies the
573
+ * parameters and/or cropping region for this transform
574
+ *
575
+ * @return 0 if the callback was successful, or -1 if an error occurred.
576
+ */
577
+ int (*customFilter)(short *coeffs, tjregion arrayRegion,
578
+ tjregion planeRegion, int componentIndex, int transformIndex,
579
+ struct tjtransform *transform);
580
+ } tjtransform;
581
+
582
+ /**
583
+ * TurboJPEG instance handle
584
+ */
585
+ typedef void* tjhandle;
586
+
587
+
588
+ /**
589
+ * Pad the given width to the nearest 32-bit boundary
590
+ */
591
+ #define TJPAD(width) (((width)+3)&(~3))
592
+
593
+ /**
594
+ * Compute the scaled value of <tt>dimension</tt> using the given scaling
595
+ * factor. This macro performs the integer equivalent of <tt>ceil(dimension *
596
+ * scalingFactor)</tt>.
597
+ */
598
+ #define TJSCALED(dimension, scalingFactor) ((dimension * scalingFactor.num \
599
+ + scalingFactor.denom - 1) / scalingFactor.denom)
600
+
601
+
602
+ #ifdef __cplusplus
603
+ extern "C" {
604
+ #endif
605
+
606
+
607
+ /**
608
+ * Create a TurboJPEG compressor instance.
609
+ *
610
+ * @return a handle to the newly-created instance, or NULL if an error
611
+ * occurred (see #tjGetErrorStr().)
612
+ */
613
+ DLLEXPORT tjhandle DLLCALL tjInitCompress(void);
614
+
615
+
616
+ /**
617
+ * Compress an RGB, grayscale, or CMYK image into a JPEG image.
618
+ *
619
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
620
+ *
621
+ * @param srcBuf pointer to an image buffer containing RGB, grayscale, or
622
+ * CMYK pixels to be compressed
623
+ *
624
+ * @param width width (in pixels) of the source image
625
+ *
626
+ * @param pitch bytes per line in the source image. Normally, this should be
627
+ * <tt>width * #tjPixelSize[pixelFormat]</tt> if the image is unpadded, or
628
+ * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line of the image
629
+ * is padded to the nearest 32-bit boundary, as is the case for Windows
630
+ * bitmaps. You can also be clever and use this parameter to skip lines, etc.
631
+ * Setting this parameter to 0 is the equivalent of setting it to
632
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.
633
+ *
634
+ * @param height height (in pixels) of the source image
635
+ *
636
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
637
+ * "Pixel formats".)
638
+ *
639
+ * @param jpegBuf address of a pointer to an image buffer that will receive the
640
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer
641
+ * to accommodate the size of the JPEG image. Thus, you can choose to:
642
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and
643
+ * let TurboJPEG grow the buffer as needed,
644
+ * -# set <tt>*jpegBuf</tt> to NULL to tell TurboJPEG to allocate the buffer
645
+ * for you, or
646
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
647
+ * #tjBufSize(). This should ensure that the buffer never has to be
648
+ * re-allocated (setting #TJFLAG_NOREALLOC guarantees this.)
649
+ * .
650
+ * If you choose option 1, <tt>*jpegSize</tt> should be set to the size of your
651
+ * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC,
652
+ * you should always check <tt>*jpegBuf</tt> upon return from this function, as
653
+ * it may have changed.
654
+ *
655
+ * @param jpegSize pointer to an unsigned long variable that holds the size of
656
+ * the JPEG image buffer. If <tt>*jpegBuf</tt> points to a pre-allocated
657
+ * buffer, then <tt>*jpegSize</tt> should be set to the size of the buffer.
658
+ * Upon return, <tt>*jpegSize</tt> will contain the size of the JPEG image (in
659
+ * bytes.) If <tt>*jpegBuf</tt> points to a JPEG image buffer that is being
660
+ * reused from a previous call to one of the JPEG compression functions, then
661
+ * <tt>*jpegSize</tt> is ignored.
662
+ *
663
+ * @param jpegSubsamp the level of chrominance subsampling to be used when
664
+ * generating the JPEG image (see @ref TJSAMP
665
+ * "Chrominance subsampling options".)
666
+ *
667
+ * @param jpegQual the image quality of the generated JPEG image (1 = worst,
668
+ * 100 = best)
669
+ *
670
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
671
+ * "flags"
672
+ *
673
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
674
+ */
675
+ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf,
676
+ int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf,
677
+ unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags);
678
+
679
+
680
+ /**
681
+ * Compress a YUV planar image into a JPEG image.
682
+ *
683
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
684
+ *
685
+ * @param srcBuf pointer to an image buffer containing a YUV planar image to be
686
+ * compressed. The size of this buffer should match the value returned by
687
+ * #tjBufSizeYUV2() for the given image width, height, padding, and level of
688
+ * chrominance subsampling. The Y, U (Cb), and V (Cr) image planes should be
689
+ * stored sequentially in the source buffer (refer to @ref YUVnotes
690
+ * "YUV Image Format Notes".)
691
+ *
692
+ * @param width width (in pixels) of the source image. If the width is not an
693
+ * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate
694
+ * buffer copy will be performed within TurboJPEG.
695
+ *
696
+ * @param pad the line padding used in the source image. For instance, if each
697
+ * line in each plane of the YUV image is padded to the nearest multiple of 4
698
+ * bytes, then <tt>pad</tt> should be set to 4.
699
+ *
700
+ * @param height height (in pixels) of the source image. If the height is not
701
+ * an even multiple of the MCU block height (see #tjMCUHeight), then an
702
+ * intermediate buffer copy will be performed within TurboJPEG.
703
+ *
704
+ * @param subsamp the level of chrominance subsampling used in the source
705
+ * image (see @ref TJSAMP "Chrominance subsampling options".)
706
+ *
707
+ * @param jpegBuf address of a pointer to an image buffer that will receive the
708
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to
709
+ * accommodate the size of the JPEG image. Thus, you can choose to:
710
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and
711
+ * let TurboJPEG grow the buffer as needed,
712
+ * -# set <tt>*jpegBuf</tt> to NULL to tell TurboJPEG to allocate the buffer
713
+ * for you, or
714
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
715
+ * #tjBufSize(). This should ensure that the buffer never has to be
716
+ * re-allocated (setting #TJFLAG_NOREALLOC guarantees this.)
717
+ * .
718
+ * If you choose option 1, <tt>*jpegSize</tt> should be set to the size of your
719
+ * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC,
720
+ * you should always check <tt>*jpegBuf</tt> upon return from this function, as
721
+ * it may have changed.
722
+ *
723
+ * @param jpegSize pointer to an unsigned long variable that holds the size of
724
+ * the JPEG image buffer. If <tt>*jpegBuf</tt> points to a pre-allocated
725
+ * buffer, then <tt>*jpegSize</tt> should be set to the size of the buffer.
726
+ * Upon return, <tt>*jpegSize</tt> will contain the size of the JPEG image (in
727
+ * bytes.) If <tt>*jpegBuf</tt> points to a JPEG image buffer that is being
728
+ * reused from a previous call to one of the JPEG compression functions, then
729
+ * <tt>*jpegSize</tt> is ignored.
730
+ *
731
+ * @param jpegQual the image quality of the generated JPEG image (1 = worst,
732
+ * 100 = best)
733
+ *
734
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
735
+ * "flags"
736
+ *
737
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
738
+ */
739
+ DLLEXPORT int DLLCALL tjCompressFromYUV(tjhandle handle, unsigned char *srcBuf,
740
+ int width, int pad, int height, int subsamp, unsigned char **jpegBuf,
741
+ unsigned long *jpegSize, int jpegQual, int flags);
742
+
743
+
744
+ /**
745
+ * Compress a set of Y, U (Cb), and V (Cr) image planes into a JPEG image.
746
+ *
747
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
748
+ *
749
+ * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
750
+ * (or just a Y plane, if compressing a grayscale image) that contain a YUV
751
+ * image to be compressed. These planes can be contiguous or non-contiguous in
752
+ * memory. The size of each plane should match the value returned by
753
+ * #tjPlaneSizeYUV() for the given image width, height, strides, and level of
754
+ * chrominance subsampling. Refer to @ref YUVnotes "YUV Image Format Notes"
755
+ * for more details.
756
+ *
757
+ * @param width width (in pixels) of the source image. If the width is not an
758
+ * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate
759
+ * buffer copy will be performed within TurboJPEG.
760
+ *
761
+ * @param strides an array of integers, each specifying the number of bytes per
762
+ * line in the corresponding plane of the YUV source image. Setting the stride
763
+ * for any plane to 0 is the same as setting it to the plane width (see
764
+ * @ref YUVnotes "YUV Image Format Notes".) If <tt>strides</tt> is NULL, then
765
+ * the strides for all planes will be set to their respective plane widths.
766
+ * You can adjust the strides in order to specify an arbitrary amount of line
767
+ * padding in each plane or to create a JPEG image from a subregion of a larger
768
+ * YUV planar image.
769
+ *
770
+ * @param height height (in pixels) of the source image. If the height is not
771
+ * an even multiple of the MCU block height (see #tjMCUHeight), then an
772
+ * intermediate buffer copy will be performed within TurboJPEG.
773
+ *
774
+ * @param subsamp the level of chrominance subsampling used in the source
775
+ * image (see @ref TJSAMP "Chrominance subsampling options".)
776
+ *
777
+ * @param jpegBuf address of a pointer to an image buffer that will receive the
778
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to
779
+ * accommodate the size of the JPEG image. Thus, you can choose to:
780
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and
781
+ * let TurboJPEG grow the buffer as needed,
782
+ * -# set <tt>*jpegBuf</tt> to NULL to tell TurboJPEG to allocate the buffer
783
+ * for you, or
784
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
785
+ * #tjBufSize(). This should ensure that the buffer never has to be
786
+ * re-allocated (setting #TJFLAG_NOREALLOC guarantees this.)
787
+ * .
788
+ * If you choose option 1, <tt>*jpegSize</tt> should be set to the size of your
789
+ * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC,
790
+ * you should always check <tt>*jpegBuf</tt> upon return from this function, as
791
+ * it may have changed.
792
+ *
793
+ * @param jpegSize pointer to an unsigned long variable that holds the size of
794
+ * the JPEG image buffer. If <tt>*jpegBuf</tt> points to a pre-allocated
795
+ * buffer, then <tt>*jpegSize</tt> should be set to the size of the buffer.
796
+ * Upon return, <tt>*jpegSize</tt> will contain the size of the JPEG image (in
797
+ * bytes.) If <tt>*jpegBuf</tt> points to a JPEG image buffer that is being
798
+ * reused from a previous call to one of the JPEG compression functions, then
799
+ * <tt>*jpegSize</tt> is ignored.
800
+ *
801
+ * @param jpegQual the image quality of the generated JPEG image (1 = worst,
802
+ * 100 = best)
803
+ *
804
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
805
+ * "flags"
806
+ *
807
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
808
+ */
809
+ DLLEXPORT int DLLCALL tjCompressFromYUVPlanes(tjhandle handle,
810
+ unsigned char **srcPlanes, int width, int *strides, int height, int subsamp,
811
+ unsigned char **jpegBuf, unsigned long *jpegSize, int jpegQual, int flags);
812
+
813
+
814
+ /**
815
+ * The maximum size of the buffer (in bytes) required to hold a JPEG image with
816
+ * the given parameters. The number of bytes returned by this function is
817
+ * larger than the size of the uncompressed source image. The reason for this
818
+ * is that the JPEG format uses 16-bit coefficients, and it is thus possible
819
+ * for a very high-quality JPEG image with very high-frequency content to
820
+ * expand rather than compress when converted to the JPEG format. Such images
821
+ * represent a very rare corner case, but since there is no way to predict the
822
+ * size of a JPEG image prior to compression, the corner case has to be
823
+ * handled.
824
+ *
825
+ * @param width width (in pixels) of the image
826
+ *
827
+ * @param height height (in pixels) of the image
828
+ *
829
+ * @param jpegSubsamp the level of chrominance subsampling to be used when
830
+ * generating the JPEG image (see @ref TJSAMP
831
+ * "Chrominance subsampling options".)
832
+ *
833
+ * @return the maximum size of the buffer (in bytes) required to hold the
834
+ * image, or -1 if the arguments are out of bounds.
835
+ */
836
+ DLLEXPORT unsigned long DLLCALL tjBufSize(int width, int height,
837
+ int jpegSubsamp);
838
+
839
+
840
+ /**
841
+ * The size of the buffer (in bytes) required to hold a YUV planar image with
842
+ * the given parameters.
843
+ *
844
+ * @param width width (in pixels) of the image
845
+ *
846
+ * @param pad the width of each line in each plane of the image is padded to
847
+ * the nearest multiple of this number of bytes (must be a power of 2.)
848
+ *
849
+ * @param height height (in pixels) of the image
850
+ *
851
+ * @param subsamp level of chrominance subsampling in the image (see
852
+ * @ref TJSAMP "Chrominance subsampling options".)
853
+ *
854
+ * @return the size of the buffer (in bytes) required to hold the image, or
855
+ * -1 if the arguments are out of bounds.
856
+ */
857
+ DLLEXPORT unsigned long DLLCALL tjBufSizeYUV2(int width, int pad, int height,
858
+ int subsamp);
859
+
860
+
861
+ /**
862
+ * The size of the buffer (in bytes) required to hold a YUV image plane with
863
+ * the given parameters.
864
+ *
865
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
866
+ *
867
+ * @param width width (in pixels) of the YUV image. NOTE: this is the width of
868
+ * the whole image, not the plane width.
869
+ *
870
+ * @param stride bytes per line in the image plane. Setting this to 0 is the
871
+ * equivalent of setting it to the plane width.
872
+ *
873
+ * @param height height (in pixels) of the YUV image. NOTE: this is the height
874
+ * of the whole image, not the plane height.
875
+ *
876
+ * @param subsamp level of chrominance subsampling in the image (see
877
+ * @ref TJSAMP "Chrominance subsampling options".)
878
+ *
879
+ * @return the size of the buffer (in bytes) required to hold the YUV image
880
+ * plane, or -1 if the arguments are out of bounds.
881
+ */
882
+ DLLEXPORT unsigned long DLLCALL tjPlaneSizeYUV(int componentID, int width,
883
+ int stride, int height, int subsamp);
884
+
885
+
886
+ /**
887
+ * The plane width of a YUV image plane with the given parameters. Refer to
888
+ * @ref YUVnotes "YUV Image Format Notes" for a description of plane width.
889
+ *
890
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
891
+ *
892
+ * @param width width (in pixels) of the YUV image
893
+ *
894
+ * @param subsamp level of chrominance subsampling in the image (see
895
+ * @ref TJSAMP "Chrominance subsampling options".)
896
+ *
897
+ * @return the plane width of a YUV image plane with the given parameters, or
898
+ * -1 if the arguments are out of bounds.
899
+ */
900
+ DLLEXPORT int tjPlaneWidth(int componentID, int width, int subsamp);
901
+
902
+
903
+ /**
904
+ * The plane height of a YUV image plane with the given parameters. Refer to
905
+ * @ref YUVnotes "YUV Image Format Notes" for a description of plane height.
906
+ *
907
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
908
+ *
909
+ * @param height height (in pixels) of the YUV image
910
+ *
911
+ * @param subsamp level of chrominance subsampling in the image (see
912
+ * @ref TJSAMP "Chrominance subsampling options".)
913
+ *
914
+ * @return the plane height of a YUV image plane with the given parameters, or
915
+ * -1 if the arguments are out of bounds.
916
+ */
917
+ DLLEXPORT int tjPlaneHeight(int componentID, int height, int subsamp);
918
+
919
+
920
+ /**
921
+ * Encode an RGB or grayscale image into a YUV planar image. This function
922
+ * uses the accelerated color conversion routines in the underlying
923
+ * codec but does not execute any of the other steps in the JPEG compression
924
+ * process.
925
+ *
926
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
927
+ *
928
+ * @param srcBuf pointer to an image buffer containing RGB or grayscale pixels
929
+ * to be encoded
930
+ *
931
+ * @param width width (in pixels) of the source image
932
+ *
933
+ * @param pitch bytes per line in the source image. Normally, this should be
934
+ * <tt>width * #tjPixelSize[pixelFormat]</tt> if the image is unpadded, or
935
+ * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line of the image
936
+ * is padded to the nearest 32-bit boundary, as is the case for Windows
937
+ * bitmaps. You can also be clever and use this parameter to skip lines, etc.
938
+ * Setting this parameter to 0 is the equivalent of setting it to
939
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.
940
+ *
941
+ * @param height height (in pixels) of the source image
942
+ *
943
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
944
+ * "Pixel formats".)
945
+ *
946
+ * @param dstBuf pointer to an image buffer that will receive the YUV image.
947
+ * Use #tjBufSizeYUV2() to determine the appropriate size for this buffer based
948
+ * on the image width, height, padding, and level of chrominance subsampling.
949
+ * The Y, U (Cb), and V (Cr) image planes will be stored sequentially in the
950
+ * buffer (refer to @ref YUVnotes "YUV Image Format Notes".)
951
+ *
952
+ * @param pad the width of each line in each plane of the YUV image will be
953
+ * padded to the nearest multiple of this number of bytes (must be a power of
954
+ * 2.) To generate images suitable for X Video, <tt>pad</tt> should be set to
955
+ * 4.
956
+ *
957
+ * @param subsamp the level of chrominance subsampling to be used when
958
+ * generating the YUV image (see @ref TJSAMP
959
+ * "Chrominance subsampling options".) To generate images suitable for X
960
+ * Video, <tt>subsamp</tt> should be set to @ref TJSAMP_420. This produces an
961
+ * image compatible with the I420 (AKA "YUV420P") format.
962
+ *
963
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
964
+ * "flags"
965
+ *
966
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
967
+ */
968
+ DLLEXPORT int DLLCALL tjEncodeYUV3(tjhandle handle,
969
+ unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat,
970
+ unsigned char *dstBuf, int pad, int subsamp, int flags);
971
+
972
+
973
+ /**
974
+ * Encode an RGB or grayscale image into separate Y, U (Cb), and V (Cr) image
975
+ * planes. This function uses the accelerated color conversion routines in the
976
+ * underlying codec but does not execute any of the other steps in the JPEG
977
+ * compression process.
978
+ *
979
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
980
+ *
981
+ * @param srcBuf pointer to an image buffer containing RGB or grayscale pixels
982
+ * to be encoded
983
+ *
984
+ * @param width width (in pixels) of the source image
985
+ *
986
+ * @param pitch bytes per line in the source image. Normally, this should be
987
+ * <tt>width * #tjPixelSize[pixelFormat]</tt> if the image is unpadded, or
988
+ * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line of the image
989
+ * is padded to the nearest 32-bit boundary, as is the case for Windows
990
+ * bitmaps. You can also be clever and use this parameter to skip lines, etc.
991
+ * Setting this parameter to 0 is the equivalent of setting it to
992
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.
993
+ *
994
+ * @param height height (in pixels) of the source image
995
+ *
996
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
997
+ * "Pixel formats".)
998
+ *
999
+ * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
1000
+ * (or just a Y plane, if generating a grayscale image) that will receive the
1001
+ * encoded image. These planes can be contiguous or non-contiguous in memory.
1002
+ * Use #tjPlaneSizeYUV() to determine the appropriate size for each plane based
1003
+ * on the image width, height, strides, and level of chrominance subsampling.
1004
+ * Refer to @ref YUVnotes "YUV Image Format Notes" for more details.
1005
+ *
1006
+ * @param strides an array of integers, each specifying the number of bytes per
1007
+ * line in the corresponding plane of the output image. Setting the stride for
1008
+ * any plane to 0 is the same as setting it to the plane width (see
1009
+ * @ref YUVnotes "YUV Image Format Notes".) If <tt>strides</tt> is NULL, then
1010
+ * the strides for all planes will be set to their respective plane widths.
1011
+ * You can adjust the strides in order to add an arbitrary amount of line
1012
+ * padding to each plane or to encode an RGB or grayscale image into a
1013
+ * subregion of a larger YUV planar image.
1014
+ *
1015
+ * @param subsamp the level of chrominance subsampling to be used when
1016
+ * generating the YUV image (see @ref TJSAMP
1017
+ * "Chrominance subsampling options".) To generate images suitable for X
1018
+ * Video, <tt>subsamp</tt> should be set to @ref TJSAMP_420. This produces an
1019
+ * image compatible with the I420 (AKA "YUV420P") format.
1020
+ *
1021
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1022
+ * "flags"
1023
+ *
1024
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1025
+ */
1026
+ DLLEXPORT int DLLCALL tjEncodeYUVPlanes(tjhandle handle,
1027
+ unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat,
1028
+ unsigned char **dstPlanes, int *strides, int subsamp, int flags);
1029
+
1030
+
1031
+ /**
1032
+ * Create a TurboJPEG decompressor instance.
1033
+ *
1034
+ * @return a handle to the newly-created instance, or NULL if an error
1035
+ * occurred (see #tjGetErrorStr().)
1036
+ */
1037
+ DLLEXPORT tjhandle DLLCALL tjInitDecompress(void);
1038
+
1039
+
1040
+ /**
1041
+ * Retrieve information about a JPEG image without decompressing it.
1042
+ *
1043
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1044
+ *
1045
+ * @param jpegBuf pointer to a buffer containing a JPEG image
1046
+ *
1047
+ * @param jpegSize size of the JPEG image (in bytes)
1048
+ *
1049
+ * @param width pointer to an integer variable that will receive the width (in
1050
+ * pixels) of the JPEG image
1051
+ *
1052
+ * @param height pointer to an integer variable that will receive the height
1053
+ * (in pixels) of the JPEG image
1054
+ *
1055
+ * @param jpegSubsamp pointer to an integer variable that will receive the
1056
+ * level of chrominance subsampling used when the JPEG image was compressed
1057
+ * (see @ref TJSAMP "Chrominance subsampling options".)
1058
+ *
1059
+ * @param jpegColorspace pointer to an integer variable that will receive one
1060
+ * of the JPEG colorspace constants, indicating the colorspace of the JPEG
1061
+ * image (see @ref TJCS "JPEG colorspaces".)
1062
+ *
1063
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1064
+ */
1065
+ DLLEXPORT int DLLCALL tjDecompressHeader3(tjhandle handle,
1066
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height,
1067
+ int *jpegSubsamp, int *jpegColorspace);
1068
+
1069
+
1070
+ /**
1071
+ * Returns a list of fractional scaling factors that the JPEG decompressor in
1072
+ * this implementation of TurboJPEG supports.
1073
+ *
1074
+ * @param numscalingfactors pointer to an integer variable that will receive
1075
+ * the number of elements in the list
1076
+ *
1077
+ * @return a pointer to a list of fractional scaling factors, or NULL if an
1078
+ * error is encountered (see #tjGetErrorStr().)
1079
+ */
1080
+ DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors);
1081
+
1082
+
1083
+ /**
1084
+ * Decompress a JPEG image to an RGB, grayscale, or CMYK image.
1085
+ *
1086
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1087
+ *
1088
+ * @param jpegBuf pointer to a buffer containing the JPEG image to decompress
1089
+ *
1090
+ * @param jpegSize size of the JPEG image (in bytes)
1091
+ *
1092
+ * @param dstBuf pointer to an image buffer that will receive the decompressed
1093
+ * image. This buffer should normally be <tt>pitch * scaledHeight</tt> bytes
1094
+ * in size, where <tt>scaledHeight</tt> can be determined by calling
1095
+ * #TJSCALED() with the JPEG image height and one of the scaling factors
1096
+ * returned by #tjGetScalingFactors(). The <tt>dstBuf</tt> pointer may also be
1097
+ * used to decompress into a specific region of a larger buffer.
1098
+ *
1099
+ * @param width desired width (in pixels) of the destination image. If this is
1100
+ * different than the width of the JPEG image being decompressed, then
1101
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1102
+ * possible image that will fit within the desired width. If <tt>width</tt> is
1103
+ * set to 0, then only the height will be considered when determining the
1104
+ * scaled image size.
1105
+ *
1106
+ * @param pitch bytes per line in the destination image. Normally, this is
1107
+ * <tt>scaledWidth * #tjPixelSize[pixelFormat]</tt> if the decompressed image
1108
+ * is unpadded, else <tt>#TJPAD(scaledWidth * #tjPixelSize[pixelFormat])</tt>
1109
+ * if each line of the decompressed image is padded to the nearest 32-bit
1110
+ * boundary, as is the case for Windows bitmaps. (NOTE: <tt>scaledWidth</tt>
1111
+ * can be determined by calling #TJSCALED() with the JPEG image width and one
1112
+ * of the scaling factors returned by #tjGetScalingFactors().) You can also be
1113
+ * clever and use the pitch parameter to skip lines, etc. Setting this
1114
+ * parameter to 0 is the equivalent of setting it to
1115
+ * <tt>scaledWidth * #tjPixelSize[pixelFormat]</tt>.
1116
+ *
1117
+ * @param height desired height (in pixels) of the destination image. If this
1118
+ * is different than the height of the JPEG image being decompressed, then
1119
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1120
+ * possible image that will fit within the desired height. If <tt>height</tt>
1121
+ * is set to 0, then only the width will be considered when determining the
1122
+ * scaled image size.
1123
+ *
1124
+ * @param pixelFormat pixel format of the destination image (see @ref
1125
+ * TJPF "Pixel formats".)
1126
+ *
1127
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1128
+ * "flags"
1129
+ *
1130
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1131
+ */
1132
+ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle,
1133
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
1134
+ int width, int pitch, int height, int pixelFormat, int flags);
1135
+
1136
+
1137
+ /**
1138
+ * Decompress a JPEG image to a YUV planar image. This function performs JPEG
1139
+ * decompression but leaves out the color conversion step, so a planar YUV
1140
+ * image is generated instead of an RGB image.
1141
+ *
1142
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1143
+ *
1144
+ * @param jpegBuf pointer to a buffer containing the JPEG image to decompress
1145
+ *
1146
+ * @param jpegSize size of the JPEG image (in bytes)
1147
+ *
1148
+ * @param dstBuf pointer to an image buffer that will receive the YUV image.
1149
+ * Use #tjBufSizeYUV2() to determine the appropriate size for this buffer based
1150
+ * on the image width, height, padding, and level of subsampling. The Y,
1151
+ * U (Cb), and V (Cr) image planes will be stored sequentially in the buffer
1152
+ * (refer to @ref YUVnotes "YUV Image Format Notes".)
1153
+ *
1154
+ * @param width desired width (in pixels) of the YUV image. If this is
1155
+ * different than the width of the JPEG image being decompressed, then
1156
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1157
+ * possible image that will fit within the desired width. If <tt>width</tt> is
1158
+ * set to 0, then only the height will be considered when determining the
1159
+ * scaled image size. If the scaled width is not an even multiple of the MCU
1160
+ * block width (see #tjMCUWidth), then an intermediate buffer copy will be
1161
+ * performed within TurboJPEG.
1162
+ *
1163
+ * @param pad the width of each line in each plane of the YUV image will be
1164
+ * padded to the nearest multiple of this number of bytes (must be a power of
1165
+ * 2.) To generate images suitable for X Video, <tt>pad</tt> should be set to
1166
+ * 4.
1167
+ *
1168
+ * @param height desired height (in pixels) of the YUV image. If this is
1169
+ * different than the height of the JPEG image being decompressed, then
1170
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1171
+ * possible image that will fit within the desired height. If <tt>height</tt>
1172
+ * is set to 0, then only the width will be considered when determining the
1173
+ * scaled image size. If the scaled height is not an even multiple of the MCU
1174
+ * block height (see #tjMCUHeight), then an intermediate buffer copy will be
1175
+ * performed within TurboJPEG.
1176
+ *
1177
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1178
+ * "flags"
1179
+ *
1180
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1181
+ */
1182
+ DLLEXPORT int DLLCALL tjDecompressToYUV2(tjhandle handle,
1183
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
1184
+ int width, int pad, int height, int flags);
1185
+
1186
+
1187
+ /**
1188
+ * Decompress a JPEG image into separate Y, U (Cb), and V (Cr) image
1189
+ * planes. This function performs JPEG decompression but leaves out the color
1190
+ * conversion step, so a planar YUV image is generated instead of an RGB image.
1191
+ *
1192
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1193
+ *
1194
+ * @param jpegBuf pointer to a buffer containing the JPEG image to decompress
1195
+ *
1196
+ * @param jpegSize size of the JPEG image (in bytes)
1197
+ *
1198
+ * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
1199
+ * (or just a Y plane, if decompressing a grayscale image) that will receive
1200
+ * the YUV image. These planes can be contiguous or non-contiguous in memory.
1201
+ * Use #tjPlaneSizeYUV() to determine the appropriate size for each plane based
1202
+ * on the scaled image width, scaled image height, strides, and level of
1203
+ * chrominance subsampling. Refer to @ref YUVnotes "YUV Image Format Notes"
1204
+ * for more details.
1205
+ *
1206
+ * @param width desired width (in pixels) of the YUV image. If this is
1207
+ * different than the width of the JPEG image being decompressed, then
1208
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1209
+ * possible image that will fit within the desired width. If <tt>width</tt> is
1210
+ * set to 0, then only the height will be considered when determining the
1211
+ * scaled image size. If the scaled width is not an even multiple of the MCU
1212
+ * block width (see #tjMCUWidth), then an intermediate buffer copy will be
1213
+ * performed within TurboJPEG.
1214
+ *
1215
+ * @param strides an array of integers, each specifying the number of bytes per
1216
+ * line in the corresponding plane of the output image. Setting the stride for
1217
+ * any plane to 0 is the same as setting it to the scaled plane width (see
1218
+ * @ref YUVnotes "YUV Image Format Notes".) If <tt>strides</tt> is NULL, then
1219
+ * the strides for all planes will be set to their respective scaled plane
1220
+ * widths. You can adjust the strides in order to add an arbitrary amount of
1221
+ * line padding to each plane or to decompress the JPEG image into a subregion
1222
+ * of a larger YUV planar image.
1223
+ *
1224
+ * @param height desired height (in pixels) of the YUV image. If this is
1225
+ * different than the height of the JPEG image being decompressed, then
1226
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the largest
1227
+ * possible image that will fit within the desired height. If <tt>height</tt>
1228
+ * is set to 0, then only the width will be considered when determining the
1229
+ * scaled image size. If the scaled height is not an even multiple of the MCU
1230
+ * block height (see #tjMCUHeight), then an intermediate buffer copy will be
1231
+ * performed within TurboJPEG.
1232
+ *
1233
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1234
+ * "flags"
1235
+ *
1236
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1237
+ */
1238
+ DLLEXPORT int DLLCALL tjDecompressToYUVPlanes(tjhandle handle,
1239
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char **dstPlanes,
1240
+ int width, int *strides, int height, int flags);
1241
+
1242
+
1243
+ /**
1244
+ * Decode a YUV planar image into an RGB or grayscale image. This function
1245
+ * uses the accelerated color conversion routines in the underlying
1246
+ * codec but does not execute any of the other steps in the JPEG decompression
1247
+ * process.
1248
+ *
1249
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1250
+ *
1251
+ * @param srcBuf pointer to an image buffer containing a YUV planar image to be
1252
+ * decoded. The size of this buffer should match the value returned by
1253
+ * #tjBufSizeYUV2() for the given image width, height, padding, and level of
1254
+ * chrominance subsampling. The Y, U (Cb), and V (Cr) image planes should be
1255
+ * stored sequentially in the source buffer (refer to @ref YUVnotes
1256
+ * "YUV Image Format Notes".)
1257
+ *
1258
+ * @param pad Use this parameter to specify that the width of each line in each
1259
+ * plane of the YUV source image is padded to the nearest multiple of this
1260
+ * number of bytes (must be a power of 2.)
1261
+ *
1262
+ * @param subsamp the level of chrominance subsampling used in the YUV source
1263
+ * image (see @ref TJSAMP "Chrominance subsampling options".)
1264
+ *
1265
+ * @param dstBuf pointer to an image buffer that will receive the decoded
1266
+ * image. This buffer should normally be <tt>pitch * height</tt> bytes in
1267
+ * size, but the <tt>dstBuf</tt> pointer can also be used to decode into a
1268
+ * specific region of a larger buffer.
1269
+ *
1270
+ * @param width width (in pixels) of the source and destination images
1271
+ *
1272
+ * @param pitch bytes per line in the destination image. Normally, this should
1273
+ * be <tt>width * #tjPixelSize[pixelFormat]</tt> if the destination image is
1274
+ * unpadded, or <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line
1275
+ * of the destination image should be padded to the nearest 32-bit boundary, as
1276
+ * is the case for Windows bitmaps. You can also be clever and use the pitch
1277
+ * parameter to skip lines, etc. Setting this parameter to 0 is the equivalent
1278
+ * of setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>.
1279
+ *
1280
+ * @param height height (in pixels) of the source and destination images
1281
+ *
1282
+ * @param pixelFormat pixel format of the destination image (see @ref TJPF
1283
+ * "Pixel formats".)
1284
+ *
1285
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1286
+ * "flags"
1287
+ *
1288
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1289
+ */
1290
+ DLLEXPORT int DLLCALL tjDecodeYUV(tjhandle handle, unsigned char *srcBuf,
1291
+ int pad, int subsamp, unsigned char *dstBuf, int width, int pitch,
1292
+ int height, int pixelFormat, int flags);
1293
+
1294
+
1295
+ /**
1296
+ * Decode a set of Y, U (Cb), and V (Cr) image planes into an RGB or grayscale
1297
+ * image. This function uses the accelerated color conversion routines in the
1298
+ * underlying codec but does not execute any of the other steps in the JPEG
1299
+ * decompression process.
1300
+ *
1301
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
1302
+ *
1303
+ * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
1304
+ * (or just a Y plane, if decoding a grayscale image) that contain a YUV image
1305
+ * to be decoded. These planes can be contiguous or non-contiguous in memory.
1306
+ * The size of each plane should match the value returned by #tjPlaneSizeYUV()
1307
+ * for the given image width, height, strides, and level of chrominance
1308
+ * subsampling. Refer to @ref YUVnotes "YUV Image Format Notes" for more
1309
+ * details.
1310
+ *
1311
+ * @param strides an array of integers, each specifying the number of bytes per
1312
+ * line in the corresponding plane of the YUV source image. Setting the stride
1313
+ * for any plane to 0 is the same as setting it to the plane width (see
1314
+ * @ref YUVnotes "YUV Image Format Notes".) If <tt>strides</tt> is NULL, then
1315
+ * the strides for all planes will be set to their respective plane widths.
1316
+ * You can adjust the strides in order to specify an arbitrary amount of line
1317
+ * padding in each plane or to decode a subregion of a larger YUV planar image.
1318
+ *
1319
+ * @param subsamp the level of chrominance subsampling used in the YUV source
1320
+ * image (see @ref TJSAMP "Chrominance subsampling options".)
1321
+ *
1322
+ * @param dstBuf pointer to an image buffer that will receive the decoded
1323
+ * image. This buffer should normally be <tt>pitch * height</tt> bytes in
1324
+ * size, but the <tt>dstBuf</tt> pointer can also be used to decode into a
1325
+ * specific region of a larger buffer.
1326
+ *
1327
+ * @param width width (in pixels) of the source and destination images
1328
+ *
1329
+ * @param pitch bytes per line in the destination image. Normally, this should
1330
+ * be <tt>width * #tjPixelSize[pixelFormat]</tt> if the destination image is
1331
+ * unpadded, or <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line
1332
+ * of the destination image should be padded to the nearest 32-bit boundary, as
1333
+ * is the case for Windows bitmaps. You can also be clever and use the pitch
1334
+ * parameter to skip lines, etc. Setting this parameter to 0 is the equivalent
1335
+ * of setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>.
1336
+ *
1337
+ * @param height height (in pixels) of the source and destination images
1338
+ *
1339
+ * @param pixelFormat pixel format of the destination image (see @ref TJPF
1340
+ * "Pixel formats".)
1341
+ *
1342
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1343
+ * "flags"
1344
+ *
1345
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1346
+ */
1347
+ DLLEXPORT int DLLCALL tjDecodeYUVPlanes(tjhandle handle,
1348
+ unsigned char **srcPlanes, int *strides, int subsamp, unsigned char *dstBuf,
1349
+ int width, int pitch, int height, int pixelFormat, int flags);
1350
+
1351
+
1352
+ /**
1353
+ * Create a new TurboJPEG transformer instance.
1354
+ *
1355
+ * @return a handle to the newly-created instance, or NULL if an error
1356
+ * occurred (see #tjGetErrorStr().)
1357
+ */
1358
+ DLLEXPORT tjhandle DLLCALL tjInitTransform(void);
1359
+
1360
+
1361
+ /**
1362
+ * Losslessly transform a JPEG image into another JPEG image. Lossless
1363
+ * transforms work by moving the raw DCT coefficients from one JPEG image
1364
+ * structure to another without altering the values of the coefficients. While
1365
+ * this is typically faster than decompressing the image, transforming it, and
1366
+ * re-compressing it, lossless transforms are not free. Each lossless
1367
+ * transform requires reading and performing Huffman decoding on all of the
1368
+ * coefficients in the source image, regardless of the size of the destination
1369
+ * image. Thus, this function provides a means of generating multiple
1370
+ * transformed images from the same source or applying multiple
1371
+ * transformations simultaneously, in order to eliminate the need to read the
1372
+ * source coefficients multiple times.
1373
+ *
1374
+ * @param handle a handle to a TurboJPEG transformer instance
1375
+ *
1376
+ * @param jpegBuf pointer to a buffer containing the JPEG source image to
1377
+ * transform
1378
+ *
1379
+ * @param jpegSize size of the JPEG source image (in bytes)
1380
+ *
1381
+ * @param n the number of transformed JPEG images to generate
1382
+ *
1383
+ * @param dstBufs pointer to an array of n image buffers. <tt>dstBufs[i]</tt>
1384
+ * will receive a JPEG image that has been transformed using the parameters in
1385
+ * <tt>transforms[i]</tt>. TurboJPEG has the ability to reallocate the JPEG
1386
+ * buffer to accommodate the size of the JPEG image. Thus, you can choose to:
1387
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and
1388
+ * let TurboJPEG grow the buffer as needed,
1389
+ * -# set <tt>dstBufs[i]</tt> to NULL to tell TurboJPEG to allocate the buffer
1390
+ * for you, or
1391
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
1392
+ * #tjBufSize() with the transformed or cropped width and height. This should
1393
+ * ensure that the buffer never has to be re-allocated (setting
1394
+ * #TJFLAG_NOREALLOC guarantees this.)
1395
+ * .
1396
+ * If you choose option 1, <tt>dstSizes[i]</tt> should be set to the size of
1397
+ * your pre-allocated buffer. In any case, unless you have set
1398
+ * #TJFLAG_NOREALLOC, you should always check <tt>dstBufs[i]</tt> upon return
1399
+ * from this function, as it may have changed.
1400
+ *
1401
+ * @param dstSizes pointer to an array of n unsigned long variables that will
1402
+ * receive the actual sizes (in bytes) of each transformed JPEG image. If
1403
+ * <tt>dstBufs[i]</tt> points to a pre-allocated buffer, then
1404
+ * <tt>dstSizes[i]</tt> should be set to the size of the buffer. Upon return,
1405
+ * <tt>dstSizes[i]</tt> will contain the size of the JPEG image (in bytes.)
1406
+ *
1407
+ * @param transforms pointer to an array of n #tjtransform structures, each of
1408
+ * which specifies the transform parameters and/or cropping region for the
1409
+ * corresponding transformed output image.
1410
+ *
1411
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
1412
+ * "flags"
1413
+ *
1414
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1415
+ */
1416
+ DLLEXPORT int DLLCALL tjTransform(tjhandle handle, unsigned char *jpegBuf,
1417
+ unsigned long jpegSize, int n, unsigned char **dstBufs,
1418
+ unsigned long *dstSizes, tjtransform *transforms, int flags);
1419
+
1420
+
1421
+ /**
1422
+ * Destroy a TurboJPEG compressor, decompressor, or transformer instance.
1423
+ *
1424
+ * @param handle a handle to a TurboJPEG compressor, decompressor or
1425
+ * transformer instance
1426
+ *
1427
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
1428
+ */
1429
+ DLLEXPORT int DLLCALL tjDestroy(tjhandle handle);
1430
+
1431
+
1432
+ /**
1433
+ * Allocate an image buffer for use with TurboJPEG. You should always use
1434
+ * this function to allocate the JPEG destination buffer(s) for #tjCompress2()
1435
+ * and #tjTransform() unless you are disabling automatic buffer
1436
+ * (re)allocation (by setting #TJFLAG_NOREALLOC.)
1437
+ *
1438
+ * @param bytes the number of bytes to allocate
1439
+ *
1440
+ * @return a pointer to a newly-allocated buffer with the specified number of
1441
+ * bytes.
1442
+ *
1443
+ * @sa tjFree()
1444
+ */
1445
+ DLLEXPORT unsigned char* DLLCALL tjAlloc(int bytes);
1446
+
1447
+
1448
+ /**
1449
+ * Free an image buffer previously allocated by TurboJPEG. You should always
1450
+ * use this function to free JPEG destination buffer(s) that were automatically
1451
+ * (re)allocated by #tjCompress2() or #tjTransform() or that were manually
1452
+ * allocated using #tjAlloc().
1453
+ *
1454
+ * @param buffer address of the buffer to free
1455
+ *
1456
+ * @sa tjAlloc()
1457
+ */
1458
+ DLLEXPORT void DLLCALL tjFree(unsigned char *buffer);
1459
+
1460
+
1461
+ /**
1462
+ * Returns a descriptive error message explaining why the last command failed.
1463
+ *
1464
+ * @return a descriptive error message explaining why the last command failed.
1465
+ */
1466
+ DLLEXPORT char* DLLCALL tjGetErrorStr(void);
1467
+
1468
+
1469
+ /* Deprecated functions and macros */
1470
+ #define TJFLAG_FORCEMMX 8
1471
+ #define TJFLAG_FORCESSE 16
1472
+ #define TJFLAG_FORCESSE2 32
1473
+ #define TJFLAG_FORCESSE3 128
1474
+
1475
+
1476
+ /* Backward compatibility functions and macros (nothing to see here) */
1477
+ #define NUMSUBOPT TJ_NUMSAMP
1478
+ #define TJ_444 TJSAMP_444
1479
+ #define TJ_422 TJSAMP_422
1480
+ #define TJ_420 TJSAMP_420
1481
+ #define TJ_411 TJSAMP_420
1482
+ #define TJ_GRAYSCALE TJSAMP_GRAY
1483
+
1484
+ #define TJ_BGR 1
1485
+ #define TJ_BOTTOMUP TJFLAG_BOTTOMUP
1486
+ #define TJ_FORCEMMX TJFLAG_FORCEMMX
1487
+ #define TJ_FORCESSE TJFLAG_FORCESSE
1488
+ #define TJ_FORCESSE2 TJFLAG_FORCESSE2
1489
+ #define TJ_ALPHAFIRST 64
1490
+ #define TJ_FORCESSE3 TJFLAG_FORCESSE3
1491
+ #define TJ_FASTUPSAMPLE TJFLAG_FASTUPSAMPLE
1492
+ #define TJ_YUV 512
1493
+
1494
+ DLLEXPORT unsigned long DLLCALL TJBUFSIZE(int width, int height);
1495
+
1496
+ DLLEXPORT unsigned long DLLCALL TJBUFSIZEYUV(int width, int height,
1497
+ int jpegSubsamp);
1498
+
1499
+ DLLEXPORT unsigned long DLLCALL tjBufSizeYUV(int width, int height,
1500
+ int subsamp);
1501
+
1502
+ DLLEXPORT int DLLCALL tjCompress(tjhandle handle, unsigned char *srcBuf,
1503
+ int width, int pitch, int height, int pixelSize, unsigned char *dstBuf,
1504
+ unsigned long *compressedSize, int jpegSubsamp, int jpegQual, int flags);
1505
+
1506
+ DLLEXPORT int DLLCALL tjEncodeYUV(tjhandle handle,
1507
+ unsigned char *srcBuf, int width, int pitch, int height, int pixelSize,
1508
+ unsigned char *dstBuf, int subsamp, int flags);
1509
+
1510
+ DLLEXPORT int DLLCALL tjEncodeYUV2(tjhandle handle,
1511
+ unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat,
1512
+ unsigned char *dstBuf, int subsamp, int flags);
1513
+
1514
+ DLLEXPORT int DLLCALL tjDecompressHeader(tjhandle handle,
1515
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height);
1516
+
1517
+ DLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle handle,
1518
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height,
1519
+ int *jpegSubsamp);
1520
+
1521
+ DLLEXPORT int DLLCALL tjDecompress(tjhandle handle,
1522
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
1523
+ int width, int pitch, int height, int pixelSize, int flags);
1524
+
1525
+ DLLEXPORT int DLLCALL tjDecompressToYUV(tjhandle handle,
1526
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
1527
+ int flags);
1528
+
1529
+
1530
+ /**
1531
+ * @}
1532
+ */
1533
+
1534
+ #ifdef __cplusplus
1535
+ }
1536
+ #endif
1537
+
1538
+ #endif