diff options
author | robertphillips <robertphillips@google.com> | 2016-02-04 10:52:42 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-04 10:52:42 -0800 |
commit | b6c65e99956b867e24bd5bd68ae37673a9fd4b27 (patch) | |
tree | cb320967a3e8253a1100881942b540594f33315d /src/core/SkSpecialImage.h | |
parent | 7471c780d48afd4dc02ed45c60a2fd2efa9e5a84 (diff) |
Add SkSpecialImage & SkSpecialSurface classes
Initial classes.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1579323002
Review URL: https://codereview.chromium.org/1579323002
Diffstat (limited to 'src/core/SkSpecialImage.h')
-rw-r--r-- | src/core/SkSpecialImage.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/core/SkSpecialImage.h b/src/core/SkSpecialImage.h new file mode 100644 index 0000000000..23ef5732c9 --- /dev/null +++ b/src/core/SkSpecialImage.h @@ -0,0 +1,84 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file + */ + +#ifndef SkSpecialImage_DEFINED +#define SkSpecialImage_DEFINED + +#include "SkRefCnt.h" + +class GrTexture; +class SkBitmap; +class SkCanvas; +class SkImage; +struct SkImageInfo; +class SkPaint; +class SkSpecialSurface; + +/** + * This is a restricted form of SkImage solely intended for internal use. It + * differs from SkImage in that: + * - it can only be backed by raster or gpu (no generators) + * - it can be backed by a GrTexture larger than its nominal bounds + * - it can't be drawn tiled + * - it can't be drawn with MIPMAPs + * It is similar to SkImage in that it abstracts how the pixels are stored/represented. + * + * Note: the contents of the backing storage outside of the subset rect are undefined. + */ +class SkSpecialImage : public SkRefCnt { +public: + int width() const { return fSubset.width(); } + int height() const { return fSubset.height(); } + + /** + * Draw this SpecialImage into the canvas. + */ + void draw(SkCanvas*, int x, int y, const SkPaint*) const; + + static SkSpecialImage* NewFromImage(const SkIRect& subset, const SkImage*); + static SkSpecialImage* NewFromRaster(const SkIRect& subset, const SkBitmap&); + static SkSpecialImage* NewFromGpu(const SkIRect& subset, GrTexture*); + + /** + * Create a new surface with a backend that is compatible with this image. + */ + SkSpecialSurface* newSurface(const SkImageInfo&) const; + +protected: + SkSpecialImage(const SkIRect& subset) : fSubset(subset) { } + + // The following 3 are for testing and shouldn't be used. + friend class TestingSpecialImageAccess; + friend class TestingSpecialSurfaceAccess; + const SkIRect& subset() const { return fSubset; } + + /** + * If the SpecialImage is backed by cpu pixels, return the const address + * of those pixels and, if not null, return the ImageInfo and rowBytes. + * The returned address is only valid while the image object is in scope. + * + * The returned ImageInfo represents the backing memory. Use 'subset' + * to get the active portion's dimensions. + * + * On failure, return false and ignore the pixmap parameter. + */ + bool peekPixels(SkPixmap*) const; + + /** + * If the SpecialImage is backed by a gpu texture, return that texture. + * The active portion of the texture can be retrieved via 'subset'. + */ + GrTexture* peekTexture() const; + +private: + const SkIRect fSubset; + + typedef SkRefCnt INHERITED; +}; + +#endif + |