Fix for degenerate stroke rect
BUG=skia: Review URL: https://codereview.chromium.org/1359453002
This commit is contained in:
parent
bf87730c7d
commit
511684fb52
@ -53,6 +53,7 @@ public:
|
|||||||
SkRect fDevOutsideAssist;
|
SkRect fDevOutsideAssist;
|
||||||
SkRect fDevInside;
|
SkRect fDevInside;
|
||||||
GrColor fColor;
|
GrColor fColor;
|
||||||
|
bool fDegenerate;
|
||||||
};
|
};
|
||||||
|
|
||||||
static AAStrokeRectBatch* Create(const SkMatrix& viewMatrix, bool miterStroke) {
|
static AAStrokeRectBatch* Create(const SkMatrix& viewMatrix, bool miterStroke) {
|
||||||
@ -77,17 +78,19 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void append(GrColor color, const SkRect& devOutside, const SkRect& devOutsideAssist,
|
void append(GrColor color, const SkRect& devOutside, const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside) {
|
const SkRect& devInside, bool degenerate) {
|
||||||
Geometry& geometry = fGeoData.push_back();
|
Geometry& geometry = fGeoData.push_back();
|
||||||
geometry.fColor = color;
|
geometry.fColor = color;
|
||||||
geometry.fDevOutside = devOutside;
|
geometry.fDevOutside = devOutside;
|
||||||
geometry.fDevOutsideAssist = devOutsideAssist;
|
geometry.fDevOutsideAssist = devOutsideAssist;
|
||||||
geometry.fDevInside = devInside;
|
geometry.fDevInside = devInside;
|
||||||
|
geometry.fDegenerate = degenerate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appendAndUpdateBounds(GrColor color, const SkRect& devOutside,
|
void appendAndUpdateBounds(GrColor color, const SkRect& devOutside,
|
||||||
const SkRect& devOutsideAssist, const SkRect& devInside) {
|
const SkRect& devOutsideAssist, const SkRect& devInside,
|
||||||
this->append(color, devOutside, devOutsideAssist, devInside);
|
bool degenerate) {
|
||||||
|
this->append(color, devOutside, devOutsideAssist, devInside, degenerate);
|
||||||
|
|
||||||
SkRect bounds;
|
SkRect bounds;
|
||||||
this->updateBounds(&bounds, fGeoData.back());
|
this->updateBounds(&bounds, fGeoData.back());
|
||||||
@ -145,6 +148,7 @@ private:
|
|||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke,
|
bool miterStroke,
|
||||||
|
bool degenerate,
|
||||||
bool tweakAlphaForCoverage) const;
|
bool tweakAlphaForCoverage) const;
|
||||||
|
|
||||||
struct BatchTracker {
|
struct BatchTracker {
|
||||||
@ -226,6 +230,7 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) {
|
|||||||
args.fDevOutsideAssist,
|
args.fDevOutsideAssist,
|
||||||
args.fDevInside,
|
args.fDevInside,
|
||||||
fMiterStroke,
|
fMiterStroke,
|
||||||
|
args.fDegenerate,
|
||||||
canTweakAlphaForCoverage);
|
canTweakAlphaForCoverage);
|
||||||
}
|
}
|
||||||
helper.recordDraw(target);
|
helper.recordDraw(target);
|
||||||
@ -356,6 +361,15 @@ bool AAStrokeRectBatch::onCombineIfPossible(GrBatch* t, const GrCaps& caps) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setup_scale(int* scale, SkScalar inset) {
|
||||||
|
if (inset < SK_ScalarHalf) {
|
||||||
|
*scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
|
||||||
|
SkASSERT(*scale >= 0 && *scale <= 255);
|
||||||
|
} else {
|
||||||
|
*scale = 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||||
size_t offset,
|
size_t offset,
|
||||||
size_t vertexStride,
|
size_t vertexStride,
|
||||||
@ -366,6 +380,7 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke,
|
bool miterStroke,
|
||||||
|
bool degenerate,
|
||||||
bool tweakAlphaForCoverage) const {
|
bool tweakAlphaForCoverage) const {
|
||||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + offset;
|
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + offset;
|
||||||
|
|
||||||
@ -382,18 +397,34 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
#ifndef SK_IGNORE_THIN_STROKED_RECT_FIX
|
#ifndef SK_IGNORE_THIN_STROKED_RECT_FIX
|
||||||
// TODO: this only really works if the X & Y margins are the same all around
|
// TODO: this only really works if the X & Y margins are the same all around
|
||||||
// the rect (or if they are all >= 1.0).
|
// the rect (or if they are all >= 1.0).
|
||||||
SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRight);
|
SkScalar inset;
|
||||||
inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft);
|
if (!degenerate) {
|
||||||
inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop);
|
inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRight);
|
||||||
if (miterStroke) {
|
inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft);
|
||||||
inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fBottom);
|
inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop);
|
||||||
|
if (miterStroke) {
|
||||||
|
inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fBottom);
|
||||||
|
} else {
|
||||||
|
inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom -
|
||||||
|
devInside.fBottom);
|
||||||
|
}
|
||||||
|
SkASSERT(inset >= 0);
|
||||||
} else {
|
} else {
|
||||||
inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom -
|
// TODO use real devRect here
|
||||||
devInside.fBottom);
|
inset = SkMinScalar(devOutside.width(), SK_Scalar1);
|
||||||
|
inset = SK_ScalarHalf * SkMinScalar(inset, SkTMax(devOutside.height(),
|
||||||
|
devOutsideAssist.height()));
|
||||||
}
|
}
|
||||||
SkASSERT(inset >= 0);
|
|
||||||
#else
|
#else
|
||||||
SkScalar inset = SK_ScalarHalf;
|
SkScalar inset;
|
||||||
|
if (!degenerate) {
|
||||||
|
inset = SK_ScalarHalf;
|
||||||
|
} else {
|
||||||
|
// TODO use real devRect here
|
||||||
|
inset = SkMinScalar(devOutside.width(), SK_Scalar1);
|
||||||
|
inset = SK_ScalarHalf * SkMinScalar(inset, SkTMax(devOutside.height(),
|
||||||
|
devOutsideAssist.height()));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (miterStroke) {
|
if (miterStroke) {
|
||||||
@ -401,9 +432,19 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
set_inset_fan(fan0Pos, vertexStride, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
|
set_inset_fan(fan0Pos, vertexStride, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
|
||||||
// inner two
|
// inner two
|
||||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
if (!degenerate) {
|
||||||
// innermost
|
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||||
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
// innermost
|
||||||
|
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
||||||
|
} else {
|
||||||
|
// When the interior rect has become degenerate we smoosh to a single point
|
||||||
|
SkASSERT(devInside.fLeft == devInside.fRight &&
|
||||||
|
devInside.fTop == devInside.fBottom);
|
||||||
|
fan2Pos->setRectFan(devInside.fLeft, devInside.fTop,
|
||||||
|
devInside.fRight, devInside.fBottom, vertexStride);
|
||||||
|
fan3Pos->setRectFan(devInside.fLeft, devInside.fTop,
|
||||||
|
devInside.fRight, devInside.fBottom, vertexStride);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vertexStride);
|
SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vertexStride);
|
||||||
SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts +
|
SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts +
|
||||||
@ -416,10 +457,20 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
// outer one of the inner two
|
// outer one of the inner two
|
||||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||||
set_inset_fan(fan1AssistPos, vertexStride, devOutsideAssist, inset, inset);
|
set_inset_fan(fan1AssistPos, vertexStride, devOutsideAssist, inset, inset);
|
||||||
// inner one of the inner two
|
if (!degenerate) {
|
||||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
// inner one of the inner two
|
||||||
// innermost
|
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||||
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
// innermost
|
||||||
|
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
||||||
|
} else {
|
||||||
|
// When the interior rect has become degenerate we smoosh to a single point
|
||||||
|
SkASSERT(devInside.fLeft == devInside.fRight &&
|
||||||
|
devInside.fTop == devInside.fBottom);
|
||||||
|
fan2Pos->setRectFan(devInside.fLeft, devInside.fTop,
|
||||||
|
devInside.fRight, devInside.fBottom, vertexStride);
|
||||||
|
fan3Pos->setRectFan(devInside.fLeft, devInside.fTop,
|
||||||
|
devInside.fRight, devInside.fBottom, vertexStride);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make verts point to vertex color and then set all the color and coverage vertex attrs
|
// Make verts point to vertex color and then set all the color and coverage vertex attrs
|
||||||
@ -436,12 +487,7 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
|
|
||||||
// scale is the coverage for the the inner two rects.
|
// scale is the coverage for the the inner two rects.
|
||||||
int scale;
|
int scale;
|
||||||
if (inset < SK_ScalarHalf) {
|
setup_scale(&scale, inset);
|
||||||
scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
|
|
||||||
SkASSERT(scale >= 0 && scale <= 255);
|
|
||||||
} else {
|
|
||||||
scale = 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
float innerCoverage = GrNormalizeByteToFloat(scale);
|
float innerCoverage = GrNormalizeByteToFloat(scale);
|
||||||
GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale);
|
GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale);
|
||||||
@ -452,19 +498,24 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
|||||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor;
|
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor;
|
||||||
} else {
|
} else {
|
||||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
|
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
|
||||||
*reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) =
|
*reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) = innerCoverage;
|
||||||
innerCoverage;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The innermost rect has 0 coverage
|
// The innermost rect has 0 coverage, unless we are degenerate, in which case we must apply the
|
||||||
|
// scaled coverage
|
||||||
verts += (outerVertexNum + innerVertexNum) * vertexStride;
|
verts += (outerVertexNum + innerVertexNum) * vertexStride;
|
||||||
|
if (!degenerate) {
|
||||||
|
innerCoverage = 0;
|
||||||
|
scaledColor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < innerVertexNum; ++i) {
|
for (int i = 0; i < innerVertexNum; ++i) {
|
||||||
if (tweakAlphaForCoverage) {
|
if (tweakAlphaForCoverage) {
|
||||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = 0;
|
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor;
|
||||||
} else {
|
} else {
|
||||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
|
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
|
||||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride + sizeof(GrColor)) = 0;
|
*reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) = innerCoverage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -476,9 +527,10 @@ GrDrawBatch* Create(GrColor color,
|
|||||||
const SkRect& devOutside,
|
const SkRect& devOutside,
|
||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke) {
|
bool miterStroke,
|
||||||
|
bool degenerate) {
|
||||||
AAStrokeRectBatch* batch = AAStrokeRectBatch::Create(viewMatrix, miterStroke);
|
AAStrokeRectBatch* batch = AAStrokeRectBatch::Create(viewMatrix, miterStroke);
|
||||||
batch->append(color, devOutside, devOutsideAssist, devInside);
|
batch->append(color, devOutside, devOutsideAssist, devInside, degenerate);
|
||||||
batch->init();
|
batch->init();
|
||||||
return batch;
|
return batch;
|
||||||
}
|
}
|
||||||
@ -489,7 +541,8 @@ bool Append(GrBatch* origBatch,
|
|||||||
const SkRect& devOutside,
|
const SkRect& devOutside,
|
||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke) {
|
bool miterStroke,
|
||||||
|
bool degenerate) {
|
||||||
AAStrokeRectBatch* batch = origBatch->cast<AAStrokeRectBatch>();
|
AAStrokeRectBatch* batch = origBatch->cast<AAStrokeRectBatch>();
|
||||||
|
|
||||||
// we can't batch across vm changes
|
// we can't batch across vm changes
|
||||||
@ -497,7 +550,7 @@ bool Append(GrBatch* origBatch,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
batch->appendAndUpdateBounds(color, devOutside, devOutsideAssist, devInside);
|
batch->appendAndUpdateBounds(color, devOutside, devOutsideAssist, devInside, degenerate);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,6 +564,7 @@ bool Append(GrBatch* origBatch,
|
|||||||
|
|
||||||
DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
||||||
bool miterStroke = random->nextBool();
|
bool miterStroke = random->nextBool();
|
||||||
|
bool degenerate = random->nextBool();
|
||||||
|
|
||||||
// Create mock stroke rect
|
// Create mock stroke rect
|
||||||
SkRect outside = GrTest::TestRect(random);
|
SkRect outside = GrTest::TestRect(random);
|
||||||
@ -524,7 +578,7 @@ DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
|||||||
GrColor color = GrRandomColor(random);
|
GrColor color = GrRandomColor(random);
|
||||||
|
|
||||||
return GrAAStrokeRectBatch::Create(color, GrTest::TestMatrix(random), outside, outsideAssist,
|
return GrAAStrokeRectBatch::Create(color, GrTest::TestMatrix(random), outside, outsideAssist,
|
||||||
inside, miterStroke);
|
inside, degenerate, miterStroke);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,7 +23,8 @@ GrDrawBatch* Create(GrColor color,
|
|||||||
const SkRect& devOutside,
|
const SkRect& devOutside,
|
||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke);
|
bool miterStroke,
|
||||||
|
bool degenerate);
|
||||||
|
|
||||||
bool Append(GrBatch*,
|
bool Append(GrBatch*,
|
||||||
GrColor color,
|
GrColor color,
|
||||||
@ -31,7 +32,8 @@ bool Append(GrBatch*,
|
|||||||
const SkRect& devOutside,
|
const SkRect& devOutside,
|
||||||
const SkRect& devOutsideAssist,
|
const SkRect& devOutsideAssist,
|
||||||
const SkRect& devInside,
|
const SkRect& devInside,
|
||||||
bool miterStroke);
|
bool miterStroke,
|
||||||
|
bool degenerate);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,13 +33,6 @@ GrDrawBatch* CreateAAStroke(GrColor color,
|
|||||||
const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf);
|
const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf);
|
||||||
const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf);
|
const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf);
|
||||||
|
|
||||||
SkScalar spare;
|
|
||||||
{
|
|
||||||
SkScalar w = devRect.width() - dx;
|
|
||||||
SkScalar h = devRect.height() - dy;
|
|
||||||
spare = SkTMin(w, h);
|
|
||||||
}
|
|
||||||
|
|
||||||
SkRect devOutside(devRect);
|
SkRect devOutside(devRect);
|
||||||
devOutside.outset(rx, ry);
|
devOutside.outset(rx, ry);
|
||||||
|
|
||||||
@ -51,13 +44,25 @@ GrDrawBatch* CreateAAStroke(GrColor color,
|
|||||||
miterStroke = false;
|
miterStroke = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spare <= 0 && miterStroke) {
|
|
||||||
return CreateAAFill(color, viewMatrix, devOutside, devOutside);
|
|
||||||
}
|
|
||||||
|
|
||||||
SkRect devInside(devRect);
|
SkRect devInside(devRect);
|
||||||
devInside.inset(rx, ry);
|
devInside.inset(rx, ry);
|
||||||
|
|
||||||
|
// If we have a degenerate stroking rect(ie the stroke is larger than inner rect) then we
|
||||||
|
// make a degenerate inside rect to avoid double hitting. We will also jam all of the points
|
||||||
|
// together when we render these rects.
|
||||||
|
SkScalar spare;
|
||||||
|
{
|
||||||
|
SkScalar w = devRect.width() - dx;
|
||||||
|
SkScalar h = devRect.height() - dy;
|
||||||
|
spare = SkTMin(w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool degenerate = spare <= 0;
|
||||||
|
if (degenerate) {
|
||||||
|
devInside.fLeft = devInside.fRight = devRect.centerX();
|
||||||
|
devInside.fTop = devInside.fBottom = devRect.centerY();
|
||||||
|
}
|
||||||
|
|
||||||
SkRect devOutsideAssist(devRect);
|
SkRect devOutsideAssist(devRect);
|
||||||
|
|
||||||
// For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
|
// For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
|
||||||
@ -69,7 +74,7 @@ GrDrawBatch* CreateAAStroke(GrColor color,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return GrAAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutsideAssist, devInside,
|
return GrAAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutsideAssist, devInside,
|
||||||
miterStroke);
|
miterStroke, degenerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
GrDrawBatch* CreateAAFillNestedRects(GrColor color,
|
GrDrawBatch* CreateAAFillNestedRects(GrColor color,
|
||||||
@ -82,11 +87,8 @@ GrDrawBatch* CreateAAFillNestedRects(GrColor color,
|
|||||||
viewMatrix.mapRect(&devOutside, rects[0]);
|
viewMatrix.mapRect(&devOutside, rects[0]);
|
||||||
viewMatrix.mapRect(&devInside, rects[1]);
|
viewMatrix.mapRect(&devInside, rects[1]);
|
||||||
|
|
||||||
if (devInside.isEmpty()) {
|
return GrAAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutside, devInside, true,
|
||||||
return CreateAAFill(color, viewMatrix, devOutside, devOutside);
|
devInside.isEmpty());
|
||||||
}
|
|
||||||
|
|
||||||
return GrAAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutside, devInside, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user