blob: 3715b1d615d5add09884fef72af348fc07f2cc14 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2010 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkDevice_DEFINED
9#define SkDevice_DEFINED
10
11#include "SkRefCnt.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012#include "SkCanvas.h"
13#include "SkColor.h"
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000014#include "SkImageFilter.h"
robertphillipsfcf78292015-06-19 11:49:52 -070015#include "SkSurfaceProps.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
bungemand3ebb482015-08-05 13:57:49 -070017class SkBitmap;
reed@google.com46799cd2011-02-22 20:56:26 +000018class SkClipStack;
reed@android.com8a1c16f2008-12-17 15:59:43 +000019class SkDraw;
fmalita024f9962015-03-03 19:08:17 -080020class SkDrawFilter;
reed@android.com8a1c16f2008-12-17 15:59:43 +000021struct SkIRect;
22class SkMatrix;
reed@google.coma7d94852011-03-30 21:23:07 +000023class SkMetaData;
reed@android.com8a1c16f2008-12-17 15:59:43 +000024class SkRegion;
commit-bot@chromium.orgb8d00db2013-06-26 19:18:23 +000025class GrRenderTarget;
bsalomon@google.comd9f826c2011-07-18 15:25:04 +000026
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000027class SK_API SkBaseDevice : public SkRefCnt {
reed@android.com8a1c16f2008-12-17 15:59:43 +000028public:
reed@google.comaf951c92011-06-16 19:10:39 +000029 /**
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000030 * Construct a new device.
reed@android.com8a1c16f2008-12-17 15:59:43 +000031 */
robertphillipsfcf78292015-06-19 11:49:52 -070032 explicit SkBaseDevice(const SkSurfaceProps&);
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000033 virtual ~SkBaseDevice();
reed@android.com8a1c16f2008-12-17 15:59:43 +000034
bungeman@google.com88edf1e2011-08-08 19:41:56 +000035 SkMetaData& getMetaData();
36
reed@google.comd51bfa02011-08-30 15:56:11 +000037 /**
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000038 * Return ImageInfo for this device. If the canvas is not backed by pixels
39 * (cpu or gpu), then the info's ColorType will be kUnknown_SkColorType.
40 */
41 virtual SkImageInfo imageInfo() const;
42
43 /**
reed@google.comd51bfa02011-08-30 15:56:11 +000044 * Return the bounds of the device in the coordinate space of the root
45 * canvas. The root device will have its top-left at 0,0, but other devices
46 * such as those associated with saveLayer may have a non-zero origin.
47 */
reed@google.comec3ca872013-11-13 16:02:18 +000048 void getGlobalBounds(SkIRect* bounds) const {
49 SkASSERT(bounds);
50 const SkIPoint& origin = this->getOrigin();
51 bounds->setXYWH(origin.x(), origin.y(), this->width(), this->height());
52 }
skia.committer@gmail.com73a5d532013-11-14 07:02:31 +000053
reed78e27682014-11-19 08:04:34 -080054 SkIRect getGlobalBounds() const {
55 SkIRect bounds;
56 this->getGlobalBounds(&bounds);
57 return bounds;
58 }
59
reedf252f642014-06-14 04:24:56 -070060 int width() const {
61 return this->imageInfo().width();
62 }
reed620fc602014-07-07 13:51:48 -070063
reedf252f642014-06-14 04:24:56 -070064 int height() const {
65 return this->imageInfo().height();
66 }
reed620fc602014-07-07 13:51:48 -070067
reedf252f642014-06-14 04:24:56 -070068 bool isOpaque() const {
69 return this->imageInfo().isOpaque();
70 }
skia.committer@gmail.com772c4e62013-08-30 07:01:34 +000071
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 /** Return the bitmap associated with this device. Call this each time you need
73 to access the bitmap, as it notifies the subclass to perform any flushing
74 etc. before you examine the pixels.
75 @param changePixels set to true if the caller plans to change the pixels
76 @return the device's bitmap
77 */
78 const SkBitmap& accessBitmap(bool changePixels);
79
commit-bot@chromium.org4ef54f82014-03-17 17:03:18 +000080 bool writePixels(const SkImageInfo&, const void*, size_t rowBytes, int x, int y);
reed@android.com8a1c16f2008-12-17 15:59:43 +000081
reed6e764852015-06-05 14:11:32 -070082 /**
83 * Try to get write-access to the pixels behind the device. If successful, this returns true
84 * and fills-out the pixmap parameter. On success it also bumps the genID of the underlying
85 * bitmap.
86 *
87 * On failure, returns false and ignores the pixmap parameter.
88 */
reed884e97c2015-05-26 11:31:54 -070089 bool accessPixels(SkPixmap* pmap);
reed@google.com9c135db2014-03-12 18:28:35 +000090
bsalomon@google.comd9f826c2011-07-18 15:25:04 +000091 /**
reed6e764852015-06-05 14:11:32 -070092 * Try to get read-only-access to the pixels behind the device. If successful, this returns
93 * true and fills-out the pixmap parameter.
94 *
95 * On failure, returns false and ignores the pixmap parameter.
96 */
97 bool peekPixels(SkPixmap*);
98
99 /**
bsalomon@google.comd9f826c2011-07-18 15:25:04 +0000100 * Return the device's associated gpu render target, or NULL.
reed@android.comf2b98d62010-12-20 18:26:13 +0000101 */
reed89443ab2014-06-27 11:34:19 -0700102 virtual GrRenderTarget* accessRenderTarget() { return NULL; }
reed@android.comf2b98d62010-12-20 18:26:13 +0000103
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000104
105 /**
106 * Return the device's origin: its offset in device coordinates from
107 * the default origin in its canvas' matrix/clip
108 */
109 const SkIPoint& getOrigin() const { return fOrigin; }
110
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000111 /**
robertphillips@google.com40a1ae42012-07-13 15:36:15 +0000112 * onAttachToCanvas is invoked whenever a device is installed in a canvas
113 * (i.e., setDevice, saveLayer (for the new device created by the save),
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000114 * and SkCanvas' SkBaseDevice & SkBitmap -taking ctors). It allows the
robertphillips@google.com40a1ae42012-07-13 15:36:15 +0000115 * devices to prepare for drawing (e.g., locking their pixels, etc.)
116 */
sugoi@google.come0e385c2013-03-11 18:50:03 +0000117 virtual void onAttachToCanvas(SkCanvas*) {
bsalomon@google.com405d0f42012-08-29 21:26:13 +0000118 SkASSERT(!fAttachedToCanvas);
robertphillips@google.com40a1ae42012-07-13 15:36:15 +0000119#ifdef SK_DEBUG
120 fAttachedToCanvas = true;
121#endif
122 };
123
124 /**
125 * onDetachFromCanvas notifies a device that it will no longer be drawn to.
126 * It gives the device a chance to clean up (e.g., unlock its pixels). It
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000127 * is invoked from setDevice (for the displaced device), restore and
robertphillips@google.com40a1ae42012-07-13 15:36:15 +0000128 * possibly from SkCanvas' dtor.
129 */
130 virtual void onDetachFromCanvas() {
bsalomon@google.com405d0f42012-08-29 21:26:13 +0000131 SkASSERT(fAttachedToCanvas);
robertphillips@google.com40a1ae42012-07-13 15:36:15 +0000132#ifdef SK_DEBUG
133 fAttachedToCanvas = false;
134#endif
135 };
136
caryclark@google.comd53f7c22012-01-05 17:05:05 +0000137protected:
reed76033be2015-03-14 10:54:31 -0700138 enum TileUsage {
139 kPossible_TileUsage, //!< the created device may be drawn tiled
140 kNever_TileUsage, //!< the created device will never be drawn tiled
caryclark@google.comd53f7c22012-01-05 17:05:05 +0000141 };
142
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000143 struct TextFlags {
reed3375c802014-09-16 12:27:55 -0700144 uint32_t fFlags; // SkPaint::getFlags()
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000145 };
146
fmalita112e7e22014-11-13 14:05:58 -0800147 /**
148 * Returns the text-related flags, possibly modified based on the state of the
149 * device (e.g. support for LCD).
150 */
151 uint32_t filterTextFlags(const SkPaint&) const;
152
reedb2db8982014-11-13 12:41:02 -0800153 virtual bool onShouldDisableLCD(const SkPaint&) const { return false; }
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000154
robertphillips@google.com3fffb2e2012-10-09 22:30:18 +0000155 /**
bsalomon@google.coma6926b12012-10-10 15:25:50 +0000156 *
157 * DEPRECATED: This will be removed in a future change. Device subclasses
158 * should use the matrix and clip from the SkDraw passed to draw functions.
159 *
robertphillips@google.com3fffb2e2012-10-09 22:30:18 +0000160 * Called with the correct matrix and clip before this device is drawn
161 * to using those settings. If your subclass overrides this, be sure to
162 * call through to the base class as well.
163 *
164 * The clipstack is another view of the clip. It records the actual
165 * geometry that went into building the region. It is present for devices
166 * that want to parse it, but is not required: the region is a complete
167 * picture of the current clip. (i.e. if you regionize all of the geometry
168 * in the clipstack, you will arrive at an equivalent region to the one
169 * passed in).
bsalomon@google.coma6926b12012-10-10 15:25:50 +0000170 */
171 virtual void setMatrixClip(const SkMatrix&, const SkRegion&,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000172 const SkClipStack&) {};
robertphillips@google.com3fffb2e2012-10-09 22:30:18 +0000173
reed@android.com8a1c16f2008-12-17 15:59:43 +0000174 /** These are called inside the per-device-layer loop for each draw call.
175 When these are called, we have already applied any saveLayer operations,
176 and are handling any looping from the paint, and any effects from the
177 DrawFilter.
178 */
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000179 virtual void drawPaint(const SkDraw&, const SkPaint& paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000181 const SkPoint[], const SkPaint& paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182 virtual void drawRect(const SkDraw&, const SkRect& r,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000183 const SkPaint& paint) = 0;
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000184 virtual void drawOval(const SkDraw&, const SkRect& oval,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000185 const SkPaint& paint) = 0;
commit-bot@chromium.orgf2bfd542013-04-25 15:27:00 +0000186 virtual void drawRRect(const SkDraw&, const SkRRect& rr,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000187 const SkPaint& paint) = 0;
commit-bot@chromium.orgf2bfd542013-04-25 15:27:00 +0000188
commit-bot@chromium.orged9806f2014-02-21 02:32:36 +0000189 // Default impl calls drawPath()
190 virtual void drawDRRect(const SkDraw&, const SkRRect& outer,
191 const SkRRect& inner, const SkPaint&);
192
reed@google.com7ff8d812011-03-25 15:08:16 +0000193 /**
194 * If pathIsMutable, then the implementation is allowed to cast path to a
195 * non-const pointer and modify it in place (as an optimization). Canvas
196 * may do this to implement helpers such as drawOval, by placing a temp
197 * path on the stack to hold the representation of the oval.
198 *
199 * If prePathMatrix is not null, it should logically be applied before any
200 * stroking or other effects. If there are no effects on the paint that
201 * affect the geometry/rasterization, then the pre matrix can just be
202 * pre-concated with the current matrix.
203 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000204 virtual void drawPath(const SkDraw&, const SkPath& path,
reed@android.comf2b98d62010-12-20 18:26:13 +0000205 const SkPaint& paint,
206 const SkMatrix* prePathMatrix = NULL,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000207 bool pathIsMutable = false) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000208 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000209 const SkMatrix& matrix, const SkPaint& paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000210 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000211 int x, int y, const SkPaint& paint) = 0;
reed@google.com33535f32012-09-25 15:37:50 +0000212
213 /**
214 * The default impl. will create a bitmap-shader from the bitmap,
215 * and call drawRect with it.
216 */
217 virtual void drawBitmapRect(const SkDraw&, const SkBitmap&,
218 const SkRect* srcOrNull, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000219 const SkPaint& paint,
reed562fe472015-07-28 07:35:14 -0700220 SkCanvas::SrcRectConstraint) = 0;
reed4c21dc52015-06-25 12:32:03 -0700221 virtual void drawBitmapNine(const SkDraw&, const SkBitmap&, const SkIRect& center,
222 const SkRect& dst, const SkPaint&);
reed@google.com33535f32012-09-25 15:37:50 +0000223
reeda85d4d02015-05-06 12:56:48 -0700224 virtual void drawImage(const SkDraw&, const SkImage*, SkScalar x, SkScalar y, const SkPaint&);
225 virtual void drawImageRect(const SkDraw&, const SkImage*, const SkRect* src, const SkRect& dst,
reeda5517e22015-07-14 10:54:12 -0700226 const SkPaint&, SkCanvas::SrcRectConstraint);
reed4c21dc52015-06-25 12:32:03 -0700227 virtual void drawImageNine(const SkDraw&, const SkImage*, const SkIRect& center,
228 const SkRect& dst, const SkPaint&);
reeda85d4d02015-05-06 12:56:48 -0700229
bungeman@google.com52c748b2011-08-22 21:30:43 +0000230 /**
231 * Does not handle text decoration.
232 * Decorations (underline and stike-thru) will be handled by SkCanvas.
233 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000234 virtual void drawText(const SkDraw&, const void* text, size_t len,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000235 SkScalar x, SkScalar y, const SkPaint& paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000236 virtual void drawPosText(const SkDraw&, const void* text, size_t len,
fmalita05c4a432014-09-29 06:29:53 -0700237 const SkScalar pos[], int scalarsPerPos,
238 const SkPoint& offset, const SkPaint& paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000239 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
240 const SkPoint verts[], const SkPoint texs[],
241 const SkColor colors[], SkXfermode* xmode,
242 const uint16_t indices[], int indexCount,
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000243 const SkPaint& paint) = 0;
fmalitaaa1b9122014-08-28 14:32:24 -0700244 // default implementation unrolls the blob runs.
245 virtual void drawTextBlob(const SkDraw&, const SkTextBlob*, SkScalar x, SkScalar y,
fmalita024f9962015-03-03 19:08:17 -0800246 const SkPaint& paint, SkDrawFilter* drawFilter);
dandovecfff212014-08-04 10:02:00 -0700247 // default implementation calls drawVertices
dandovb3c9d1c2014-08-12 08:34:29 -0700248 virtual void drawPatch(const SkDraw&, const SkPoint cubics[12], const SkColor colors[4],
249 const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
reed71c3c762015-06-24 10:29:17 -0700250
251 // default implementation calls drawPath
252 virtual void drawAtlas(const SkDraw&, const SkImage* atlas, const SkRSXform[], const SkRect[],
253 const SkColor[], int count, SkXfermode::Mode, const SkPaint&);
254
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000255 /** The SkDevice passed will be an SkDevice which was returned by a call to
reed76033be2015-03-14 10:54:31 -0700256 onCreateDevice on this device with kNeverTile_TileExpectation.
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000257 */
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000258 virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
259 const SkPaint&) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000260
reedf87fe782015-02-17 10:33:54 -0800261 virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, const SkPath&,
262 const SkMatrix*, const SkPaint&);
reed884e97c2015-05-26 11:31:54 -0700263
commit-bot@chromium.orga713f9c2014-03-17 21:31:26 +0000264 bool readPixels(const SkImageInfo&, void* dst, size_t rowBytes, int x, int y);
bsalomon@google.com6850eab2011-11-03 20:29:47 +0000265
reed@google.com3636ed52011-01-25 23:50:57 +0000266 ///////////////////////////////////////////////////////////////////////////
267
junov@chromium.org1f9767c2012-02-07 16:27:57 +0000268 /** Update as needed the pixel value in the bitmap, so that the caller can
skia.committer@gmail.com772c4e62013-08-30 07:01:34 +0000269 access the pixels directly.
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000270 @return The device contents as a bitmap
reed@android.com8a1c16f2008-12-17 15:59:43 +0000271 */
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000272 virtual const SkBitmap& onAccessBitmap() = 0;
vandebo@chromium.org74b46192012-01-28 01:45:11 +0000273
reed@google.com76dd2772012-01-05 21:15:07 +0000274 /**
reed@google.com8926b162012-03-23 15:36:36 +0000275 * Override and return true for filters that the device can handle
276 * intrinsically. Doing so means that SkCanvas will pass-through this
277 * filter to drawSprite and drawDevice (and potentially filterImage).
278 * Returning false means the SkCanvas will have apply the filter itself,
279 * and just pass the resulting image to the device.
reed@google.com76dd2772012-01-05 21:15:07 +0000280 */
reed89443ab2014-06-27 11:34:19 -0700281 virtual bool canHandleImageFilter(const SkImageFilter*) { return false; }
reed@google.com8926b162012-03-23 15:36:36 +0000282
283 /**
284 * Related (but not required) to canHandleImageFilter, this method returns
285 * true if the device could apply the filter to the src bitmap and return
286 * the result (and updates offset as needed).
287 * If the device does not recognize or support this filter,
288 * it just returns false and leaves result and offset unchanged.
289 */
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +0000290 virtual bool filterImage(const SkImageFilter*, const SkBitmap&,
djsollenc87dd2c2014-11-14 11:11:46 -0800291 const SkImageFilter::Context&,
292 SkBitmap* /*result*/, SkIPoint* /*offset*/) {
reed89443ab2014-06-27 11:34:19 -0700293 return false;
294 }
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000295
commit-bot@chromium.org8128d8c2013-12-19 16:12:25 +0000296protected:
reed884e97c2015-05-26 11:31:54 -0700297 virtual SkSurface* newSurface(const SkImageInfo&, const SkSurfaceProps&) { return NULL; }
298 virtual bool onPeekPixels(SkPixmap*) { return false; }
skia.committer@gmail.com02d6f542014-02-14 03:02:05 +0000299
commit-bot@chromium.org8128d8c2013-12-19 16:12:25 +0000300 /**
commit-bot@chromium.orga713f9c2014-03-17 21:31:26 +0000301 * The caller is responsible for "pre-clipping" the dst. The impl can assume that the dst
302 * image at the specified x,y offset will fit within the device's bounds.
303 *
304 * This is explicitly asserted in readPixels(), the public way to call this.
305 */
306 virtual bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y);
commit-bot@chromium.org2cccf832014-03-12 03:04:08 +0000307
308 /**
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +0000309 * The caller is responsible for "pre-clipping" the src. The impl can assume that the src
310 * image at the specified x,y offset will fit within the device's bounds.
311 *
312 * This is explicitly asserted in writePixelsDirect(), the public way to call this.
313 */
314 virtual bool onWritePixels(const SkImageInfo&, const void*, size_t, int x, int y);
315
reed884e97c2015-05-26 11:31:54 -0700316 virtual bool onAccessPixels(SkPixmap*) { return false; }
reed@google.com9c135db2014-03-12 18:28:35 +0000317
robertphillips7b05ff12015-06-19 14:14:54 -0700318 const SkSurfaceProps& surfaceProps() const {
319 return fSurfaceProps;
reede010f1c2014-09-17 10:49:38 -0700320 }
commit-bot@chromium.org8128d8c2013-12-19 16:12:25 +0000321
commit-bot@chromium.org145d1c02014-03-16 19:46:36 +0000322 /**
323 * PRIVATE / EXPERIMENTAL -- do not call
commit-bot@chromium.org145d1c02014-03-16 19:46:36 +0000324 * This entry point gives the backend an opportunity to take over the rendering
325 * of 'picture'. If optimization data is available (due to an earlier
326 * 'optimize' call) this entry point should make use of it and return true
327 * if all rendering has been done. If false is returned, SkCanvas will
skia.committer@gmail.comeb849e52014-03-17 03:02:17 +0000328 * perform its own rendering pass. It is acceptable for the backend
commit-bot@chromium.org145d1c02014-03-16 19:46:36 +0000329 * to perform some device-specific warm up tasks and then let SkCanvas
330 * perform the main rendering loop (by return false from here).
331 */
reedd5fa1a42014-08-09 11:08:05 -0700332 virtual bool EXPERIMENTAL_drawPicture(SkCanvas*, const SkPicture*, const SkMatrix*,
333 const SkPaint*);
commit-bot@chromium.org145d1c02014-03-16 19:46:36 +0000334
fmalita6987dca2014-11-13 08:33:37 -0800335 struct CreateInfo {
reed76033be2015-03-14 10:54:31 -0700336 static SkPixelGeometry AdjustGeometry(const SkImageInfo&, TileUsage, SkPixelGeometry);
fmalita6987dca2014-11-13 08:33:37 -0800337
reed76033be2015-03-14 10:54:31 -0700338 // The constructor may change the pixel geometry based on other parameters.
halcanary00b7e5e2015-04-15 13:05:18 -0700339 CreateInfo(const SkImageInfo& info,
340 TileUsage tileUsage,
341 SkPixelGeometry geo,
342 bool forImageFilter = false)
reedb2db8982014-11-13 12:41:02 -0800343 : fInfo(info)
reed76033be2015-03-14 10:54:31 -0700344 , fTileUsage(tileUsage)
345 , fPixelGeometry(AdjustGeometry(info, tileUsage, geo))
halcanary00b7e5e2015-04-15 13:05:18 -0700346 , fForImageFilter(forImageFilter) {}
reedb2db8982014-11-13 12:41:02 -0800347
reed76033be2015-03-14 10:54:31 -0700348 const SkImageInfo fInfo;
349 const TileUsage fTileUsage;
350 const SkPixelGeometry fPixelGeometry;
halcanary00b7e5e2015-04-15 13:05:18 -0700351 const bool fForImageFilter;
fmalita6987dca2014-11-13 08:33:37 -0800352 };
reedb2db8982014-11-13 12:41:02 -0800353
reed76033be2015-03-14 10:54:31 -0700354 /**
355 * Create a new device based on CreateInfo. If the paint is not null, then it represents a
356 * preview of how the new device will be composed with its creator device (this).
reed61f501f2015-04-29 08:34:00 -0700357 *
358 * The subclass may be handed this device in drawDevice(), so it must always return
359 * a device that it knows how to draw, and that it knows how to identify if it is not of the
360 * same subclass (since drawDevice is passed a SkBaseDevice*). If the subclass cannot fulfill
361 * that contract (e.g. PDF cannot support some settings on the paint) it should return NULL,
362 * and the caller may then decide to explicitly create a bitmapdevice, knowing that later
363 * it could not call drawDevice with it (but it could call drawSprite or drawBitmap).
reed76033be2015-03-14 10:54:31 -0700364 */
reed57a48a72015-03-14 04:30:21 -0700365 virtual SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) {
366 return NULL;
367 }
368
reed@android.com8a1c16f2008-12-17 15:59:43 +0000369private:
reed@google.com6f8f2922011-03-04 22:27:10 +0000370 friend class SkCanvas;
robertphillips@google.com3fffb2e2012-10-09 22:30:18 +0000371 friend struct DeviceCM; //for setMatrixClip
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000372 friend class SkDraw;
373 friend class SkDrawIter;
374 friend class SkDeviceFilteredPaint;
reed2c55d7b2015-06-09 08:18:39 -0700375 friend class SkImageFilter::Proxy;
reed@google.com9c135db2014-03-12 18:28:35 +0000376 friend class SkDeferredDevice; // for newSurface
reed78e27682014-11-19 08:04:34 -0800377 friend class SkNoPixelsBitmapDevice;
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000378
reed@google.com97af1a62012-08-28 12:19:02 +0000379 friend class SkSurface_Raster;
robertphillips@google.com1f2f3382013-08-29 11:54:56 +0000380
reed@google.com97af1a62012-08-28 12:19:02 +0000381 // used to change the backend's pixels (and possibly config/rowbytes)
382 // but cannot change the width/height, so there should be no change to
383 // any clip information.
reed@google.comec3ca872013-11-13 16:02:18 +0000384 // TODO: move to SkBitmapDevice
reed89443ab2014-06-27 11:34:19 -0700385 virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) {}
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000386
reedd9544982014-09-09 18:46:22 -0700387 virtual bool forceConservativeRasterClip() const { return false; }
388
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000389 // just called by SkCanvas when built as a layer
390 void setOrigin(int x, int y) { fOrigin.set(x, y); }
reed@google.com6f8f2922011-03-04 22:27:10 +0000391
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000392 /** Causes any deferred drawing to the device to be completed.
393 */
reed89443ab2014-06-27 11:34:19 -0700394 virtual void flush() {}
bungeman@google.com88edf1e2011-08-08 19:41:56 +0000395
senorblancobe129b22014-08-08 07:14:35 -0700396 virtual SkImageFilter::Cache* getImageFilterCache() { return NULL; }
senorblanco55b6d8b2014-07-30 11:26:46 -0700397
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000398 SkIPoint fOrigin;
399 SkMetaData* fMetaData;
robertphillips7b05ff12015-06-19 14:14:54 -0700400 SkSurfaceProps fSurfaceProps;
robertphillips@google.com15e9d3e2012-06-21 20:25:03 +0000401
robertphillips@google.com9b051a32013-08-20 20:06:40 +0000402#ifdef SK_DEBUG
403 bool fAttachedToCanvas;
404#endif
405
406 typedef SkRefCnt INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000407};
408
reed@android.com8a1c16f2008-12-17 15:59:43 +0000409#endif