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

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

Issue 25353002: change SkColorTable to be immutable (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 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 /* 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 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 641
642 typedef uint32_t (*PackColorProc)(U8CPU a, U8CPU r, U8CPU g, U8CPU b); 642 typedef uint32_t (*PackColorProc)(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
643 643
644 bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, 644 bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr,
645 bool *hasAlphap, bool *reallyHasAlphap, 645 bool *hasAlphap, bool *reallyHasAlphap,
646 SkColorTable **colorTablep) { 646 SkColorTable **colorTablep) {
647 int numPalette; 647 int numPalette;
648 png_colorp palette; 648 png_colorp palette;
649 png_bytep trans; 649 png_bytep trans;
650 int numTrans; 650 int numTrans;
651 bool reallyHasAlpha = false;
652 SkColorTable* colorTable = NULL;
653 651
654 png_get_PLTE(png_ptr, info_ptr, &palette, &numPalette); 652 png_get_PLTE(png_ptr, info_ptr, &palette, &numPalette);
655 653
656 /* BUGGY IMAGE WORKAROUND 654 /* BUGGY IMAGE WORKAROUND
657 655
658 We hit some images (e.g. fruit_.png) who contain bytes that are == color table_count 656 We hit some images (e.g. fruit_.png) who contain bytes that are == color table_count
659 which is a problem since we use the byte as an index. To work around thi s we grow 657 which is a problem since we use the byte as an index. To work around thi s we grow
660 the colortable by 1 (if its < 256) and duplicate the last color into tha t slot. 658 the colortable by 1 (if its < 256) and duplicate the last color into tha t slot.
661 */ 659 */
662 int colorCount = numPalette + (numPalette < 256); 660 int colorCount = numPalette + (numPalette < 256);
661 SkPMColor colorStorage[256]; // worst-case storage
662 SkPMColor* colorPtr = colorStorage;
663 663
664 colorTable = SkNEW_ARGS(SkColorTable, (colorCount));
665
666 SkPMColor* colorPtr = colorTable->lockColors();
667 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { 664 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
668 png_get_tRNS(png_ptr, info_ptr, &trans, &numTrans, NULL); 665 png_get_tRNS(png_ptr, info_ptr, &trans, &numTrans, NULL);
669 *hasAlphap = (numTrans > 0); 666 *hasAlphap = (numTrans > 0);
670 } else { 667 } else {
671 numTrans = 0; 668 numTrans = 0;
672 colorTable->setFlags(colorTable->getFlags() | SkColorTable::kColorsAreOp aque_Flag);
673 } 669 }
670 bool reallyHasAlpha = numTrans > 0;
671
674 // check for bad images that might make us crash 672 // check for bad images that might make us crash
675 if (numTrans > numPalette) { 673 if (numTrans > numPalette) {
676 numTrans = numPalette; 674 numTrans = numPalette;
677 } 675 }
678 676
679 int index = 0; 677 int index = 0;
680 int transLessThanFF = 0; 678 int transLessThanFF = 0;
681 679
682 // Choose which function to use to create the color table. If the final dest ination's 680 // Choose which function to use to create the color table. If the final dest ination's
683 // config is unpremultiplied, the color table will store unpremultiplied col ors. 681 // config is unpremultiplied, the color table will store unpremultiplied col ors.
(...skipping 12 matching lines...) Expand all
696 694
697 for (; index < numPalette; index++) { 695 for (; index < numPalette; index++) {
698 *colorPtr++ = SkPackARGB32(0xFF, palette->red, palette->green, palette-> blue); 696 *colorPtr++ = SkPackARGB32(0xFF, palette->red, palette->green, palette-> blue);
699 palette++; 697 palette++;
700 } 698 }
701 699
702 // see BUGGY IMAGE WORKAROUND comment above 700 // see BUGGY IMAGE WORKAROUND comment above
703 if (numPalette < 256) { 701 if (numPalette < 256) {
704 *colorPtr = colorPtr[-1]; 702 *colorPtr = colorPtr[-1];
705 } 703 }
706 colorTable->unlockColors(true); 704
707 *colorTablep = colorTable; 705 SkAlphaType alphaType = kOpaque_SkAlphaType;
706 if (reallyHasAlpha) {
707 if (this->getRequireUnpremultipliedColors()) {
708 alphaType = kUnpremul_SkAlphaType;
709 } else {
710 alphaType = kPremul_SkAlphaType;
711 }
712 }
713
714 *colorTablep = SkNEW_ARGS(SkColorTable,
715 (colorStorage, colorCount, alphaType));
708 *reallyHasAlphap = reallyHasAlpha; 716 *reallyHasAlphap = reallyHasAlpha;
709 return true; 717 return true;
710 } 718 }
711 719
712 #ifdef SK_BUILD_FOR_ANDROID 720 #ifdef SK_BUILD_FOR_ANDROID
713 721
714 bool SkPNGImageDecoder::onBuildTileIndex(SkStreamRewindable* sk_stream, int *wid th, int *height) { 722 bool SkPNGImageDecoder::onBuildTileIndex(SkStreamRewindable* sk_stream, int *wid th, int *height) {
715 png_structp png_ptr; 723 png_structp png_ptr;
716 png_infop info_ptr; 724 png_infop info_ptr;
717 725
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 return SkImageDecoder::kUnknown_Format; 1250 return SkImageDecoder::kUnknown_Format;
1243 } 1251 }
1244 1252
1245 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { 1253 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) {
1246 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; 1254 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL;
1247 } 1255 }
1248 1256
1249 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); 1257 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory);
1250 static SkImageDecoder_FormatReg gFormatReg(get_format_png); 1258 static SkImageDecoder_FormatReg gFormatReg(get_format_png);
1251 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); 1259 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698