re-land hide get/setLocalMatrix
This reverts commit b1d702a43b07934f5b001b1b09db2c57ede909a1. TBR=scroggo@google.com Author: reed@google.com Review URL: https://codereview.chromium.org/279903002 git-svn-id: http://skia.googlecode.com/svn/trunk@14702 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
68a3815401
commit
5970f625e9
@ -145,7 +145,7 @@ protected:
|
||||
|
||||
SkMatrix lm;
|
||||
lm.setScale(2, 2);
|
||||
paint.getShader()->setLocalMatrix(lm);
|
||||
paint.setShader(SkShader::CreateLocalMatrixShader(paint.getShader(), lm))->unref();
|
||||
r.fRight += r.width();
|
||||
r.fBottom += r.height();
|
||||
|
||||
|
@ -37,16 +37,17 @@ public:
|
||||
SkShader(const SkMatrix* localMatrix = NULL);
|
||||
virtual ~SkShader();
|
||||
|
||||
/**
|
||||
* Returns true if the local matrix is not an identity matrix.
|
||||
*/
|
||||
bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); }
|
||||
|
||||
/**
|
||||
* Returns the local matrix.
|
||||
*/
|
||||
const SkMatrix& getLocalMatrix() const { return fLocalMatrix; }
|
||||
|
||||
#ifdef SK_SUPPORT_LEGACY_SHADER_LOCALMATRIX
|
||||
/**
|
||||
* Returns true if the local matrix is not an identity matrix.
|
||||
*/
|
||||
bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); }
|
||||
|
||||
/**
|
||||
* Set the shader's local matrix.
|
||||
* @param localM The shader's new local matrix.
|
||||
@ -57,6 +58,7 @@ public:
|
||||
* Reset the shader's local matrix to identity.
|
||||
*/
|
||||
void resetLocalMatrix() { fLocalMatrix.reset(); }
|
||||
#endif
|
||||
|
||||
enum TileMode {
|
||||
/** replicate the edge color if the shader draws outside of its
|
||||
|
@ -35,7 +35,7 @@ static void erase(SkSurface* surface) {
|
||||
surface->getCanvas()->clear(SK_ColorTRANSPARENT);
|
||||
}
|
||||
|
||||
static SkShader* createChecker() {
|
||||
static SkShader* createChecker(const SkMatrix& localMatrix) {
|
||||
// SkColor colors[] = { 0xFFFDFDFD, 0xFFF4F4F4 };
|
||||
SkColor colors[] = { 0xFFFFFFFF, 0xFFFFFFFF };
|
||||
SkBitmap bm;
|
||||
@ -43,15 +43,13 @@ static SkShader* createChecker() {
|
||||
bm.lockPixels();
|
||||
*bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = SkPreMultiplyColor(colors[0]);
|
||||
*bm.getAddr32(0, 1) = *bm.getAddr32(1, 0) = SkPreMultiplyColor(colors[1]);
|
||||
SkMatrix m;
|
||||
m.setScale(12, 12);
|
||||
return SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
|
||||
SkShader::kRepeat_TileMode, &m);
|
||||
SkShader::kRepeat_TileMode, &localMatrix);
|
||||
}
|
||||
|
||||
class FatBits {
|
||||
public:
|
||||
FatBits() : fShader(createChecker()) {
|
||||
FatBits() {
|
||||
fAA = false;
|
||||
fStyle = kHair_Style;
|
||||
fGrid = true;
|
||||
@ -100,7 +98,7 @@ public:
|
||||
fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
|
||||
fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
|
||||
fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
|
||||
fShader->setLocalMatrix(fMatrix);
|
||||
fShader.reset(createChecker(fMatrix));
|
||||
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
|
||||
fMinSurface.reset(SkSurface::NewRaster(info));
|
||||
|
@ -5,65 +5,11 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "SkShader.h"
|
||||
#include "SkReadBuffer.h"
|
||||
#include "SkWriteBuffer.h"
|
||||
|
||||
class SkLocalMatrixShader : public SkShader {
|
||||
public:
|
||||
SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
|
||||
: fProxyShader(SkRef(proxy))
|
||||
, fProxyLocalMatrix(localMatrix)
|
||||
{}
|
||||
|
||||
virtual size_t contextSize() const SK_OVERRIDE {
|
||||
return fProxyShader->contextSize();
|
||||
}
|
||||
|
||||
virtual BitmapType asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
|
||||
TileMode* mode) const SK_OVERRIDE {
|
||||
return fProxyShader->asABitmap(bitmap, matrix, mode);
|
||||
}
|
||||
|
||||
virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE {
|
||||
return fProxyShader->asAGradient(info);
|
||||
}
|
||||
|
||||
// TODO: need to augment this API to pass in a localmatrix (which we can augment)
|
||||
virtual GrEffectRef* asNewEffect(GrContext* ctx, const SkPaint& paint,
|
||||
const SkMatrix* localMatrix) const SK_OVERRIDE {
|
||||
SkMatrix tmp = fProxyLocalMatrix;
|
||||
if (localMatrix) {
|
||||
tmp.preConcat(*localMatrix);
|
||||
}
|
||||
return fProxyShader->asNewEffect(ctx, paint, &tmp);
|
||||
}
|
||||
|
||||
virtual SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const SK_OVERRIDE {
|
||||
if (localMatrix) {
|
||||
*localMatrix = fProxyLocalMatrix;
|
||||
}
|
||||
return SkRef(fProxyShader.get());
|
||||
}
|
||||
|
||||
SK_TO_STRING_OVERRIDE()
|
||||
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
|
||||
|
||||
protected:
|
||||
SkLocalMatrixShader(SkReadBuffer&);
|
||||
virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
|
||||
virtual Context* onCreateContext(const ContextRec&, void*) const SK_OVERRIDE;
|
||||
|
||||
private:
|
||||
SkAutoTUnref<SkShader> fProxyShader;
|
||||
SkMatrix fProxyLocalMatrix;
|
||||
|
||||
typedef SkShader INHERITED;
|
||||
};
|
||||
#include "SkLocalMatrixShader.h"
|
||||
|
||||
SkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffer) {
|
||||
buffer.readMatrix(&fProxyLocalMatrix);
|
||||
fProxyShader.reset(buffer.readFlattenable<SkShader>());
|
||||
fProxyShader.reset(buffer.readShader());
|
||||
if (NULL == fProxyShader.get()) {
|
||||
sk_throw();
|
||||
}
|
||||
|
66
src/core/SkLocalMatrixShader.h
Normal file
66
src/core/SkLocalMatrixShader.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2014 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef SkLocalMatrixShader_DEFINED
|
||||
#define SkLocalMatrixShader_DEFINED
|
||||
|
||||
#include "SkShader.h"
|
||||
#include "SkReadBuffer.h"
|
||||
#include "SkWriteBuffer.h"
|
||||
|
||||
class SkLocalMatrixShader : public SkShader {
|
||||
public:
|
||||
SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
|
||||
: fProxyShader(SkRef(proxy))
|
||||
, fProxyLocalMatrix(localMatrix)
|
||||
{}
|
||||
|
||||
virtual size_t contextSize() const SK_OVERRIDE {
|
||||
return fProxyShader->contextSize();
|
||||
}
|
||||
|
||||
virtual BitmapType asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
|
||||
TileMode* mode) const SK_OVERRIDE {
|
||||
return fProxyShader->asABitmap(bitmap, matrix, mode);
|
||||
}
|
||||
|
||||
virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE {
|
||||
return fProxyShader->asAGradient(info);
|
||||
}
|
||||
|
||||
virtual GrEffectRef* asNewEffect(GrContext* ctx, const SkPaint& paint,
|
||||
const SkMatrix* localMatrix) const SK_OVERRIDE {
|
||||
SkMatrix tmp = fProxyLocalMatrix;
|
||||
if (localMatrix) {
|
||||
tmp.preConcat(*localMatrix);
|
||||
}
|
||||
return fProxyShader->asNewEffect(ctx, paint, &tmp);
|
||||
}
|
||||
|
||||
virtual SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const SK_OVERRIDE {
|
||||
if (localMatrix) {
|
||||
*localMatrix = fProxyLocalMatrix;
|
||||
}
|
||||
return SkRef(fProxyShader.get());
|
||||
}
|
||||
|
||||
SK_TO_STRING_OVERRIDE()
|
||||
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
|
||||
|
||||
protected:
|
||||
SkLocalMatrixShader(SkReadBuffer&);
|
||||
virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
|
||||
virtual Context* onCreateContext(const ContextRec&, void*) const SK_OVERRIDE;
|
||||
|
||||
private:
|
||||
SkAutoTUnref<SkShader> fProxyShader;
|
||||
SkMatrix fProxyLocalMatrix;
|
||||
|
||||
typedef SkShader INHERITED;
|
||||
};
|
||||
|
||||
#endif
|
@ -56,11 +56,7 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
|
||||
SkASSERT(fPicture && fPicture->width() > 0 && fPicture->height() > 0);
|
||||
|
||||
SkMatrix m;
|
||||
if (this->hasLocalMatrix()) {
|
||||
m.setConcat(matrix, this->getLocalMatrix());
|
||||
} else {
|
||||
m = matrix;
|
||||
}
|
||||
m.setConcat(matrix, this->getLocalMatrix());
|
||||
if (localM) {
|
||||
m.preConcat(*localM);
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ SkShader::~SkShader() {
|
||||
|
||||
void SkShader::flatten(SkWriteBuffer& buffer) const {
|
||||
this->INHERITED::flatten(buffer);
|
||||
bool hasLocalM = this->hasLocalMatrix();
|
||||
bool hasLocalM = !fLocalMatrix.isIdentity();
|
||||
buffer.writeBool(hasLocalM);
|
||||
if (hasLocalM) {
|
||||
buffer.writeMatrix(fLocalMatrix);
|
||||
@ -68,13 +68,10 @@ void SkShader::flatten(SkWriteBuffer& buffer) const {
|
||||
}
|
||||
|
||||
bool SkShader::computeTotalInverse(const ContextRec& rec, SkMatrix* totalInverse) const {
|
||||
const SkMatrix* m = rec.fMatrix;
|
||||
SkMatrix total;
|
||||
SkMatrix total;
|
||||
total.setConcat(*rec.fMatrix, fLocalMatrix);
|
||||
|
||||
if (this->hasLocalMatrix()) {
|
||||
total.setConcat(*m, this->getLocalMatrix());
|
||||
m = &total;
|
||||
}
|
||||
const SkMatrix* m = &total;
|
||||
if (rec.fLocalMatrix) {
|
||||
total.setConcat(*m, *rec.fLocalMatrix);
|
||||
m = &total;
|
||||
@ -235,9 +232,9 @@ SkShader* SkShader::CreatePictureShader(SkPicture* src, TileMode tmx, TileMode t
|
||||
|
||||
#ifndef SK_IGNORE_TO_STRING
|
||||
void SkShader::toString(SkString* str) const {
|
||||
if (this->hasLocalMatrix()) {
|
||||
if (!fLocalMatrix.isIdentity()) {
|
||||
str->append(" ");
|
||||
this->getLocalMatrix().toString(str);
|
||||
fLocalMatrix.toString(str);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -66,13 +66,15 @@ bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
|
||||
return false;
|
||||
}
|
||||
SkCanvas canvas(device.get());
|
||||
|
||||
SkPaint paint;
|
||||
paint.setShader(fShader);
|
||||
SkMatrix matrix(ctx.ctm());
|
||||
matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
|
||||
fShader->setLocalMatrix(matrix);
|
||||
paint.setShader(SkShader::CreateLocalMatrixShader(fShader, matrix))->unref();
|
||||
|
||||
SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height()));
|
||||
canvas.drawRect(rect, paint);
|
||||
|
||||
*result = device.get()->accessBitmap(false);
|
||||
offset->fX = bounds.fLeft;
|
||||
offset->fY = bounds.fTop;
|
||||
|
@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include "SkPDFDeviceFlattener.h"
|
||||
|
||||
#include "SkDraw.h"
|
||||
|
||||
static SkISize SkSizeToISize(const SkSize& size) {
|
||||
@ -25,9 +24,9 @@ SkPDFDeviceFlattener::~SkPDFDeviceFlattener() {
|
||||
|
||||
static void flattenPaint(const SkDraw& d, SkPaint* paint) {
|
||||
if (paint->getShader()) {
|
||||
SkMatrix local = paint->getShader()->getLocalMatrix();
|
||||
local.preConcat(*d.fMatrix);
|
||||
paint->getShader()->setLocalMatrix(local);
|
||||
SkAutoTUnref<SkShader> lms(SkShader::CreateLocalMatrixShader(paint->getShader(),
|
||||
*d.fMatrix));
|
||||
paint->setShader(lms);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "SkLayerRasterizer.h"
|
||||
#include "SkLerpXfermode.h"
|
||||
#include "SkLightingImageFilter.h"
|
||||
#include "SkLocalMatrixShader.h"
|
||||
#include "SkLumaColorFilter.h"
|
||||
#include "SkMagnifierImageFilter.h"
|
||||
#include "SkMatrixConvolutionImageFilter.h"
|
||||
@ -84,6 +85,7 @@ static void InitializeFlattenables(int*) {
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLayerDrawLooper)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLayerRasterizer)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLerpXfermode)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLocalMatrixShader)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLumaColorFilter)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPath1DPathEffect)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Sk2DPathEffect)
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "SkLayerRasterizer.h"
|
||||
#include "SkLerpXfermode.h"
|
||||
#include "SkLightingImageFilter.h"
|
||||
#include "SkLocalMatrixShader.h"
|
||||
#include "SkLumaColorFilter.h"
|
||||
#include "SkMagnifierImageFilter.h"
|
||||
#include "SkMatrixConvolutionImageFilter.h"
|
||||
@ -84,6 +85,7 @@ static void InitializeFlattenables(int*) {
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLayerDrawLooper)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLayerRasterizer)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLerpXfermode)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLocalMatrixShader)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLumaColorFilter)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPath1DPathEffect)
|
||||
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Sk2DPathEffect)
|
||||
@ -117,6 +119,7 @@ static void InitializeFlattenables(int*) {
|
||||
SkLightingImageFilter::InitializeFlattenables();
|
||||
SkTableColorFilter::InitializeFlattenables();
|
||||
SkXfermode::InitializeFlattenables();
|
||||
|
||||
}
|
||||
|
||||
void SkFlattenable::InitializeFlattenablesIfNeeded() {
|
||||
|
Loading…
Reference in New Issue
Block a user