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