/*
|
* Copyright 2014 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#ifndef GrPathRendering_DEFINED
|
#define GrPathRendering_DEFINED
|
|
#include "SkPath.h"
|
#include "GrPipeline.h"
|
|
class GrGpu;
|
class GrPath;
|
class GrStencilSettings;
|
class GrStyle;
|
struct SkScalerContextEffects;
|
class SkDescriptor;
|
class SkTypeface;
|
|
/**
|
* Abstract class wrapping HW path rendering API.
|
*
|
* The subclasses of this class use the possible HW API to render paths (as opposed to path
|
* rendering implemented in Skia on top of a "3d" HW API).
|
* The subclasses hold the global state needed to render paths, including shadow of the global HW
|
* API state. Similar to GrGpu.
|
*
|
* It is expected that the lifetimes of GrGpuXX and GrXXPathRendering are the same. The call context
|
* interface (eg. * the concrete instance of GrGpu subclass) should be provided to the instance
|
* during construction.
|
*/
|
class GrPathRendering {
|
public:
|
virtual ~GrPathRendering() { }
|
|
enum PathTransformType {
|
kNone_PathTransformType, //!< []
|
kTranslateX_PathTransformType, //!< [kMTransX]
|
kTranslateY_PathTransformType, //!< [kMTransY]
|
kTranslate_PathTransformType, //!< [kMTransX, kMTransY]
|
kAffine_PathTransformType, //!< [kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY]
|
|
kLast_PathTransformType = kAffine_PathTransformType
|
};
|
|
static inline int PathTransformSize(PathTransformType type) {
|
switch (type) {
|
case kNone_PathTransformType:
|
return 0;
|
case kTranslateX_PathTransformType:
|
case kTranslateY_PathTransformType:
|
return 1;
|
case kTranslate_PathTransformType:
|
return 2;
|
case kAffine_PathTransformType:
|
return 6;
|
|
default:
|
SK_ABORT("Unknown path transform type");
|
return 0;
|
}
|
}
|
|
// No native support for inverse at this time
|
enum FillType {
|
/** Specifies that "inside" is computed by a non-zero sum of signed
|
edge crossings
|
*/
|
kWinding_FillType,
|
/** Specifies that "inside" is computed by an odd number of edge
|
crossings
|
*/
|
kEvenOdd_FillType,
|
};
|
|
static const GrUserStencilSettings& GetStencilPassSettings(FillType);
|
|
/**
|
* Creates a new gpu path, based on the specified path and stroke and returns it.
|
*
|
* @param SkPath the geometry.
|
* @param GrStyle the style applied to the path. Styles with non-dash path effects are not
|
* allowed.
|
* @return a new GPU path object.
|
*/
|
virtual sk_sp<GrPath> createPath(const SkPath&, const GrStyle&) = 0;
|
|
/** None of these params are optional, pointers used just to avoid making copies. */
|
struct StencilPathArgs {
|
StencilPathArgs(bool useHWAA,
|
GrRenderTargetProxy* proxy,
|
const SkMatrix* viewMatrix,
|
const GrScissorState* scissor,
|
const GrStencilSettings* stencil)
|
: fUseHWAA(useHWAA)
|
, fProxy(proxy)
|
, fViewMatrix(viewMatrix)
|
, fScissor(scissor)
|
, fStencil(stencil) {
|
}
|
bool fUseHWAA;
|
GrRenderTargetProxy* fProxy;
|
const SkMatrix* fViewMatrix;
|
const GrScissorState* fScissor;
|
const GrStencilSettings* fStencil;
|
};
|
|
void stencilPath(const StencilPathArgs& args, const GrPath* path);
|
|
void drawPath(GrRenderTarget*, GrSurfaceOrigin,
|
const GrPrimitiveProcessor& primProc,
|
const GrPipeline& pipeline,
|
const GrPipeline::FixedDynamicState&,
|
const GrStencilSettings& stencilPassSettings, // Cover pass settings in pipeline.
|
const GrPath* path);
|
|
protected:
|
GrPathRendering(GrGpu* gpu) : fGpu(gpu) { }
|
|
virtual void onStencilPath(const StencilPathArgs&, const GrPath*) = 0;
|
virtual void onDrawPath(GrRenderTarget*, GrSurfaceOrigin,
|
const GrPrimitiveProcessor&,
|
const GrPipeline&,
|
const GrPipeline::FixedDynamicState&,
|
const GrStencilSettings&,
|
const GrPath*) = 0;
|
|
GrGpu* fGpu;
|
private:
|
GrPathRendering& operator=(const GrPathRendering&);
|
};
|
|
#endif
|