OLD | NEW |
| (Empty) |
1 #include "SkRecordAnalysis.h" | |
2 | |
3 #include "SkShader.h" | |
4 #include "SkTLogic.h" | |
5 | |
6 /** SkRecords visitor to determine whether an instance may require an | |
7 "external" bitmap to rasterize. May return false positives. | |
8 Does not return true for bitmap text. | |
9 | |
10 Expected use is to determine whether images need to be decoded before | |
11 rasterizing a particular SkRecord. | |
12 */ | |
13 struct BitmapTester { | |
14 // Helpers. These create HasMember_bitmap and HasMember_paint. | |
15 SK_CREATE_MEMBER_DETECTOR(bitmap); | |
16 SK_CREATE_MEMBER_DETECTOR(paint); | |
17 | |
18 // Some commands have a paint, some have an optional paint. Either way, get
back a pointer. | |
19 static const SkPaint* AsPtr(const SkPaint& p) { return &p; } | |
20 static const SkPaint* AsPtr(const SkRecords::Optional<SkPaint>& p) { return
p; } | |
21 | |
22 | |
23 // Main entry for visitor: | |
24 // If the command has a bitmap directly, return true. | |
25 // If the command has a paint and the paint has a bitmap, return true. | |
26 // Otherwise, return false. | |
27 template <typename T> | |
28 bool operator()(const T& r) { return CheckBitmap(r); } | |
29 | |
30 | |
31 // If the command has a bitmap, of course we're going to play back bitmaps. | |
32 template <typename T> | |
33 static SK_WHEN(HasMember_bitmap<T>, bool) CheckBitmap(const T&) { return tru
e; } | |
34 | |
35 // If not, look for one in its paint (if it has a paint). | |
36 template <typename T> | |
37 static SK_WHEN(!HasMember_bitmap<T>, bool) CheckBitmap(const T& r) { return
CheckPaint(r); } | |
38 | |
39 // If we have a paint, dig down into the effects looking for a bitmap. | |
40 template <typename T> | |
41 static SK_WHEN(HasMember_paint<T>, bool) CheckPaint(const T& r) { | |
42 const SkPaint* paint = AsPtr(r.paint); | |
43 if (paint) { | |
44 const SkShader* shader = paint->getShader(); | |
45 if (shader && | |
46 shader->asABitmap(NULL, NULL, NULL) == SkShader::kDefault_Bitmap
Type) { | |
47 return true; | |
48 } | |
49 } | |
50 return false; | |
51 } | |
52 | |
53 // If we don't have a paint, that non-paint has no bitmap. | |
54 template <typename T> | |
55 static SK_WHEN(!HasMember_paint<T>, bool) CheckPaint(const T&) { return fals
e; } | |
56 }; | |
57 | |
58 bool SkRecordWillPlaybackBitmaps(const SkRecord& record) { | |
59 BitmapTester tester; | |
60 for (unsigned i = 0; i < record.count(); i++) { | |
61 if (record.visit<bool>(i, tester)) { | |
62 return true; | |
63 } | |
64 } | |
65 return false; | |
66 } | |
OLD | NEW |