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

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

Issue 536003002: Hide fields in SkImageInfo (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix qt Created 6 years, 3 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 | « samplecode/SampleFatBits.cpp ('k') | src/core/SkBitmapDevice.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 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 87 }
88 88
89 void SkBitmap::reset() { 89 void SkBitmap::reset() {
90 this->freePixels(); 90 this->freePixels();
91 sk_bzero(this, sizeof(*this)); 91 sk_bzero(this, sizeof(*this));
92 } 92 }
93 93
94 void SkBitmap::getBounds(SkRect* bounds) const { 94 void SkBitmap::getBounds(SkRect* bounds) const {
95 SkASSERT(bounds); 95 SkASSERT(bounds);
96 bounds->set(0, 0, 96 bounds->set(0, 0,
97 SkIntToScalar(fInfo.fWidth), SkIntToScalar(fInfo.fHeight)); 97 SkIntToScalar(fInfo.width()), SkIntToScalar(fInfo.height()));
98 } 98 }
99 99
100 void SkBitmap::getBounds(SkIRect* bounds) const { 100 void SkBitmap::getBounds(SkIRect* bounds) const {
101 SkASSERT(bounds); 101 SkASSERT(bounds);
102 bounds->set(0, 0, fInfo.fWidth, fInfo.fHeight); 102 bounds->set(0, 0, fInfo.width(), fInfo.height());
103 } 103 }
104 104
105 /////////////////////////////////////////////////////////////////////////////// 105 ///////////////////////////////////////////////////////////////////////////////
106 106
107 bool SkBitmap::setInfo(const SkImageInfo& origInfo, size_t rowBytes) { 107 bool SkBitmap::setInfo(const SkImageInfo& info, size_t rowBytes) {
108 SkImageInfo info = origInfo; 108 SkAlphaType newAT = info.alphaType();
109 109 if (!SkColorTypeValidateAlphaType(info.colorType(), info.alphaType(), &newAT )) {
110 if (!SkColorTypeValidateAlphaType(info.fColorType, info.fAlphaType,
111 &info.fAlphaType)) {
112 return reset_return_false(this); 110 return reset_return_false(this);
113 } 111 }
112 // don't look at info.alphaType(), since newAT is the real value...
114 113
115 // require that rowBytes fit in 31bits 114 // require that rowBytes fit in 31bits
116 int64_t mrb = info.minRowBytes64(); 115 int64_t mrb = info.minRowBytes64();
117 if ((int32_t)mrb != mrb) { 116 if ((int32_t)mrb != mrb) {
118 return reset_return_false(this); 117 return reset_return_false(this);
119 } 118 }
120 if ((int64_t)rowBytes != (int32_t)rowBytes) { 119 if ((int64_t)rowBytes != (int32_t)rowBytes) {
121 return reset_return_false(this); 120 return reset_return_false(this);
122 } 121 }
123 122
124 if (info.width() < 0 || info.height() < 0) { 123 if (info.width() < 0 || info.height() < 0) {
125 return reset_return_false(this); 124 return reset_return_false(this);
126 } 125 }
127 126
128 if (kUnknown_SkColorType == info.colorType()) { 127 if (kUnknown_SkColorType == info.colorType()) {
129 rowBytes = 0; 128 rowBytes = 0;
130 } else if (0 == rowBytes) { 129 } else if (0 == rowBytes) {
131 rowBytes = (size_t)mrb; 130 rowBytes = (size_t)mrb;
132 } else if (!info.validRowBytes(rowBytes)) { 131 } else if (!info.validRowBytes(rowBytes)) {
133 return reset_return_false(this); 132 return reset_return_false(this);
134 } 133 }
135 134
136 this->freePixels(); 135 this->freePixels();
137 136
138 fInfo = info; 137 fInfo = info.makeAlphaType(newAT);
139 fRowBytes = SkToU32(rowBytes); 138 fRowBytes = SkToU32(rowBytes);
140 return true; 139 return true;
141 } 140 }
142 141
143 bool SkBitmap::setAlphaType(SkAlphaType alphaType) { 142 bool SkBitmap::setAlphaType(SkAlphaType newAlphaType) {
144 if (!SkColorTypeValidateAlphaType(fInfo.fColorType, alphaType, &alphaType)) { 143 if (!SkColorTypeValidateAlphaType(fInfo.colorType(), newAlphaType, &newAlpha Type)) {
145 return false; 144 return false;
146 } 145 }
147 if (fInfo.fAlphaType != alphaType) { 146 if (fInfo.alphaType() != newAlphaType) {
148 fInfo.fAlphaType = alphaType; 147 fInfo = fInfo.makeAlphaType(newAlphaType);
149 if (fPixelRef) { 148 if (fPixelRef) {
150 fPixelRef->changeAlphaType(alphaType); 149 fPixelRef->changeAlphaType(newAlphaType);
151 } 150 }
152 } 151 }
153 return true; 152 return true;
154 } 153 }
155 154
156 void SkBitmap::updatePixelsFromRef() const { 155 void SkBitmap::updatePixelsFromRef() const {
157 if (NULL != fPixelRef) { 156 if (NULL != fPixelRef) {
158 if (fPixelLockCount > 0) { 157 if (fPixelLockCount > 0) {
159 SkASSERT(fPixelRef->isLocked()); 158 SkASSERT(fPixelRef->isLocked());
160 159
(...skipping 11 matching lines...) Expand all
172 fColorTable = NULL; 171 fColorTable = NULL;
173 } 172 }
174 } 173 }
175 } 174 }
176 175
177 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) { 176 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) {
178 #ifdef SK_DEBUG 177 #ifdef SK_DEBUG
179 if (pr) { 178 if (pr) {
180 if (kUnknown_SkColorType != fInfo.colorType()) { 179 if (kUnknown_SkColorType != fInfo.colorType()) {
181 const SkImageInfo& prInfo = pr->info(); 180 const SkImageInfo& prInfo = pr->info();
182 SkASSERT(fInfo.fWidth <= prInfo.fWidth); 181 SkASSERT(fInfo.width() <= prInfo.width());
183 SkASSERT(fInfo.fHeight <= prInfo.fHeight); 182 SkASSERT(fInfo.height() <= prInfo.height());
184 SkASSERT(fInfo.fColorType == prInfo.fColorType); 183 SkASSERT(fInfo.colorType() == prInfo.colorType());
185 switch (prInfo.fAlphaType) { 184 switch (prInfo.alphaType()) {
186 case kIgnore_SkAlphaType: 185 case kIgnore_SkAlphaType:
187 SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType); 186 SkASSERT(fInfo.alphaType() == kIgnore_SkAlphaType);
188 break; 187 break;
189 case kOpaque_SkAlphaType: 188 case kOpaque_SkAlphaType:
190 case kPremul_SkAlphaType: 189 case kPremul_SkAlphaType:
191 SkASSERT(fInfo.fAlphaType == kOpaque_SkAlphaType || 190 SkASSERT(fInfo.alphaType() == kOpaque_SkAlphaType ||
192 fInfo.fAlphaType == kPremul_SkAlphaType); 191 fInfo.alphaType() == kPremul_SkAlphaType);
193 break; 192 break;
194 case kUnpremul_SkAlphaType: 193 case kUnpremul_SkAlphaType:
195 SkASSERT(fInfo.fAlphaType == kOpaque_SkAlphaType || 194 SkASSERT(fInfo.alphaType() == kOpaque_SkAlphaType ||
196 fInfo.fAlphaType == kUnpremul_SkAlphaType); 195 fInfo.alphaType() == kUnpremul_SkAlphaType);
197 break; 196 break;
198 } 197 }
199 } 198 }
200 } 199 }
201 #endif 200 #endif
202 201
203 if (pr) { 202 if (pr) {
204 const SkImageInfo& info = pr->info(); 203 const SkImageInfo& info = pr->info();
205 fPixelRefOrigin.set(SkPin32(dx, 0, info.fWidth), 204 fPixelRefOrigin.set(SkPin32(dx, 0, info.width()), SkPin32(dy, 0, info.he ight()));
206 SkPin32(dy, 0, info.fHeight));
207 } else { 205 } else {
208 // ignore dx,dy if there is no pixelref 206 // ignore dx,dy if there is no pixelref
209 fPixelRefOrigin.setZero(); 207 fPixelRefOrigin.setZero();
210 } 208 }
211 209
212 if (fPixelRef != pr) { 210 if (fPixelRef != pr) {
213 this->freePixels(); 211 this->freePixels();
214 SkASSERT(NULL == fPixelRef); 212 SkASSERT(NULL == fPixelRef);
215 213
216 SkSafeRef(pr); 214 SkSafeRef(pr);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 // TODO: lockPixels could/should return bool or void*/NULL 301 // TODO: lockPixels could/should return bool or void*/NULL
304 this->lockPixels(); 302 this->lockPixels();
305 if (NULL == this->getPixels()) { 303 if (NULL == this->getPixels()) {
306 return reset_return_false(this); 304 return reset_return_false(this);
307 } 305 }
308 return true; 306 return true;
309 } 307 }
310 308
311 bool SkBitmap::tryAllocPixels(const SkImageInfo& requestedInfo, SkPixelRefFactor y* factory, 309 bool SkBitmap::tryAllocPixels(const SkImageInfo& requestedInfo, SkPixelRefFactor y* factory,
312 SkColorTable* ctable) { 310 SkColorTable* ctable) {
313 if (kIndex_8_SkColorType == requestedInfo.fColorType && NULL == ctable) { 311 if (kIndex_8_SkColorType == requestedInfo.colorType() && NULL == ctable) {
314 return reset_return_false(this); 312 return reset_return_false(this);
315 } 313 }
316 if (!this->setInfo(requestedInfo)) { 314 if (!this->setInfo(requestedInfo)) {
317 return reset_return_false(this); 315 return reset_return_false(this);
318 } 316 }
319 317
320 // setInfo may have corrected info (e.g. 565 is always opaque). 318 // setInfo may have corrected info (e.g. 565 is always opaque).
321 const SkImageInfo& correctedInfo = this->info(); 319 const SkImageInfo& correctedInfo = this->info();
322 320
323 SkMallocPixelRef::PRFactory defaultFactory; 321 SkMallocPixelRef::PRFactory defaultFactory;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 } else { 458 } else {
461 // If destination has different stride than us, then copy line by line. 459 // If destination has different stride than us, then copy line by line.
462 if (fInfo.getSafeSize(dstRowBytes) > dstSize) { 460 if (fInfo.getSafeSize(dstRowBytes) > dstSize) {
463 return false; 461 return false;
464 } else { 462 } else {
465 // Just copy what we need on each line. 463 // Just copy what we need on each line.
466 size_t rowBytes = fInfo.minRowBytes(); 464 size_t rowBytes = fInfo.minRowBytes();
467 SkAutoLockPixels lock(*this); 465 SkAutoLockPixels lock(*this);
468 const uint8_t* srcP = reinterpret_cast<const uint8_t*>(getPixels()); 466 const uint8_t* srcP = reinterpret_cast<const uint8_t*>(getPixels());
469 uint8_t* dstP = reinterpret_cast<uint8_t*>(dst); 467 uint8_t* dstP = reinterpret_cast<uint8_t*>(dst);
470 for (int row = 0; row < fInfo.fHeight; 468 for (int row = 0; row < fInfo.height(); row++, srcP += fRowBytes, ds tP += dstRowBytes) {
471 row++, srcP += fRowBytes, dstP += dstRowBytes) {
472 memcpy(dstP, srcP, rowBytes); 469 memcpy(dstP, srcP, rowBytes);
473 } 470 }
474 471
475 return true; 472 return true;
476 } 473 }
477 } 474 }
478 } 475 }
479 476
480 /////////////////////////////////////////////////////////////////////////////// 477 ///////////////////////////////////////////////////////////////////////////////
481 478
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 } 847 }
851 if (0 == requestedDstInfo.width() || 0 == requestedDstInfo.height()) { 848 if (0 == requestedDstInfo.width() || 0 == requestedDstInfo.height()) {
852 return false; 849 return false;
853 } 850 }
854 851
855 SkIRect srcR = SkIRect::MakeXYWH(x, y, requestedDstInfo.width(), requestedDs tInfo.height()); 852 SkIRect srcR = SkIRect::MakeXYWH(x, y, requestedDstInfo.width(), requestedDs tInfo.height());
856 if (!srcR.intersect(0, 0, this->width(), this->height())) { 853 if (!srcR.intersect(0, 0, this->width(), this->height())) {
857 return false; 854 return false;
858 } 855 }
859 856
860 SkImageInfo dstInfo = requestedDstInfo;
861 // the intersect may have shrunk info's logical size 857 // the intersect may have shrunk info's logical size
862 dstInfo.fWidth = srcR.width(); 858 const SkImageInfo dstInfo = requestedDstInfo.makeWH(srcR.width(), srcR.heigh t());
863 dstInfo.fHeight = srcR.height();
864 859
865 // if x or y are negative, then we have to adjust pixels 860 // if x or y are negative, then we have to adjust pixels
866 if (x > 0) { 861 if (x > 0) {
867 x = 0; 862 x = 0;
868 } 863 }
869 if (y > 0) { 864 if (y > 0) {
870 y = 0; 865 y = 0;
871 } 866 }
872 // here x,y are either 0 or negative 867 // here x,y are either 0 or negative
873 dstPixels = ((char*)dstPixels - y * dstRB - x * dstInfo.bytesPerPixel()); 868 dstPixels = ((char*)dstPixels - y * dstRB - x * dstInfo.bytesPerPixel());
874 869
875 ////////////// 870 //////////////
876 871
877 SkAutoLockPixels alp(*this); 872 SkAutoLockPixels alp(*this);
878 873
879 // since we don't stop creating un-pixeled devices yet, check for no pixels here 874 // since we don't stop creating un-pixeled devices yet, check for no pixels here
880 if (NULL == this->getPixels()) { 875 if (NULL == this->getPixels()) {
881 return false; 876 return false;
882 } 877 }
883 878
884 SkImageInfo srcInfo = this->info(); 879 const SkImageInfo srcInfo = this->info().makeWH(dstInfo.width(), dstInfo.hei ght());
885 srcInfo.fWidth = dstInfo.width();
886 srcInfo.fHeight = dstInfo.height();
887 880
888 const void* srcPixels = this->getAddr(srcR.x(), srcR.y()); 881 const void* srcPixels = this->getAddr(srcR.x(), srcR.y());
889 return SkPixelInfo::CopyPixels(dstInfo, dstPixels, dstRB, srcInfo, srcPixels , this->rowBytes(), 882 return SkPixelInfo::CopyPixels(dstInfo, dstPixels, dstRB, srcInfo, srcPixels , this->rowBytes(),
890 this->getColorTable()); 883 this->getColorTable());
891 } 884 }
892 885
893 bool SkBitmap::copyTo(SkBitmap* dst, SkColorType dstColorType, Allocator* alloc) const { 886 bool SkBitmap::copyTo(SkBitmap* dst, SkColorType dstColorType, Allocator* alloc) const {
894 if (!this->canCopyTo(dstColorType)) { 887 if (!this->canCopyTo(dstColorType)) {
895 return false; 888 return false;
896 } 889 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 922
930 // we lock this now, since we may need its colortable 923 // we lock this now, since we may need its colortable
931 SkAutoLockPixels srclock(*src); 924 SkAutoLockPixels srclock(*src);
932 if (!src->readyToDraw()) { 925 if (!src->readyToDraw()) {
933 return false; 926 return false;
934 } 927 }
935 928
936 // The only way to be readyToDraw is if fPixelRef is non NULL. 929 // The only way to be readyToDraw is if fPixelRef is non NULL.
937 SkASSERT(fPixelRef != NULL); 930 SkASSERT(fPixelRef != NULL);
938 931
939 SkImageInfo dstInfo = src->info(); 932 const SkImageInfo dstInfo = src->info().makeColorType(dstColorType);
940 dstInfo.fColorType = dstColorType;
941 933
942 SkBitmap tmpDst; 934 SkBitmap tmpDst;
943 if (!tmpDst.setInfo(dstInfo)) { 935 if (!tmpDst.setInfo(dstInfo)) {
944 return false; 936 return false;
945 } 937 }
946 938
947 // allocate colortable if srcConfig == kIndex8_Config 939 // allocate colortable if srcConfig == kIndex8_Config
948 SkAutoTUnref<SkColorTable> ctable; 940 SkAutoTUnref<SkColorTable> ctable;
949 if (dstColorType == kIndex_8_SkColorType) { 941 if (dstColorType == kIndex_8_SkColorType) {
950 // TODO: can we just ref() the src colortable? Is it reentrant-safe? 942 // TODO: can we just ref() the src colortable? Is it reentrant-safe?
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 // succeeded, the new pixel ref must be identical. 994 // succeeded, the new pixel ref must be identical.
1003 SkASSERT(fPixelRef->info() == pixelRef->info()); 995 SkASSERT(fPixelRef->info() == pixelRef->info());
1004 pixelRef->cloneGenID(*fPixelRef); 996 pixelRef->cloneGenID(*fPixelRef);
1005 // Use the same rowBytes as the original. 997 // Use the same rowBytes as the original.
1006 rowBytes = fRowBytes; 998 rowBytes = fRowBytes;
1007 } else { 999 } else {
1008 // With the new config, an appropriate fRowBytes will be compute d by setInfo. 1000 // With the new config, an appropriate fRowBytes will be compute d by setInfo.
1009 rowBytes = 0; 1001 rowBytes = 0;
1010 } 1002 }
1011 1003
1012 SkImageInfo info = fInfo; 1004 const SkImageInfo info = fInfo.makeColorType(dstCT);
1013 info.fColorType = dstCT;
1014 if (!dst->setInfo(info, rowBytes)) { 1005 if (!dst->setInfo(info, rowBytes)) {
1015 return false; 1006 return false;
1016 } 1007 }
1017 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); 1008 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref();
1018 return true; 1009 return true;
1019 } 1010 }
1020 } 1011 }
1021 1012
1022 if (this->getTexture()) { 1013 if (this->getTexture()) {
1023 return false; 1014 return false;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 SkASSERT(fPixelLockCount >= 0); 1322 SkASSERT(fPixelLockCount >= 0);
1332 1323
1333 if (fPixels) { 1324 if (fPixels) {
1334 SkASSERT(fPixelRef); 1325 SkASSERT(fPixelRef);
1335 SkASSERT(fPixelLockCount > 0); 1326 SkASSERT(fPixelLockCount > 0);
1336 SkASSERT(fPixelRef->isLocked()); 1327 SkASSERT(fPixelRef->isLocked());
1337 SkASSERT(fPixelRef->rowBytes() == fRowBytes); 1328 SkASSERT(fPixelRef->rowBytes() == fRowBytes);
1338 SkASSERT(fPixelRefOrigin.fX >= 0); 1329 SkASSERT(fPixelRefOrigin.fX >= 0);
1339 SkASSERT(fPixelRefOrigin.fY >= 0); 1330 SkASSERT(fPixelRefOrigin.fY >= 0);
1340 SkASSERT(fPixelRef->info().width() >= (int)this->width() + fPixelRefOrig in.fX); 1331 SkASSERT(fPixelRef->info().width() >= (int)this->width() + fPixelRefOrig in.fX);
1341 SkASSERT(fPixelRef->info().fHeight >= (int)this->height() + fPixelRefOri gin.fY); 1332 SkASSERT(fPixelRef->info().height() >= (int)this->height() + fPixelRefOr igin.fY);
1342 SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes()); 1333 SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes());
1343 } else { 1334 } else {
1344 SkASSERT(NULL == fColorTable); 1335 SkASSERT(NULL == fColorTable);
1345 } 1336 }
1346 } 1337 }
1347 #endif 1338 #endif
1348 1339
1349 #ifndef SK_IGNORE_TO_STRING 1340 #ifndef SK_IGNORE_TO_STRING
1350 void SkBitmap::toString(SkString* str) const { 1341 void SkBitmap::toString(SkString* str) const {
1351 1342
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1389 /////////////////////////////////////////////////////////////////////////////// 1380 ///////////////////////////////////////////////////////////////////////////////
1390 1381
1391 #ifdef SK_DEBUG 1382 #ifdef SK_DEBUG
1392 void SkImageInfo::validate() const { 1383 void SkImageInfo::validate() const {
1393 SkASSERT(fWidth >= 0); 1384 SkASSERT(fWidth >= 0);
1394 SkASSERT(fHeight >= 0); 1385 SkASSERT(fHeight >= 0);
1395 SkASSERT(SkColorTypeIsValid(fColorType)); 1386 SkASSERT(SkColorTypeIsValid(fColorType));
1396 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); 1387 SkASSERT(SkAlphaTypeIsValid(fAlphaType));
1397 } 1388 }
1398 #endif 1389 #endif
OLDNEW
« no previous file with comments | « samplecode/SampleFatBits.cpp ('k') | src/core/SkBitmapDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698