1 /* 2 * Copyright 2016 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 SkSpecialSurface_DEFINED 9 #define SkSpecialSurface_DEFINED 10 11 #include "include/core/SkImageInfo.h" 12 #include "include/core/SkRefCnt.h" 13 #include "include/core/SkSurfaceProps.h" 14 15 #if SK_SUPPORT_GPU 16 #include "include/private/GrTypesPriv.h" 17 #endif 18 19 class GrBackendFormat; 20 class GrContext; 21 class GrRecordingContext; 22 class SkBitmap; 23 class SkCanvas; 24 class SkSpecialImage; 25 26 /** 27 * SkSpecialSurface is a restricted form of SkSurface solely for internal use. It differs 28 * from SkSurface in that: 29 * - it can be backed by GrTextures larger than [ fWidth, fHeight ] 30 * - it can't be used for tiling 31 * - it becomes inactive once a snapshot of it is taken (i.e., no copy-on-write) 32 * - it has no generation ID 33 */ 34 class SkSpecialSurface : public SkRefCnt { 35 public: props()36 const SkSurfaceProps& props() const { return fProps; } 37 width()38 int width() const { return fSubset.width(); } height()39 int height() const { return fSubset.height(); } 40 41 /** 42 * Return a canvas that will draw into this surface. This will always 43 * return the same canvas for a given surface, and is managed/owned by the 44 * surface. 45 * 46 * The canvas will be invalid after 'newImageSnapshot' is called. 47 */ 48 SkCanvas* getCanvas(); 49 50 /** 51 * Returns an image of the current state of the surface pixels up to this 52 * point. The canvas returned by 'getCanvas' becomes invalidated by this 53 * call and no more drawing to this surface is allowed. 54 * 55 * Note: the caller inherits a ref from this call that must be balanced 56 */ 57 sk_sp<SkSpecialImage> makeImageSnapshot(); 58 59 #if SK_SUPPORT_GPU 60 /** 61 * Allocate a new GPU-backed SkSpecialSurface. If the requested surface cannot 62 * be created, nullptr will be returned. 63 */ 64 static sk_sp<SkSpecialSurface> MakeRenderTarget(GrRecordingContext*, int width, int height, 65 GrColorType, sk_sp<SkColorSpace> colorSpace, 66 const SkSurfaceProps* = nullptr); 67 #endif 68 69 /** 70 * Use and existing SkBitmap as the backing store. 71 */ 72 static sk_sp<SkSpecialSurface> MakeFromBitmap(const SkIRect& subset, SkBitmap& bm, 73 const SkSurfaceProps* = nullptr); 74 75 /** 76 * Return a new CPU-backed surface, with the memory for the pixels automatically 77 * allocated. 78 * 79 * If the requested surface cannot be created, or the request is not a 80 * supported configuration, nullptr will be returned. 81 */ 82 static sk_sp<SkSpecialSurface> MakeRaster(const SkImageInfo&, 83 const SkSurfaceProps* = nullptr); 84 85 protected: 86 SkSpecialSurface(const SkIRect& subset, const SkSurfaceProps*); 87 88 // For testing only 89 friend class TestingSpecialSurfaceAccess; subset()90 const SkIRect& subset() const { return fSubset; } 91 92 private: 93 const SkSurfaceProps fProps; 94 const SkIRect fSubset; 95 96 typedef SkRefCnt INHERITED; 97 }; 98 99 #endif 100