OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkImageDecoder.h" | 10 #include "SkImageDecoder.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 }; | 40 }; |
41 | 41 |
42 class SkPNGImageDecoder : public SkImageDecoder { | 42 class SkPNGImageDecoder : public SkImageDecoder { |
43 public: | 43 public: |
44 SkPNGImageDecoder() { | 44 SkPNGImageDecoder() { |
45 fImageIndex = NULL; | 45 fImageIndex = NULL; |
46 } | 46 } |
47 virtual Format getFormat() const SK_OVERRIDE { | 47 virtual Format getFormat() const SK_OVERRIDE { |
48 return kPNG_Format; | 48 return kPNG_Format; |
49 } | 49 } |
| 50 |
| 51 virtual Format onGetFormat(SkStream*) const SK_OVERRIDE; |
| 52 |
50 virtual ~SkPNGImageDecoder() { | 53 virtual ~SkPNGImageDecoder() { |
51 SkDELETE(fImageIndex); | 54 SkDELETE(fImageIndex); |
52 } | 55 } |
53 | 56 |
54 protected: | 57 protected: |
55 #ifdef SK_BUILD_FOR_ANDROID | 58 #ifdef SK_BUILD_FOR_ANDROID |
56 virtual bool onBuildTileIndex(SkStream *stream, int *width, int *height) SK_
OVERRIDE; | 59 virtual bool onBuildTileIndex(SkStream *stream, int *width, int *height) SK_
OVERRIDE; |
57 virtual bool onDecodeRegion(SkBitmap* bitmap, const SkIRect& region) SK_OVER
RIDE; | 60 virtual bool onDecodeRegion(SkBitmap* bitmap, const SkIRect& region) SK_OVER
RIDE; |
58 #endif | 61 #endif |
59 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; | 62 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; |
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 srcImage += bitmap.rowBytes(); | 1075 srcImage += bitmap.rowBytes(); |
1073 } | 1076 } |
1074 | 1077 |
1075 png_write_end(png_ptr, info_ptr); | 1078 png_write_end(png_ptr, info_ptr); |
1076 | 1079 |
1077 /* clean up after the write, and free any memory allocated */ | 1080 /* clean up after the write, and free any memory allocated */ |
1078 png_destroy_write_struct(&png_ptr, &info_ptr); | 1081 png_destroy_write_struct(&png_ptr, &info_ptr); |
1079 return true; | 1082 return true; |
1080 } | 1083 } |
1081 | 1084 |
| 1085 static bool is_png(SkStream* stream) { |
| 1086 char buf[PNG_BYTES_TO_CHECK]; |
| 1087 if (stream->read(buf, PNG_BYTES_TO_CHECK) == PNG_BYTES_TO_CHECK && |
| 1088 !png_sig_cmp((png_bytep) buf, (png_size_t)0, PNG_BYTES_TO_CHECK)) { |
| 1089 return true; |
| 1090 } |
| 1091 return false; |
| 1092 } |
| 1093 |
| 1094 SkImageDecoder::Format SkPNGImageDecoder::onGetFormat(SkStream* stream) const { |
| 1095 if (is_png(stream)) { |
| 1096 return kPNG_Format; |
| 1097 } |
| 1098 return kUnknown_Format; |
| 1099 } |
| 1100 |
1082 /////////////////////////////////////////////////////////////////////////////// | 1101 /////////////////////////////////////////////////////////////////////////////// |
1083 DEFINE_DECODER_CREATOR(PNGImageDecoder); | 1102 DEFINE_DECODER_CREATOR(PNGImageDecoder); |
1084 DEFINE_ENCODER_CREATOR(PNGImageEncoder); | 1103 DEFINE_ENCODER_CREATOR(PNGImageEncoder); |
1085 /////////////////////////////////////////////////////////////////////////////// | 1104 /////////////////////////////////////////////////////////////////////////////// |
1086 | 1105 |
1087 #include "SkTRegistry.h" | 1106 #include "SkTRegistry.h" |
1088 | 1107 |
1089 SkImageDecoder* sk_libpng_dfactory(SkStream* stream) { | 1108 SkImageDecoder* sk_libpng_dfactory(SkStream* stream) { |
1090 char buf[PNG_BYTES_TO_CHECK]; | 1109 if (is_png(stream)) { |
1091 if (stream->read(buf, PNG_BYTES_TO_CHECK) == PNG_BYTES_TO_CHECK && | |
1092 !png_sig_cmp((png_bytep) buf, (png_size_t)0, PNG_BYTES_TO_CHECK)) { | |
1093 return SkNEW(SkPNGImageDecoder); | 1110 return SkNEW(SkPNGImageDecoder); |
1094 } | 1111 } |
1095 return NULL; | 1112 return NULL; |
1096 } | 1113 } |
1097 | 1114 |
1098 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { | 1115 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { |
1099 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; | 1116 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; |
1100 } | 1117 } |
1101 | 1118 |
1102 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libpng_efacto
ry); | 1119 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libpng_efacto
ry); |
1103 static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libpng_dfactory); | 1120 static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libpng_dfactory); |
OLD | NEW |