| 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 #ifndef SkImageDecoder_DEFINED | 10 #ifndef SkImageDecoder_DEFINED |
| 11 #define SkImageDecoder_DEFINED | 11 #define SkImageDecoder_DEFINED |
| 12 | 12 |
| 13 #include "SkBitmap.h" | 13 #include "SkBitmap.h" |
| 14 #include "SkBitmapFactory.h" | 14 #include "SkBitmapFactory.h" |
| 15 #include "SkImage.h" | 15 #include "SkImage.h" |
| 16 #include "SkRect.h" | 16 #include "SkRect.h" |
| 17 #include "SkRefCnt.h" | 17 #include "SkRefCnt.h" |
| 18 #include "SkTRegistry.h" | 18 #include "SkTRegistry.h" |
| 19 #include "SkTypes.h" | 19 #include "SkTypes.h" |
| 20 | 20 |
| 21 class SkStream; | 21 class SkStream; |
| 22 class SkStreamRewindable; |
| 22 | 23 |
| 23 /** \class SkImageDecoder | 24 /** \class SkImageDecoder |
| 24 | 25 |
| 25 Base class for decoding compressed images into a SkBitmap | 26 Base class for decoding compressed images into a SkBitmap |
| 26 */ | 27 */ |
| 27 class SkImageDecoder : public SkNoncopyable { | 28 class SkImageDecoder : public SkNoncopyable { |
| 28 public: | 29 public: |
| 29 virtual ~SkImageDecoder(); | 30 virtual ~SkImageDecoder(); |
| 30 | 31 |
| 31 enum Format { | 32 enum Format { |
| 32 kUnknown_Format, | 33 kUnknown_Format, |
| 33 kBMP_Format, | 34 kBMP_Format, |
| 34 kGIF_Format, | 35 kGIF_Format, |
| 35 kICO_Format, | 36 kICO_Format, |
| 36 kJPEG_Format, | 37 kJPEG_Format, |
| 37 kPNG_Format, | 38 kPNG_Format, |
| 38 kWBMP_Format, | 39 kWBMP_Format, |
| 39 kWEBP_Format, | 40 kWEBP_Format, |
| 40 | 41 |
| 41 kLastKnownFormat = kWEBP_Format, | 42 kLastKnownFormat = kWEBP_Format, |
| 42 }; | 43 }; |
| 43 | 44 |
| 44 /** Return the format of image this decoder can decode. If this decoder can
decode multiple | 45 /** Return the format of image this decoder can decode. If this decoder can
decode multiple |
| 45 formats, kUnknown_Format will be returned. | 46 formats, kUnknown_Format will be returned. |
| 46 */ | 47 */ |
| 47 virtual Format getFormat() const; | 48 virtual Format getFormat() const; |
| 48 | 49 |
| 49 /** Return the format of the SkStream or kUnknown_Format if it cannot be det
ermined. Rewinds the | 50 /** Return the format of the SkStreamRewindable or kUnknown_Format if it can
not be determined. |
| 50 stream before returning. | 51 Rewinds the stream before returning. |
| 51 */ | 52 */ |
| 52 static Format GetStreamFormat(SkStream*); | 53 static Format GetStreamFormat(SkStreamRewindable*); |
| 53 | 54 |
| 54 /** Return a readable string of the Format provided. | 55 /** Return a readable string of the Format provided. |
| 55 */ | 56 */ |
| 56 static const char* GetFormatName(Format); | 57 static const char* GetFormatName(Format); |
| 57 | 58 |
| 58 /** Return a readable string of the value returned by getFormat(). | 59 /** Return a readable string of the value returned by getFormat(). |
| 59 */ | 60 */ |
| 60 const char* getFormatName() const; | 61 const char* getFormatName() const; |
| 61 | 62 |
| 62 /** Returns true if the decoder should try to dither the resulting image. | 63 /** Returns true if the decoder should try to dither the resulting image. |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 return this->decode(stream, bitmap, SkBitmap::kNo_Config, mode); | 284 return this->decode(stream, bitmap, SkBitmap::kNo_Config, mode); |
| 284 } | 285 } |
| 285 | 286 |
| 286 /** | 287 /** |
| 287 * Given a stream, build an index for doing tile-based decode. | 288 * Given a stream, build an index for doing tile-based decode. |
| 288 * The built index will be saved in the decoder, and the image size will | 289 * The built index will be saved in the decoder, and the image size will |
| 289 * be returned in width and height. | 290 * be returned in width and height. |
| 290 * | 291 * |
| 291 * Return true for success or false on failure. | 292 * Return true for success or false on failure. |
| 292 */ | 293 */ |
| 293 bool buildTileIndex(SkStream*, int *width, int *height); | 294 bool buildTileIndex(SkStreamRewindable*, int *width, int *height); |
| 294 | 295 |
| 295 /** | 296 /** |
| 296 * Decode a rectangle subset in the image. | 297 * Decode a rectangle subset in the image. |
| 297 * The method can only be called after buildTileIndex(). | 298 * The method can only be called after buildTileIndex(). |
| 298 * | 299 * |
| 299 * Return true for success. | 300 * Return true for success. |
| 300 * Return false if the index is never built or failing in decoding. | 301 * Return false if the index is never built or failing in decoding. |
| 301 */ | 302 */ |
| 302 bool decodeSubset(SkBitmap* bm, const SkIRect& subset, SkBitmap::Config pref
); | 303 bool decodeSubset(SkBitmap* bm, const SkIRect& subset, SkBitmap::Config pref
); |
| 303 | 304 |
| 304 /** | 305 /** |
| 305 * @Deprecated | 306 * @Deprecated |
| 306 * Use decodeSubset instead. | 307 * Use decodeSubset instead. |
| 307 */ | 308 */ |
| 308 bool decodeRegion(SkBitmap* bitmap, const SkIRect& rect, SkBitmap::Config pr
ef) { | 309 bool decodeRegion(SkBitmap* bitmap, const SkIRect& rect, SkBitmap::Config pr
ef) { |
| 309 return this->decodeSubset(bitmap, rect, pref); | 310 return this->decodeSubset(bitmap, rect, pref); |
| 310 } | 311 } |
| 311 | 312 |
| 312 /** Given a stream, this will try to find an appropriate decoder object. | 313 /** Given a stream, this will try to find an appropriate decoder object. |
| 313 If none is found, the method returns NULL. | 314 If none is found, the method returns NULL. |
| 314 */ | 315 */ |
| 315 static SkImageDecoder* Factory(SkStream*); | 316 static SkImageDecoder* Factory(SkStreamRewindable*); |
| 316 | 317 |
| 317 /** Decode the image stored in the specified file, and store the result | 318 /** Decode the image stored in the specified file, and store the result |
| 318 in bitmap. Return true for success or false on failure. | 319 in bitmap. Return true for success or false on failure. |
| 319 | 320 |
| 320 @param prefConfig If the PrefConfigTable is not set, prefer this config. | 321 @param prefConfig If the PrefConfigTable is not set, prefer this config. |
| 321 See NOTE ABOUT PREFERRED CONFIGS. | 322 See NOTE ABOUT PREFERRED CONFIGS. |
| 322 | 323 |
| 323 @param format On success, if format is non-null, it is set to the format | 324 @param format On success, if format is non-null, it is set to the format |
| 324 of the decoded file. On failure it is ignored. | 325 of the decoded file. On failure it is ignored. |
| 325 */ | 326 */ |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 * target.fAddr = malloc/other allocation | 368 * target.fAddr = malloc/other allocation |
| 368 * target.fRowBytes = ... | 369 * target.fRowBytes = ... |
| 369 * // Now decode the actual pixels into target. &info is optional, | 370 * // Now decode the actual pixels into target. &info is optional, |
| 370 * // and could be NULL | 371 * // and could be NULL |
| 371 * success = DecodeMemoryToTarget(src, size, &info, &target); | 372 * success = DecodeMemoryToTarget(src, size, &info, &target); |
| 372 * </code> | 373 * </code> |
| 373 */ | 374 */ |
| 374 static bool DecodeMemoryToTarget(const void* buffer, size_t size, SkImage::I
nfo* info, | 375 static bool DecodeMemoryToTarget(const void* buffer, size_t size, SkImage::I
nfo* info, |
| 375 const SkBitmapFactory::Target* target); | 376 const SkBitmapFactory::Target* target); |
| 376 | 377 |
| 377 /** Decode the image stored in the specified SkStream, and store the result | 378 /** Decode the image stored in the specified SkStreamRewindable, and store t
he result |
| 378 in bitmap. Return true for success or false on failure. | 379 in bitmap. Return true for success or false on failure. |
| 379 | 380 |
| 380 @param prefConfig If the PrefConfigTable is not set, prefer this config. | 381 @param prefConfig If the PrefConfigTable is not set, prefer this config. |
| 381 See NOTE ABOUT PREFERRED CONFIGS. | 382 See NOTE ABOUT PREFERRED CONFIGS. |
| 382 | 383 |
| 383 @param format On success, if format is non-null, it is set to the format | 384 @param format On success, if format is non-null, it is set to the format |
| 384 of the decoded stream. On failure it is ignored. | 385 of the decoded stream. On failure it is ignored. |
| 385 */ | 386 */ |
| 386 static bool DecodeStream(SkStream* stream, SkBitmap* bitmap, | 387 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap, |
| 387 SkBitmap::Config prefConfig, Mode, | 388 SkBitmap::Config prefConfig, Mode, |
| 388 Format* format = NULL); | 389 Format* format = NULL); |
| 389 static bool DecodeStream(SkStream* stream, SkBitmap* bitmap) { | 390 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap) { |
| 390 return DecodeStream(stream, bitmap, SkBitmap::kNo_Config, | 391 return DecodeStream(stream, bitmap, SkBitmap::kNo_Config, |
| 391 kDecodePixels_Mode, NULL); | 392 kDecodePixels_Mode, NULL); |
| 392 } | 393 } |
| 393 | 394 |
| 394 /** Return the default config for the running device. | 395 /** Return the default config for the running device. |
| 395 Currently this used as a suggestion to image decoders that need to guess | 396 Currently this used as a suggestion to image decoders that need to guess |
| 396 what config they should decode into. | 397 what config they should decode into. |
| 397 Default is kNo_Config, but this can be changed with SetDeviceConfig() | 398 Default is kNo_Config, but this can be changed with SetDeviceConfig() |
| 398 */ | 399 */ |
| 399 static SkBitmap::Config GetDeviceConfig(); | 400 static SkBitmap::Config GetDeviceConfig(); |
| 400 /** Set the default config for the running device. | 401 /** Set the default config for the running device. |
| 401 Currently this used as a suggestion to image decoders that need to guess | 402 Currently this used as a suggestion to image decoders that need to guess |
| 402 what config they should decode into. | 403 what config they should decode into. |
| 403 Default is kNo_Config. | 404 Default is kNo_Config. |
| 404 This can be queried with GetDeviceConfig() | 405 This can be queried with GetDeviceConfig() |
| 405 */ | 406 */ |
| 406 static void SetDeviceConfig(SkBitmap::Config); | 407 static void SetDeviceConfig(SkBitmap::Config); |
| 407 | 408 |
| 408 protected: | 409 protected: |
| 409 // must be overridden in subclasses. This guy is called by decode(...) | 410 // must be overridden in subclasses. This guy is called by decode(...) |
| 410 virtual bool onDecode(SkStream*, SkBitmap* bitmap, Mode) = 0; | 411 virtual bool onDecode(SkStream*, SkBitmap* bitmap, Mode) = 0; |
| 411 | 412 |
| 412 // If the decoder wants to support tiled based decoding, | 413 // If the decoder wants to support tiled based decoding, |
| 413 // this method must be overridden. This guy is called by buildTileIndex(...) | 414 // this method must be overridden. This guy is called by buildTileIndex(...) |
| 414 virtual bool onBuildTileIndex(SkStream*, int *width, int *height) { | 415 virtual bool onBuildTileIndex(SkStreamRewindable*, int *width, int *height)
{ |
| 415 return false; | 416 return false; |
| 416 } | 417 } |
| 417 | 418 |
| 418 // If the decoder wants to support tiled based decoding, | 419 // If the decoder wants to support tiled based decoding, |
| 419 // this method must be overridden. This guy is called by decodeRegion(...) | 420 // this method must be overridden. This guy is called by decodeRegion(...) |
| 420 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) { | 421 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) { |
| 421 return false; | 422 return false; |
| 422 } | 423 } |
| 423 | 424 |
| 424 /* | 425 /* |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 /** Calling newDecoder with a stream returns a new matching imagedecoder | 516 /** Calling newDecoder with a stream returns a new matching imagedecoder |
| 516 instance, or NULL if none can be found. The caller must manage its ownership | 517 instance, or NULL if none can be found. The caller must manage its ownership |
| 517 of the stream as usual, calling unref() when it is done, as the returned | 518 of the stream as usual, calling unref() when it is done, as the returned |
| 518 decoder may have called ref() (and if so, the decoder is responsible for | 519 decoder may have called ref() (and if so, the decoder is responsible for |
| 519 balancing its ownership when it is destroyed). | 520 balancing its ownership when it is destroyed). |
| 520 */ | 521 */ |
| 521 class SkImageDecoderFactory : public SkRefCnt { | 522 class SkImageDecoderFactory : public SkRefCnt { |
| 522 public: | 523 public: |
| 523 SK_DECLARE_INST_COUNT(SkImageDecoderFactory) | 524 SK_DECLARE_INST_COUNT(SkImageDecoderFactory) |
| 524 | 525 |
| 525 virtual SkImageDecoder* newDecoder(SkStream*) = 0; | 526 virtual SkImageDecoder* newDecoder(SkStreamRewindable*) = 0; |
| 526 | 527 |
| 527 private: | 528 private: |
| 528 typedef SkRefCnt INHERITED; | 529 typedef SkRefCnt INHERITED; |
| 529 }; | 530 }; |
| 530 | 531 |
| 531 class SkDefaultImageDecoderFactory : SkImageDecoderFactory { | 532 class SkDefaultImageDecoderFactory : SkImageDecoderFactory { |
| 532 public: | 533 public: |
| 533 // calls SkImageDecoder::Factory(stream) | 534 // calls SkImageDecoder::Factory(stream) |
| 534 virtual SkImageDecoder* newDecoder(SkStream* stream) { | 535 virtual SkImageDecoder* newDecoder(SkStreamRewindable* stream) { |
| 535 return SkImageDecoder::Factory(stream); | 536 return SkImageDecoder::Factory(stream); |
| 536 } | 537 } |
| 537 }; | 538 }; |
| 538 | 539 |
| 539 // This macro declares a global (i.e., non-class owned) creation entry point | 540 // This macro declares a global (i.e., non-class owned) creation entry point |
| 540 // for each decoder (e.g., CreateJPEGImageDecoder) | 541 // for each decoder (e.g., CreateJPEGImageDecoder) |
| 541 #define DECLARE_DECODER_CREATOR(codec) \ | 542 #define DECLARE_DECODER_CREATOR(codec) \ |
| 542 SkImageDecoder *Create ## codec (); | 543 SkImageDecoder *Create ## codec (); |
| 543 | 544 |
| 544 // This macro defines the global creation entry point for each decoder. Each | 545 // This macro defines the global creation entry point for each decoder. Each |
| 545 // decoder implementation that registers with the decoder factory must call it. | 546 // decoder implementation that registers with the decoder factory must call it. |
| 546 #define DEFINE_DECODER_CREATOR(codec) \ | 547 #define DEFINE_DECODER_CREATOR(codec) \ |
| 547 SkImageDecoder *Create ## codec () { \ | 548 SkImageDecoder *Create ## codec () { \ |
| 548 return SkNEW( Sk ## codec ); \ | 549 return SkNEW( Sk ## codec ); \ |
| 549 } | 550 } |
| 550 | 551 |
| 551 // All the decoders known by Skia. Note that, depending on the compiler settings
, | 552 // All the decoders known by Skia. Note that, depending on the compiler settings
, |
| 552 // not all of these will be available | 553 // not all of these will be available |
| 553 DECLARE_DECODER_CREATOR(BMPImageDecoder); | 554 DECLARE_DECODER_CREATOR(BMPImageDecoder); |
| 554 DECLARE_DECODER_CREATOR(GIFImageDecoder); | 555 DECLARE_DECODER_CREATOR(GIFImageDecoder); |
| 555 DECLARE_DECODER_CREATOR(ICOImageDecoder); | 556 DECLARE_DECODER_CREATOR(ICOImageDecoder); |
| 556 DECLARE_DECODER_CREATOR(JPEGImageDecoder); | 557 DECLARE_DECODER_CREATOR(JPEGImageDecoder); |
| 557 DECLARE_DECODER_CREATOR(PNGImageDecoder); | 558 DECLARE_DECODER_CREATOR(PNGImageDecoder); |
| 558 DECLARE_DECODER_CREATOR(WBMPImageDecoder); | 559 DECLARE_DECODER_CREATOR(WBMPImageDecoder); |
| 559 DECLARE_DECODER_CREATOR(WEBPImageDecoder); | 560 DECLARE_DECODER_CREATOR(WEBPImageDecoder); |
| 560 | 561 |
| 561 | 562 |
| 562 // Typedefs to make registering decoder and formatter callbacks easier. | 563 // Typedefs to make registering decoder and formatter callbacks easier. |
| 563 // These have to be defined outside SkImageDecoder. :( | 564 // These have to be defined outside SkImageDecoder. :( |
| 564 typedef SkTRegistry<SkImageDecoder*(*)(SkStream*)> SkImageDecoder_DecodeR
eg; | 565 typedef SkTRegistry<SkImageDecoder*(*)(SkStreamRewindable*)> SkImageDecod
er_DecodeReg; |
| 565 typedef SkTRegistry<SkImageDecoder::Format(*)(SkStream*)> SkImageDecoder_FormatR
eg; | 566 typedef SkTRegistry<SkImageDecoder::Format(*)(SkStreamRewindable*)> SkImageDecod
er_FormatReg; |
| 566 | 567 |
| 567 #endif | 568 #endif |
| OLD | NEW |