Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Side by Side Diff: wrtarga.c

Issue 1953443002: Update to libjpeg_turbo 1.4.90 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « wrrle.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * wrtarga.c 2 * wrtarga.c
3 * 3 *
4 * This file was part of the Independent JPEG Group's software:
4 * Copyright (C) 1991-1996, Thomas G. Lane. 5 * Copyright (C) 1991-1996, Thomas G. Lane.
5 * This file is part of the Independent JPEG Group's software. 6 * It was modified by The libjpeg-turbo Project to include only code and
6 * For conditions of distribution and use, see the accompanying README file. 7 * information relevant to libjpeg-turbo.
8 * For conditions of distribution and use, see the accompanying README.ijg
9 * file.
7 * 10 *
8 * This file contains routines to write output images in Targa format. 11 * This file contains routines to write output images in Targa format.
9 * 12 *
10 * These routines may need modification for non-Unix environments or 13 * These routines may need modification for non-Unix environments or
11 * specialized applications. As they stand, they assume output to 14 * specialized applications. As they stand, they assume output to
12 * an ordinary stdio stream. 15 * an ordinary stdio stream.
13 * 16 *
14 * Based on code contributed by Lee Daniel Crocker. 17 * Based on code contributed by Lee Daniel Crocker.
15 */ 18 */
16 19
17 #include "cdjpeg.h"» » /* Common decls for cjpeg/djpeg applications */ 20 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
18 21
19 #ifdef TARGA_SUPPORTED 22 #ifdef TARGA_SUPPORTED
20 23
21 24
22 /* 25 /*
23 * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. 26 * To support 12-bit JPEG data, we'd have to scale output down to 8 bits.
24 * This is not yet implemented. 27 * This is not yet implemented.
25 */ 28 */
26 29
27 #if BITS_IN_JSAMPLE != 8 30 #if BITS_IN_JSAMPLE != 8
28 Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ 31 Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */
29 #endif 32 #endif
30 33
31 /*
32 * The output buffer needs to be writable by fwrite(). On PCs, we must
33 * allocate the buffer in near data space, because we are assuming small-data
34 * memory model, wherein fwrite() can't reach far memory. If you need to
35 * process very wide images on a PC, you might have to compile in large-memory
36 * model, or else replace fwrite() with a putc() loop --- which will be much
37 * slower.
38 */
39
40 34
41 /* Private version of data destination object */ 35 /* Private version of data destination object */
42 36
43 typedef struct { 37 typedef struct {
44 struct djpeg_dest_struct pub;»/* public fields */ 38 struct djpeg_dest_struct pub; /* public fields */
45 39
46 char *iobuffer;» » /* physical I/O buffer */ 40 char *iobuffer; /* physical I/O buffer */
47 JDIMENSION buffer_width;» /* width of one row */ 41 JDIMENSION buffer_width; /* width of one row */
48 } tga_dest_struct; 42 } tga_dest_struct;
49 43
50 typedef tga_dest_struct * tga_dest_ptr; 44 typedef tga_dest_struct *tga_dest_ptr;
51 45
52 46
53 LOCAL(void) 47 LOCAL(void)
54 write_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors) 48 write_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors)
55 /* Create and write a Targa header */ 49 /* Create and write a Targa header */
56 { 50 {
57 char targaheader[18]; 51 char targaheader[18];
58 52
59 /* Set unused fields of header to 0 */ 53 /* Set unused fields of header to 0 */
60 MEMZERO(targaheader, SIZEOF(targaheader)); 54 MEMZERO(targaheader, sizeof(targaheader));
61 55
62 if (num_colors > 0) { 56 if (num_colors > 0) {
63 targaheader[1] = 1;»» /* color map type 1 */ 57 targaheader[1] = 1; /* color map type 1 */
64 targaheader[5] = (char) (num_colors & 0xFF); 58 targaheader[5] = (char) (num_colors & 0xFF);
65 targaheader[6] = (char) (num_colors >> 8); 59 targaheader[6] = (char) (num_colors >> 8);
66 targaheader[7] = 24;» /* 24 bits per cmap entry */ 60 targaheader[7] = 24; /* 24 bits per cmap entry */
67 } 61 }
68 62
69 targaheader[12] = (char) (cinfo->output_width & 0xFF); 63 targaheader[12] = (char) (cinfo->output_width & 0xFF);
70 targaheader[13] = (char) (cinfo->output_width >> 8); 64 targaheader[13] = (char) (cinfo->output_width >> 8);
71 targaheader[14] = (char) (cinfo->output_height & 0xFF); 65 targaheader[14] = (char) (cinfo->output_height & 0xFF);
72 targaheader[15] = (char) (cinfo->output_height >> 8); 66 targaheader[15] = (char) (cinfo->output_height >> 8);
73 targaheader[17] = 0x20;» /* Top-down, non-interlaced */ 67 targaheader[17] = 0x20; /* Top-down, non-interlaced */
74 68
75 if (cinfo->out_color_space == JCS_GRAYSCALE) { 69 if (cinfo->out_color_space == JCS_GRAYSCALE) {
76 targaheader[2] = 3;»» /* image type = uncompressed gray-scale */ 70 targaheader[2] = 3; /* image type = uncompressed grayscale */
77 targaheader[16] = 8;» /* bits per pixel */ 71 targaheader[16] = 8; /* bits per pixel */
78 } else {» » » /* must be RGB */ 72 } else { /* must be RGB */
79 if (num_colors > 0) { 73 if (num_colors > 0) {
80 targaheader[2] = 1;» /* image type = colormapped RGB */ 74 targaheader[2] = 1; /* image type = colormapped RGB */
81 targaheader[16] = 8; 75 targaheader[16] = 8;
82 } else { 76 } else {
83 targaheader[2] = 2;» /* image type = uncompressed RGB */ 77 targaheader[2] = 2; /* image type = uncompressed RGB */
84 targaheader[16] = 24; 78 targaheader[16] = 24;
85 } 79 }
86 } 80 }
87 81
88 if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18) 82 if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18)
89 ERREXIT(cinfo, JERR_FILE_WRITE); 83 ERREXIT(cinfo, JERR_FILE_WRITE);
90 } 84 }
91 85
92 86
93 /* 87 /*
94 * Write some pixel data. 88 * Write some pixel data.
95 * In this module rows_supplied will always be 1. 89 * In this module rows_supplied will always be 1.
96 */ 90 */
97 91
98 METHODDEF(void) 92 METHODDEF(void)
99 put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 93 put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
100 » » JDIMENSION rows_supplied) 94 JDIMENSION rows_supplied)
101 /* used for unquantized full-color output */ 95 /* used for unquantized full-color output */
102 { 96 {
103 tga_dest_ptr dest = (tga_dest_ptr) dinfo; 97 tga_dest_ptr dest = (tga_dest_ptr) dinfo;
104 register JSAMPROW inptr; 98 register JSAMPROW inptr;
105 register char * outptr; 99 register char *outptr;
106 register JDIMENSION col; 100 register JDIMENSION col;
107 101
108 inptr = dest->pub.buffer[0]; 102 inptr = dest->pub.buffer[0];
109 outptr = dest->iobuffer; 103 outptr = dest->iobuffer;
110 for (col = cinfo->output_width; col > 0; col--) { 104 for (col = cinfo->output_width; col > 0; col--) {
111 outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */ 105 outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */
112 outptr[1] = (char) GETJSAMPLE(inptr[1]); 106 outptr[1] = (char) GETJSAMPLE(inptr[1]);
113 outptr[2] = (char) GETJSAMPLE(inptr[0]); 107 outptr[2] = (char) GETJSAMPLE(inptr[0]);
114 inptr += 3, outptr += 3; 108 inptr += 3, outptr += 3;
115 } 109 }
116 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 110 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
117 } 111 }
118 112
119 METHODDEF(void) 113 METHODDEF(void)
120 put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 114 put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
121 » JDIMENSION rows_supplied) 115 JDIMENSION rows_supplied)
122 /* used for grayscale OR quantized color output */ 116 /* used for grayscale OR quantized color output */
123 { 117 {
124 tga_dest_ptr dest = (tga_dest_ptr) dinfo; 118 tga_dest_ptr dest = (tga_dest_ptr) dinfo;
125 register JSAMPROW inptr; 119 register JSAMPROW inptr;
126 register char * outptr; 120 register char *outptr;
127 register JDIMENSION col; 121 register JDIMENSION col;
128 122
129 inptr = dest->pub.buffer[0]; 123 inptr = dest->pub.buffer[0];
130 outptr = dest->iobuffer; 124 outptr = dest->iobuffer;
131 for (col = cinfo->output_width; col > 0; col--) { 125 for (col = cinfo->output_width; col > 0; col--) {
132 *outptr++ = (char) GETJSAMPLE(*inptr++); 126 *outptr++ = (char) GETJSAMPLE(*inptr++);
133 } 127 }
134 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 128 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
135 } 129 }
136 130
137 131
138 /* 132 /*
139 * Write some demapped pixel data when color quantization is in effect. 133 * Write some demapped pixel data when color quantization is in effect.
140 * For Targa, this is only applied to grayscale data. 134 * For Targa, this is only applied to grayscale data.
141 */ 135 */
142 136
143 METHODDEF(void) 137 METHODDEF(void)
144 put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 138 put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
145 » » JDIMENSION rows_supplied) 139 JDIMENSION rows_supplied)
146 { 140 {
147 tga_dest_ptr dest = (tga_dest_ptr) dinfo; 141 tga_dest_ptr dest = (tga_dest_ptr) dinfo;
148 register JSAMPROW inptr; 142 register JSAMPROW inptr;
149 register char * outptr; 143 register char *outptr;
150 register JSAMPROW color_map0 = cinfo->colormap[0]; 144 register JSAMPROW color_map0 = cinfo->colormap[0];
151 register JDIMENSION col; 145 register JDIMENSION col;
152 146
153 inptr = dest->pub.buffer[0]; 147 inptr = dest->pub.buffer[0];
154 outptr = dest->iobuffer; 148 outptr = dest->iobuffer;
155 for (col = cinfo->output_width; col > 0; col--) { 149 for (col = cinfo->output_width; col > 0; col--) {
156 *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]); 150 *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]);
157 } 151 }
158 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 152 (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
159 } 153 }
(...skipping 16 matching lines...) Expand all
176 write_header(cinfo, dinfo, 0); 170 write_header(cinfo, dinfo, 0);
177 if (cinfo->quantize_colors) 171 if (cinfo->quantize_colors)
178 dest->pub.put_pixel_rows = put_demapped_gray; 172 dest->pub.put_pixel_rows = put_demapped_gray;
179 else 173 else
180 dest->pub.put_pixel_rows = put_gray_rows; 174 dest->pub.put_pixel_rows = put_gray_rows;
181 } else if (cinfo->out_color_space == JCS_RGB) { 175 } else if (cinfo->out_color_space == JCS_RGB) {
182 if (cinfo->quantize_colors) { 176 if (cinfo->quantize_colors) {
183 /* We only support 8-bit colormap indexes, so only 256 colors */ 177 /* We only support 8-bit colormap indexes, so only 256 colors */
184 num_colors = cinfo->actual_number_of_colors; 178 num_colors = cinfo->actual_number_of_colors;
185 if (num_colors > 256) 179 if (num_colors > 256)
186 » ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors); 180 ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors);
187 write_header(cinfo, dinfo, num_colors); 181 write_header(cinfo, dinfo, num_colors);
188 /* Write the colormap. Note Targa uses BGR byte order */ 182 /* Write the colormap. Note Targa uses BGR byte order */
189 outfile = dest->pub.output_file; 183 outfile = dest->pub.output_file;
190 for (i = 0; i < num_colors; i++) { 184 for (i = 0; i < num_colors; i++) {
191 » putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile); 185 putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile);
192 » putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile); 186 putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile);
193 » putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile); 187 putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile);
194 } 188 }
195 dest->pub.put_pixel_rows = put_gray_rows; 189 dest->pub.put_pixel_rows = put_gray_rows;
196 } else { 190 } else {
197 write_header(cinfo, dinfo, 0); 191 write_header(cinfo, dinfo, 0);
198 dest->pub.put_pixel_rows = put_pixel_rows; 192 dest->pub.put_pixel_rows = put_pixel_rows;
199 } 193 }
200 } else { 194 } else {
201 ERREXIT(cinfo, JERR_TGA_COLORSPACE); 195 ERREXIT(cinfo, JERR_TGA_COLORSPACE);
202 } 196 }
203 } 197 }
(...skipping 18 matching lines...) Expand all
222 */ 216 */
223 217
224 GLOBAL(djpeg_dest_ptr) 218 GLOBAL(djpeg_dest_ptr)
225 jinit_write_targa (j_decompress_ptr cinfo) 219 jinit_write_targa (j_decompress_ptr cinfo)
226 { 220 {
227 tga_dest_ptr dest; 221 tga_dest_ptr dest;
228 222
229 /* Create module interface object, fill in method pointers */ 223 /* Create module interface object, fill in method pointers */
230 dest = (tga_dest_ptr) 224 dest = (tga_dest_ptr)
231 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 225 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
232 » » » » SIZEOF(tga_dest_struct)); 226 sizeof(tga_dest_struct));
233 dest->pub.start_output = start_output_tga; 227 dest->pub.start_output = start_output_tga;
234 dest->pub.finish_output = finish_output_tga; 228 dest->pub.finish_output = finish_output_tga;
235 229
236 /* Calculate output image dimensions so we can allocate space */ 230 /* Calculate output image dimensions so we can allocate space */
237 jpeg_calc_output_dimensions(cinfo); 231 jpeg_calc_output_dimensions(cinfo);
238 232
239 /* Create I/O buffer. Note we make this near on a PC. */ 233 /* Create I/O buffer. */
240 dest->buffer_width = cinfo->output_width * cinfo->output_components; 234 dest->buffer_width = cinfo->output_width * cinfo->output_components;
241 dest->iobuffer = (char *) 235 dest->iobuffer = (char *)
242 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 236 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
243 » » » » (size_t) (dest->buffer_width * SIZEOF(char))); 237 (size_t) (dest->buffer_width * sizeof(char)));
244 238
245 /* Create decompressor output buffer. */ 239 /* Create decompressor output buffer. */
246 dest->pub.buffer = (*cinfo->mem->alloc_sarray) 240 dest->pub.buffer = (*cinfo->mem->alloc_sarray)
247 ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1); 241 ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1);
248 dest->pub.buffer_height = 1; 242 dest->pub.buffer_height = 1;
249 243
250 return (djpeg_dest_ptr) dest; 244 return (djpeg_dest_ptr) dest;
251 } 245 }
252 246
253 #endif /* TARGA_SUPPORTED */ 247 #endif /* TARGA_SUPPORTED */
OLDNEW
« no previous file with comments | « wrrle.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698