| Index: src/gpu/SkGr.cpp
|
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
|
| index 78df53e38ae7c3a3b706b21773c6b448052cbc12..6bd04dec3a841ac8186b8644ab212aca6512fba8 100644
|
| --- a/src/gpu/SkGr.cpp
|
| +++ b/src/gpu/SkGr.cpp
|
| @@ -378,6 +378,26 @@ void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, bool ju
|
| }
|
| }
|
|
|
| +/**
|
| + * Unlike GrContext::AutoMatrix, this doesn't require setting a new matrix. GrContext::AutoMatrix
|
| + * likes to set the new matrix in its constructor because it is usually necessary to simulataneously
|
| + * update a GrPaint. This AutoMatrix is used while initially setting up GrPaint, however.
|
| + */
|
| +class AutoMatrix {
|
| +public:
|
| + AutoMatrix(GrContext* context) {
|
| + fMatrix = context->getMatrix();
|
| + fContext = context;
|
| + }
|
| + ~AutoMatrix() {
|
| + SkASSERT(NULL != fContext);
|
| + fContext->setMatrix(fMatrix);
|
| + }
|
| +private:
|
| + GrContext* fContext;
|
| + SkMatrix fMatrix;
|
| +};
|
| +
|
| void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint,
|
| bool constantColor, GrPaint* grPaint) {
|
| SkShader* shader = skPaint.getShader();
|
| @@ -386,9 +406,12 @@ void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint,
|
| return;
|
| }
|
|
|
| - // SkShader::asNewEffect() may do offscreen rendering. Setup default drawing state and require
|
| - // the shader to set a render target.
|
| - GrContext::AutoWideOpenIdentityDraw awo(context, NULL);
|
| + // SkShader::asNewEffect() may do offscreen rendering. Save off the current RT, clip, and
|
| + // matrix. We don't reset the matrix on the context because SkShader::asNewEffect may use
|
| + // GrContext::getMatrix() to know the transformation from local coords to device space.
|
| + GrContext::AutoRenderTarget art(context, NULL);
|
| + GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialClip);
|
| + AutoMatrix am(context);
|
|
|
| // setup the shader as the first color effect on the paint
|
| SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(context, skPaint, NULL));
|
|
|