Home | History | Annotate | Download | only in core
      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 SkSurface_DEFINED
      9 #define SkSurface_DEFINED
     10 
     11 #include "SkRefCnt.h"
     12 #include "SkImage.h"
     13 #include "SkSurfaceProps.h"
     14 
     15 #include "GrTypes.h"
     16 
     17 class SkCanvas;
     18 class SkDeferredDisplayList;
     19 class SkPaint;
     20 class SkSurfaceCharacterization;
     21 class GrBackendRenderTarget;
     22 class GrBackendSemaphore;
     23 class GrContext;
     24 class GrRenderTarget;
     25 
     26 /** \class SkSurface
     27     SkSurface is responsible for managing the pixels that a canvas draws into. The pixels can be
     28     allocated either in CPU memory (a raster surface) or on the GPU (a GrRenderTarget surface).
     29     SkSurface takes care of allocating a SkCanvas that will draw into the surface. Call
     30     surface->getCanvas() to use that canvas (but don't delete it, it is owned by the surface).
     31     SkSurface always has non-zero dimensions. If there is a request for a new surface, and either
     32     of the requested dimensions are zero, then nullptr will be returned.
     33 */
     34 class SK_API SkSurface : public SkRefCnt {
     35 public:
     36 
     37     /** Allocates raster SkSurface. SkCanvas returned by SkSurface draws directly into pixels.
     38 
     39         SkSurface is returned if all parameters are valid.
     40         Valid parameters include:
     41         info dimensions are greater than zero;
     42         info contains SkColorType and SkAlphaType supported by raster surface;
     43         pixels is not nullptr;
     44         rowBytes is large enough to contain info width pixels of SkColorType.
     45 
     46         Pixel buffer size should be info height times computed rowBytes.
     47         Pixels are not initialized.
     48         To access pixels after drawing, call flush() or peekPixels().
     49 
     50         @param imageInfo     width, height, SkColorType, SkAlphaType, SkColorSpace,
     51                              of raster surface; width and height must be greater than zero
     52         @param pixels        pointer to destination pixels buffer
     53         @param rowBytes      interval from one SkSurface row to the next
     54         @param surfaceProps  LCD striping orientation and setting for device independent fonts;
     55                              may be nullptr
     56         @return              SkSurface if all parameters are valid; otherwise, nullptr
     57     */
     58     static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels,
     59                                              size_t rowBytes,
     60                                              const SkSurfaceProps* surfaceProps = nullptr);
     61 
     62     /** Allocates raster SkSurface. SkCanvas returned by SkSurface draws directly into pixels.
     63         releaseProc is called with pixels and context when SkSurface is deleted.
     64 
     65         SkSurface is returned if all parameters are valid.
     66         Valid parameters include:
     67         info dimensions are greater than zero;
     68         info contains SkColorType and SkAlphaType supported by raster surface;
     69         pixels is not nullptr;
     70         rowBytes is large enough to contain info width pixels of SkColorType.
     71 
     72         Pixel buffer size should be info height times computed rowBytes.
     73         Pixels are not initialized.
     74         To access pixels after drawing, call flush() or peekPixels().
     75 
     76         @param imageInfo     width, height, SkColorType, SkAlphaType, SkColorSpace,
     77                              of raster surface; width and height must be greater than zero
     78         @param pixels        pointer to destination pixels buffer
     79         @param rowBytes      interval from one SkSurface row to the next
     80         @param releaseProc   called when SkSurface is deleted; may be nullptr
     81         @param context       passed to releaseProc; may be nullptr
     82         @param surfaceProps  LCD striping orientation and setting for device independent fonts;
     83                              may be nullptr
     84         @return              SkSurface if all parameters are valid; otherwise, nullptr
     85     */
     86     static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pixels,
     87                                     size_t rowBytes,
     88                                     void (*releaseProc)(void* pixels, void* context),
     89                                     void* context, const SkSurfaceProps* surfaceProps = nullptr);
     90 
     91     /** Allocates raster SkSurface. SkCanvas returned by SkSurface draws directly into pixels.
     92         Allocates and zeroes pixel memory. Pixel memory size is imageInfo.height() times
     93         rowBytes, or times imageInfo.minRowBytes() if rowBytes is zero.
     94         Pixel memory is deleted when SkSurface is deleted.
     95 
     96         SkSurface is returned if all parameters are valid.
     97         Valid parameters include:
     98         info dimensions are greater than zero;
     99         info contains SkColorType and SkAlphaType supported by raster surface;
    100         rowBytes is large enough to contain info width pixels of SkColorType, or is zero.
    101 
    102         If rowBytes is not zero, subsequent images returned by makeImageSnapshot()
    103         have the same rowBytes.
    104 
    105         @param imageInfo     width, height, SkColorType, SkAlphaType, SkColorSpace,
    106                              of raster surface; width and height must be greater than zero
    107         @param rowBytes      interval from one SkSurface row to the next; may be zero
    108         @param surfaceProps  LCD striping orientation and setting for device independent fonts;
    109                              may be nullptr
    110         @return              SkSurface if all parameters are valid; otherwise, nullptr
    111     */
    112     static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes,
    113                                        const SkSurfaceProps* surfaceProps);
    114 
    115     /** Allocates raster SkSurface. SkCanvas returned by SkSurface draws directly into pixels.
    116         Allocates and zeroes pixel memory. Pixel memory size is imageInfo.height() times
    117         imageInfo.minRowBytes().
    118         Pixel memory is deleted when SkSurface is deleted.
    119 
    120         SkSurface is returned if all parameters are valid.
    121         Valid parameters include:
    122         info dimensions are greater than zero;
    123         info contains SkColorType and SkAlphaType supported by raster surface.
    124 
    125         @param imageInfo  width, height, SkColorType, SkAlphaType, SkColorSpace,
    126                           of raster surface; width and height must be greater than zero
    127         @param props      LCD striping orientation and setting for device independent fonts;
    128                           may be nullptr
    129         @return           SkSurface if all parameters are valid; otherwise, nullptr
    130     */
    131     static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo,
    132                                        const SkSurfaceProps* props = nullptr) {
    133         return MakeRaster(imageInfo, 0, props);
    134     }
    135 
    136     /** Allocates raster SkSurface. SkCanvas returned by SkSurface draws directly into pixels.
    137         Allocates and zeroes pixel memory. Pixel memory size is height times width times
    138         four. Pixel memory is deleted when SkSurface is deleted.
    139 
    140         Internally, sets SkImageInfo to width, height, native SkColorType, and
    141         kPremul_SkAlphaType.
    142 
    143         SkSurface is returned if width and height are greater than zero.
    144 
    145         Use to create SkSurface that matches SkPMColor, the native pixel arrangement on
    146         the platform. SkSurface drawn to output device skips converting its pixel format.
    147 
    148         @param width         pixel column count; must be greater than zero
    149         @param height        pixel row count; must be greater than zero
    150         @param surfaceProps  LCD striping orientation and setting for device independent
    151                              fonts; may be nullptr
    152         @return              SkSurface if all parameters are valid; otherwise, nullptr
    153     */
    154     static sk_sp<SkSurface> MakeRasterN32Premul(int width, int height,
    155                                                 const SkSurfaceProps* surfaceProps = nullptr) {
    156         return MakeRaster(SkImageInfo::MakeN32Premul(width, height), surfaceProps);
    157     }
    158 
    159     /** Wraps a GPU-backed texture into SkSurface. Caller must ensure the texture is
    160         valid for the lifetime of returned SkSurface. If sampleCnt greater than zero,
    161         creates an intermediate MSAA SkSurface which is used for drawing backendTexture.
    162 
    163         SkSurface is returned if all parameters are valid. backendTexture is valid if
    164         its pixel configuration agrees with colorSpace and context; for instance, if
    165         backendTexture has an sRGB configuration, then context must support sRGB,
    166         and colorSpace must be present. Further, backendTexture width and height must
    167         not exceed context capabilities, and the context must be able to support
    168         back-end textures.
    169 
    170         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    171 
    172         @param context         GPU context
    173         @param backendTexture  texture residing on GPU
    174         @param origin          one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    175         @param sampleCnt       samples per pixel, or 0 to disable full scene anti-aliasing
    176         @param colorSpace      range of colors
    177         @param surfaceProps    LCD striping orientation and setting for device independent
    178                                fonts; may be nullptr
    179         @return                SkSurface if all parameters are valid; otherwise, nullptr
    180     */
    181     static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context,
    182                                                    const GrBackendTexture& backendTexture,
    183                                                    GrSurfaceOrigin origin, int sampleCnt,
    184                                                    sk_sp<SkColorSpace> colorSpace,
    185                                                    const SkSurfaceProps* surfaceProps);
    186 
    187     /** Wraps a GPU-backed texture into SkSurface. Caller must ensure the texture is
    188         valid for the lifetime of returned SkSurface. If sampleCnt greater than zero,
    189         creates an intermediate MSAA SkSurface which is used for drawing backendTexture.
    190 
    191         SkSurface is returned if all parameters are valid. backendTexture is valid if
    192         its pixel configuration agrees with colorSpace and context; for instance, if
    193         backendTexture has an sRGB configuration, then context must support sRGB,
    194         and colorSpace must be present. Further, backendTexture width and height must
    195         not exceed context capabilities, and the context must be able to support
    196         back-end textures.
    197 
    198         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    199 
    200         @param context         GPU context
    201         @param backendTexture  texture residing on GPU
    202         @param origin          one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    203         @param sampleCnt       samples per pixel, or 0 to disable full scene anti-aliasing
    204         @param colorType       one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
    205                                kRGB_565_SkColorType, kARGB_4444_SkColorType,
    206                                kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
    207                                kGray_8_SkColorType, kRGBA_F16_SkColorType
    208         @param colorSpace      range of colors
    209         @param surfaceProps    LCD striping orientation and setting for device independent
    210                                fonts; may be nullptr
    211         @return                SkSurface if all parameters are valid; otherwise, nullptr
    212     */
    213     static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context,
    214                                                    const GrBackendTexture& backendTexture,
    215                                                    GrSurfaceOrigin origin, int sampleCnt,
    216                                                    SkColorType colorType,
    217                                                    sk_sp<SkColorSpace> colorSpace,
    218                                                    const SkSurfaceProps* surfaceProps);
    219 
    220     /** Wraps a GPU-backed buffer into SkSurface. Caller must ensure render target is
    221         valid for the lifetime of returned SkSurface.
    222 
    223         SkSurface is returned if all parameters are valid. backendRenderTarget is valid if
    224         its pixel configuration agrees with colorSpace and context; for instance, if
    225         backendRenderTarget has an sRGB configuration, then context must support sRGB,
    226         and colorSpace must be present. Further, backendRenderTarget width and height must
    227         not exceed context capabilities, and the context must be able to support
    228         back-end render targets.
    229 
    230         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    231 
    232         @param context              GPU context
    233         @param backendRenderTarget  GPU intermediate memory buffer
    234         @param origin               one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    235         @param colorSpace           range of colors
    236         @param surfaceProps         LCD striping orientation and setting for device independent
    237                                     fonts; may be nullptr
    238         @return                     SkSurface if all parameters are valid; otherwise, nullptr
    239     */
    240     static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context,
    241                                                 const GrBackendRenderTarget& backendRenderTarget,
    242                                                 GrSurfaceOrigin origin,
    243                                                 sk_sp<SkColorSpace> colorSpace,
    244                                                 const SkSurfaceProps* surfaceProps);
    245 
    246     /** Wraps a GPU-backed buffer into SkSurface. Caller must ensure render target is
    247         valid for the lifetime of returned SkSurface.
    248 
    249         SkSurface is returned if all parameters are valid. backendRenderTarget is valid if
    250         its pixel configuration agrees with colorSpace and context; for instance, if
    251         backendRenderTarget has an sRGB configuration, then context must support sRGB,
    252         and colorSpace must be present. Further, backendRenderTarget width and height must
    253         not exceed context capabilities, and the context must be able to support
    254         back-end render targets.
    255 
    256         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    257 
    258         @param context              GPU context
    259         @param backendRenderTarget  GPU intermediate memory buffer
    260         @param origin               one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    261         @param colorType            one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
    262                                     kRGB_565_SkColorType, kARGB_4444_SkColorType,
    263                                     kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
    264                                     kGray_8_SkColorType, kRGBA_F16_SkColorType
    265         @param colorSpace           range of colors
    266         @param surfaceProps         LCD striping orientation and setting for device independent
    267                                     fonts; may be nullptr
    268         @return                     SkSurface if all parameters are valid; otherwise, nullptr
    269     */
    270     static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context,
    271                                                 const GrBackendRenderTarget& backendRenderTarget,
    272                                                 GrSurfaceOrigin origin,
    273                                                 SkColorType colorType,
    274                                                 sk_sp<SkColorSpace> colorSpace,
    275                                                 const SkSurfaceProps* surfaceProps);
    276 
    277     /** Used to wrap a GPU-backed texture as a SkSurface. Skia will treat the texture as
    278         a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own
    279         the associated render target objects (but not the provided texture). Skia will not assume
    280         ownership of the texture and the client must ensure the texture is valid for the lifetime
    281         of the SkSurface.
    282 
    283         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    284 
    285         @param context         GPU context
    286         @param backendTexture  texture residing on GPU
    287         @param origin          one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    288         @param sampleCnt       samples per pixel, or 0 to disable full scene anti-aliasing
    289         @param colorSpace      range of colors
    290         @param surfaceProps    LCD striping orientation and setting for device independent
    291                                fonts; may be nullptr
    292         @return                SkSurface if all parameters are valid; otherwise, nullptr
    293     */
    294     static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context,
    295                                                             const GrBackendTexture& backendTexture,
    296                                                             GrSurfaceOrigin origin,
    297                                                             int sampleCnt,
    298                                                             sk_sp<SkColorSpace> colorSpace,
    299                                                             const SkSurfaceProps* surfaceProps);
    300 
    301     /** Used to wrap a GPU-backed texture as a SkSurface. Skia will treat the texture as
    302         a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own
    303         the associated render target objects (but not the provided texture). Skia will not assume
    304         ownership of the texture and the client must ensure the texture is valid for the lifetime
    305         of the SkSurface.
    306 
    307         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    308 
    309         @param context         GPU context
    310         @param backendTexture  texture residing on GPU
    311         @param origin          one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    312         @param sampleCnt       samples per pixel, or 0 to disable full scene anti-aliasing
    313         @param colorType       one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
    314                                kRGB_565_SkColorType, kARGB_4444_SkColorType,
    315                                kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
    316                                kGray_8_SkColorType, kRGBA_F16_SkColorType
    317         @param colorSpace      range of colors
    318         @param surfaceProps    LCD striping orientation and setting for device independent
    319                                fonts; may be nullptr
    320         @return                SkSurface if all parameters are valid; otherwise, nullptr
    321     */
    322     static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context,
    323                                                             const GrBackendTexture& backendTexture,
    324                                                             GrSurfaceOrigin origin,
    325                                                             int sampleCnt,
    326                                                             SkColorType colorType,
    327                                                             sk_sp<SkColorSpace> colorSpace,
    328                                                             const SkSurfaceProps* surfaceProps);
    329 
    330     /** Returns SkSurface on GPU indicated by context. Allocates memory for
    331         pixels, based on the width, height, and SkColorType in ImageInfo.  budgeted
    332         selects whether allocation for pixels is tracked by context. imageInfo
    333         describes the pixel format in SkColorType, and transparency in
    334         SkAlphaType, and color matching in SkColorSpace.
    335 
    336         sampleCount requests the number of samples per pixel.
    337         Pass zero to disable Multi_Sample_Anti_Aliasing.  The request is rounded
    338         up to the next supported count, or rounded down if it is larger than the
    339         maximum supported count.
    340 
    341         surfaceOrigin pins either the top-left or the bottom-left corner to the origin.
    342 
    343         shouldCreateWithMips hints that SkImage returned by makeImageSnapshot() is Mip_Map.
    344 
    345         If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
    346 
    347         @param context               GPU context
    348         @param budgeted              one of: SkBudgeted::kNo, SkBudgeted::kYes
    349         @param imageInfo             width, height, SkColorType, SkAlphaType, SkColorSpace;
    350                                      width, or height, or both, may be zero
    351         @param sampleCount           samples per pixel, or 0 to disable full scene anti-aliasing
    352         @param surfaceOrigin         one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
    353         @param surfaceProps          LCD striping orientation and setting for device independent
    354                                      fonts; may be nullptr
    355         @param shouldCreateWithMips  hint that SkSurface will host Mip_Map images
    356         @return                      SkSurface if all parameters are valid; otherwise, nullptr
    357     */
    358     static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
    359                                              const SkImageInfo& imageInfo,
    360                                              int sampleCount, GrSurfaceOrigin surfaceOrigin,
    361                                              const SkSurfaceProps* surfaceProps,
    362                                              bool shouldCreateWithMips = false);
    363 
    364     /** Returns SkSurface on GPU indicated by context. Allocates memory for
    365         pixels, based on the width, height, and SkColorType in ImageInfo.  budgeted
    366         selects whether allocation for pixels is tracked by context. imageInfo
    367         describes the pixel format in SkColorType, and transparency in
    368         SkAlphaType, and color matching in SkColorSpace.
    369 
    370         sampleCount requests the number of samples per pixel.
    371         Pass zero to disable Multi_Sample_Anti_Aliasing.  The request is rounded
    372         up to the next supported count, or rounded down if it is larger than the
    373         maximum supported count.
    374 
    375         SkSurface bottom-left corner is pinned to the origin.
    376 
    377         @param context      GPU context
    378         @param budgeted     one of: SkBudgeted::kNo, SkBudgeted::kYes
    379         @param imageInfo    width, height, SkColorType, SkAlphaType, SkColorSpace,
    380                             of raster surface; width, or height, or both, may be zero
    381         @param sampleCount  samples per pixel, or 0 to disable Multi_Sample_Anti_Aliasing
    382         @param props        LCD striping orientation and setting for device independent
    383                             fonts; may be nullptr
    384         @return             SkSurface if all parameters are valid; otherwise, nullptr
    385     */
    386     static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
    387                                              const SkImageInfo& imageInfo, int sampleCount,
    388                                              const SkSurfaceProps* props) {
    389         return MakeRenderTarget(context, budgeted, imageInfo, sampleCount,
    390                                 kBottomLeft_GrSurfaceOrigin, props);
    391     }
    392 
    393     /** Returns SkSurface on GPU indicated by context. Allocates memory for
    394         pixels, based on the width, height, and SkColorType in ImageInfo.  budgeted
    395         selects whether allocation for pixels is tracked by context. imageInfo
    396         describes the pixel format in SkColorType, and transparency in
    397         SkAlphaType, and color matching in SkColorSpace.
    398 
    399         SkSurface bottom-left corner is pinned to the origin.
    400 
    401         @param context    GPU context
    402         @param budgeted   one of: SkBudgeted::kNo, SkBudgeted::kYes
    403         @param imageInfo  width, height, SkColorType, SkAlphaType, SkColorSpace,
    404                           of raster surface; width, or height, or both, may be zero
    405         @return           SkSurface if all parameters are valid; otherwise, nullptr
    406     */
    407     static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
    408                                              const SkImageInfo& imageInfo) {
    409         if (!imageInfo.width() || !imageInfo.height()) {
    410             return nullptr;
    411         }
    412         return MakeRenderTarget(context, budgeted, imageInfo, 0, kBottomLeft_GrSurfaceOrigin,
    413                                 nullptr);
    414     }
    415 
    416     /** Returns SkSurface without backing pixels. Drawing to SkCanvas returned from SkSurface
    417         has no effect. Calling makeImageSnapshot() on returned SkSurface returns nullptr.
    418 
    419         @param width   one or greater
    420         @param height  one or greater
    421         @return        SkSurface if width and height are positive; otherwise, nullptr
    422     */
    423     static sk_sp<SkSurface> MakeNull(int width, int height);
    424 
    425     /** Returns pixel count in each row; may be zero or greater.
    426 
    427         @return  number of pixel columns
    428     */
    429     int width() const { return fWidth; }
    430 
    431     /** Returns pixel row count; may be zero or greater.
    432 
    433         @return  number of pixel rows
    434     */
    435     int height() const { return fHeight; }
    436 
    437     /** Returns unique value identifying the content of SkSurface. Returned value changes
    438         each time the content changes. Content is changed by drawing, or by calling
    439         notifyContentWillChange().
    440 
    441         @return  unique content identifier
    442     */
    443     uint32_t generationID();
    444 
    445     /** \enum SkSurface::ContentChangeMode
    446         ContentChangeMode members are parameters to notifyContentWillChange().
    447     */
    448     enum ContentChangeMode {
    449         kDiscard_ContentChangeMode, //!< the surface is cleared or overwritten.
    450 
    451         /** If a snapshot has been generated, this copies the SkSurface contents. */
    452         kRetain_ContentChangeMode,
    453     };
    454 
    455     /** Notifies that SkSurface contents will be changed by code outside of Skia.
    456         Subsequent calls to generationID() return a different value.
    457 
    458         mode is normally passed as kRetain_ContentChangeMode.
    459         CAN WE DEPRECATE THIS?
    460 
    461         @param mode  one of: kDiscard_ContentChangeMode, kRetain_ContentChangeMode
    462     */
    463     void notifyContentWillChange(ContentChangeMode mode);
    464 
    465     enum BackendHandleAccess {
    466         kFlushRead_BackendHandleAccess,    //!< Caller may read from the back-end object.
    467         kFlushWrite_BackendHandleAccess,   //!< Caller may write to the back-end object.
    468         kDiscardWrite_BackendHandleAccess, //!< Caller must overwrite the entire back-end object.
    469     };
    470 
    471     /** Deprecated.
    472     */
    473     static const BackendHandleAccess kFlushRead_TextureHandleAccess =
    474             kFlushRead_BackendHandleAccess;
    475 
    476     /** Deprecated.
    477     */
    478     static const BackendHandleAccess kFlushWrite_TextureHandleAccess =
    479             kFlushWrite_BackendHandleAccess;
    480 
    481     /** Deprecated.
    482     */
    483     static const BackendHandleAccess kDiscardWrite_TextureHandleAccess =
    484             kDiscardWrite_BackendHandleAccess;
    485 
    486     /** Returns the GPU back-end reference of the texture used by SkSurface, or zero
    487         if SkSurface is not backed by a GPU texture.
    488 
    489         The returned texture handle is only valid until the next draw into SkSurface,
    490         or when SkSurface is deleted.
    491 
    492         @param backendHandleAccess  one of:  kFlushRead_BackendHandleAccess,
    493                                     kFlushWrite_BackendHandleAccess, kDiscardWrite_BackendHandleAccess
    494         @return                     GPU texture reference
    495     */
    496     GrBackendObject getTextureHandle(BackendHandleAccess backendHandleAccess);
    497 
    498     /** Returns true and stores the GPU back-end reference of the render target used
    499         by SkSurface in backendObject.
    500 
    501         Return false if SkSurface is not backed by a GPU render target, and leaves
    502         backendObject unchanged.
    503 
    504         The returned render target handle is only valid until the next draw into SkSurface,
    505         or when SkSurface is deleted.
    506 
    507         In OpenGL this returns the frame buffer object ID.
    508 
    509         @param backendObject        GPU intermediate memory buffer
    510         @param backendHandleAccess  one of:  kFlushRead_BackendHandleAccess,
    511                                     kFlushWrite_BackendHandleAccess, kDiscardWrite_BackendHandleAccess
    512         @return                     true if SkSurface is backed by GPU texture
    513     */
    514     bool getRenderTargetHandle(GrBackendObject* backendObject,
    515                                BackendHandleAccess backendHandleAccess);
    516 
    517     /** Returns SkCanvas that draws into SkSurface. Subsequent calls return the same SkCanvas.
    518         SkCanvas returned is managed and owned by SkSurface, and is deleted when SkSurface
    519         is deleted.
    520 
    521         @return  drawing SkCanvas for SkSurface
    522     */
    523     SkCanvas* getCanvas();
    524 
    525     /** Returns a compatible SkSurface, or nullptr. Returned SkSurface contains
    526         the same raster, GPU, or null properties as the original. Returned SkSurface
    527         does not share the same pixels.
    528 
    529         Returns nullptr if imageInfo width or height are zero, or if imageInfo
    530         is incompatible with SkSurface.
    531 
    532         @param imageInfo  width, height, SkColorType, SkAlphaType, SkColorSpace,
    533                           of SkSurface; width and height must be greater than zero
    534         @return           compatible SkSurface or nullptr
    535     */
    536     sk_sp<SkSurface> makeSurface(const SkImageInfo& imageInfo);
    537 
    538     /** Returns SkImage capturing SkSurface contents. Subsequent drawing to SkSurface contents
    539         are not captured. SkImage allocation is accounted for if SkSurface was created with
    540         SkBudgeted::kYes.
    541 
    542         @return  SkImage initialized with SkSurface contents
    543     */
    544     sk_sp<SkImage> makeImageSnapshot();
    545 
    546     /** Draws SkSurface contents to canvas, with its top-left corner at (x, y).
    547 
    548         If SkPaint paint is not nullptr, apply SkColorFilter, color alpha, SkImageFilter,
    549         SkBlendMode, and SkDrawLooper.
    550 
    551         @param canvas  SkCanvas drawn into
    552         @param x       horizontal offset in SkCanvas
    553         @param y       vertical offset in SkCanvas
    554         @param paint   SkPaint containing SkBlendMode, SkColorFilter, SkImageFilter,
    555                        and so on; or nullptr
    556     */
    557     void draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint);
    558 
    559     /** Copies SkSurface pixel address, row bytes, and SkImageInfo to SkPixmap, if address
    560         is available, and returns true. If pixel address is not available, return
    561         false and leave SkPixmap unchanged.
    562 
    563         pixmap contents become invalid on any future change to SkSurface.
    564 
    565         @param pixmap  storage for pixel state if pixels are readable; otherwise, ignored
    566         @return        true if SkSurface has direct access to pixels
    567     */
    568     bool peekPixels(SkPixmap* pixmap);
    569 
    570     /** Copies SkRect of pixels to dst.
    571 
    572         Source SkRect corners are (srcX, srcY) and SkSurface (width(), height()).
    573         Destination SkRect corners are (0, 0) and (dst.width(), dst.height()).
    574         Copies each readable pixel intersecting both rectangles, without scaling,
    575         converting to dst.colorType() and dst.alphaType() if required.
    576 
    577         Pixels are readable when SkSurface is raster, or backed by a GPU.
    578 
    579         The destination pixel storage must be allocated by the caller.
    580 
    581         Pixel values are converted only if SkColorType and SkAlphaType
    582         do not match. Only pixels within both source and destination rectangles
    583         are copied. dst contents outside SkRect intersection are unchanged.
    584 
    585         Pass negative values for srcX or srcY to offset pixels across or down destination.
    586 
    587         Does not copy, and returns false if:
    588         - Source and destination rectangles do not intersect.
    589         - SkPixmap pixels could not be allocated.
    590         - dst.rowBytes() is too small to contain one row of pixels.
    591 
    592         @param dst   storage for pixels copied from SkSurface
    593         @param srcX  offset into readable pixels in x; may be negative
    594         @param srcY  offset into readable pixels in y; may be negative
    595         @return      true if pixels were copied
    596     */
    597     bool readPixels(const SkPixmap& dst, int srcX, int srcY);
    598 
    599     /** Copies SkRect of pixels from SkCanvas into dstPixels.
    600 
    601         Source SkRect corners are (srcX, srcY) and SkSurface (width(), height()).
    602         Destination SkRect corners are (0, 0) and (dstInfo.width(), dstInfo.height()).
    603         Copies each readable pixel intersecting both rectangles, without scaling,
    604         converting to dstInfo.colorType() and dstInfo.alphaType() if required.
    605 
    606         Pixels are readable when SkSurface is raster, or backed by a GPU.
    607 
    608         The destination pixel storage must be allocated by the caller.
    609 
    610         Pixel values are converted only if SkColorType and SkAlphaType
    611         do not match. Only pixels within both source and destination rectangles
    612         are copied. dstPixels contents outside SkRect intersection are unchanged.
    613 
    614         Pass negative values for srcX or srcY to offset pixels across or down destination.
    615 
    616         Does not copy, and returns false if:
    617         - Source and destination rectangles do not intersect.
    618         - SkSurface pixels could not be converted to dstInfo.colorType() or dstInfo.alphaType().
    619         - dstRowBytes is too small to contain one row of pixels.
    620 
    621         @param dstInfo      width, height, SkColorType, and SkAlphaType of dstPixels
    622         @param dstPixels    storage for pixels; dstInfo.height() times dstRowBytes, or larger
    623         @param dstRowBytes  size of one destination row; dstInfo.width() times pixel size, or larger
    624         @param srcX         offset into readable pixels in x; may be negative
    625         @param srcY         offset into readable pixels in y; may be negative
    626         @return             true if pixels were copied
    627     */
    628     bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
    629                     int srcX, int srcY);
    630 
    631     /** Copies SkRect of pixels from SkSurface into bitmap.
    632 
    633         Source SkRect corners are (srcX, srcY) and SkSurface (width(), height()).
    634         Destination SkRect corners are (0, 0) and (bitmap.width(), bitmap.height()).
    635         Copies each readable pixel intersecting both rectangles, without scaling,
    636         converting to bitmap.colorType() and bitmap.alphaType() if required.
    637 
    638         Pixels are readable when SkSurface is raster, or backed by a GPU.
    639 
    640         The destination pixel storage must be allocated by the caller.
    641 
    642         Pixel values are converted only if SkColorType and SkAlphaType
    643         do not match. Only pixels within both source and destination rectangles
    644         are copied. dst contents outside SkRect intersection are unchanged.
    645 
    646         Pass negative values for srcX or srcY to offset pixels across or down destination.
    647 
    648         Does not copy, and returns false if:
    649         - Source and destination rectangles do not intersect.
    650         - SkSurface pixels could not be converted to dst.colorType() or dst.alphaType().
    651         - dst pixels could not be allocated.
    652         - dst.rowBytes() is too small to contain one row of pixels.
    653 
    654         @param dst   storage for pixels copied from SkSurface
    655         @param srcX  offset into readable pixels in x; may be negative
    656         @param srcY  offset into readable pixels in y; may be negative
    657         @return      true if pixels were copied
    658     */
    659     bool readPixels(const SkBitmap& dst, int srcX, int srcY);
    660 
    661     /** Copies SkRect of pixels from the src SkPixmap to the SkSurface.
    662 
    663         Source SkRect corners are (0, 0) and (src.width(), src.height()).
    664         Destination SkRect corners are (dstX, dstY) and (dstX + Surface width(), dstY + Surface height()).
    665         Copies each readable pixel intersecting both rectangles, without scaling,
    666         converting to SkSurface colorType() and SkSurface alphaType() if required.
    667 
    668         @param src   storage for pixels to copy to SkSurface
    669         @param dstX  x position relative to SkSurface to begin copy; may be negative
    670         @param dstY  x position relative to SkSurface to begin copy; may be negative
    671     */
    672     void writePixels(const SkPixmap& src, int dstX, int dstY);
    673 
    674     /** Copies SkRect of pixels from the src SkBitmap to the SkSurface.
    675 
    676         Source SkRect corners are (0, 0) and (src.width(), src.height()).
    677         Destination SkRect corners are (dstX, dstY) and (dstX + Surface width(), dstY + Surface height()).
    678         Copies each readable pixel intersecting both rectangles, without scaling,
    679         converting to SkSurface colorType() and SkSurface alphaType() if required.
    680 
    681         @param src   storage for pixels to copy to SkSurface
    682         @param dstX  x position relative to SkSurface to begin copy; may be negative
    683         @param dstY  x position relative to SkSurface to begin copy; may be negative
    684     */
    685     void writePixels(const SkBitmap& src, int dstX, int dstY);
    686 
    687     /** Returns SkSurfaceProps for surface.
    688 
    689         @return  LCD striping orientation and setting for device independent fonts
    690     */
    691     const SkSurfaceProps& props() const { return fProps; }
    692 
    693     /** To be deprecated soon.
    694     */
    695     void prepareForExternalIO();
    696 
    697     /** Issues pending SkSurface commands to the GPU-backed API and resolves any SkSurface MSAA.
    698 
    699         Skia flushes as needed, so it is not necessary to call this if Skia manages
    700         drawing and object lifetime. Call when interleaving Skia calls with native
    701         GPU calls.
    702     */
    703     void flush();
    704 
    705     /** Issues pending SkSurface commands to the GPU-backed API and resolves any SkSurface MSAA.
    706         After issuing all commands, signalSemaphores of count numSemaphores semaphores
    707         are signaled by the GPU.
    708 
    709         For each GrBackendSemaphore in signalSemaphores:
    710         if GrBackendSemaphore is initialized, the GPU back-end uses the semaphore as is;
    711         otherwise, a new semaphore is created and initializes GrBackendSemaphore.
    712 
    713         The caller must delete the semaphores created and returned in signalSemaphores.
    714         GrBackendSemaphore can be deleted as soon as this function returns.
    715 
    716         If the back-end API is OpenGL only uninitialized backend semaphores are supported.
    717 
    718         If the back-end API is Vulkan semaphores may be initialized or uninitialized.
    719         If uninitialized, created semaphores are valid only with the VkDevice
    720         with which they were created.
    721 
    722         If GrSemaphoresSubmitted::kNo is returned, the GPU back-end did not create or
    723         add any semaphores to signal on the GPU; the caller should not instruct the GPU
    724         to wait on any of the semaphores.
    725 
    726         Pending surface commands are flushed regardless of the return result.
    727 
    728         @param numSemaphores     size of signalSemaphores array
    729         @param signalSemaphores  array of semaphore containers
    730         @return                  one of: GrSemaphoresSubmitted::kYes, GrSemaphoresSubmitted::kNo
    731     */
    732     GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
    733                                                    GrBackendSemaphore signalSemaphores[]);
    734 
    735     /** Inserts a list of GPU semaphores that the current GPU-backed API must wait on before
    736         executing any more commands on the GPU for this surface. Skia will take ownership of the
    737         underlying semaphores and delete them once they have been signaled and waited on.
    738         If this call returns false, then the GPU back-end will not wait on any passed in semaphores,
    739         and the client will still own the semaphores.
    740 
    741         @param numSemaphores   size of waitSemaphores array
    742         @param waitSemaphores  array of semaphore containers
    743         @return                true if GPU is waiting on semaphores
    744     */
    745     bool wait(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
    746 
    747     /** Initializes SkSurfaceCharacterization that can be used to perform GPU back-end
    748         processing in a separate thread. Typically this is used to divide drawing
    749         into multiple tiles. DeferredDisplayListRecorder records the drawing commands
    750         for each tile.
    751 
    752         Return true if SkSurface supports characterization. raster surface returns false.
    753 
    754         @param characterization  properties for parallel drawing
    755         @return                  true if supported
    756     */
    757     bool characterize(SkSurfaceCharacterization* characterization) const;
    758 
    759     /** Draws deferred display list created using SkDeferredDisplayListRecorder.
    760         Has no effect and returns false if SkSurfaceCharacterization stored in
    761         deferredDisplayList is not compatible with SkSurface.
    762 
    763         raster surface returns false.
    764 
    765         @param deferredDisplayList  drawing commands
    766         @return                     false if deferredDisplayList is not compatible
    767     */
    768     bool draw(SkDeferredDisplayList* deferredDisplayList);
    769 
    770 protected:
    771     SkSurface(int width, int height, const SkSurfaceProps* surfaceProps);
    772     SkSurface(const SkImageInfo& imageInfo, const SkSurfaceProps* surfaceProps);
    773 
    774     // called by subclass if their contents have changed
    775     void dirtyGenerationID() {
    776         fGenerationID = 0;
    777     }
    778 
    779 private:
    780     const SkSurfaceProps fProps;
    781     const int            fWidth;
    782     const int            fHeight;
    783     uint32_t             fGenerationID;
    784 
    785     typedef SkRefCnt INHERITED;
    786 };
    787 
    788 #endif
    789