OLD | NEW |
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 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 } | 939 } |
940 | 940 |
941 SkIRect srcRect, r; | 941 SkIRect srcRect, r; |
942 srcRect.set(0, 0, this->width(), this->height()); | 942 srcRect.set(0, 0, this->width(), this->height()); |
943 if (!r.intersect(srcRect, subset)) { | 943 if (!r.intersect(srcRect, subset)) { |
944 return false; // r is empty (i.e. no intersection) | 944 return false; // r is empty (i.e. no intersection) |
945 } | 945 } |
946 | 946 |
947 if (fPixelRef->getTexture() != NULL) { | 947 if (fPixelRef->getTexture() != NULL) { |
948 // Do a deep copy | 948 // Do a deep copy |
949 SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset); | 949 SkPixelRef* pixelRef = fPixelRef->deepCopy(&subset); |
950 if (pixelRef != NULL) { | 950 if (pixelRef != NULL) { |
951 SkBitmap dst; | 951 SkBitmap dst; |
952 dst.setConfig(this->config(), subset.width(), subset.height(), 0, | 952 dst.setConfig(this->config(), subset.width(), subset.height(), 0, |
953 this->alphaType()); | 953 this->alphaType()); |
954 dst.setIsVolatile(this->isVolatile()); | 954 dst.setIsVolatile(this->isVolatile()); |
955 dst.setPixelRef(pixelRef)->unref(); | 955 dst.setPixelRef(pixelRef)->unref(); |
956 SkDEBUGCODE(dst.validate()); | 956 SkDEBUGCODE(dst.validate()); |
957 result->swap(dst); | 957 result->swap(dst); |
958 return true; | 958 return true; |
959 } | 959 } |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 | 1138 |
1139 paint.setDither(true); | 1139 paint.setDither(true); |
1140 canvas.drawBitmap(*src, 0, 0, &paint); | 1140 canvas.drawBitmap(*src, 0, 0, &paint); |
1141 } | 1141 } |
1142 | 1142 |
1143 dst->swap(tmpDst); | 1143 dst->swap(tmpDst); |
1144 return true; | 1144 return true; |
1145 } | 1145 } |
1146 | 1146 |
1147 bool SkBitmap::deepCopyTo(SkBitmap* dst) const { | 1147 bool SkBitmap::deepCopyTo(SkBitmap* dst) const { |
1148 const SkBitmap::Config dstConfig = this->config(); | 1148 const SkColorType dstCT = this->colorType(); |
1149 const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig); | |
1150 | 1149 |
1151 if (!this->canCopyTo(dstCT)) { | 1150 if (!this->canCopyTo(dstCT)) { |
1152 return false; | 1151 return false; |
1153 } | 1152 } |
1154 | 1153 |
1155 // If we have a PixelRef, and it supports deep copy, use it. | 1154 // If we have a PixelRef, and it supports deep copy, use it. |
1156 // Currently supported only by texture-backed bitmaps. | 1155 // Currently supported only by texture-backed bitmaps. |
1157 if (fPixelRef) { | 1156 if (fPixelRef) { |
1158 SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig); | 1157 SkPixelRef* pixelRef = fPixelRef->deepCopy(); |
1159 if (pixelRef) { | 1158 if (pixelRef) { |
1160 uint32_t rowBytes; | 1159 // Since there is no subset to pass to deepCopy, and deepCopy |
1161 if (this->colorType() == dstCT) { | 1160 // succeeded, the new pixel ref must be identical. |
1162 // Since there is no subset to pass to deepCopy, and deepCopy | 1161 SkASSERT(fPixelRef->info() == pixelRef->info()); |
1163 // succeeded, the new pixel ref must be identical. | 1162 pixelRef->cloneGenID(*fPixelRef); |
1164 SkASSERT(fPixelRef->info() == pixelRef->info()); | |
1165 pixelRef->cloneGenID(*fPixelRef); | |
1166 // Use the same rowBytes as the original. | |
1167 rowBytes = fRowBytes; | |
1168 } else { | |
1169 // With the new config, an appropriate fRowBytes will be compute
d by setConfig. | |
1170 rowBytes = 0; | |
1171 } | |
1172 | 1163 |
1173 SkImageInfo info = fInfo; | 1164 SkImageInfo info = fInfo; |
1174 info.fColorType = dstCT; | 1165 if (!dst->setConfig(info, fRowBytes)) { |
1175 if (!dst->setConfig(info, rowBytes)) { | |
1176 return false; | 1166 return false; |
1177 } | 1167 } |
1178 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); | 1168 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); |
1179 return true; | 1169 return true; |
1180 } | 1170 } |
1181 } | 1171 } |
1182 | 1172 |
1183 if (this->getTexture()) { | 1173 if (this->getTexture()) { |
1184 return false; | 1174 return false; |
1185 } else { | 1175 } else { |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1728 /////////////////////////////////////////////////////////////////////////////// | 1718 /////////////////////////////////////////////////////////////////////////////// |
1729 | 1719 |
1730 #ifdef SK_DEBUG | 1720 #ifdef SK_DEBUG |
1731 void SkImageInfo::validate() const { | 1721 void SkImageInfo::validate() const { |
1732 SkASSERT(fWidth >= 0); | 1722 SkASSERT(fWidth >= 0); |
1733 SkASSERT(fHeight >= 0); | 1723 SkASSERT(fHeight >= 0); |
1734 SkASSERT(SkColorTypeIsValid(fColorType)); | 1724 SkASSERT(SkColorTypeIsValid(fColorType)); |
1735 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); | 1725 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); |
1736 } | 1726 } |
1737 #endif | 1727 #endif |
OLD | NEW |