Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: src/pipe/SkGPipeWrite.cpp

Issue 267863002: 4x allocation in PipeController is probably overkill. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: keep test Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/pipe/utils/SamplePipeControllers.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 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 "SkAnnotation.h" 9 #include "SkAnnotation.h"
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
(...skipping 11 matching lines...) Expand all
22 #include "SkPathEffect.h" 22 #include "SkPathEffect.h"
23 #include "SkPictureFlat.h" 23 #include "SkPictureFlat.h"
24 #include "SkRasterizer.h" 24 #include "SkRasterizer.h"
25 #include "SkRRect.h" 25 #include "SkRRect.h"
26 #include "SkShader.h" 26 #include "SkShader.h"
27 #include "SkStream.h" 27 #include "SkStream.h"
28 #include "SkTSearch.h" 28 #include "SkTSearch.h"
29 #include "SkTypeface.h" 29 #include "SkTypeface.h"
30 #include "SkWriter32.h" 30 #include "SkWriter32.h"
31 31
32 #if SK_DEBUG
33 // When debugging, allocate snuggly.
34 static const size_t kMinBlockSize = 0;
35 #else
36 // For peformance, make large allocations.
37 static const size_t kMinBlockSize = 16 * 1024;
38 #endif
39
32 enum { 40 enum {
33 kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector) 41 kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector)
34 }; 42 };
35 43
36 static bool isCrossProcess(uint32_t flags) { 44 static bool isCrossProcess(uint32_t flags) {
37 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag); 45 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag);
38 } 46 }
39 47
40 static SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 48 static SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) {
41 SkASSERT(paintFlat < kCount_PaintFlats); 49 SkASSERT(paintFlat < kCount_PaintFlats);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 int flattenToIndex(SkFlattenable* obj, PaintFlats); 351 int flattenToIndex(SkFlattenable* obj, PaintFlats);
344 352
345 // Common code used by drawBitmap*. Behaves differently depending on the 353 // Common code used by drawBitmap*. Behaves differently depending on the
346 // type of SkBitmapHeap being used, which is determined by the flags used. 354 // type of SkBitmapHeap being used, which is determined by the flags used.
347 bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, 355 bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags,
348 size_t opBytesNeeded, const SkPaint* paint); 356 size_t opBytesNeeded, const SkPaint* paint);
349 357
350 SkPaint fPaint; 358 SkPaint fPaint;
351 void writePaint(const SkPaint&); 359 void writePaint(const SkPaint&);
352 360
353 class AutoPipeNotify {
354 public:
355 AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {}
356 ~AutoPipeNotify() { fCanvas->doNotify(); }
357 private:
358 SkGPipeCanvas* fCanvas;
359 };
360 friend class AutoPipeNotify;
361
362 typedef SkCanvas INHERITED; 361 typedef SkCanvas INHERITED;
363 }; 362 };
364 363
365 void SkGPipeCanvas::flattenFactoryNames() { 364 void SkGPipeCanvas::flattenFactoryNames() {
366 const char* name; 365 const char* name;
367 while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { 366 while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) {
368 size_t len = strlen(name); 367 size_t len = strlen(name);
369 if (this->needOpBytes(len)) { 368 if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) {
370 this->writeOp(kDef_Factory_DrawOp); 369 this->writeOp(kDef_Factory_DrawOp);
371 fWriter.writeString(name, len); 370 fWriter.writeString(name, len);
372 } 371 }
373 } 372 }
374 } 373 }
375 374
376 bool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { 375 bool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) {
377 SkASSERT(shouldFlattenBitmaps(fFlags)); 376 SkASSERT(shouldFlattenBitmaps(fFlags));
378 SkWriteBuffer buffer; 377 SkWriteBuffer buffer;
379 buffer.setNamedFactoryRecorder(fFactorySet); 378 buffer.setNamedFactoryRecorder(fFactorySet);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 } 413 }
415 } 414 }
416 if (replaced) { 415 if (replaced) {
417 index = ~index; 416 index = ~index;
418 } 417 }
419 return index; 418 return index;
420 } 419 }
421 420
422 /////////////////////////////////////////////////////////////////////////////// 421 ///////////////////////////////////////////////////////////////////////////////
423 422
424 #define MIN_BLOCK_SIZE (16 * 1024)
425 #define BITMAPS_TO_KEEP 5 423 #define BITMAPS_TO_KEEP 5
426 #define FLATTENABLES_TO_KEEP 10 424 #define FLATTENABLES_TO_KEEP 10
427 425
428 SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 426 SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller,
429 SkWriter32* writer, uint32_t flags, 427 SkWriter32* writer, uint32_t flags,
430 uint32_t width, uint32_t height) 428 uint32_t width, uint32_t height)
431 : SkCanvas(width, height) 429 : SkCanvas(width, height)
432 , fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL) 430 , fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL)
433 , fWriter(*writer) 431 , fWriter(*writer)
434 , fFlags(flags) 432 , fFlags(flags)
(...skipping 17 matching lines...) Expand all
452 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO _KEEP)); 450 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO _KEEP));
453 } else { 451 } else {
454 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, 452 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap,
455 (BITMAPS_TO_KEEP, controller->numberOfReaders() )); 453 (BITMAPS_TO_KEEP, controller->numberOfReaders() ));
456 if (this->needOpBytes(sizeof(void*))) { 454 if (this->needOpBytes(sizeof(void*))) {
457 this->writeOp(kShareBitmapHeap_DrawOp); 455 this->writeOp(kShareBitmapHeap_DrawOp);
458 fWriter.writePtr(static_cast<void*>(fBitmapHeap)); 456 fWriter.writePtr(static_cast<void*>(fBitmapHeap));
459 } 457 }
460 } 458 }
461 fFlattenableHeap.setBitmapStorage(fBitmapHeap); 459 fFlattenableHeap.setBitmapStorage(fBitmapHeap);
462 this->doNotify();
463 } 460 }
464 461
465 SkGPipeCanvas::~SkGPipeCanvas() { 462 SkGPipeCanvas::~SkGPipeCanvas() {
466 this->finish(true); 463 this->finish(true);
467 SkSafeUnref(fFactorySet); 464 SkSafeUnref(fFactorySet);
468 SkSafeUnref(fBitmapHeap); 465 SkSafeUnref(fBitmapHeap);
469 } 466 }
470 467
471 bool SkGPipeCanvas::needOpBytes(size_t needed) { 468 bool SkGPipeCanvas::needOpBytes(size_t needed) {
472 if (fDone) { 469 if (fDone) {
473 return false; 470 return false;
474 } 471 }
475 472
476 needed += 4; // size of DrawOp atom 473 needed += 4; // size of DrawOp atom
474 needed = SkTMax(kMinBlockSize, needed);
475 needed = SkAlign4(needed);
477 if (fWriter.bytesWritten() + needed > fBlockSize) { 476 if (fWriter.bytesWritten() + needed > fBlockSize) {
478 // Before we wipe out any data that has already been written, read it 477 // We're making a new block. First push out the current block.
479 // out.
480 this->doNotify(); 478 this->doNotify();
481 size_t blockSize = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); 479
482 void* block = fController->requestBlock(blockSize, &fBlockSize); 480 void* block = fController->requestBlock(needed, &fBlockSize);
483 if (NULL == block) { 481 if (NULL == block) {
484 // Do not notify the readers, which would call this function again. 482 // Do not notify the readers, which would call this function again.
485 this->finish(false); 483 this->finish(false);
486 return false; 484 return false;
487 } 485 }
488 SkASSERT(SkIsAlign4(fBlockSize)); 486 SkASSERT(SkIsAlign4(fBlockSize));
489 fWriter.reset(block, fBlockSize); 487 fWriter.reset(block, fBlockSize);
490 fBytesNotified = 0; 488 fBytesNotified = 0;
491 } 489 }
492 return true; 490 return true;
(...skipping 10 matching lines...) Expand all
503 this->writeOp(kDef_Typeface_DrawOp); 501 this->writeOp(kDef_Typeface_DrawOp);
504 writeTypeface(&fWriter, face); 502 writeTypeface(&fWriter, face);
505 } 503 }
506 } 504 }
507 } 505 }
508 return id; 506 return id;
509 } 507 }
510 508
511 /////////////////////////////////////////////////////////////////////////////// 509 ///////////////////////////////////////////////////////////////////////////////
512 510
513 #define NOTIFY_SETUP(canvas) \
514 AutoPipeNotify apn(canvas)
515
516 void SkGPipeCanvas::willSave(SaveFlags flags) { 511 void SkGPipeCanvas::willSave(SaveFlags flags) {
517 NOTIFY_SETUP(this);
518 if (this->needOpBytes()) { 512 if (this->needOpBytes()) {
519 this->writeOp(kSave_DrawOp, 0, flags); 513 this->writeOp(kSave_DrawOp, 0, flags);
520 } 514 }
521 515
522 this->INHERITED::willSave(flags); 516 this->INHERITED::willSave(flags);
523 } 517 }
524 518
525 SkCanvas::SaveLayerStrategy SkGPipeCanvas::willSaveLayer(const SkRect* bounds, c onst SkPaint* paint, 519 SkCanvas::SaveLayerStrategy SkGPipeCanvas::willSaveLayer(const SkRect* bounds, c onst SkPaint* paint,
526 SaveFlags saveFlags) { 520 SaveFlags saveFlags) {
527 NOTIFY_SETUP(this);
528 size_t size = 0; 521 size_t size = 0;
529 unsigned opFlags = 0; 522 unsigned opFlags = 0;
530 523
531 if (bounds) { 524 if (bounds) {
532 opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 525 opFlags |= kSaveLayer_HasBounds_DrawOpFlag;
533 size += sizeof(SkRect); 526 size += sizeof(SkRect);
534 } 527 }
535 if (paint) { 528 if (paint) {
536 opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 529 opFlags |= kSaveLayer_HasPaint_DrawOpFlag;
537 this->writePaint(*paint); 530 this->writePaint(*paint);
538 } 531 }
539 532
540 if (this->needOpBytes(size)) { 533 if (this->needOpBytes(size)) {
541 this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 534 this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags);
542 if (bounds) { 535 if (bounds) {
543 fWriter.writeRect(*bounds); 536 fWriter.writeRect(*bounds);
544 } 537 }
545 } 538 }
546 539
547 if (kNoSaveLayer == fFirstSaveLayerStackLevel){ 540 if (kNoSaveLayer == fFirstSaveLayerStackLevel){
548 fFirstSaveLayerStackLevel = this->getSaveCount(); 541 fFirstSaveLayerStackLevel = this->getSaveCount();
549 } 542 }
550 543
551 this->INHERITED::willSaveLayer(bounds, paint, saveFlags); 544 this->INHERITED::willSaveLayer(bounds, paint, saveFlags);
552 // we don't create a layer 545 // we don't create a layer
553 return kNoLayer_SaveLayerStrategy; 546 return kNoLayer_SaveLayerStrategy;
554 } 547 }
555 548
556 void SkGPipeCanvas::willRestore() { 549 void SkGPipeCanvas::willRestore() {
557 NOTIFY_SETUP(this);
558 if (this->needOpBytes()) { 550 if (this->needOpBytes()) {
559 this->writeOp(kRestore_DrawOp); 551 this->writeOp(kRestore_DrawOp);
560 } 552 }
561 553
562 if (this->getSaveCount() - 1 == fFirstSaveLayerStackLevel){ 554 if (this->getSaveCount() - 1 == fFirstSaveLayerStackLevel){
563 fFirstSaveLayerStackLevel = kNoSaveLayer; 555 fFirstSaveLayerStackLevel = kNoSaveLayer;
564 } 556 }
565 557
566 this->INHERITED::willRestore(); 558 this->INHERITED::willRestore();
567 } 559 }
(...skipping 20 matching lines...) Expand all
588 580
589 void SkGPipeCanvas::recordConcat(const SkMatrix& m) { 581 void SkGPipeCanvas::recordConcat(const SkMatrix& m) {
590 if (this->needOpBytes(m.writeToMemory(NULL))) { 582 if (this->needOpBytes(m.writeToMemory(NULL))) {
591 this->writeOp(kConcat_DrawOp); 583 this->writeOp(kConcat_DrawOp);
592 fWriter.writeMatrix(m); 584 fWriter.writeMatrix(m);
593 } 585 }
594 } 586 }
595 587
596 void SkGPipeCanvas::didConcat(const SkMatrix& matrix) { 588 void SkGPipeCanvas::didConcat(const SkMatrix& matrix) {
597 if (!matrix.isIdentity()) { 589 if (!matrix.isIdentity()) {
598 NOTIFY_SETUP(this);
599 switch (matrix.getType()) { 590 switch (matrix.getType()) {
600 case SkMatrix::kTranslate_Mask: 591 case SkMatrix::kTranslate_Mask:
601 this->recordTranslate(matrix); 592 this->recordTranslate(matrix);
602 break; 593 break;
603 case SkMatrix::kScale_Mask: 594 case SkMatrix::kScale_Mask:
604 this->recordScale(matrix); 595 this->recordScale(matrix);
605 break; 596 break;
606 default: 597 default:
607 this->recordConcat(matrix); 598 this->recordConcat(matrix);
608 break; 599 break;
609 } 600 }
610 } 601 }
611 602
612 this->INHERITED::didConcat(matrix); 603 this->INHERITED::didConcat(matrix);
613 } 604 }
614 605
615 void SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { 606 void SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) {
616 NOTIFY_SETUP(this);
617 if (this->needOpBytes(matrix.writeToMemory(NULL))) { 607 if (this->needOpBytes(matrix.writeToMemory(NULL))) {
618 this->writeOp(kSetMatrix_DrawOp); 608 this->writeOp(kSetMatrix_DrawOp);
619 fWriter.writeMatrix(matrix); 609 fWriter.writeMatrix(matrix);
620 } 610 }
621 this->INHERITED::didSetMatrix(matrix); 611 this->INHERITED::didSetMatrix(matrix);
622 } 612 }
623 613
624 void SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, 614 void SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp,
625 ClipEdgeStyle edgeStyle) { 615 ClipEdgeStyle edgeStyle) {
626 NOTIFY_SETUP(this);
627 if (this->needOpBytes(sizeof(SkRect))) { 616 if (this->needOpBytes(sizeof(SkRect))) {
628 unsigned flags = 0; 617 unsigned flags = 0;
629 if (kSoft_ClipEdgeStyle == edgeStyle) { 618 if (kSoft_ClipEdgeStyle == edgeStyle) {
630 flags = kClip_HasAntiAlias_DrawOpFlag; 619 flags = kClip_HasAntiAlias_DrawOpFlag;
631 } 620 }
632 this->writeOp(kClipRect_DrawOp, flags, rgnOp); 621 this->writeOp(kClipRect_DrawOp, flags, rgnOp);
633 fWriter.writeRect(rect); 622 fWriter.writeRect(rect);
634 } 623 }
635 this->INHERITED::onClipRect(rect, rgnOp, edgeStyle); 624 this->INHERITED::onClipRect(rect, rgnOp, edgeStyle);
636 } 625 }
637 626
638 void SkGPipeCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op rgnOp, 627 void SkGPipeCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op rgnOp,
639 ClipEdgeStyle edgeStyle) { 628 ClipEdgeStyle edgeStyle) {
640 NOTIFY_SETUP(this);
641 if (this->needOpBytes(kSizeOfFlatRRect)) { 629 if (this->needOpBytes(kSizeOfFlatRRect)) {
642 unsigned flags = 0; 630 unsigned flags = 0;
643 if (kSoft_ClipEdgeStyle == edgeStyle) { 631 if (kSoft_ClipEdgeStyle == edgeStyle) {
644 flags = kClip_HasAntiAlias_DrawOpFlag; 632 flags = kClip_HasAntiAlias_DrawOpFlag;
645 } 633 }
646 this->writeOp(kClipRRect_DrawOp, flags, rgnOp); 634 this->writeOp(kClipRRect_DrawOp, flags, rgnOp);
647 fWriter.writeRRect(rrect); 635 fWriter.writeRRect(rrect);
648 } 636 }
649 this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); 637 this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle);
650 } 638 }
651 639
652 void SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, 640 void SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp,
653 ClipEdgeStyle edgeStyle) { 641 ClipEdgeStyle edgeStyle) {
654 NOTIFY_SETUP(this);
655 if (this->needOpBytes(path.writeToMemory(NULL))) { 642 if (this->needOpBytes(path.writeToMemory(NULL))) {
656 unsigned flags = 0; 643 unsigned flags = 0;
657 if (kSoft_ClipEdgeStyle == edgeStyle) { 644 if (kSoft_ClipEdgeStyle == edgeStyle) {
658 flags = kClip_HasAntiAlias_DrawOpFlag; 645 flags = kClip_HasAntiAlias_DrawOpFlag;
659 } 646 }
660 this->writeOp(kClipPath_DrawOp, flags, rgnOp); 647 this->writeOp(kClipPath_DrawOp, flags, rgnOp);
661 fWriter.writePath(path); 648 fWriter.writePath(path);
662 } 649 }
663 // we just pass on the bounds of the path 650 // we just pass on the bounds of the path
664 this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); 651 this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle);
665 } 652 }
666 653
667 void SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 654 void SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) {
668 NOTIFY_SETUP(this);
669 if (this->needOpBytes(region.writeToMemory(NULL))) { 655 if (this->needOpBytes(region.writeToMemory(NULL))) {
670 this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 656 this->writeOp(kClipRegion_DrawOp, 0, rgnOp);
671 fWriter.writeRegion(region); 657 fWriter.writeRegion(region);
672 } 658 }
673 this->INHERITED::onClipRegion(region, rgnOp); 659 this->INHERITED::onClipRegion(region, rgnOp);
674 } 660 }
675 661
676 /////////////////////////////////////////////////////////////////////////////// 662 ///////////////////////////////////////////////////////////////////////////////
677 663
678 void SkGPipeCanvas::clear(SkColor color) { 664 void SkGPipeCanvas::clear(SkColor color) {
679 NOTIFY_SETUP(this);
680 unsigned flags = 0; 665 unsigned flags = 0;
681 if (color) { 666 if (color) {
682 flags |= kClear_HasColor_DrawOpFlag; 667 flags |= kClear_HasColor_DrawOpFlag;
683 } 668 }
684 if (this->needOpBytes(sizeof(SkColor))) { 669 if (this->needOpBytes(sizeof(SkColor))) {
685 this->writeOp(kDrawClear_DrawOp, flags, 0); 670 this->writeOp(kDrawClear_DrawOp, flags, 0);
686 if (color) { 671 if (color) {
687 fWriter.write32(color); 672 fWriter.write32(color);
688 } 673 }
689 } 674 }
690 } 675 }
691 676
692 void SkGPipeCanvas::drawPaint(const SkPaint& paint) { 677 void SkGPipeCanvas::drawPaint(const SkPaint& paint) {
693 NOTIFY_SETUP(this);
694 this->writePaint(paint); 678 this->writePaint(paint);
695 if (this->needOpBytes()) { 679 if (this->needOpBytes()) {
696 this->writeOp(kDrawPaint_DrawOp); 680 this->writeOp(kDrawPaint_DrawOp);
697 } 681 }
698 } 682 }
699 683
700 void SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 684 void SkGPipeCanvas::drawPoints(PointMode mode, size_t count,
701 const SkPoint pts[], const SkPaint& paint) { 685 const SkPoint pts[], const SkPaint& paint) {
702 if (count) { 686 if (count) {
703 NOTIFY_SETUP(this);
704 this->writePaint(paint); 687 this->writePaint(paint);
705 if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 688 if (this->needOpBytes(4 + count * sizeof(SkPoint))) {
706 this->writeOp(kDrawPoints_DrawOp, mode, 0); 689 this->writeOp(kDrawPoints_DrawOp, mode, 0);
707 fWriter.write32(SkToU32(count)); 690 fWriter.write32(SkToU32(count));
708 fWriter.write(pts, count * sizeof(SkPoint)); 691 fWriter.write(pts, count * sizeof(SkPoint));
709 } 692 }
710 } 693 }
711 } 694 }
712 695
713 void SkGPipeCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 696 void SkGPipeCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
714 NOTIFY_SETUP(this);
715 this->writePaint(paint); 697 this->writePaint(paint);
716 if (this->needOpBytes(sizeof(SkRect))) { 698 if (this->needOpBytes(sizeof(SkRect))) {
717 this->writeOp(kDrawOval_DrawOp); 699 this->writeOp(kDrawOval_DrawOp);
718 fWriter.writeRect(rect); 700 fWriter.writeRect(rect);
719 } 701 }
720 } 702 }
721 703
722 void SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 704 void SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
723 NOTIFY_SETUP(this);
724 this->writePaint(paint); 705 this->writePaint(paint);
725 if (this->needOpBytes(sizeof(SkRect))) { 706 if (this->needOpBytes(sizeof(SkRect))) {
726 this->writeOp(kDrawRect_DrawOp); 707 this->writeOp(kDrawRect_DrawOp);
727 fWriter.writeRect(rect); 708 fWriter.writeRect(rect);
728 } 709 }
729 } 710 }
730 711
731 void SkGPipeCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 712 void SkGPipeCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
732 NOTIFY_SETUP(this);
733 this->writePaint(paint); 713 this->writePaint(paint);
734 if (this->needOpBytes(kSizeOfFlatRRect)) { 714 if (this->needOpBytes(kSizeOfFlatRRect)) {
735 this->writeOp(kDrawRRect_DrawOp); 715 this->writeOp(kDrawRRect_DrawOp);
736 fWriter.writeRRect(rrect); 716 fWriter.writeRRect(rrect);
737 } 717 }
738 } 718 }
739 719
740 void SkGPipeCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, 720 void SkGPipeCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
741 const SkPaint& paint) { 721 const SkPaint& paint) {
742 NOTIFY_SETUP(this);
743 this->writePaint(paint); 722 this->writePaint(paint);
744 if (this->needOpBytes(kSizeOfFlatRRect * 2)) { 723 if (this->needOpBytes(kSizeOfFlatRRect * 2)) {
745 this->writeOp(kDrawDRRect_DrawOp); 724 this->writeOp(kDrawDRRect_DrawOp);
746 fWriter.writeRRect(outer); 725 fWriter.writeRRect(outer);
747 fWriter.writeRRect(inner); 726 fWriter.writeRRect(inner);
748 } 727 }
749 } 728 }
750 729
751 void SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 730 void SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
752 NOTIFY_SETUP(this);
753 this->writePaint(paint); 731 this->writePaint(paint);
754 if (this->needOpBytes(path.writeToMemory(NULL))) { 732 if (this->needOpBytes(path.writeToMemory(NULL))) {
755 this->writeOp(kDrawPath_DrawOp); 733 this->writeOp(kDrawPath_DrawOp);
756 fWriter.writePath(path); 734 fWriter.writePath(path);
757 } 735 }
758 } 736 }
759 737
760 bool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, 738 bool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op,
761 unsigned flags, 739 unsigned flags,
762 size_t opBytesNeeded, 740 size_t opBytesNeeded,
763 const SkPaint* paint) { 741 const SkPaint* paint) {
742 if (fDone) {
743 return false;
744 }
745
764 if (paint != NULL) { 746 if (paint != NULL) {
765 flags |= kDrawBitmap_HasPaint_DrawOpFlag; 747 flags |= kDrawBitmap_HasPaint_DrawOpFlag;
766 this->writePaint(*paint); 748 this->writePaint(*paint);
767 } 749 }
750
751 // This needs to run first so its calls to needOpBytes() and writes
752 // don't interlace with the needOpBytes() and writes below.
753 SkASSERT(fBitmapHeap != NULL);
754 int32_t bitmapIndex = fBitmapHeap->insert(bm);
755 if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) {
756 return false;
757 }
758
768 if (this->needOpBytes(opBytesNeeded)) { 759 if (this->needOpBytes(opBytesNeeded)) {
769 SkASSERT(fBitmapHeap != NULL);
770 int32_t bitmapIndex = fBitmapHeap->insert(bm);
771 if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) {
772 return false;
773 }
774 this->writeOp(op, flags, bitmapIndex); 760 this->writeOp(op, flags, bitmapIndex);
775 return true; 761 return true;
776 } 762 }
777 return false; 763 return false;
778 } 764 }
779 765
780 void SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 766 void SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top,
781 const SkPaint* paint) { 767 const SkPaint* paint) {
782 NOTIFY_SETUP(this);
783 size_t opBytesNeeded = sizeof(SkScalar) * 2; 768 size_t opBytesNeeded = sizeof(SkScalar) * 2;
784 769
785 if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) { 770 if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) {
786 fWriter.writeScalar(left); 771 fWriter.writeScalar(left);
787 fWriter.writeScalar(top); 772 fWriter.writeScalar(top);
788 } 773 }
789 } 774 }
790 775
791 void SkGPipeCanvas::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src, 776 void SkGPipeCanvas::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src,
792 const SkRect& dst, const SkPaint* paint , 777 const SkRect& dst, const SkPaint* paint ,
793 DrawBitmapRectFlags dbmrFlags) { 778 DrawBitmapRectFlags dbmrFlags) {
794 NOTIFY_SETUP(this);
795 size_t opBytesNeeded = sizeof(SkRect); 779 size_t opBytesNeeded = sizeof(SkRect);
796 bool hasSrc = src != NULL; 780 bool hasSrc = src != NULL;
797 unsigned flags; 781 unsigned flags;
798 if (hasSrc) { 782 if (hasSrc) {
799 flags = kDrawBitmap_HasSrcRect_DrawOpFlag; 783 flags = kDrawBitmap_HasSrcRect_DrawOpFlag;
800 opBytesNeeded += sizeof(int32_t) * 4; 784 opBytesNeeded += sizeof(int32_t) * 4;
801 } else { 785 } else {
802 flags = 0; 786 flags = 0;
803 } 787 }
804 if (dbmrFlags & kBleed_DrawBitmapRectFlag) { 788 if (dbmrFlags & kBleed_DrawBitmapRectFlag) {
805 flags |= kDrawBitmap_Bleed_DrawOpFlag; 789 flags |= kDrawBitmap_Bleed_DrawOpFlag;
806 } 790 }
807 791
808 if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesN eeded, paint)) { 792 if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesN eeded, paint)) {
809 if (hasSrc) { 793 if (hasSrc) {
810 fWriter.writeRect(*src); 794 fWriter.writeRect(*src);
811 } 795 }
812 fWriter.writeRect(dst); 796 fWriter.writeRect(dst);
813 } 797 }
814 } 798 }
815 799
816 void SkGPipeCanvas::drawBitmapMatrix(const SkBitmap& bm, const SkMatrix& matrix, 800 void SkGPipeCanvas::drawBitmapMatrix(const SkBitmap& bm, const SkMatrix& matrix,
817 const SkPaint* paint) { 801 const SkPaint* paint) {
818 NOTIFY_SETUP(this);
819 size_t opBytesNeeded = matrix.writeToMemory(NULL); 802 size_t opBytesNeeded = matrix.writeToMemory(NULL);
820 803
821 if (this->commonDrawBitmap(bm, kDrawBitmapMatrix_DrawOp, 0, opBytesNeeded, p aint)) { 804 if (this->commonDrawBitmap(bm, kDrawBitmapMatrix_DrawOp, 0, opBytesNeeded, p aint)) {
822 fWriter.writeMatrix(matrix); 805 fWriter.writeMatrix(matrix);
823 } 806 }
824 } 807 }
825 808
826 void SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center, 809 void SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center,
827 const SkRect& dst, const SkPaint* paint) { 810 const SkRect& dst, const SkPaint* paint) {
828 NOTIFY_SETUP(this);
829 size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect); 811 size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect);
830 812
831 if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, pai nt)) { 813 if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, pai nt)) {
832 fWriter.write32(center.fLeft); 814 fWriter.write32(center.fLeft);
833 fWriter.write32(center.fTop); 815 fWriter.write32(center.fTop);
834 fWriter.write32(center.fRight); 816 fWriter.write32(center.fRight);
835 fWriter.write32(center.fBottom); 817 fWriter.write32(center.fBottom);
836 fWriter.writeRect(dst); 818 fWriter.writeRect(dst);
837 } 819 }
838 } 820 }
839 821
840 void SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top, 822 void SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top,
841 const SkPaint* paint) { 823 const SkPaint* paint) {
842 NOTIFY_SETUP(this);
843 size_t opBytesNeeded = sizeof(int32_t) * 2; 824 size_t opBytesNeeded = sizeof(int32_t) * 2;
844 825
845 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) { 826 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) {
846 fWriter.write32(left); 827 fWriter.write32(left);
847 fWriter.write32(top); 828 fWriter.write32(top);
848 } 829 }
849 } 830 }
850 831
851 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 832 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
852 const SkPaint& paint) { 833 const SkPaint& paint) {
853 if (byteLength) { 834 if (byteLength) {
854 NOTIFY_SETUP(this);
855 this->writePaint(paint); 835 this->writePaint(paint);
856 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 836 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) {
857 this->writeOp(kDrawText_DrawOp); 837 this->writeOp(kDrawText_DrawOp);
858 fWriter.write32(SkToU32(byteLength)); 838 fWriter.write32(SkToU32(byteLength));
859 fWriter.writePad(text, byteLength); 839 fWriter.writePad(text, byteLength);
860 fWriter.writeScalar(x); 840 fWriter.writeScalar(x);
861 fWriter.writeScalar(y); 841 fWriter.writeScalar(y);
862 } 842 }
863 } 843 }
864 } 844 }
865 845
866 void SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkP oint pos[], 846 void SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkP oint pos[],
867 const SkPaint& paint) { 847 const SkPaint& paint) {
868 if (byteLength) { 848 if (byteLength) {
869 NOTIFY_SETUP(this);
870 this->writePaint(paint); 849 this->writePaint(paint);
871 int count = paint.textToGlyphs(text, byteLength, NULL); 850 int count = paint.textToGlyphs(text, byteLength, NULL);
872 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPo int))) { 851 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPo int))) {
873 this->writeOp(kDrawPosText_DrawOp); 852 this->writeOp(kDrawPosText_DrawOp);
874 fWriter.write32(SkToU32(byteLength)); 853 fWriter.write32(SkToU32(byteLength));
875 fWriter.writePad(text, byteLength); 854 fWriter.writePad(text, byteLength);
876 fWriter.write32(count); 855 fWriter.write32(count);
877 fWriter.write(pos, count * sizeof(SkPoint)); 856 fWriter.write(pos, count * sizeof(SkPoint));
878 } 857 }
879 } 858 }
880 } 859 }
881 860
882 void SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const Sk Scalar xpos[], 861 void SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const Sk Scalar xpos[],
883 SkScalar constY, const SkPaint& paint) { 862 SkScalar constY, const SkPaint& paint) {
884 if (byteLength) { 863 if (byteLength) {
885 NOTIFY_SETUP(this);
886 this->writePaint(paint); 864 this->writePaint(paint);
887 int count = paint.textToGlyphs(text, byteLength, NULL); 865 int count = paint.textToGlyphs(text, byteLength, NULL);
888 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkSc alar) + 4)) { 866 if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkSc alar) + 4)) {
889 this->writeOp(kDrawPosTextH_DrawOp); 867 this->writeOp(kDrawPosTextH_DrawOp);
890 fWriter.write32(SkToU32(byteLength)); 868 fWriter.write32(SkToU32(byteLength));
891 fWriter.writePad(text, byteLength); 869 fWriter.writePad(text, byteLength);
892 fWriter.write32(count); 870 fWriter.write32(count);
893 fWriter.write(xpos, count * sizeof(SkScalar)); 871 fWriter.write(xpos, count * sizeof(SkScalar));
894 fWriter.writeScalar(constY); 872 fWriter.writeScalar(constY);
895 } 873 }
896 } 874 }
897 } 875 }
898 876
899 void SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 877 void SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
900 const SkMatrix* matrix, const SkPaint& pain t) { 878 const SkMatrix* matrix, const SkPaint& pain t) {
901 if (byteLength) { 879 if (byteLength) {
902 NOTIFY_SETUP(this);
903 unsigned flags = 0; 880 unsigned flags = 0;
904 size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); 881 size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL);
905 if (matrix) { 882 if (matrix) {
906 flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 883 flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag;
907 size += matrix->writeToMemory(NULL); 884 size += matrix->writeToMemory(NULL);
908 } 885 }
909 this->writePaint(paint); 886 this->writePaint(paint);
910 if (this->needOpBytes(size)) { 887 if (this->needOpBytes(size)) {
911 this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 888 this->writeOp(kDrawTextOnPath_DrawOp, flags, 0);
912 889
(...skipping 15 matching lines...) Expand all
928 905
929 void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount, 906 void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount,
930 const SkPoint vertices[], const SkPoint texs[], 907 const SkPoint vertices[], const SkPoint texs[],
931 const SkColor colors[], SkXfermode* xfer, 908 const SkColor colors[], SkXfermode* xfer,
932 const uint16_t indices[], int indexCount, 909 const uint16_t indices[], int indexCount,
933 const SkPaint& paint) { 910 const SkPaint& paint) {
934 if (0 == vertexCount) { 911 if (0 == vertexCount) {
935 return; 912 return;
936 } 913 }
937 914
938 NOTIFY_SETUP(this);
939 size_t size = 4 + vertexCount * sizeof(SkPoint);
940 this->writePaint(paint); 915 this->writePaint(paint);
941 unsigned flags = 0; 916
917 unsigned flags = 0; // flags pack with the op, so don't need extra space th emselves
918
919 size_t size = 0;
920 size += 4; // vmode
921 size += 4; // vertexCount
922 size += vertexCount * sizeof(SkPoint); // vertices
942 if (texs) { 923 if (texs) {
943 flags |= kDrawVertices_HasTexs_DrawOpFlag; 924 flags |= kDrawVertices_HasTexs_DrawOpFlag;
944 size += vertexCount * sizeof(SkPoint); 925 size += vertexCount * sizeof(SkPoint);
945 } 926 }
946 if (colors) { 927 if (colors) {
947 flags |= kDrawVertices_HasColors_DrawOpFlag; 928 flags |= kDrawVertices_HasColors_DrawOpFlag;
948 size += vertexCount * sizeof(SkColor); 929 size += vertexCount * sizeof(SkColor);
949 } 930 }
931 if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) {
932 flags |= kDrawVertices_HasXfermode_DrawOpFlag;
933 size += sizeof(int32_t); // SkXfermode::Mode
934 }
950 if (indices && indexCount > 0) { 935 if (indices && indexCount > 0) {
951 flags |= kDrawVertices_HasIndices_DrawOpFlag; 936 flags |= kDrawVertices_HasIndices_DrawOpFlag;
952 size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 937 size += 4; // indexCount
953 } 938 size += SkAlign4(indexCount * sizeof(uint16_t)); // indices
954 if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) {
955 flags |= kDrawVertices_HasXfermode_DrawOpFlag;
956 size += sizeof(int32_t); // mode enum
957 } 939 }
958 940
959 if (this->needOpBytes(size)) { 941 if (this->needOpBytes(size)) {
960 this->writeOp(kDrawVertices_DrawOp, flags, 0); 942 this->writeOp(kDrawVertices_DrawOp, flags, 0);
961 fWriter.write32(vmode); 943 fWriter.write32(vmode);
962 fWriter.write32(vertexCount); 944 fWriter.write32(vertexCount);
963 fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 945 fWriter.write(vertices, vertexCount * sizeof(SkPoint));
964 if (texs) { 946 if (flags & kDrawVertices_HasTexs_DrawOpFlag) {
965 fWriter.write(texs, vertexCount * sizeof(SkPoint)); 947 fWriter.write(texs, vertexCount * sizeof(SkPoint));
966 } 948 }
967 if (colors) { 949 if (flags & kDrawVertices_HasColors_DrawOpFlag) {
968 fWriter.write(colors, vertexCount * sizeof(SkColor)); 950 fWriter.write(colors, vertexCount * sizeof(SkColor));
969 } 951 }
970 if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 952 if (flags & kDrawVertices_HasXfermode_DrawOpFlag) {
971 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; 953 SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
972 (void)xfer->asMode(&mode); 954 SkAssertResult(xfer->asMode(&mode));
973 fWriter.write32(mode); 955 fWriter.write32(mode);
974 } 956 }
975 if (indices && indexCount > 0) { 957 if (flags & kDrawVertices_HasIndices_DrawOpFlag) {
976 fWriter.write32(indexCount); 958 fWriter.write32(indexCount);
977 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 959 fWriter.writePad(indices, indexCount * sizeof(uint16_t));
978 } 960 }
979 } 961 }
980 } 962 }
981 963
982 void SkGPipeCanvas::drawData(const void* ptr, size_t size) { 964 void SkGPipeCanvas::drawData(const void* ptr, size_t size) {
983 if (size && ptr) { 965 if (size && ptr) {
984 NOTIFY_SETUP(this);
985 unsigned data = 0; 966 unsigned data = 0;
986 if (size < (1 << DRAWOPS_DATA_BITS)) { 967 if (size < (1 << DRAWOPS_DATA_BITS)) {
987 data = (unsigned)size; 968 data = (unsigned)size;
988 } 969 }
989 if (this->needOpBytes(4 + SkAlign4(size))) { 970 if (this->needOpBytes(4 + SkAlign4(size))) {
990 this->writeOp(kDrawData_DrawOp, 0, data); 971 this->writeOp(kDrawData_DrawOp, 0, data);
991 if (0 == data) { 972 if (0 == data) {
992 fWriter.write32(SkToU32(size)); 973 fWriter.write32(SkToU32(size));
993 } 974 }
994 fWriter.writePad(ptr, size); 975 fWriter.writePad(ptr, size);
995 } 976 }
996 } 977 }
997 } 978 }
998 979
999 void SkGPipeCanvas::beginCommentGroup(const char* description) { 980 void SkGPipeCanvas::beginCommentGroup(const char* description) {
1000 // ignore for now 981 // ignore for now
1001 } 982 }
1002 983
1003 void SkGPipeCanvas::addComment(const char* kywd, const char* value) { 984 void SkGPipeCanvas::addComment(const char* kywd, const char* value) {
1004 // ignore for now 985 // ignore for now
1005 } 986 }
1006 987
1007 void SkGPipeCanvas::endCommentGroup() { 988 void SkGPipeCanvas::endCommentGroup() {
1008 // ignore for now 989 // ignore for now
1009 } 990 }
1010 991
1011 void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { 992 void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) {
1012 doNotify(); 993 this->doNotify();
1013 if (detachCurrentBlock) { 994 if (detachCurrentBlock) {
1014 // force a new block to be requested for the next recorded command 995 // force a new block to be requested for the next recorded command
1015 fBlockSize = 0; 996 fBlockSize = 0;
1016 } 997 }
1017 } 998 }
1018 999
1019 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { 1000 size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) {
1020 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesTo Free); 1001 return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesTo Free);
1021 } 1002 }
1022 1003
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 return fCanvas->shuttleBitmap(bitmap, slot); 1223 return fCanvas->shuttleBitmap(bitmap, slot);
1243 } 1224 }
1244 1225
1245 void BitmapShuttle::removeCanvas() { 1226 void BitmapShuttle::removeCanvas() {
1246 if (NULL == fCanvas) { 1227 if (NULL == fCanvas) {
1247 return; 1228 return;
1248 } 1229 }
1249 fCanvas->unref(); 1230 fCanvas->unref();
1250 fCanvas = NULL; 1231 fCanvas = NULL;
1251 } 1232 }
1233
OLDNEW
« no previous file with comments | « no previous file | src/pipe/utils/SamplePipeControllers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698