| Index: include/core/SkCanvas.h
|
| diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
|
| index 9a46801a98bb3fe638f9ef5cd5eacb33ad30d982..ca6818518d74078401d0d73a1b3cfdc61d842010 100644
|
| --- a/include/core/SkCanvas.h
|
| +++ b/include/core/SkCanvas.h
|
| @@ -35,8 +35,22 @@ class SkTextBlob;
|
| class GrContext;
|
| class GrRenderTarget;
|
|
|
| +//#define SK_SUPPORT_LEGACY_ONDRAWIMAGERECT
|
| +
|
| class SkCanvasState;
|
|
|
| +#ifdef SK_SUPPORT_LEGACY_ONDRAWIMAGERECT
|
| + #define SK_VIRTUAL_CONSTRAINT_TYPE SkCanvas::DrawBitmapRectFlags
|
| + #define SRC_RECT_CONSTRAINT_PARAM(param)
|
| + #define SRC_RECT_CONSTRAINT_ARG(arg)
|
| + #define SRC_RECT_CONSTRAINT_LOCAL_DEFAULT(var) SkCanvas::SrcRectConstraint var = SkCanvas::kStrict_SrcRectConstraint;
|
| +#else
|
| + #define SK_VIRTUAL_CONSTRAINT_TYPE SkCanvas::SrcRectConstraint
|
| + #define SRC_RECT_CONSTRAINT_PARAM(param) , SrcRectConstraint param
|
| + #define SRC_RECT_CONSTRAINT_ARG(arg) , arg
|
| + #define SRC_RECT_CONSTRAINT_LOCAL_DEFAULT(var)
|
| +#endif
|
| +
|
| /** \class SkCanvas
|
|
|
| A Canvas encapsulates all of the state about drawing into a device (bitmap).
|
| @@ -778,17 +792,59 @@ public:
|
| @param paint The paint used to draw the image, or NULL
|
| */
|
| void drawImage(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint = NULL);
|
| - /** Draw the specified image, with the specified matrix applied (before the
|
| - canvas' matrix is applied).
|
|
|
| - @param image The image to be drawn
|
| - @param src Optional: specify the subset of the image to be drawn
|
| - @param dst The destination rectangle where the scaled/translated
|
| - image will be drawn
|
| - @param paint The paint used to draw the image, or NULL
|
| - */
|
| + /**
|
| + * Controls the behavior at the edge of the src-rect, when specified in drawImageRect,
|
| + * trading off speed for exactness.
|
| + *
|
| + * When filtering is enabled (in the Paint), skia may need to sample in a neighborhood around
|
| + * the pixels in the image. If there is a src-rect specified, it is intended to restrict the
|
| + * pixels that will be read. However, for performance reasons, some implementations may slow
|
| + * down if they cannot read 1-pixel past the src-rect boundary at times.
|
| + *
|
| + * This enum allows the caller to specify if such a 1-pixel "slop" will be visually acceptable.
|
| + * If it is, the caller should pass kFast, and it may result in a faster draw. If the src-rect
|
| + * must be strictly respected, the caller should pass kStrict.
|
| + */
|
| + enum SrcRectConstraint {
|
| + /**
|
| + * If kStrict is specified, the implementation must respect the src-rect
|
| + * (if specified) strictly, and will never sample outside of those bounds during sampling
|
| + * even when filtering. This may be slower than kFast.
|
| + */
|
| + kStrict_SrcRectConstraint,
|
| +
|
| + /**
|
| + * If kFast is specified, the implementation may sample outside of the src-rect
|
| + * (if specified) by at most 1 pixel when filtering. This allows greater flexibility
|
| + * to the implementation and can make the draw much faster.
|
| + */
|
| + kFast_SrcRectConstraint,
|
| + };
|
| +
|
| + /** Draw the specified image, scaling and translating so that it fills the specified
|
| + * dst rect. If the src rect is non-null, only that subset of the image is transformed
|
| + * and drawn.
|
| + *
|
| + * @param image The image to be drawn
|
| + * @param src Optional: specify the subset of the image to be drawn
|
| + * @param dst The destination rectangle where the scaled/translated
|
| + * image will be drawn
|
| + * @param paint The paint used to draw the image, or NULL
|
| + * @param constraint Control the tradeoff between speed and exactness w.r.t. the src-rect.
|
| + */
|
| void drawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
|
| - const SkPaint* paint = NULL);
|
| + const SkPaint* paint, SrcRectConstraint);
|
| +
|
| + void drawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
|
| + const SkPaint* paint = NULL) {
|
| + this->drawImageRect(image, src, dst, paint, kStrict_SrcRectConstraint);
|
| + }
|
| +
|
| + void drawImageRect(const SkImage* image, const SkRect& dst, const SkPaint* paint = NULL) {
|
| + // With no src-rect, the constraint value is ignored, so we just use the default.
|
| + this->drawImageRect(image, NULL, dst, paint, kStrict_SrcRectConstraint);
|
| + }
|
|
|
| /**
|
| * Draw the image stretched differentially to fit into dst.
|
| @@ -826,6 +882,25 @@ public:
|
| void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
|
| const SkPaint* paint = NULL);
|
|
|
| + /** Draw the specified bitmap, scaling and translating so that it fills the specified
|
| + * dst rect. If the src rect is non-null, only that subset of the bitmap is transformed
|
| + * and drawn.
|
| + *
|
| + * @param bitmap The bitmap to be drawn
|
| + * @param src Optional: specify the subset of the bitmap to be drawn
|
| + * @param dst The destination rectangle where the scaled/translated
|
| + * bitmap will be drawn
|
| + * @param paint The paint used to draw the bitmap, or NULL
|
| + * @param constraint Control the tradeoff between speed and exactness w.r.t. the src-rect.
|
| + */
|
| + void drawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
|
| + const SkPaint* paint, SrcRectConstraint);
|
| +
|
| + void drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst, const SkPaint* paint = NULL) {
|
| + this->drawBitmapRect(bitmap, NULL, dst, paint, kStrict_SrcRectConstraint);
|
| + }
|
| +
|
| + // IMPORTANT that thse be value-equal with SrcRectConstraint (during transition period)
|
| enum DrawBitmapRectFlags {
|
| kNone_DrawBitmapRectFlag = 0x0,
|
| /**
|
| @@ -848,11 +923,6 @@ public:
|
| const SkPaint* paint = NULL,
|
| DrawBitmapRectFlags flags = kNone_DrawBitmapRectFlag);
|
|
|
| - void drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst,
|
| - const SkPaint* paint = NULL) {
|
| - this->drawBitmapRectToRect(bitmap, NULL, dst, paint, kNone_DrawBitmapRectFlag);
|
| - }
|
| -
|
| void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* isrc,
|
| const SkRect& dst, const SkPaint* paint = NULL,
|
| DrawBitmapRectFlags flags = kNone_DrawBitmapRectFlag) {
|
| @@ -1245,13 +1315,14 @@ protected:
|
| int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*);
|
| virtual void onDrawPath(const SkPath&, const SkPaint&);
|
| virtual void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*);
|
| - virtual void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*);
|
| + virtual void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*
|
| + SRC_RECT_CONSTRAINT_PARAM(constraint));
|
| virtual void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
|
| const SkPaint*);
|
|
|
| virtual void onDrawBitmap(const SkBitmap&, SkScalar dx, SkScalar dy, const SkPaint*);
|
| virtual void onDrawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint*,
|
| - DrawBitmapRectFlags);
|
| + SK_VIRTUAL_CONSTRAINT_TYPE);
|
| virtual void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
|
| const SkPaint*);
|
| virtual void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*);
|
| @@ -1365,7 +1436,7 @@ private:
|
| void internalDrawBitmap(const SkBitmap&, const SkMatrix& m, const SkPaint* paint);
|
| void internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src,
|
| const SkRect& dst, const SkPaint* paint,
|
| - DrawBitmapRectFlags flags);
|
| + SrcRectConstraint);
|
| void internalDrawPaint(const SkPaint& paint);
|
| void internalSaveLayer(const SkRect* bounds, const SkPaint*, SaveFlags, SaveLayerStrategy);
|
| void internalDrawDevice(SkBaseDevice*, int x, int y, const SkPaint*, bool isBitmapDevice);
|
|
|