Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2010, The Android Open Source Project | 2 * Copyright 2010, The Android Open Source Project |
| 3 * | 3 * |
| 4 * Licensed under the Apache License, Version 2.0 (the "License"); | 4 * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 * you may not use this file except in compliance with the License. | 5 * you may not use this file except in compliance with the License. |
| 6 * You may obtain a copy of the License at | 6 * You may obtain a copy of the License at |
| 7 * | 7 * |
| 8 * http://www.apache.org/licenses/LICENSE-2.0 | 8 * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 * | 9 * |
| 10 * Unless required by applicable law or agreed to in writing, software | 10 * Unless required by applicable law or agreed to in writing, software |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 | 162 |
| 163 // This guy exists just to aid in debugging, as it allows debuggers to just | 163 // This guy exists just to aid in debugging, as it allows debuggers to just |
| 164 // set a break-point in one place to see all error exists. | 164 // set a break-point in one place to see all error exists. |
| 165 static bool return_false(const SkBitmap& bm, const char msg[]) { | 165 static bool return_false(const SkBitmap& bm, const char msg[]) { |
| 166 SkDEBUGF(("libwebp error %s [%d %d]", msg, bm.width(), bm.height())); | 166 SkDEBUGF(("libwebp error %s [%d %d]", msg, bm.width(), bm.height())); |
| 167 return false; // must always return false | 167 return false; // must always return false |
| 168 } | 168 } |
| 169 | 169 |
| 170 static WEBP_CSP_MODE webp_decode_mode(const SkBitmap* decodedBitmap, bool premul tiply) { | 170 static WEBP_CSP_MODE webp_decode_mode(const SkBitmap* decodedBitmap, bool premul tiply) { |
| 171 WEBP_CSP_MODE mode = MODE_LAST; | 171 WEBP_CSP_MODE mode = MODE_LAST; |
| 172 SkBitmap::Config config = decodedBitmap->config(); | 172 const SkColorType ct = decodedBitmap->colorType(); |
| 173 | 173 |
| 174 if (config == SkBitmap::kARGB_8888_Config) { | 174 if (ct == kN32_SkColorType) { |
| 175 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A) | 175 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A) |
| 176 mode = premultiply ? MODE_bgrA : MODE_BGRA; | 176 mode = premultiply ? MODE_bgrA : MODE_BGRA; |
| 177 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) | 177 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) |
| 178 mode = premultiply ? MODE_rgbA : MODE_RGBA; | 178 mode = premultiply ? MODE_rgbA : MODE_RGBA; |
| 179 #else | 179 #else |
| 180 #error "Skia uses BGRA or RGBA byte order" | 180 #error "Skia uses BGRA or RGBA byte order" |
| 181 #endif | 181 #endif |
| 182 } else if (config == SkBitmap::kARGB_4444_Config) { | 182 } else if (ct == kARGB_4444_SkColorType) { |
| 183 mode = premultiply ? MODE_rgbA_4444 : MODE_RGBA_4444; | 183 mode = premultiply ? MODE_rgbA_4444 : MODE_RGBA_4444; |
| 184 } else if (config == SkBitmap::kRGB_565_Config) { | 184 } else if (ct == kRGB_565_SkColorType) { |
| 185 mode = MODE_RGB_565; | 185 mode = MODE_RGB_565; |
| 186 } | 186 } |
| 187 SkASSERT(MODE_LAST != mode); | 187 SkASSERT(MODE_LAST != mode); |
| 188 return mode; | 188 return mode; |
| 189 } | 189 } |
| 190 | 190 |
| 191 // Incremental WebP image decoding. Reads input buffer of 64K size iteratively | 191 // Incremental WebP image decoding. Reads input buffer of 64K size iteratively |
| 192 // and decodes this block to appropriate color-space as per config object. | 192 // and decodes this block to appropriate color-space as per config object. |
| 193 static bool webp_idecode(SkStream* stream, WebPDecoderConfig* config) { | 193 static bool webp_idecode(SkStream* stream, WebPDecoderConfig* config) { |
| 194 WebPIDecoder* idec = WebPIDecode(NULL, 0, config); | 194 WebPIDecoder* idec = WebPIDecode(NULL, 0, config); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 *height = origHeight; | 325 *height = origHeight; |
| 326 | 326 |
| 327 SkRefCnt_SafeAssign(this->fInputStream, stream); | 327 SkRefCnt_SafeAssign(this->fInputStream, stream); |
| 328 this->fOrigWidth = origWidth; | 328 this->fOrigWidth = origWidth; |
| 329 this->fOrigHeight = origHeight; | 329 this->fOrigHeight = origHeight; |
| 330 this->fHasAlpha = hasAlpha; | 330 this->fHasAlpha = hasAlpha; |
| 331 | 331 |
| 332 return true; | 332 return true; |
| 333 } | 333 } |
| 334 | 334 |
| 335 static bool is_config_compatible(const SkBitmap& bitmap) { | 335 static bool is_config_compatible(const SkBitmap& bitmap) { |
|
scroggo
2014/06/16 14:50:32
is_colortype_compatible*
| |
| 336 SkBitmap::Config config = bitmap.config(); | 336 const SkColorType ct = bitmap.colorType(); |
| 337 return config == SkBitmap::kARGB_4444_Config || | 337 return ct == kARGB_4444_SkColorType || ct == kRGB_565_SkColorType || ct == k N32_SkColorType; |
| 338 config == SkBitmap::kRGB_565_Config || | |
| 339 config == SkBitmap::kARGB_8888_Config; | |
| 340 } | 338 } |
| 341 | 339 |
| 342 bool SkWEBPImageDecoder::onDecodeSubset(SkBitmap* decodedBitmap, | 340 bool SkWEBPImageDecoder::onDecodeSubset(SkBitmap* decodedBitmap, |
| 343 const SkIRect& region) { | 341 const SkIRect& region) { |
| 344 SkIRect rect = SkIRect::MakeWH(fOrigWidth, fOrigHeight); | 342 SkIRect rect = SkIRect::MakeWH(fOrigWidth, fOrigHeight); |
| 345 | 343 |
| 346 if (!rect.intersect(region)) { | 344 if (!rect.intersect(region)) { |
| 347 // If the requested region is entirely outsides the image, return false | 345 // If the requested region is entirely outsides the image, return false |
| 348 return false; | 346 return false; |
| 349 } | 347 } |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 549 const uint8_t* SK_RESTRICT src = (const uint8_t*)in; | 547 const uint8_t* SK_RESTRICT src = (const uint8_t*)in; |
| 550 for (int i = 0; i < width; ++i) { | 548 for (int i = 0; i < width; ++i) { |
| 551 const uint32_t c = ctable[*src++]; | 549 const uint32_t c = ctable[*src++]; |
| 552 rgb[0] = SkGetPackedR32(c); | 550 rgb[0] = SkGetPackedR32(c); |
| 553 rgb[1] = SkGetPackedG32(c); | 551 rgb[1] = SkGetPackedG32(c); |
| 554 rgb[2] = SkGetPackedB32(c); | 552 rgb[2] = SkGetPackedB32(c); |
| 555 rgb += 3; | 553 rgb += 3; |
| 556 } | 554 } |
| 557 } | 555 } |
| 558 | 556 |
| 559 static ScanlineImporter ChooseImporter(const SkBitmap::Config& config, | 557 static ScanlineImporter ChooseImporter(SkColorType ct, bool hasAlpha, int* bpp ) { |
|
scroggo
2014/06/16 14:50:32
nit: double spaces between type and name are no lo
| |
| 560 bool hasAlpha, | 558 switch (ct) { |
| 561 int* bpp) { | 559 case kN32_SkColorType: |
| 562 switch (config) { | |
| 563 case SkBitmap::kARGB_8888_Config: | |
| 564 if (hasAlpha) { | 560 if (hasAlpha) { |
| 565 *bpp = 4; | 561 *bpp = 4; |
| 566 return ARGB_8888_To_RGBA; | 562 return ARGB_8888_To_RGBA; |
| 567 } else { | 563 } else { |
| 568 *bpp = 3; | 564 *bpp = 3; |
| 569 return ARGB_8888_To_RGB; | 565 return ARGB_8888_To_RGB; |
| 570 } | 566 } |
| 571 case SkBitmap::kARGB_4444_Config: | 567 case kARGB_4444_SkColorType: |
| 572 if (hasAlpha) { | 568 if (hasAlpha) { |
| 573 *bpp = 4; | 569 *bpp = 4; |
| 574 return ARGB_4444_To_RGBA; | 570 return ARGB_4444_To_RGBA; |
| 575 } else { | 571 } else { |
| 576 *bpp = 3; | 572 *bpp = 3; |
| 577 return ARGB_4444_To_RGB; | 573 return ARGB_4444_To_RGB; |
| 578 } | 574 } |
| 579 case SkBitmap::kRGB_565_Config: | 575 case kRGB_565_SkColorType: |
| 580 *bpp = 3; | 576 *bpp = 3; |
| 581 return RGB_565_To_RGB; | 577 return RGB_565_To_RGB; |
| 582 case SkBitmap::kIndex8_Config: | 578 case kIndex_8_SkColorType: |
| 583 *bpp = 3; | 579 *bpp = 3; |
| 584 return Index8_To_RGB; | 580 return Index8_To_RGB; |
| 585 default: | 581 default: |
| 586 return NULL; | 582 return NULL; |
| 587 } | 583 } |
| 588 } | 584 } |
| 589 | 585 |
| 590 static int stream_writer(const uint8_t* data, size_t data_size, | 586 static int stream_writer(const uint8_t* data, size_t data_size, |
| 591 const WebPPicture* const picture) { | 587 const WebPPicture* const picture) { |
| 592 SkWStream* const stream = (SkWStream*)picture->custom_ptr; | 588 SkWStream* const stream = (SkWStream*)picture->custom_ptr; |
| 593 return stream->write(data, data_size) ? 1 : 0; | 589 return stream->write(data, data_size) ? 1 : 0; |
| 594 } | 590 } |
| 595 | 591 |
| 596 class SkWEBPImageEncoder : public SkImageEncoder { | 592 class SkWEBPImageEncoder : public SkImageEncoder { |
| 597 protected: | 593 protected: |
| 598 virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) SK _OVERRIDE; | 594 virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) SK _OVERRIDE; |
| 599 | 595 |
| 600 private: | 596 private: |
| 601 typedef SkImageEncoder INHERITED; | 597 typedef SkImageEncoder INHERITED; |
| 602 }; | 598 }; |
| 603 | 599 |
| 604 bool SkWEBPImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bm, | 600 bool SkWEBPImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bm, |
| 605 int quality) { | 601 int quality) { |
| 606 const SkBitmap::Config config = bm.config(); | |
| 607 const bool hasAlpha = !bm.isOpaque(); | 602 const bool hasAlpha = !bm.isOpaque(); |
| 608 int bpp = -1; | 603 int bpp = -1; |
| 609 const ScanlineImporter scanline_import = ChooseImporter(config, hasAlpha, | 604 const ScanlineImporter scanline_import = ChooseImporter(bm.colorType(), hasA lpha, &bpp); |
| 610 &bpp); | |
| 611 if (NULL == scanline_import) { | 605 if (NULL == scanline_import) { |
| 612 return false; | 606 return false; |
| 613 } | 607 } |
| 614 if (-1 == bpp) { | 608 if (-1 == bpp) { |
| 615 return false; | 609 return false; |
| 616 } | 610 } |
| 617 | 611 |
| 618 SkAutoLockPixels alp(bm); | 612 SkAutoLockPixels alp(bm); |
| 619 SkAutoLockColors ctLocker; | 613 SkAutoLockColors ctLocker; |
| 620 if (NULL == bm.getPixels()) { | 614 if (NULL == bm.getPixels()) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 683 return SkImageDecoder::kUnknown_Format; | 677 return SkImageDecoder::kUnknown_Format; |
| 684 } | 678 } |
| 685 | 679 |
| 686 static SkImageEncoder* sk_libwebp_efactory(SkImageEncoder::Type t) { | 680 static SkImageEncoder* sk_libwebp_efactory(SkImageEncoder::Type t) { |
| 687 return (SkImageEncoder::kWEBP_Type == t) ? SkNEW(SkWEBPImageEncoder) : NUL L; | 681 return (SkImageEncoder::kWEBP_Type == t) ? SkNEW(SkWEBPImageEncoder) : NUL L; |
| 688 } | 682 } |
| 689 | 683 |
| 690 static SkImageDecoder_DecodeReg gDReg(sk_libwebp_dfactory); | 684 static SkImageDecoder_DecodeReg gDReg(sk_libwebp_dfactory); |
| 691 static SkImageDecoder_FormatReg gFormatReg(get_format_webp); | 685 static SkImageDecoder_FormatReg gFormatReg(get_format_webp); |
| 692 static SkImageEncoder_EncodeReg gEReg(sk_libwebp_efactory); | 686 static SkImageEncoder_EncodeReg gEReg(sk_libwebp_efactory); |
| OLD | NEW |