| Index: include/core/SkCanvas.h
|
| diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
|
| index 7235efb2f0a9cd3b23132541d9c695b0c81e1704..971e4402d8fc0d20787877ba1f6976f6d07d59b0 100644
|
| --- a/include/core/SkCanvas.h
|
| +++ b/include/core/SkCanvas.h
|
| @@ -76,6 +76,12 @@ public:
|
|
|
| SkMetaData& getMetaData();
|
|
|
| + /**
|
| + * Return ImageInfo for this canvas. If the canvas is not backed by pixels
|
| + * (cpu or gpu), then the info's ColorType will be kUnknown_SkColorType.
|
| + */
|
| + SkImageInfo imageInfo() const;
|
| +
|
| ///////////////////////////////////////////////////////////////////////////
|
|
|
| /**
|
| @@ -84,16 +90,19 @@ public:
|
| void flush();
|
|
|
| /**
|
| + * DEPRECATED: call imageInfo() instead.
|
| * Return the width/height of the underlying device. The current drawable
|
| * area may be small (due to clipping or saveLayer). For a canvas with
|
| * no device, 0,0 will be returned.
|
| */
|
| SkISize getDeviceSize() const;
|
|
|
| - /** Return the canvas' device object, which may be null. The device holds
|
| - the bitmap of the pixels that the canvas draws into. The reference count
|
| - of the returned device is not changed by this call.
|
| - */
|
| + /**
|
| + * DEPRECATED.
|
| + * Return the canvas' device object, which may be null. The device holds
|
| + * the bitmap of the pixels that the canvas draws into. The reference count
|
| + * of the returned device is not changed by this call.
|
| + */
|
| SkBaseDevice* getDevice() const;
|
|
|
| /**
|
| @@ -126,6 +135,20 @@ public:
|
| ///////////////////////////////////////////////////////////////////////////
|
|
|
| /**
|
| + * If the canvas has pixels (and is not recording to a picture or other
|
| + * non-raster target) and has direct access to its pixels (i.e. they are in
|
| + * local RAM) return the const-address of those pixels, and if not null,
|
| + * return the ImageInfo and rowBytes. The returned address is only valid
|
| + * while the canvas object is in scope and unchanged. Any API calls made on
|
| + * canvas (or its parent surface if any) will invalidate the
|
| + * returned address (and associated information).
|
| + *
|
| + * On failure, returns NULL and the info and rowBytes parameters are
|
| + * ignored.
|
| + */
|
| + const void* peekPixels(SkImageInfo* info, size_t* rowBytes);
|
| +
|
| + /**
|
| * This enum can be used with read/writePixels to perform a pixel ops to or
|
| * from an 8888 config other than Skia's native config (SkPMColor). There
|
| * are three byte orders supported: native, BGRA, and RGBA. Each has a
|
| @@ -1019,6 +1042,9 @@ protected:
|
| // default impl defers to getDevice()->newSurface(info)
|
| virtual SkSurface* onNewSurface(const SkImageInfo&);
|
|
|
| + // default impl defers to its device
|
| + virtual const void* onPeekPixels(SkImageInfo*, size_t* rowBytes);
|
| +
|
| // Returns the canvas to be used by DrawIter. Default implementation
|
| // returns this. Subclasses that encapsulate an indirect canvas may
|
| // need to overload this method. The impl must keep track of this, as it
|
| @@ -1206,4 +1232,47 @@ private:
|
| };
|
| #define SkAutoCommentBlock(...) SK_REQUIRE_LOCAL_VAR(SkAutoCommentBlock)
|
|
|
| +/**
|
| + * If the caller wants read-only access to the pixels in a canvas, it can just
|
| + * call canvas->peekPixels(), since that is the fastest way to "peek" at the
|
| + * pixels on a raster-backed canvas.
|
| + *
|
| + * If the canvas has pixels, but they are not readily available to the CPU
|
| + * (e.g. gpu-backed), then peekPixels() will fail, but readPixels() will
|
| + * succeed (though be slower, since it will return a copy of the pixels).
|
| + *
|
| + * SkAutoROCanvasPixels encapsulates these two techniques, trying first to call
|
| + * peekPixels() (for performance), but if that fails, calling readPixels() and
|
| + * storing the copy locally.
|
| + *
|
| + * The caller must respect the restrictions associated with peekPixels(), since
|
| + * that may have been called: The returned information is invalidated if...
|
| + * - any API is called on the canvas (or its parent surface if present)
|
| + * - the canvas goes out of scope
|
| + */
|
| +class SkAutoROCanvasPixels : SkNoncopyable {
|
| +public:
|
| + SkAutoROCanvasPixels(SkCanvas* canvas);
|
| +
|
| + // returns NULL on failure
|
| + const void* addr() const { return fAddr; }
|
| +
|
| + // undefined if addr() == NULL
|
| + size_t rowBytes() const { return fRowBytes; }
|
| +
|
| + // undefined if addr() == NULL
|
| + const SkImageInfo& info() const { return fInfo; }
|
| +
|
| + // helper that, if returns true, installs the pixels into the bitmap. Note
|
| + // that the bitmap may reference the address returned by peekPixels(), so
|
| + // the caller must respect the restrictions associated with peekPixels().
|
| + bool asROBitmap(SkBitmap*) const;
|
| +
|
| +private:
|
| + SkBitmap fBitmap; // used if peekPixels() fails
|
| + const void* fAddr; // NULL on failure
|
| + SkImageInfo fInfo;
|
| + size_t fRowBytes;
|
| +};
|
| +
|
| #endif
|
|
|