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();
virtual ~SkShader();
/**
- * Returns true if the local matrix is not an identity matrix.
+ * Returns the local matrix.
*/
- bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); }
+ const SkMatrix& getLocalMatrix() const { return fLocalMatrix; }
+#ifdef SK_SUPPORT_LEGACY_SHADER_LOCALMATRIX
/**
- * Returns the local matrix.
+ * Returns true if the local matrix is not an identity matrix.
*/
- const SkMatrix& getLocalMatrix() const { return fLocalMatrix; }
+ bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); }
/**
* Set the shader's local matrix.
* 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
surface->getCanvas()->clear(SK_ColorTRANSPARENT);
}
-static SkShader* createChecker() {
+static SkShader* createChecker(const SkMatrix& localMatrix) {
// SkColor colors[] = { 0xFFFDFDFD, 0xFFF4F4F4 };
SkColor colors[] = { 0xFFFFFFFF, 0xFFFFFFFF };
SkBitmap bm;
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;
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));
* 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();
}
--- /dev/null
+/*
+ * 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
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);
}
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);
}
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;
#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
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;
*/
#include "SkPDFDeviceFlattener.h"
-
#include "SkDraw.h"
static SkISize SkSizeToISize(const SkSize& size) {
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);
}
}
#include "SkLayerRasterizer.h"
#include "SkLerpXfermode.h"
#include "SkLightingImageFilter.h"
+#include "SkLocalMatrixShader.h"
#include "SkLumaColorFilter.h"
#include "SkMagnifierImageFilter.h"
#include "SkMatrixConvolutionImageFilter.h"
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)
#include "SkLayerRasterizer.h"
#include "SkLerpXfermode.h"
#include "SkLightingImageFilter.h"
+#include "SkLocalMatrixShader.h"
#include "SkLumaColorFilter.h"
#include "SkMagnifierImageFilter.h"
#include "SkMatrixConvolutionImageFilter.h"
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)
SkLightingImageFilter::InitializeFlattenables();
SkTableColorFilter::InitializeFlattenables();
SkXfermode::InitializeFlattenables();
+
}
void SkFlattenable::InitializeFlattenablesIfNeeded() {