| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkCanvas_DEFINED | 8 #ifndef SkCanvas_DEFINED |
| 9 #define SkCanvas_DEFINED | 9 #define SkCanvas_DEFINED |
| 10 | 10 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 | 69 |
| 70 /** Construct a canvas with the specified bitmap to draw into. | 70 /** Construct a canvas with the specified bitmap to draw into. |
| 71 @param bitmap Specifies a bitmap for the canvas to draw into. Its | 71 @param bitmap Specifies a bitmap for the canvas to draw into. Its |
| 72 structure are copied to the canvas. | 72 structure are copied to the canvas. |
| 73 */ | 73 */ |
| 74 explicit SkCanvas(const SkBitmap& bitmap); | 74 explicit SkCanvas(const SkBitmap& bitmap); |
| 75 virtual ~SkCanvas(); | 75 virtual ~SkCanvas(); |
| 76 | 76 |
| 77 SkMetaData& getMetaData(); | 77 SkMetaData& getMetaData(); |
| 78 | 78 |
| 79 /** | |
| 80 * Return ImageInfo for this canvas. If the canvas is not backed by pixels | |
| 81 * (cpu or gpu), then the info's ColorType will be kUnknown_SkColorType. | |
| 82 */ | |
| 83 SkImageInfo imageInfo() const; | |
| 84 | |
| 85 /////////////////////////////////////////////////////////////////////////// | 79 /////////////////////////////////////////////////////////////////////////// |
| 86 | 80 |
| 87 /** | 81 /** |
| 88 * Trigger the immediate execution of all pending draw operations. | 82 * Trigger the immediate execution of all pending draw operations. |
| 89 */ | 83 */ |
| 90 void flush(); | 84 void flush(); |
| 91 | 85 |
| 92 /** | 86 /** |
| 93 * DEPRECATED: call imageInfo() instead. | |
| 94 * Return the width/height of the underlying device. The current drawable | 87 * Return the width/height of the underlying device. The current drawable |
| 95 * area may be small (due to clipping or saveLayer). For a canvas with | 88 * area may be small (due to clipping or saveLayer). For a canvas with |
| 96 * no device, 0,0 will be returned. | 89 * no device, 0,0 will be returned. |
| 97 */ | 90 */ |
| 98 SkISize getDeviceSize() const; | 91 SkISize getDeviceSize() const; |
| 99 | 92 |
| 100 /** | 93 /** Return the canvas' device object, which may be null. The device holds |
| 101 * DEPRECATED. | 94 the bitmap of the pixels that the canvas draws into. The reference count |
| 102 * Return the canvas' device object, which may be null. The device holds | 95 of the returned device is not changed by this call. |
| 103 * the bitmap of the pixels that the canvas draws into. The reference count | 96 */ |
| 104 * of the returned device is not changed by this call. | |
| 105 */ | |
| 106 SkBaseDevice* getDevice() const; | 97 SkBaseDevice* getDevice() const; |
| 107 | 98 |
| 108 /** | 99 /** |
| 109 * saveLayer() can create another device (which is later drawn onto | 100 * saveLayer() can create another device (which is later drawn onto |
| 110 * the previous device). getTopDevice() returns the top-most device current | 101 * the previous device). getTopDevice() returns the top-most device current |
| 111 * installed. Note that this can change on other calls like save/restore, | 102 * installed. Note that this can change on other calls like save/restore, |
| 112 * so do not access this device after subsequent canvas calls. | 103 * so do not access this device after subsequent canvas calls. |
| 113 * The reference count of the device is not changed. | 104 * The reference count of the device is not changed. |
| 114 * | 105 * |
| 115 * @param updateMatrixClip If this is true, then before the device is | 106 * @param updateMatrixClip If this is true, then before the device is |
| (...skipping 12 matching lines...) Expand all Loading... |
| 128 | 119 |
| 129 /** | 120 /** |
| 130 * Return the GPU context of the device that is associated with the canvas. | 121 * Return the GPU context of the device that is associated with the canvas. |
| 131 * For a canvas with non-GPU device, NULL is returned. | 122 * For a canvas with non-GPU device, NULL is returned. |
| 132 */ | 123 */ |
| 133 GrContext* getGrContext(); | 124 GrContext* getGrContext(); |
| 134 | 125 |
| 135 /////////////////////////////////////////////////////////////////////////// | 126 /////////////////////////////////////////////////////////////////////////// |
| 136 | 127 |
| 137 /** | 128 /** |
| 138 * If the canvas has pixels (and is not recording to a picture or other | |
| 139 * non-raster target) and has direct access to its pixels (i.e. they are in | |
| 140 * local RAM) return the const-address of those pixels, and if not null, | |
| 141 * return the ImageInfo and rowBytes. The returned address is only valid | |
| 142 * while the canvas object is in scope and unchanged. Any API calls made on | |
| 143 * canvas (or its parent surface if any) will invalidate the | |
| 144 * returned address (and associated information). | |
| 145 * | |
| 146 * On failure, returns NULL and the info and rowBytes parameters are | |
| 147 * ignored. | |
| 148 */ | |
| 149 const void* peekPixels(SkImageInfo* info, size_t* rowBytes); | |
| 150 | |
| 151 /** | |
| 152 * This enum can be used with read/writePixels to perform a pixel ops to or | 129 * This enum can be used with read/writePixels to perform a pixel ops to or |
| 153 * from an 8888 config other than Skia's native config (SkPMColor). There | 130 * from an 8888 config other than Skia's native config (SkPMColor). There |
| 154 * are three byte orders supported: native, BGRA, and RGBA. Each has a | 131 * are three byte orders supported: native, BGRA, and RGBA. Each has a |
| 155 * premultiplied and unpremultiplied variant. | 132 * premultiplied and unpremultiplied variant. |
| 156 * | 133 * |
| 157 * Components of a 8888 pixel can be packed/unpacked from a 32bit word using | 134 * Components of a 8888 pixel can be packed/unpacked from a 32bit word using |
| 158 * either byte offsets or shift values. Byte offsets are endian-invariant | 135 * either byte offsets or shift values. Byte offsets are endian-invariant |
| 159 * while shifts are not. BGRA and RGBA configs are defined by byte | 136 * while shifts are not. BGRA and RGBA configs are defined by byte |
| 160 * orderings. The native config is defined by shift values (SK_A32_SHIFT, | 137 * orderings. The native config is defined by shift values (SK_A32_SHIFT, |
| 161 * ..., SK_B32_SHIFT). | 138 * ..., SK_B32_SHIFT). |
| (...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 intptr_t fStorage[32]; | 1012 intptr_t fStorage[32]; |
| 1036 class SkDrawIter* fImpl; // this points at fStorage | 1013 class SkDrawIter* fImpl; // this points at fStorage |
| 1037 SkPaint fDefaultPaint; | 1014 SkPaint fDefaultPaint; |
| 1038 bool fDone; | 1015 bool fDone; |
| 1039 }; | 1016 }; |
| 1040 | 1017 |
| 1041 protected: | 1018 protected: |
| 1042 // default impl defers to getDevice()->newSurface(info) | 1019 // default impl defers to getDevice()->newSurface(info) |
| 1043 virtual SkSurface* onNewSurface(const SkImageInfo&); | 1020 virtual SkSurface* onNewSurface(const SkImageInfo&); |
| 1044 | 1021 |
| 1045 // default impl defers to its device | |
| 1046 virtual const void* onPeekPixels(SkImageInfo*, size_t* rowBytes); | |
| 1047 | |
| 1048 // Returns the canvas to be used by DrawIter. Default implementation | 1022 // Returns the canvas to be used by DrawIter. Default implementation |
| 1049 // returns this. Subclasses that encapsulate an indirect canvas may | 1023 // returns this. Subclasses that encapsulate an indirect canvas may |
| 1050 // need to overload this method. The impl must keep track of this, as it | 1024 // need to overload this method. The impl must keep track of this, as it |
| 1051 // is not released or deleted by the caller. | 1025 // is not released or deleted by the caller. |
| 1052 virtual SkCanvas* canvasForDrawIter(); | 1026 virtual SkCanvas* canvasForDrawIter(); |
| 1053 | 1027 |
| 1054 // Clip rectangle bounds. Called internally by saveLayer. | 1028 // Clip rectangle bounds. Called internally by saveLayer. |
| 1055 // returns false if the entire rectangle is entirely clipped out | 1029 // returns false if the entire rectangle is entirely clipped out |
| 1056 // If non-NULL, The imageFilter parameter will be used to expand the clip | 1030 // If non-NULL, The imageFilter parameter will be used to expand the clip |
| 1057 // and offscreen bounds for any margin required by the filter DAG. | 1031 // and offscreen bounds for any margin required by the filter DAG. |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 if (NULL != fCanvas) { | 1199 if (NULL != fCanvas) { |
| 1226 fCanvas->endCommentGroup(); | 1200 fCanvas->endCommentGroup(); |
| 1227 } | 1201 } |
| 1228 } | 1202 } |
| 1229 | 1203 |
| 1230 private: | 1204 private: |
| 1231 SkCanvas* fCanvas; | 1205 SkCanvas* fCanvas; |
| 1232 }; | 1206 }; |
| 1233 #define SkAutoCommentBlock(...) SK_REQUIRE_LOCAL_VAR(SkAutoCommentBlock) | 1207 #define SkAutoCommentBlock(...) SK_REQUIRE_LOCAL_VAR(SkAutoCommentBlock) |
| 1234 | 1208 |
| 1235 /** | |
| 1236 * If the caller wants read-only access to the pixels in a canvas, it can just | |
| 1237 * call canvas->peekPixels(), since that is the fastest way to "peek" at the | |
| 1238 * pixels on a raster-backed canvas. | |
| 1239 * | |
| 1240 * If the canvas has pixels, but they are not readily available to the CPU | |
| 1241 * (e.g. gpu-backed), then peekPixels() will fail, but readPixels() will | |
| 1242 * succeed (though be slower, since it will return a copy of the pixels). | |
| 1243 * | |
| 1244 * SkAutoROCanvasPixels encapsulates these two techniques, trying first to call | |
| 1245 * peekPixels() (for performance), but if that fails, calling readPixels() and | |
| 1246 * storing the copy locally. | |
| 1247 * | |
| 1248 * The caller must respect the restrictions associated with peekPixels(), since | |
| 1249 * that may have been called: The returned information is invalidated if... | |
| 1250 * - any API is called on the canvas (or its parent surface if present) | |
| 1251 * - the canvas goes out of scope | |
| 1252 */ | |
| 1253 class SkAutoROCanvasPixels : SkNoncopyable { | |
| 1254 public: | |
| 1255 SkAutoROCanvasPixels(SkCanvas* canvas); | |
| 1256 | |
| 1257 // returns NULL on failure | |
| 1258 const void* addr() const { return fAddr; } | |
| 1259 | |
| 1260 // undefined if addr() == NULL | |
| 1261 size_t rowBytes() const { return fRowBytes; } | |
| 1262 | |
| 1263 // undefined if addr() == NULL | |
| 1264 const SkImageInfo& info() const { return fInfo; } | |
| 1265 | |
| 1266 // helper that, if returns true, installs the pixels into the bitmap. Note | |
| 1267 // that the bitmap may reference the address returned by peekPixels(), so | |
| 1268 // the caller must respect the restrictions associated with peekPixels(). | |
| 1269 bool asROBitmap(SkBitmap*) const; | |
| 1270 | |
| 1271 private: | |
| 1272 SkBitmap fBitmap; // used if peekPixels() fails | |
| 1273 const void* fAddr; // NULL on failure | |
| 1274 SkImageInfo fInfo; | |
| 1275 size_t fRowBytes; | |
| 1276 }; | |
| 1277 | |
| 1278 #endif | 1209 #endif |
| OLD | NEW |