Skia
2DGraphicsLibrary
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SkImage.h
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkImage_DEFINED
9 #define SkImage_DEFINED
10 
11 #include "SkFilterQuality.h"
12 #include "SkImageInfo.h"
13 #include "SkImageEncoder.h"
14 #include "SkRefCnt.h"
15 #include "SkScalar.h"
16 #include "SkShader.h"
17 
18 class SkData;
19 class SkCanvas;
20 class SkColorTable;
21 class SkImageGenerator;
22 class SkPaint;
23 class SkPicture;
24 class SkPixelSerializer;
25 class SkString;
26 class SkSurface;
27 class GrContext;
29 class GrTexture;
30 
45 class SK_API SkImage : public SkRefCnt {
46 public:
47  typedef SkImageInfo Info;
48  typedef void* ReleaseContext;
49 
50  static sk_sp<SkImage> MakeRasterCopy(const SkPixmap&);
51  static sk_sp<SkImage> MakeRasterData(const Info&, sk_sp<SkData> pixels, size_t rowBytes);
52 
53  typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext);
54 
62  static sk_sp<SkImage> MakeFromRaster(const SkPixmap&, RasterReleaseProc, ReleaseContext);
63 
68  static sk_sp<SkImage> MakeFromBitmap(const SkBitmap&);
69 
76  static sk_sp<SkImage> MakeFromGenerator(SkImageGenerator*, const SkIRect* subset = nullptr);
77 
84  static sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset = nullptr);
85 
93  return MakeFromTexture(ctx, desc, kPremul_SkAlphaType, nullptr, nullptr, nullptr);
94  }
95 
96  static sk_sp<SkImage> MakeFromTexture(GrContext* ctx, const GrBackendTextureDesc& de,
97  SkAlphaType at) {
98  return MakeFromTexture(ctx, de, at, nullptr, nullptr, nullptr);
99  }
100 
101  typedef void (*TextureReleaseProc)(ReleaseContext);
102 
111  SkAlphaType at, TextureReleaseProc trp,
112  ReleaseContext rc) {
113  return MakeFromTexture(ctx, desc, at, nullptr, trp, rc);
114  }
115 
123  static sk_sp<SkImage> MakeFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType,
124  sk_sp<SkColorSpace>, TextureReleaseProc, ReleaseContext);
125 
132  static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext*, const GrBackendTextureDesc&,
133  SkAlphaType = kPremul_SkAlphaType,
134  sk_sp<SkColorSpace> = nullptr);
135 
141  static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext*, SkYUVColorSpace,
142  const GrBackendObject yuvTextureHandles[3],
143  const SkISize yuvSizes[3],
144  GrSurfaceOrigin,
145  sk_sp<SkColorSpace> = nullptr);
146 
152  static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext*, SkYUVColorSpace,
153  const GrBackendObject nv12TextureHandles[2],
154  const SkISize nv12Sizes[2], GrSurfaceOrigin,
155  sk_sp<SkColorSpace> = nullptr);
156 
157  static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture>, const SkISize& dimensions,
158  const SkMatrix*, const SkPaint*);
159 
160  static sk_sp<SkImage> MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted);
161 
163 
164  int width() const { return fWidth; }
165  int height() const { return fHeight; }
166  SkISize dimensions() const { return SkISize::Make(fWidth, fHeight); }
167  SkIRect bounds() const { return SkIRect::MakeWH(fWidth, fHeight); }
168  uint32_t uniqueID() const { return fUniqueID; }
169  SkAlphaType alphaType() const;
170  bool isOpaque() const { return SkAlphaTypeIsOpaque(this->alphaType()); }
171 
176  bool readYUV8Planes(const SkISize[3], void* const planes[3], const size_t rowBytes[3],
177  SkYUVColorSpace) const;
178 
179 #ifdef SK_SUPPORT_LEGACY_CREATESHADER_PTR
181  const SkMatrix* localMatrix = nullptr) const;
182 #endif
183 
185  const SkMatrix* localMatrix = nullptr) const;
186 
194  bool peekPixels(SkPixmap* pixmap) const;
195 
196 #ifdef SK_SUPPORT_LEGACY_PEEKPIXELS_PARMS
197 
208  const void* peekPixels(SkImageInfo* info, size_t* rowBytes) const;
209 #endif
210 
223  void preroll(GrContext* = nullptr) const;
224 
225  // DEPRECATED - currently used by Canvas2DLayerBridge in Chromium.
226  GrTexture* getTexture() const;
227 
231  bool isTextureBacked() const;
232 
238  GrBackendObject getTextureHandle(bool flushPendingGrContextIO) const;
239 
245  enum CachingHint {
246  kAllow_CachingHint,
247  kDisallow_CachingHint,
248  };
249 
268  bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
269  int srcX, int srcY, CachingHint = kAllow_CachingHint) const;
270 
271  bool readPixels(const SkPixmap& dst, int srcX, int srcY,
272  CachingHint = kAllow_CachingHint) const;
273 
281  bool scalePixels(const SkPixmap& dst, SkFilterQuality, CachingHint = kAllow_CachingHint) const;
282 
293  SkData* encode(SkImageEncoder::Type, int quality) const;
294 
309  SkData* encode(SkPixelSerializer* = nullptr) const;
310 
320  SkData* refEncoded() const;
321 
322  const char* toString(SkString*) const;
323 
331  sk_sp<SkImage> makeSubset(const SkIRect& subset) const;
332 
338  sk_sp<SkImage> makeTextureImage(GrContext*) const;
339 
344  sk_sp<SkImage> makeNonTextureImage() const;
362  sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
363  const SkIRect& clipBounds, SkIRect* outSubset,
364  SkIPoint* offset) const;
365 
368  DeferredTextureImageUsageParams() : fPreScaleMipLevel(0) {}
369  DeferredTextureImageUsageParams(const SkMatrix matrix, const SkFilterQuality quality,
370  int preScaleMipLevel)
371  : fMatrix(matrix), fQuality(quality), fPreScaleMipLevel(preScaleMipLevel) {}
372  SkMatrix fMatrix;
373  SkFilterQuality fQuality;
374  int fPreScaleMipLevel;
375  };
376 
397  size_t getDeferredTextureImageData(const GrContextThreadSafeProxy&,
399  int paramCnt,
400  void* buffer) const;
401 
407  static sk_sp<SkImage> MakeFromDeferredTextureImageData(GrContext*, const void*, SkBudgeted);
408 
409  // Helper functions to convert to SkBitmap
410 
411  enum LegacyBitmapMode {
412  kRO_LegacyBitmapMode,
413  kRW_LegacyBitmapMode,
414  };
415 
425  bool asLegacyBitmap(SkBitmap*, LegacyBitmapMode) const;
426 
431  bool isLazyGenerated() const;
432 
433 
434 #ifdef SK_SUPPORT_LEGACY_IMAGEFACTORY
435  static SkImage* NewRasterCopy(const Info&, const void* pixels, size_t rowBytes,
436  SkColorTable* ctable = nullptr);
437  static SkImage* NewRasterData(const Info&, SkData* pixels, size_t rowBytes);
438  static SkImage* NewFromRaster(const Info&, const void* pixels, size_t rowBytes,
439  RasterReleaseProc, ReleaseContext);
440  static SkImage* NewFromBitmap(const SkBitmap&);
441  static SkImage* NewFromGenerator(SkImageGenerator*, const SkIRect* subset = nullptr);
442  static SkImage* NewFromEncoded(SkData* encoded, const SkIRect* subset = nullptr);
443  static SkImage* NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc) {
444  return NewFromTexture(ctx, desc, kPremul_SkAlphaType, nullptr, nullptr);
445  }
446 
447  static SkImage* NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& de, SkAlphaType at) {
448  return NewFromTexture(ctx, de, at, nullptr, nullptr);
449  }
450  static SkImage* NewFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType,
451  TextureReleaseProc, ReleaseContext);
452  static SkImage* NewFromAdoptedTexture(GrContext*, const GrBackendTextureDesc&,
453  SkAlphaType = kPremul_SkAlphaType);
454  static SkImage* NewFromYUVTexturesCopy(GrContext*, SkYUVColorSpace,
455  const GrBackendObject yuvTextureHandles[3],
456  const SkISize yuvSizes[3],
457  GrSurfaceOrigin);
458  static SkImage* NewFromPicture(const SkPicture*, const SkISize& dimensions,
459  const SkMatrix*, const SkPaint*);
460  static SkImage* NewTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted);
461  static SkImage* NewFromDeferredTextureImageData(GrContext*, const void*, SkBudgeted);
462 
463  SkImage* newSubset(const SkIRect& subset) const { return this->makeSubset(subset).release(); }
464  SkImage* newTextureImage(GrContext* ctx) const { return this->makeTextureImage(ctx).release(); }
465 #endif
466 
467 protected:
468  SkImage(int width, int height, uint32_t uniqueID);
469 
470 private:
471  static sk_sp<SkImage> MakeTextureFromMipMap(GrContext*, const SkImageInfo&,
472  const GrMipLevel* texels, int mipLevelCount,
473  SkBudgeted);
474 
475  const int fWidth;
476  const int fHeight;
477  const uint32_t fUniqueID;
478 
479  typedef SkRefCnt INHERITED;
480 };
481 
482 #endif
CachingHint
Hints to image calls where the system might cache computed intermediates (e.g.
Definition: SkImage.h:245
A Canvas encapsulates all of the state about drawing into a device (bitmap).
Definition: SkCanvas.h:58
Definition: GrTypes.h:557
Describe an image's dimensions and pixel type.
Definition: SkImageInfo.h:181
Shaders specify the source color(s) for what is being drawn.
Definition: SkShader.h:38
SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by 8-bit bitmaps...
Definition: SkColorTable.h:25
An interface that allows a purgeable PixelRef (such as a SkDiscardablePixelRef) to decode and re-deco...
Definition: SkImageGenerator.h:62
Pairs SkImageInfo with actual pixels and rowbytes.
Definition: SkPixmap.h:23
static sk_sp< SkImage > MakeFromTexture(GrContext *ctx, const GrBackendTextureDesc &desc)
Create a new image from the specified descriptor.
Definition: SkImage.h:92
The SkMatrix class holds a 3x3 matrix for transforming coordinates.
Definition: SkMatrix.h:26
SkSurface represents the backend/results of drawing to a canvas.
Definition: SkSurface.h:31
Definition: SkRefCnt.h:135
The SkPaint class holds the style and color information about how to draw geometries, text and bitmaps.
Definition: SkPaint.h:46
An SkPicture records drawing commands made to a canvas to be played back at a later time...
Definition: SkPicture.h:38
SkData holds an immutable data buffer.
Definition: SkData.h:22
static sk_sp< SkImage > MakeFromTexture(GrContext *ctx, const GrBackendTextureDesc &desc, SkAlphaType at, TextureReleaseProc trp, ReleaseContext rc)
Create a new image from the specified descriptor.
Definition: SkImage.h:110
The SkBitmap class specifies a raster bitmap.
Definition: SkBitmap.h:41
Base class for image filters.
Definition: SkImageFilter.h:35
Definition: GrTypes.h:459
Definition: GrContext.h:48
Interface for serializing pixels, e.g.
Definition: SkPixelSerializer.h:19
TileMode
Definition: SkShader.h:51
SkIRect holds four 32 bit integer coordinates for a rectangle.
Definition: SkRect.h:20
Definition: GrTexture.h:19
SkImage is an abstraction for drawing a rectagle of pixels, though the particular type of image could...
Definition: SkImage.h:45
SkIPoint holds two 32 bit integer coordinates.
Definition: SkPoint.h:40
Drawing params for which a deferred texture image data should be optimized.
Definition: SkImage.h:367
Light weight class for managing strings.
Definition: SkString.h:121
Can be used to perform actions related to the generating GrContext in a thread safe manner...
Definition: GrContext.h:481