OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "SkImageDecoder.h" | 9 #include "SkImageDecoder.h" |
10 #include "SkImageEncoder.h" | 10 #include "SkImageEncoder.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 SkASSERT(cinfo != NULL); | 58 SkASSERT(cinfo != NULL); |
59 SkASSERT(src_mgr != NULL); | 59 SkASSERT(src_mgr != NULL); |
60 jpeg_create_decompress(cinfo); | 60 jpeg_create_decompress(cinfo); |
61 overwrite_mem_buffer_size(cinfo); | 61 overwrite_mem_buffer_size(cinfo); |
62 cinfo->src = src_mgr; | 62 cinfo->src = src_mgr; |
63 } | 63 } |
64 | 64 |
65 #ifdef SK_BUILD_FOR_ANDROID | 65 #ifdef SK_BUILD_FOR_ANDROID |
66 class SkJPEGImageIndex { | 66 class SkJPEGImageIndex { |
67 public: | 67 public: |
68 SkJPEGImageIndex(SkStream* stream, SkImageDecoder* decoder) | 68 SkJPEGImageIndex(SkStreamRewindable* stream, SkImageDecoder* decoder) |
69 : fSrcMgr(stream, decoder) | 69 : fSrcMgr(stream, decoder) |
70 , fInfoInitialized(false) | 70 , fInfoInitialized(false) |
71 , fHuffmanCreated(false) | 71 , fHuffmanCreated(false) |
72 , fDecompressStarted(false) | 72 , fDecompressStarted(false) |
73 { | 73 { |
74 SkDEBUGCODE(fReadHeaderSucceeded = false;) | 74 SkDEBUGCODE(fReadHeaderSucceeded = false;) |
75 } | 75 } |
76 | 76 |
77 ~SkJPEGImageIndex() { | 77 ~SkJPEGImageIndex() { |
78 if (fHuffmanCreated) { | 78 if (fHuffmanCreated) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 SkDELETE(fImageIndex); | 188 SkDELETE(fImageIndex); |
189 } | 189 } |
190 #endif | 190 #endif |
191 | 191 |
192 virtual Format getFormat() const { | 192 virtual Format getFormat() const { |
193 return kJPEG_Format; | 193 return kJPEG_Format; |
194 } | 194 } |
195 | 195 |
196 protected: | 196 protected: |
197 #ifdef SK_BUILD_FOR_ANDROID | 197 #ifdef SK_BUILD_FOR_ANDROID |
198 virtual bool onBuildTileIndex(SkStream *stream, int *width, int *height) SK_
OVERRIDE; | 198 virtual bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *h
eight) SK_OVERRIDE; |
199 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRI
DE; | 199 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRI
DE; |
200 #endif | 200 #endif |
201 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; | 201 virtual bool onDecode(SkStreamRewindable* stream, SkBitmap* bm, Mode) SK_OVE
RRIDE; |
202 | 202 |
203 private: | 203 private: |
204 #ifdef SK_BUILD_FOR_ANDROID | 204 #ifdef SK_BUILD_FOR_ANDROID |
205 SkJPEGImageIndex* fImageIndex; | 205 SkJPEGImageIndex* fImageIndex; |
206 int fImageWidth; | 206 int fImageWidth; |
207 int fImageHeight; | 207 int fImageHeight; |
208 #endif | 208 #endif |
209 | 209 |
210 /** | 210 /** |
211 * Determine the appropriate bitmap config and out_color_space based on | 211 * Determine the appropriate bitmap config and out_color_space based on |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 if (decoder.getDitherImage()) { | 435 if (decoder.getDitherImage()) { |
436 cinfo->dither_mode = JDITHER_ORDERED; | 436 cinfo->dither_mode = JDITHER_ORDERED; |
437 } | 437 } |
438 break; | 438 break; |
439 default: | 439 default: |
440 break; | 440 break; |
441 } | 441 } |
442 } | 442 } |
443 #endif | 443 #endif |
444 | 444 |
445 bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { | 445 bool SkJPEGImageDecoder::onDecode(SkStreamRewindable* stream, SkBitmap* bm, Mode
mode) { |
446 #ifdef TIME_DECODE | 446 #ifdef TIME_DECODE |
447 SkAutoTime atm("JPEG Decode"); | 447 SkAutoTime atm("JPEG Decode"); |
448 #endif | 448 #endif |
449 | 449 |
450 JPEGAutoClean autoClean; | 450 JPEGAutoClean autoClean; |
451 | 451 |
452 jpeg_decompress_struct cinfo; | 452 jpeg_decompress_struct cinfo; |
453 skjpeg_source_mgr srcManager(stream, this); | 453 skjpeg_source_mgr srcManager(stream, this); |
454 | 454 |
455 skjpeg_error_mgr errorManager; | 455 skjpeg_error_mgr errorManager; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 if (!skip_src_rows(&cinfo, srcRow, | 630 if (!skip_src_rows(&cinfo, srcRow, |
631 cinfo.output_height - cinfo.output_scanline)) { | 631 cinfo.output_height - cinfo.output_scanline)) { |
632 return return_false(cinfo, *bm, "skip rows"); | 632 return return_false(cinfo, *bm, "skip rows"); |
633 } | 633 } |
634 jpeg_finish_decompress(&cinfo); | 634 jpeg_finish_decompress(&cinfo); |
635 | 635 |
636 return true; | 636 return true; |
637 } | 637 } |
638 | 638 |
639 #ifdef SK_BUILD_FOR_ANDROID | 639 #ifdef SK_BUILD_FOR_ANDROID |
640 bool SkJPEGImageDecoder::onBuildTileIndex(SkStream* stream, int *width, int *hei
ght) { | 640 bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width
, int *height) { |
641 | 641 |
642 SkAutoTDelete<SkJPEGImageIndex> imageIndex(SkNEW_ARGS(SkJPEGImageIndex, (str
eam, this))); | 642 SkAutoTDelete<SkJPEGImageIndex> imageIndex(SkNEW_ARGS(SkJPEGImageIndex, (str
eam, this))); |
643 jpeg_decompress_struct* cinfo = imageIndex->cinfo(); | 643 jpeg_decompress_struct* cinfo = imageIndex->cinfo(); |
644 | 644 |
645 skjpeg_error_mgr sk_err; | 645 skjpeg_error_mgr sk_err; |
646 set_error_mgr(cinfo, &sk_err); | 646 set_error_mgr(cinfo, &sk_err); |
647 | 647 |
648 // All objects need to be instantiated before this setjmp call so that | 648 // All objects need to be instantiated before this setjmp call so that |
649 // they will be cleaned up properly if an error occurs. | 649 // they will be cleaned up properly if an error occurs. |
650 if (setjmp(sk_err.fJmpBuf)) { | 650 if (setjmp(sk_err.fJmpBuf)) { |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 | 1113 |
1114 return true; | 1114 return true; |
1115 } | 1115 } |
1116 }; | 1116 }; |
1117 | 1117 |
1118 /////////////////////////////////////////////////////////////////////////////// | 1118 /////////////////////////////////////////////////////////////////////////////// |
1119 DEFINE_DECODER_CREATOR(JPEGImageDecoder); | 1119 DEFINE_DECODER_CREATOR(JPEGImageDecoder); |
1120 DEFINE_ENCODER_CREATOR(JPEGImageEncoder); | 1120 DEFINE_ENCODER_CREATOR(JPEGImageEncoder); |
1121 /////////////////////////////////////////////////////////////////////////////// | 1121 /////////////////////////////////////////////////////////////////////////////// |
1122 | 1122 |
1123 static bool is_jpeg(SkStream* stream) { | 1123 static bool is_jpeg(SkStreamRewindable* stream) { |
1124 static const unsigned char gHeader[] = { 0xFF, 0xD8, 0xFF }; | 1124 static const unsigned char gHeader[] = { 0xFF, 0xD8, 0xFF }; |
1125 static const size_t HEADER_SIZE = sizeof(gHeader); | 1125 static const size_t HEADER_SIZE = sizeof(gHeader); |
1126 | 1126 |
1127 char buffer[HEADER_SIZE]; | 1127 char buffer[HEADER_SIZE]; |
1128 size_t len = stream->read(buffer, HEADER_SIZE); | 1128 size_t len = stream->read(buffer, HEADER_SIZE); |
1129 | 1129 |
1130 if (len != HEADER_SIZE) { | 1130 if (len != HEADER_SIZE) { |
1131 return false; // can't read enough | 1131 return false; // can't read enough |
1132 } | 1132 } |
1133 if (memcmp(buffer, gHeader, HEADER_SIZE)) { | 1133 if (memcmp(buffer, gHeader, HEADER_SIZE)) { |
1134 return false; | 1134 return false; |
1135 } | 1135 } |
1136 return true; | 1136 return true; |
1137 } | 1137 } |
1138 | 1138 |
1139 #include "SkTRegistry.h" | 1139 #include "SkTRegistry.h" |
1140 | 1140 |
1141 static SkImageDecoder* sk_libjpeg_dfactory(SkStream* stream) { | 1141 static SkImageDecoder* sk_libjpeg_dfactory(SkStreamRewindable* stream) { |
1142 if (is_jpeg(stream)) { | 1142 if (is_jpeg(stream)) { |
1143 return SkNEW(SkJPEGImageDecoder); | 1143 return SkNEW(SkJPEGImageDecoder); |
1144 } | 1144 } |
1145 return NULL; | 1145 return NULL; |
1146 } | 1146 } |
1147 | 1147 |
1148 static SkImageDecoder::Format get_format_jpeg(SkStream* stream) { | 1148 static SkImageDecoder::Format get_format_jpeg(SkStreamRewindable* stream) { |
1149 if (is_jpeg(stream)) { | 1149 if (is_jpeg(stream)) { |
1150 return SkImageDecoder::kJPEG_Format; | 1150 return SkImageDecoder::kJPEG_Format; |
1151 } | 1151 } |
1152 return SkImageDecoder::kUnknown_Format; | 1152 return SkImageDecoder::kUnknown_Format; |
1153 } | 1153 } |
1154 | 1154 |
1155 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { | 1155 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { |
1156 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; | 1156 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; |
1157 } | 1157 } |
1158 | 1158 |
1159 | 1159 |
1160 static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libjpeg_dfactory); | 1160 static SkTRegistry<SkImageDecoder*, SkStreamRewindable*> gDReg(sk_libjpeg_dfacto
ry); |
1161 static SkTRegistry<SkImageDecoder::Format, SkStream*> gFormatReg(get_format_jpeg
); | 1161 static SkTRegistry<SkImageDecoder::Format, SkStreamRewindable*> gFormatReg(get_f
ormat_jpeg); |
1162 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efact
ory); | 1162 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efact
ory); |
OLD | NEW |