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

Side by Side Diff: src/images/SkImageDecoder_libjpeg.cpp

Issue 23477009: Change SkImageDecoders to take an SkStreamRewindable. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Remove accidental whitespace change Created 7 years, 3 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698