Remove isIRect "optimization" & defer computation of device Rect in AA rect rendering
authorrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 10 May 2013 11:05:58 +0000 (11:05 +0000)
committerrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 10 May 2013 11:05:58 +0000 (11:05 +0000)
https://chromiumcodereview.appspot.com/14890021/

git-svn-id: http://skia.googlecode.com/svn/trunk@9087 2bbb7eff-a529-9590-31e7-b0007b416f81

include/gpu/GrAARectRenderer.h
src/gpu/GrAARectRenderer.cpp
src/gpu/GrClipMaskManager.cpp
src/gpu/GrContext.cpp

index fe9e61212579c316650305769399b0208c3e925d..b76722d2171197ea2017aaed21d81b2035cb1b74 100644 (file)
@@ -42,7 +42,6 @@ public:
                     GrDrawTarget* target,
                     const GrRect& rect,
                     const SkMatrix& combinedMatrix,
-                    const GrRect& devRect,
                     bool useVertexCoverage) {
 #ifdef SHADER_AA_FILL_RECT
         if (combinedMatrix.rectStaysRect()) {
@@ -55,13 +54,14 @@ public:
 #else
         this->geometryFillAARect(gpu, target,
                                  rect, combinedMatrix,
-                                 devRect, useVertexCoverage);
+                                 useVertexCoverage);
 #endif
     }
 
     void strokeAARect(GrGpu* gpu,
                       GrDrawTarget* target,
-                      const GrRect& devRect,
+                      const GrRect& rect,
+                      const SkMatrix& combinedMatrix,
                       const GrVec& devStrokeSize,
                       bool useVertexCoverage);
 
@@ -80,7 +80,6 @@ private:
                             GrDrawTarget* target,
                             const GrRect& rect,
                             const SkMatrix& combinedMatrix,
-                            const GrRect& devRect,
                             bool useVertexCoverage);
 
     void shaderFillAARect(GrGpu* gpu,
index 0b593b9a5f39729f4a5be96d083d16485bf56944..883305ef686301ffaceeee175aeeafec3f2fe3ab 100644 (file)
@@ -364,7 +364,6 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu,
                                           GrDrawTarget* target,
                                           const GrRect& rect,
                                           const SkMatrix& combinedMatrix,
-                                          const GrRect& devRect,
                                           bool useVertexCoverage) {
     GrDrawState* drawState = target->drawState();
 
@@ -389,6 +388,9 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu,
     GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts);
     GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize);
 
+    SkRect devRect;
+    combinedMatrix.mapRect(&devRect, rect);
+
     if (combinedMatrix.rectStaysRect()) {
         set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf);
         set_inset_fan(fan1Pos, vsize, devRect,  SK_ScalarHalf,  SK_ScalarHalf);
@@ -616,16 +618,20 @@ void GrAARectRenderer::shaderFillAlignedAARect(GrGpu* gpu,
 
 void GrAARectRenderer::strokeAARect(GrGpu* gpu,
                                     GrDrawTarget* target,
-                                    const GrRect& devRect,
+                                    const GrRect& rect,
+                                    const SkMatrix& combinedMatrix,
                                     const GrVec& devStrokeSize,
                                     bool useVertexCoverage) {
     GrDrawState* drawState = target->drawState();
 
-    const SkScalar& dx = devStrokeSize.fX;
-    const SkScalar& dy = devStrokeSize.fY;
+    const SkScalar dx = devStrokeSize.fX;
+    const SkScalar dy = devStrokeSize.fY;
     const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf);
     const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf);
 
+    SkRect devRect;
+    combinedMatrix.mapRect(&devRect, rect);
+
     SkScalar spare;
     {
         SkScalar w = devRect.width() - dx;
@@ -634,9 +640,8 @@ void GrAARectRenderer::strokeAARect(GrGpu* gpu,
     }
 
     if (spare <= 0) {
-        GrRect r(devRect);
-        r.inset(-rx, -ry);
-        this->fillAARect(gpu, target, r, SkMatrix::I(), r, useVertexCoverage);
+        devRect.inset(-rx, -ry);
+        this->fillAARect(gpu, target, devRect, SkMatrix::I(), useVertexCoverage);
         return;
     }
 
index c022b34d62a4b9682f8025046314bb1fef28bfd5..164e1f86877626f6e8a9dffe4dbe32bdb0865d7d 100644 (file)
@@ -282,7 +282,6 @@ bool GrClipMaskManager::drawElement(GrTexture* target,
                                                               fGpu,
                                                               element->getRect(),
                                                               SkMatrix::I(),
-                                                              element->getRect(),
                                                               false);
             } else {
                 fGpu->drawSimpleRect(element->getRect(), NULL);
index bde332099ed3697f0149d2c160eb6d856fe2c943..679771eed19dc7c7a75d24a4fe35227203617aff 100644 (file)
@@ -680,20 +680,10 @@ static void setStrokeRectStrip(GrPoint verts[10], GrRect rect,
     verts[9] = verts[1];
 }
 
-/**
- * Returns true if the rects edges are integer-aligned.
- */
-static bool isIRect(const GrRect& r) {
-    return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) &&
-           SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom);
-}
-
 static bool apply_aa_to_rect(GrDrawTarget* target,
-                             const GrRect& rect,
                              SkScalar strokeWidth,
                              const SkMatrix* matrix,
                              SkMatrix* combinedMatrix,
-                             GrRect* devRect,
                              bool* useVertexCoverage) {
     // we use a simple coverage ramp to do aa on axis-aligned rects
     // we check if the rect will be axis-aligned, and the rect won't land on
@@ -763,17 +753,7 @@ static bool apply_aa_to_rect(GrDrawTarget* target,
 #endif
     }
 
-    combinedMatrix->mapRect(devRect, rect);
-
-    if (strokeWidth < 0
-#if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT)
-        && drawState.getViewMatrix().preservesAxisAlignment()
-#endif
-        ) {
-        return !isIRect(*devRect);
-    } else {
-        return true;
-    }
+    return true;
 }
 
 void GrContext::drawRect(const GrPaint& paint,
@@ -785,13 +765,12 @@ void GrContext::drawRect(const GrPaint& paint,
     GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW);
     GrDrawState::AutoStageDisable atr(fDrawState);
 
-    GrRect devRect;
     SkMatrix combinedMatrix;
     bool useVertexCoverage;
     bool needAA = paint.isAntiAlias() &&
                   !this->getRenderTarget()->isMultisampled();
-    bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix,
-                                           &combinedMatrix, &devRect,
+    bool doAA = needAA && apply_aa_to_rect(target, width, matrix,
+                                           &combinedMatrix,
                                            &useVertexCoverage);
     if (doAA) {
         GrDrawState::AutoDeviceCoordDraw adcd(target->drawState());
@@ -807,12 +786,13 @@ void GrContext::drawRect(const GrPaint& paint,
             } else {
                 strokeSize.set(SK_Scalar1, SK_Scalar1);
             }
-            fAARectRenderer->strokeAARect(this->getGpu(), target, devRect,
+            fAARectRenderer->strokeAARect(this->getGpu(), target,
+                                          rect, combinedMatrix,
                                           strokeSize, useVertexCoverage);
         } else {
             // filled AA rect
             fAARectRenderer->fillAARect(this->getGpu(), target,
-                                        rect, combinedMatrix, devRect,
+                                        rect, combinedMatrix,
                                         useVertexCoverage);
         }
         return;