OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2013 Google Inc. | 3 * Copyright 2013 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkDeferredCanvas.h" | 9 #include "SkDeferredCanvas.h" |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 fBlock = NULL; | 130 fBlock = NULL; |
131 } | 131 } |
132 | 132 |
133 // Release all allocated blocks | 133 // Release all allocated blocks |
134 fAllocator.reset(); | 134 fAllocator.reset(); |
135 } | 135 } |
136 | 136 |
137 //----------------------------------------------------------------------------- | 137 //----------------------------------------------------------------------------- |
138 // DeferredDevice | 138 // DeferredDevice |
139 //----------------------------------------------------------------------------- | 139 //----------------------------------------------------------------------------- |
140 // FIXME: Derive from SkBaseDevice. | 140 class DeferredDevice : public SkBaseDevice { |
141 class DeferredDevice : public SkBitmapDevice { | |
142 public: | 141 public: |
143 explicit DeferredDevice(SkSurface* surface); | 142 explicit DeferredDevice(SkSurface* surface); |
144 ~DeferredDevice(); | 143 ~DeferredDevice(); |
145 | 144 |
146 void setNotificationClient(SkDeferredCanvas::NotificationClient* notificatio
nClient); | 145 void setNotificationClient(SkDeferredCanvas::NotificationClient* notificatio
nClient); |
147 SkCanvas* recordingCanvas(); | 146 SkCanvas* recordingCanvas(); |
148 SkCanvas* immediateCanvas() const {return fImmediateCanvas;} | 147 SkCanvas* immediateCanvas() const {return fImmediateCanvas;} |
149 SkBaseDevice* immediateDevice() const {return fImmediateCanvas->getTopDevice
();} | 148 SkBaseDevice* immediateDevice() const {return fImmediateCanvas->getTopDevice
();} |
150 SkImage* newImageSnapshot(); | 149 SkImage* newImageSnapshot(); |
151 void setSurface(SkSurface* surface); | 150 void setSurface(SkSurface* surface); |
152 bool isFreshFrame(); | 151 bool isFreshFrame(); |
153 bool hasPendingCommands(); | 152 bool hasPendingCommands(); |
154 size_t storageAllocatedForRecording() const; | 153 size_t storageAllocatedForRecording() const; |
155 size_t freeMemoryIfPossible(size_t bytesToFree); | 154 size_t freeMemoryIfPossible(size_t bytesToFree); |
156 size_t getBitmapSizeThreshold() const; | 155 size_t getBitmapSizeThreshold() const; |
157 void setBitmapSizeThreshold(size_t sizeThreshold); | 156 void setBitmapSizeThreshold(size_t sizeThreshold); |
158 void flushPendingCommands(PlaybackMode); | 157 void flushPendingCommands(PlaybackMode); |
159 void skipPendingCommands(); | 158 void skipPendingCommands(); |
160 void setMaxRecordingStorage(size_t); | 159 void setMaxRecordingStorage(size_t); |
161 void recordedDrawCommand(); | 160 void recordedDrawCommand(); |
162 | 161 |
163 virtual uint32_t getDeviceCapabilities() SK_OVERRIDE; | 162 virtual uint32_t getDeviceCapabilities() SK_OVERRIDE; |
164 virtual int width() const SK_OVERRIDE; | 163 virtual int width() const SK_OVERRIDE; |
165 virtual int height() const SK_OVERRIDE; | 164 virtual int height() const SK_OVERRIDE; |
| 165 virtual SkBitmap::Config config() const SK_OVERRIDE; |
| 166 virtual bool isOpaque() const SK_OVERRIDE; |
| 167 virtual SkImageInfo imageInfo() const SK_OVERRIDE; |
| 168 |
166 virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE; | 169 virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE; |
167 | 170 |
168 virtual SkBaseDevice* onCreateCompatibleDevice(SkBitmap::Config config, | 171 virtual SkBaseDevice* onCreateCompatibleDevice(SkBitmap::Config config, |
169 int width, int height, | 172 int width, int height, |
170 bool isOpaque, | 173 bool isOpaque, |
171 Usage usage) SK_OVERRIDE; | 174 Usage usage) SK_OVERRIDE; |
172 | 175 |
173 virtual void writePixels(const SkBitmap& bitmap, int x, int y, | 176 virtual void writePixels(const SkBitmap& bitmap, int x, int y, |
174 SkCanvas::Config8888 config8888) SK_OVERRIDE; | 177 SkCanvas::Config8888 config8888) SK_OVERRIDE; |
175 | 178 |
(...skipping 16 matching lines...) Expand all Loading... |
192 {SkASSERT(0);} | 195 {SkASSERT(0);} |
193 virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE | 196 virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE |
194 {SkASSERT(0);} | 197 {SkASSERT(0);} |
195 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, | 198 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, |
196 size_t count, const SkPoint[], | 199 size_t count, const SkPoint[], |
197 const SkPaint& paint) SK_OVERRIDE | 200 const SkPaint& paint) SK_OVERRIDE |
198 {SkASSERT(0);} | 201 {SkASSERT(0);} |
199 virtual void drawRect(const SkDraw&, const SkRect& r, | 202 virtual void drawRect(const SkDraw&, const SkRect& r, |
200 const SkPaint& paint) SK_OVERRIDE | 203 const SkPaint& paint) SK_OVERRIDE |
201 {SkASSERT(0);} | 204 {SkASSERT(0);} |
| 205 virtual void drawOval(const SkDraw&, const SkRect&, const SkPaint&) SK_OVERR
IDE |
| 206 {SkASSERT(0);} |
202 virtual void drawRRect(const SkDraw&, const SkRRect& rr, | 207 virtual void drawRRect(const SkDraw&, const SkRRect& rr, |
203 const SkPaint& paint) SK_OVERRIDE | 208 const SkPaint& paint) SK_OVERRIDE |
204 {SkASSERT(0);} | 209 {SkASSERT(0);} |
205 virtual void drawPath(const SkDraw&, const SkPath& path, | 210 virtual void drawPath(const SkDraw&, const SkPath& path, |
206 const SkPaint& paint, | 211 const SkPaint& paint, |
207 const SkMatrix* prePathMatrix = NULL, | 212 const SkMatrix* prePathMatrix = NULL, |
208 bool pathIsMutable = false) SK_OVERRIDE | 213 bool pathIsMutable = false) SK_OVERRIDE |
209 {SkASSERT(0);} | 214 {SkASSERT(0);} |
210 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap, | 215 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap, |
211 const SkMatrix& matrix, const SkPaint& paint) SK_OVE
RRIDE | 216 const SkMatrix& matrix, const SkPaint& paint) SK_OVE
RRIDE |
212 {SkASSERT(0);} | 217 {SkASSERT(0);} |
| 218 virtual void drawBitmapRect(const SkDraw&, const SkBitmap&, const SkRect*, |
| 219 const SkRect&, const SkPaint&, |
| 220 SkCanvas::DrawBitmapRectFlags) SK_OVERRIDE |
| 221 {SkASSERT(0);} |
213 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap, | 222 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap, |
214 int x, int y, const SkPaint& paint) SK_OVERRIDE | 223 int x, int y, const SkPaint& paint) SK_OVERRIDE |
215 {SkASSERT(0);} | 224 {SkASSERT(0);} |
216 virtual void drawText(const SkDraw&, const void* text, size_t len, | 225 virtual void drawText(const SkDraw&, const void* text, size_t len, |
217 SkScalar x, SkScalar y, const SkPaint& paint) SK_OVE
RRIDE | 226 SkScalar x, SkScalar y, const SkPaint& paint) SK_OVE
RRIDE |
218 {SkASSERT(0);} | 227 {SkASSERT(0);} |
219 virtual void drawPosText(const SkDraw&, const void* text, size_t len, | 228 virtual void drawPosText(const SkDraw&, const void* text, size_t len, |
220 const SkScalar pos[], SkScalar constY, | 229 const SkScalar pos[], SkScalar constY, |
221 int scalarsPerPos, const SkPaint& paint) SK_OVER
RIDE | 230 int scalarsPerPos, const SkPaint& paint) SK_OVER
RIDE |
222 {SkASSERT(0);} | 231 {SkASSERT(0);} |
223 virtual void drawTextOnPath(const SkDraw&, const void* text, | 232 virtual void drawTextOnPath(const SkDraw&, const void* text, |
224 size_t len, const SkPath& path, | 233 size_t len, const SkPath& path, |
225 const SkMatrix* matrix, | 234 const SkMatrix* matrix, |
226 const SkPaint& paint) SK_OVERRIDE | 235 const SkPaint& paint) SK_OVERRIDE |
227 {SkASSERT(0);} | 236 {SkASSERT(0);} |
228 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, | 237 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, |
229 int vertexCount, const SkPoint verts[], | 238 int vertexCount, const SkPoint verts[], |
230 const SkPoint texs[], const SkColor colors[], | 239 const SkPoint texs[], const SkColor colors[], |
231 SkXfermode* xmode, const uint16_t indices[], | 240 SkXfermode* xmode, const uint16_t indices[], |
232 int indexCount, const SkPaint& paint) SK_OVERRID
E | 241 int indexCount, const SkPaint& paint) SK_OVERRID
E |
233 {SkASSERT(0);} | 242 {SkASSERT(0);} |
234 virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, | 243 virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, |
235 const SkPaint&) SK_OVERRIDE | 244 const SkPaint&) SK_OVERRIDE |
236 {SkASSERT(0);} | 245 {SkASSERT(0);} |
| 246 |
| 247 virtual void lockPixels() SK_OVERRIDE {} |
| 248 virtual void unlockPixels() SK_OVERRIDE {} |
| 249 |
| 250 virtual bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE { |
| 251 return false; |
| 252 } |
| 253 virtual bool canHandleImageFilter(const SkImageFilter*) SK_OVERRIDE { |
| 254 return false; |
| 255 } |
| 256 virtual bool filterImage(const SkImageFilter*, const SkBitmap&, |
| 257 const SkMatrix&, SkBitmap*, SkIPoint*) SK_OVERRIDE
{ |
| 258 return false; |
| 259 } |
| 260 |
237 private: | 261 private: |
238 virtual void flush() SK_OVERRIDE; | 262 virtual void flush() SK_OVERRIDE; |
| 263 virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) SK_OVERRI
DE {} |
239 | 264 |
240 void beginRecording(); | 265 void beginRecording(); |
241 void init(); | 266 void init(); |
242 void aboutToDraw(); | 267 void aboutToDraw(); |
243 void prepareForImmediatePixelWrite(); | 268 void prepareForImmediatePixelWrite(); |
244 | 269 |
245 DeferredPipeController fPipeController; | 270 DeferredPipeController fPipeController; |
246 SkGPipeWriter fPipeWriter; | 271 SkGPipeWriter fPipeWriter; |
247 SkCanvas* fImmediateCanvas; | 272 SkCanvas* fImmediateCanvas; |
248 SkCanvas* fRecordingCanvas; | 273 SkCanvas* fRecordingCanvas; |
249 SkSurface* fSurface; | 274 SkSurface* fSurface; |
250 SkDeferredCanvas::NotificationClient* fNotificationClient; | 275 SkDeferredCanvas::NotificationClient* fNotificationClient; |
251 bool fFreshFrame; | 276 bool fFreshFrame; |
252 bool fCanDiscardCanvasContents; | 277 bool fCanDiscardCanvasContents; |
253 size_t fMaxRecordingStorageBytes; | 278 size_t fMaxRecordingStorageBytes; |
254 size_t fPreviousStorageAllocated; | 279 size_t fPreviousStorageAllocated; |
255 size_t fBitmapSizeThreshold; | 280 size_t fBitmapSizeThreshold; |
256 }; | 281 }; |
257 | 282 |
258 DeferredDevice::DeferredDevice(SkSurface* surface) | 283 DeferredDevice::DeferredDevice(SkSurface* surface) { |
259 : SkBitmapDevice(SkBitmap::kNo_Config, | |
260 surface->getCanvas()->getDevice()->width(), | |
261 surface->getCanvas()->getDevice()->height(), | |
262 surface->getCanvas()->getDevice()->isOpaque(), | |
263 surface->getCanvas()->getDevice()->getDeviceProperties()) { | |
264 fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes; | 284 fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes; |
265 fNotificationClient = NULL; | 285 fNotificationClient = NULL; |
266 fImmediateCanvas = NULL; | 286 fImmediateCanvas = NULL; |
267 fSurface = NULL; | 287 fSurface = NULL; |
268 this->setSurface(surface); | 288 this->setSurface(surface); |
269 this->init(); | 289 this->init(); |
270 } | 290 } |
271 | 291 |
272 void DeferredDevice::setSurface(SkSurface* surface) { | 292 void DeferredDevice::setSurface(SkSurface* surface) { |
273 SkRefCnt_SafeAssign(fImmediateCanvas, surface->getCanvas()); | 293 SkRefCnt_SafeAssign(fImmediateCanvas, surface->getCanvas()); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 } | 440 } |
421 | 441 |
422 int DeferredDevice::width() const { | 442 int DeferredDevice::width() const { |
423 return immediateDevice()->width(); | 443 return immediateDevice()->width(); |
424 } | 444 } |
425 | 445 |
426 int DeferredDevice::height() const { | 446 int DeferredDevice::height() const { |
427 return immediateDevice()->height(); | 447 return immediateDevice()->height(); |
428 } | 448 } |
429 | 449 |
| 450 SkBitmap::Config DeferredDevice::config() const { |
| 451 return immediateDevice()->config(); |
| 452 } |
| 453 |
| 454 bool DeferredDevice::isOpaque() const { |
| 455 return immediateDevice()->isOpaque(); |
| 456 } |
| 457 |
| 458 SkImageInfo DeferredDevice::imageInfo() const { |
| 459 return immediateDevice()->imageInfo(); |
| 460 } |
| 461 |
430 GrRenderTarget* DeferredDevice::accessRenderTarget() { | 462 GrRenderTarget* DeferredDevice::accessRenderTarget() { |
431 this->flushPendingCommands(kNormal_PlaybackMode); | 463 this->flushPendingCommands(kNormal_PlaybackMode); |
432 return immediateDevice()->accessRenderTarget(); | 464 return immediateDevice()->accessRenderTarget(); |
433 } | 465 } |
434 | 466 |
435 void DeferredDevice::prepareForImmediatePixelWrite() { | 467 void DeferredDevice::prepareForImmediatePixelWrite() { |
436 // The purpose of the following code is to make sure commands are flushed, t
hat | 468 // The purpose of the following code is to make sure commands are flushed, t
hat |
437 // aboutToDraw() is called and that notifyContentWillChange is called, witho
ut | 469 // aboutToDraw() is called and that notifyContentWillChange is called, witho
ut |
438 // calling anything redundantly. | 470 // calling anything redundantly. |
439 if (fPipeController.hasPendingCommands()) { | 471 if (fPipeController.hasPendingCommands()) { |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { | 1020 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { |
989 this->drawingCanvas()->setDrawFilter(filter); | 1021 this->drawingCanvas()->setDrawFilter(filter); |
990 this->INHERITED::setDrawFilter(filter); | 1022 this->INHERITED::setDrawFilter(filter); |
991 this->recordedDrawCommand(); | 1023 this->recordedDrawCommand(); |
992 return filter; | 1024 return filter; |
993 } | 1025 } |
994 | 1026 |
995 SkCanvas* SkDeferredCanvas::canvasForDrawIter() { | 1027 SkCanvas* SkDeferredCanvas::canvasForDrawIter() { |
996 return this->drawingCanvas(); | 1028 return this->drawingCanvas(); |
997 } | 1029 } |
OLD | NEW |