| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 9a02a871570ed8ca073e0013a768f5e02a60ee42..b9303cf24debc1339e208c8952d462ff2fe1badb 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "GrBatch.h"
|
| #include "GrBatchTarget.h"
|
| +#include "GrBatchTest.h"
|
| #include "GrBufferAllocPool.h"
|
| #include "GrDrawTarget.h"
|
| #include "GrGeometryProcessor.h"
|
| @@ -878,13 +879,12 @@ private:
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| -void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| - GrColor color,
|
| - const SkMatrix& viewMatrix,
|
| - bool useCoverageAA,
|
| - const SkRect& circle,
|
| - const SkStrokeRec& stroke) {
|
| +static GrBatch* create_circle_batch(GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& circle,
|
| + const SkStrokeRec& stroke,
|
| + SkRect* bounds) {
|
| SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY());
|
| viewMatrix.mapPoints(¢er, 1);
|
| SkScalar radius = viewMatrix.mapRadius(SkScalarHalf(circle.width()));
|
| @@ -918,12 +918,8 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| outerRadius += SK_ScalarHalf;
|
| innerRadius -= SK_ScalarHalf;
|
|
|
| - SkRect bounds = SkRect::MakeLTRB(
|
| - center.fX - outerRadius,
|
| - center.fY - outerRadius,
|
| - center.fX + outerRadius,
|
| - center.fY + outerRadius
|
| - );
|
| + bounds->setLTRB(center.fX - outerRadius, center.fY - outerRadius,
|
| + center.fX + outerRadius, center.fY + outerRadius);
|
|
|
| CircleBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| @@ -931,9 +927,21 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| geometry.fInnerRadius = innerRadius;
|
| geometry.fOuterRadius = outerRadius;
|
| geometry.fStroke = isStrokeOnly && innerRadius > 0;
|
| - geometry.fDevBounds = bounds;
|
| + geometry.fDevBounds = *bounds;
|
|
|
| - SkAutoTUnref<GrBatch> batch(CircleBatch::Create(geometry));
|
| + return CircleBatch::Create(geometry);
|
| +}
|
| +
|
| +void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| + GrPipelineBuilder* pipelineBuilder,
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& circle,
|
| + const SkStrokeRec& stroke) {
|
| + SkRect bounds;
|
| + SkAutoTUnref<GrBatch> batch(create_circle_batch(color, viewMatrix, useCoverageAA, circle,
|
| + stroke, &bounds));
|
| target->drawBatch(pipelineBuilder, batch, &bounds);
|
| }
|
|
|
| @@ -1138,13 +1146,12 @@ private:
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| -bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| - GrColor color,
|
| - const SkMatrix& viewMatrix,
|
| - bool useCoverageAA,
|
| - const SkRect& ellipse,
|
| - const SkStrokeRec& stroke) {
|
| +static GrBatch* create_ellipse_batch(GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& ellipse,
|
| + const SkStrokeRec& stroke,
|
| + SkRect* bounds) {
|
| #ifdef SK_DEBUG
|
| {
|
| // we should have checked for this previously
|
| @@ -1188,13 +1195,13 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| // we only handle thick strokes for near-circular ellipses
|
| if (scaledStroke.length() > SK_ScalarHalf &&
|
| (SK_ScalarHalf*xRadius > yRadius || SK_ScalarHalf*yRadius > xRadius)) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // we don't handle it if curvature of the stroke is less than curvature of the ellipse
|
| if (scaledStroke.fX*(yRadius*yRadius) < (scaledStroke.fY*scaledStroke.fY)*xRadius ||
|
| scaledStroke.fY*(xRadius*xRadius) < (scaledStroke.fX*scaledStroke.fX)*yRadius) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // this is legit only if scale & translation (which should be the case at the moment)
|
| @@ -1213,12 +1220,8 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| xRadius += SK_ScalarHalf;
|
| yRadius += SK_ScalarHalf;
|
|
|
| - SkRect bounds = SkRect::MakeLTRB(
|
| - center.fX - xRadius,
|
| - center.fY - yRadius,
|
| - center.fX + xRadius,
|
| - center.fY + yRadius
|
| - );
|
| + bounds->setLTRB(center.fX - xRadius, center.fY - yRadius,
|
| + center.fX + xRadius, center.fY + yRadius);
|
|
|
| EllipseBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| @@ -1228,11 +1231,26 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| geometry.fInnerXRadius = innerXRadius;
|
| geometry.fInnerYRadius = innerYRadius;
|
| geometry.fStroke = isStrokeOnly && innerXRadius > 0 && innerYRadius > 0;
|
| - geometry.fDevBounds = bounds;
|
| + geometry.fDevBounds = *bounds;
|
|
|
| - SkAutoTUnref<GrBatch> batch(EllipseBatch::Create(geometry));
|
| - target->drawBatch(pipelineBuilder, batch, &bounds);
|
| + return EllipseBatch::Create(geometry);
|
| +}
|
|
|
| +bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| + GrPipelineBuilder* pipelineBuilder,
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& ellipse,
|
| + const SkStrokeRec& stroke) {
|
| + SkRect bounds;
|
| + SkAutoTUnref<GrBatch> batch(create_ellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| + stroke, &bounds));
|
| + if (!batch) {
|
| + return false;
|
| + }
|
| +
|
| + target->drawBatch(pipelineBuilder, batch, &bounds);
|
| return true;
|
| }
|
|
|
| @@ -1430,13 +1448,12 @@ private:
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| -bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| - GrColor color,
|
| - const SkMatrix& viewMatrix,
|
| - bool useCoverageAA,
|
| - const SkRect& ellipse,
|
| - const SkStrokeRec& stroke) {
|
| +static GrBatch* create_diellipse_batch(GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& ellipse,
|
| + const SkStrokeRec& stroke,
|
| + SkRect* bounds) {
|
| SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY());
|
| SkScalar xRadius = SkScalarHalf(ellipse.width());
|
| SkScalar yRadius = SkScalarHalf(ellipse.height());
|
| @@ -1461,13 +1478,13 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| // we only handle thick strokes for near-circular ellipses
|
| if (strokeWidth > SK_ScalarHalf &&
|
| (SK_ScalarHalf*xRadius > yRadius || SK_ScalarHalf*yRadius > xRadius)) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // we don't handle it if curvature of the stroke is less than curvature of the ellipse
|
| if (strokeWidth*(yRadius*yRadius) < (strokeWidth*strokeWidth)*xRadius ||
|
| strokeWidth*(xRadius*xRadius) < (strokeWidth*strokeWidth)*yRadius) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // set inner radius (if needed)
|
| @@ -1492,12 +1509,8 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| SkScalar geoDx = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(a*a + c*c));
|
| SkScalar geoDy = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(b*b + d*d));
|
|
|
| - SkRect bounds = SkRect::MakeLTRB(
|
| - center.fX - xRadius - geoDx,
|
| - center.fY - yRadius - geoDy,
|
| - center.fX + xRadius + geoDx,
|
| - center.fY + yRadius + geoDy
|
| - );
|
| + bounds->setLTRB(center.fX - xRadius - geoDx, center.fY - yRadius - geoDy,
|
| + center.fX + xRadius + geoDx, center.fY + yRadius + geoDy);
|
|
|
| DIEllipseBatch::Geometry geometry;
|
| geometry.fViewMatrix = viewMatrix;
|
| @@ -1509,13 +1522,26 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| geometry.fGeoDx = geoDx;
|
| geometry.fGeoDy = geoDy;
|
| geometry.fMode = mode;
|
| - geometry.fBounds = bounds;
|
| + geometry.fBounds = *bounds;
|
|
|
| - viewMatrix.mapRect(&bounds);
|
| + viewMatrix.mapRect(bounds);
|
| + return DIEllipseBatch::Create(geometry);
|
| +}
|
|
|
| - SkAutoTUnref<GrBatch> batch(DIEllipseBatch::Create(geometry));
|
| +bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| + GrPipelineBuilder* pipelineBuilder,
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useCoverageAA,
|
| + const SkRect& ellipse,
|
| + const SkStrokeRec& stroke) {
|
| + SkRect bounds;
|
| + SkAutoTUnref<GrBatch> batch(create_diellipse_batch(color, viewMatrix, useCoverageAA, ellipse,
|
| + stroke, &bounds));
|
| + if (!batch) {
|
| + return false;
|
| + }
|
| target->drawBatch(pipelineBuilder, batch, &bounds);
|
| -
|
| return true;
|
| }
|
|
|
| @@ -1544,26 +1570,6 @@ static const int kIndicesPerRRect = SK_ARRAY_COUNT(gRRectIndices);
|
| static const int kVertsPerRRect = 16;
|
| static const int kNumRRectsInIndexBuffer = 256;
|
|
|
| -GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(bool isStrokeOnly) {
|
| - if (isStrokeOnly) {
|
| - if (NULL == fStrokeRRectIndexBuffer) {
|
| - fStrokeRRectIndexBuffer = fGpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerStrokeRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return fStrokeRRectIndexBuffer;
|
| - } else {
|
| - if (NULL == fRRectIndexBuffer) {
|
| - fRRectIndexBuffer = fGpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return fRRectIndexBuffer;
|
| - }
|
| -}
|
| -
|
| bool GrOvalRenderer::drawDRRect(GrDrawTarget* target,
|
| GrPipelineBuilder* pipelineBuilder,
|
| GrColor color,
|
| @@ -2057,34 +2063,45 @@ private:
|
| const GrIndexBuffer* fIndexBuffer;
|
| };
|
|
|
| -bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| - GrColor color,
|
| - const SkMatrix& viewMatrix,
|
| - bool useAA,
|
| - const SkRRect& rrect,
|
| - const SkStrokeRec& stroke) {
|
| - if (rrect.isOval()) {
|
| - return this->drawOval(target, pipelineBuilder, color, viewMatrix, useAA, rrect.getBounds(),
|
| - stroke);
|
| - }
|
| -
|
| - bool useCoverageAA = useAA &&
|
| - !pipelineBuilder->getRenderTarget()->isMultisampled();
|
| -
|
| - // only anti-aliased rrects for now
|
| - if (!useCoverageAA) {
|
| - return false;
|
| - }
|
| -
|
| - if (!viewMatrix.rectStaysRect() || !rrect.isSimple()) {
|
| - return false;
|
| +static GrIndexBuffer* create_rrect_indexbuffer(GrIndexBuffer** strokeRRectIndexBuffer,
|
| + GrIndexBuffer** rrectIndexBuffer,
|
| + bool isStrokeOnly,
|
| + GrGpu* gpu) {
|
| + if (isStrokeOnly) {
|
| + if (NULL == *strokeRRectIndexBuffer) {
|
| + *strokeRRectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| + kIndicesPerStrokeRRect,
|
| + kNumRRectsInIndexBuffer,
|
| + kVertsPerRRect);
|
| + }
|
| + return *strokeRRectIndexBuffer;
|
| + } else {
|
| + if (NULL == *rrectIndexBuffer) {
|
| + *rrectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| + kIndicesPerRRect,
|
| + kNumRRectsInIndexBuffer,
|
| + kVertsPerRRect);
|
| + }
|
| + return *rrectIndexBuffer;
|
| }
|
| +}
|
|
|
| +static GrBatch* create_rrect_batch(GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + const SkRRect& rrect,
|
| + const SkStrokeRec& stroke,
|
| + SkRect* bounds,
|
| + GrIndexBuffer** strokeRRectIndexBuffer,
|
| + GrIndexBuffer** rrectIndexBuffer,
|
| + GrGpu* gpu) {
|
| + SkASSERT(viewMatrix.rectStaysRect());
|
| + SkASSERT(rrect.isSimple());
|
| + SkASSERT(!rrect.isOval());
|
| +
|
| + // 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();
|
| - SkRect bounds;
|
| - viewMatrix.mapRect(&bounds, rrectBounds);
|
| + viewMatrix.mapRect(bounds, rrectBounds);
|
|
|
| SkVector radii = rrect.getSimpleRadii();
|
| SkScalar xRadius = SkScalarAbs(viewMatrix[SkMatrix::kMScaleX]*radii.fX +
|
| @@ -2114,7 +2131,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
|
|
| // if half of strokewidth is greater than radius, we don't handle that right now
|
| if (SK_ScalarHalf*scaledStroke.fX > xRadius || SK_ScalarHalf*scaledStroke.fY > yRadius) {
|
| - return false;
|
| + return NULL;
|
| }
|
| }
|
|
|
| @@ -2124,13 +2141,16 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| // We could consider falling back to rect rendering here, since a tiny radius is
|
| // indistinguishable from a square corner.
|
| if (!isStrokeOnly && (SK_ScalarHalf > xRadius || SK_ScalarHalf > yRadius)) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| - GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(isStrokeOnly);
|
| + GrIndexBuffer* indexBuffer = create_rrect_indexbuffer(strokeRRectIndexBuffer,
|
| + rrectIndexBuffer,
|
| + isStrokeOnly,
|
| + gpu);
|
| if (NULL == indexBuffer) {
|
| SkDebugf("Failed to create index buffer!\n");
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // if the corners are circles, use the circle renderer
|
| @@ -2149,7 +2169,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| innerRadius = xRadius - halfWidth;
|
| }
|
| outerRadius += halfWidth;
|
| - bounds.outset(halfWidth, halfWidth);
|
| + bounds->outset(halfWidth, halfWidth);
|
| }
|
|
|
| isStrokeOnly = (isStrokeOnly && innerRadius >= 0);
|
| @@ -2163,7 +2183,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| 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;
|
| @@ -2171,10 +2191,9 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| geometry.fInnerRadius = innerRadius;
|
| geometry.fOuterRadius = outerRadius;
|
| geometry.fStroke = isStrokeOnly;
|
| - geometry.fDevBounds = bounds;
|
| + geometry.fDevBounds = *bounds;
|
|
|
| - SkAutoTUnref<GrBatch> batch(RRectCircleRendererBatch::Create(geometry, indexBuffer));
|
| - target->drawBatch(pipelineBuilder, batch, &bounds);
|
| + return RRectCircleRendererBatch::Create(geometry, indexBuffer);
|
|
|
| // otherwise we use the ellipse renderer
|
| } else {
|
| @@ -2190,13 +2209,13 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| // we only handle thick strokes for near-circular ellipses
|
| if (scaledStroke.length() > SK_ScalarHalf &&
|
| (SK_ScalarHalf*xRadius > yRadius || SK_ScalarHalf*yRadius > xRadius)) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // we don't handle it if curvature of the stroke is less than curvature of the ellipse
|
| if (scaledStroke.fX*(yRadius*yRadius) < (scaledStroke.fY*scaledStroke.fY)*xRadius ||
|
| scaledStroke.fY*(xRadius*xRadius) < (scaledStroke.fX*scaledStroke.fX)*yRadius) {
|
| - return false;
|
| + return NULL;
|
| }
|
|
|
| // this is legit only if scale & translation (which should be the case at the moment)
|
| @@ -2207,13 +2226,13 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
|
|
| 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;
|
| @@ -2223,10 +2242,101 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| geometry.fInnerXRadius = innerXRadius;
|
| geometry.fInnerYRadius = innerYRadius;
|
| geometry.fStroke = isStrokeOnly;
|
| - geometry.fDevBounds = bounds;
|
| + geometry.fDevBounds = *bounds;
|
|
|
| - SkAutoTUnref<GrBatch> batch(RRectEllipseRendererBatch::Create(geometry, indexBuffer));
|
| - target->drawBatch(pipelineBuilder, batch, &bounds);
|
| + return RRectEllipseRendererBatch::Create(geometry, indexBuffer);
|
| }
|
| +}
|
| +
|
| +bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| + GrPipelineBuilder* pipelineBuilder,
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + bool useAA,
|
| + const SkRRect& rrect,
|
| + const SkStrokeRec& stroke) {
|
| + if (rrect.isOval()) {
|
| + return this->drawOval(target, pipelineBuilder, color, viewMatrix, useAA, rrect.getBounds(),
|
| + stroke);
|
| + }
|
| +
|
| + bool useCoverageAA = useAA && !pipelineBuilder->getRenderTarget()->isMultisampled();
|
| +
|
| + // only anti-aliased rrects for now
|
| + if (!useCoverageAA) {
|
| + return false;
|
| + }
|
| +
|
| + if (!viewMatrix.rectStaysRect() || !rrect.isSimple()) {
|
| + return false;
|
| + }
|
| +
|
| + SkRect bounds;
|
| + SkAutoTUnref<GrBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke, &bounds,
|
| + &fStrokeRRectIndexBuffer, &fRRectIndexBuffer,
|
| + fGpu));
|
| + if (!batch) {
|
| + return false;
|
| + }
|
| +
|
| + target->drawBatch(pipelineBuilder, batch, &bounds);
|
| return true;
|
| }
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +#ifdef GR_TEST_UTILS
|
| +
|
| +static SkStrokeRec random_strokerec(SkRandom* random) {
|
| + SkStrokeRec::InitStyle style =
|
| + SkStrokeRec::InitStyle(random->nextULessThan(SkStrokeRec::kFill_InitStyle + 1));
|
| + SkStrokeRec rec(style);
|
| + bool strokeAndFill = random->nextBool();
|
| + SkScalar strokeWidth = random->nextBool() ? 0.f : 1.f;
|
| + rec.setStrokeStyle(strokeWidth, strokeAndFill);
|
| + return rec;
|
| +}
|
| +
|
| +BATCH_TEST_DEFINE(CircleBatch) {
|
| + SkMatrix viewMatrix = GrTest::TestMatrix(random);
|
| + 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);
|
| +}
|
| +
|
| +BATCH_TEST_DEFINE(EllipseBatch) {
|
| + SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random);
|
| + 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);
|
| +}
|
| +
|
| +BATCH_TEST_DEFINE(DIEllipseBatch) {
|
| + SkMatrix viewMatrix = GrTest::TestMatrix(random);
|
| + 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);
|
| +}
|
| +
|
| +BATCH_TEST_DEFINE(RRectBatch) {
|
| + SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random);
|
| + GrColor color = GrRandomColor(random);
|
| + const SkRRect& rrect = GrTest::TestRRectSimple(random);
|
| +
|
| + static GrIndexBuffer* gStrokeRRectIndexBuffer;
|
| + static GrIndexBuffer* gRRectIndexBuffer;
|
| + SkRect bounds;
|
| + return create_rrect_batch(color, viewMatrix, rrect, random_strokerec(random), &bounds,
|
| + &gStrokeRRectIndexBuffer, &gRRectIndexBuffer, context->getGpu());
|
| +}
|
| +
|
| +#endif
|
|
|