Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
| 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 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkErrorInternals.h" | 10 #include "SkErrorInternals.h" |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 218 const size_t length = this->readUInt(); | 218 const size_t length = this->readUInt(); |
| 219 if (length > 0) { | 219 if (length > 0) { |
| 220 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 220 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 221 fDecodedBitmapIndex++; | 221 fDecodedBitmapIndex++; |
| 222 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 222 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 223 // A non-zero size means the SkBitmap was encoded. Read the data and pixel | 223 // A non-zero size means the SkBitmap was encoded. Read the data and pixel |
| 224 // offset. | 224 // offset. |
| 225 const void* data = this->skip(length); | 225 const void* data = this->skip(length); |
| 226 const int32_t xOffset = this->readInt(); | 226 const int32_t xOffset = this->readInt(); |
| 227 const int32_t yOffset = this->readInt(); | 227 const int32_t yOffset = this->readInt(); |
| 228 if (fBitmapDecoder != nullptr && fBitmapDecoder(data, length, bitmap )) { | 228 SkIRect subset = SkIRect::MakeXYWH(xOffset, yOffset, width, height); |
| 229 if (bitmap->width() == width && bitmap->height() == height) { | 229 if (this->decodeBitmap(data, length, bitmap, subset)) { |
| 230 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 230 return true; |
| 231 if (0 != xOffset || 0 != yOffset) { | 231 } |
| 232 SkDebugf("SkReadBuffer::readBitmap: heights match," | |
| 233 " but offset is not zero. \nInfo about the bitm ap:" | |
| 234 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncode d" | |
| 235 " data size: %d\n\tOffset: (%d, %d)\n", | |
| 236 fDecodedBitmapIndex, width, height, length, xOf fset, | |
| 237 yOffset); | |
| 238 } | |
| 239 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | |
| 240 // If the width and height match, there should be no offset. | |
| 241 SkASSERT(0 == xOffset && 0 == yOffset); | |
| 242 return true; | |
| 243 } | |
| 244 | 232 |
| 245 // This case can only be reached if extractSubset was called, so | |
| 246 // the recorded width and height must be smaller than or equal t o | |
| 247 // the encoded width and height. | |
| 248 // FIXME (scroggo): This assert assumes that our decoder and the | |
| 249 // sources encoder agree on the width and height which may not | |
| 250 // always be the case. Removing until it can be investigated | |
| 251 // further. | |
| 252 //SkASSERT(width <= bitmap->width() && height <= bitmap->height( )); | |
| 253 | |
| 254 SkBitmap subsetBm; | |
| 255 SkIRect subset = SkIRect::MakeXYWH(xOffset, yOffset, width, heig ht); | |
| 256 if (bitmap->extractSubset(&subsetBm, subset)) { | |
| 257 bitmap->swap(subsetBm); | |
| 258 return true; | |
| 259 } | |
| 260 } | |
| 261 // This bitmap was encoded when written, but we are unable to decode , possibly due to | 233 // This bitmap was encoded when written, but we are unable to decode , possibly due to |
| 262 // not having a decoder. | 234 // not having a decoder. |
| 263 SkErrorInternals::SetError(kParseError_SkError, | 235 SkErrorInternals::SetError(kParseError_SkError, |
| 264 "Could not decode bitmap. Resulting bitma p will be empty."); | 236 "Could not decode bitmap. Resulting bitma p will be empty."); |
| 265 // Even though we weren't able to decode the pixels, the readbuffer should still be | 237 // Even though we weren't able to decode the pixels, the readbuffer should still be |
| 266 // intact, so we return true with an empty bitmap, so we don't force an abort of the | 238 // intact, so we return true with an empty bitmap, so we don't force an abort of the |
| 267 // larger deserialize. | 239 // larger deserialize. |
| 268 bitmap->setInfo(SkImageInfo::MakeUnknown(width, height)); | 240 bitmap->setInfo(SkImageInfo::MakeUnknown(width, height)); |
| 269 return true; | 241 return true; |
| 270 } else if (SkBitmap::ReadRawPixels(this, bitmap)) { | 242 } else if (SkBitmap::ReadRawPixels(this, bitmap)) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 } | 278 } |
| 307 | 279 |
| 308 int originX = this->read32(); | 280 int originX = this->read32(); |
| 309 int originY = this->read32(); | 281 int originY = this->read32(); |
| 310 if (originX < 0 || originY < 0) { | 282 if (originX < 0 || originY < 0) { |
| 311 this->validate(false); | 283 this->validate(false); |
| 312 return nullptr; | 284 return nullptr; |
| 313 } | 285 } |
| 314 | 286 |
| 315 const SkIRect subset = SkIRect::MakeXYWH(originX, originY, width, height); | 287 const SkIRect subset = SkIRect::MakeXYWH(originX, originY, width, height); |
| 288 SkBitmap bitmap; | |
| 289 if (this->decodeBitmap(encoded->data(), encoded->size(), &bitmap, subset)) { | |
| 290 SkImage* image = SkImage::NewFromBitmap(bitmap); | |
|
msarett
2016/02/24 23:30:54
This is the quick and easy fix for tools/get_image
scroggo
2016/02/25 12:52:36
My preference is to replace InstallPixelRefProc, a
| |
| 291 if (image) { | |
| 292 return image; | |
| 293 } | |
| 294 } | |
| 295 | |
| 316 SkImage* image = SkImage::NewFromEncoded(encoded, &subset); | 296 SkImage* image = SkImage::NewFromEncoded(encoded, &subset); |
| 317 if (image) { | 297 if (image) { |
| 318 return image; | 298 return image; |
| 319 } | 299 } |
| 320 | 300 |
| 321 return SkImage::NewFromGenerator( | 301 return SkImage::NewFromGenerator( |
| 322 new EmptyImageGenerator(SkImageInfo::MakeN32Premul(width, height))); | 302 new EmptyImageGenerator(SkImageInfo::MakeN32Premul(width, height))); |
| 323 } | 303 } |
| 324 | 304 |
| 325 SkTypeface* SkReadBuffer::readTypeface() { | 305 SkTypeface* SkReadBuffer::readTypeface() { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 403 return; | 383 return; |
| 404 } | 384 } |
| 405 } else { | 385 } else { |
| 406 if (nullptr == this->readFunctionPtr()) { | 386 if (nullptr == this->readFunctionPtr()) { |
| 407 return; | 387 return; |
| 408 } | 388 } |
| 409 } | 389 } |
| 410 uint32_t sizeRecorded = fReader.readU32(); | 390 uint32_t sizeRecorded = fReader.readU32(); |
| 411 fReader.skip(sizeRecorded); | 391 fReader.skip(sizeRecorded); |
| 412 } | 392 } |
| 393 | |
| 394 bool SkReadBuffer::decodeBitmap(const void* data, size_t length, SkBitmap* bitma p, | |
| 395 const SkIRect& subset) { | |
| 396 if (fBitmapDecoder != nullptr && fBitmapDecoder(data, length, bitmap)) { | |
| 397 if (bitmap->width() == subset.width() && bitmap->height() == subset.heig ht()) { | |
| 398 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | |
| 399 if (0 != subset.x() || 0 != subset.y()) { | |
| 400 SkDebugf("SkReadBuffer::readBitmap: heights match," | |
| 401 " but offset is not zero. \nInfo about the bitmap:" | |
| 402 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncoded" | |
| 403 " data size: %d\n\tOffset: (%d, %d)\n", | |
| 404 fDecodedBitmapIndex, subset.width(), subset.height(), l ength, subset.x(), | |
| 405 subset.y()); | |
| 406 } | |
| 407 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | |
| 408 // If the width and height match, there should be no offset. | |
| 409 SkASSERT(0 == subset.x() && 0 == subset.y()); | |
| 410 return true; | |
| 411 } | |
| 412 | |
| 413 // This case can only be reached if extractSubset was called, so | |
| 414 // the recorded width and height must be smaller than or equal to | |
| 415 // the encoded width and height. | |
| 416 // FIXME (scroggo): This assert assumes that our decoder and the | |
| 417 // sources encoder agree on the width and height which may not | |
| 418 // always be the case. Removing until it can be investigated | |
| 419 // further. | |
| 420 //SkASSERT(subset.width() <= bitmap->width() && subset.height() <= bitma p->height()); | |
| 421 SkBitmap subsetBm; | |
| 422 if (bitmap->extractSubset(&subsetBm, subset)) { | |
| 423 bitmap->swap(subsetBm); | |
| 424 return true; | |
| 425 } | |
| 426 } | |
| 427 | |
| 428 return false; | |
| 429 } | |
| OLD | NEW |