| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkComposeShader.h" | 10 #include "SkComposeShader.h" |
| 11 #include "SkColorFilter.h" | 11 #include "SkColorFilter.h" |
| 12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
| 13 #include "SkColorShader.h" | 13 #include "SkColorShader.h" |
| 14 #include "SkReadBuffer.h" | 14 #include "SkReadBuffer.h" |
| 15 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
| 16 #include "SkXfermode.h" | 16 #include "SkXfermode.h" |
| 17 #include "SkString.h" | 17 #include "SkString.h" |
| 18 | 18 |
| 19 /////////////////////////////////////////////////////////////////////////////// | 19 /////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
| 21 SkComposeShader::SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode) { | 21 SkComposeShader::SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode) { |
| 22 fShaderA = sA; sA->ref(); | 22 fShaderA = sA; sA->ref(); |
| 23 fShaderB = sB; sB->ref(); | 23 fShaderB = sB; sB->ref(); |
| 24 // mode may be null | 24 // mode may be null |
| 25 fMode = mode; | 25 fMode = mode; |
| 26 SkSafeRef(mode); | 26 SkSafeRef(mode); |
| 27 } | 27 } |
| 28 | 28 |
| 29 SkComposeShader::SkComposeShader(SkReadBuffer& buffer) : | 29 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING |
| 30 INHERITED(buffer) { | 30 SkComposeShader::SkComposeShader(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 31 fShaderA = buffer.readShader(); | 31 fShaderA = buffer.readShader(); |
| 32 if (NULL == fShaderA) { | 32 if (NULL == fShaderA) { |
| 33 fShaderA = SkNEW_ARGS(SkColorShader, ((SkColor)0)); | 33 fShaderA = SkNEW_ARGS(SkColorShader, ((SkColor)0)); |
| 34 } | 34 } |
| 35 fShaderB = buffer.readShader(); | 35 fShaderB = buffer.readShader(); |
| 36 if (NULL == fShaderB) { | 36 if (NULL == fShaderB) { |
| 37 fShaderB = SkNEW_ARGS(SkColorShader, ((SkColor)0)); | 37 fShaderB = SkNEW_ARGS(SkColorShader, ((SkColor)0)); |
| 38 } | 38 } |
| 39 fMode = buffer.readXfermode(); | 39 fMode = buffer.readXfermode(); |
| 40 } | 40 } |
| 41 #endif |
| 41 | 42 |
| 42 SkComposeShader::~SkComposeShader() { | 43 SkComposeShader::~SkComposeShader() { |
| 43 SkSafeUnref(fMode); | 44 SkSafeUnref(fMode); |
| 44 fShaderB->unref(); | 45 fShaderB->unref(); |
| 45 fShaderA->unref(); | 46 fShaderA->unref(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 size_t SkComposeShader::contextSize() const { | 49 size_t SkComposeShader::contextSize() const { |
| 49 return sizeof(ComposeShaderContext) + fShaderA->contextSize() + fShaderB->co
ntextSize(); | 50 return sizeof(ComposeShaderContext) + fShaderA->contextSize() + fShaderB->co
ntextSize(); |
| 50 } | 51 } |
| 51 | 52 |
| 52 class SkAutoAlphaRestore { | 53 class SkAutoAlphaRestore { |
| 53 public: | 54 public: |
| 54 SkAutoAlphaRestore(SkPaint* paint, uint8_t newAlpha) { | 55 SkAutoAlphaRestore(SkPaint* paint, uint8_t newAlpha) { |
| 55 fAlpha = paint->getAlpha(); | 56 fAlpha = paint->getAlpha(); |
| 56 fPaint = paint; | 57 fPaint = paint; |
| 57 paint->setAlpha(newAlpha); | 58 paint->setAlpha(newAlpha); |
| 58 } | 59 } |
| 59 | 60 |
| 60 ~SkAutoAlphaRestore() { | 61 ~SkAutoAlphaRestore() { |
| 61 fPaint->setAlpha(fAlpha); | 62 fPaint->setAlpha(fAlpha); |
| 62 } | 63 } |
| 63 private: | 64 private: |
| 64 SkPaint* fPaint; | 65 SkPaint* fPaint; |
| 65 uint8_t fAlpha; | 66 uint8_t fAlpha; |
| 66 }; | 67 }; |
| 67 #define SkAutoAlphaRestore(...) SK_REQUIRE_LOCAL_VAR(SkAutoAlphaRestore) | 68 #define SkAutoAlphaRestore(...) SK_REQUIRE_LOCAL_VAR(SkAutoAlphaRestore) |
| 68 | 69 |
| 70 SkFlattenable* SkComposeShader::CreateProc(SkReadBuffer& buffer) { |
| 71 SkAutoTUnref<SkShader> shaderA(buffer.readShader()); |
| 72 SkAutoTUnref<SkShader> shaderB(buffer.readShader()); |
| 73 SkAutoTUnref<SkXfermode> mode(buffer.readXfermode()); |
| 74 if (!shaderA.get() || !shaderB.get()) { |
| 75 return NULL; |
| 76 } |
| 77 return SkNEW_ARGS(SkComposeShader, (shaderA, shaderB, mode)); |
| 78 } |
| 79 |
| 69 void SkComposeShader::flatten(SkWriteBuffer& buffer) const { | 80 void SkComposeShader::flatten(SkWriteBuffer& buffer) const { |
| 70 this->INHERITED::flatten(buffer); | |
| 71 buffer.writeFlattenable(fShaderA); | 81 buffer.writeFlattenable(fShaderA); |
| 72 buffer.writeFlattenable(fShaderB); | 82 buffer.writeFlattenable(fShaderB); |
| 73 buffer.writeFlattenable(fMode); | 83 buffer.writeFlattenable(fMode); |
| 74 } | 84 } |
| 75 | 85 |
| 76 template <typename T> void safe_call_destructor(T* obj) { | 86 template <typename T> void safe_call_destructor(T* obj) { |
| 77 if (obj) { | 87 if (obj) { |
| 78 obj->~T(); | 88 obj->~T(); |
| 79 } | 89 } |
| 80 } | 90 } |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 str->append(" ShaderB: "); | 217 str->append(" ShaderB: "); |
| 208 fShaderB->toString(str); | 218 fShaderB->toString(str); |
| 209 str->append(" Xfermode: "); | 219 str->append(" Xfermode: "); |
| 210 fMode->toString(str); | 220 fMode->toString(str); |
| 211 | 221 |
| 212 this->INHERITED::toString(str); | 222 this->INHERITED::toString(str); |
| 213 | 223 |
| 214 str->append(")"); | 224 str->append(")"); |
| 215 } | 225 } |
| 216 #endif | 226 #endif |
| OLD | NEW |