diff options
author | Matt Sarett <msarett@google.com> | 2017-03-30 12:41:48 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-30 18:02:58 +0000 |
commit | cdc651d29d88e87ef84d5a586879db2c16ff4579 (patch) | |
tree | 9fcd85326b1a5dbda864da9431a878bb62f65191 /src/effects/SkLayerDrawLooper.cpp | |
parent | b1f76531f673854135b19fa4342c0d085be2bf29 (diff) |
Make xformer class for SkCSXCanvas, use for draw loopers
Fixes draw looper gms in gbr-8888 config.
Bug: skia:
Change-Id: I0a9306cc0523c82f2ad9516752d79c1d86b1e295
Reviewed-on: https://skia-review.googlesource.com/10644
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/effects/SkLayerDrawLooper.cpp')
-rw-r--r-- | src/effects/SkLayerDrawLooper.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp index a20638c005..feeea66a35 100644 --- a/src/effects/SkLayerDrawLooper.cpp +++ b/src/effects/SkLayerDrawLooper.cpp @@ -8,6 +8,7 @@ #include "SkBlurDrawLooper.h" #include "SkBlurMaskFilter.h" #include "SkCanvas.h" +#include "SkColorSpaceXformer.h" #include "SkColor.h" #include "SkReadBuffer.h" #include "SkWriteBuffer.h" @@ -206,6 +207,37 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const { return true; } +sk_sp<SkDrawLooper> SkLayerDrawLooper::onMakeColorSpace(SkColorSpaceXformer* xformer) const { + if (!fCount) { + return sk_ref_sp(const_cast<SkLayerDrawLooper*>(this)); + } + + auto looper = sk_sp<SkLayerDrawLooper>(new SkLayerDrawLooper()); + looper->fCount = fCount; + + Rec* oldRec = fRecs; + Rec* newTopRec = new Rec(); + newTopRec->fInfo = oldRec->fInfo; + newTopRec->fPaint = xformer->apply(oldRec->fPaint); + newTopRec->fNext = nullptr; + + Rec* prevNewRec = newTopRec; + oldRec = oldRec->fNext; + while (oldRec) { + Rec* newRec = new Rec(); + newRec->fInfo = oldRec->fInfo; + newRec->fPaint = xformer->apply(oldRec->fPaint); + newRec->fNext = nullptr; + prevNewRec->fNext = newRec; + + prevNewRec = newRec; + oldRec = oldRec->fNext; + } + + looper->fRecs = newTopRec; + return std::move(looper); +} + /////////////////////////////////////////////////////////////////////////////// void SkLayerDrawLooper::flatten(SkWriteBuffer& buffer) const { |