reed@google.com | 58b21ec | 2012-07-30 18:20:12 +0000 | [diff] [blame] | 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 | */ |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 7 | |
| 8 | #ifndef SkImagePriv_DEFINED |
| 9 | #define SkImagePriv_DEFINED |
| 10 | |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 11 | #include "SkImage.h" |
bsalomon | eaaaf0b | 2015-01-23 08:08:04 -0800 | [diff] [blame] | 12 | #include "SkSurface.h" |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 13 | |
reed | 1ec04d9 | 2016-08-05 12:07:41 -0700 | [diff] [blame] | 14 | enum SkCopyPixelsMode { |
| 15 | kIfMutable_SkCopyPixelsMode, //!< only copy src pixels if they are marked mutable |
| 16 | kAlways_SkCopyPixelsMode, //!< always copy src pixels (even if they are marked immutable) |
| 17 | kNever_SkCopyPixelsMode, //!< never copy src pixels (even if they are marked mutable) |
| 18 | }; |
| 19 | |
Herb Derby | 78c0c4c | 2017-02-14 11:14:16 -0500 | [diff] [blame] | 20 | // A good size for creating shader contexts on the stack. |
caryclark | 8a65fc8 | 2016-08-15 08:44:46 -0700 | [diff] [blame] | 21 | enum {kSkBlitterContextSize = 3332}; |
reed | 4c1abdc | 2016-08-05 14:50:19 -0700 | [diff] [blame] | 22 | |
reed | 4c1abdc | 2016-08-05 14:50:19 -0700 | [diff] [blame] | 23 | // If alloc is non-nullptr, it will be used to allocate the returned SkShader, and MUST outlive |
| 24 | // the SkShader. |
| 25 | sk_sp<SkShader> SkMakeBitmapShader(const SkBitmap& src, SkShader::TileMode, SkShader::TileMode, |
Herb Derby | bfdc87a | 2017-02-14 15:06:23 +0000 | [diff] [blame] | 26 | const SkMatrix* localMatrix, SkCopyPixelsMode); |
reed | 4c1abdc | 2016-08-05 14:50:19 -0700 | [diff] [blame] | 27 | |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 28 | /** |
| 29 | * Examines the bitmap to decide if it can share the existing pixelRef, or |
fmalita | 9a5d1ab | 2015-07-27 10:27:28 -0700 | [diff] [blame] | 30 | * if it needs to make a deep-copy of the pixels. |
| 31 | * |
| 32 | * The bitmap's pixelref will be shared if either the bitmap is marked as |
reed | 1ec04d9 | 2016-08-05 12:07:41 -0700 | [diff] [blame] | 33 | * immutable, or CopyPixelsMode allows it. Shared pixel refs are also |
fmalita | 9a5d1ab | 2015-07-27 10:27:28 -0700 | [diff] [blame] | 34 | * locked when kLocked_SharedPixelRefMode is specified. |
| 35 | * |
| 36 | * Passing kLocked_SharedPixelRefMode allows the image's peekPixels() method |
| 37 | * to succeed, but it will force any lazy decodes/generators to execute if |
| 38 | * they exist on the pixelref. |
reed@google.com | 97af1a6 | 2012-08-28 12:19:02 +0000 | [diff] [blame] | 39 | * |
reed | 5617900 | 2015-07-07 06:11:19 -0700 | [diff] [blame] | 40 | * It is illegal to call this with a texture-backed bitmap. |
| 41 | * |
commit-bot@chromium.org | a3264e5 | 2014-05-30 13:26:10 +0000 | [diff] [blame] | 42 | * If the bitmap's colortype cannot be converted into a corresponding |
reed@google.com | 2bd8b81 | 2013-11-01 13:46:54 +0000 | [diff] [blame] | 43 | * SkImageInfo, or the bitmap's pixels cannot be accessed, this will return |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 44 | * nullptr. |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 45 | */ |
Herb Derby | bfdc87a | 2017-02-14 15:06:23 +0000 | [diff] [blame] | 46 | extern sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap&, SkCopyPixelsMode); |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 47 | |
reed@google.com | 97af1a6 | 2012-08-28 12:19:02 +0000 | [diff] [blame] | 48 | // Given an image created from SkNewImageFromBitmap, return its pixelref. This |
| 49 | // may be called to see if the surface and the image share the same pixelref, |
| 50 | // in which case the surface may need to perform a copy-on-write. |
piotaixr | 6515175 | 2014-10-16 11:58:39 -0700 | [diff] [blame] | 51 | extern const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* rasterImage); |
reed@google.com | 97af1a6 | 2012-08-28 12:19:02 +0000 | [diff] [blame] | 52 | |
reed | 2d5b714 | 2016-08-17 11:12:33 -0700 | [diff] [blame] | 53 | /** |
| 54 | * Will attempt to upload and lock the contents of the image as a texture, so that subsequent |
| 55 | * draws to a gpu-target will come from that texture (and not by looking at the original image |
| 56 | * src). In particular this is intended to use the texture even if the image's original content |
| 57 | * changes subsequent to this call (i.e. the src is mutable!). |
| 58 | * |
Derek Sollenberger | d3ea9b7 | 2016-11-09 11:25:13 -0500 | [diff] [blame] | 59 | * All successful calls must be balanced by an equal number of calls to SkImage_unpinAsTexture(). |
reed | 2d5b714 | 2016-08-17 11:12:33 -0700 | [diff] [blame] | 60 | * |
| 61 | * Once in this "pinned" state, the image has all of the same thread restrictions that exist |
| 62 | * for a natively created gpu image (e.g. SkImage::MakeFromTexture) |
| 63 | * - all drawing, pinning, unpinning must happen in the same thread as the GrContext. |
Derek Sollenberger | d3ea9b7 | 2016-11-09 11:25:13 -0500 | [diff] [blame] | 64 | * |
| 65 | * @return true if the image was successfully uploaded and locked into a texture |
reed | 2d5b714 | 2016-08-17 11:12:33 -0700 | [diff] [blame] | 66 | */ |
Derek Sollenberger | d3ea9b7 | 2016-11-09 11:25:13 -0500 | [diff] [blame] | 67 | bool SkImage_pinAsTexture(const SkImage*, GrContext*); |
reed | 2d5b714 | 2016-08-17 11:12:33 -0700 | [diff] [blame] | 68 | |
| 69 | /** |
Derek Sollenberger | d3ea9b7 | 2016-11-09 11:25:13 -0500 | [diff] [blame] | 70 | * The balancing call to a successful invokation of SkImage_pinAsTexture. When a balanced number of |
| 71 | * calls have been made, then the "pinned" texture is free to be purged, etc. This also means that a |
| 72 | * subsequent "pin" call will look at the original content again, and if its uniqueID/generationID |
| 73 | * has changed, then a newer texture will be uploaded/pinned. |
reed | 2d5b714 | 2016-08-17 11:12:33 -0700 | [diff] [blame] | 74 | * |
| 75 | * The context passed to unpin must match the one passed to pin. |
| 76 | */ |
| 77 | void SkImage_unpinAsTexture(const SkImage*, GrContext*); |
| 78 | |
Brian Osman | 0d4ff6c | 2017-01-17 16:10:07 -0500 | [diff] [blame] | 79 | /** |
| 80 | * Returns a new image containing the same pixel values as the source, but with a different color |
| 81 | * space assigned. This performs no color space conversion. Primarily used in tests, to visualize |
| 82 | * the results of rendering in wide or narrow gamuts. |
| 83 | */ |
| 84 | sk_sp<SkImage> SkImageMakeRasterCopyAndAssignColorSpace(const SkImage*, SkColorSpace*); |
| 85 | |
reed@google.com | 889b09e | 2012-07-27 21:10:42 +0000 | [diff] [blame] | 86 | #endif |