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

Side by Side Diff: include/core/SkImageDecoder.h

Issue 334793002: hide Config in SkImageDecoder -- use SkColorType instead (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix warning Created 6 years, 6 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
« no previous file with comments | « gyp/skia_for_android_framework_defines.gypi ('k') | samplecode/SampleFilter2.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 232
233 This state is automatically reset at the beginning of decode(). 233 This state is automatically reset at the beginning of decode().
234 */ 234 */
235 void cancelDecode() { 235 void cancelDecode() {
236 // now the subclass must query shouldCancelDecode() to be informed 236 // now the subclass must query shouldCancelDecode() to be informed
237 // of the request 237 // of the request
238 fShouldCancelDecode = true; 238 fShouldCancelDecode = true;
239 } 239 }
240 240
241 /** Passed to the decode method. If kDecodeBounds_Mode is passed, then 241 /** Passed to the decode method. If kDecodeBounds_Mode is passed, then
242 only the bitmap's width/height/config need be set. If kDecodePixels_Mode 242 only the bitmap's info need be set. If kDecodePixels_Mode
243 is passed, then the bitmap must have pixels or a pixelRef. 243 is passed, then the bitmap must have pixels or a pixelRef.
244 */ 244 */
245 enum Mode { 245 enum Mode {
246 kDecodeBounds_Mode, //!< only return width/height/config in bitmap 246 kDecodeBounds_Mode, //!< only return info in bitmap
247 kDecodePixels_Mode //!< return entire bitmap (including pixels) 247 kDecodePixels_Mode //!< return entire bitmap (including pixels)
248 }; 248 };
249 249
250 /** Given a stream, decode it into the specified bitmap. 250 /** Given a stream, decode it into the specified bitmap.
251 If the decoder can decompress the image, it calls bitmap.setConfig(), 251 If the decoder can decompress the image, it calls bitmap.setInfo(),
252 and then if the Mode is kDecodePixels_Mode, call allocPixelRef(), 252 and then if the Mode is kDecodePixels_Mode, call allocPixelRef(),
253 which will allocated a pixelRef. To access the pixel memory, the codec 253 which will allocated a pixelRef. To access the pixel memory, the codec
254 needs to call lockPixels/unlockPixels on the 254 needs to call lockPixels/unlockPixels on the
255 bitmap. It can then set the pixels with the decompressed image. 255 bitmap. It can then set the pixels with the decompressed image.
256 * If the image cannot be decompressed, return false. After the 256 * If the image cannot be decompressed, return false. After the
257 * decoding, the function converts the decoded config in bitmap 257 * decoding, the function converts the decoded colortype in bitmap
258 * to pref if possible. Whether a conversion is feasible is 258 * to pref if possible. Whether a conversion is feasible is
259 * tested by Bitmap::canCopyTo(pref). 259 * tested by Bitmap::canCopyTo(pref).
260 260
261 If an SkBitmap::Allocator is installed via setAllocator, it will be 261 If an SkBitmap::Allocator is installed via setAllocator, it will be
262 used to allocate the pixel memory. A clever allocator can be used 262 used to allocate the pixel memory. A clever allocator can be used
263 to allocate the memory from a cache, volatile memory, or even from 263 to allocate the memory from a cache, volatile memory, or even from
264 an existing bitmap's memory. 264 an existing bitmap's memory.
265 265
266 If a Peeker is installed via setPeeker, it may be used to peek into 266 If a Peeker is installed via setPeeker, it may be used to peek into
267 meta data during the decode. 267 meta data during the decode.
268
269 If a Chooser is installed via setChooser, it may be used to select
270 which image to return from a format that contains multiple images.
271 */ 268 */
272 bool decode(SkStream*, SkBitmap* bitmap, SkBitmap::Config pref, Mode); 269 bool decode(SkStream*, SkBitmap* bitmap, SkColorType pref, Mode);
273 bool decode(SkStream* stream, SkBitmap* bitmap, Mode mode) { 270 bool decode(SkStream* stream, SkBitmap* bitmap, Mode mode) {
274 return this->decode(stream, bitmap, SkBitmap::kNo_Config, mode); 271 return this->decode(stream, bitmap, kUnknown_SkColorType, mode);
275 } 272 }
276 273
277 /** 274 /**
278 * Given a stream, build an index for doing tile-based decode. 275 * Given a stream, build an index for doing tile-based decode.
279 * The built index will be saved in the decoder, and the image size will 276 * The built index will be saved in the decoder, and the image size will
280 * be returned in width and height. 277 * be returned in width and height.
281 * 278 *
282 * Return true for success or false on failure. 279 * Return true for success or false on failure.
283 */ 280 */
284 bool buildTileIndex(SkStreamRewindable*, int *width, int *height); 281 bool buildTileIndex(SkStreamRewindable*, int *width, int *height);
285 282
286 /** 283 /**
287 * Decode a rectangle subset in the image. 284 * Decode a rectangle subset in the image.
288 * The method can only be called after buildTileIndex(). 285 * The method can only be called after buildTileIndex().
289 * 286 *
290 * Return true for success. 287 * Return true for success.
291 * Return false if the index is never built or failing in decoding. 288 * Return false if the index is never built or failing in decoding.
292 */ 289 */
293 bool decodeSubset(SkBitmap* bm, const SkIRect& subset, SkBitmap::Config pref ); 290 bool decodeSubset(SkBitmap* bm, const SkIRect& subset, SkColorType pref);
294 291
295 /** Given a stream, this will try to find an appropriate decoder object. 292 /** Given a stream, this will try to find an appropriate decoder object.
296 If none is found, the method returns NULL. 293 If none is found, the method returns NULL.
297 */ 294 */
298 static SkImageDecoder* Factory(SkStreamRewindable*); 295 static SkImageDecoder* Factory(SkStreamRewindable*);
299 296
300 /** Decode the image stored in the specified file, and store the result 297 /** Decode the image stored in the specified file, and store the result
301 in bitmap. Return true for success or false on failure. 298 in bitmap. Return true for success or false on failure.
302 299
303 @param prefConfig If the PrefConfigTable is not set, prefer this config. 300 @param pref If the PrefConfigTable is not set, prefer this colortype.
304 See NOTE ABOUT PREFERRED CONFIGS. 301 See NOTE ABOUT PREFERRED CONFIGS.
305 302
306 @param format On success, if format is non-null, it is set to the format 303 @param format On success, if format is non-null, it is set to the format
307 of the decoded file. On failure it is ignored. 304 of the decoded file. On failure it is ignored.
308 */ 305 */
309 static bool DecodeFile(const char file[], SkBitmap* bitmap, 306 static bool DecodeFile(const char file[], SkBitmap* bitmap, SkColorType pref , Mode,
310 SkBitmap::Config prefConfig, Mode,
311 Format* format = NULL); 307 Format* format = NULL);
312 static bool DecodeFile(const char file[], SkBitmap* bitmap) { 308 static bool DecodeFile(const char file[], SkBitmap* bitmap) {
313 return DecodeFile(file, bitmap, SkBitmap::kNo_Config, 309 return DecodeFile(file, bitmap, kUnknown_SkColorType, kDecodePixels_Mode , NULL);
314 kDecodePixels_Mode, NULL);
315 } 310 }
311
316 /** Decode the image stored in the specified memory buffer, and store the 312 /** Decode the image stored in the specified memory buffer, and store the
317 result in bitmap. Return true for success or false on failure. 313 result in bitmap. Return true for success or false on failure.
318 314
319 @param prefConfig If the PrefConfigTable is not set, prefer this config. 315 @param pref If the PrefConfigTable is not set, prefer this colortype.
320 See NOTE ABOUT PREFERRED CONFIGS. 316 See NOTE ABOUT PREFERRED CONFIGS.
321 317
322 @param format On success, if format is non-null, it is set to the format 318 @param format On success, if format is non-null, it is set to the format
323 of the decoded buffer. On failure it is ignored. 319 of the decoded buffer. On failure it is ignored.
324 */ 320 */
325 static bool DecodeMemory(const void* buffer, size_t size, SkBitmap* bitmap, 321 static bool DecodeMemory(const void* buffer, size_t size, SkBitmap* bitmap, SkColorType pref,
326 SkBitmap::Config prefConfig, Mode, 322 Mode, Format* format = NULL);
327 Format* format = NULL);
328 static bool DecodeMemory(const void* buffer, size_t size, SkBitmap* bitmap){ 323 static bool DecodeMemory(const void* buffer, size_t size, SkBitmap* bitmap){
329 return DecodeMemory(buffer, size, bitmap, SkBitmap::kNo_Config, 324 return DecodeMemory(buffer, size, bitmap, kUnknown_SkColorType, kDecodeP ixels_Mode, NULL);
330 kDecodePixels_Mode, NULL);
331 } 325 }
332 326
333 /** 327 /**
334 * Struct containing information about a pixel destination. 328 * Struct containing information about a pixel destination.
335 */ 329 */
336 struct Target { 330 struct Target {
337 /** 331 /**
338 * Pre-allocated memory. 332 * Pre-allocated memory.
339 */ 333 */
340 void* fAddr; 334 void* fAddr;
341 335
342 /** 336 /**
343 * Rowbytes of the allocated memory. 337 * Rowbytes of the allocated memory.
344 */ 338 */
345 size_t fRowBytes; 339 size_t fRowBytes;
346 }; 340 };
347 341
348 /** Decode the image stored in the specified SkStreamRewindable, and store t he result 342 /** Decode the image stored in the specified SkStreamRewindable, and store t he result
349 in bitmap. Return true for success or false on failure. 343 in bitmap. Return true for success or false on failure.
350 344
351 @param prefConfig If the PrefConfigTable is not set, prefer this config. 345 @param pref If the PrefConfigTable is not set, prefer this colortype.
352 See NOTE ABOUT PREFERRED CONFIGS. 346 See NOTE ABOUT PREFERRED CONFIGS.
353 347
354 @param format On success, if format is non-null, it is set to the format 348 @param format On success, if format is non-null, it is set to the format
355 of the decoded stream. On failure it is ignored. 349 of the decoded stream. On failure it is ignored.
356 */ 350 */
357 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap, 351 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap, SkCol orType pref, Mode,
358 SkBitmap::Config prefConfig, Mode,
359 Format* format = NULL); 352 Format* format = NULL);
360 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap) { 353 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap) {
361 return DecodeStream(stream, bitmap, SkBitmap::kNo_Config, 354 return DecodeStream(stream, bitmap, kUnknown_SkColorType, kDecodePixels_ Mode, NULL);
362 kDecodePixels_Mode, NULL);
363 } 355 }
364 356
357 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CONFIG
358 bool decode(SkStream*, SkBitmap* bitmap, SkBitmap::Config pref, Mode mode) {
359 return this->decode(stream, bitmap, SkBitmapConfigToColorType(pref), mod e);
360 }
361 bool decodeSubset(SkBitmap* bm, const SkIRect& subset, SkBitmap::Config pref ) {
362 return this->decodeSubset(bm, subset, SkBitmapConfigToColorType(pref));
363 }
364 static bool DecodeFile(const char file[], SkBitmap* bitmap, SkBitmapConfig p ref, Mode mode,
365 Format* format = NULL) {
366 return DecodeFile(file, bitmap, SkBitmapConfigToColorType(pref), mode, f ormat);
367 }
368 static bool DecodeMemory(const void* buffer, size_t size, SkBitmap* bitmap,
369 SkBitmap::Config pref, Mode mode, Format* format = NULL) {
370 return DecodeMemory(buffer, size, bitmap, SkBitmapConfigToColorType(pref ), mode, format);
371 }
372 static bool DecodeStream(SkStreamRewindable* stream, SkBitmap* bitmap, SkBit map::Config pref,
373 Mode mode, Format* format = NULL) {
374 return DecodeStream(stream, bitmap, SkBitmapConfigToColorType(pref), mod e, format);
375 }
376 #endif
377
365 protected: 378 protected:
366 // must be overridden in subclasses. This guy is called by decode(...) 379 // must be overridden in subclasses. This guy is called by decode(...)
367 virtual bool onDecode(SkStream*, SkBitmap* bitmap, Mode) = 0; 380 virtual bool onDecode(SkStream*, SkBitmap* bitmap, Mode) = 0;
368 381
369 // If the decoder wants to support tiled based decoding, 382 // If the decoder wants to support tiled based decoding,
370 // this method must be overridden. This guy is called by buildTileIndex(...) 383 // this method must be overridden. This guy is called by buildTileIndex(...)
371 virtual bool onBuildTileIndex(SkStreamRewindable*, int *width, int *height) { 384 virtual bool onBuildTileIndex(SkStreamRewindable*, int *width, int *height) {
372 return false; 385 return false;
373 } 386 }
374 387
(...skipping 21 matching lines...) Expand all
396 bool cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize, 409 bool cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
397 int dstX, int dstY, int width, int height, 410 int dstX, int dstY, int width, int height,
398 int srcX, int srcY); 411 int srcX, int srcY);
399 412
400 /** 413 /**
401 * Copy all fields on this decoder to the other decoder. Used by subclasses 414 * Copy all fields on this decoder to the other decoder. Used by subclasses
402 * to decode a subimage using a different decoder, but with the same settin gs. 415 * to decode a subimage using a different decoder, but with the same settin gs.
403 */ 416 */
404 void copyFieldsToOther(SkImageDecoder* other); 417 void copyFieldsToOther(SkImageDecoder* other);
405 418
406 /**
407 * Return the default preference being used by the current or latest call t o
408 * decode.
409 */
410 SkBitmap::Config getDefaultPref() { return fDefaultPref; }
411
412 /** Can be queried from within onDecode, to see if the user (possibly in 419 /** Can be queried from within onDecode, to see if the user (possibly in
413 a different thread) has requested the decode to cancel. If this returns 420 a different thread) has requested the decode to cancel. If this returns
414 true, your onDecode() should stop and return false. 421 true, your onDecode() should stop and return false.
415 Each subclass needs to decide how often it can query this, to balance 422 Each subclass needs to decide how often it can query this, to balance
416 responsiveness with performance. 423 responsiveness with performance.
417 424
418 Calling this outside of onDecode() may return undefined values. 425 Calling this outside of onDecode() may return undefined values.
419 */ 426 */
420 427
421 public: 428 public:
422 bool shouldCancelDecode() const { return fShouldCancelDecode; } 429 bool shouldCancelDecode() const { return fShouldCancelDecode; }
423 430
424 protected: 431 protected:
425 SkImageDecoder(); 432 SkImageDecoder();
426 433
434 /**
435 * Return the default preference being used by the current or latest call t o decode.
436 */
437 SkColorType getDefaultPref() { return fDefaultPref; }
438
427 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER 439 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER
428 // helper function for decoders to handle the (common) case where there is o nly 440 // helper function for decoders to handle the (common) case where there is o nly
429 // once choice available in the image file. 441 // once choice available in the image file.
430 bool chooseFromOneChoice(SkColorType, int width, int height) const; 442 bool chooseFromOneChoice(SkColorType, int width, int height) const;
431 #endif 443 #endif
432 444
433 /* Helper for subclasses. Call this to allocate the pixel memory given the bitmap's 445 /* Helper for subclasses. Call this to allocate the pixel memory given the bitmap's info.
434 width/height/rowbytes/config. Returns true on success. This method handl es checking 446 Returns true on success. This method handles checking for an optional Al locator.
435 for an optional Allocator.
436 */ 447 */
437 bool allocPixelRef(SkBitmap*, SkColorTable*) const; 448 bool allocPixelRef(SkBitmap*, SkColorTable*) const;
438 449
439 /** 450 /**
440 * The raw data of the src image. 451 * The raw data of the src image.
441 */ 452 */
442 enum SrcDepth { 453 enum SrcDepth {
443 // Color-indexed. 454 // Color-indexed.
444 kIndex_SrcDepth, 455 kIndex_SrcDepth,
445 // Grayscale in 8 bits. 456 // Grayscale in 8 bits.
446 k8BitGray_SrcDepth, 457 k8BitGray_SrcDepth,
447 // 8 bits per component. Used for 24 bit if there is no alpha. 458 // 8 bits per component. Used for 24 bit if there is no alpha.
448 k32Bit_SrcDepth, 459 k32Bit_SrcDepth,
449 }; 460 };
450 /** The subclass, inside onDecode(), calls this to determine the colorType o f 461 /** The subclass, inside onDecode(), calls this to determine the colorType o f
451 the returned bitmap. SrcDepth and hasAlpha reflect the raw data of the 462 the returned bitmap. SrcDepth and hasAlpha reflect the raw data of the
452 src image. This routine returns the caller's preference given 463 src image. This routine returns the caller's preference given
453 srcDepth and hasAlpha, or kUnknown_SkColorType if there is no preference . 464 srcDepth and hasAlpha, or kUnknown_SkColorType if there is no preference .
454 */ 465 */
455 SkColorType getPrefColorType(SrcDepth, bool hasAlpha) const; 466 SkColorType getPrefColorType(SrcDepth, bool hasAlpha) const;
456 467
457 private: 468 private:
458 Peeker* fPeeker; 469 Peeker* fPeeker;
459 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER 470 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER
460 Chooser* fChooser; 471 Chooser* fChooser;
461 #endif 472 #endif
462 SkBitmap::Allocator* fAllocator; 473 SkBitmap::Allocator* fAllocator;
463 int fSampleSize; 474 int fSampleSize;
464 SkBitmap::Config fDefaultPref; // use if fUsePrefTable is false 475 SkColorType fDefaultPref; // use if fUsePrefTable is false
465 PrefConfigTable fPrefTable; // use if fUsePrefTable is true 476 PrefConfigTable fPrefTable; // use if fUsePrefTable is true
466 bool fDitherImage; 477 bool fDitherImage;
467 bool fUsePrefTable; 478 bool fUsePrefTable;
468 bool fSkipWritingZeroes; 479 bool fSkipWritingZeroes;
469 mutable bool fShouldCancelDecode; 480 mutable bool fShouldCancelDecode;
470 bool fPreferQualityOverSpeed; 481 bool fPreferQualityOverSpeed;
471 bool fRequireUnpremultipliedColors; 482 bool fRequireUnpremultipliedColors;
472 }; 483 };
473 484
474 /** Calling newDecoder with a stream returns a new matching imagedecoder 485 /** Calling newDecoder with a stream returns a new matching imagedecoder
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 DECLARE_DECODER_CREATOR(WEBPImageDecoder); 529 DECLARE_DECODER_CREATOR(WEBPImageDecoder);
519 DECLARE_DECODER_CREATOR(PKMImageDecoder); 530 DECLARE_DECODER_CREATOR(PKMImageDecoder);
520 DECLARE_DECODER_CREATOR(KTXImageDecoder); 531 DECLARE_DECODER_CREATOR(KTXImageDecoder);
521 532
522 // Typedefs to make registering decoder and formatter callbacks easier. 533 // Typedefs to make registering decoder and formatter callbacks easier.
523 // These have to be defined outside SkImageDecoder. :( 534 // These have to be defined outside SkImageDecoder. :(
524 typedef SkTRegistry<SkImageDecoder*(*)(SkStreamRewindable*)> SkImageDecod er_DecodeReg; 535 typedef SkTRegistry<SkImageDecoder*(*)(SkStreamRewindable*)> SkImageDecod er_DecodeReg;
525 typedef SkTRegistry<SkImageDecoder::Format(*)(SkStreamRewindable*)> SkImageDecod er_FormatReg; 536 typedef SkTRegistry<SkImageDecoder::Format(*)(SkStreamRewindable*)> SkImageDecod er_FormatReg;
526 537
527 #endif 538 #endif
OLDNEW
« no previous file with comments | « gyp/skia_for_android_framework_defines.gypi ('k') | samplecode/SampleFilter2.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698