| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 // Some shared code used by both SkBigPicture and SkMiniPicture. | 8 // Some shared code used by both SkBigPicture and SkMiniPicture. |
| 9 // SkTextHunter -- SkRecord visitor that returns true when the op draws text
. | 9 // SkTextHunter -- SkRecord visitor that returns true when the op draws text
. |
| 10 // SkBitmapHunter -- SkRecord visitor that returns true when the op draws a bi
tmap. | 10 // SkBitmapHunter -- SkRecord visitor that returns true when the op draws a bi
tmap or image. |
| 11 // SkPathCounter -- SkRecord visitor that counts paths that draw slowly on th
e GPU. | 11 // SkPathCounter -- SkRecord visitor that counts paths that draw slowly on th
e GPU. |
| 12 | 12 |
| 13 #include "SkPathEffect.h" | 13 #include "SkPathEffect.h" |
| 14 #include "SkRecords.h" | 14 #include "SkRecords.h" |
| 15 #include "SkTLogic.h" | 15 #include "SkTLogic.h" |
| 16 | 16 |
| 17 struct SkTextHunter { | 17 struct SkTextHunter { |
| 18 // Most ops never have text. Some always do. Subpictures know themeselves. | 18 // Most ops never have text. Some always do. Subpictures know themeselves. |
| 19 template <typename T> bool operator()(const T&) { return false; } | 19 template <typename T> bool operator()(const T&) { return false; } |
| 20 bool operator()(const SkRecords::DrawPosText&) { return true; } | 20 bool operator()(const SkRecords::DrawPosText&) { return true; } |
| 21 bool operator()(const SkRecords::DrawPosTextH&) { return true; } | 21 bool operator()(const SkRecords::DrawPosTextH&) { return true; } |
| 22 bool operator()(const SkRecords::DrawText&) { return true; } | 22 bool operator()(const SkRecords::DrawText&) { return true; } |
| 23 bool operator()(const SkRecords::DrawTextBlob&) { return true; } | 23 bool operator()(const SkRecords::DrawTextBlob&) { return true; } |
| 24 bool operator()(const SkRecords::DrawTextOnPath&) { return true; } | 24 bool operator()(const SkRecords::DrawTextOnPath&) { return true; } |
| 25 bool operator()(const SkRecords::DrawPicture& op) { return op.picture->hasTe
xt(); } | 25 bool operator()(const SkRecords::DrawPicture& op) { return op.picture->hasTe
xt(); } |
| 26 }; | 26 }; |
| 27 | 27 |
| 28 | 28 |
| 29 // N.B. This name is slightly historical: hunting season is now open for SkImage
s too. |
| 29 struct SkBitmapHunter { | 30 struct SkBitmapHunter { |
| 30 // Helpers. These create HasMember_bitmap and HasMember_paint. | 31 // Helpers. These let us detect the presence of struct members with particu
lar names. |
| 31 SK_CREATE_MEMBER_DETECTOR(bitmap); | 32 SK_CREATE_MEMBER_DETECTOR(bitmap); |
| 33 SK_CREATE_MEMBER_DETECTOR(image); |
| 32 SK_CREATE_MEMBER_DETECTOR(paint); | 34 SK_CREATE_MEMBER_DETECTOR(paint); |
| 33 | 35 |
| 36 template <typename T> |
| 37 struct HasMember_bitmap_or_image { |
| 38 static const bool value = HasMember_bitmap<T>::value || HasMember_image<
T>::value; |
| 39 }; |
| 40 |
| 34 // Some ops have a paint, some have an optional paint. Either way, get back
a pointer. | 41 // Some ops have a paint, some have an optional paint. Either way, get back
a pointer. |
| 35 static const SkPaint* AsPtr(const SkPaint& p) { return &p; } | 42 static const SkPaint* AsPtr(const SkPaint& p) { return &p; } |
| 36 static const SkPaint* AsPtr(const SkRecords::Optional<SkPaint>& p) { return
p; } | 43 static const SkPaint* AsPtr(const SkRecords::Optional<SkPaint>& p) { return
p; } |
| 37 | 44 |
| 38 // Main entry for visitor: | 45 // Main entry for visitor: |
| 39 // If the op is a DrawPicture, recurse. | 46 // If the op is a DrawPicture, recurse. |
| 40 // If the op has a bitmap directly, return true. | 47 // If the op has a bitmap or image directly, return true. |
| 41 // If the op has a paint and the paint has a bitmap, return true. | 48 // If the op has a paint and the paint has a bitmap, return true. |
| 42 // Otherwise, return false. | 49 // Otherwise, return false. |
| 43 bool operator()(const SkRecords::DrawPicture& op) { return op.picture->willP
layBackBitmaps(); } | 50 bool operator()(const SkRecords::DrawPicture& op) { return op.picture->willP
layBackBitmaps(); } |
| 44 | 51 |
| 45 template <typename T> | 52 template <typename T> |
| 46 bool operator()(const T& r) { return CheckBitmap(r); } | 53 bool operator()(const T& r) { return CheckBitmap(r); } |
| 47 | 54 |
| 48 // If the op has a bitmap, of course we're going to play back bitmaps. | 55 // If the op has a bitmap, of course we're going to play back bitmaps. |
| 49 template <typename T> | 56 template <typename T> |
| 50 static SK_WHEN(HasMember_bitmap<T>, bool) CheckBitmap(const T&) { return tru
e; } | 57 static SK_WHEN(HasMember_bitmap_or_image<T>, bool) CheckBitmap(const T&) { |
| 58 return true; |
| 59 } |
| 51 | 60 |
| 52 // If not, look for one in its paint (if it has a paint). | 61 // If not, look for one in its paint (if it has a paint). |
| 53 template <typename T> | 62 template <typename T> |
| 54 static SK_WHEN(!HasMember_bitmap<T>, bool) CheckBitmap(const T& r) { return
CheckPaint(r); } | 63 static SK_WHEN(!HasMember_bitmap_or_image<T>, bool) CheckBitmap(const T& r)
{ |
| 64 return CheckPaint(r); |
| 65 } |
| 55 | 66 |
| 56 // If we have a paint, dig down into the effects looking for a bitmap. | 67 // If we have a paint, dig down into the effects looking for a bitmap. |
| 57 template <typename T> | 68 template <typename T> |
| 58 static SK_WHEN(HasMember_paint<T>, bool) CheckPaint(const T& r) { | 69 static SK_WHEN(HasMember_paint<T>, bool) CheckPaint(const T& r) { |
| 59 const SkPaint* paint = AsPtr(r.paint); | 70 const SkPaint* paint = AsPtr(r.paint); |
| 60 if (paint) { | 71 if (paint) { |
| 61 const SkShader* shader = paint->getShader(); | 72 const SkShader* shader = paint->getShader(); |
| 62 if (shader && shader->isABitmap()) { | 73 if (shader && shader->isABitmap()) { |
| 63 return true; | 74 return true; |
| 64 } | 75 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 template <typename T> | 137 template <typename T> |
| 127 SK_WHEN(HasMember_paint<T>, void) operator()(const T& op) { | 138 SK_WHEN(HasMember_paint<T>, void) operator()(const T& op) { |
| 128 this->checkPaint(AsPtr(op.paint)); | 139 this->checkPaint(AsPtr(op.paint)); |
| 129 } | 140 } |
| 130 | 141 |
| 131 template <typename T> | 142 template <typename T> |
| 132 SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { /* do nothing *
/ } | 143 SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { /* do nothing *
/ } |
| 133 | 144 |
| 134 int fNumSlowPathsAndDashEffects; | 145 int fNumSlowPathsAndDashEffects; |
| 135 }; | 146 }; |
| OLD | NEW |