2015-05-26 18:38:03 +00:00
|
|
|
/*
|
|
|
|
* 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 GrDrawContext_DEFINED
|
|
|
|
#define GrDrawContext_DEFINED
|
|
|
|
|
|
|
|
#include "GrColor.h"
|
|
|
|
#include "SkRefCnt.h"
|
2015-06-19 18:49:52 +00:00
|
|
|
#include "SkSurfaceProps.h"
|
2015-05-26 18:38:03 +00:00
|
|
|
|
|
|
|
class GrBatch;
|
|
|
|
class GrClip;
|
|
|
|
class GrContext;
|
|
|
|
class GrDrawTarget;
|
|
|
|
class GrPaint;
|
|
|
|
class GrPathProcessor;
|
|
|
|
class GrPathRange;
|
|
|
|
class GrPipelineBuilder;
|
|
|
|
class GrRenderTarget;
|
|
|
|
class GrStrokeInfo;
|
|
|
|
class GrSurface;
|
2015-06-17 12:43:33 +00:00
|
|
|
class GrTextContext;
|
|
|
|
class SkDrawFilter;
|
2015-05-26 18:38:03 +00:00
|
|
|
struct SkIPoint;
|
|
|
|
struct SkIRect;
|
|
|
|
class SkMatrix;
|
2015-06-17 12:43:33 +00:00
|
|
|
class SkPaint;
|
2015-05-26 18:38:03 +00:00
|
|
|
class SkPath;
|
|
|
|
struct SkPoint;
|
|
|
|
struct SkRect;
|
|
|
|
class SkRRect;
|
2015-06-17 12:43:33 +00:00
|
|
|
class SkTextBlob;
|
2015-05-26 18:38:03 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* A helper object to orchestrate draws
|
|
|
|
*/
|
|
|
|
class SK_API GrDrawContext : public SkRefCnt {
|
|
|
|
public:
|
|
|
|
SK_DECLARE_INST_COUNT(GrDrawContext)
|
|
|
|
|
2015-06-17 12:43:33 +00:00
|
|
|
~GrDrawContext() override;
|
|
|
|
|
2015-05-26 18:38:03 +00:00
|
|
|
void copySurface(GrRenderTarget* dst, GrSurface* src,
|
|
|
|
const SkIRect& srcRect, const SkIPoint& dstPoint);
|
|
|
|
|
2015-06-17 12:43:33 +00:00
|
|
|
// TODO: it is odd that we need both the SkPaint in the following 3 methods.
|
|
|
|
// We should extract the text parameters from SkPaint and pass them separately
|
|
|
|
// akin to GrStrokeInfo (GrTextInfo?)
|
|
|
|
void drawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&,
|
|
|
|
const SkMatrix& viewMatrix, const char text[], size_t byteLength,
|
|
|
|
SkScalar x, SkScalar y, const SkIRect& clipBounds);
|
|
|
|
void drawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&,
|
|
|
|
const SkMatrix& viewMatrix, const char text[], size_t byteLength,
|
|
|
|
const SkScalar pos[], int scalarsPerPosition,
|
|
|
|
const SkPoint& offset, const SkIRect& clipBounds);
|
|
|
|
void drawTextBlob(GrRenderTarget*, const GrClip&, const SkPaint&,
|
|
|
|
const SkMatrix& viewMatrix, const SkTextBlob*,
|
|
|
|
SkScalar x, SkScalar y,
|
|
|
|
SkDrawFilter*, const SkIRect& clipBounds);
|
2015-05-26 18:38:03 +00:00
|
|
|
|
2015-06-17 12:43:33 +00:00
|
|
|
// drawPaths is thanks to GrStencilAndCoverTextContext
|
|
|
|
// TODO: remove
|
2015-05-26 18:38:03 +00:00
|
|
|
void drawPaths(GrPipelineBuilder* pipelineBuilder,
|
|
|
|
const GrPathProcessor* pathProc,
|
|
|
|
const GrPathRange* pathRange,
|
|
|
|
const void* indices,
|
|
|
|
int /*GrDrawTarget::PathIndexType*/ indexType,
|
|
|
|
const float transformValues[],
|
|
|
|
int /*GrDrawTarget::PathTransformType*/ transformType,
|
|
|
|
int count,
|
|
|
|
int /*GrPathRendering::FillType*/ fill);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Provides a perfomance hint that the render target's contents are allowed
|
|
|
|
* to become undefined.
|
|
|
|
*/
|
|
|
|
void discard(GrRenderTarget*);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clear the entire or rect of the render target, ignoring any clips.
|
|
|
|
* @param target The render target to clear.
|
|
|
|
* @param rect the rect to clear or the whole thing if rect is NULL.
|
|
|
|
* @param color the color to clear to.
|
|
|
|
* @param canIgnoreRect allows partial clears to be converted to whole
|
|
|
|
* clears on platforms for which that is cheap
|
|
|
|
*/
|
|
|
|
void clear(GrRenderTarget*, const SkIRect* rect, GrColor color, bool canIgnoreRect);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw everywhere (respecting the clip) with the paint.
|
|
|
|
*/
|
|
|
|
void drawPaint(GrRenderTarget*, const GrClip&, const GrPaint&, const SkMatrix& viewMatrix);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw the rect using a paint.
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix
|
|
|
|
* @param strokeInfo the stroke information (width, join, cap), and.
|
|
|
|
* the dash information (intervals, count, phase).
|
|
|
|
* If strokeInfo == NULL, then the rect is filled.
|
|
|
|
* Otherwise, if stroke width == 0, then the stroke
|
|
|
|
* is always a single pixel thick, else the rect is
|
|
|
|
* mitered/beveled stroked based on stroke width.
|
|
|
|
* The rects coords are used to access the paint (through texture matrix)
|
|
|
|
*/
|
|
|
|
void drawRect(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint& paint,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRect&,
|
|
|
|
const GrStrokeInfo* strokeInfo = NULL);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Maps a rectangle of shader coordinates to a rectangle and draws that rectangle
|
|
|
|
*
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix which applies to rectToDraw
|
|
|
|
* @param rectToDraw the rectangle to draw
|
|
|
|
* @param localRect the rectangle of shader coordinates applied to rectToDraw
|
|
|
|
* @param localMatrix an optional matrix to transform the shader coordinates before applying
|
|
|
|
* to rectToDraw
|
|
|
|
*/
|
|
|
|
void drawNonAARectToRect(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint& paint,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRect& rectToDraw,
|
|
|
|
const SkRect& localRect,
|
|
|
|
const SkMatrix* localMatrix = NULL);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draws a non-AA rect with paint and a localMatrix
|
|
|
|
*/
|
|
|
|
void drawNonAARectWithLocalMatrix(GrRenderTarget* rt,
|
|
|
|
const GrClip& clip,
|
|
|
|
const GrPaint& paint,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRect& rect,
|
|
|
|
const SkMatrix& localMatrix) {
|
|
|
|
this->drawNonAARectToRect(rt, clip, paint, viewMatrix, rect, rect, &localMatrix);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw a roundrect using a paint.
|
|
|
|
*
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix
|
|
|
|
* @param rrect the roundrect to draw
|
|
|
|
* @param strokeInfo the stroke information (width, join, cap) and
|
|
|
|
* the dash information (intervals, count, phase).
|
|
|
|
*/
|
|
|
|
void drawRRect(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint&,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRRect& rrect,
|
|
|
|
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(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint&,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRRect& outer,
|
|
|
|
const SkRRect& inner);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draws a path.
|
|
|
|
*
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix
|
|
|
|
* @param path the path to draw
|
|
|
|
* @param strokeInfo the stroke information (width, join, cap) and
|
|
|
|
* the dash information (intervals, count, phase).
|
|
|
|
*/
|
|
|
|
void drawPath(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint&,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkPath&,
|
|
|
|
const GrStrokeInfo&);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draws vertices with a paint.
|
|
|
|
*
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix
|
|
|
|
* @param primitiveType primitives type to draw.
|
|
|
|
* @param vertexCount number of vertices.
|
|
|
|
* @param positions array of vertex positions, required.
|
|
|
|
* @param texCoords optional array of texture coordinates used
|
|
|
|
* to access the paint.
|
|
|
|
* @param colors optional array of per-vertex colors, supercedes
|
|
|
|
* the paint's color field.
|
|
|
|
* @param indices optional array of indices. If NULL vertices
|
|
|
|
* are drawn non-indexed.
|
|
|
|
* @param indexCount if indices is non-null then this is the
|
|
|
|
* number of indices.
|
|
|
|
*/
|
|
|
|
void drawVertices(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint& paint,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
GrPrimitiveType primitiveType,
|
|
|
|
int vertexCount,
|
|
|
|
const SkPoint positions[],
|
|
|
|
const SkPoint texs[],
|
|
|
|
const GrColor colors[],
|
|
|
|
const uint16_t indices[],
|
|
|
|
int indexCount);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draws an oval.
|
|
|
|
*
|
|
|
|
* @param paint describes how to color pixels.
|
|
|
|
* @param viewMatrix transformation matrix
|
|
|
|
* @param oval the bounding rect of the oval.
|
|
|
|
* @param strokeInfo the stroke information (width, join, cap) and
|
|
|
|
* the dash information (intervals, count, phase).
|
|
|
|
*/
|
|
|
|
void drawOval(GrRenderTarget*,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint& paint,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
const SkRect& oval,
|
|
|
|
const GrStrokeInfo& strokeInfo);
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
2015-06-17 12:43:33 +00:00
|
|
|
friend class GrAtlasTextContext; // for access to drawBatch
|
2015-05-26 18:38:03 +00:00
|
|
|
friend class GrContext; // for ctor
|
|
|
|
|
2015-06-19 18:49:52 +00:00
|
|
|
GrDrawContext(GrContext*, GrDrawTarget*, const SkSurfaceProps&);
|
2015-05-26 18:38:03 +00:00
|
|
|
|
|
|
|
// Sets the paint. Returns true on success; false on failure.
|
|
|
|
bool prepareToDraw(GrPipelineBuilder*,
|
|
|
|
GrRenderTarget* rt,
|
|
|
|
const GrClip&,
|
|
|
|
const GrPaint* paint);
|
2015-06-19 18:49:52 +00:00
|
|
|
GrTextContext* createTextContext(GrRenderTarget*, const SkSurfaceProps&);
|
2015-05-26 18:38:03 +00:00
|
|
|
|
|
|
|
// A simpler version of the above which just returns true on success; false on failure.
|
|
|
|
// Clip is *NOT* set
|
|
|
|
bool prepareToDraw(GrRenderTarget* rt);
|
|
|
|
|
|
|
|
void internalDrawPath(GrDrawTarget*,
|
|
|
|
GrPipelineBuilder*,
|
|
|
|
const SkMatrix& viewMatrix,
|
|
|
|
GrColor,
|
|
|
|
bool useAA,
|
|
|
|
const SkPath&,
|
|
|
|
const GrStrokeInfo&);
|
|
|
|
|
2015-06-17 12:43:33 +00:00
|
|
|
// This entry point allows the GrTextContext-derived classes to add their batches to
|
|
|
|
// the drawTarget.
|
|
|
|
void drawBatch(GrPipelineBuilder* pipelineBuilder, GrBatch* batch);
|
|
|
|
|
|
|
|
GrContext* fContext; // owning context -> no ref
|
|
|
|
GrDrawTarget* fDrawTarget;
|
|
|
|
GrTextContext* fTextContext; // lazily created
|
|
|
|
|
2015-06-19 18:49:52 +00:00
|
|
|
SkSurfaceProps fSurfaceProps;
|
2015-05-26 18:38:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|