| Index: skia/sgl/SkShader.cpp
|
| ===================================================================
|
| --- skia/sgl/SkShader.cpp (revision 16859)
|
| +++ skia/sgl/SkShader.cpp (working copy)
|
| @@ -1,284 +0,0 @@
|
| -/* libs/graphics/sgl/SkShader.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 "SkShader.h"
|
| -#include "SkPaint.h"
|
| -
|
| -SkShader::SkShader() : fLocalMatrix(NULL) {
|
| - SkDEBUGCODE(fInSession = false;)
|
| -}
|
| -
|
| -SkShader::SkShader(SkFlattenableReadBuffer& buffer)
|
| - : INHERITED(buffer), fLocalMatrix(NULL) {
|
| - if (buffer.readBool()) {
|
| - SkMatrix matrix;
|
| - buffer.read(&matrix, sizeof(matrix));
|
| - setLocalMatrix(matrix);
|
| - }
|
| - SkDEBUGCODE(fInSession = false;)
|
| -}
|
| -
|
| -SkShader::~SkShader() {
|
| - SkASSERT(!fInSession);
|
| - sk_free(fLocalMatrix);
|
| -}
|
| -
|
| -void SkShader::beginSession() {
|
| - SkASSERT(!fInSession);
|
| - SkDEBUGCODE(fInSession = true;)
|
| -}
|
| -
|
| -void SkShader::endSession() {
|
| - SkASSERT(fInSession);
|
| - SkDEBUGCODE(fInSession = false;)
|
| -}
|
| -
|
| -void SkShader::flatten(SkFlattenableWriteBuffer& buffer) {
|
| - this->INHERITED::flatten(buffer);
|
| - buffer.writeBool(fLocalMatrix != NULL);
|
| - if (fLocalMatrix) {
|
| - buffer.writeMul4(fLocalMatrix, sizeof(SkMatrix));
|
| - }
|
| -}
|
| -
|
| -bool SkShader::getLocalMatrix(SkMatrix* localM) const {
|
| - if (fLocalMatrix) {
|
| - if (localM) {
|
| - *localM = *fLocalMatrix;
|
| - }
|
| - return true;
|
| - } else {
|
| - if (localM) {
|
| - localM->reset();
|
| - }
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -void SkShader::setLocalMatrix(const SkMatrix& localM) {
|
| - if (localM.isIdentity()) {
|
| - this->resetLocalMatrix();
|
| - } else {
|
| - if (fLocalMatrix == NULL) {
|
| - fLocalMatrix = (SkMatrix*)sk_malloc_throw(sizeof(SkMatrix));
|
| - }
|
| - *fLocalMatrix = localM;
|
| - }
|
| -}
|
| -
|
| -void SkShader::resetLocalMatrix() {
|
| - if (fLocalMatrix) {
|
| - sk_free(fLocalMatrix);
|
| - fLocalMatrix = NULL;
|
| - }
|
| -}
|
| -
|
| -bool SkShader::setContext(const SkBitmap& device,
|
| - const SkPaint& paint,
|
| - const SkMatrix& matrix) {
|
| - const SkMatrix* m = &matrix;
|
| - SkMatrix total;
|
| -
|
| - fDeviceConfig = SkToU8(device.getConfig());
|
| - fPaintAlpha = paint.getAlpha();
|
| - if (fLocalMatrix) {
|
| - total.setConcat(matrix, *fLocalMatrix);
|
| - m = &total;
|
| - }
|
| - if (m->invert(&fTotalInverse)) {
|
| - fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -#include "SkColorPriv.h"
|
| -
|
| -void SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) {
|
| - SkASSERT(span16);
|
| - SkASSERT(count > 0);
|
| - SkASSERT(this->canCallShadeSpan16());
|
| -
|
| - // basically, if we get here, the subclass screwed up
|
| - SkASSERT(!"kHasSpan16 flag is set, but shadeSpan16() not implemented");
|
| -}
|
| -
|
| -#define kTempColorQuadCount 6 // balance between speed (larger) and saving stack-space
|
| -#define kTempColorCount (kTempColorQuadCount << 2)
|
| -
|
| -#ifdef SK_CPU_BENDIAN
|
| - #define SkU32BitShiftToByteOffset(shift) (3 - ((shift) >> 3))
|
| -#else
|
| - #define SkU32BitShiftToByteOffset(shift) ((shift) >> 3)
|
| -#endif
|
| -
|
| -void SkShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| - SkASSERT(count > 0);
|
| -
|
| - SkPMColor colors[kTempColorCount];
|
| -
|
| - while ((count -= kTempColorCount) >= 0) {
|
| - this->shadeSpan(x, y, colors, kTempColorCount);
|
| - x += kTempColorCount;
|
| -
|
| - const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT);
|
| - int quads = kTempColorQuadCount;
|
| - do {
|
| - U8CPU a0 = srcA[0];
|
| - U8CPU a1 = srcA[4];
|
| - U8CPU a2 = srcA[8];
|
| - U8CPU a3 = srcA[12];
|
| - srcA += 4*4;
|
| - *alpha++ = SkToU8(a0);
|
| - *alpha++ = SkToU8(a1);
|
| - *alpha++ = SkToU8(a2);
|
| - *alpha++ = SkToU8(a3);
|
| - } while (--quads != 0);
|
| - }
|
| - SkASSERT(count < 0);
|
| - SkASSERT(count + kTempColorCount >= 0);
|
| - if (count += kTempColorCount) {
|
| - this->shadeSpan(x, y, colors, count);
|
| -
|
| - const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT);
|
| - do {
|
| - *alpha++ = *srcA;
|
| - srcA += 4;
|
| - } while (--count != 0);
|
| - }
|
| -#if 0
|
| - do {
|
| - int n = count;
|
| - if (n > kTempColorCount)
|
| - n = kTempColorCount;
|
| - SkASSERT(n > 0);
|
| -
|
| - this->shadeSpan(x, y, colors, n);
|
| - x += n;
|
| - count -= n;
|
| -
|
| - const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT);
|
| - do {
|
| - *alpha++ = *srcA;
|
| - srcA += 4;
|
| - } while (--n != 0);
|
| - } while (count > 0);
|
| -#endif
|
| -}
|
| -
|
| -SkShader::MatrixClass SkShader::ComputeMatrixClass(const SkMatrix& mat) {
|
| - MatrixClass mc = kLinear_MatrixClass;
|
| -
|
| - if (mat.getType() & SkMatrix::kPerspective_Mask) {
|
| - if (mat.fixedStepInX(0, NULL, NULL)) {
|
| - mc = kFixedStepInX_MatrixClass;
|
| - } else {
|
| - mc = kPerspective_MatrixClass;
|
| - }
|
| - }
|
| - return mc;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -bool SkShader::asABitmap(SkBitmap*, SkMatrix*, TileMode*) {
|
| - return false;
|
| -}
|
| -
|
| -SkShader* SkShader::CreateBitmapShader(const SkBitmap& src,
|
| - TileMode tmx, TileMode tmy) {
|
| - return SkShader::CreateBitmapShader(src, tmx, tmy, NULL, 0);
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkColorShader.h"
|
| -#include "SkUtils.h"
|
| -
|
| -SkColorShader::SkColorShader(SkFlattenableReadBuffer& b) : INHERITED(b) {
|
| - fInheritColor = b.readU8();
|
| - if (fInheritColor) {
|
| - return;
|
| - }
|
| - fColor = b.readU32();
|
| -}
|
| -
|
| -void SkColorShader::flatten(SkFlattenableWriteBuffer& buffer) {
|
| - this->INHERITED::flatten(buffer);
|
| - buffer.write8(fInheritColor);
|
| - if (fInheritColor) {
|
| - return;
|
| - }
|
| - buffer.write32(fColor);
|
| -}
|
| -
|
| -uint32_t SkColorShader::getFlags() {
|
| - return (SkGetPackedA32(fPMColor) == 255 ? kOpaqueAlpha_Flag : 0) |
|
| - kHasSpan16_Flag;
|
| -}
|
| -
|
| -uint8_t SkColorShader::getSpan16Alpha() const {
|
| - return SkGetPackedA32(fPMColor);
|
| -}
|
| -
|
| -bool SkColorShader::setContext(const SkBitmap& device, const SkPaint& paint,
|
| - const SkMatrix& matrix) {
|
| - if (!this->INHERITED::setContext(device, paint, matrix)) {
|
| - return false;
|
| - }
|
| -
|
| - SkColor c;
|
| - unsigned a;
|
| -
|
| - if (fInheritColor) {
|
| - c = paint.getColor();
|
| - a = SkColorGetA(c);
|
| - } else {
|
| - c = fColor;
|
| - a = SkAlphaMul(SkColorGetA(c), SkAlpha255To256(paint.getAlpha()));
|
| - }
|
| -
|
| - unsigned r = SkColorGetR(c);
|
| - unsigned g = SkColorGetG(c);
|
| - unsigned b = SkColorGetB(c);
|
| -
|
| - // we want this before we apply any alpha
|
| - fColor16 = SkPack888ToRGB16(r, g, b);
|
| -
|
| - if (a != 255) {
|
| - a = SkAlpha255To256(a);
|
| - r = SkAlphaMul(r, a);
|
| - g = SkAlphaMul(g, a);
|
| - b = SkAlphaMul(b, a);
|
| - }
|
| - fPMColor = SkPackARGB32(a, r, g, b);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void SkColorShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
|
| - sk_memset32(span, fPMColor, count);
|
| -}
|
| -
|
| -void SkColorShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
|
| - sk_memset16(span, fColor16, count);
|
| -}
|
| -
|
| -void SkColorShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| - memset(alpha, SkGetPackedA32(fPMColor), count);
|
| -}
|
| -
|
|
|