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

Side by Side Diff: src/core/SkBitmap.cpp

Issue 303543009: replace config() with colorType() (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: 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 | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 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 "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 break; 641 break;
642 } 642 }
643 } 643 }
644 return base; 644 return base;
645 } 645 }
646 646
647 SkColor SkBitmap::getColor(int x, int y) const { 647 SkColor SkBitmap::getColor(int x, int y) const {
648 SkASSERT((unsigned)x < (unsigned)this->width()); 648 SkASSERT((unsigned)x < (unsigned)this->width());
649 SkASSERT((unsigned)y < (unsigned)this->height()); 649 SkASSERT((unsigned)y < (unsigned)this->height());
650 650
651 switch (this->config()) { 651 switch (this->colorType()) {
652 case SkBitmap::kA8_Config: { 652 case kAlpha_8_SkColorType: {
653 uint8_t* addr = this->getAddr8(x, y); 653 uint8_t* addr = this->getAddr8(x, y);
654 return SkColorSetA(0, addr[0]); 654 return SkColorSetA(0, addr[0]);
655 } 655 }
656 case SkBitmap::kIndex8_Config: { 656 case kIndex_8_SkColorType: {
657 SkPMColor c = this->getIndex8Color(x, y); 657 SkPMColor c = this->getIndex8Color(x, y);
658 return SkUnPreMultiply::PMColorToColor(c); 658 return SkUnPreMultiply::PMColorToColor(c);
659 } 659 }
660 case SkBitmap::kRGB_565_Config: { 660 case kRGB_565_SkColorType: {
661 uint16_t* addr = this->getAddr16(x, y); 661 uint16_t* addr = this->getAddr16(x, y);
662 return SkPixel16ToColor(addr[0]); 662 return SkPixel16ToColor(addr[0]);
663 } 663 }
664 case SkBitmap::kARGB_4444_Config: { 664 case kARGB_4444_SkColorType: {
665 uint16_t* addr = this->getAddr16(x, y); 665 uint16_t* addr = this->getAddr16(x, y);
666 SkPMColor c = SkPixel4444ToPixel32(addr[0]); 666 SkPMColor c = SkPixel4444ToPixel32(addr[0]);
667 return SkUnPreMultiply::PMColorToColor(c); 667 return SkUnPreMultiply::PMColorToColor(c);
668 } 668 }
669 case SkBitmap::kARGB_8888_Config: { 669 case kBGRA_8888_SkColorType:
670 case kRGBA_8888_SkColorType: {
670 uint32_t* addr = this->getAddr32(x, y); 671 uint32_t* addr = this->getAddr32(x, y);
671 return SkUnPreMultiply::PMColorToColor(addr[0]); 672 return SkUnPreMultiply::PMColorToColor(addr[0]);
672 } 673 }
673 case kNo_Config:
674 default: 674 default:
675 SkASSERT(false); 675 SkASSERT(false);
676 return 0; 676 return 0;
677 } 677 }
678 SkASSERT(false); // Not reached. 678 SkASSERT(false); // Not reached.
679 return 0; 679 return 0;
680 } 680 }
681 681
682 bool SkBitmap::ComputeIsOpaque(const SkBitmap& bm) { 682 bool SkBitmap::ComputeIsOpaque(const SkBitmap& bm) {
683 SkAutoLockPixels alp(bm); 683 SkAutoLockPixels alp(bm);
684 if (!bm.getPixels()) { 684 if (!bm.getPixels()) {
685 return false; 685 return false;
686 } 686 }
687 687
688 const int height = bm.height(); 688 const int height = bm.height();
689 const int width = bm.width(); 689 const int width = bm.width();
690 690
691 switch (bm.config()) { 691 switch (bm.colorType()) {
692 case SkBitmap::kA8_Config: { 692 case kAlpha_8_SkColorType: {
693 unsigned a = 0xFF; 693 unsigned a = 0xFF;
694 for (int y = 0; y < height; ++y) { 694 for (int y = 0; y < height; ++y) {
695 const uint8_t* row = bm.getAddr8(0, y); 695 const uint8_t* row = bm.getAddr8(0, y);
696 for (int x = 0; x < width; ++x) { 696 for (int x = 0; x < width; ++x) {
697 a &= row[x]; 697 a &= row[x];
698 } 698 }
699 if (0xFF != a) { 699 if (0xFF != a) {
700 return false; 700 return false;
701 } 701 }
702 } 702 }
703 return true; 703 return true;
704 } break; 704 } break;
705 case SkBitmap::kIndex8_Config: { 705 case kIndex_8_SkColorType: {
706 SkAutoLockColors alc(bm); 706 SkAutoLockColors alc(bm);
707 const SkPMColor* table = alc.colors(); 707 const SkPMColor* table = alc.colors();
708 if (!table) { 708 if (!table) {
709 return false; 709 return false;
710 } 710 }
711 SkPMColor c = (SkPMColor)~0; 711 SkPMColor c = (SkPMColor)~0;
712 for (int i = bm.getColorTable()->count() - 1; i >= 0; --i) { 712 for (int i = bm.getColorTable()->count() - 1; i >= 0; --i) {
713 c &= table[i]; 713 c &= table[i];
714 } 714 }
715 return 0xFF == SkGetPackedA32(c); 715 return 0xFF == SkGetPackedA32(c);
716 } break; 716 } break;
717 case SkBitmap::kRGB_565_Config: 717 case kRGB_565_SkColorType:
718 return true; 718 return true;
719 break; 719 break;
720 case SkBitmap::kARGB_4444_Config: { 720 case kARGB_4444_SkColorType: {
721 unsigned c = 0xFFFF; 721 unsigned c = 0xFFFF;
722 for (int y = 0; y < height; ++y) { 722 for (int y = 0; y < height; ++y) {
723 const SkPMColor16* row = bm.getAddr16(0, y); 723 const SkPMColor16* row = bm.getAddr16(0, y);
724 for (int x = 0; x < width; ++x) { 724 for (int x = 0; x < width; ++x) {
725 c &= row[x]; 725 c &= row[x];
726 } 726 }
727 if (0xF != SkGetPackedA4444(c)) { 727 if (0xF != SkGetPackedA4444(c)) {
728 return false; 728 return false;
729 } 729 }
730 } 730 }
731 return true; 731 return true;
732 } break; 732 } break;
733 case SkBitmap::kARGB_8888_Config: { 733 case kBGRA_8888_SkColorType:
734 case kRGBA_8888_SkColorType: {
734 SkPMColor c = (SkPMColor)~0; 735 SkPMColor c = (SkPMColor)~0;
735 for (int y = 0; y < height; ++y) { 736 for (int y = 0; y < height; ++y) {
736 const SkPMColor* row = bm.getAddr32(0, y); 737 const SkPMColor* row = bm.getAddr32(0, y);
737 for (int x = 0; x < width; ++x) { 738 for (int x = 0; x < width; ++x) {
738 c &= row[x]; 739 c &= row[x];
739 } 740 }
740 if (0xFF != SkGetPackedA32(c)) { 741 if (0xFF != SkGetPackedA32(c)) {
741 return false; 742 return false;
742 } 743 }
743 } 744 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
878 srcRect.set(0, 0, this->width(), this->height()); 879 srcRect.set(0, 0, this->width(), this->height());
879 if (!r.intersect(srcRect, subset)) { 880 if (!r.intersect(srcRect, subset)) {
880 return false; // r is empty (i.e. no intersection) 881 return false; // r is empty (i.e. no intersection)
881 } 882 }
882 883
883 if (fPixelRef->getTexture() != NULL) { 884 if (fPixelRef->getTexture() != NULL) {
884 // Do a deep copy 885 // Do a deep copy
885 SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset); 886 SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset);
886 if (pixelRef != NULL) { 887 if (pixelRef != NULL) {
887 SkBitmap dst; 888 SkBitmap dst;
888 dst.setConfig(this->config(), subset.width(), subset.height(), 0, 889 dst.setConfig(SkImageInfo::Make(subset.width(), subset.height(),
889 this->alphaType()); 890 this->colorType(), this->alphaType() ));
890 dst.setIsVolatile(this->isVolatile()); 891 dst.setIsVolatile(this->isVolatile());
891 dst.setPixelRef(pixelRef)->unref(); 892 dst.setPixelRef(pixelRef)->unref();
892 SkDEBUGCODE(dst.validate()); 893 SkDEBUGCODE(dst.validate());
893 result->swap(dst); 894 result->swap(dst);
894 return true; 895 return true;
895 } 896 }
896 } 897 }
897 898
898 // If the upper left of the rectangle was outside the bounds of this SkBitma p, we should have 899 // If the upper left of the rectangle was outside the bounds of this SkBitma p, we should have
899 // exited above. 900 // exited above.
900 SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width( ))); 901 SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width( )));
901 SkASSERT(static_cast<unsigned>(r.fTop) < static_cast<unsigned>(this->height( ))); 902 SkASSERT(static_cast<unsigned>(r.fTop) < static_cast<unsigned>(this->height( )));
902 903
903 SkBitmap dst; 904 SkBitmap dst;
904 dst.setConfig(this->config(), r.width(), r.height(), this->rowBytes(), 905 dst.setConfig(SkImageInfo::Make(r.width(), r.height(), this->colorType(), th is->alphaType()),
905 this->alphaType()); 906 this->rowBytes());
906 dst.setIsVolatile(this->isVolatile()); 907 dst.setIsVolatile(this->isVolatile());
907 908
908 if (fPixelRef) { 909 if (fPixelRef) {
909 SkIPoint origin = fPixelRefOrigin; 910 SkIPoint origin = fPixelRefOrigin;
910 origin.fX += r.fLeft; 911 origin.fX += r.fLeft;
911 origin.fY += r.fTop; 912 origin.fY += r.fTop;
912 // share the pixelref with a custom offset 913 // share the pixelref with a custom offset
913 dst.setPixelRef(fPixelRef, origin); 914 dst.setPixelRef(fPixelRef, origin);
914 } 915 }
915 SkDEBUGCODE(dst.validate();) 916 SkDEBUGCODE(dst.validate();)
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 } 1125 }
1125 } 1126 }
1126 1127
1127 /////////////////////////////////////////////////////////////////////////////// 1128 ///////////////////////////////////////////////////////////////////////////////
1128 1129
1129 static bool GetBitmapAlpha(const SkBitmap& src, uint8_t* SK_RESTRICT alpha, 1130 static bool GetBitmapAlpha(const SkBitmap& src, uint8_t* SK_RESTRICT alpha,
1130 int alphaRowBytes) { 1131 int alphaRowBytes) {
1131 SkASSERT(alpha != NULL); 1132 SkASSERT(alpha != NULL);
1132 SkASSERT(alphaRowBytes >= src.width()); 1133 SkASSERT(alphaRowBytes >= src.width());
1133 1134
1134 SkBitmap::Config config = src.config(); 1135 SkColorType colorType = src.colorType();
1135 int w = src.width(); 1136 int w = src.width();
1136 int h = src.height(); 1137 int h = src.height();
1137 size_t rb = src.rowBytes(); 1138 size_t rb = src.rowBytes();
1138 1139
1139 SkAutoLockPixels alp(src); 1140 SkAutoLockPixels alp(src);
1140 if (!src.readyToDraw()) { 1141 if (!src.readyToDraw()) {
1141 // zero out the alpha buffer and return 1142 // zero out the alpha buffer and return
1142 while (--h >= 0) { 1143 while (--h >= 0) {
1143 memset(alpha, 0, w); 1144 memset(alpha, 0, w);
1144 alpha += alphaRowBytes; 1145 alpha += alphaRowBytes;
1145 } 1146 }
1146 return false; 1147 return false;
1147 } 1148 }
1148 1149
1149 if (SkBitmap::kA8_Config == config && !src.isOpaque()) { 1150 if (kAlpha_8_SkColorType == colorType && !src.isOpaque()) {
1150 const uint8_t* s = src.getAddr8(0, 0); 1151 const uint8_t* s = src.getAddr8(0, 0);
1151 while (--h >= 0) { 1152 while (--h >= 0) {
1152 memcpy(alpha, s, w); 1153 memcpy(alpha, s, w);
1153 s += rb; 1154 s += rb;
1154 alpha += alphaRowBytes; 1155 alpha += alphaRowBytes;
1155 } 1156 }
1156 } else if (SkBitmap::kARGB_8888_Config == config && !src.isOpaque()) { 1157 } else if (kN32_SkColorType == colorType && !src.isOpaque()) {
1157 const SkPMColor* SK_RESTRICT s = src.getAddr32(0, 0); 1158 const SkPMColor* SK_RESTRICT s = src.getAddr32(0, 0);
1158 while (--h >= 0) { 1159 while (--h >= 0) {
1159 for (int x = 0; x < w; x++) { 1160 for (int x = 0; x < w; x++) {
1160 alpha[x] = SkGetPackedA32(s[x]); 1161 alpha[x] = SkGetPackedA32(s[x]);
1161 } 1162 }
1162 s = (const SkPMColor*)((const char*)s + rb); 1163 s = (const SkPMColor*)((const char*)s + rb);
1163 alpha += alphaRowBytes; 1164 alpha += alphaRowBytes;
1164 } 1165 }
1165 } else if (SkBitmap::kARGB_4444_Config == config && !src.isOpaque()) { 1166 } else if (kARGB_4444_SkColorType == colorType && !src.isOpaque()) {
1166 const SkPMColor16* SK_RESTRICT s = src.getAddr16(0, 0); 1167 const SkPMColor16* SK_RESTRICT s = src.getAddr16(0, 0);
1167 while (--h >= 0) { 1168 while (--h >= 0) {
1168 for (int x = 0; x < w; x++) { 1169 for (int x = 0; x < w; x++) {
1169 alpha[x] = SkPacked4444ToA32(s[x]); 1170 alpha[x] = SkPacked4444ToA32(s[x]);
1170 } 1171 }
1171 s = (const SkPMColor16*)((const char*)s + rb); 1172 s = (const SkPMColor16*)((const char*)s + rb);
1172 alpha += alphaRowBytes; 1173 alpha += alphaRowBytes;
1173 } 1174 }
1174 } else if (SkBitmap::kIndex8_Config == config && !src.isOpaque()) { 1175 } else if (kIndex_8_SkColorType == colorType && !src.isOpaque()) {
1175 SkColorTable* ct = src.getColorTable(); 1176 SkColorTable* ct = src.getColorTable();
1176 if (ct) { 1177 if (ct) {
1177 const SkPMColor* SK_RESTRICT table = ct->lockColors(); 1178 const SkPMColor* SK_RESTRICT table = ct->lockColors();
1178 const uint8_t* SK_RESTRICT s = src.getAddr8(0, 0); 1179 const uint8_t* SK_RESTRICT s = src.getAddr8(0, 0);
1179 while (--h >= 0) { 1180 while (--h >= 0) {
1180 for (int x = 0; x < w; x++) { 1181 for (int x = 0; x < w; x++) {
1181 alpha[x] = SkGetPackedA32(table[s[x]]); 1182 alpha[x] = SkGetPackedA32(table[s[x]]);
1182 } 1183 }
1183 s += rb; 1184 s += rb;
1184 alpha += alphaRowBytes; 1185 alpha += alphaRowBytes;
(...skipping 27 matching lines...) Expand all
1212 // compute our (larger?) dst bounds if we have a filter 1213 // compute our (larger?) dst bounds if we have a filter
1213 if (NULL != filter) { 1214 if (NULL != filter) {
1214 identity.reset(); 1215 identity.reset();
1215 srcM.fImage = NULL; 1216 srcM.fImage = NULL;
1216 if (!filter->filterMask(&dstM, srcM, identity, NULL)) { 1217 if (!filter->filterMask(&dstM, srcM, identity, NULL)) {
1217 goto NO_FILTER_CASE; 1218 goto NO_FILTER_CASE;
1218 } 1219 }
1219 dstM.fRowBytes = SkAlign4(dstM.fBounds.width()); 1220 dstM.fRowBytes = SkAlign4(dstM.fBounds.width());
1220 } else { 1221 } else {
1221 NO_FILTER_CASE: 1222 NO_FILTER_CASE:
1222 tmpBitmap.setConfig(SkBitmap::kA8_Config, this->width(), this->height(), 1223 tmpBitmap.setConfig(SkImageInfo::MakeA8(this->width(), this->height()), srcM.fRowBytes);
1223 srcM.fRowBytes);
1224 if (!tmpBitmap.allocPixels(allocator, NULL)) { 1224 if (!tmpBitmap.allocPixels(allocator, NULL)) {
1225 // Allocation of pixels for alpha bitmap failed. 1225 // Allocation of pixels for alpha bitmap failed.
1226 SkDebugf("extractAlpha failed to allocate (%d,%d) alpha bitmap\n", 1226 SkDebugf("extractAlpha failed to allocate (%d,%d) alpha bitmap\n",
1227 tmpBitmap.width(), tmpBitmap.height()); 1227 tmpBitmap.width(), tmpBitmap.height());
1228 return false; 1228 return false;
1229 } 1229 }
1230 GetBitmapAlpha(*this, tmpBitmap.getAddr8(0, 0), srcM.fRowBytes); 1230 GetBitmapAlpha(*this, tmpBitmap.getAddr8(0, 0), srcM.fRowBytes);
1231 if (offset) { 1231 if (offset) {
1232 offset->set(0, 0); 1232 offset->set(0, 0);
1233 } 1233 }
1234 tmpBitmap.swap(*dst); 1234 tmpBitmap.swap(*dst);
1235 return true; 1235 return true;
1236 } 1236 }
1237 srcM.fImage = SkMask::AllocImage(srcM.computeImageSize()); 1237 srcM.fImage = SkMask::AllocImage(srcM.computeImageSize());
1238 SkAutoMaskFreeImage srcCleanup(srcM.fImage); 1238 SkAutoMaskFreeImage srcCleanup(srcM.fImage);
1239 1239
1240 GetBitmapAlpha(*this, srcM.fImage, srcM.fRowBytes); 1240 GetBitmapAlpha(*this, srcM.fImage, srcM.fRowBytes);
1241 if (!filter->filterMask(&dstM, srcM, identity, NULL)) { 1241 if (!filter->filterMask(&dstM, srcM, identity, NULL)) {
1242 goto NO_FILTER_CASE; 1242 goto NO_FILTER_CASE;
1243 } 1243 }
1244 SkAutoMaskFreeImage dstCleanup(dstM.fImage); 1244 SkAutoMaskFreeImage dstCleanup(dstM.fImage);
1245 1245
1246 tmpBitmap.setConfig(SkBitmap::kA8_Config, dstM.fBounds.width(), 1246 tmpBitmap.setConfig(SkImageInfo::MakeA8(dstM.fBounds.width(), dstM.fBounds.h eight()),
1247 dstM.fBounds.height(), dstM.fRowBytes); 1247 dstM.fRowBytes);
1248 if (!tmpBitmap.allocPixels(allocator, NULL)) { 1248 if (!tmpBitmap.allocPixels(allocator, NULL)) {
1249 // Allocation of pixels for alpha bitmap failed. 1249 // Allocation of pixels for alpha bitmap failed.
1250 SkDebugf("extractAlpha failed to allocate (%d,%d) alpha bitmap\n", 1250 SkDebugf("extractAlpha failed to allocate (%d,%d) alpha bitmap\n",
1251 tmpBitmap.width(), tmpBitmap.height()); 1251 tmpBitmap.width(), tmpBitmap.height());
1252 return false; 1252 return false;
1253 } 1253 }
1254 memcpy(tmpBitmap.getPixels(), dstM.fImage, dstM.computeImageSize()); 1254 memcpy(tmpBitmap.getPixels(), dstM.fImage, dstM.computeImageSize());
1255 if (offset) { 1255 if (offset) {
1256 offset->set(dstM.fBounds.fLeft, dstM.fBounds.fTop); 1256 offset->set(dstM.fBounds.fLeft, dstM.fBounds.fTop);
1257 } 1257 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes()); 1430 SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes());
1431 } else { 1431 } else {
1432 SkASSERT(NULL == fColorTable); 1432 SkASSERT(NULL == fColorTable);
1433 } 1433 }
1434 } 1434 }
1435 #endif 1435 #endif
1436 1436
1437 #ifndef SK_IGNORE_TO_STRING 1437 #ifndef SK_IGNORE_TO_STRING
1438 void SkBitmap::toString(SkString* str) const { 1438 void SkBitmap::toString(SkString* str) const {
1439 1439
1440 static const char* gConfigNames[kConfigCount] = { 1440 static const char* gColorTypeNames[kLastEnum_SkColorType + 1] = {
1441 "NONE", "A8", "INDEX8", "565", "4444", "8888" 1441 "UNKNOWN", "A8", "565", "4444", "RGBA", "BGRA", "INDEX8",
1442 }; 1442 };
1443 1443
1444 str->appendf("bitmap: ((%d, %d) %s", this->width(), this->height(), 1444 str->appendf("bitmap: ((%d, %d) %s", this->width(), this->height(),
1445 gConfigNames[this->config()]); 1445 gColorTypeNames[this->colorType()]);
1446 1446
1447 str->append(" ("); 1447 str->append(" (");
1448 if (this->isOpaque()) { 1448 if (this->isOpaque()) {
1449 str->append("opaque"); 1449 str->append("opaque");
1450 } else { 1450 } else {
1451 str->append("transparent"); 1451 str->append("transparent");
1452 } 1452 }
1453 if (this->isImmutable()) { 1453 if (this->isImmutable()) {
1454 str->append(", immutable"); 1454 str->append(", immutable");
1455 } else { 1455 } else {
(...skipping 21 matching lines...) Expand all
1477 /////////////////////////////////////////////////////////////////////////////// 1477 ///////////////////////////////////////////////////////////////////////////////
1478 1478
1479 #ifdef SK_DEBUG 1479 #ifdef SK_DEBUG
1480 void SkImageInfo::validate() const { 1480 void SkImageInfo::validate() const {
1481 SkASSERT(fWidth >= 0); 1481 SkASSERT(fWidth >= 0);
1482 SkASSERT(fHeight >= 0); 1482 SkASSERT(fHeight >= 0);
1483 SkASSERT(SkColorTypeIsValid(fColorType)); 1483 SkASSERT(SkColorTypeIsValid(fColorType));
1484 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); 1484 SkASSERT(SkAlphaTypeIsValid(fAlphaType));
1485 } 1485 }
1486 #endif 1486 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698