| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 #include "SkBlitter.h" | 8 #include "SkBlitter.h" |
| 9 #include "SkAntiRun.h" | 9 #include "SkAntiRun.h" |
| 10 #include "SkColor.h" | 10 #include "SkColor.h" |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 return blitter; | 577 return blitter; |
| 578 } | 578 } |
| 579 | 579 |
| 580 /////////////////////////////////////////////////////////////////////////////// | 580 /////////////////////////////////////////////////////////////////////////////// |
| 581 | 581 |
| 582 #include "SkColorShader.h" | 582 #include "SkColorShader.h" |
| 583 #include "SkColorPriv.h" | 583 #include "SkColorPriv.h" |
| 584 | 584 |
| 585 class Sk3DShader : public SkShader { | 585 class Sk3DShader : public SkShader { |
| 586 public: | 586 public: |
| 587 Sk3DShader(SkShader* proxy) : fProxy(proxy) { | 587 Sk3DShader(sk_sp<SkShader> proxy) : fProxy(std::move(proxy)) {} |
| 588 SkSafeRef(proxy); | |
| 589 } | |
| 590 | |
| 591 virtual ~Sk3DShader() { | |
| 592 SkSafeUnref(fProxy); | |
| 593 } | |
| 594 | 588 |
| 595 size_t onContextSize(const ContextRec& rec) const override { | 589 size_t onContextSize(const ContextRec& rec) const override { |
| 596 size_t size = sizeof(Sk3DShaderContext); | 590 size_t size = sizeof(Sk3DShaderContext); |
| 597 if (fProxy) { | 591 if (fProxy) { |
| 598 size += fProxy->contextSize(rec); | 592 size += fProxy->contextSize(rec); |
| 599 } | 593 } |
| 600 return size; | 594 return size; |
| 601 } | 595 } |
| 602 | 596 |
| 603 Context* onCreateContext(const ContextRec& rec, void* storage) const overrid
e { | 597 Context* onCreateContext(const ContextRec& rec, void* storage) const overrid
e { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 this->INHERITED::toString(str); | 714 this->INHERITED::toString(str); |
| 721 | 715 |
| 722 str->append(")"); | 716 str->append(")"); |
| 723 } | 717 } |
| 724 #endif | 718 #endif |
| 725 | 719 |
| 726 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk3DShader) | 720 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk3DShader) |
| 727 | 721 |
| 728 protected: | 722 protected: |
| 729 void flatten(SkWriteBuffer& buffer) const override { | 723 void flatten(SkWriteBuffer& buffer) const override { |
| 730 buffer.writeFlattenable(fProxy); | 724 buffer.writeFlattenable(fProxy.get()); |
| 731 } | 725 } |
| 732 | 726 |
| 733 private: | 727 private: |
| 734 SkShader* fProxy; | 728 sk_sp<SkShader> fProxy; |
| 735 | 729 |
| 736 typedef SkShader INHERITED; | 730 typedef SkShader INHERITED; |
| 737 }; | 731 }; |
| 738 | 732 |
| 739 SkFlattenable* Sk3DShader::CreateProc(SkReadBuffer& buffer) { | 733 SkFlattenable* Sk3DShader::CreateProc(SkReadBuffer& buffer) { |
| 740 SkAutoTUnref<SkShader> shader(buffer.readShader()); | 734 return new Sk3DShader(buffer.readShader()); |
| 741 return new Sk3DShader(shader); | |
| 742 } | 735 } |
| 743 | 736 |
| 744 class Sk3DBlitter : public SkBlitter { | 737 class Sk3DBlitter : public SkBlitter { |
| 745 public: | 738 public: |
| 746 Sk3DBlitter(SkBlitter* proxy, SkShader::Context* shaderContext) | 739 Sk3DBlitter(SkBlitter* proxy, SkShader::Context* shaderContext) |
| 747 : fProxy(proxy) | 740 : fProxy(proxy) |
| 748 , fShaderContext(shaderContext) | 741 , fShaderContext(shaderContext) |
| 749 {} | 742 {} |
| 750 | 743 |
| 751 void blitH(int x, int y, int width) override { | 744 void blitH(int x, int y, int width) override { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 | 808 |
| 816 SkShader* shader = origPaint.getShader(); | 809 SkShader* shader = origPaint.getShader(); |
| 817 SkColorFilter* cf = origPaint.getColorFilter(); | 810 SkColorFilter* cf = origPaint.getColorFilter(); |
| 818 SkXfermode* mode = origPaint.getXfermode(); | 811 SkXfermode* mode = origPaint.getXfermode(); |
| 819 Sk3DShader* shader3D = nullptr; | 812 Sk3DShader* shader3D = nullptr; |
| 820 | 813 |
| 821 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); | 814 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); |
| 822 | 815 |
| 823 if (origPaint.getMaskFilter() != nullptr && | 816 if (origPaint.getMaskFilter() != nullptr && |
| 824 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { | 817 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { |
| 825 shader3D = new Sk3DShader(shader); | 818 shader3D = new Sk3DShader(sk_sp<SkShader>(SkSafeRef(shader))); |
| 826 // we know we haven't initialized lazyPaint yet, so just do it | 819 // we know we haven't initialized lazyPaint yet, so just do it |
| 827 paint.writable()->setShader(shader3D)->unref(); | 820 paint.writable()->setShader(shader3D)->unref(); |
| 828 shader = shader3D; | 821 shader = shader3D; |
| 829 } | 822 } |
| 830 | 823 |
| 831 if (mode) { | 824 if (mode) { |
| 832 bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); | 825 bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); |
| 833 switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { | 826 switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { |
| 834 case kSrcOver_SkXfermodeInterpretation: | 827 case kSrcOver_SkXfermodeInterpretation: |
| 835 mode = nullptr; | 828 mode = nullptr; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 fShaderContext->~Context(); | 1002 fShaderContext->~Context(); |
| 1010 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext); | 1003 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext); |
| 1011 if (nullptr == ctx) { | 1004 if (nullptr == ctx) { |
| 1012 // Need a valid context in fShaderContext's storage, so we can later (or
our caller) call | 1005 // Need a valid context in fShaderContext's storage, so we can later (or
our caller) call |
| 1013 // the in-place destructor. | 1006 // the in-place destructor. |
| 1014 new (fShaderContext) SkZeroShaderContext(*fShader, rec); | 1007 new (fShaderContext) SkZeroShaderContext(*fShader, rec); |
| 1015 return false; | 1008 return false; |
| 1016 } | 1009 } |
| 1017 return true; | 1010 return true; |
| 1018 } | 1011 } |
| OLD | NEW |