| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2007 The Android Open Source Project | 3 * Copyright 2007 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 "SkPictureFlat.h" | 10 #include "SkPictureFlat.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 SkASSERT(scaleX == 0 || skewX == 0); | 115 SkASSERT(scaleX == 0 || skewX == 0); |
| 116 SkASSERT(scaleY == 0 || skewY == 0); | 116 SkASSERT(scaleY == 0 || skewY == 0); |
| 117 SkASSERT(perspX == 0); | 117 SkASSERT(perspX == 0); |
| 118 SkASSERT(perspY == 0); | 118 SkASSERT(perspY == 0); |
| 119 } | 119 } |
| 120 #endif | 120 #endif |
| 121 | 121 |
| 122 | 122 |
| 123 /////////////////////////////////////////////////////////////////////////////// | 123 /////////////////////////////////////////////////////////////////////////////// |
| 124 | 124 |
| 125 SkPicture::SkPicture() { | 125 SkPicture::SkPicture() |
| 126 : fAccelData(NULL) |
| 127 , fContentFlags(0) { |
| 126 this->needsNewGenID(); | 128 this->needsNewGenID(); |
| 127 fRecord = NULL; | 129 fRecord = NULL; |
| 128 fPlayback = NULL; | 130 fPlayback = NULL; |
| 129 fWidth = fHeight = 0; | 131 fWidth = fHeight = 0; |
| 130 fAccelData = NULL; | |
| 131 } | 132 } |
| 132 | 133 |
| 133 SkPicture::SkPicture(const SkPicture& src) | 134 SkPicture::SkPicture(const SkPicture& src) |
| 134 : INHERITED() | 135 : INHERITED() |
| 135 , fAccelData(NULL) { | 136 , fAccelData(NULL) |
| 137 , fContentFlags(src.fContentFlags) { |
| 136 this->needsNewGenID(); | 138 this->needsNewGenID(); |
| 137 fWidth = src.fWidth; | 139 fWidth = src.fWidth; |
| 138 fHeight = src.fHeight; | 140 fHeight = src.fHeight; |
| 139 fRecord = NULL; | 141 fRecord = NULL; |
| 140 | 142 |
| 141 /* We want to copy the src's playback. However, if that hasn't been built | 143 /* We want to copy the src's playback. However, if that hasn't been built |
| 142 yet, we need to fake a call to endRecording() without actually calling | 144 yet, we need to fake a call to endRecording() without actually calling |
| 143 it (since it is destructive, and we don't want to change src). | 145 it (since it is destructive, and we don't want to change src). |
| 144 */ | 146 */ |
| 145 if (src.fPlayback) { | 147 if (src.fPlayback) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 } | 202 } |
| 201 | 203 |
| 202 void SkPicture::swap(SkPicture& other) { | 204 void SkPicture::swap(SkPicture& other) { |
| 203 SkTSwap(fUniqueID, other.fUniqueID); | 205 SkTSwap(fUniqueID, other.fUniqueID); |
| 204 SkTSwap(fRecord, other.fRecord); | 206 SkTSwap(fRecord, other.fRecord); |
| 205 SkTSwap(fPlayback, other.fPlayback); | 207 SkTSwap(fPlayback, other.fPlayback); |
| 206 SkTSwap(fAccelData, other.fAccelData); | 208 SkTSwap(fAccelData, other.fAccelData); |
| 207 SkTSwap(fWidth, other.fWidth); | 209 SkTSwap(fWidth, other.fWidth); |
| 208 SkTSwap(fHeight, other.fHeight); | 210 SkTSwap(fHeight, other.fHeight); |
| 209 fPathHeap.swap(&other.fPathHeap); | 211 fPathHeap.swap(&other.fPathHeap); |
| 212 SkTSwap(fContentFlags, other.fContentFlags); |
| 210 } | 213 } |
| 211 | 214 |
| 212 SkPicture* SkPicture::clone() const { | 215 SkPicture* SkPicture::clone() const { |
| 213 SkPicture* clonedPicture = SkNEW(SkPicture); | 216 SkPicture* clonedPicture = SkNEW(SkPicture); |
| 214 this->clone(clonedPicture, 1); | 217 this->clone(clonedPicture, 1); |
| 215 return clonedPicture; | 218 return clonedPicture; |
| 216 } | 219 } |
| 217 | 220 |
| 218 void SkPicture::clone(SkPicture* pictures, int count) const { | 221 void SkPicture::clone(SkPicture* pictures, int count) const { |
| 219 SkPictCopyInfo copyInfo; | 222 SkPictCopyInfo copyInfo; |
| 220 SkPictInfo info; | 223 SkPictInfo info; |
| 221 this->createHeader(&info); | 224 this->createHeader(&info); |
| 222 | 225 |
| 223 for (int i = 0; i < count; i++) { | 226 for (int i = 0; i < count; i++) { |
| 224 SkPicture* clone = &pictures[i]; | 227 SkPicture* clone = &pictures[i]; |
| 225 | 228 |
| 226 clone->needsNewGenID(); | 229 clone->needsNewGenID(); |
| 227 clone->fWidth = fWidth; | 230 clone->fWidth = fWidth; |
| 228 clone->fHeight = fHeight; | 231 clone->fHeight = fHeight; |
| 229 SkSafeSetNull(clone->fRecord); | 232 SkSafeSetNull(clone->fRecord); |
| 230 SkDELETE(clone->fPlayback); | 233 SkDELETE(clone->fPlayback); |
| 234 clone->fContentFlags = fContentFlags; |
| 231 | 235 |
| 232 /* We want to copy the src's playback. However, if that hasn't been bui
lt | 236 /* We want to copy the src's playback. However, if that hasn't been bui
lt |
| 233 yet, we need to fake a call to endRecording() without actually calli
ng | 237 yet, we need to fake a call to endRecording() without actually calli
ng |
| 234 it (since it is destructive, and we don't want to change src). | 238 it (since it is destructive, and we don't want to change src). |
| 235 */ | 239 */ |
| 236 if (fPlayback) { | 240 if (fPlayback) { |
| 237 clone->fPlayback = SkNEW_ARGS(SkPicturePlayback, (clone, *fPlayback,
©Info)); | 241 clone->fPlayback = SkNEW_ARGS(SkPicturePlayback, (clone, *fPlayback,
©Info)); |
| 238 SkASSERT(NULL == fRecord); | 242 SkASSERT(NULL == fRecord); |
| 239 clone->fUniqueID = this->uniqueID(); // need to call method to ensur
e != 0 | 243 clone->fUniqueID = this->uniqueID(); // need to call method to ensur
e != 0 |
| 240 } else if (fRecord) { | 244 } else if (fRecord) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 264 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES | 268 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
| 265 | 269 |
| 266 SkCanvas* SkPicture::beginRecording(int width, int height, | 270 SkCanvas* SkPicture::beginRecording(int width, int height, |
| 267 uint32_t recordingFlags) { | 271 uint32_t recordingFlags) { |
| 268 if (fPlayback) { | 272 if (fPlayback) { |
| 269 SkDELETE(fPlayback); | 273 SkDELETE(fPlayback); |
| 270 fPlayback = NULL; | 274 fPlayback = NULL; |
| 271 } | 275 } |
| 272 SkSafeUnref(fAccelData); | 276 SkSafeUnref(fAccelData); |
| 273 SkSafeSetNull(fRecord); | 277 SkSafeSetNull(fRecord); |
| 278 fContentFlags = 0; |
| 274 | 279 |
| 275 this->needsNewGenID(); | 280 this->needsNewGenID(); |
| 276 | 281 |
| 277 // Must be set before calling createBBoxHierarchy | 282 // Must be set before calling createBBoxHierarchy |
| 278 fWidth = width; | 283 fWidth = width; |
| 279 fHeight = height; | 284 fHeight = height; |
| 280 | 285 |
| 281 const SkISize size = SkISize::Make(width, height); | 286 const SkISize size = SkISize::Make(width, height); |
| 282 | 287 |
| 283 if (recordingFlags & kOptimizeForClippedPlayback_RecordingFlag) { | 288 if (recordingFlags & kOptimizeForClippedPlayback_RecordingFlag) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 298 SkCanvas* SkPicture::beginRecording(int width, int height, | 303 SkCanvas* SkPicture::beginRecording(int width, int height, |
| 299 SkBBHFactory* bbhFactory, | 304 SkBBHFactory* bbhFactory, |
| 300 uint32_t recordingFlags) { | 305 uint32_t recordingFlags) { |
| 301 if (fPlayback) { | 306 if (fPlayback) { |
| 302 SkDELETE(fPlayback); | 307 SkDELETE(fPlayback); |
| 303 fPlayback = NULL; | 308 fPlayback = NULL; |
| 304 } | 309 } |
| 305 SkSafeUnref(fAccelData); | 310 SkSafeUnref(fAccelData); |
| 306 SkSafeSetNull(fRecord); | 311 SkSafeSetNull(fRecord); |
| 307 SkASSERT(NULL == fPathHeap); | 312 SkASSERT(NULL == fPathHeap); |
| 313 fContentFlags = 0; |
| 308 | 314 |
| 309 this->needsNewGenID(); | 315 this->needsNewGenID(); |
| 310 | 316 |
| 311 fWidth = width; | 317 fWidth = width; |
| 312 fHeight = height; | 318 fHeight = height; |
| 313 | 319 |
| 314 const SkISize size = SkISize::Make(width, height); | 320 const SkISize size = SkISize::Make(width, height); |
| 315 | 321 |
| 316 if (NULL != bbhFactory) { | 322 if (NULL != bbhFactory) { |
| 317 SkAutoTUnref<SkBBoxHierarchy> tree((*bbhFactory)(width, height)); | 323 SkAutoTUnref<SkBBoxHierarchy> tree((*bbhFactory)(width, height)); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 *pInfo = info; | 451 *pInfo = info; |
| 446 } | 452 } |
| 447 return true; | 453 return true; |
| 448 } | 454 } |
| 449 | 455 |
| 450 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height) | 456 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height) |
| 451 : fPlayback(playback) | 457 : fPlayback(playback) |
| 452 , fRecord(NULL) | 458 , fRecord(NULL) |
| 453 , fWidth(width) | 459 , fWidth(width) |
| 454 , fHeight(height) | 460 , fHeight(height) |
| 455 , fAccelData(NULL) { | 461 , fAccelData(NULL) |
| 462 , fContentFlags(0) { |
| 456 this->needsNewGenID(); | 463 this->needsNewGenID(); |
| 457 } | 464 } |
| 458 | 465 |
| 459 SkPicture* SkPicture::CreateFromStream(SkStream* stream, InstallPixelRefProc pro
c) { | 466 SkPicture* SkPicture::CreateFromStream(SkStream* stream, InstallPixelRefProc pro
c) { |
| 460 SkPictInfo info; | 467 SkPictInfo info; |
| 461 | 468 |
| 462 if (!InternalOnly_StreamIsSKP(stream, &info)) { | 469 if (!InternalOnly_StreamIsSKP(stream, &info)) { |
| 463 return NULL; | 470 return NULL; |
| 464 } | 471 } |
| 465 | 472 |
| 466 SkPicture* newPict = SkNEW_ARGS(SkPicture, (NULL, info.fWidth, info.fHeight)
); | 473 SkPicture* newPict = SkNEW_ARGS(SkPicture, (NULL, info.fWidth, info.fHeight)
); |
| 467 | 474 |
| 475 newPict->fContentFlags = info.fFlags & ~SkPictInfo::kAll_Mask; |
| 476 |
| 468 // Check to see if there is a playback to recreate. | 477 // Check to see if there is a playback to recreate. |
| 469 if (stream->readBool()) { | 478 if (stream->readBool()) { |
| 470 SkPicturePlayback* playback = SkPicturePlayback::CreateFromStream(newPic
t, stream, | 479 SkPicturePlayback* playback = SkPicturePlayback::CreateFromStream(newPic
t, stream, |
| 471 info,
proc); | 480 info,
proc); |
| 472 if (NULL == playback) { | 481 if (NULL == playback) { |
| 473 SkDELETE(newPict); | 482 SkDELETE(newPict); |
| 474 return NULL; | 483 return NULL; |
| 475 } | 484 } |
| 476 newPict->fPlayback = playback; | 485 newPict->fPlayback = playback; |
| 477 } | 486 } |
| 478 | 487 |
| 479 return newPict; | 488 return newPict; |
| 480 } | 489 } |
| 481 | 490 |
| 482 SkPicture* SkPicture::CreateFromBuffer(SkReadBuffer& buffer) { | 491 SkPicture* SkPicture::CreateFromBuffer(SkReadBuffer& buffer) { |
| 483 SkPictInfo info; | 492 SkPictInfo info; |
| 484 | 493 |
| 485 if (!InternalOnly_BufferIsSKP(buffer, &info)) { | 494 if (!InternalOnly_BufferIsSKP(buffer, &info)) { |
| 486 return NULL; | 495 return NULL; |
| 487 } | 496 } |
| 488 | 497 |
| 489 SkPicture* newPict = SkNEW_ARGS(SkPicture, (NULL, info.fWidth, info.fHeight)
); | 498 SkPicture* newPict = SkNEW_ARGS(SkPicture, (NULL, info.fWidth, info.fHeight)
); |
| 490 | 499 |
| 500 newPict->fContentFlags = info.fFlags & ~SkPictInfo::kAll_Mask; |
| 501 |
| 491 // Check to see if there is a playback to recreate. | 502 // Check to see if there is a playback to recreate. |
| 492 if (buffer.readBool()) { | 503 if (buffer.readBool()) { |
| 493 SkPicturePlayback* playback = SkPicturePlayback::CreateFromBuffer(newPic
t, buffer, info); | 504 SkPicturePlayback* playback = SkPicturePlayback::CreateFromBuffer(newPic
t, buffer, info); |
| 494 if (NULL == playback) { | 505 if (NULL == playback) { |
| 495 SkDELETE(newPict); | 506 SkDELETE(newPict); |
| 496 return NULL; | 507 return NULL; |
| 497 } | 508 } |
| 498 newPict->fPlayback = playback; | 509 newPict->fPlayback = playback; |
| 499 } | 510 } |
| 500 | 511 |
| 501 return newPict; | 512 return newPict; |
| 502 } | 513 } |
| 503 | 514 |
| 504 void SkPicture::createHeader(SkPictInfo* info) const { | 515 void SkPicture::createHeader(SkPictInfo* info) const { |
| 505 // Copy magic bytes at the beginning of the header | 516 // Copy magic bytes at the beginning of the header |
| 506 SkASSERT(sizeof(kMagic) == 8); | 517 SkASSERT(sizeof(kMagic) == 8); |
| 507 SkASSERT(sizeof(kMagic) == sizeof(info->fMagic)); | 518 SkASSERT(sizeof(kMagic) == sizeof(info->fMagic)); |
| 508 memcpy(info->fMagic, kMagic, sizeof(kMagic)); | 519 memcpy(info->fMagic, kMagic, sizeof(kMagic)); |
| 509 | 520 |
| 510 // Set picture info after magic bytes in the header | 521 // Set picture info after magic bytes in the header |
| 511 info->fVersion = CURRENT_PICTURE_VERSION; | 522 info->fVersion = CURRENT_PICTURE_VERSION; |
| 512 info->fWidth = fWidth; | 523 info->fWidth = fWidth; |
| 513 info->fHeight = fHeight; | 524 info->fHeight = fHeight; |
| 514 info->fFlags = SkPictInfo::kCrossProcess_Flag; | 525 SkASSERT((fContentFlags & SkPictInfo::kAll_Mask) == 0); |
| 526 |
| 527 info->fFlags = fContentFlags | SkPictInfo::kCrossProcess_Flag; |
| 515 // TODO: remove this flag, since we're always float (now) | 528 // TODO: remove this flag, since we're always float (now) |
| 516 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; | 529 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; |
| 517 | 530 |
| 518 if (8 == sizeof(void*)) { | 531 if (8 == sizeof(void*)) { |
| 519 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; | 532 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; |
| 520 } | 533 } |
| 521 } | 534 } |
| 522 | 535 |
| 523 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { | 536 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { |
| 524 SkPicturePlayback* playback = fPlayback; | 537 SkPicturePlayback* playback = fPlayback; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 if (playback != fPlayback) { | 608 if (playback != fPlayback) { |
| 596 SkDELETE(playback); | 609 SkDELETE(playback); |
| 597 } | 610 } |
| 598 } else { | 611 } else { |
| 599 buffer.writeBool(false); | 612 buffer.writeBool(false); |
| 600 } | 613 } |
| 601 } | 614 } |
| 602 | 615 |
| 603 #if SK_SUPPORT_GPU | 616 #if SK_SUPPORT_GPU |
| 604 bool SkPicture::suitableForGpuRasterization(GrContext* context) const { | 617 bool SkPicture::suitableForGpuRasterization(GrContext* context) const { |
| 605 // Stub for now; never veto GPu rasterization. | 618 return !this->getHasPathEffects(); |
| 606 return true; | |
| 607 } | 619 } |
| 608 #endif | 620 #endif |
| 609 | 621 |
| 610 bool SkPicture::willPlayBackBitmaps() const { | 622 bool SkPicture::willPlayBackBitmaps() const { |
| 611 if (!fPlayback) { | 623 if (!fPlayback) { |
| 612 return false; | 624 return false; |
| 613 } | 625 } |
| 614 return fPlayback->containsBitmaps(); | 626 return fPlayback->containsBitmaps(); |
| 615 } | 627 } |
| 616 | 628 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 638 if (NULL != fRecord) { | 650 if (NULL != fRecord) { |
| 639 SkASSERT(NULL == fPlayback); | 651 SkASSERT(NULL == fPlayback); |
| 640 return SK_InvalidGenID; | 652 return SK_InvalidGenID; |
| 641 } | 653 } |
| 642 | 654 |
| 643 if (SK_InvalidGenID == fUniqueID) { | 655 if (SK_InvalidGenID == fUniqueID) { |
| 644 fUniqueID = next_picture_generation_id(); | 656 fUniqueID = next_picture_generation_id(); |
| 645 } | 657 } |
| 646 return fUniqueID; | 658 return fUniqueID; |
| 647 } | 659 } |
| OLD | NEW |