Mv DRRect drawing code from GrDrawContext into SkGpuDevice
This is a TODO left over from https://codereview.chromium.org/1731413002/ (Hide GrDrawTarget from GrOvalRenderer). It is desireable since the GrDrawContext doesn't, in general, manipulate GrFragmentProcessors. GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1733993003 Review URL: https://codereview.chromium.org/1733993003
This commit is contained in:
parent
24dd687ac5
commit
d77061067a
@ -140,23 +140,6 @@ public:
|
|||||||
const SkRRect& rrect,
|
const SkRRect& rrect,
|
||||||
const GrStrokeInfo&);
|
const GrStrokeInfo&);
|
||||||
|
|
||||||
/**
|
|
||||||
* Shortcut for drawing an SkPath consisting of nested rrects using a paint.
|
|
||||||
* Does not support stroking. The result is undefined if outer does not contain
|
|
||||||
* inner.
|
|
||||||
*
|
|
||||||
* @param paint describes how to color pixels.
|
|
||||||
* @param viewMatrix transformation matrix
|
|
||||||
* @param outer the outer roundrect
|
|
||||||
* @param inner the inner roundrect
|
|
||||||
*/
|
|
||||||
void drawDRRect(const GrClip&,
|
|
||||||
const GrPaint&,
|
|
||||||
const SkMatrix& viewMatrix,
|
|
||||||
const SkRRect& outer,
|
|
||||||
const SkRRect& inner);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws a path.
|
* Draws a path.
|
||||||
*
|
*
|
||||||
|
@ -23,8 +23,6 @@
|
|||||||
#include "batches/GrRectBatchFactory.h"
|
#include "batches/GrRectBatchFactory.h"
|
||||||
#include "batches/GrNinePatch.h" // TODO Factory
|
#include "batches/GrNinePatch.h" // TODO Factory
|
||||||
|
|
||||||
#include "effects/GrRRectEffect.h"
|
|
||||||
|
|
||||||
#include "text/GrAtlasTextContext.h"
|
#include "text/GrAtlasTextContext.h"
|
||||||
#include "text/GrStencilAndCoverTextContext.h"
|
#include "text/GrStencilAndCoverTextContext.h"
|
||||||
|
|
||||||
@ -517,113 +515,6 @@ void GrDrawContext::drawRRect(const GrClip& clip,
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static bool draw_drrect(GrDrawTarget* drawTarget,
|
|
||||||
const GrPipelineBuilder& pipelineBuilder,
|
|
||||||
GrColor color,
|
|
||||||
const SkMatrix& viewMatrix,
|
|
||||||
bool useAA,
|
|
||||||
const SkRRect& origOuter,
|
|
||||||
const SkRRect& origInner,
|
|
||||||
GrShaderCaps* shaderCaps) {
|
|
||||||
bool applyAA = useAA && !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled();
|
|
||||||
GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps;
|
|
||||||
if (!origInner.isEmpty()) {
|
|
||||||
SkTCopyOnFirstWrite<SkRRect> inner(origInner);
|
|
||||||
if (!viewMatrix.isIdentity()) {
|
|
||||||
if (!origInner.transform(viewMatrix, inner.writable())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GrPrimitiveEdgeType edgeType = applyAA ?
|
|
||||||
kInverseFillAA_GrProcessorEdgeType :
|
|
||||||
kInverseFillBW_GrProcessorEdgeType;
|
|
||||||
// TODO this needs to be a geometry processor
|
|
||||||
GrFragmentProcessor* fp = GrRRectEffect::Create(edgeType, *inner);
|
|
||||||
if (nullptr == fp) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
arfps.set(&pipelineBuilder);
|
|
||||||
arfps.addCoverageFragmentProcessor(fp)->unref();
|
|
||||||
}
|
|
||||||
|
|
||||||
SkStrokeRec fillRec(SkStrokeRec::kFill_InitStyle);
|
|
||||||
SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(pipelineBuilder, color,
|
|
||||||
viewMatrix, useAA, origOuter,
|
|
||||||
fillRec, shaderCaps));
|
|
||||||
if (batch) {
|
|
||||||
drawTarget->drawBatch(pipelineBuilder, batch);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SkASSERT(!origOuter.isEmpty());
|
|
||||||
SkTCopyOnFirstWrite<SkRRect> outer(origOuter);
|
|
||||||
if (!viewMatrix.isIdentity()) {
|
|
||||||
if (!origOuter.transform(viewMatrix, outer.writable())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GrPrimitiveEdgeType edgeType = applyAA ? kFillAA_GrProcessorEdgeType :
|
|
||||||
kFillBW_GrProcessorEdgeType;
|
|
||||||
SkAutoTUnref<GrFragmentProcessor> effect(GrRRectEffect::Create(edgeType, *outer));
|
|
||||||
if (!effect) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!arfps.isSet()) {
|
|
||||||
arfps.set(&pipelineBuilder);
|
|
||||||
}
|
|
||||||
|
|
||||||
SkMatrix invert;
|
|
||||||
if (!viewMatrix.invert(&invert)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
arfps.addCoverageFragmentProcessor(effect);
|
|
||||||
SkRect bounds = outer->getBounds();
|
|
||||||
if (applyAA) {
|
|
||||||
bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
|
|
||||||
}
|
|
||||||
batch.reset(GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), bounds,
|
|
||||||
nullptr, &invert));
|
|
||||||
drawTarget->drawBatch(pipelineBuilder, batch);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GrDrawContext::drawDRRect(const GrClip& clip,
|
|
||||||
const GrPaint& paint,
|
|
||||||
const SkMatrix& viewMatrix,
|
|
||||||
const SkRRect& outer,
|
|
||||||
const SkRRect& inner) {
|
|
||||||
ASSERT_SINGLE_OWNER
|
|
||||||
RETURN_IF_ABANDONED
|
|
||||||
SkDEBUGCODE(this->validate();)
|
|
||||||
GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawDRRect");
|
|
||||||
|
|
||||||
if (outer.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AutoCheckFlush acf(fDrawingManager);
|
|
||||||
|
|
||||||
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
|
||||||
GrColor color = paint.getColor();
|
|
||||||
|
|
||||||
if (!draw_drrect(this->getDrawTarget(), pipelineBuilder,
|
|
||||||
color, viewMatrix, paint.isAntiAlias(),
|
|
||||||
outer, inner, fContext->caps()->shaderCaps())) {
|
|
||||||
SkPath path;
|
|
||||||
path.setIsVolatile(true);
|
|
||||||
path.addRRect(inner);
|
|
||||||
path.addRRect(outer);
|
|
||||||
path.setFillType(SkPath::kEvenOdd_FillType);
|
|
||||||
|
|
||||||
GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle);
|
|
||||||
this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
|
||||||
paint.isAntiAlias(), path, fillRec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void GrDrawContext::drawOval(const GrClip& clip,
|
void GrDrawContext::drawOval(const GrClip& clip,
|
||||||
const GrPaint& paint,
|
const GrPaint& paint,
|
||||||
const SkMatrix& viewMatrix,
|
const SkMatrix& viewMatrix,
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "batches/GrRectBatchFactory.h"
|
#include "batches/GrRectBatchFactory.h"
|
||||||
#include "effects/GrBicubicEffect.h"
|
#include "effects/GrBicubicEffect.h"
|
||||||
#include "effects/GrDashingEffect.h"
|
#include "effects/GrDashingEffect.h"
|
||||||
|
#include "effects/GrRRectEffect.h"
|
||||||
#include "effects/GrSimpleTextureEffect.h"
|
#include "effects/GrSimpleTextureEffect.h"
|
||||||
#include "effects/GrTextureDomain.h"
|
#include "effects/GrTextureDomain.h"
|
||||||
#include "text/GrTextUtils.h"
|
#include "text/GrTextUtils.h"
|
||||||
@ -559,6 +560,66 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
|||||||
fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo);
|
fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SkGpuDevice::drawFilledDRRect(const SkMatrix& viewMatrix, const SkRRect& origOuter,
|
||||||
|
const SkRRect& origInner, const SkPaint& paint) {
|
||||||
|
SkASSERT(!origInner.isEmpty());
|
||||||
|
SkASSERT(!origOuter.isEmpty());
|
||||||
|
|
||||||
|
bool applyAA = paint.isAntiAlias() && !fRenderTarget->isUnifiedMultisampled();
|
||||||
|
|
||||||
|
GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdgeType :
|
||||||
|
kInverseFillBW_GrProcessorEdgeType;
|
||||||
|
GrPrimitiveEdgeType outerEdgeType = applyAA ? kFillAA_GrProcessorEdgeType :
|
||||||
|
kFillBW_GrProcessorEdgeType;
|
||||||
|
|
||||||
|
SkTCopyOnFirstWrite<SkRRect> inner(origInner), outer(origOuter);
|
||||||
|
SkMatrix inverseVM;
|
||||||
|
if (!viewMatrix.isIdentity()) {
|
||||||
|
if (!origInner.transform(viewMatrix, inner.writable())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!origOuter.transform(viewMatrix, outer.writable())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!viewMatrix.invert(&inverseVM)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
inverseVM.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
GrPaint grPaint;
|
||||||
|
|
||||||
|
if (!SkPaintToGrPaint(this->context(), paint, viewMatrix, &grPaint)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
grPaint.setAntiAlias(false);
|
||||||
|
|
||||||
|
// TODO these need to be a geometry processors
|
||||||
|
SkAutoTUnref<GrFragmentProcessor> innerEffect(GrRRectEffect::Create(innerEdgeType, *inner));
|
||||||
|
if (!innerEffect) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkAutoTUnref<GrFragmentProcessor> outerEffect(GrRRectEffect::Create(outerEdgeType, *outer));
|
||||||
|
if (!outerEffect) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
grPaint.addCoverageFragmentProcessor(innerEffect);
|
||||||
|
grPaint.addCoverageFragmentProcessor(outerEffect);
|
||||||
|
|
||||||
|
SkRect bounds = outer->getBounds();
|
||||||
|
if (applyAA) {
|
||||||
|
bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
|
||||||
|
}
|
||||||
|
|
||||||
|
fDrawContext->fillRectWithLocalMatrix(fClip, grPaint, SkMatrix::I(), bounds, inverseVM);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
||||||
const SkRRect& inner, const SkPaint& paint) {
|
const SkRRect& inner, const SkPaint& paint) {
|
||||||
ASSERT_SINGLE_OWNER
|
ASSERT_SINGLE_OWNER
|
||||||
@ -566,16 +627,20 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
|||||||
CHECK_FOR_ANNOTATION(paint);
|
CHECK_FOR_ANNOTATION(paint);
|
||||||
CHECK_SHOULD_DRAW(draw);
|
CHECK_SHOULD_DRAW(draw);
|
||||||
|
|
||||||
|
if (outer.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inner.isEmpty()) {
|
||||||
|
return this->drawRRect(draw, outer, paint);
|
||||||
|
}
|
||||||
|
|
||||||
SkStrokeRec stroke(paint);
|
SkStrokeRec stroke(paint);
|
||||||
|
|
||||||
if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()) {
|
if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()) {
|
||||||
GrPaint grPaint;
|
if (this->drawFilledDRRect(*draw.fMatrix, outer, inner, paint)) {
|
||||||
if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SkPath path;
|
SkPath path;
|
||||||
|
@ -251,6 +251,9 @@ private:
|
|||||||
const GrClip&,
|
const GrClip&,
|
||||||
const SkPaint&);
|
const SkPaint&);
|
||||||
|
|
||||||
|
bool drawFilledDRRect(const SkMatrix& viewMatrix, const SkRRect& outer,
|
||||||
|
const SkRRect& inner, const SkPaint& paint);
|
||||||
|
|
||||||
void drawProducerNine(const SkDraw&, GrTextureProducer*, const SkIRect& center,
|
void drawProducerNine(const SkDraw&, GrTextureProducer*, const SkIRect& center,
|
||||||
const SkRect& dst, const SkPaint&);
|
const SkRect& dst, const SkPaint&);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user