| 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" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 }; | 66 }; |
| 67 #define SkAutoAlphaRestore(...) SK_REQUIRE_LOCAL_VAR(SkAutoAlphaRestore) | 67 #define SkAutoAlphaRestore(...) SK_REQUIRE_LOCAL_VAR(SkAutoAlphaRestore) |
| 68 | 68 |
| 69 void SkComposeShader::flatten(SkWriteBuffer& buffer) const { | 69 void SkComposeShader::flatten(SkWriteBuffer& buffer) const { |
| 70 this->INHERITED::flatten(buffer); | 70 this->INHERITED::flatten(buffer); |
| 71 buffer.writeFlattenable(fShaderA); | 71 buffer.writeFlattenable(fShaderA); |
| 72 buffer.writeFlattenable(fShaderB); | 72 buffer.writeFlattenable(fShaderB); |
| 73 buffer.writeFlattenable(fMode); | 73 buffer.writeFlattenable(fMode); |
| 74 } | 74 } |
| 75 | 75 |
| 76 /* We call validContext/createContext on our two worker shaders. | 76 SkShader::Context* SkComposeShader::onCreateContext(const ContextRec& rec, void*
storage) const { |
| 77 However, we always let them see opaque alpha, and if the paint | |
| 78 really is translucent, then we apply that after the fact. | |
| 79 | |
| 80 */ | |
| 81 bool SkComposeShader::validContext(const ContextRec& rec, SkMatrix* totalInverse
) const { | |
| 82 if (!this->INHERITED::validContext(rec, totalInverse)) { | |
| 83 return false; | |
| 84 } | |
| 85 | |
| 86 // we preconcat our localMatrix (if any) with the device matrix | |
| 87 // before calling our sub-shaders | |
| 88 | |
| 89 SkMatrix tmpM; | |
| 90 tmpM.setConcat(*rec.fMatrix, this->getLocalMatrix()); | |
| 91 | |
| 92 ContextRec newRec(rec); | |
| 93 newRec.fMatrix = &tmpM; | |
| 94 | |
| 95 return fShaderA->validContext(newRec) && fShaderB->validContext(newRec); | |
| 96 } | |
| 97 | |
| 98 SkShader::Context* SkComposeShader::createContext(const ContextRec& rec, void* s
torage) const { | |
| 99 if (!this->validContext(rec)) { | |
| 100 return NULL; | |
| 101 } | |
| 102 | |
| 103 // TODO : must fix this to not "cheat" and modify fPaint | |
| 104 SkAutoAlphaRestore restore(const_cast<SkPaint*>(rec.fPaint), 0xFF); | |
| 105 | |
| 106 char* aStorage = (char*) storage + sizeof(ComposeShaderContext); | 77 char* aStorage = (char*) storage + sizeof(ComposeShaderContext); |
| 107 char* bStorage = aStorage + fShaderA->contextSize(); | 78 char* bStorage = aStorage + fShaderA->contextSize(); |
| 108 | 79 |
| 109 // we preconcat our localMatrix (if any) with the device matrix | 80 // we preconcat our localMatrix (if any) with the device matrix |
| 110 // before calling our sub-shaders | 81 // before calling our sub-shaders |
| 111 | 82 |
| 112 SkMatrix tmpM; | 83 SkMatrix tmpM; |
| 113 tmpM.setConcat(*rec.fMatrix, this->getLocalMatrix()); | 84 tmpM.setConcat(*rec.fMatrix, this->getLocalMatrix()); |
| 114 | 85 |
| 115 ContextRec newRec(rec); | 86 ContextRec newRec(rec); |
| 116 newRec.fMatrix = &tmpM; | 87 newRec.fMatrix = &tmpM; |
| 117 | 88 |
| 118 SkShader::Context* contextA = fShaderA->createContext(newRec, aStorage); | 89 SkShader::Context* contextA = fShaderA->createContext(newRec, aStorage); |
| 119 SkShader::Context* contextB = fShaderB->createContext(newRec, bStorage); | 90 SkShader::Context* contextB = fShaderB->createContext(newRec, bStorage); |
| 120 | 91 if (!contextA || !contextB) { |
| 121 // Both functions must succeed; otherwise validContext should have returned | 92 return NULL; |
| 122 // false. | 93 } |
| 123 SkASSERT(contextA); | |
| 124 SkASSERT(contextB); | |
| 125 | 94 |
| 126 return SkNEW_PLACEMENT_ARGS(storage, ComposeShaderContext, (*this, rec, cont
extA, contextB)); | 95 return SkNEW_PLACEMENT_ARGS(storage, ComposeShaderContext, (*this, rec, cont
extA, contextB)); |
| 127 } | 96 } |
| 128 | 97 |
| 129 SkComposeShader::ComposeShaderContext::ComposeShaderContext( | 98 SkComposeShader::ComposeShaderContext::ComposeShaderContext( |
| 130 const SkComposeShader& shader, const ContextRec& rec, | 99 const SkComposeShader& shader, const ContextRec& rec, |
| 131 SkShader::Context* contextA, SkShader::Context* contextB) | 100 SkShader::Context* contextA, SkShader::Context* contextB) |
| 132 : INHERITED(shader, rec) | 101 : INHERITED(shader, rec) |
| 133 , fShaderContextA(contextA) | 102 , fShaderContextA(contextA) |
| 134 , fShaderContextB(contextB) {} | 103 , fShaderContextB(contextB) {} |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 str->append(" ShaderB: "); | 179 str->append(" ShaderB: "); |
| 211 fShaderB->toString(str); | 180 fShaderB->toString(str); |
| 212 str->append(" Xfermode: "); | 181 str->append(" Xfermode: "); |
| 213 fMode->toString(str); | 182 fMode->toString(str); |
| 214 | 183 |
| 215 this->INHERITED::toString(str); | 184 this->INHERITED::toString(str); |
| 216 | 185 |
| 217 str->append(")"); | 186 str->append(")"); |
| 218 } | 187 } |
| 219 #endif | 188 #endif |
| OLD | NEW |