OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 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 | 9 |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
11 #include "SkDebugCanvas.h" | 11 #include "SkDebugCanvas.h" |
12 #include "SkDrawCommand.h" | 12 #include "SkDrawCommand.h" |
13 #include "SkDrawFilter.h" | 13 #include "SkDrawFilter.h" |
14 #include "SkDevice.h" | 14 #include "SkDevice.h" |
15 #include "SkXfermode.h" | 15 #include "SkXfermode.h" |
16 | 16 |
17 SkDebugCanvas::SkDebugCanvas(int width, int height) | 17 SkDebugCanvas::SkDebugCanvas(int width, int height) |
18 : INHERITED(width, height) | 18 : INHERITED(width, height) |
| 19 , fPicture(NULL) |
19 , fWidth(width) | 20 , fWidth(width) |
20 , fHeight(height) | 21 , fHeight(height) |
21 , fFilter(false) | 22 , fFilter(false) |
22 , fMegaVizMode(false) | 23 , fMegaVizMode(false) |
23 , fIndex(0) | 24 , fIndex(0) |
24 , fOverdrawViz(false) | 25 , fOverdrawViz(false) |
25 , fOverdrawFilter(NULL) | 26 , fOverdrawFilter(NULL) |
26 , fOverrideTexFiltering(false) | 27 , fOverrideTexFiltering(false) |
27 , fTexOverrideFilter(NULL) | 28 , fTexOverrideFilter(NULL) |
28 , fOutstandingSaveCount(0) { | 29 , fOutstandingSaveCount(0) { |
(...skipping 19 matching lines...) Expand all Loading... |
48 this->INHERITED::onClipRect(large, SkRegion::kReplace_Op, kHard_ClipEdgeStyl
e); | 49 this->INHERITED::onClipRect(large, SkRegion::kReplace_Op, kHard_ClipEdgeStyl
e); |
49 } | 50 } |
50 | 51 |
51 SkDebugCanvas::~SkDebugCanvas() { | 52 SkDebugCanvas::~SkDebugCanvas() { |
52 fCommandVector.deleteAll(); | 53 fCommandVector.deleteAll(); |
53 SkSafeUnref(fOverdrawFilter); | 54 SkSafeUnref(fOverdrawFilter); |
54 SkSafeUnref(fTexOverrideFilter); | 55 SkSafeUnref(fTexOverrideFilter); |
55 } | 56 } |
56 | 57 |
57 void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) { | 58 void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) { |
| 59 command->setOffset(this->getOpID()); |
58 fCommandVector.push(command); | 60 fCommandVector.push(command); |
59 } | 61 } |
60 | 62 |
61 void SkDebugCanvas::draw(SkCanvas* canvas) { | 63 void SkDebugCanvas::draw(SkCanvas* canvas) { |
62 if (!fCommandVector.isEmpty()) { | 64 if (!fCommandVector.isEmpty()) { |
63 drawTo(canvas, fCommandVector.count() - 1); | 65 this->drawTo(canvas, fCommandVector.count() - 1); |
64 } | 66 } |
65 } | 67 } |
66 | 68 |
67 void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) { | 69 void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) { |
68 canvas->concat(fUserMatrix); | 70 canvas->concat(fUserMatrix); |
69 } | 71 } |
70 | 72 |
71 int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) { | 73 int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) { |
72 SkBitmap bitmap; | 74 SkBitmap bitmap; |
73 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1)); | 75 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1)); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const { | 375 SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const { |
374 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.co
unt()); | 376 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.co
unt()); |
375 if (!fCommandVector.isEmpty()) { | 377 if (!fCommandVector.isEmpty()) { |
376 for (int i = 0; i < fCommandVector.count(); i ++) { | 378 for (int i = 0; i < fCommandVector.count(); i ++) { |
377 commandString->push_back() = fCommandVector[i]->toString(); | 379 commandString->push_back() = fCommandVector[i]->toString(); |
378 } | 380 } |
379 } | 381 } |
380 return commandString; | 382 return commandString; |
381 } | 383 } |
382 | 384 |
| 385 SkTDArray<size_t>* SkDebugCanvas::getDrawCommandOffsets() const { |
| 386 SkTDArray<size_t>* commandOffsets = new SkTDArray<size_t>; |
| 387 if (!fCommandVector.isEmpty()) { |
| 388 for (int i = 0; i < fCommandVector.count(); i ++) { |
| 389 *commandOffsets->push() = fCommandVector[i]->offset(); |
| 390 } |
| 391 } |
| 392 return commandOffsets; |
| 393 } |
| 394 |
383 void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::Fil
terLevel level) { | 395 void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::Fil
terLevel level) { |
384 if (NULL == fTexOverrideFilter) { | 396 if (NULL == fTexOverrideFilter) { |
385 fTexOverrideFilter = new SkTexOverrideFilter; | 397 fTexOverrideFilter = new SkTexOverrideFilter; |
386 } | 398 } |
387 | 399 |
388 fOverrideTexFiltering = overrideTexFiltering; | 400 fOverrideTexFiltering = overrideTexFiltering; |
389 fTexOverrideFilter->setFilterLevel(level); | 401 fTexOverrideFilter->setFilterLevel(level); |
390 } | 402 } |
391 | 403 |
392 void SkDebugCanvas::clear(SkColor color) { | 404 void SkDebugCanvas::clear(SkColor color) { |
393 addDrawCommand(new SkClearCommand(color)); | 405 this->addDrawCommand(new SkClearCommand(color)); |
394 } | 406 } |
395 | 407 |
396 void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { | 408 void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { |
397 this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle ==
edgeStyle)); | 409 this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle ==
edgeStyle)); |
398 } | 410 } |
399 | 411 |
400 void SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { | 412 void SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { |
401 this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle ==
edgeStyle)); | 413 this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle ==
edgeStyle)); |
402 } | 414 } |
403 | 415 |
(...skipping 18 matching lines...) Expand all Loading... |
422 default: | 434 default: |
423 this->addDrawCommand(new SkConcatCommand(matrix)); | 435 this->addDrawCommand(new SkConcatCommand(matrix)); |
424 break; | 436 break; |
425 } | 437 } |
426 | 438 |
427 this->INHERITED::didConcat(matrix); | 439 this->INHERITED::didConcat(matrix); |
428 } | 440 } |
429 | 441 |
430 void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left, | 442 void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left, |
431 SkScalar top, const SkPaint* paint = NULL) { | 443 SkScalar top, const SkPaint* paint = NULL) { |
432 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint)); | 444 this->addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint)); |
433 } | 445 } |
434 | 446 |
435 void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, | 447 void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, |
436 const SkRect* src, const SkRect& dst, | 448 const SkRect* src, const SkRect& dst, |
437 const SkPaint* paint, | 449 const SkPaint* paint, |
438 SkCanvas::DrawBitmapRectFlags flags) { | 450 SkCanvas::DrawBitmapRectFlags flags) { |
439 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags)); | 451 this->addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, fl
ags)); |
440 } | 452 } |
441 | 453 |
442 void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap, | 454 void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap, |
443 const SkMatrix& matrix, const SkPaint* pain
t) { | 455 const SkMatrix& matrix, const SkPaint* pain
t) { |
444 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint)); | 456 this->addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint)); |
445 } | 457 } |
446 | 458 |
447 void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap, | 459 void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap, |
448 const SkIRect& center, const SkRect& dst, const SkPaint* paint) { | 460 const SkIRect& center, const SkRect& dst, const SkPaint* paint) { |
449 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint)); | 461 this->addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint)
); |
450 } | 462 } |
451 | 463 |
452 void SkDebugCanvas::drawData(const void* data, size_t length) { | 464 void SkDebugCanvas::drawData(const void* data, size_t length) { |
453 addDrawCommand(new SkDrawDataCommand(data, length)); | 465 this->addDrawCommand(new SkDrawDataCommand(data, length)); |
454 } | 466 } |
455 | 467 |
456 void SkDebugCanvas::beginCommentGroup(const char* description) { | 468 void SkDebugCanvas::beginCommentGroup(const char* description) { |
457 addDrawCommand(new SkBeginCommentGroupCommand(description)); | 469 this->addDrawCommand(new SkBeginCommentGroupCommand(description)); |
458 } | 470 } |
459 | 471 |
460 void SkDebugCanvas::addComment(const char* kywd, const char* value) { | 472 void SkDebugCanvas::addComment(const char* kywd, const char* value) { |
461 addDrawCommand(new SkCommentCommand(kywd, value)); | 473 this->addDrawCommand(new SkCommentCommand(kywd, value)); |
462 } | 474 } |
463 | 475 |
464 void SkDebugCanvas::endCommentGroup() { | 476 void SkDebugCanvas::endCommentGroup() { |
465 addDrawCommand(new SkEndCommentGroupCommand()); | 477 this->addDrawCommand(new SkEndCommentGroupCommand()); |
466 } | 478 } |
467 | 479 |
468 void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) { | 480 void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) { |
469 addDrawCommand(new SkDrawOvalCommand(oval, paint)); | 481 this->addDrawCommand(new SkDrawOvalCommand(oval, paint)); |
470 } | 482 } |
471 | 483 |
472 void SkDebugCanvas::drawPaint(const SkPaint& paint) { | 484 void SkDebugCanvas::drawPaint(const SkPaint& paint) { |
473 addDrawCommand(new SkDrawPaintCommand(paint)); | 485 this->addDrawCommand(new SkDrawPaintCommand(paint)); |
474 } | 486 } |
475 | 487 |
476 void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) { | 488 void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) { |
477 addDrawCommand(new SkDrawPathCommand(path, paint)); | 489 this->addDrawCommand(new SkDrawPathCommand(path, paint)); |
478 } | 490 } |
479 | 491 |
480 void SkDebugCanvas::drawPicture(SkPicture& picture) { | 492 void SkDebugCanvas::drawPicture(SkPicture& picture) { |
481 addDrawCommand(new SkDrawPictureCommand(picture)); | 493 this->addDrawCommand(new SkDrawPictureCommand(picture)); |
482 } | 494 } |
483 | 495 |
484 void SkDebugCanvas::drawPoints(PointMode mode, size_t count, | 496 void SkDebugCanvas::drawPoints(PointMode mode, size_t count, |
485 const SkPoint pts[], const SkPaint& paint) { | 497 const SkPoint pts[], const SkPaint& paint) { |
486 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint)); | 498 this->addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint)); |
487 } | 499 } |
488 | 500 |
489 void SkDebugCanvas::drawPosText(const void* text, size_t byteLength, | 501 void SkDebugCanvas::drawPosText(const void* text, size_t byteLength, |
490 const SkPoint pos[], const SkPaint& paint) { | 502 const SkPoint pos[], const SkPaint& paint) { |
491 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint)); | 503 this->addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint))
; |
492 } | 504 } |
493 | 505 |
494 void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength, | 506 void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength, |
495 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { | 507 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { |
496 addDrawCommand( | 508 this->addDrawCommand( |
497 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint)); | 509 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint)); |
498 } | 510 } |
499 | 511 |
500 void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { | 512 void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { |
501 // NOTE(chudy): Messing up when renamed to DrawRect... Why? | 513 // NOTE(chudy): Messing up when renamed to DrawRect... Why? |
502 addDrawCommand(new SkDrawRectCommand(rect, paint)); | 514 addDrawCommand(new SkDrawRectCommand(rect, paint)); |
503 } | 515 } |
504 | 516 |
505 void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { | 517 void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
506 addDrawCommand(new SkDrawRRectCommand(rrect, paint)); | 518 this->addDrawCommand(new SkDrawRRectCommand(rrect, paint)); |
507 } | 519 } |
508 | 520 |
509 void SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, | 521 void SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
510 const SkPaint& paint) { | 522 const SkPaint& paint) { |
511 this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint)); | 523 this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint)); |
512 } | 524 } |
513 | 525 |
514 void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, | 526 void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, |
515 const SkPaint* paint = NULL) { | 527 const SkPaint* paint = NULL) { |
516 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint)); | 528 this->addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint)); |
517 } | 529 } |
518 | 530 |
519 void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x, | 531 void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x, |
520 SkScalar y, const SkPaint& paint) { | 532 SkScalar y, const SkPaint& paint) { |
521 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint)); | 533 this->addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint)); |
522 } | 534 } |
523 | 535 |
524 void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength, | 536 void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength, |
525 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) { | 537 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) { |
526 addDrawCommand( | 538 this->addDrawCommand( |
527 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint)); | 539 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint)); |
528 } | 540 } |
529 | 541 |
530 void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount, | 542 void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount, |
531 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], | 543 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], |
532 SkXfermode*, const uint16_t indices[], int indexCount, | 544 SkXfermode*, const uint16_t indices[], int indexCount, |
533 const SkPaint& paint) { | 545 const SkPaint& paint) { |
534 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices, | 546 this->addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices, |
535 texs, colors, NULL, indices, indexCount, paint)); | 547 texs, colors, NULL, indices, indexCount, paint)); |
536 } | 548 } |
537 | 549 |
538 void SkDebugCanvas::onPushCull(const SkRect& cullRect) { | 550 void SkDebugCanvas::onPushCull(const SkRect& cullRect) { |
539 this->addDrawCommand(new SkPushCullCommand(cullRect)); | 551 this->addDrawCommand(new SkPushCullCommand(cullRect)); |
540 } | 552 } |
541 | 553 |
542 void SkDebugCanvas::onPopCull() { | 554 void SkDebugCanvas::onPopCull() { |
543 this->addDrawCommand(new SkPopCullCommand()); | 555 this->addDrawCommand(new SkPopCullCommand()); |
544 } | 556 } |
545 | 557 |
546 void SkDebugCanvas::willRestore() { | 558 void SkDebugCanvas::willRestore() { |
547 this->addDrawCommand(new SkRestoreCommand()); | 559 this->addDrawCommand(new SkRestoreCommand()); |
548 this->INHERITED::willRestore(); | 560 this->INHERITED::willRestore(); |
549 } | 561 } |
550 | 562 |
551 void SkDebugCanvas::willSave(SaveFlags flags) { | 563 void SkDebugCanvas::willSave(SaveFlags flags) { |
552 this->addDrawCommand(new SkSaveCommand(flags)); | 564 this->addDrawCommand(new SkSaveCommand(flags)); |
553 this->INHERITED::willSave(flags); | 565 this->INHERITED::willSave(flags); |
554 } | 566 } |
555 | 567 |
556 SkCanvas::SaveLayerStrategy SkDebugCanvas::willSaveLayer(const SkRect* bounds, c
onst SkPaint* paint, | 568 SkCanvas::SaveLayerStrategy SkDebugCanvas::willSaveLayer(const SkRect* bounds, c
onst SkPaint* paint, |
557 SaveFlags flags) { | 569 SaveFlags flags) { |
558 this->addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags)); | 570 this->addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags)); |
559 this->INHERITED::willSaveLayer(bounds, paint, flags); | 571 this->INHERITED::willSaveLayer(bounds, paint, flags); |
560 // No need for a full layer. | 572 // No need for a full layer. |
561 return kNoLayer_SaveLayerStrategy; | 573 return kNoLayer_SaveLayerStrategy; |
562 } | 574 } |
563 | 575 |
564 void SkDebugCanvas::didSetMatrix(const SkMatrix& matrix) { | 576 void SkDebugCanvas::didSetMatrix(const SkMatrix& matrix) { |
565 addDrawCommand(new SkSetMatrixCommand(matrix)); | 577 this->addDrawCommand(new SkSetMatrixCommand(matrix)); |
566 this->INHERITED::didSetMatrix(matrix); | 578 this->INHERITED::didSetMatrix(matrix); |
567 } | 579 } |
568 | 580 |
569 void SkDebugCanvas::toggleCommand(int index, bool toggle) { | 581 void SkDebugCanvas::toggleCommand(int index, bool toggle) { |
570 SkASSERT(index < fCommandVector.count()); | 582 SkASSERT(index < fCommandVector.count()); |
571 fCommandVector[index]->setVisible(toggle); | 583 fCommandVector[index]->setVisible(toggle); |
572 } | 584 } |
OLD | NEW |