SkBigPicture.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright 2015 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkBBoxHierarchy.h"
  8. #include "src/core/SkBigPicture.h"
  9. #include "src/core/SkPictureCommon.h"
  10. #include "src/core/SkRecord.h"
  11. #include "src/core/SkRecordDraw.h"
  12. #include "src/core/SkTraceEvent.h"
  13. SkBigPicture::SkBigPicture(const SkRect& cull,
  14. SkRecord* record,
  15. SnapshotArray* drawablePicts,
  16. SkBBoxHierarchy* bbh,
  17. size_t approxBytesUsedBySubPictures)
  18. : fCullRect(cull)
  19. , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures)
  20. , fRecord(record) // Take ownership of caller's ref.
  21. , fDrawablePicts(drawablePicts) // Take ownership.
  22. , fBBH(bbh) // Take ownership of caller's ref.
  23. {}
  24. void SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const {
  25. SkASSERT(canvas);
  26. // If the query contains the whole picture, don't bother with the BBH.
  27. const bool useBBH = !canvas->getLocalClipBounds().contains(this->cullRect());
  28. SkRecordDraw(*fRecord,
  29. canvas,
  30. this->drawablePicts(),
  31. nullptr,
  32. this->drawableCount(),
  33. useBBH ? fBBH.get() : nullptr,
  34. callback);
  35. }
  36. void SkBigPicture::partialPlayback(SkCanvas* canvas,
  37. int start,
  38. int stop,
  39. const SkMatrix& initialCTM) const {
  40. SkASSERT(canvas);
  41. SkRecordPartialDraw(*fRecord,
  42. canvas,
  43. this->drawablePicts(),
  44. this->drawableCount(),
  45. start,
  46. stop,
  47. initialCTM);
  48. }
  49. SkRect SkBigPicture::cullRect() const { return fCullRect; }
  50. int SkBigPicture::approximateOpCount() const { return fRecord->count(); }
  51. size_t SkBigPicture::approximateBytesUsed() const {
  52. size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures;
  53. if (fBBH) { bytes += fBBH->bytesUsed(); }
  54. return bytes;
  55. }
  56. int SkBigPicture::drawableCount() const {
  57. return fDrawablePicts ? fDrawablePicts->count() : 0;
  58. }
  59. SkPicture const* const* SkBigPicture::drawablePicts() const {
  60. return fDrawablePicts ? fDrawablePicts->begin() : nullptr;
  61. }