OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/codec/jpeg_codec.h" | 5 #include "ui/gfx/codec/jpeg_codec.h" |
6 | 6 |
7 #include <setjmp.h> | 7 #include <setjmp.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | 136 |
137 // update the used byte based on the next byte libjpeg would write to | 137 // update the used byte based on the next byte libjpeg would write to |
138 state->image_buffer_used = cinfo->dest->next_output_byte - &(*state->out)[0]; | 138 state->image_buffer_used = cinfo->dest->next_output_byte - &(*state->out)[0]; |
139 DCHECK(state->image_buffer_used < state->out->size()) << | 139 DCHECK(state->image_buffer_used < state->out->size()) << |
140 "JPEG library busted, got a bad image buffer size"; | 140 "JPEG library busted, got a bad image buffer size"; |
141 | 141 |
142 // update our buffer so that it exactly encompases the desired data | 142 // update our buffer so that it exactly encompases the desired data |
143 state->out->resize(state->image_buffer_used); | 143 state->out->resize(state->image_buffer_used); |
144 } | 144 } |
145 | 145 |
| 146 #if !defined(JCS_EXTENSIONS) |
146 // Converts RGBA to RGB (removing the alpha values) to prepare to send data to | 147 // Converts RGBA to RGB (removing the alpha values) to prepare to send data to |
147 // libjpeg. This converts one row of data in rgba with the given width in | 148 // libjpeg. This converts one row of data in rgba with the given width in |
148 // pixels the the given rgb destination buffer (which should have enough space | 149 // pixels the the given rgb destination buffer (which should have enough space |
149 // reserved for the final data). | 150 // reserved for the final data). |
150 void StripAlpha(const unsigned char* rgba, int pixel_width, unsigned char* rgb) | 151 void StripAlpha(const unsigned char* rgba, int pixel_width, unsigned char* rgb) |
151 { | 152 { |
152 for (int x = 0; x < pixel_width; x++) { | 153 for (int x = 0; x < pixel_width; x++) { |
153 const unsigned char* pixel_in = &rgba[x * 4]; | 154 const unsigned char* pixel_in = &rgba[x * 4]; |
154 unsigned char* pixel_out = &rgb[x * 3]; | 155 unsigned char* pixel_out = &rgb[x * 3]; |
155 pixel_out[0] = pixel_in[0]; | 156 pixel_out[0] = pixel_in[0]; |
156 pixel_out[1] = pixel_in[1]; | 157 pixel_out[1] = pixel_in[1]; |
157 pixel_out[2] = pixel_in[2]; | 158 pixel_out[2] = pixel_in[2]; |
158 } | 159 } |
159 } | 160 } |
160 | 161 |
161 // Converts BGRA to RGB by reordering the color components and dropping the | 162 // Converts BGRA to RGB by reordering the color components and dropping the |
162 // alpha. This converts one row of data in rgba with the given width in | 163 // alpha. This converts one row of data in rgba with the given width in |
163 // pixels the the given rgb destination buffer (which should have enough space | 164 // pixels the the given rgb destination buffer (which should have enough space |
164 // reserved for the final data). | 165 // reserved for the final data). |
165 void BGRAtoRGB(const unsigned char* bgra, int pixel_width, unsigned char* rgb) | 166 void BGRAtoRGB(const unsigned char* bgra, int pixel_width, unsigned char* rgb) |
166 { | 167 { |
167 for (int x = 0; x < pixel_width; x++) { | 168 for (int x = 0; x < pixel_width; x++) { |
168 const unsigned char* pixel_in = &bgra[x * 4]; | 169 const unsigned char* pixel_in = &bgra[x * 4]; |
169 unsigned char* pixel_out = &rgb[x * 3]; | 170 unsigned char* pixel_out = &rgb[x * 3]; |
170 pixel_out[0] = pixel_in[2]; | 171 pixel_out[0] = pixel_in[2]; |
171 pixel_out[1] = pixel_in[1]; | 172 pixel_out[1] = pixel_in[1]; |
172 pixel_out[2] = pixel_in[0]; | 173 pixel_out[2] = pixel_in[0]; |
173 } | 174 } |
174 } | 175 } |
| 176 #endif // !defined(JCS_EXTENSIONS) |
175 | 177 |
176 // This class destroys the given jpeg_compress object when it goes out of | 178 // This class destroys the given jpeg_compress object when it goes out of |
177 // scope. It simplifies the error handling in Encode (and even applies to the | 179 // scope. It simplifies the error handling in Encode (and even applies to the |
178 // success case). | 180 // success case). |
179 class CompressDestroyer { | 181 class CompressDestroyer { |
180 public: | 182 public: |
181 CompressDestroyer() : cinfo_(NULL) { | 183 CompressDestroyer() : cinfo_(NULL) { |
182 } | 184 } |
183 ~CompressDestroyer() { | 185 ~CompressDestroyer() { |
184 DestroyManagedObject(); | 186 DestroyManagedObject(); |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 388 |
387 // Our source doesn't need any cleanup, so this is a NOP. | 389 // Our source doesn't need any cleanup, so this is a NOP. |
388 // | 390 // |
389 // From the JPEG library: | 391 // From the JPEG library: |
390 // "Terminate source --- called by jpeg_finish_decompress() after all data has | 392 // "Terminate source --- called by jpeg_finish_decompress() after all data has |
391 // been read to clean up JPEG source manager. NOT called by jpeg_abort() or | 393 // been read to clean up JPEG source manager. NOT called by jpeg_abort() or |
392 // jpeg_destroy()." | 394 // jpeg_destroy()." |
393 void TermSource(j_decompress_ptr cinfo) { | 395 void TermSource(j_decompress_ptr cinfo) { |
394 } | 396 } |
395 | 397 |
| 398 #if !defined(JCS_EXTENSIONS) |
396 // Converts one row of rgb data to rgba data by adding a fully-opaque alpha | 399 // Converts one row of rgb data to rgba data by adding a fully-opaque alpha |
397 // value. | 400 // value. |
398 void AddAlpha(const unsigned char* rgb, int pixel_width, unsigned char* rgba) { | 401 void AddAlpha(const unsigned char* rgb, int pixel_width, unsigned char* rgba) { |
399 for (int x = 0; x < pixel_width; x++) { | 402 for (int x = 0; x < pixel_width; x++) { |
400 const unsigned char* pixel_in = &rgb[x * 3]; | 403 const unsigned char* pixel_in = &rgb[x * 3]; |
401 unsigned char* pixel_out = &rgba[x * 4]; | 404 unsigned char* pixel_out = &rgba[x * 4]; |
402 pixel_out[0] = pixel_in[0]; | 405 pixel_out[0] = pixel_in[0]; |
403 pixel_out[1] = pixel_in[1]; | 406 pixel_out[1] = pixel_in[1]; |
404 pixel_out[2] = pixel_in[2]; | 407 pixel_out[2] = pixel_in[2]; |
405 pixel_out[3] = 0xff; | 408 pixel_out[3] = 0xff; |
406 } | 409 } |
407 } | 410 } |
408 | 411 |
409 // Converts one row of RGB data to BGRA by reordering the color components and | 412 // Converts one row of RGB data to BGRA by reordering the color components and |
410 // adding alpha values of 0xff. | 413 // adding alpha values of 0xff. |
411 void RGBtoBGRA(const unsigned char* bgra, int pixel_width, unsigned char* rgb) | 414 void RGBtoBGRA(const unsigned char* bgra, int pixel_width, unsigned char* rgb) |
412 { | 415 { |
413 for (int x = 0; x < pixel_width; x++) { | 416 for (int x = 0; x < pixel_width; x++) { |
414 const unsigned char* pixel_in = &bgra[x * 3]; | 417 const unsigned char* pixel_in = &bgra[x * 3]; |
415 unsigned char* pixel_out = &rgb[x * 4]; | 418 unsigned char* pixel_out = &rgb[x * 4]; |
416 pixel_out[0] = pixel_in[2]; | 419 pixel_out[0] = pixel_in[2]; |
417 pixel_out[1] = pixel_in[1]; | 420 pixel_out[1] = pixel_in[1]; |
418 pixel_out[2] = pixel_in[0]; | 421 pixel_out[2] = pixel_in[0]; |
419 pixel_out[3] = 0xff; | 422 pixel_out[3] = 0xff; |
420 } | 423 } |
421 } | 424 } |
| 425 #endif // !defined(JCS_EXTENSIONS) |
422 | 426 |
423 // This class destroys the given jpeg_decompress object when it goes out of | 427 // This class destroys the given jpeg_decompress object when it goes out of |
424 // scope. It simplifies the error handling in Decode (and even applies to the | 428 // scope. It simplifies the error handling in Decode (and even applies to the |
425 // success case). | 429 // success case). |
426 class DecompressDestroyer { | 430 class DecompressDestroyer { |
427 public: | 431 public: |
428 DecompressDestroyer() : cinfo_(NULL) { | 432 DecompressDestroyer() : cinfo_(NULL) { |
429 } | 433 } |
430 ~DecompressDestroyer() { | 434 ~DecompressDestroyer() { |
431 DestroyManagedObject(); | 435 DestroyManagedObject(); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 | 616 |
613 SkBitmap* bitmap = new SkBitmap(); | 617 SkBitmap* bitmap = new SkBitmap(); |
614 bitmap->setConfig(SkBitmap::kARGB_8888_Config, w, h); | 618 bitmap->setConfig(SkBitmap::kARGB_8888_Config, w, h); |
615 bitmap->allocPixels(); | 619 bitmap->allocPixels(); |
616 memcpy(bitmap->getAddr32(0, 0), &data_vector[0], data_length); | 620 memcpy(bitmap->getAddr32(0, 0), &data_vector[0], data_length); |
617 | 621 |
618 return bitmap; | 622 return bitmap; |
619 } | 623 } |
620 | 624 |
621 } // namespace gfx | 625 } // namespace gfx |
OLD | NEW |