Update rect ops to use "op" in their name and return sk_sp.
Change-Id: I757c33d1cd17a7a7dda858f0fc5ab1094e3c2472 Reviewed-on: https://skia-review.googlesource.com/5985 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
This commit is contained in:
parent
b7ce80b714
commit
6a639040bc
@ -11,7 +11,7 @@
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "SkRRect.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrRRectEffect.h"
|
||||
|
||||
namespace skiagm {
|
||||
@ -87,9 +87,8 @@ protected:
|
||||
SkRect bounds = testBounds;
|
||||
bounds.offset(SkIntToScalar(x), SkIntToScalar(y));
|
||||
|
||||
sk_sp<GrDrawOp> op(
|
||||
GrRectBatchFactory::CreateNonAAFill(0xff000000, SkMatrix::I(), bounds,
|
||||
nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(0xff000000, SkMatrix::I(),
|
||||
bounds, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint, GrAAType::kNone,
|
||||
std::move(op));
|
||||
}
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include "SkGrPriv.h"
|
||||
#include "SkGradientShader.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrConstColorProcessor.h"
|
||||
|
||||
namespace skiagm {
|
||||
@ -109,9 +109,8 @@ protected:
|
||||
|
||||
grPaint.addColorFragmentProcessor(std::move(fp));
|
||||
|
||||
sk_sp<GrDrawOp> op(
|
||||
GrRectBatchFactory::CreateNonAAFill(grPaint.getColor(), viewMatrix,
|
||||
renderRect, nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(
|
||||
grPaint.getColor(), viewMatrix, renderRect, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint, GrAAType::kNone,
|
||||
std::move(op));
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "GrContext.h"
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrRRectEffect.h"
|
||||
#endif
|
||||
#include "SkRRect.h"
|
||||
@ -115,9 +115,8 @@ protected:
|
||||
SkRect bounds = rrect.getBounds();
|
||||
bounds.outset(2.f, 2.f);
|
||||
|
||||
sk_sp<GrDrawOp> op(
|
||||
GrRectBatchFactory::CreateNonAAFill(0xff000000, SkMatrix::I(),
|
||||
bounds, nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(
|
||||
0xff000000, SkMatrix::I(), bounds, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint,
|
||||
GrAAType::kNone,
|
||||
std::move(op));
|
||||
|
@ -11,13 +11,13 @@
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "GrContext.h"
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "SkBitmap.h"
|
||||
#include "SkGr.h"
|
||||
#include "SkGradientShader.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrTextureDomain.h"
|
||||
|
||||
namespace skiagm {
|
||||
@ -126,9 +126,8 @@ protected:
|
||||
const SkMatrix viewMatrix = SkMatrix::MakeTrans(x, y);
|
||||
grPaint.addColorFragmentProcessor(std::move(fp));
|
||||
|
||||
sk_sp<GrDrawOp> op(
|
||||
GrRectBatchFactory::CreateNonAAFill(GrColor_WHITE, viewMatrix,
|
||||
renderRect, nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(
|
||||
GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint, GrAAType::kNone,
|
||||
std::move(op));
|
||||
x += renderRect.width() + kTestPad;
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "SkGr.h"
|
||||
#include "SkGradientShader.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrYUVEffect.h"
|
||||
|
||||
#define YSIZE 8
|
||||
@ -123,9 +123,8 @@ protected:
|
||||
SkMatrix viewMatrix;
|
||||
viewMatrix.setTranslate(x, y);
|
||||
grPaint.addColorFragmentProcessor(std::move(fp));
|
||||
sk_sp<GrDrawOp> op(
|
||||
GrRectBatchFactory::CreateNonAAFill(GrColor_WHITE, viewMatrix,
|
||||
renderRect, nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(
|
||||
GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint, GrAAType::kNone,
|
||||
std::move(op));
|
||||
}
|
||||
@ -237,8 +236,8 @@ protected:
|
||||
SkMatrix viewMatrix;
|
||||
viewMatrix.setTranslate(x, y);
|
||||
grPaint.addColorFragmentProcessor(fp);
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateNonAAFill(
|
||||
GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(GrColor_WHITE, viewMatrix,
|
||||
renderRect, nullptr, nullptr));
|
||||
renderTargetContext->priv().testingOnly_addDrawOp(grPaint, GrAAType::kNone,
|
||||
std::move(op));
|
||||
}
|
||||
|
26
gn/gpu.gni
26
gn/gpu.gni
@ -237,12 +237,12 @@ skia_gpu_sources = [
|
||||
"$_src/gpu/batches/GrAADistanceFieldPathRenderer.h",
|
||||
"$_src/gpu/batches/GrAAConvexPathRenderer.cpp",
|
||||
"$_src/gpu/batches/GrAAConvexPathRenderer.h",
|
||||
"$_src/gpu/batches/GrAAFillRectBatch.cpp",
|
||||
"$_src/gpu/batches/GrAAFillRectBatch.h",
|
||||
"$_src/gpu/batches/GrAAStrokeRectBatch.cpp",
|
||||
"$_src/gpu/batches/GrAAStrokeRectBatch.h",
|
||||
"$_src/gpu/batches/GrAnalyticRectBatch.cpp",
|
||||
"$_src/gpu/batches/GrAnalyticRectBatch.h",
|
||||
"$_src/gpu/batches/GrAAFillRectOp.cpp",
|
||||
"$_src/gpu/batches/GrAAFillRectOp.h",
|
||||
"$_src/gpu/batches/GrAAStrokeRectOp.cpp",
|
||||
"$_src/gpu/batches/GrAAStrokeRectOp.h",
|
||||
"$_src/gpu/batches/GrAnalyticRectOp.cpp",
|
||||
"$_src/gpu/batches/GrAnalyticRectOp.h",
|
||||
"$_src/gpu/batches/GrAtlasTextBatch.cpp",
|
||||
"$_src/gpu/batches/GrAtlasTextBatch.h",
|
||||
"$_src/gpu/batches/GrClearBatch.h",
|
||||
@ -264,19 +264,19 @@ skia_gpu_sources = [
|
||||
"$_src/gpu/batches/GrDrawVerticesBatch.h",
|
||||
"$_src/gpu/batches/GrMSAAPathRenderer.cpp",
|
||||
"$_src/gpu/batches/GrMSAAPathRenderer.h",
|
||||
"$_src/gpu/batches/GrNonAAFillRectBatch.h",
|
||||
"$_src/gpu/batches/GrNonAAFillRectBatch.cpp",
|
||||
"$_src/gpu/batches/GrNonAAFillRectPerspectiveBatch.cpp",
|
||||
"$_src/gpu/batches/GrNonAAStrokeRectBatch.cpp",
|
||||
"$_src/gpu/batches/GrNonAAStrokeRectBatch.h",
|
||||
"$_src/gpu/batches/GrNonAAFillRectOp.h",
|
||||
"$_src/gpu/batches/GrNonAAFillRectOp.cpp",
|
||||
"$_src/gpu/batches/GrNonAAFillRectPerspectiveOp.cpp",
|
||||
"$_src/gpu/batches/GrNonAAStrokeRectOp.cpp",
|
||||
"$_src/gpu/batches/GrNonAAStrokeRectOp.h",
|
||||
"$_src/gpu/batches/GrNinePatch.cpp",
|
||||
"$_src/gpu/batches/GrNinePatch.h",
|
||||
"$_src/gpu/batches/GrOp.cpp",
|
||||
"$_src/gpu/batches/GrOp.h",
|
||||
"$_src/gpu/batches/GrPLSPathRenderer.cpp",
|
||||
"$_src/gpu/batches/GrPLSPathRenderer.h",
|
||||
"$_src/gpu/batches/GrRectBatchFactory.h",
|
||||
"$_src/gpu/batches/GrRectBatchFactory.cpp",
|
||||
"$_src/gpu/batches/GrRectOpFactory.h",
|
||||
"$_src/gpu/batches/GrRectOpFactory.cpp",
|
||||
"$_src/gpu/batches/GrRegionBatch.cpp",
|
||||
"$_src/gpu/batches/GrRegionBatch.h",
|
||||
"$_src/gpu/batches/GrShadowRRectBatch.cpp",
|
||||
|
@ -13,18 +13,18 @@
|
||||
|
||||
DRAW_BATCH_TEST_EXTERN(AAConvexPathBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AADistanceFieldPathBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AAFillRectBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AAFillRectBatchLocalMatrix);
|
||||
DRAW_BATCH_TEST_EXTERN(AAFillRectOp);
|
||||
DRAW_BATCH_TEST_EXTERN(AAFillRectOpLocalMatrix);
|
||||
DRAW_BATCH_TEST_EXTERN(AAHairlineBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AAStrokeRectBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AnalyticRectBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(AAStrokeRectOp);
|
||||
DRAW_BATCH_TEST_EXTERN(AnalyticRectOp);
|
||||
DRAW_BATCH_TEST_EXTERN(DashBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(DefaultPathBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(CircleBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(DIEllipseBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(EllipseBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(GrDrawAtlasBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(NonAAStrokeRectBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(NonAAStrokeRectOp);
|
||||
DRAW_BATCH_TEST_EXTERN(RRectBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(TesselatingPathBatch);
|
||||
DRAW_BATCH_TEST_EXTERN(TextBlobBatch);
|
||||
@ -33,18 +33,18 @@ DRAW_BATCH_TEST_EXTERN(VerticesBatch);
|
||||
static BatchTestFunc gTestBatches[] = {
|
||||
DRAW_BATCH_TEST_ENTRY(AAConvexPathBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AADistanceFieldPathBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AAFillRectBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AAFillRectBatchLocalMatrix),
|
||||
DRAW_BATCH_TEST_ENTRY(AAFillRectOp),
|
||||
DRAW_BATCH_TEST_ENTRY(AAFillRectOpLocalMatrix),
|
||||
DRAW_BATCH_TEST_ENTRY(AAHairlineBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AAStrokeRectBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AnalyticRectBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(AAStrokeRectOp),
|
||||
DRAW_BATCH_TEST_ENTRY(AnalyticRectOp),
|
||||
DRAW_BATCH_TEST_ENTRY(DashBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(DefaultPathBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(CircleBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(DIEllipseBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(EllipseBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(GrDrawAtlasBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(NonAAStrokeRectBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(NonAAStrokeRectOp),
|
||||
DRAW_BATCH_TEST_ENTRY(RRectBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(TesselatingPathBatch),
|
||||
DRAW_BATCH_TEST_ENTRY(TextBlobBatch),
|
||||
|
@ -20,12 +20,12 @@
|
||||
#include "GrResourceProvider.h"
|
||||
#include "SkSurfacePriv.h"
|
||||
|
||||
#include "batches/GrOp.h"
|
||||
#include "batches/GrClearBatch.h"
|
||||
#include "batches/GrDrawAtlasBatch.h"
|
||||
#include "batches/GrDrawVerticesBatch.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrNinePatch.h" // TODO Factory
|
||||
#include "batches/GrNinePatch.h" // TODO Factory
|
||||
#include "batches/GrOp.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "batches/GrRegionBatch.h"
|
||||
#include "batches/GrShadowRRectBatch.h"
|
||||
|
||||
@ -480,8 +480,7 @@ bool GrRenderTargetContext::drawFilledRect(const GrClip& clip,
|
||||
SkRect devBoundRect;
|
||||
viewMatrix.mapRect(&devBoundRect, croppedRect);
|
||||
|
||||
op.reset(GrRectBatchFactory::CreateAAFill(paint, viewMatrix, rect, croppedRect,
|
||||
devBoundRect));
|
||||
op = GrRectOpFactory::MakeAAFill(paint, viewMatrix, rect, croppedRect, devBoundRect);
|
||||
if (op) {
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
if (ss) {
|
||||
@ -594,7 +593,7 @@ void GrRenderTargetContext::drawRect(const GrClip& clip,
|
||||
if (GrAAType::kCoverage == aaType) {
|
||||
// The stroke path needs the rect to remain axis aligned (no rotation or skew).
|
||||
if (viewMatrix.rectStaysRect()) {
|
||||
op.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix, rect, stroke));
|
||||
op = GrRectOpFactory::MakeAAStroke(color, viewMatrix, rect, stroke);
|
||||
}
|
||||
} else {
|
||||
// Depending on sub-pixel coordinates and the particular GPU, we may lose a corner of
|
||||
@ -602,8 +601,8 @@ void GrRenderTargetContext::drawRect(const GrClip& clip,
|
||||
// when MSAA is enabled because it can cause ugly artifacts.
|
||||
snapToPixelCenters = stroke.getStyle() == SkStrokeRec::kHairline_Style &&
|
||||
!fRenderTargetProxy->isUnifiedMultisampled();
|
||||
op.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix, rect,
|
||||
stroke, snapToPixelCenters));
|
||||
op = GrRectOpFactory::MakeNonAAStroke(color, viewMatrix, rect, stroke,
|
||||
snapToPixelCenters);
|
||||
}
|
||||
|
||||
if (op) {
|
||||
@ -741,8 +740,8 @@ void GrRenderTargetContext::fillRectToRect(const GrClip& clip,
|
||||
}
|
||||
|
||||
if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
|
||||
sk_sp<GrDrawOp> op(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), viewMatrix,
|
||||
croppedRect, croppedLocalRect));
|
||||
sk_sp<GrDrawOp> op = GrAAFillRectOp::MakeWithLocalRect(paint.getColor(), viewMatrix,
|
||||
croppedRect, croppedLocalRect);
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
this->addDrawOp(pipelineBuilder, clip, std::move(op));
|
||||
return;
|
||||
@ -799,8 +798,8 @@ void GrRenderTargetContext::fillRectWithLocalMatrix(const GrClip& clip,
|
||||
}
|
||||
|
||||
if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
|
||||
sk_sp<GrDrawOp> op(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, localMatrix,
|
||||
croppedRect));
|
||||
sk_sp<GrDrawOp> op =
|
||||
GrAAFillRectOp::Make(paint.getColor(), viewMatrix, localMatrix, croppedRect);
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
this->getOpList()->addDrawOp(pipelineBuilder, this, clip, std::move(op));
|
||||
return;
|
||||
@ -1259,8 +1258,8 @@ void GrRenderTargetContext::drawNonAAFilledRect(const GrClip& clip,
|
||||
GrAAType hwOrNoneAAType) {
|
||||
SkASSERT(GrAAType::kCoverage != hwOrNoneAAType);
|
||||
SkASSERT(hwOrNoneAAType == GrAAType::kNone || this->isStencilBufferMultisampled());
|
||||
sk_sp<GrDrawOp> op( GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
|
||||
localRect, localMatrix));
|
||||
sk_sp<GrDrawOp> op = GrRectOpFactory::MakeNonAAFill(paint.getColor(), viewMatrix, rect,
|
||||
localRect, localMatrix);
|
||||
GrPipelineBuilder pipelineBuilder(paint, hwOrNoneAAType);
|
||||
if (ss) {
|
||||
pipelineBuilder.setUserStencil(ss);
|
||||
@ -1388,8 +1387,8 @@ void GrRenderTargetContext::drawPath(const GrClip& clip,
|
||||
SkRect rects[2];
|
||||
|
||||
if (fills_as_nested_rects(viewMatrix, path, rects)) {
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateAAFillNestedRects(
|
||||
paint.getColor(), viewMatrix, rects));
|
||||
sk_sp<GrDrawOp> op =
|
||||
GrRectOpFactory::MakeAAFillNestedRects(paint.getColor(), viewMatrix, rects);
|
||||
if (op) {
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
this->getOpList()->addDrawOp(pipelineBuilder, this, clip, std::move(op));
|
||||
|
@ -33,7 +33,7 @@
|
||||
#include "batches/GrDiscardBatch.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
#include "batches/GrDrawPathBatch.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "batches/GrStencilPathBatch.h"
|
||||
|
||||
#include "instanced/InstancedRendering.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
#include "SkDistanceFieldGen.h"
|
||||
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
|
||||
/*
|
||||
* Convert a boolean operation into a transfer mode code
|
||||
@ -190,7 +190,7 @@ void GrSWMaskHelper::DrawToTargetWithShapeMask(GrTexture* texture,
|
||||
maskMatrix,
|
||||
GrSamplerParams::kNone_FilterMode));
|
||||
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), SkMatrix::I(), dstRect,
|
||||
nullptr, &invert));
|
||||
sk_sp<GrDrawOp> op = GrRectOpFactory::MakeNonAAFill(paint.getColor(), SkMatrix::I(), dstRect,
|
||||
nullptr, &invert);
|
||||
renderTargetContext->addDrawOp(pipelineBuilder, clip, std::move(op));
|
||||
}
|
||||
|
@ -8,12 +8,12 @@
|
||||
#include "GrSoftwarePathRenderer.h"
|
||||
#include "GrAuditTrail.h"
|
||||
#include "GrClip.h"
|
||||
#include "GrPipelineBuilder.h"
|
||||
#include "GrGpuResourcePriv.h"
|
||||
#include "GrPipelineBuilder.h"
|
||||
#include "GrSWMaskHelper.h"
|
||||
#include "GrSurfaceContextPriv.h"
|
||||
#include "GrTextureProvider.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
bool GrSoftwarePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
|
||||
@ -69,8 +69,8 @@ void GrSoftwarePathRenderer::DrawNonAARect(GrRenderTargetContext* renderTargetCo
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkMatrix& localMatrix) {
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
|
||||
nullptr, &localMatrix));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(paint.getColor(), viewMatrix, rect, nullptr,
|
||||
&localMatrix));
|
||||
|
||||
GrPipelineBuilder pipelineBuilder(paint, GrAAType::kNone);
|
||||
pipelineBuilder.setUserStencil(&userStencilSettings);
|
||||
|
@ -22,17 +22,17 @@
|
||||
#include "SkGlyphCache.h"
|
||||
#include "SkGr.h"
|
||||
#include "SkGrPriv.h"
|
||||
#include "SkImage_Base.h"
|
||||
#include "SkImageCacherator.h"
|
||||
#include "SkImageFilter.h"
|
||||
#include "SkImageFilterCache.h"
|
||||
#include "SkImage_Base.h"
|
||||
#include "SkLatticeIter.h"
|
||||
#include "SkMaskFilter.h"
|
||||
#include "SkPathEffect.h"
|
||||
#include "SkPicture.h"
|
||||
#include "SkPictureData.h"
|
||||
#include "SkRasterClip.h"
|
||||
#include "SkRRect.h"
|
||||
#include "SkRasterClip.h"
|
||||
#include "SkRecord.h"
|
||||
#include "SkSpecialImage.h"
|
||||
#include "SkStroke.h"
|
||||
@ -41,7 +41,7 @@
|
||||
#include "SkTLazy.h"
|
||||
#include "SkUtils.h"
|
||||
#include "SkVertState.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "effects/GrBicubicEffect.h"
|
||||
#include "effects/GrDashingEffect.h"
|
||||
#include "effects/GrSimpleTextureEffect.h"
|
||||
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrAAFillRectBatch_DEFINED
|
||||
#define GrAAFillRectBatch_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
class GrOp;
|
||||
struct SkRect;
|
||||
|
||||
namespace GrAAFillRectBatch {
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect);
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect);
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect);
|
||||
|
||||
GrDrawOp* CreateWithLocalRect(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& localRect);
|
||||
};
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrAAFillRectBatch.h"
|
||||
#include "GrAAFillRectOp.h"
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "GrDefaultGeoProcFactory.h"
|
||||
@ -19,10 +19,8 @@
|
||||
|
||||
GR_DECLARE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
|
||||
|
||||
static void set_inset_fan(SkPoint* pts, size_t stride,
|
||||
const SkRect& r, SkScalar dx, SkScalar dy) {
|
||||
pts->setRectFan(r.fLeft + dx, r.fTop + dy,
|
||||
r.fRight - dx, r.fBottom - dy, stride);
|
||||
static void set_inset_fan(SkPoint* pts, size_t stride, const SkRect& r, SkScalar dx, SkScalar dy) {
|
||||
pts->setRectFan(r.fLeft + dx, r.fTop + dy, r.fRight - dx, r.fBottom - dy, stride);
|
||||
}
|
||||
|
||||
static const int kNumAAFillRectsInIndexBuffer = 256;
|
||||
@ -32,6 +30,7 @@ static const int kIndicesPerAAFillRect = 30;
|
||||
const GrBuffer* get_index_buffer(GrResourceProvider* resourceProvider) {
|
||||
GR_DEFINE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
|
||||
|
||||
// clang-format off
|
||||
static const uint16_t gFillAARectIdx[] = {
|
||||
0, 1, 5, 5, 4, 0,
|
||||
1, 2, 6, 6, 5, 1,
|
||||
@ -39,10 +38,12 @@ const GrBuffer* get_index_buffer(GrResourceProvider* resourceProvider) {
|
||||
3, 0, 4, 4, 7, 3,
|
||||
4, 5, 6, 6, 7, 4,
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFillAARectIdx) == kIndicesPerAAFillRect);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(gFillAARectIdx,
|
||||
kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer, kVertsPerAAFillRect,
|
||||
gAAFillRectIndexBufferKey);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(
|
||||
gFillAARectIdx, kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer,
|
||||
kVertsPerAAFillRect, gAAFillRectIndexBufferKey);
|
||||
}
|
||||
|
||||
static void generate_aa_fill_rect_geometry(intptr_t verts,
|
||||
@ -63,13 +64,11 @@ static void generate_aa_fill_rect_geometry(intptr_t verts,
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height());
|
||||
|
||||
set_inset_fan(fan0Pos, vertexStride, devRect, -SK_ScalarHalf, -SK_ScalarHalf);
|
||||
set_inset_fan(fan1Pos, vertexStride, devRect, inset, inset);
|
||||
set_inset_fan(fan1Pos, vertexStride, devRect, inset, inset);
|
||||
} else {
|
||||
// compute transformed (1, 0) and (0, 1) vectors
|
||||
SkVector vec[2] = {
|
||||
{ viewMatrix[SkMatrix::kMScaleX], viewMatrix[SkMatrix::kMSkewY] },
|
||||
{ viewMatrix[SkMatrix::kMSkewX], viewMatrix[SkMatrix::kMScaleY] }
|
||||
};
|
||||
SkVector vec[2] = {{viewMatrix[SkMatrix::kMScaleX], viewMatrix[SkMatrix::kMSkewY]},
|
||||
{viewMatrix[SkMatrix::kMSkewX], viewMatrix[SkMatrix::kMScaleY]}};
|
||||
|
||||
SkScalar len1 = SkPoint::Normalize(&vec[0]);
|
||||
vec[0].scale(SK_ScalarHalf);
|
||||
@ -80,8 +79,7 @@ static void generate_aa_fill_rect_geometry(intptr_t verts,
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, len2 * rect.height());
|
||||
|
||||
// create the rotated rect
|
||||
fan0Pos->setRectFan(rect.fLeft, rect.fTop,
|
||||
rect.fRight, rect.fBottom, vertexStride);
|
||||
fan0Pos->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride);
|
||||
viewMatrix.mapPointsWithStride(fan0Pos, vertexStride, 4);
|
||||
|
||||
// Now create the inset points and then outset the original
|
||||
@ -89,19 +87,19 @@ static void generate_aa_fill_rect_geometry(intptr_t verts,
|
||||
|
||||
// TL
|
||||
*((SkPoint*)((intptr_t)fan1Pos + 0 * vertexStride)) =
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) + vec[0] + vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) + vec[0] + vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) -= vec[0] + vec[1];
|
||||
// BL
|
||||
*((SkPoint*)((intptr_t)fan1Pos + 1 * vertexStride)) =
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 1 * vertexStride)) + vec[0] - vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 1 * vertexStride)) + vec[0] - vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 1 * vertexStride)) -= vec[0] - vec[1];
|
||||
// BR
|
||||
*((SkPoint*)((intptr_t)fan1Pos + 2 * vertexStride)) =
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 2 * vertexStride)) - vec[0] - vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 2 * vertexStride)) - vec[0] - vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 2 * vertexStride)) += vec[0] + vec[1];
|
||||
// TR
|
||||
*((SkPoint*)((intptr_t)fan1Pos + 3 * vertexStride)) =
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 3 * vertexStride)) - vec[0] + vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 3 * vertexStride)) - vec[0] + vec[1];
|
||||
*((SkPoint*)((intptr_t)fan0Pos + 3 * vertexStride)) += vec[0] - vec[1];
|
||||
}
|
||||
|
||||
@ -152,20 +150,21 @@ static void generate_aa_fill_rect_geometry(intptr_t verts,
|
||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor;
|
||||
} else {
|
||||
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
|
||||
*reinterpret_cast<float*>(verts + i * vertexStride +
|
||||
coverageOffset) = innerCoverage;
|
||||
*reinterpret_cast<float*>(verts + i * vertexStride + coverageOffset) = innerCoverage;
|
||||
}
|
||||
}
|
||||
}
|
||||
class AAFillRectBatch final : public GrMeshDrawOp {
|
||||
|
||||
class AAFillRectOp final: public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
AAFillRectBatch(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect,
|
||||
const SkMatrix* localMatrix) : INHERITED(ClassID()) {
|
||||
AAFillRectOp(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect,
|
||||
const SkMatrix* localMatrix)
|
||||
: INHERITED(ClassID()) {
|
||||
if (localMatrix) {
|
||||
void* mem = fRectData.push_back_n(sizeof(RectWithLocalMatrixInfo));
|
||||
new (mem) RectWithLocalMatrixInfo(color, viewMatrix, rect, devRect, *localMatrix);
|
||||
@ -173,13 +172,13 @@ public:
|
||||
void* mem = fRectData.push_back_n(sizeof(RectInfo));
|
||||
new (mem) RectInfo(color, viewMatrix, rect, devRect);
|
||||
}
|
||||
IsZeroArea zeroArea = (!rect.width() || !rect.height()) ? IsZeroArea::kYes
|
||||
: IsZeroArea::kNo;
|
||||
IsZeroArea zeroArea =
|
||||
(!rect.width() || !rect.height()) ? IsZeroArea::kYes : IsZeroArea::kNo;
|
||||
this->setBounds(devRect, HasAABloat::kYes, zeroArea);
|
||||
fRectCnt = 1;
|
||||
}
|
||||
|
||||
const char* name() const override { return "AAFillRectBatch"; }
|
||||
const char* name() const override { return "AAFillRectOp"; }
|
||||
|
||||
SkString dumpInfo() const override {
|
||||
SkString str;
|
||||
@ -187,8 +186,8 @@ public:
|
||||
const RectInfo* info = this->first();
|
||||
for (int i = 0; i < fRectCnt; ++i) {
|
||||
const SkRect& rect = info->rect();
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
||||
i, info->color(), rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i,
|
||||
info->color(), rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
|
||||
info = this->next(info);
|
||||
}
|
||||
str.append(DumpPipelineInfo(*this->pipeline()));
|
||||
@ -199,7 +198,7 @@ public:
|
||||
void computePipelineOptimizations(GrInitInvariantOutput* color,
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one rect
|
||||
// When this is called there is only one rect
|
||||
color->setKnownFourComponents(this->first()->color());
|
||||
coverage->setUnknownSingleComponent();
|
||||
}
|
||||
@ -225,10 +224,10 @@ private:
|
||||
coverageType = Coverage::kAttribute_Type;
|
||||
}
|
||||
Coverage coverage(coverageType);
|
||||
LocalCoords lc = needLocalCoords ? LocalCoords::kHasExplicit_Type
|
||||
: LocalCoords::kUnused_Type;
|
||||
sk_sp<GrGeometryProcessor> gp = GrDefaultGeoProcFactory::Make(color, coverage, lc,
|
||||
SkMatrix::I());
|
||||
LocalCoords lc =
|
||||
needLocalCoords ? LocalCoords::kHasExplicit_Type : LocalCoords::kUnused_Type;
|
||||
sk_sp<GrGeometryProcessor> gp =
|
||||
GrDefaultGeoProcFactory::Make(color, coverage, lc, SkMatrix::I());
|
||||
if (!gp) {
|
||||
SkDebugf("Couldn't create GrGeometryProcessor\n");
|
||||
return;
|
||||
@ -238,9 +237,9 @@ private:
|
||||
|
||||
sk_sp<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider()));
|
||||
InstancedHelper helper;
|
||||
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
||||
indexBuffer.get(), kVertsPerAAFillRect,
|
||||
kIndicesPerAAFillRect, fRectCnt);
|
||||
void* vertices =
|
||||
helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(),
|
||||
kVertsPerAAFillRect, kIndicesPerAAFillRect, fRectCnt);
|
||||
if (!vertices || !indexBuffer) {
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
return;
|
||||
@ -249,8 +248,8 @@ private:
|
||||
const RectInfo* info = this->first();
|
||||
const SkMatrix* localMatrix = nullptr;
|
||||
for (int i = 0; i < fRectCnt; i++) {
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
||||
i * kVertsPerAAFillRect * vertexStride;
|
||||
intptr_t verts =
|
||||
reinterpret_cast<intptr_t>(vertices) + i * kVertsPerAAFillRect * vertexStride;
|
||||
if (needLocalCoords) {
|
||||
if (info->hasLocalMatrix()) {
|
||||
localMatrix = &static_cast<const RectWithLocalMatrixInfo*>(info)->localMatrix();
|
||||
@ -258,23 +257,22 @@ private:
|
||||
localMatrix = &SkMatrix::I();
|
||||
}
|
||||
}
|
||||
generate_aa_fill_rect_geometry(verts, vertexStride, info->color(),
|
||||
info->viewMatrix(), info->rect(),
|
||||
info->devRect(), fOverrides, localMatrix);
|
||||
generate_aa_fill_rect_geometry(verts, vertexStride, info->color(), info->viewMatrix(),
|
||||
info->rect(), info->devRect(), fOverrides, localMatrix);
|
||||
info = this->next(info);
|
||||
}
|
||||
helper.recordDraw(target, gp.get());
|
||||
}
|
||||
|
||||
bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
|
||||
AAFillRectBatch* that = t->cast<AAFillRectBatch>();
|
||||
AAFillRectOp* that = t->cast<AAFillRectOp>();
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
that->bounds(), caps)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// In the event of two batches, one who can tweak, one who cannot, we just fall back to
|
||||
// not tweaking
|
||||
// In the event of two ops, one who can tweak, one who cannot, we just fall back to not
|
||||
// tweaking.
|
||||
if (fOverrides.canTweakAlphaForCoverage() && !that->fOverrides.canTweakAlphaForCoverage()) {
|
||||
fOverrides = that->fOverrides;
|
||||
}
|
||||
@ -289,7 +287,7 @@ private:
|
||||
public:
|
||||
RectInfo(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect& devRect)
|
||||
: RectInfo(color, viewMatrix, rect, devRect, HasLocalMatrix::kNo) {}
|
||||
: RectInfo(color, viewMatrix, rect, devRect, HasLocalMatrix::kNo) {}
|
||||
bool hasLocalMatrix() const { return HasLocalMatrix::kYes == fHasLocalMatrix; }
|
||||
GrColor color() const { return fColor; }
|
||||
const SkMatrix& viewMatrix() const { return fViewMatrix; }
|
||||
@ -297,6 +295,7 @@ private:
|
||||
const SkRect& devRect() const { return fDevRect; }
|
||||
|
||||
void setColor(GrColor color) { fColor = color; }
|
||||
|
||||
protected:
|
||||
enum class HasLocalMatrix : uint32_t { kNo, kYes };
|
||||
|
||||
@ -319,9 +318,10 @@ private:
|
||||
public:
|
||||
RectWithLocalMatrixInfo(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect& devRect, const SkMatrix& localMatrix)
|
||||
: RectInfo(color, viewMatrix, rect, devRect, HasLocalMatrix::kYes)
|
||||
, fLocalMatrix(localMatrix) {}
|
||||
: RectInfo(color, viewMatrix, rect, devRect, HasLocalMatrix::kYes)
|
||||
, fLocalMatrix(localMatrix) {}
|
||||
const SkMatrix& localMatrix() const { return fLocalMatrix; }
|
||||
|
||||
private:
|
||||
SkMatrix fLocalMatrix;
|
||||
};
|
||||
@ -329,9 +329,9 @@ private:
|
||||
RectInfo* first() { return reinterpret_cast<RectInfo*>(fRectData.begin()); }
|
||||
const RectInfo* first() const { return reinterpret_cast<const RectInfo*>(fRectData.begin()); }
|
||||
const RectInfo* next(const RectInfo* prev) const {
|
||||
intptr_t next = reinterpret_cast<intptr_t>(prev) +
|
||||
(prev->hasLocalMatrix() ? sizeof(RectWithLocalMatrixInfo)
|
||||
: sizeof(RectInfo));
|
||||
intptr_t next =
|
||||
reinterpret_cast<intptr_t>(prev) +
|
||||
(prev->hasLocalMatrix() ? sizeof(RectWithLocalMatrixInfo) : sizeof(RectInfo));
|
||||
return reinterpret_cast<const RectInfo*>(next);
|
||||
}
|
||||
|
||||
@ -342,45 +342,44 @@ private:
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
namespace GrAAFillRectBatch {
|
||||
namespace GrAAFillRectOp {
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return new AAFillRectBatch(color, viewMatrix, rect, devRect, nullptr);
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return sk_sp<GrDrawOp>(new AAFillRectOp(color, viewMatrix, rect, devRect, nullptr));
|
||||
}
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return new AAFillRectBatch(color, viewMatrix, rect, devRect, &localMatrix);
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return sk_sp<GrDrawOp>(new AAFillRectOp(color, viewMatrix, rect, devRect, &localMatrix));
|
||||
}
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect) {
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect) {
|
||||
SkRect devRect;
|
||||
viewMatrix.mapRect(&devRect, rect);
|
||||
return Create(color, viewMatrix, localMatrix, rect, devRect);
|
||||
return Make(color, viewMatrix, localMatrix, rect, devRect);
|
||||
}
|
||||
|
||||
GrDrawOp* CreateWithLocalRect(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& localRect) {
|
||||
sk_sp<GrDrawOp> MakeWithLocalRect(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& localRect) {
|
||||
SkRect devRect;
|
||||
viewMatrix.mapRect(&devRect, rect);
|
||||
SkMatrix localMatrix;
|
||||
if (!localMatrix.setRectToRect(rect, localRect, SkMatrix::kFill_ScaleToFit)) {
|
||||
return nullptr;
|
||||
}
|
||||
return Create(color, viewMatrix, localMatrix, rect, devRect);
|
||||
return Make(color, viewMatrix, localMatrix, rect, devRect);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -389,21 +388,21 @@ GrDrawOp* CreateWithLocalRect(GrColor color,
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(AAFillRectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(AAFillRectOp) {
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random);
|
||||
SkRect rect = GrTest::TestRect(random);
|
||||
SkRect devRect = GrTest::TestRect(random);
|
||||
return GrAAFillRectBatch::Create(color, viewMatrix, rect, devRect);
|
||||
return GrAAFillRectOp::Make(color, viewMatrix, rect, devRect).release();
|
||||
}
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(AAFillRectBatchLocalMatrix) {
|
||||
DRAW_BATCH_TEST_DEFINE(AAFillRectOpLocalMatrix) {
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random);
|
||||
SkMatrix localMatrix = GrTest::TestMatrix(random);
|
||||
SkRect rect = GrTest::TestRect(random);
|
||||
SkRect devRect = GrTest::TestRect(random);
|
||||
return GrAAFillRectBatch::Create(color, viewMatrix, localMatrix, rect, devRect);
|
||||
return GrAAFillRectOp::Make(color, viewMatrix, localMatrix, rect, devRect).release();
|
||||
}
|
||||
|
||||
#endif
|
41
src/gpu/batches/GrAAFillRectOp.h
Normal file
41
src/gpu/batches/GrAAFillRectOp.h
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrAAFillRectOp_DEFINED
|
||||
#define GrAAFillRectOp_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
struct SkRect;
|
||||
|
||||
namespace GrAAFillRectOp {
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect);
|
||||
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect);
|
||||
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect);
|
||||
|
||||
sk_sp<GrDrawOp> MakeWithLocalRect(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& localRect);
|
||||
};
|
||||
|
||||
#endif
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrAAStrokeRectBatch_DEFINED
|
||||
#define GrAAStrokeRectBatch_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class GrResourceProvider;
|
||||
class SkMatrix;
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
|
||||
namespace GrAAStrokeRectBatch {
|
||||
|
||||
GrDrawOp* CreateFillBetweenRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devInside);
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrAAStrokeRectBatch.h"
|
||||
#include "GrAAStrokeRectOp.h"
|
||||
|
||||
#include "GrDefaultGeoProcFactory.h"
|
||||
#include "GrOpFlushState.h"
|
||||
@ -15,10 +15,8 @@
|
||||
GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey);
|
||||
GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey);
|
||||
|
||||
static void set_inset_fan(SkPoint* pts, size_t stride,
|
||||
const SkRect& r, SkScalar dx, SkScalar dy) {
|
||||
pts->setRectFan(r.fLeft + dx, r.fTop + dy,
|
||||
r.fRight - dx, r.fBottom - dy, stride);
|
||||
static void set_inset_fan(SkPoint* pts, size_t stride, const SkRect& r, SkScalar dx, SkScalar dy) {
|
||||
pts->setRectFan(r.fLeft + dx, r.fTop + dy, r.fRight - dx, r.fBottom - dy, stride);
|
||||
}
|
||||
|
||||
// We support all hairlines, bevels, and miters, but not round joins. Also, check whether the miter
|
||||
@ -111,19 +109,18 @@ static sk_sp<GrGeometryProcessor> create_stroke_rect_gp(bool tweakAlphaForCovera
|
||||
coverageType = Coverage::kAttribute_Type;
|
||||
}
|
||||
Coverage coverage(coverageType);
|
||||
LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type :
|
||||
LocalCoords::kUnused_Type);
|
||||
LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type
|
||||
: LocalCoords::kUnused_Type);
|
||||
return MakeForDeviceSpace(color, coverage, localCoords, viewMatrix);
|
||||
}
|
||||
|
||||
class AAStrokeRectBatch final : public GrMeshDrawOp {
|
||||
class AAStrokeRectOp final : public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
AAStrokeRectBatch(GrColor color, const SkMatrix& viewMatrix,
|
||||
const SkRect& devOutside, const SkRect& devInside)
|
||||
: INHERITED(ClassID())
|
||||
, fViewMatrix(viewMatrix) {
|
||||
AAStrokeRectOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& devOutside,
|
||||
const SkRect& devInside)
|
||||
: INHERITED(ClassID()), fViewMatrix(viewMatrix) {
|
||||
SkASSERT(!devOutside.isEmpty());
|
||||
SkASSERT(!devInside.isEmpty());
|
||||
|
||||
@ -132,22 +129,22 @@ public:
|
||||
fMiterStroke = true;
|
||||
}
|
||||
|
||||
static GrDrawOp* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
static sk_sp<GrDrawOp> Make(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
bool isMiter;
|
||||
if (!allowed_stroke(stroke, &isMiter)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AAStrokeRectBatch* batch = new AAStrokeRectBatch();
|
||||
batch->fMiterStroke = isMiter;
|
||||
Geometry& geo = batch->fGeoData.push_back();
|
||||
AAStrokeRectOp* op = new AAStrokeRectOp();
|
||||
op->fMiterStroke = isMiter;
|
||||
Geometry& geo = op->fGeoData.push_back();
|
||||
compute_rects(&geo.fDevOutside, &geo.fDevOutsideAssist, &geo.fDevInside, &geo.fDegenerate,
|
||||
viewMatrix, rect, stroke.getWidth(), isMiter);
|
||||
geo.fColor = color;
|
||||
batch->setBounds(geo.fDevOutside, HasAABloat::kYes, IsZeroArea::kNo);
|
||||
batch->fViewMatrix = viewMatrix;
|
||||
return batch;
|
||||
op->setBounds(geo.fDevOutside, HasAABloat::kYes, IsZeroArea::kNo);
|
||||
op->fViewMatrix = viewMatrix;
|
||||
return sk_sp<GrDrawOp>(op);
|
||||
}
|
||||
|
||||
const char* name() const override { return "AAStrokeRect"; }
|
||||
@ -155,17 +152,15 @@ public:
|
||||
SkString dumpInfo() const override {
|
||||
SkString string;
|
||||
for (const auto& geo : fGeoData) {
|
||||
string.appendf("Color: 0x%08x, ORect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"AssistORect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"IRect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], Degen: %d",
|
||||
geo.fColor,
|
||||
geo.fDevOutside.fLeft, geo.fDevOutside.fTop,
|
||||
geo.fDevOutside.fRight, geo.fDevOutside.fBottom,
|
||||
geo.fDevOutsideAssist.fLeft, geo.fDevOutsideAssist.fTop,
|
||||
geo.fDevOutsideAssist.fRight, geo.fDevOutsideAssist.fBottom,
|
||||
geo.fDevInside.fLeft, geo.fDevInside.fTop,
|
||||
geo.fDevInside.fRight, geo.fDevInside.fBottom,
|
||||
geo.fDegenerate);
|
||||
string.appendf(
|
||||
"Color: 0x%08x, ORect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"AssistORect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"IRect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], Degen: %d",
|
||||
geo.fColor, geo.fDevOutside.fLeft, geo.fDevOutside.fTop, geo.fDevOutside.fRight,
|
||||
geo.fDevOutside.fBottom, geo.fDevOutsideAssist.fLeft,
|
||||
geo.fDevOutsideAssist.fTop, geo.fDevOutsideAssist.fRight,
|
||||
geo.fDevOutsideAssist.fBottom, geo.fDevInside.fLeft, geo.fDevInside.fTop,
|
||||
geo.fDevInside.fRight, geo.fDevInside.fBottom, geo.fDegenerate);
|
||||
}
|
||||
string.append(DumpPipelineInfo(*this->pipeline()));
|
||||
string.append(INHERITED::dumpInfo());
|
||||
@ -175,13 +170,13 @@ public:
|
||||
void computePipelineOptimizations(GrInitInvariantOutput* color,
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one geometry bundle
|
||||
// When this is called there is only one rect.
|
||||
color->setKnownFourComponents(fGeoData[0].fColor);
|
||||
coverage->setUnknownSingleComponent();
|
||||
}
|
||||
|
||||
private:
|
||||
AAStrokeRectBatch() : INHERITED(ClassID()) {}
|
||||
AAStrokeRectOp() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target*) const override;
|
||||
void initBatchTracker(const GrXPOverridesForBatch&) override;
|
||||
@ -244,7 +239,7 @@ private:
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
void AAStrokeRectBatch::initBatchTracker(const GrXPOverridesForBatch& overrides) {
|
||||
void AAStrokeRectOp::initBatchTracker(const GrXPOverridesForBatch& overrides) {
|
||||
// Handle any color overrides
|
||||
if (!overrides.readsColor()) {
|
||||
fGeoData[0].fColor = GrColor_ILLEGAL;
|
||||
@ -259,7 +254,7 @@ void AAStrokeRectBatch::initBatchTracker(const GrXPOverridesForBatch& overrides)
|
||||
fBatch.fCanTweakAlphaForCoverage = overrides.canTweakAlphaForCoverage();
|
||||
}
|
||||
|
||||
void AAStrokeRectBatch::onPrepareDraws(Target* target) const {
|
||||
void AAStrokeRectOp::onPrepareDraws(Target* target) const {
|
||||
bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage();
|
||||
|
||||
sk_sp<GrGeometryProcessor> gp(create_stroke_rect_gp(canTweakAlphaForCoverage,
|
||||
@ -273,9 +268,9 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) const {
|
||||
|
||||
size_t vertexStride = gp->getVertexStride();
|
||||
|
||||
SkASSERT(canTweakAlphaForCoverage ?
|
||||
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) :
|
||||
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
||||
SkASSERT(canTweakAlphaForCoverage
|
||||
? vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)
|
||||
: vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
||||
int innerVertexNum = 4;
|
||||
int outerVertexNum = this->miterStroke() ? 4 : 8;
|
||||
int verticesPerInstance = (outerVertexNum + innerVertexNum) * 2;
|
||||
@ -283,15 +278,15 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) const {
|
||||
int instanceCount = fGeoData.count();
|
||||
|
||||
const sk_sp<const GrBuffer> indexBuffer(
|
||||
GetIndexBuffer(target->resourceProvider(), this->miterStroke()));
|
||||
GetIndexBuffer(target->resourceProvider(), this->miterStroke()));
|
||||
InstancedHelper helper;
|
||||
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
||||
indexBuffer.get(), verticesPerInstance, indicesPerInstance,
|
||||
instanceCount);
|
||||
void* vertices =
|
||||
helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(),
|
||||
verticesPerInstance, indicesPerInstance, instanceCount);
|
||||
if (!vertices || !indexBuffer) {
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
return;
|
||||
}
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
const Geometry& args = fGeoData[i];
|
||||
@ -311,10 +306,10 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) const {
|
||||
helper.recordDraw(target, gp.get());
|
||||
}
|
||||
|
||||
const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourceProvider,
|
||||
bool miterStroke) {
|
||||
|
||||
const GrBuffer* AAStrokeRectOp::GetIndexBuffer(GrResourceProvider* resourceProvider,
|
||||
bool miterStroke) {
|
||||
if (miterStroke) {
|
||||
// clang-format off
|
||||
static const uint16_t gMiterIndices[] = {
|
||||
0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0,
|
||||
1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0,
|
||||
@ -331,11 +326,12 @@ const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourcePr
|
||||
2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8,
|
||||
3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8,
|
||||
};
|
||||
// clang-format on
|
||||
GR_STATIC_ASSERT(SK_ARRAY_COUNT(gMiterIndices) == kMiterIndexCnt);
|
||||
GR_DEFINE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(gMiterIndices,
|
||||
kMiterIndexCnt, kNumMiterRectsInIndexBuffer, kMiterVertexCnt,
|
||||
gMiterIndexBufferKey);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(
|
||||
gMiterIndices, kMiterIndexCnt, kNumMiterRectsInIndexBuffer, kMiterVertexCnt,
|
||||
gMiterIndexBufferKey);
|
||||
} else {
|
||||
/**
|
||||
* As in miter-stroke, index = a + b, and a is the current index, b is the shift
|
||||
@ -366,6 +362,7 @@ const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourcePr
|
||||
* **********************************
|
||||
* 5 6
|
||||
*/
|
||||
// clang-format off
|
||||
static const uint16_t gBevelIndices[] = {
|
||||
// Draw outer AA, from outer AA line to outer edge, shift is 0.
|
||||
0 + 0, 1 + 0, 9 + 0, 9 + 0, 8 + 0, 0 + 0,
|
||||
@ -393,17 +390,18 @@ const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourcePr
|
||||
2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16,
|
||||
3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
|
||||
};
|
||||
// clang-format on
|
||||
GR_STATIC_ASSERT(SK_ARRAY_COUNT(gBevelIndices) == kBevelIndexCnt);
|
||||
|
||||
GR_DEFINE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(gBevelIndices,
|
||||
kBevelIndexCnt, kNumBevelRectsInIndexBuffer, kBevelVertexCnt,
|
||||
gBevelIndexBufferKey);
|
||||
return resourceProvider->findOrCreateInstancedIndexBuffer(
|
||||
gBevelIndices, kBevelIndexCnt, kNumBevelRectsInIndexBuffer, kBevelVertexCnt,
|
||||
gBevelIndexBufferKey);
|
||||
}
|
||||
}
|
||||
|
||||
bool AAStrokeRectBatch::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
|
||||
AAStrokeRectBatch* that = t->cast<AAStrokeRectBatch>();
|
||||
bool AAStrokeRectOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
|
||||
AAStrokeRectOp* that = t->cast<AAStrokeRectOp>();
|
||||
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
that->bounds(), caps)) {
|
||||
@ -422,8 +420,8 @@ bool AAStrokeRectBatch::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// In the event of two batches, one who can tweak, one who cannot, we just fall back to
|
||||
// not tweaking
|
||||
// In the event of two ops, one who can tweak, one who cannot, we just fall back to not
|
||||
// tweaking.
|
||||
if (this->canTweakAlphaForCoverage() != that->canTweakAlphaForCoverage()) {
|
||||
fBatch.fCanTweakAlphaForCoverage = false;
|
||||
}
|
||||
@ -445,18 +443,18 @@ static void setup_scale(int* scale, SkScalar inset) {
|
||||
}
|
||||
}
|
||||
|
||||
void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
size_t offset,
|
||||
size_t vertexStride,
|
||||
int outerVertexNum,
|
||||
int innerVertexNum,
|
||||
GrColor color,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devOutsideAssist,
|
||||
const SkRect& devInside,
|
||||
bool miterStroke,
|
||||
bool degenerate,
|
||||
bool tweakAlphaForCoverage) const {
|
||||
void AAStrokeRectOp::generateAAStrokeRectGeometry(void* vertices,
|
||||
size_t offset,
|
||||
size_t vertexStride,
|
||||
int outerVertexNum,
|
||||
int innerVertexNum,
|
||||
GrColor color,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devOutsideAssist,
|
||||
const SkRect& devInside,
|
||||
bool miterStroke,
|
||||
bool degenerate,
|
||||
bool tweakAlphaForCoverage) const {
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + offset;
|
||||
|
||||
// We create vertices for four nested rectangles. There are two ramps from 0 to full
|
||||
@ -465,9 +463,8 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts);
|
||||
SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vertexStride);
|
||||
SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * vertexStride);
|
||||
SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts +
|
||||
(2 * outerVertexNum + innerVertexNum) *
|
||||
vertexStride);
|
||||
SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(
|
||||
verts + (2 * outerVertexNum + innerVertexNum) * vertexStride);
|
||||
|
||||
#ifndef SK_IGNORE_THIN_STROKED_RECT_FIX
|
||||
// TODO: this only really works if the X & Y margins are the same all around
|
||||
@ -480,15 +477,15 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
if (miterStroke) {
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fBottom);
|
||||
} else {
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom -
|
||||
devInside.fBottom);
|
||||
inset = SK_ScalarHalf *
|
||||
SkMinScalar(inset, devOutsideAssist.fBottom - devInside.fBottom);
|
||||
}
|
||||
SkASSERT(inset >= 0);
|
||||
} else {
|
||||
// TODO use real devRect here
|
||||
inset = SkMinScalar(devOutside.width(), SK_Scalar1);
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, SkTMax(devOutside.height(),
|
||||
devOutsideAssist.height()));
|
||||
inset = SK_ScalarHalf *
|
||||
SkMinScalar(inset, SkTMax(devOutside.height(), devOutsideAssist.height()));
|
||||
}
|
||||
#else
|
||||
SkScalar inset;
|
||||
@ -497,8 +494,8 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
} else {
|
||||
// TODO use real devRect here
|
||||
inset = SkMinScalar(devOutside.width(), SK_Scalar1);
|
||||
inset = SK_ScalarHalf * SkMinScalar(inset, SkTMax(devOutside.height(),
|
||||
devOutsideAssist.height()));
|
||||
inset = SK_ScalarHalf *
|
||||
SkMinScalar(inset, SkTMax(devOutside.height(), devOutsideAssist.height()));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -506,45 +503,42 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
// outermost
|
||||
set_inset_fan(fan0Pos, vertexStride, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
|
||||
// inner two
|
||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||
if (!degenerate) {
|
||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||
// innermost
|
||||
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
||||
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);
|
||||
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 {
|
||||
SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vertexStride);
|
||||
SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts +
|
||||
(outerVertexNum + 4) *
|
||||
vertexStride);
|
||||
SkPoint* fan1AssistPos =
|
||||
reinterpret_cast<SkPoint*>(verts + (outerVertexNum + 4) * vertexStride);
|
||||
// outermost
|
||||
set_inset_fan(fan0Pos, vertexStride, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
|
||||
set_inset_fan(fan0AssistPos, vertexStride, devOutsideAssist, -SK_ScalarHalf,
|
||||
-SK_ScalarHalf);
|
||||
// outer one of the inner two
|
||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||
set_inset_fan(fan1AssistPos, vertexStride, devOutsideAssist, inset, inset);
|
||||
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
|
||||
set_inset_fan(fan1AssistPos, vertexStride, devOutsideAssist, inset, inset);
|
||||
if (!degenerate) {
|
||||
// inner one of the inner two
|
||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||
set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
|
||||
// innermost
|
||||
set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -595,22 +589,21 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
|
||||
}
|
||||
}
|
||||
|
||||
namespace GrAAStrokeRectBatch {
|
||||
namespace GrAAStrokeRectOp {
|
||||
|
||||
GrDrawOp* CreateFillBetweenRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devInside) {
|
||||
return new AAStrokeRectBatch(color, viewMatrix, devOutside, devInside);
|
||||
sk_sp<GrDrawOp> MakeFillBetweenRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devInside) {
|
||||
return sk_sp<GrDrawOp>(new AAStrokeRectOp(color, viewMatrix, devOutside, devInside));
|
||||
}
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
return AAStrokeRectBatch::Create(color, viewMatrix, rect, stroke);
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
return AAStrokeRectOp::Make(color, viewMatrix, rect, stroke);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -619,12 +612,12 @@ GrDrawOp* Create(GrColor color,
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(AAStrokeRectOp) {
|
||||
bool miterStroke = random->nextBool();
|
||||
|
||||
// Create either a empty rect or a non-empty rect.
|
||||
SkRect rect = random->nextBool() ? SkRect::MakeXYWH(10, 10, 50, 40) :
|
||||
SkRect::MakeXYWH(6, 7, 0, 0);
|
||||
SkRect rect =
|
||||
random->nextBool() ? SkRect::MakeXYWH(10, 10, 50, 40) : SkRect::MakeXYWH(6, 7, 0, 0);
|
||||
SkScalar minDim = SkMinScalar(rect.width(), rect.height());
|
||||
SkScalar strokeWidth = random->nextUScalar1() * minDim;
|
||||
|
||||
@ -633,10 +626,9 @@ DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
||||
SkStrokeRec rec(SkStrokeRec::kFill_InitStyle);
|
||||
rec.setStrokeStyle(strokeWidth);
|
||||
rec.setStrokeParams(SkPaint::kButt_Cap,
|
||||
miterStroke ? SkPaint::kMiter_Join : SkPaint::kBevel_Join,
|
||||
1.f);
|
||||
miterStroke ? SkPaint::kMiter_Join : SkPaint::kBevel_Join, 1.f);
|
||||
SkMatrix matrix = GrTest::TestMatrixRectStaysRect(random);
|
||||
return GrAAStrokeRectBatch::Create(color, matrix, rect, rec);
|
||||
return GrAAStrokeRectOp::Make(color, matrix, rect, rec).release();
|
||||
}
|
||||
|
||||
#endif
|
32
src/gpu/batches/GrAAStrokeRectOp.h
Normal file
32
src/gpu/batches/GrAAStrokeRectOp.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrAAStrokeRectOp_DEFINED
|
||||
#define GrAAStrokeRectOp_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
|
||||
namespace GrAAStrokeRectOp {
|
||||
|
||||
sk_sp<GrDrawOp> MakeFillBetweenRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& devOutside,
|
||||
const SkRect& devInside);
|
||||
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke);
|
||||
}
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrAnalyticRectBatch.h"
|
||||
#include "GrAnalyticRectOp.h"
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
#include "GrGeometryProcessor.h"
|
||||
@ -27,14 +27,13 @@
|
||||
namespace {
|
||||
|
||||
struct RectVertex {
|
||||
SkPoint fPos;
|
||||
GrColor fColor;
|
||||
SkPoint fCenter;
|
||||
SkPoint fPos;
|
||||
GrColor fColor;
|
||||
SkPoint fCenter;
|
||||
SkVector fDownDir;
|
||||
SkScalar fHalfWidth;
|
||||
SkScalar fHalfHeight;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -55,18 +54,18 @@ class RectGeometryProcessor : public GrGeometryProcessor {
|
||||
public:
|
||||
RectGeometryProcessor(const SkMatrix& localMatrix) : fLocalMatrix(localMatrix) {
|
||||
this->initClassID<RectGeometryProcessor>();
|
||||
fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
|
||||
kHigh_GrSLPrecision);
|
||||
fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType);
|
||||
fInRectEdge = &this->addVertexAttrib("inRectEdge", kVec4f_GrVertexAttribType);
|
||||
fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
|
||||
kHigh_GrSLPrecision);
|
||||
fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType);
|
||||
fInRectEdge = &this->addVertexAttrib("inRectEdge", kVec4f_GrVertexAttribType);
|
||||
fInWidthHeight = &this->addVertexAttrib("inWidthHeight", kVec2f_GrVertexAttribType);
|
||||
}
|
||||
|
||||
bool implementsDistanceVector() const override { return true; }
|
||||
|
||||
const Attribute* inPosition() const { return fInPosition; }
|
||||
const Attribute* inColor() const { return fInColor; }
|
||||
const Attribute* inRectEdge() const { return fInRectEdge; }
|
||||
const Attribute* inPosition() const { return fInPosition; }
|
||||
const Attribute* inColor() const { return fInColor; }
|
||||
const Attribute* inRectEdge() const { return fInRectEdge; }
|
||||
const Attribute* inWidthHeight() const { return fInWidthHeight; }
|
||||
|
||||
const SkMatrix& localMatrix() const { return fLocalMatrix; }
|
||||
@ -79,7 +78,7 @@ public:
|
||||
public:
|
||||
GLSLProcessor() {}
|
||||
|
||||
void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
|
||||
void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
|
||||
const RectGeometryProcessor& rgp = args.fGP.cast<RectGeometryProcessor>();
|
||||
GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
|
||||
GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
|
||||
@ -102,8 +101,8 @@ public:
|
||||
// setup the varying for the width/2+.5 and height/2+.5
|
||||
GrGLSLVertToFrag widthHeightVary(kVec2f_GrSLType);
|
||||
varyingHandler->addVarying("WidthHeight", &widthHeightVary);
|
||||
vertBuilder->codeAppendf("%s = %s;",
|
||||
widthHeightVary.vsOut(), rgp.inWidthHeight()->fName);
|
||||
vertBuilder->codeAppendf("%s = %s;", widthHeightVary.vsOut(),
|
||||
rgp.inWidthHeight()->fName);
|
||||
|
||||
GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
|
||||
|
||||
@ -138,8 +137,8 @@ public:
|
||||
fragBuilder->codeAppend("float scaleW = min(1.0, 2.0*insetW/spanW);");
|
||||
fragBuilder->codeAppend("float scaleH = min(1.0, 2.0*insetH/spanH);");
|
||||
// Compute the coverage for the rect's width
|
||||
fragBuilder->codeAppendf("vec2 offset = %s.xy - %s.xy;",
|
||||
positionVary.fsIn(), rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppendf("vec2 offset = %s.xy - %s.xy;", positionVary.fsIn(),
|
||||
rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppendf("float perpDot = abs(offset.x * %s.w - offset.y * %s.z);",
|
||||
rectEdgeVary.fsIn(), rectEdgeVary.fsIn());
|
||||
|
||||
@ -152,8 +151,7 @@ public:
|
||||
"float coverage = scaleW*clamp((%s.x-perpDot)/spanW, 0.0, 1.0);",
|
||||
widthHeightVary.fsIn());
|
||||
// Compute the coverage for the rect's height and merge with the width
|
||||
fragBuilder->codeAppendf("perpDot = abs(dot(offset, %s.zw));",
|
||||
rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppendf("perpDot = abs(dot(offset, %s.zw));", rectEdgeVary.fsIn());
|
||||
|
||||
if (args.fDistanceVectorName) {
|
||||
fragBuilder->codeAppendf("float heightDistance = %s.y - perpDot;",
|
||||
@ -167,23 +165,22 @@ public:
|
||||
fragBuilder->codeAppendf("%s = vec4(coverage);", args.fOutputCoverage);
|
||||
|
||||
if (args.fDistanceVectorName) {
|
||||
fragBuilder->codeAppend( "// Calculating distance vector\n");
|
||||
fragBuilder->codeAppend( "vec2 dvAxis;");
|
||||
fragBuilder->codeAppend( "float dvLength;");
|
||||
fragBuilder->codeAppend("// Calculating distance vector\n");
|
||||
fragBuilder->codeAppend("vec2 dvAxis;");
|
||||
fragBuilder->codeAppend("float dvLength;");
|
||||
|
||||
fragBuilder->codeAppend( "if (heightDistance < widthDistance) {");
|
||||
fragBuilder->codeAppend("if (heightDistance < widthDistance) {");
|
||||
fragBuilder->codeAppendf(" dvAxis = %s.zw;", rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppend( " dvLength = heightDistance;");
|
||||
fragBuilder->codeAppend( "} else {");
|
||||
fragBuilder->codeAppendf(" dvAxis = vec2(-%s.w, %s.z);",
|
||||
rectEdgeVary.fsIn(), rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppend( " dvLength = widthDistance;");
|
||||
fragBuilder->codeAppend( "}");
|
||||
fragBuilder->codeAppend(" dvLength = heightDistance;");
|
||||
fragBuilder->codeAppend("} else {");
|
||||
fragBuilder->codeAppendf(" dvAxis = vec2(-%s.w, %s.z);", rectEdgeVary.fsIn(),
|
||||
rectEdgeVary.fsIn());
|
||||
fragBuilder->codeAppend(" dvLength = widthDistance;");
|
||||
fragBuilder->codeAppend("}");
|
||||
|
||||
fragBuilder->codeAppend( "float dvSign = sign(dot(offset, dvAxis));");
|
||||
fragBuilder->codeAppend("float dvSign = sign(dot(offset, dvAxis));");
|
||||
fragBuilder->codeAppendf("%s = vec4(dvSign * dvAxis, dvLength, 0.0);",
|
||||
args.fDistanceVectorName);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -196,7 +193,7 @@ public:
|
||||
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
|
||||
FPCoordTransformIter&& transformIter) override {
|
||||
const RectGeometryProcessor& rgp = primProc.cast<RectGeometryProcessor>();
|
||||
this->setTransformDataHelper(rgp.fLocalMatrix, pdman,&transformIter);
|
||||
this->setTransformDataHelper(rgp.fLocalMatrix, pdman, &transformIter);
|
||||
}
|
||||
|
||||
private:
|
||||
@ -212,7 +209,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
SkMatrix fLocalMatrix;
|
||||
SkMatrix fLocalMatrix;
|
||||
|
||||
const Attribute* fInPosition;
|
||||
const Attribute* fInColor;
|
||||
@ -227,20 +224,18 @@ private:
|
||||
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(RectGeometryProcessor);
|
||||
|
||||
sk_sp<GrGeometryProcessor> RectGeometryProcessor::TestCreate(GrProcessorTestData* d) {
|
||||
return sk_sp<GrGeometryProcessor>(
|
||||
new RectGeometryProcessor(GrTest::TestMatrix(d->fRandom)));
|
||||
return sk_sp<GrGeometryProcessor>(new RectGeometryProcessor(GrTest::TestMatrix(d->fRandom)));
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class AnalyticRectBatch final : public GrMeshDrawOp {
|
||||
class AnalyticRectOp final : public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
AnalyticRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect& croppedRect, const SkRect& bounds)
|
||||
: INHERITED(ClassID())
|
||||
, fViewMatrixIfUsingLocalCoords(viewMatrix) {
|
||||
AnalyticRectOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect& croppedRect, const SkRect& bounds)
|
||||
: INHERITED(ClassID()), fViewMatrixIfUsingLocalCoords(viewMatrix) {
|
||||
SkPoint center = SkPoint::Make(rect.centerX(), rect.centerY());
|
||||
viewMatrix.mapPoints(¢er, 1);
|
||||
SkScalar halfWidth = viewMatrix.mapRadius(SkScalarHalf(rect.width()));
|
||||
@ -251,8 +246,8 @@ public:
|
||||
SkRect deviceSpaceCroppedRect = croppedRect;
|
||||
viewMatrix.mapRect(&deviceSpaceCroppedRect);
|
||||
|
||||
fGeoData.emplace_back(Geometry {color, center, downDir, halfWidth, halfHeight,
|
||||
deviceSpaceCroppedRect});
|
||||
fGeoData.emplace_back(
|
||||
Geometry{color, center, downDir, halfWidth, halfHeight, deviceSpaceCroppedRect});
|
||||
|
||||
this->setBounds(bounds, HasAABloat::kYes, IsZeroArea::kNo);
|
||||
}
|
||||
@ -263,11 +258,9 @@ public:
|
||||
SkString string;
|
||||
for (int i = 0; i < fGeoData.count(); ++i) {
|
||||
string.appendf("Color: 0x%08x Rect [C:(%.2f, %.2f) D:<%.2f,%.3f> W/2:%.2f H/2:%.2f]\n",
|
||||
fGeoData[i].fColor,
|
||||
fGeoData[i].fCenter.x(), fGeoData[i].fCenter.y(),
|
||||
fGeoData[i].fColor, fGeoData[i].fCenter.x(), fGeoData[i].fCenter.y(),
|
||||
fGeoData[i].fDownDir.x(), fGeoData[i].fDownDir.y(),
|
||||
fGeoData[i].fHalfWidth,
|
||||
fGeoData[i].fHalfHeight);
|
||||
fGeoData[i].fHalfWidth, fGeoData[i].fHalfHeight);
|
||||
}
|
||||
string.append(DumpPipelineInfo(*this->pipeline()));
|
||||
string.append(INHERITED::dumpInfo());
|
||||
@ -277,7 +270,7 @@ public:
|
||||
void computePipelineOptimizations(GrInitInvariantOutput* color,
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one geometry bundle
|
||||
// When this is called there is only one rect.
|
||||
color->setKnownFourComponents(fGeoData[0].fColor);
|
||||
coverage->setUnknownSingleComponent();
|
||||
}
|
||||
@ -304,8 +297,8 @@ private:
|
||||
size_t vertexStride = gp->getVertexStride();
|
||||
SkASSERT(vertexStride == sizeof(RectVertex));
|
||||
QuadHelper helper;
|
||||
RectVertex* verts = reinterpret_cast<RectVertex*>(helper.init(target, vertexStride,
|
||||
instanceCount));
|
||||
RectVertex* verts =
|
||||
reinterpret_cast<RectVertex*>(helper.init(target, vertexStride, instanceCount));
|
||||
if (!verts) {
|
||||
return;
|
||||
}
|
||||
@ -313,12 +306,12 @@ private:
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
const Geometry& geom = fGeoData[i];
|
||||
|
||||
GrColor color = geom.fColor;
|
||||
SkPoint center = geom.fCenter;
|
||||
SkVector downDir = geom.fDownDir;
|
||||
SkScalar halfWidth = geom.fHalfWidth;
|
||||
SkScalar halfHeight = geom.fHalfHeight;
|
||||
SkRect croppedRect = geom.fCroppedRect;
|
||||
GrColor color = geom.fColor;
|
||||
SkPoint center = geom.fCenter;
|
||||
SkVector downDir = geom.fDownDir;
|
||||
SkScalar halfWidth = geom.fHalfWidth;
|
||||
SkScalar halfHeight = geom.fHalfHeight;
|
||||
SkRect croppedRect = geom.fCroppedRect;
|
||||
|
||||
SkVector rightDir;
|
||||
downDir.rotateCCW(&rightDir);
|
||||
@ -357,7 +350,7 @@ private:
|
||||
}
|
||||
|
||||
bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
|
||||
AnalyticRectBatch* that = t->cast<AnalyticRectBatch>();
|
||||
AnalyticRectOp* that = t->cast<AnalyticRectOp>();
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
that->bounds(), caps)) {
|
||||
return false;
|
||||
@ -373,37 +366,37 @@ private:
|
||||
}
|
||||
|
||||
struct Geometry {
|
||||
GrColor fColor;
|
||||
SkPoint fCenter;
|
||||
GrColor fColor;
|
||||
SkPoint fCenter;
|
||||
SkVector fDownDir;
|
||||
SkScalar fHalfWidth;
|
||||
SkScalar fHalfHeight;
|
||||
SkRect fCroppedRect;
|
||||
SkRect fCroppedRect;
|
||||
};
|
||||
|
||||
SkMatrix fViewMatrixIfUsingLocalCoords;
|
||||
SkMatrix fViewMatrixIfUsingLocalCoords;
|
||||
SkSTArray<1, Geometry, true> fGeoData;
|
||||
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
GrDrawOp* GrAnalyticRectBatch::CreateAnalyticRectBatch(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& bounds) {
|
||||
return new AnalyticRectBatch(color, viewMatrix, rect, croppedRect, bounds);
|
||||
sk_sp<GrDrawOp> GrAnalyticRectOp::Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& bounds) {
|
||||
return sk_sp<GrDrawOp>(new AnalyticRectOp(color, viewMatrix, rect, croppedRect, bounds));
|
||||
}
|
||||
|
||||
#ifdef GR_TEST_UTILS
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(AnalyticRectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(AnalyticRectOp) {
|
||||
SkMatrix viewMatrix = GrTest::TestMatrix(random);
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkRect rect = GrTest::TestSquare(random);
|
||||
SkRect croppedRect = GrTest::TestSquare(random);
|
||||
SkRect bounds = GrTest::TestSquare(random);
|
||||
return new AnalyticRectBatch(color, viewMatrix, rect, croppedRect, bounds);
|
||||
return new AnalyticRectOp(color, viewMatrix, rect, croppedRect, bounds);
|
||||
}
|
||||
|
||||
#endif
|
@ -5,10 +5,11 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrAnalyticRectBatch_DEFINED
|
||||
#define GrAnalyticRectBatch_DEFINED
|
||||
#ifndef GrAnalyticRectOp_DEFINED
|
||||
#define GrAnalyticRectOp_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
@ -24,13 +25,13 @@ struct SkRect;
|
||||
* @param croppedRect the shape in device space, clipped to the device's bounds
|
||||
* @param bounds the axis aligned bounds of the shape in device space
|
||||
*/
|
||||
class GrAnalyticRectBatch {
|
||||
class GrAnalyticRectOp {
|
||||
public:
|
||||
static GrDrawOp* CreateAnalyticRectBatch(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& bounds);
|
||||
static sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& bounds);
|
||||
};
|
||||
|
||||
#endif // GrAnalyticRectBatch_DEFINED
|
||||
#endif // GrAnalyticRectOp_DEFINED
|
@ -22,7 +22,7 @@
|
||||
#include "SkTraceEvent.h"
|
||||
|
||||
#include "batches/GrMeshDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
|
||||
GrDefaultPathRenderer::GrDefaultPathRenderer(bool separateStencilSupport,
|
||||
bool stencilWrapOpsSupport)
|
||||
@ -564,8 +564,8 @@ bool GrDefaultPathRenderer::internalDrawPath(GrRenderTargetContext* renderTarget
|
||||
}
|
||||
const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? SkMatrix::I() :
|
||||
viewMatrix;
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewM, bounds,
|
||||
nullptr, &localMatrix));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(paint.getColor(), viewM, bounds,
|
||||
nullptr, &localMatrix));
|
||||
|
||||
SkASSERT(GrDrawFace::kBoth == drawFace[p]);
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "SkGeometry.h"
|
||||
#include "SkTraceEvent.h"
|
||||
#include "batches/GrMeshDrawOp.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
#include "gl/GrGLVaryingHandler.h"
|
||||
#include "glsl/GrGLSLFragmentShaderBuilder.h"
|
||||
#include "glsl/GrGLSLGeometryProcessor.h"
|
||||
@ -659,8 +659,8 @@ bool GrMSAAPathRenderer::internalDrawPath(GrRenderTargetContext* renderTargetCon
|
||||
}
|
||||
const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? SkMatrix::I() :
|
||||
viewMatrix;
|
||||
sk_sp<GrDrawOp> op(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewM, bounds,
|
||||
nullptr, &localMatrix));
|
||||
sk_sp<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(paint.getColor(), viewM, bounds,
|
||||
nullptr, &localMatrix));
|
||||
|
||||
GrPipelineBuilder pipelineBuilder(paint, aaType);
|
||||
pipelineBuilder.setUserStencil(passes[p]);
|
||||
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrNonAAFillRectBatch_DEFINED
|
||||
#define GrNonAAFillRectBatch_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
struct SkRect;
|
||||
|
||||
namespace GrNonAAFillRectBatch {
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
|
||||
GrDrawOp* CreateWithPerspective(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrNonAAFillRectBatch.h"
|
||||
#include "GrNonAAFillRectOp.h"
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "GrDefaultGeoProcFactory.h"
|
||||
@ -45,8 +45,7 @@ static void tesselate(intptr_t vertices,
|
||||
const GrQuad* localQuad) {
|
||||
SkPoint* positions = reinterpret_cast<SkPoint*>(vertices);
|
||||
|
||||
positions->setRectFan(rect.fLeft, rect.fTop,
|
||||
rect.fRight, rect.fBottom, vertexStride);
|
||||
positions->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride);
|
||||
|
||||
if (viewMatrix) {
|
||||
SkMatrixPriv::MapPointsWithStride(*viewMatrix, positions, vertexStride, kVertsPerInstance);
|
||||
@ -57,8 +56,8 @@ static void tesselate(intptr_t vertices,
|
||||
if (localQuad) {
|
||||
static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor);
|
||||
for (int i = 0; i < kVertsPerInstance; i++) {
|
||||
SkPoint* coords = reinterpret_cast<SkPoint*>(vertices + kLocalOffset +
|
||||
i * vertexStride);
|
||||
SkPoint* coords =
|
||||
reinterpret_cast<SkPoint*>(vertices + kLocalOffset + i * vertexStride);
|
||||
*coords = localQuad->point(i);
|
||||
}
|
||||
}
|
||||
@ -67,19 +66,18 @@ static void tesselate(intptr_t vertices,
|
||||
GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset);
|
||||
for (int j = 0; j < 4; ++j) {
|
||||
*vertColor = color;
|
||||
vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride);
|
||||
vertColor = (GrColor*)((intptr_t)vertColor + vertexStride);
|
||||
}
|
||||
}
|
||||
|
||||
class NonAAFillRectBatch final : public GrMeshDrawOp {
|
||||
class NonAAFillRectOp final : public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
NonAAFillRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
NonAAFillRectOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
: INHERITED(ClassID()) {
|
||||
SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix ||
|
||||
!localMatrix->hasPerspective()));
|
||||
SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective()));
|
||||
RectInfo& info = fRects.push_back();
|
||||
info.fColor = color;
|
||||
info.fViewMatrix = viewMatrix;
|
||||
@ -96,16 +94,16 @@ public:
|
||||
this->setTransformedBounds(fRects[0].fRect, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
|
||||
}
|
||||
|
||||
const char* name() const override { return "NonAAFillRectBatch"; }
|
||||
const char* name() const override { return "NonAAFillRectOp"; }
|
||||
|
||||
SkString dumpInfo() const override {
|
||||
SkString str;
|
||||
str.appendf("# batched: %d\n", fRects.count());
|
||||
for (int i = 0; i < fRects.count(); ++i) {
|
||||
const RectInfo& info = fRects[i];
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
||||
i, info.fColor,
|
||||
info.fRect.fLeft, info.fRect.fTop, info.fRect.fRight, info.fRect.fBottom);
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i,
|
||||
info.fColor, info.fRect.fLeft, info.fRect.fTop, info.fRect.fRight,
|
||||
info.fRect.fBottom);
|
||||
}
|
||||
str.append(DumpPipelineInfo(*this->pipeline()));
|
||||
str.append(INHERITED::dumpInfo());
|
||||
@ -115,7 +113,7 @@ public:
|
||||
void computePipelineOptimizations(GrInitInvariantOutput* color,
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one geometry bundle
|
||||
// When this is called there is only one rect.
|
||||
color->setKnownFourComponents(fRects[0].fColor);
|
||||
coverage->setKnownSingleComponent(0xff);
|
||||
}
|
||||
@ -126,7 +124,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
NonAAFillRectBatch() : INHERITED(ClassID()) {}
|
||||
NonAAFillRectOp() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target* target) const override {
|
||||
sk_sp<GrGeometryProcessor> gp = make_gp(fOverrides.readsCoverage());
|
||||
@ -142,17 +140,17 @@ private:
|
||||
|
||||
sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
||||
InstancedHelper helper;
|
||||
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
||||
indexBuffer.get(), kVertsPerInstance,
|
||||
kIndicesPerInstance, instanceCount);
|
||||
void* vertices =
|
||||
helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(),
|
||||
kVertsPerInstance, kIndicesPerInstance, instanceCount);
|
||||
if (!vertices || !indexBuffer) {
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
||||
i * kVertsPerInstance * vertexStride;
|
||||
intptr_t verts =
|
||||
reinterpret_cast<intptr_t>(vertices) + i * kVertsPerInstance * vertexStride;
|
||||
tesselate(verts, vertexStride, fRects[i].fColor, &fRects[i].fViewMatrix,
|
||||
fRects[i].fRect, &fRects[i].fLocalQuad);
|
||||
}
|
||||
@ -160,14 +158,14 @@ private:
|
||||
}
|
||||
|
||||
bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
|
||||
NonAAFillRectBatch* that = t->cast<NonAAFillRectBatch>();
|
||||
NonAAFillRectOp* that = t->cast<NonAAFillRectOp>();
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
that->bounds(), caps)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// In the event of two batches, one who can tweak, one who cannot, we just fall back to
|
||||
// not tweaking
|
||||
// In the event of two ops, one who can tweak, one who cannot, we just fall back to not
|
||||
// tweaking.
|
||||
if (fOverrides.canTweakAlphaForCoverage() && !that->fOverrides.canTweakAlphaForCoverage()) {
|
||||
fOverrides = that->fOverrides;
|
||||
}
|
||||
@ -190,16 +188,15 @@ private:
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
namespace GrNonAAFillRectBatch {
|
||||
namespace GrNonAAFillRectOp {
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
return new NonAAFillRectBatch(color, viewMatrix, rect, localRect, localMatrix);
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
return sk_sp<GrDrawOp>(new NonAAFillRectOp(color, viewMatrix, rect, localRect, localMatrix));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -208,7 +205,7 @@ GrDrawOp* Create(GrColor color,
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(RectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(NonAAFillRectOp) {
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkRect rect = GrTest::TestRect(random);
|
||||
SkRect localRect = GrTest::TestRect(random);
|
||||
@ -217,9 +214,12 @@ DRAW_BATCH_TEST_DEFINE(RectBatch) {
|
||||
|
||||
bool hasLocalRect = random->nextBool();
|
||||
bool hasLocalMatrix = random->nextBool();
|
||||
return GrNonAAFillRectBatch::Create(color, viewMatrix, rect,
|
||||
hasLocalRect ? &localRect : nullptr,
|
||||
hasLocalMatrix ? &localMatrix : nullptr);
|
||||
return GrNonAAFillRectOp::Make(color,
|
||||
viewMatrix,
|
||||
rect,
|
||||
hasLocalRect ? &localRect : nullptr,
|
||||
hasLocalMatrix ? &localMatrix : nullptr)
|
||||
.release();
|
||||
}
|
||||
|
||||
#endif
|
33
src/gpu/batches/GrNonAAFillRectOp.h
Normal file
33
src/gpu/batches/GrNonAAFillRectOp.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrNonAAFillRectOp_DEFINED
|
||||
#define GrNonAAFillRectOp_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
|
||||
class GrDrawOp;
|
||||
class SkMatrix;
|
||||
struct SkRect;
|
||||
|
||||
namespace GrNonAAFillRectOp {
|
||||
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
|
||||
sk_sp<GrDrawOp> MakeWithPerspective(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
};
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrNonAAFillRectBatch.h"
|
||||
#include "GrNonAAFillRectOp.h"
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "GrDefaultGeoProcFactory.h"
|
||||
@ -41,8 +41,8 @@ static sk_sp<GrGeometryProcessor> make_persp_gp(const SkMatrix& viewMatrix,
|
||||
// Otherwise, if we have a local rect, then we apply the localMatrix directly to the localRect
|
||||
// to generate vertex local coords
|
||||
if (viewMatrix.hasPerspective()) {
|
||||
LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type :
|
||||
LocalCoords::kUsePosition_Type,
|
||||
LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type
|
||||
: LocalCoords::kUsePosition_Type,
|
||||
localMatrix);
|
||||
return GrDefaultGeoProcFactory::Make(color, coverage, localCoords, viewMatrix);
|
||||
} else if (hasExplicitLocalCoords) {
|
||||
@ -63,8 +63,7 @@ static void tesselate(intptr_t vertices,
|
||||
const GrQuad* localQuad) {
|
||||
SkPoint* positions = reinterpret_cast<SkPoint*>(vertices);
|
||||
|
||||
positions->setRectFan(rect.fLeft, rect.fTop,
|
||||
rect.fRight, rect.fBottom, vertexStride);
|
||||
positions->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride);
|
||||
|
||||
if (viewMatrix) {
|
||||
viewMatrix->mapPointsWithStride(positions, vertexStride, kVertsPerInstance);
|
||||
@ -75,8 +74,8 @@ static void tesselate(intptr_t vertices,
|
||||
if (localQuad) {
|
||||
static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor);
|
||||
for (int i = 0; i < kVertsPerInstance; i++) {
|
||||
SkPoint* coords = reinterpret_cast<SkPoint*>(vertices + kLocalOffset +
|
||||
i * vertexStride);
|
||||
SkPoint* coords =
|
||||
reinterpret_cast<SkPoint*>(vertices + kLocalOffset + i * vertexStride);
|
||||
*coords = localQuad->point(i);
|
||||
}
|
||||
}
|
||||
@ -85,21 +84,19 @@ static void tesselate(intptr_t vertices,
|
||||
GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset);
|
||||
for (int j = 0; j < 4; ++j) {
|
||||
*vertColor = color;
|
||||
vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride);
|
||||
vertColor = (GrColor*)((intptr_t)vertColor + vertexStride);
|
||||
}
|
||||
}
|
||||
|
||||
// We handle perspective in the local matrix or viewmatrix with special batches
|
||||
class GrNonAAFillRectPerspectiveBatch final : public GrMeshDrawOp {
|
||||
class NonAAFillRectPerspectiveOp final : public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
GrNonAAFillRectPerspectiveBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
: INHERITED(ClassID())
|
||||
, fViewMatrix(viewMatrix) {
|
||||
SkASSERT(viewMatrix.hasPerspective() || (localMatrix &&
|
||||
localMatrix->hasPerspective()));
|
||||
NonAAFillRectPerspectiveOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
: INHERITED(ClassID()), fViewMatrix(viewMatrix) {
|
||||
SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective()));
|
||||
RectInfo& info = fRects.push_back();
|
||||
info.fColor = color;
|
||||
info.fRect = rect;
|
||||
@ -121,9 +118,9 @@ public:
|
||||
str.appendf("# batched: %d\n", fRects.count());
|
||||
for (int i = 0; i < fRects.count(); ++i) {
|
||||
const RectInfo& geo = fRects[0];
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
||||
i, geo.fColor,
|
||||
geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, geo.fRect.fBottom);
|
||||
str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i,
|
||||
geo.fColor, geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight,
|
||||
geo.fRect.fBottom);
|
||||
}
|
||||
str.append(DumpPipelineInfo(*this->pipeline()));
|
||||
str.append(INHERITED::dumpInfo());
|
||||
@ -144,7 +141,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
GrNonAAFillRectPerspectiveBatch() : INHERITED(ClassID()) {}
|
||||
NonAAFillRectPerspectiveOp() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target* target) const override {
|
||||
sk_sp<GrGeometryProcessor> gp = make_persp_gp(fViewMatrix,
|
||||
@ -156,18 +153,19 @@ private:
|
||||
return;
|
||||
}
|
||||
SkASSERT(fHasLocalRect
|
||||
? gp->getVertexStride() ==
|
||||
sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)
|
||||
: gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
|
||||
? gp->getVertexStride() ==
|
||||
sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)
|
||||
: gp->getVertexStride() ==
|
||||
sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
|
||||
|
||||
size_t vertexStride = gp->getVertexStride();
|
||||
int instanceCount = fRects.count();
|
||||
|
||||
sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
||||
InstancedHelper helper;
|
||||
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
||||
indexBuffer.get(), kVertsPerInstance,
|
||||
kIndicesPerInstance, instanceCount);
|
||||
void* vertices =
|
||||
helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(),
|
||||
kVertsPerInstance, kIndicesPerInstance, instanceCount);
|
||||
if (!vertices || !indexBuffer) {
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
return;
|
||||
@ -175,8 +173,8 @@ private:
|
||||
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
const RectInfo& info = fRects[i];
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
||||
i * kVertsPerInstance * vertexStride;
|
||||
intptr_t verts =
|
||||
reinterpret_cast<intptr_t>(vertices) + i * kVertsPerInstance * vertexStride;
|
||||
if (fHasLocalRect) {
|
||||
GrQuad quad(info.fLocalRect);
|
||||
tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, &quad);
|
||||
@ -188,7 +186,7 @@ private:
|
||||
}
|
||||
|
||||
bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
|
||||
GrNonAAFillRectPerspectiveBatch* that = t->cast<GrNonAAFillRectPerspectiveBatch>();
|
||||
NonAAFillRectPerspectiveOp* that = t->cast<NonAAFillRectPerspectiveOp>();
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
that->bounds(), caps)) {
|
||||
return false;
|
||||
@ -232,16 +230,16 @@ private:
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
namespace GrNonAAFillRectBatch {
|
||||
namespace GrNonAAFillRectOp {
|
||||
|
||||
GrDrawOp* CreateWithPerspective(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
return new GrNonAAFillRectPerspectiveBatch(color, viewMatrix, rect, localRect, localMatrix);
|
||||
sk_sp<GrDrawOp> MakeWithPerspective(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
return sk_sp<GrDrawOp>(
|
||||
new NonAAFillRectPerspectiveOp(color, viewMatrix, rect, localRect, localMatrix));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -250,7 +248,7 @@ GrDrawOp* CreateWithPerspective(GrColor color,
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(PerspRectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(NonAAFillRectPerspectiveOp) {
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkRect rect = GrTest::TestRect(random);
|
||||
SkRect localRect = GrTest::TestRect(random);
|
||||
@ -263,9 +261,10 @@ DRAW_BATCH_TEST_DEFINE(PerspRectBatch) {
|
||||
}
|
||||
|
||||
bool hasLocalRect = random->nextBool();
|
||||
return GrNonAAFillRectBatch::CreateWithPerspective(color, viewMatrix, rect,
|
||||
hasLocalRect ? &localRect : nullptr,
|
||||
hasLocalMatrix ? &localMatrix : nullptr);
|
||||
return GrNonAAFillRectOp::MakeWithPerspective(color, viewMatrix, rect,
|
||||
hasLocalRect ? &localRect : nullptr,
|
||||
hasLocalMatrix ? &localMatrix : nullptr)
|
||||
.release();
|
||||
}
|
||||
|
||||
#endif
|
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrNonAAStrokeRectBatch_DEFINED
|
||||
#define GrNonAAStrokeRectBatch_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
|
||||
#include "SkTypes.h"
|
||||
|
||||
class GrDrawOp;
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
class SkMatrix;
|
||||
|
||||
namespace GrNonAAStrokeRectBatch {
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec&,
|
||||
bool snapToPixelCenters);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrNonAAStrokeRectBatch.h"
|
||||
#include "GrNonAAStrokeRectOp.h"
|
||||
|
||||
#include "GrBatchTest.h"
|
||||
#include "GrColor.h"
|
||||
@ -23,7 +23,7 @@ static void init_stroke_rect_strip(SkPoint verts[10], const SkRect& rect, SkScal
|
||||
const SkScalar rad = SkScalarHalf(width);
|
||||
// TODO we should be able to enable this assert, but we'd have to filter these draws
|
||||
// this is a bug
|
||||
//SkASSERT(rad < rect.width() / 2 && rad < rect.height() / 2);
|
||||
// SkASSERT(rad < rect.width() / 2 && rad < rect.height() / 2);
|
||||
|
||||
verts[0].set(rect.fLeft + rad, rect.fTop + rad);
|
||||
verts[1].set(rect.fLeft - rad, rect.fTop - rad);
|
||||
@ -45,7 +45,7 @@ inline static bool allowed_stroke(const SkStrokeRec& stroke) {
|
||||
(stroke.getJoin() == SkPaint::kMiter_Join && stroke.getMiter() > SK_ScalarSqrt2);
|
||||
}
|
||||
|
||||
class NonAAStrokeRectBatch final : public GrMeshDrawOp {
|
||||
class NonAAStrokeRectOp final : public GrMeshDrawOp {
|
||||
public:
|
||||
DEFINE_OP_CLASS_ID
|
||||
|
||||
@ -53,10 +53,10 @@ public:
|
||||
|
||||
SkString dumpInfo() const override {
|
||||
SkString string;
|
||||
string.appendf("Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"StrokeWidth: %.2f\n",
|
||||
fColor, fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom,
|
||||
fStrokeWidth);
|
||||
string.appendf(
|
||||
"Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f], "
|
||||
"StrokeWidth: %.2f\n",
|
||||
fColor, fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom, fStrokeWidth);
|
||||
string.append(DumpPipelineInfo(*this->pipeline()));
|
||||
string.append(INHERITED::dumpInfo());
|
||||
return string;
|
||||
@ -70,20 +70,20 @@ public:
|
||||
coverage->setKnownSingleComponent(0xff);
|
||||
}
|
||||
|
||||
static GrDrawOp* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkStrokeRec& stroke, bool snapToPixelCenters) {
|
||||
static sk_sp<GrDrawOp> Make(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkStrokeRec& stroke, bool snapToPixelCenters) {
|
||||
if (!allowed_stroke(stroke)) {
|
||||
return nullptr;
|
||||
}
|
||||
NonAAStrokeRectBatch* batch = new NonAAStrokeRectBatch();
|
||||
batch->fColor = color;
|
||||
batch->fViewMatrix = viewMatrix;
|
||||
batch->fRect = rect;
|
||||
NonAAStrokeRectOp* op = new NonAAStrokeRectOp();
|
||||
op->fColor = color;
|
||||
op->fViewMatrix = viewMatrix;
|
||||
op->fRect = rect;
|
||||
// Sort the rect for hairlines
|
||||
batch->fRect.sort();
|
||||
batch->fStrokeWidth = stroke.getWidth();
|
||||
op->fRect.sort();
|
||||
op->fStrokeWidth = stroke.getWidth();
|
||||
|
||||
SkScalar rad = SkScalarHalf(batch->fStrokeWidth);
|
||||
SkScalar rad = SkScalarHalf(op->fStrokeWidth);
|
||||
SkRect bounds = rect;
|
||||
bounds.outset(rad, rad);
|
||||
|
||||
@ -98,16 +98,15 @@ public:
|
||||
SkScalarFloorToScalar(bounds.fRight),
|
||||
SkScalarFloorToScalar(bounds.fBottom));
|
||||
bounds.offset(0.5f, 0.5f);
|
||||
batch->setBounds(bounds, HasAABloat::kNo, IsZeroArea::kNo);
|
||||
op->setBounds(bounds, HasAABloat::kNo, IsZeroArea::kNo);
|
||||
} else {
|
||||
batch->setTransformedBounds(bounds, batch->fViewMatrix, HasAABloat ::kNo,
|
||||
IsZeroArea::kNo);
|
||||
op->setTransformedBounds(bounds, op->fViewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
|
||||
}
|
||||
return batch;
|
||||
return sk_sp<GrDrawOp>(op);
|
||||
}
|
||||
|
||||
private:
|
||||
NonAAStrokeRectBatch() : INHERITED(ClassID()) {}
|
||||
NonAAStrokeRectOp() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target* target) const override {
|
||||
sk_sp<GrGeometryProcessor> gp;
|
||||
@ -116,8 +115,8 @@ private:
|
||||
Color color(fColor);
|
||||
Coverage coverage(fOverrides.readsCoverage() ? Coverage::kSolid_Type
|
||||
: Coverage::kNone_Type);
|
||||
LocalCoords localCoords(fOverrides.readsLocalCoords() ? LocalCoords::kUsePosition_Type :
|
||||
LocalCoords::kUnused_Type);
|
||||
LocalCoords localCoords(fOverrides.readsLocalCoords() ? LocalCoords::kUsePosition_Type
|
||||
: LocalCoords::kUnused_Type);
|
||||
gp = GrDefaultGeoProcFactory::Make(color, coverage, localCoords, fViewMatrix);
|
||||
}
|
||||
|
||||
@ -133,8 +132,8 @@ private:
|
||||
const GrBuffer* vertexBuffer;
|
||||
int firstVertex;
|
||||
|
||||
void* verts = target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer,
|
||||
&firstVertex);
|
||||
void* verts =
|
||||
target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &firstVertex);
|
||||
|
||||
if (!verts) {
|
||||
SkDebugf("Could not allocate vertices\n");
|
||||
@ -186,21 +185,20 @@ private:
|
||||
typedef GrMeshDrawOp INHERITED;
|
||||
};
|
||||
|
||||
namespace GrNonAAStrokeRectBatch {
|
||||
namespace GrNonAAStrokeRectOp {
|
||||
|
||||
GrDrawOp* Create(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke,
|
||||
bool snapToPixelCenters) {
|
||||
return NonAAStrokeRectBatch::Create(color, viewMatrix, rect, stroke, snapToPixelCenters);
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke,
|
||||
bool snapToPixelCenters) {
|
||||
return NonAAStrokeRectOp::Make(color, viewMatrix, rect, stroke, snapToPixelCenters);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef GR_TEST_UTILS
|
||||
|
||||
DRAW_BATCH_TEST_DEFINE(NonAAStrokeRectBatch) {
|
||||
DRAW_BATCH_TEST_DEFINE(NonAAStrokeRectOp) {
|
||||
SkMatrix viewMatrix = GrTest::TestMatrix(random);
|
||||
GrColor color = GrRandomColor(random);
|
||||
SkRect rect = GrTest::TestRect(random);
|
||||
@ -210,7 +208,8 @@ DRAW_BATCH_TEST_DEFINE(NonAAStrokeRectBatch) {
|
||||
paint.setStyle(SkPaint::kStroke_Style);
|
||||
paint.setStrokeJoin(SkPaint::kMiter_Join);
|
||||
SkStrokeRec strokeRec(paint);
|
||||
return GrNonAAStrokeRectBatch::Create(color, viewMatrix, rect, strokeRec, random->nextBool());
|
||||
return GrNonAAStrokeRectOp::Make(color, viewMatrix, rect, strokeRec, random->nextBool())
|
||||
.release();
|
||||
}
|
||||
|
||||
#endif
|
28
src/gpu/batches/GrNonAAStrokeRectOp.h
Normal file
28
src/gpu/batches/GrNonAAStrokeRectOp.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrNonAAStrokeRectOp_DEFINED
|
||||
#define GrNonAAStrokeRectOp_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
|
||||
class GrDrawOp;
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
class SkMatrix;
|
||||
|
||||
namespace GrNonAAStrokeRectOp {
|
||||
|
||||
sk_sp<GrDrawOp> Make(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec&,
|
||||
bool snapToPixelCenters);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrRectBatchFactory_DEFINED
|
||||
#define GrRectBatchFactory_DEFINED
|
||||
|
||||
#include "GrAAFillRectBatch.h"
|
||||
#include "GrAAStrokeRectBatch.h"
|
||||
#include "GrAnalyticRectBatch.h"
|
||||
#include "GrColor.h"
|
||||
#include "GrNonAAFillRectBatch.h"
|
||||
#include "GrNonAAStrokeRectBatch.h"
|
||||
#include "GrPaint.h"
|
||||
#include "SkMatrix.h"
|
||||
|
||||
class GrOp;
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
|
||||
/*
|
||||
* A factory for returning batches which can draw rectangles.
|
||||
*/
|
||||
namespace GrRectBatchFactory {
|
||||
|
||||
inline GrDrawOp* CreateNonAAFill(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
if (viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())) {
|
||||
return GrNonAAFillRectBatch::CreateWithPerspective(color, viewMatrix, rect, localRect,
|
||||
localMatrix);
|
||||
} else {
|
||||
return GrNonAAFillRectBatch::Create(color, viewMatrix, rect, localRect, localMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
inline GrDrawOp* CreateAAFill(const GrPaint& paint,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& devRect) {
|
||||
if (!paint.usesDistanceVectorField()) {
|
||||
return GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, croppedRect, devRect);
|
||||
} else {
|
||||
return GrAnalyticRectBatch::CreateAnalyticRectBatch(paint.getColor(), viewMatrix, rect,
|
||||
croppedRect, devRect);
|
||||
}
|
||||
}
|
||||
|
||||
inline GrDrawOp* CreateAAFill(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return GrAAFillRectBatch::Create(color, viewMatrix, localMatrix, rect, devRect);
|
||||
}
|
||||
|
||||
inline GrDrawOp* CreateNonAAStroke(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& strokeRec,
|
||||
bool snapToPixelCenters) {
|
||||
return GrNonAAStrokeRectBatch::Create(color, viewMatrix, rect, strokeRec, snapToPixelCenters);
|
||||
}
|
||||
|
||||
inline GrDrawOp* CreateAAStroke(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
return GrAAStrokeRectBatch::Create(color, viewMatrix, rect, stroke);
|
||||
}
|
||||
|
||||
// First rect is outer; second rect is inner
|
||||
GrDrawOp* CreateAAFillNestedRects(GrColor, const SkMatrix& viewMatrix, const SkRect rects[2]);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@ -5,17 +5,17 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrRectBatchFactory.h"
|
||||
#include "GrRectOpFactory.h"
|
||||
|
||||
#include "GrAAStrokeRectBatch.h"
|
||||
#include "GrAAStrokeRectOp.h"
|
||||
|
||||
#include "SkStrokeRec.h"
|
||||
|
||||
namespace GrRectBatchFactory {
|
||||
namespace GrRectOpFactory {
|
||||
|
||||
GrDrawOp* CreateAAFillNestedRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect rects[2]) {
|
||||
sk_sp<GrDrawOp> MakeAAFillNestedRects(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect rects[2]) {
|
||||
SkASSERT(viewMatrix.rectStaysRect());
|
||||
SkASSERT(!rects[0].isEmpty() && !rects[1].isEmpty());
|
||||
|
||||
@ -26,10 +26,9 @@ GrDrawOp* CreateAAFillNestedRects(GrColor color,
|
||||
if (devOutside.isEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
return GrAAFillRectBatch::Create(color, viewMatrix, devOutside, devOutside);
|
||||
return GrAAFillRectOp::Make(color, viewMatrix, devOutside, devOutside);
|
||||
}
|
||||
|
||||
return GrAAStrokeRectBatch::CreateFillBetweenRects(color, viewMatrix, devOutside, devInside);
|
||||
return GrAAStrokeRectOp::MakeFillBetweenRects(color, viewMatrix, devOutside, devInside);
|
||||
}
|
||||
|
||||
};
|
82
src/gpu/batches/GrRectOpFactory.h
Normal file
82
src/gpu/batches/GrRectOpFactory.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef GrRectOpFactory_DEFINED
|
||||
#define GrRectOpFactory_DEFINED
|
||||
|
||||
#include "GrAAFillRectOp.h"
|
||||
#include "GrAAStrokeRectOp.h"
|
||||
#include "GrAnalyticRectOp.h"
|
||||
#include "GrColor.h"
|
||||
#include "GrNonAAFillRectOp.h"
|
||||
#include "GrNonAAStrokeRectOp.h"
|
||||
#include "GrPaint.h"
|
||||
#include "SkMatrix.h"
|
||||
#include "SkRefCnt.h"
|
||||
#include "batches/GrDrawOp.h"
|
||||
|
||||
struct SkRect;
|
||||
class SkStrokeRec;
|
||||
|
||||
/**
|
||||
* A factory for returning batches which can draw rectangles.
|
||||
*/
|
||||
namespace GrRectOpFactory {
|
||||
|
||||
inline sk_sp<GrDrawOp> MakeNonAAFill(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
if (viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())) {
|
||||
return GrNonAAFillRectOp::MakeWithPerspective(color, viewMatrix, rect, localRect,
|
||||
localMatrix);
|
||||
} else {
|
||||
return GrNonAAFillRectOp::Make(color, viewMatrix, rect, localRect, localMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
inline sk_sp<GrDrawOp> MakeAAFill(const GrPaint& paint,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& croppedRect,
|
||||
const SkRect& devRect) {
|
||||
if (!paint.usesDistanceVectorField()) {
|
||||
return GrAAFillRectOp::Make(paint.getColor(), viewMatrix, croppedRect, devRect);
|
||||
} else {
|
||||
return GrAnalyticRectOp::Make(paint.getColor(), viewMatrix, rect, croppedRect, devRect);
|
||||
}
|
||||
}
|
||||
|
||||
inline sk_sp<GrDrawOp> MakeAAFill(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkMatrix& localMatrix,
|
||||
const SkRect& rect,
|
||||
const SkRect& devRect) {
|
||||
return GrAAFillRectOp::Make(color, viewMatrix, localMatrix, rect, devRect);
|
||||
}
|
||||
|
||||
inline sk_sp<GrDrawOp> MakeNonAAStroke(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& strokeRec,
|
||||
bool snapToPixelCenters) {
|
||||
return GrNonAAStrokeRectOp::Make(color, viewMatrix, rect, strokeRec, snapToPixelCenters);
|
||||
}
|
||||
|
||||
inline sk_sp<GrDrawOp> MakeAAStroke(GrColor color,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkRect& rect,
|
||||
const SkStrokeRec& stroke) {
|
||||
return GrAAStrokeRectOp::Make(color, viewMatrix, rect, stroke);
|
||||
}
|
||||
|
||||
// First rect is outer; second rect is inner
|
||||
sk_sp<GrDrawOp> MakeAAFillNestedRects(GrColor, const SkMatrix& viewMatrix, const SkRect rects[2]);
|
||||
};
|
||||
|
||||
#endif
|
@ -5,21 +5,20 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
|
||||
#include "GrStencilAndCoverPathRenderer.h"
|
||||
#include "GrCaps.h"
|
||||
#include "GrContext.h"
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "GrDrawPathBatch.h"
|
||||
#include "GrFixedClip.h"
|
||||
#include "GrGpu.h"
|
||||
#include "GrPath.h"
|
||||
#include "GrPipelineBuilder.h"
|
||||
#include "GrRenderTarget.h"
|
||||
#include "GrRenderTargetContextPriv.h"
|
||||
#include "GrResourceProvider.h"
|
||||
#include "GrStencilPathBatch.h"
|
||||
#include "GrStyle.h"
|
||||
#include "batches/GrRectBatchFactory.h"
|
||||
#include "batches/GrRectOpFactory.h"
|
||||
|
||||
GrPathRenderer* GrStencilAndCoverPathRenderer::Create(GrResourceProvider* resourceProvider,
|
||||
const GrCaps& caps) {
|
||||
@ -113,8 +112,8 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
|
||||
}
|
||||
const SkMatrix& viewM = viewMatrix.hasPerspective() ? SkMatrix::I() : viewMatrix;
|
||||
|
||||
sk_sp<GrDrawOp> coverOp(GrRectBatchFactory::CreateNonAAFill(args.fPaint->getColor(), viewM,
|
||||
bounds, nullptr, &invert));
|
||||
sk_sp<GrDrawOp> coverOp(GrRectOpFactory::MakeNonAAFill(args.fPaint->getColor(), viewM,
|
||||
bounds, nullptr, &invert));
|
||||
|
||||
// fake inverse with a stencil and cover
|
||||
args.fRenderTargetContext->priv().stencilPath(*args.fClip, args.fAAType, viewMatrix,
|
||||
|
Loading…
Reference in New Issue
Block a user