Index: src/gpu/GrDrawTarget.h |
=================================================================== |
--- src/gpu/GrDrawTarget.h (revision 8508) |
+++ src/gpu/GrDrawTarget.h (working copy) |
@@ -139,8 +139,8 @@ |
* data. The target provides ptrs to hold the vertex and/or index data. |
* |
* The data is writable up until the next drawIndexed, drawNonIndexed, |
- * drawIndexedInstances, or pushGeometrySource. At this point the data is |
- * frozen and the ptrs are no longer valid. |
+ * drawIndexedInstances, drawRect, copySurface, or pushGeometrySource. At |
+ * this point the data is frozen and the ptrs are no longer valid. |
* |
* Where the space is allocated and how it is uploaded to the GPU is |
* subclass-dependent. |
@@ -169,9 +169,9 @@ |
* source is reset and likewise for indexCount. |
* |
* The pointers to the space allocated for vertices and indices remain valid |
- * until a drawIndexed, drawNonIndexed, drawIndexedInstances, or push/ |
- * popGeomtrySource is called. At that point logically a snapshot of the |
- * data is made and the pointers are invalid. |
+ * until a drawIndexed, drawNonIndexed, drawIndexedInstances, drawRect, |
+ * copySurface, or push/popGeomtrySource is called. At that point logically a |
+ * snapshot of the data is made and the pointers are invalid. |
* |
* @param vertexCount the number of vertices to reserve space for. Can be |
* 0. Vertex size is queried from the current GrDrawState. |
@@ -406,6 +406,22 @@ |
virtual void clear(const GrIRect* rect, |
GrColor color, |
GrRenderTarget* renderTarget = NULL) = 0; |
+ |
+ /** |
+ * Copies a pixel rectangle from one surface to another. This call may finalize |
+ * reserved vertex/index data (as though a draw call was made). The src pixels |
+ * copied are specified by srcRect. They are copied to a rect of the same |
+ * size in dst with top left at dstPoint. If the src rect is clipped by the |
+ * src bounds then pixel values in the dst rect corresponding to area clipped |
+ * by the src rect are not overwritten. This method can fail and return false |
+ * depending on the type of surface, configs, etc, and the backend-specific |
+ * limitations. If rect is clipped out entirely by the src or dst bounds then |
+ * true is returned since there is no actual copy necessary to succeed. |
+ */ |
+ bool copySurface(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint); |
/** |
* Release any resources that are cached but not currently in use. This |
@@ -616,6 +632,25 @@ |
} |
} |
+ // This method is called by copySurface The srcRect is guaranteed to be entirely within the |
+ // src bounds. Likewise, the dst rect implied by dstPoint and srcRect's width and height falls |
+ // entirely within the dst. The default implementation will draw a rect from the src to the |
+ // dst if the src is a texture and the dst is a render target and fail otherwise. |
+ virtual bool onCopySurface(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint); |
+ |
+ // Called to determine whether an onCopySurface call would succeed or not. This is useful for |
+ // proxy subclasses to test whether the copy would succeed without executing it yet. Derived |
+ // classes must keep this consistent with their implementation of onCopySurface(). The inputs |
+ // are the same as onCopySurface(), i.e. srcRect and dstPoint are clipped to be inside the src |
+ // and dst bounds. |
+ virtual bool canCopySurface(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint); |
+ |
GrContext* getContext() { return fContext; } |
const GrContext* getContext() const { return fContext; } |