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 SkImagePriv_DEFINED
9 #define SkImagePriv_DEFINED
10 
11 #include "SkImage.h"
12 #include "SkSurface.h"
13 
14 // Call this if you explicitly want to use/share this pixelRef in the image
15 extern SkImage* SkNewImageFromPixelRef(const SkImageInfo&, SkPixelRef*,
16                                        const SkIPoint& pixelRefOrigin,
17                                        size_t rowBytes);
18 
19 /**
20  *  Examines the bitmap to decide if it can share the existing pixelRef, or
21  *  if it needs to make a deep-copy of the pixels.
22  *
23  *  The bitmap's pixelref will be shared if either the bitmap is marked as
24  *  immutable, or forceSharePixelRef is true.  Shared pixel refs are also
25  *  locked when kLocked_SharedPixelRefMode is specified.
26  *
27  *  Passing kLocked_SharedPixelRefMode allows the image's peekPixels() method
28  *  to succeed, but it will force any lazy decodes/generators to execute if
29  *  they exist on the pixelref.
30  *
31  *  It is illegal to call this with a texture-backed bitmap.
32  *
33  *  If the bitmap's colortype cannot be converted into a corresponding
34  *  SkImageInfo, or the bitmap's pixels cannot be accessed, this will return
35  *  nullptr.
36  */
37 enum ForceCopyMode {
38     kNo_ForceCopyMode,
39     kYes_ForceCopyMode, // must copy the pixels even if the bitmap is immutable
40 };
41 extern SkImage* SkNewImageFromRasterBitmap(const SkBitmap&, ForceCopyMode = kNo_ForceCopyMode);
42 
43 // Given an image created from SkNewImageFromBitmap, return its pixelref. This
44 // may be called to see if the surface and the image share the same pixelref,
45 // in which case the surface may need to perform a copy-on-write.
46 extern const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* rasterImage);
47 
48 // When a texture is shared by a surface and an image its budgeted status is that of the
49 // surface. This function is used when the surface makes a new texture for itself in order
50 // for the orphaned image to determine whether the original texture counts against the
51 // budget or not.
52 extern void SkTextureImageApplyBudgetedDecision(SkImage* textureImage);
53 
54 // Update the texture wrapped by an image created with NewTexture. This
55 // is called when a surface and image share the same GrTexture and the
56 // surface needs to perform a copy-on-write
57 extern void SkTextureImageSetTexture(SkImage* image, GrTexture* texture);
58 
59 GrTexture* GrDeepCopyTexture(GrTexture* src, SkBudgeted);
60 
61 #endif
62