OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2007 The Android Open Source Project | 3 * Copyright 2007 The Android Open Source Project |
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 | 9 |
10 #ifndef SkPicture_DEFINED | 10 #ifndef SkPicture_DEFINED |
11 #define SkPicture_DEFINED | 11 #define SkPicture_DEFINED |
12 | 12 |
13 #include "SkBitmap.h" | 13 #include "SkBitmap.h" |
14 #include "SkImageDecoder.h" | 14 #include "SkImageDecoder.h" |
15 #include "SkRefCnt.h" | 15 #include "SkRefCnt.h" |
16 | 16 |
17 #if SK_SUPPORT_GPU | 17 #if SK_SUPPORT_GPU |
18 class GrContext; | 18 class GrContext; |
19 #endif | 19 #endif |
20 | 20 |
| 21 class SkBBHFactory; |
21 class SkBBoxHierarchy; | 22 class SkBBoxHierarchy; |
22 class SkCanvas; | 23 class SkCanvas; |
23 class SkDrawPictureCallback; | 24 class SkDrawPictureCallback; |
24 class SkData; | 25 class SkData; |
25 class SkPicturePlayback; | 26 class SkPicturePlayback; |
26 class SkPictureRecord; | 27 class SkPictureRecord; |
27 class SkStream; | 28 class SkStream; |
28 class SkWStream; | 29 class SkWStream; |
29 | 30 |
30 struct SkPictInfo; | 31 struct SkPictInfo; |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 discarded if you serialize into a stream and then deserialize. | 168 discarded if you serialize into a stream and then deserialize. |
168 */ | 169 */ |
169 kOptimizeForClippedPlayback_RecordingFlag = 0x02, | 170 kOptimizeForClippedPlayback_RecordingFlag = 0x02, |
170 }; | 171 }; |
171 #ifndef SK_SUPPORT_DEPRECATED_RECORD_FLAGS | 172 #ifndef SK_SUPPORT_DEPRECATED_RECORD_FLAGS |
172 public: | 173 public: |
173 #endif | 174 #endif |
174 | 175 |
175 #ifndef SK_SUPPORT_LEGACY_PICTURE_CAN_RECORD | 176 #ifndef SK_SUPPORT_LEGACY_PICTURE_CAN_RECORD |
176 private: | 177 private: |
177 friend class SkPictureRecorder; | |
178 friend class SkImage_Picture; | |
179 friend class SkSurface_Picture; | |
180 #endif | 178 #endif |
181 | 179 |
| 180 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
| 181 |
182 /** Returns the canvas that records the drawing commands. | 182 /** Returns the canvas that records the drawing commands. |
183 @param width the base width for the picture, as if the recording | 183 @param width the base width for the picture, as if the recording |
184 canvas' bitmap had this width. | 184 canvas' bitmap had this width. |
185 @param height the base width for the picture, as if the recording | 185 @param height the base width for the picture, as if the recording |
186 canvas' bitmap had this height. | 186 canvas' bitmap had this height. |
187 @param recordFlags optional flags that control recording. | 187 @param recordFlags optional flags that control recording. |
188 @return the picture canvas. | 188 @return the picture canvas. |
189 */ | 189 */ |
190 SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0); | 190 SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0); |
| 191 #endif |
191 | 192 |
192 /** Returns the recording canvas if one is active, or NULL if recording is | 193 /** Returns the recording canvas if one is active, or NULL if recording is |
193 not active. This does not alter the refcnt on the canvas (if present). | 194 not active. This does not alter the refcnt on the canvas (if present). |
194 */ | 195 */ |
195 SkCanvas* getRecordingCanvas() const; | 196 SkCanvas* getRecordingCanvas() const; |
196 /** Signal that the caller is done recording. This invalidates the canvas | 197 /** Signal that the caller is done recording. This invalidates the canvas |
197 returned by beginRecording/getRecordingCanvas, and prepares the picture | 198 returned by beginRecording/getRecordingCanvas, and prepares the picture |
198 for drawing. Note: this happens implicitly the first time the picture | 199 for drawing. Note: this happens implicitly the first time the picture |
199 is drawn. | 200 is drawn. |
200 */ | 201 */ |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 SkPictureRecord* fRecord; | 340 SkPictureRecord* fRecord; |
340 int fWidth, fHeight; | 341 int fWidth, fHeight; |
341 const AccelData* fAccelData; | 342 const AccelData* fAccelData; |
342 | 343 |
343 void needsNewGenID() { fUniqueID = SK_InvalidGenID; } | 344 void needsNewGenID() { fUniqueID = SK_InvalidGenID; } |
344 | 345 |
345 // Create a new SkPicture from an existing SkPicturePlayback. Ref count of | 346 // Create a new SkPicture from an existing SkPicturePlayback. Ref count of |
346 // playback is unchanged. | 347 // playback is unchanged. |
347 SkPicture(SkPicturePlayback*, int width, int height); | 348 SkPicture(SkPicturePlayback*, int width, int height); |
348 | 349 |
| 350 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
349 // For testing. Derived classes may instantiate an alternate | 351 // For testing. Derived classes may instantiate an alternate |
350 // SkBBoxHierarchy implementation | 352 // SkBBoxHierarchy implementation |
351 virtual SkBBoxHierarchy* createBBoxHierarchy() const; | 353 virtual SkBBoxHierarchy* createBBoxHierarchy() const; |
| 354 #endif |
| 355 |
| 356 SkCanvas* beginRecording(int width, int height, SkBBHFactory* factory, uint3
2_t recordFlags); |
352 | 357 |
353 private: | 358 private: |
354 // An OperationList encapsulates a set of operation offsets into the picture
byte | 359 // An OperationList encapsulates a set of operation offsets into the picture
byte |
355 // stream along with the CTMs needed for those operation. | 360 // stream along with the CTMs needed for those operation. |
356 class OperationList : ::SkNoncopyable { | 361 class OperationList : ::SkNoncopyable { |
357 public: | 362 public: |
358 virtual ~OperationList() {} | 363 virtual ~OperationList() {} |
359 | 364 |
360 // If valid returns false then there is no optimization data | 365 // If valid returns false then there is no optimization data |
361 // present. All the draw operations need to be issued. | 366 // present. All the draw operations need to be issued. |
(...skipping 19 matching lines...) Expand all Loading... |
381 Return the ID of the operation currently being executed when playing | 386 Return the ID of the operation currently being executed when playing |
382 back. 0 indicates no call is active. | 387 back. 0 indicates no call is active. |
383 */ | 388 */ |
384 size_t EXPERIMENTAL_curOpID() const; | 389 size_t EXPERIMENTAL_curOpID() const; |
385 | 390 |
386 void createHeader(SkPictInfo* info) const; | 391 void createHeader(SkPictInfo* info) const; |
387 static bool IsValidPictInfo(const SkPictInfo& info); | 392 static bool IsValidPictInfo(const SkPictInfo& info); |
388 | 393 |
389 friend class SkFlatPicture; | 394 friend class SkFlatPicture; |
390 friend class SkPicturePlayback; | 395 friend class SkPicturePlayback; |
| 396 friend class SkPictureRecorder; |
391 friend class SkGpuDevice; | 397 friend class SkGpuDevice; |
392 friend class GrGatherDevice; | 398 friend class GrGatherDevice; |
393 friend class SkDebugCanvas; | 399 friend class SkDebugCanvas; |
394 | 400 |
395 typedef SkRefCnt INHERITED; | 401 typedef SkRefCnt INHERITED; |
396 }; | 402 }; |
397 | 403 |
398 /** | 404 /** |
399 * Subclasses of this can be passed to canvas.drawPicture. During the drawing | 405 * Subclasses of this can be passed to canvas.drawPicture. During the drawing |
400 * of the picture, this callback will periodically be invoked. If its | 406 * of the picture, this callback will periodically be invoked. If its |
401 * abortDrawing() returns true, then picture playback will be interrupted. | 407 * abortDrawing() returns true, then picture playback will be interrupted. |
402 * | 408 * |
403 * The resulting drawing is undefined, as there is no guarantee how often the | 409 * The resulting drawing is undefined, as there is no guarantee how often the |
404 * callback will be invoked. If the abort happens inside some level of nested | 410 * callback will be invoked. If the abort happens inside some level of nested |
405 * calls to save(), restore will automatically be called to return the state | 411 * calls to save(), restore will automatically be called to return the state |
406 * to the same level it was before the drawPicture call was made. | 412 * to the same level it was before the drawPicture call was made. |
407 */ | 413 */ |
408 class SK_API SkDrawPictureCallback { | 414 class SK_API SkDrawPictureCallback { |
409 public: | 415 public: |
410 SkDrawPictureCallback() {} | 416 SkDrawPictureCallback() {} |
411 virtual ~SkDrawPictureCallback() {} | 417 virtual ~SkDrawPictureCallback() {} |
412 | 418 |
413 virtual bool abortDrawing() = 0; | 419 virtual bool abortDrawing() = 0; |
414 }; | 420 }; |
415 | 421 |
| 422 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
| 423 |
416 class SkPictureFactory : public SkRefCnt { | 424 class SkPictureFactory : public SkRefCnt { |
417 public: | 425 public: |
418 /** | 426 /** |
419 * Allocate a new SkPicture. Return NULL on failure. | 427 * Allocate a new SkPicture. Return NULL on failure. |
420 */ | 428 */ |
421 virtual SkPicture* create(int width, int height) = 0; | 429 virtual SkPicture* create(int width, int height) = 0; |
422 | 430 |
423 private: | 431 private: |
424 typedef SkRefCnt INHERITED; | 432 typedef SkRefCnt INHERITED; |
425 }; | 433 }; |
426 | 434 |
| 435 #endif |
| 436 |
| 437 class SkBBHFactory { |
| 438 public: |
| 439 /** |
| 440 * Allocate a new SkBBoxHierarchy. Return NULL on failure. |
| 441 */ |
| 442 virtual SkBBoxHierarchy* operator()(int width, int height) const = 0; |
| 443 virtual ~SkBBHFactory() {}; |
| 444 }; |
| 445 |
427 class SK_API SkPictureRecorder : SkNoncopyable { | 446 class SK_API SkPictureRecorder : SkNoncopyable { |
428 public: | 447 public: |
| 448 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
| 449 |
429 SkPictureRecorder(SkPictureFactory* factory = NULL) { | 450 SkPictureRecorder(SkPictureFactory* factory = NULL) { |
430 fFactory.reset(factory); | 451 fFactory.reset(factory); |
431 if (NULL != fFactory.get()) { | 452 if (NULL != fFactory.get()) { |
432 fFactory.get()->ref(); | 453 fFactory.get()->ref(); |
433 } | 454 } |
434 } | 455 } |
435 | 456 |
436 /** Returns the canvas that records the drawing commands. | 457 /** Returns the canvas that records the drawing commands. |
437 @param width the base width for the picture, as if the recording | 458 @param width the base width for the picture, as if the recording |
438 canvas' bitmap had this width. | 459 canvas' bitmap had this width. |
439 @param height the base width for the picture, as if the recording | 460 @param height the base width for the picture, as if the recording |
440 canvas' bitmap had this height. | 461 canvas' bitmap had this height. |
441 @param recordFlags optional flags that control recording. | 462 @param recordFlags optional flags that control recording. |
442 @return the canvas. | 463 @return the canvas. |
443 */ | 464 */ |
444 SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0) { | 465 SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0) { |
445 if (NULL != fFactory) { | 466 if (NULL != fFactory) { |
446 fPicture.reset(fFactory->create(width, height)); | 467 fPicture.reset(fFactory->create(width, height)); |
447 recordFlags |= SkPicture::kOptimizeForClippedPlayback_RecordingFlag; | 468 recordFlags |= SkPicture::kOptimizeForClippedPlayback_RecordingFlag; |
448 } else { | 469 } else { |
449 fPicture.reset(SkNEW(SkPicture)); | 470 fPicture.reset(SkNEW(SkPicture)); |
450 } | 471 } |
451 | 472 |
452 return fPicture->beginRecording(width, height, recordFlags); | 473 return fPicture->beginRecording(width, height, recordFlags); |
453 } | 474 } |
| 475 #endif |
| 476 |
| 477 /** Returns the canvas that records the drawing commands. |
| 478 @param width the base width for the picture, as if the recording |
| 479 canvas' bitmap had this width. |
| 480 @param height the base width for the picture, as if the recording |
| 481 canvas' bitmap had this height. |
| 482 @param bbhFactory factory to create desired acceleration structure |
| 483 @param recordFlags optional flags that control recording. |
| 484 @return the canvas. |
| 485 */ |
| 486 // TODO: allow default parameters once the other beginRecoding entry point i
s gone |
| 487 SkCanvas* beginRecording(int width, int height, |
| 488 SkBBHFactory* bbhFactory /* = NULL */, |
| 489 uint32_t recordFlags /* = 0 */) { |
| 490 fPicture.reset(SkNEW(SkPicture)); |
| 491 return fPicture->beginRecording(width, height, bbhFactory, recordFlags); |
| 492 } |
454 | 493 |
455 /** Returns the recording canvas if one is active, or NULL if recording is | 494 /** Returns the recording canvas if one is active, or NULL if recording is |
456 not active. This does not alter the refcnt on the canvas (if present). | 495 not active. This does not alter the refcnt on the canvas (if present). |
457 */ | 496 */ |
458 SkCanvas* getRecordingCanvas() { | 497 SkCanvas* getRecordingCanvas() { |
459 if (NULL != fPicture.get()) { | 498 if (NULL != fPicture.get()) { |
460 return fPicture->getRecordingCanvas(); | 499 return fPicture->getRecordingCanvas(); |
461 } | 500 } |
462 return NULL; | 501 return NULL; |
463 } | 502 } |
(...skipping 17 matching lines...) Expand all Loading... |
481 appear in an .skp we have to disable the optimization). Call right | 520 appear in an .skp we have to disable the optimization). Call right |
482 after 'beginRecording'. | 521 after 'beginRecording'. |
483 */ | 522 */ |
484 void internalOnly_EnableOpts(bool enableOpts) { | 523 void internalOnly_EnableOpts(bool enableOpts) { |
485 if (NULL != fPicture.get()) { | 524 if (NULL != fPicture.get()) { |
486 fPicture->internalOnly_EnableOpts(enableOpts); | 525 fPicture->internalOnly_EnableOpts(enableOpts); |
487 } | 526 } |
488 } | 527 } |
489 | 528 |
490 private: | 529 private: |
491 SkAutoTUnref<SkPictureFactory> fFactory; | 530 #ifdef SK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES |
492 SkAutoTUnref<SkPicture> fPicture; | 531 SkAutoTUnref<SkPictureFactory> fFactory; |
| 532 #endif |
| 533 |
| 534 SkAutoTUnref<SkPicture> fPicture; |
493 | 535 |
494 typedef SkNoncopyable INHERITED; | 536 typedef SkNoncopyable INHERITED; |
495 }; | 537 }; |
496 | 538 |
497 #endif | 539 #endif |
OLD | NEW |