Index: skia/effects/SkShaderExtras.cpp |
=================================================================== |
--- skia/effects/SkShaderExtras.cpp (revision 16859) |
+++ skia/effects/SkShaderExtras.cpp (working copy) |
@@ -1,174 +0,0 @@ |
-/* libs/graphics/effects/SkShaderExtras.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkShaderExtras.h" |
-#include "SkColorFilter.h" |
-#include "SkColorPriv.h" |
-#include "SkXfermode.h" |
- |
-////////////////////////////////////////////////////////////////////////////////////// |
- |
-SkComposeShader::SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode) |
-{ |
- fShaderA = sA; sA->ref(); |
- fShaderB = sB; sB->ref(); |
- // mode may be null |
- fMode = mode; mode->safeRef(); |
-} |
- |
-SkComposeShader::SkComposeShader(SkFlattenableReadBuffer& buffer) : |
- INHERITED(buffer) |
-{ |
- fShaderA = static_cast<SkShader*>(buffer.readFlattenable()); |
- fShaderB = static_cast<SkShader*>(buffer.readFlattenable()); |
- fMode = static_cast<SkXfermode*>(buffer.readFlattenable()); |
-} |
- |
-SkComposeShader::~SkComposeShader() |
-{ |
- fMode->safeUnref(); // may be null |
- fShaderB->unref(); |
- fShaderA->unref(); |
-} |
- |
-void SkComposeShader::beginSession() |
-{ |
- this->INHERITED::beginSession(); |
- fShaderA->beginSession(); |
- fShaderB->beginSession(); |
-} |
- |
-void SkComposeShader::endSession() |
-{ |
- fShaderA->endSession(); |
- fShaderB->endSession(); |
- this->INHERITED::endSession(); |
-} |
- |
-class SkAutoAlphaRestore { |
-public: |
- SkAutoAlphaRestore(SkPaint* paint, uint8_t newAlpha) |
- { |
- fAlpha = paint->getAlpha(); |
- fPaint = paint; |
- paint->setAlpha(newAlpha); |
- } |
- ~SkAutoAlphaRestore() |
- { |
- fPaint->setAlpha(fAlpha); |
- } |
-private: |
- SkPaint* fPaint; |
- uint8_t fAlpha; |
-}; |
- |
-void SkComposeShader::flatten(SkFlattenableWriteBuffer& buffer) |
-{ |
- this->INHERITED::flatten(buffer); |
- buffer.writeFlattenable(fShaderA); |
- buffer.writeFlattenable(fShaderB); |
- buffer.writeFlattenable(fMode); |
-} |
- |
-/* We call setContext on our two worker shaders. However, we |
- always let them see opaque alpha, and if the paint really |
- is translucent, then we apply that after the fact. |
-*/ |
-bool SkComposeShader::setContext(const SkBitmap& device, |
- const SkPaint& paint, |
- const SkMatrix& matrix) |
-{ |
- if (!this->INHERITED::setContext(device, paint, matrix)) |
- return false; |
- |
- // we preconcat our localMatrix (if any) with the device matrix |
- // before calling our sub-shaders |
- |
- SkMatrix tmpM; |
- |
- (void)this->getLocalMatrix(&tmpM); |
- tmpM.setConcat(matrix, tmpM); |
- |
- SkAutoAlphaRestore restore(const_cast<SkPaint*>(&paint), 0xFF); |
- |
- return fShaderA->setContext(device, paint, tmpM) && |
- fShaderB->setContext(device, paint, tmpM); |
-} |
- |
-// larger is better (fewer times we have to loop), but we shouldn't |
-// take up too much stack-space (each element is 4 bytes) |
-#define TMP_COLOR_COUNT 64 |
- |
-void SkComposeShader::shadeSpan(int x, int y, SkPMColor result[], int count) |
-{ |
- SkShader* shaderA = fShaderA; |
- SkShader* shaderB = fShaderB; |
- SkXfermode* mode = fMode; |
- unsigned scale = SkAlpha255To256(this->getPaintAlpha()); |
- |
- SkPMColor tmp[TMP_COLOR_COUNT]; |
- |
- if (NULL == mode) // implied SRC_OVER |
- { |
- do { |
- int n = count; |
- if (n > TMP_COLOR_COUNT) |
- n = TMP_COLOR_COUNT; |
- |
- shaderA->shadeSpan(x, y, result, n); |
- shaderB->shadeSpan(x, y, tmp, n); |
- |
- if (256 == scale) |
- { |
- for (int i = 0; i < n; i++) |
- result[i] = SkPMSrcOver(tmp[i], result[i]); |
- } |
- else |
- { |
- for (int i = 0; i < n; i++) |
- result[i] = SkAlphaMulQ(SkPMSrcOver(tmp[i], result[i]), scale); |
- } |
- |
- result += n; |
- x += n; |
- count -= n; |
- } while (count > 0); |
- } |
- else // use mode for the composition |
- { |
- do { |
- int n = count; |
- if (n > TMP_COLOR_COUNT) |
- n = TMP_COLOR_COUNT; |
- |
- shaderA->shadeSpan(x, y, result, n); |
- shaderB->shadeSpan(x, y, tmp, n); |
- mode->xfer32(result, tmp, n, NULL); |
- |
- if (256 == scale) |
- { |
- for (int i = 0; i < n; i++) |
- result[i] = SkAlphaMulQ(result[i], scale); |
- } |
- |
- result += n; |
- x += n; |
- count -= n; |
- } while (count > 0); |
- } |
-} |
- |