| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 2d7cc49181b279a7445f7cd610b689273bc0049b..eb22ca9cb41d795c439aaea5232dfac4703faf7d 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -841,8 +841,7 @@ static GrBatch* create_circle_batch(GrColor color,
|
| const SkMatrix& viewMatrix,
|
| bool useCoverageAA,
|
| const SkRect& circle,
|
| - const SkStrokeRec& stroke,
|
| - SkRect* bounds) {
|
| + const SkStrokeRec& stroke) {
|
| SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY());
|
| viewMatrix.mapPoints(¢er, 1);
|
| SkScalar radius = viewMatrix.mapRadius(SkScalarHalf(circle.width()));
|
| @@ -876,16 +875,14 @@ static GrBatch* create_circle_batch(GrColor color,
|
| outerRadius += SK_ScalarHalf;
|
| innerRadius -= SK_ScalarHalf;
|
|
|
| - bounds->setLTRB(center.fX - outerRadius, center.fY - outerRadius,
|
| - center.fX + outerRadius, center.fY + outerRadius);
|
| -
|
| CircleBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| geometry.fColor = color;
|
| geometry.fInnerRadius = innerRadius;
|
| geometry.fOuterRadius = outerRadius;
|
| geometry.fStroke = isStrokeOnly && innerRadius > 0;
|
| - geometry.fDevBounds = *bounds;
|
| + geometry.fDevBounds = SkRect::MakeLTRB(center.fX - outerRadius, center.fY - outerRadius,
|
| + center.fX + outerRadius, center.fY + outerRadius);
|
|
|
| return CircleBatch::Create(geometry);
|
| }
|
| @@ -897,9 +894,8 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| bool useCoverageAA,
|
| const SkRect& circle,
|
| const SkStrokeRec& stroke) {
|
| - SkRect bounds;
|
| SkAutoTUnref<GrBatch> batch(create_circle_batch(color, viewMatrix, useCoverageAA, circle,
|
| - stroke, &bounds));
|
| + stroke));
|
| target->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -1074,8 +1070,7 @@ static GrBatch* create_ellipse_batch(GrColor color,
|
| const SkMatrix& viewMatrix,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| - const SkStrokeRec& stroke,
|
| - SkRect* bounds) {
|
| + const SkStrokeRec& stroke) {
|
| #ifdef SK_DEBUG
|
| {
|
| // we should have checked for this previously
|
| @@ -1144,9 +1139,6 @@ static GrBatch* create_ellipse_batch(GrColor color,
|
| xRadius += SK_ScalarHalf;
|
| yRadius += SK_ScalarHalf;
|
|
|
| - bounds->setLTRB(center.fX - xRadius, center.fY - yRadius,
|
| - center.fX + xRadius, center.fY + yRadius);
|
| -
|
| EllipseBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| geometry.fColor = color;
|
| @@ -1155,7 +1147,8 @@ static GrBatch* create_ellipse_batch(GrColor color,
|
| geometry.fInnerXRadius = innerXRadius;
|
| geometry.fInnerYRadius = innerYRadius;
|
| geometry.fStroke = isStrokeOnly && innerXRadius > 0 && innerYRadius > 0;
|
| - geometry.fDevBounds = *bounds;
|
| + geometry.fDevBounds = SkRect::MakeLTRB(center.fX - xRadius, center.fY - yRadius,
|
| + center.fX + xRadius, center.fY + yRadius);
|
|
|
| return EllipseBatch::Create(geometry);
|
| }
|
| @@ -1167,9 +1160,8 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke) {
|
| - SkRect bounds;
|
| SkAutoTUnref<GrBatch> batch(create_ellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| - stroke, &bounds));
|
| + stroke));
|
| if (!batch) {
|
| return false;
|
| }
|
| @@ -1311,8 +1303,8 @@ private:
|
| return false;
|
| }
|
|
|
| - SkASSERT(this->usesLocalCoords() == that->usesLocalCoords());
|
| - if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
|
| + // TODO rewrite to allow positioning on CPU
|
| + if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
|
| return false;
|
| }
|
|
|
| @@ -1342,8 +1334,7 @@ static GrBatch* create_diellipse_batch(GrColor color,
|
| const SkMatrix& viewMatrix,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| - const SkStrokeRec& stroke,
|
| - SkRect* bounds) {
|
| + const SkStrokeRec& stroke) {
|
| SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY());
|
| SkScalar xRadius = SkScalarHalf(ellipse.width());
|
| SkScalar yRadius = SkScalarHalf(ellipse.height());
|
| @@ -1399,9 +1390,6 @@ static GrBatch* create_diellipse_batch(GrColor color,
|
| SkScalar geoDx = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(a*a + c*c));
|
| SkScalar geoDy = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(b*b + d*d));
|
|
|
| - bounds->setLTRB(center.fX - xRadius - geoDx, center.fY - yRadius - geoDy,
|
| - center.fX + xRadius + geoDx, center.fY + yRadius + geoDy);
|
| -
|
| DIEllipseBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| geometry.fColor = color;
|
| @@ -1412,10 +1400,12 @@ static GrBatch* create_diellipse_batch(GrColor color,
|
| geometry.fGeoDx = geoDx;
|
| geometry.fGeoDy = geoDy;
|
| geometry.fMode = mode;
|
| - geometry.fBounds = *bounds;
|
| + geometry.fBounds = SkRect::MakeLTRB(center.fX - xRadius - geoDx, center.fY - yRadius - geoDy,
|
| + center.fX + xRadius + geoDx, center.fY + yRadius + geoDy);
|
|
|
| - viewMatrix.mapRect(bounds);
|
| - return DIEllipseBatch::Create(geometry, *bounds);
|
| + SkRect devBounds = geometry.fBounds;
|
| + viewMatrix.mapRect(&devBounds);
|
| + return DIEllipseBatch::Create(geometry, devBounds);
|
| }
|
|
|
| bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| @@ -1425,9 +1415,8 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke) {
|
| - SkRect bounds;
|
| SkAutoTUnref<GrBatch> batch(create_diellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| - stroke, &bounds));
|
| + stroke));
|
| if (!batch) {
|
| return false;
|
| }
|
| @@ -1920,8 +1909,7 @@ private:
|
| static GrBatch* create_rrect_batch(GrColor color,
|
| const SkMatrix& viewMatrix,
|
| const SkRRect& rrect,
|
| - const SkStrokeRec& stroke,
|
| - SkRect* bounds) {
|
| + const SkStrokeRec& stroke) {
|
| SkASSERT(viewMatrix.rectStaysRect());
|
| SkASSERT(rrect.isSimple());
|
| SkASSERT(!rrect.isOval());
|
| @@ -1929,7 +1917,8 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| // RRect batchs only handle simple, but not too simple, rrects
|
| // do any matrix crunching before we reset the draw state for device coords
|
| const SkRect& rrectBounds = rrect.getBounds();
|
| - viewMatrix.mapRect(bounds, rrectBounds);
|
| + SkRect bounds;
|
| + viewMatrix.mapRect(&bounds, rrectBounds);
|
|
|
| SkVector radii = rrect.getSimpleRadii();
|
| SkScalar xRadius = SkScalarAbs(viewMatrix[SkMatrix::kMScaleX]*radii.fX +
|
| @@ -1988,7 +1977,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| innerRadius = xRadius - halfWidth;
|
| }
|
| outerRadius += halfWidth;
|
| - bounds->outset(halfWidth, halfWidth);
|
| + bounds.outset(halfWidth, halfWidth);
|
| }
|
|
|
| isStrokeOnly = (isStrokeOnly && innerRadius >= 0);
|
| @@ -2002,7 +1991,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| innerRadius -= SK_ScalarHalf;
|
|
|
| // Expand the rect so all the pixels will be captured.
|
| - bounds->outset(SK_ScalarHalf, SK_ScalarHalf);
|
| + bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
|
|
|
| RRectCircleRendererBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| @@ -2010,7 +1999,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| geometry.fInnerRadius = innerRadius;
|
| geometry.fOuterRadius = outerRadius;
|
| geometry.fStroke = isStrokeOnly;
|
| - geometry.fDevBounds = *bounds;
|
| + geometry.fDevBounds = bounds;
|
|
|
| return RRectCircleRendererBatch::Create(geometry);
|
| // otherwise we use the ellipse renderer
|
| @@ -2044,13 +2033,13 @@ static GrBatch* create_rrect_batch(GrColor color,
|
|
|
| xRadius += scaledStroke.fX;
|
| yRadius += scaledStroke.fY;
|
| - bounds->outset(scaledStroke.fX, scaledStroke.fY);
|
| + bounds.outset(scaledStroke.fX, scaledStroke.fY);
|
| }
|
|
|
| isStrokeOnly = (isStrokeOnly && innerXRadius >= 0 && innerYRadius >= 0);
|
|
|
| // Expand the rect so all the pixels will be captured.
|
| - bounds->outset(SK_ScalarHalf, SK_ScalarHalf);
|
| + bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
|
|
|
| RRectEllipseRendererBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| @@ -2060,7 +2049,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| geometry.fInnerXRadius = innerXRadius;
|
| geometry.fInnerYRadius = innerYRadius;
|
| geometry.fStroke = isStrokeOnly;
|
| - geometry.fDevBounds = *bounds;
|
| + geometry.fDevBounds = bounds;
|
|
|
| return RRectEllipseRendererBatch::Create(geometry);
|
| }
|
| @@ -2089,8 +2078,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| return false;
|
| }
|
|
|
| - SkRect bounds;
|
| - SkAutoTUnref<GrBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke, &bounds));
|
| + SkAutoTUnref<GrBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke));
|
| if (!batch) {
|
| return false;
|
| }
|
| @@ -2118,9 +2106,7 @@ BATCH_TEST_DEFINE(CircleBatch) {
|
| GrColor color = GrRandomColor(random);
|
| bool useCoverageAA = random->nextBool();
|
| SkRect circle = GrTest::TestRect(random);
|
| - SkRect bounds; // unused
|
| - return create_circle_batch(color, viewMatrix, useCoverageAA, circle, random_strokerec(random),
|
| - &bounds);
|
| + return create_circle_batch(color, viewMatrix, useCoverageAA, circle, random_strokerec(random));
|
| }
|
|
|
| BATCH_TEST_DEFINE(EllipseBatch) {
|
| @@ -2128,9 +2114,8 @@ BATCH_TEST_DEFINE(EllipseBatch) {
|
| GrColor color = GrRandomColor(random);
|
| bool useCoverageAA = random->nextBool();
|
| SkRect ellipse = GrTest::TestRect(random);
|
| - SkRect bounds; // unused
|
| return create_ellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| - random_strokerec(random), &bounds);
|
| + random_strokerec(random));
|
| }
|
|
|
| BATCH_TEST_DEFINE(DIEllipseBatch) {
|
| @@ -2138,18 +2123,15 @@ BATCH_TEST_DEFINE(DIEllipseBatch) {
|
| GrColor color = GrRandomColor(random);
|
| bool useCoverageAA = random->nextBool();
|
| SkRect ellipse = GrTest::TestRect(random);
|
| - SkRect bounds; // unused
|
| return create_diellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| - random_strokerec(random), &bounds);
|
| + random_strokerec(random));
|
| }
|
|
|
| BATCH_TEST_DEFINE(RRectBatch) {
|
| SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random);
|
| GrColor color = GrRandomColor(random);
|
| const SkRRect& rrect = GrTest::TestRRectSimple(random);
|
| -
|
| - SkRect bounds;
|
| - return create_rrect_batch(color, viewMatrix, rrect, random_strokerec(random), &bounds);
|
| + return create_rrect_batch(color, viewMatrix, rrect, random_strokerec(random));
|
| }
|
|
|
| #endif
|
|
|