/src/skia/include/android/SkImageAndroid.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2023 Google LLC |
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 SkImageAndroid_DEFINED |
9 | | #define SkImageAndroid_DEFINED |
10 | | |
11 | | #include "include/core/SkImage.h" |
12 | | #include "include/core/SkRefCnt.h" |
13 | | #include "include/gpu/GrTypes.h" |
14 | | |
15 | | class SkColorSpace; |
16 | | class GrDirectContext; |
17 | | class SkPixmap; |
18 | | struct AHardwareBuffer; |
19 | | |
20 | | namespace SkImages { |
21 | | |
22 | | /** (See Skia bug 7447) |
23 | | Creates SkImage from Android hardware buffer. |
24 | | Returned SkImage takes a reference on the buffer. |
25 | | Only available on Android, when __ANDROID_API__ is defined to be 26 or greater. |
26 | | @param hardwareBuffer AHardwareBuffer Android hardware buffer |
27 | | @param colorSpace range of colors; may be nullptr |
28 | | @return created SkImage, or nullptr |
29 | | */ |
30 | | SK_API sk_sp<SkImage> DeferredFromAHardwareBuffer(AHardwareBuffer* hardwareBuffer, |
31 | | SkAlphaType alphaType = kPremul_SkAlphaType); |
32 | | SK_API sk_sp<SkImage> DeferredFromAHardwareBuffer( |
33 | | AHardwareBuffer* hardwareBuffer, |
34 | | SkAlphaType alphaType, |
35 | | sk_sp<SkColorSpace> colorSpace, |
36 | | GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin); |
37 | | |
38 | | /** Creates SkImage from Android hardware buffer and uploads the data from the SkPixmap to it. |
39 | | Returned SkImage takes a reference on the buffer. |
40 | | Only available on Android, when __ANDROID_API__ is defined to be 26 or greater. |
41 | | @param context GPU context |
42 | | @param pixmap SkPixmap that contains data to be uploaded to the AHardwareBuffer |
43 | | @param hardwareBuffer AHardwareBuffer Android hardware buffer |
44 | | @param surfaceOrigin surface origin for resulting image |
45 | | @return created SkImage, or nullptr |
46 | | */ |
47 | | SK_API sk_sp<SkImage> TextureFromAHardwareBufferWithData( |
48 | | GrDirectContext* context, |
49 | | const SkPixmap& pixmap, |
50 | | AHardwareBuffer* hardwareBuffer, |
51 | | GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin); |
52 | | |
53 | | /** |
54 | | * Like SkImagePriv::SkMakeImageFromRasterBitmap, except this can be pinned using |
55 | | * skgpu::ganesh::PinAsTexture and CopyPixelMode is never. |
56 | | */ |
57 | | SK_API sk_sp<SkImage> PinnableRasterFromBitmap(const SkBitmap&); |
58 | | |
59 | | } // namespace SkImages |
60 | | |
61 | | // TODO(kjlubick) remove this after Android has been ported. |
62 | | namespace sk_image_factory { |
63 | 0 | inline sk_sp<SkImage> MakePinnableFromRasterBitmap(const SkBitmap& b) { |
64 | 0 | return SkImages::PinnableRasterFromBitmap(b); |
65 | 0 | } |
66 | | } // namespace sk_image_factory |
67 | | |
68 | | namespace skgpu::ganesh { |
69 | | /** |
70 | | * Will attempt to upload and lock the contents of the image as a texture, so that subsequent |
71 | | * draws to a gpu-target will come from that texture (and not by looking at the original image |
72 | | * src). In particular this is intended to use the texture even if the image's original content |
73 | | * changes subsequent to this call (i.e. the src is mutable!). |
74 | | * |
75 | | * Only compatible with SkImages created from SkImages::PinnableRasterFromBitmap. |
76 | | * |
77 | | * All successful calls must be balanced by an equal number of calls to UnpinTexture(). |
78 | | * |
79 | | * Once in this "pinned" state, the image has all of the same thread restrictions that exist |
80 | | * for a natively created gpu image (e.g. SkImage::MakeFromTexture) |
81 | | * - all drawing, pinning, unpinning must happen in the same thread as the GrContext. |
82 | | * |
83 | | * @return true if the image was successfully uploaded and locked into a texture |
84 | | */ |
85 | | bool PinAsTexture(GrRecordingContext*, SkImage*); |
86 | | |
87 | | /** |
88 | | * The balancing call to a successful invocation of PinAsTexture. When a balanced |
89 | | * number of calls have been made, then the "pinned" texture is free to be purged, etc. This |
90 | | * also means that a subsequent "pin" call will look at the original content again, and if |
91 | | * its uniqueID/generationID has changed, then a newer texture will be uploaded/pinned. |
92 | | * |
93 | | * Only compatible with SkImages created from SkImages::PinnableRasterFromBitmap. |
94 | | * |
95 | | * The context passed to unpin must match the one passed to pin. |
96 | | */ |
97 | | void UnpinTexture(GrRecordingContext*, SkImage*); |
98 | | |
99 | | } // namespace skgpu::ganesh |
100 | | |
101 | | #endif |