| Index: src/core/SkPictureCommon.h
|
| diff --git a/src/core/SkPictureCommon.h b/src/core/SkPictureCommon.h
|
| index c9c023d2bb1249ce1b955647a4c1a6f4d9ebedd9..6e95b296e0a6a2105cc53387b81b6deca0ab47d2 100644
|
| --- a/src/core/SkPictureCommon.h
|
| +++ b/src/core/SkPictureCommon.h
|
| @@ -16,28 +16,18 @@
|
|
|
| struct SkTextHunter {
|
| // Most ops never have text. Some always do. Subpictures know themeselves.
|
| - template <typename T> bool operator()(const T&) { return false; }
|
| - bool operator()(const SkRecords::DrawPosText&) { return true; }
|
| - bool operator()(const SkRecords::DrawPosTextH&) { return true; }
|
| - bool operator()(const SkRecords::DrawText&) { return true; }
|
| - bool operator()(const SkRecords::DrawTextBlob&) { return true; }
|
| - bool operator()(const SkRecords::DrawTextOnPath&) { return true; }
|
| bool operator()(const SkRecords::DrawPicture& op) { return op.picture->hasText(); }
|
| + bool operator()(const SkRecords::DrawDrawable&) { /*TODO*/ return false; }
|
| +
|
| + template <typename T>
|
| + SK_WHEN(T::kTags & SkRecords::kHasText_Tag, bool) operator()(const T&) { return true; }
|
| + template <typename T>
|
| + SK_WHEN(!(T::kTags & SkRecords::kHasText_Tag), bool) operator()(const T&) { return false; }
|
| };
|
|
|
|
|
| // N.B. This name is slightly historical: hunting season is now open for SkImages too.
|
| struct SkBitmapHunter {
|
| - // Helpers. These let us detect the presence of struct members with particular names.
|
| - SK_CREATE_MEMBER_DETECTOR(bitmap);
|
| - SK_CREATE_MEMBER_DETECTOR(image);
|
| - SK_CREATE_MEMBER_DETECTOR(paint);
|
| -
|
| - template <typename T>
|
| - struct HasMember_bitmap_or_image {
|
| - static const bool value = HasMember_bitmap<T>::value || HasMember_image<T>::value;
|
| - };
|
| -
|
| // Some ops have a paint, some have an optional paint. Either way, get back a pointer.
|
| static const SkPaint* AsPtr(const SkPaint& p) { return &p; }
|
| static const SkPaint* AsPtr(const SkRecords::Optional<SkPaint>& p) { return p; }
|
| @@ -48,26 +38,42 @@ struct SkBitmapHunter {
|
| // If the op has a paint and the paint has a bitmap, return true.
|
| // Otherwise, return false.
|
| bool operator()(const SkRecords::DrawPicture& op) { return op.picture->willPlayBackBitmaps(); }
|
| + bool operator()(const SkRecords::DrawDrawable&) { /*TODO*/ return false; }
|
|
|
| template <typename T>
|
| - bool operator()(const T& r) { return CheckBitmap(r); }
|
| + bool operator()(const T& op) { return CheckBitmap(op); }
|
|
|
| - // If the op has a bitmap, of course we're going to play back bitmaps.
|
| + // If the op is tagged as having an image, return true.
|
| template <typename T>
|
| - static SK_WHEN(HasMember_bitmap_or_image<T>, bool) CheckBitmap(const T&) {
|
| + static SK_WHEN(T::kTags & SkRecords::kHasImage_Tag, bool) CheckBitmap(const T&) {
|
| return true;
|
| }
|
|
|
| // If not, look for one in its paint (if it has a paint).
|
| template <typename T>
|
| - static SK_WHEN(!HasMember_bitmap_or_image<T>, bool) CheckBitmap(const T& r) {
|
| - return CheckPaint(r);
|
| + static SK_WHEN(!(T::kTags & SkRecords::kHasImage_Tag), bool) CheckBitmap(const T& op) {
|
| + return CheckPaint(op);
|
| + }
|
| +
|
| + // Most draws-type ops have paints.
|
| + template <typename T>
|
| + static SK_WHEN(T::kTags & SkRecords::kDraw_Tag, bool) CheckPaint(const T& op) {
|
| + return PaintHasBitmap(AsPtr(op.paint));
|
| + }
|
| +
|
| + // SaveLayers also have a paint to check.
|
| + static bool CheckPaint(const SkRecords::SaveLayer& op) {
|
| + return PaintHasBitmap(AsPtr(op.paint));
|
| }
|
|
|
| - // If we have a paint, dig down into the effects looking for a bitmap.
|
| + // Shouldn't be any non-Draw non-SaveLayer ops with paints.
|
| template <typename T>
|
| - static SK_WHEN(HasMember_paint<T>, bool) CheckPaint(const T& r) {
|
| - const SkPaint* paint = AsPtr(r.paint);
|
| + static SK_WHEN(!(T::kTags & SkRecords::kDraw_Tag), bool) CheckPaint(const T&) {
|
| + return false;
|
| + }
|
| +
|
| +private:
|
| + static bool PaintHasBitmap(const SkPaint* paint) {
|
| if (paint) {
|
| const SkShader* shader = paint->getShader();
|
| if (shader && shader->isABitmap()) {
|
| @@ -76,16 +82,10 @@ struct SkBitmapHunter {
|
| }
|
| return false;
|
| }
|
| -
|
| - // If we don't have a paint, that non-paint has no bitmap.
|
| - template <typename T>
|
| - static SK_WHEN(!HasMember_paint<T>, bool) CheckPaint(const T&) { return false; }
|
| };
|
|
|
| // TODO: might be nicer to have operator() return an int (the number of slow paths) ?
|
| struct SkPathCounter {
|
| - SK_CREATE_MEMBER_DETECTOR(paint);
|
| -
|
| // Some ops have a paint, some have an optional paint. Either way, get back a pointer.
|
| static const SkPaint* AsPtr(const SkPaint& p) { return &p; }
|
| static const SkPaint* AsPtr(const SkRecords::Optional<SkPaint>& p) { return p; }
|
| @@ -96,6 +96,7 @@ struct SkPathCounter {
|
| void operator()(const SkRecords::DrawPicture& op) {
|
| fNumSlowPathsAndDashEffects += op.picture->numSlowPaths();
|
| }
|
| + void operator()(const SkRecords::DrawDrawable&) { /* TODO */ }
|
|
|
| void checkPaint(const SkPaint* paint) {
|
| if (paint && paint->getPathEffect()) {
|
| @@ -134,13 +135,17 @@ struct SkPathCounter {
|
| }
|
| }
|
|
|
| + void operator()(const SkRecords::SaveLayer& op) {
|
| + this->checkPaint(AsPtr(op.paint));
|
| + }
|
| +
|
| template <typename T>
|
| - SK_WHEN(HasMember_paint<T>, void) operator()(const T& op) {
|
| + SK_WHEN(T::kTags & SkRecords::kDraw_Tag, void) operator()(const T& op) {
|
| this->checkPaint(AsPtr(op.paint));
|
| }
|
|
|
| template <typename T>
|
| - SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { /* do nothing */ }
|
| + SK_WHEN(!(T::kTags & SkRecords::kDraw_Tag), void) operator()(const T& op) { /* do nothing */ }
|
|
|
| int fNumSlowPathsAndDashEffects;
|
| };
|
|
|