OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
9 | 9 |
10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "SkGrPriv.h" | 25 #include "SkGrPriv.h" |
26 #include "SkImage_Base.h" | 26 #include "SkImage_Base.h" |
27 #include "SkImageCacherator.h" | 27 #include "SkImageCacherator.h" |
28 #include "SkImageFilter.h" | 28 #include "SkImageFilter.h" |
29 #include "SkLayerInfo.h" | 29 #include "SkLayerInfo.h" |
30 #include "SkMaskFilter.h" | 30 #include "SkMaskFilter.h" |
31 #include "SkNinePatchIter.h" | 31 #include "SkNinePatchIter.h" |
32 #include "SkPathEffect.h" | 32 #include "SkPathEffect.h" |
33 #include "SkPicture.h" | 33 #include "SkPicture.h" |
34 #include "SkPictureData.h" | 34 #include "SkPictureData.h" |
| 35 #include "SkRasterClip.h" |
35 #include "SkRRect.h" | 36 #include "SkRRect.h" |
36 #include "SkRecord.h" | 37 #include "SkRecord.h" |
37 #include "SkStroke.h" | 38 #include "SkStroke.h" |
38 #include "SkSurface.h" | 39 #include "SkSurface.h" |
39 #include "SkSurface_Gpu.h" | 40 #include "SkSurface_Gpu.h" |
40 #include "SkTLazy.h" | 41 #include "SkTLazy.h" |
41 #include "SkUtils.h" | 42 #include "SkUtils.h" |
42 #include "SkVertState.h" | 43 #include "SkVertState.h" |
43 #include "SkXfermode.h" | 44 #include "SkXfermode.h" |
44 #include "batches/GrRectBatchFactory.h" | 45 #include "batches/GrRectBatchFactory.h" |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 usePath = true; | 509 usePath = true; |
509 } | 510 } |
510 | 511 |
511 if (usePath) { | 512 if (usePath) { |
512 SkPath path; | 513 SkPath path; |
513 path.setIsVolatile(true); | 514 path.setIsVolatile(true); |
514 path.addRect(rect); | 515 path.addRect(rect); |
515 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 516 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
516 fClip, path, paint, | 517 fClip, path, paint, |
517 *draw.fMatrix, nullptr, | 518 *draw.fMatrix, nullptr, |
518 draw.fClip->getBounds(), true); | 519 draw.fRC->getBounds(), true); |
519 return; | 520 return; |
520 } | 521 } |
521 | 522 |
522 GrPaint grPaint; | 523 GrPaint grPaint; |
523 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, | 524 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
524 this->surfaceProps().isGammaCorrect(), &grPaint)) { | 525 this->surfaceProps().isGammaCorrect(), &grPaint)) { |
525 return; | 526 return; |
526 } | 527 } |
527 | 528 |
528 GrStrokeInfo strokeInfo(paint); | 529 GrStrokeInfo strokeInfo(paint); |
(...skipping 17 matching lines...) Expand all Loading... |
546 | 547 |
547 GrStrokeInfo strokeInfo(paint); | 548 GrStrokeInfo strokeInfo(paint); |
548 if (paint.getMaskFilter()) { | 549 if (paint.getMaskFilter()) { |
549 // try to hit the fast path for drawing filtered round rects | 550 // try to hit the fast path for drawing filtered round rects |
550 | 551 |
551 SkRRect devRRect; | 552 SkRRect devRRect; |
552 if (rect.transform(*draw.fMatrix, &devRRect)) { | 553 if (rect.transform(*draw.fMatrix, &devRRect)) { |
553 if (devRRect.allCornersCircular()) { | 554 if (devRRect.allCornersCircular()) { |
554 SkRect maskRect; | 555 SkRect maskRect; |
555 if (paint.getMaskFilter()->canFilterMaskGPU(devRRect, | 556 if (paint.getMaskFilter()->canFilterMaskGPU(devRRect, |
556 draw.fClip->getBound
s(), | 557 draw.fRC->getBounds(
), |
557 *draw.fMatrix, | 558 *draw.fMatrix, |
558 &maskRect)) { | 559 &maskRect)) { |
559 SkIRect finalIRect; | 560 SkIRect finalIRect; |
560 maskRect.roundOut(&finalIRect); | 561 maskRect.roundOut(&finalIRect); |
561 if (draw.fClip->quickReject(finalIRect)) { | 562 if (draw.fRC->quickReject(finalIRect)) { |
562 // clipped out | 563 // clipped out |
563 return; | 564 return; |
564 } | 565 } |
565 if (paint.getMaskFilter()->directFilterRRectMaskGPU(fContext
->textureProvider(), | 566 if (paint.getMaskFilter()->directFilterRRectMaskGPU(fContext
->textureProvider(), |
566 fDrawCon
text, | 567 fDrawCon
text, |
567 &grPaint
, | 568 &grPaint
, |
568 fClip, | 569 fClip, |
569 *draw.fM
atrix, | 570 *draw.fM
atrix, |
570 strokeIn
fo, | 571 strokeIn
fo, |
571 devRRect
)) { | 572 devRRect
)) { |
572 return; | 573 return; |
573 } | 574 } |
574 } | 575 } |
575 | 576 |
576 } | 577 } |
577 } | 578 } |
578 } | 579 } |
579 | 580 |
580 if (paint.getMaskFilter() || paint.getPathEffect()) { | 581 if (paint.getMaskFilter() || paint.getPathEffect()) { |
581 // The only mask filter the native rrect drawing code could've handle wa
s taken | 582 // The only mask filter the native rrect drawing code could've handle wa
s taken |
582 // care of above. | 583 // care of above. |
583 // A path effect will presumably transform this rrect into something els
e. | 584 // A path effect will presumably transform this rrect into something els
e. |
584 SkPath path; | 585 SkPath path; |
585 path.setIsVolatile(true); | 586 path.setIsVolatile(true); |
586 path.addRRect(rect); | 587 path.addRRect(rect); |
587 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 588 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
588 fClip, path, paint, | 589 fClip, path, paint, |
589 *draw.fMatrix, nullptr, | 590 *draw.fMatrix, nullptr, |
590 draw.fClip->getBounds(), true); | 591 draw.fRC->getBounds(), true); |
591 return; | 592 return; |
592 } | 593 } |
593 | 594 |
594 SkASSERT(!strokeInfo.isDashed()); | 595 SkASSERT(!strokeInfo.isDashed()); |
595 | 596 |
596 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); | 597 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); |
597 } | 598 } |
598 | 599 |
599 | 600 |
600 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 601 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, |
(...skipping 25 matching lines...) Expand all Loading... |
626 | 627 |
627 SkPath path; | 628 SkPath path; |
628 path.setIsVolatile(true); | 629 path.setIsVolatile(true); |
629 path.addRRect(outer); | 630 path.addRRect(outer); |
630 path.addRRect(inner); | 631 path.addRRect(inner); |
631 path.setFillType(SkPath::kEvenOdd_FillType); | 632 path.setFillType(SkPath::kEvenOdd_FillType); |
632 | 633 |
633 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 634 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
634 fClip, path, paint, | 635 fClip, path, paint, |
635 *draw.fMatrix, nullptr, | 636 *draw.fMatrix, nullptr, |
636 draw.fClip->getBounds(), true); | 637 draw.fRC->getBounds(), true); |
637 } | 638 } |
638 | 639 |
639 | 640 |
640 ///////////////////////////////////////////////////////////////////////////// | 641 ///////////////////////////////////////////////////////////////////////////// |
641 | 642 |
642 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint
& paint) { | 643 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint
& paint) { |
643 ASSERT_SINGLE_OWNER | 644 ASSERT_SINGLE_OWNER |
644 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawOval", fContext); | 645 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawOval", fContext); |
645 CHECK_SHOULD_DRAW(draw); | 646 CHECK_SHOULD_DRAW(draw); |
646 | 647 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 return; | 697 return; |
697 } | 698 } |
698 } | 699 } |
699 | 700 |
700 CHECK_SHOULD_DRAW(draw); | 701 CHECK_SHOULD_DRAW(draw); |
701 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPath", fContext); | 702 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPath", fContext); |
702 | 703 |
703 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 704 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
704 fClip, origSrcPath, paint, | 705 fClip, origSrcPath, paint, |
705 *draw.fMatrix, prePathMatrix, | 706 *draw.fMatrix, prePathMatrix, |
706 draw.fClip->getBounds(), pathIsMutable); | 707 draw.fRC->getBounds(), pathIsMutable); |
707 } | 708 } |
708 | 709 |
709 static const int kBmpSmallTileSize = 1 << 10; | 710 static const int kBmpSmallTileSize = 1 << 10; |
710 | 711 |
711 static inline int get_tile_count(const SkIRect& srcRect, int tileSize) { | 712 static inline int get_tile_count(const SkIRect& srcRect, int tileSize) { |
712 int tilesX = (srcRect.fRight / tileSize) - (srcRect.fLeft / tileSize) + 1; | 713 int tilesX = (srcRect.fRight / tileSize) - (srcRect.fLeft / tileSize) + 1; |
713 int tilesY = (srcRect.fBottom / tileSize) - (srcRect.fTop / tileSize) + 1; | 714 int tilesY = (srcRect.fBottom / tileSize) - (srcRect.fTop / tileSize) + 1; |
714 return tilesX * tilesY; | 715 return tilesX * tilesY; |
715 } | 716 } |
716 | 717 |
(...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1669 | 1670 |
1670 GrPaint grPaint; | 1671 GrPaint grPaint; |
1671 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, | 1672 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
1672 this->surfaceProps().isGammaCorrect(), &grPaint)) { | 1673 this->surfaceProps().isGammaCorrect(), &grPaint)) { |
1673 return; | 1674 return; |
1674 } | 1675 } |
1675 | 1676 |
1676 SkDEBUGCODE(this->validate();) | 1677 SkDEBUGCODE(this->validate();) |
1677 | 1678 |
1678 fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, | 1679 fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, |
1679 (const char *)text, byteLength, x, y, draw.fClip->get
Bounds()); | 1680 (const char *)text, byteLength, x, y, draw.fRC->getBo
unds()); |
1680 } | 1681 } |
1681 | 1682 |
1682 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
ength, | 1683 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
ength, |
1683 const SkScalar pos[], int scalarsPerPos, | 1684 const SkScalar pos[], int scalarsPerPos, |
1684 const SkPoint& offset, const SkPaint& paint) { | 1685 const SkPoint& offset, const SkPaint& paint) { |
1685 ASSERT_SINGLE_OWNER | 1686 ASSERT_SINGLE_OWNER |
1686 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPosText", fContext); | 1687 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPosText", fContext); |
1687 CHECK_SHOULD_DRAW(draw); | 1688 CHECK_SHOULD_DRAW(draw); |
1688 | 1689 |
1689 GrPaint grPaint; | 1690 GrPaint grPaint; |
1690 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, | 1691 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
1691 this->surfaceProps().isGammaCorrect(), &grPaint)) { | 1692 this->surfaceProps().isGammaCorrect(), &grPaint)) { |
1692 return; | 1693 return; |
1693 } | 1694 } |
1694 | 1695 |
1695 SkDEBUGCODE(this->validate();) | 1696 SkDEBUGCODE(this->validate();) |
1696 | 1697 |
1697 fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, | 1698 fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, |
1698 (const char *)text, byteLength, pos, scalarsPerPos
, offset, | 1699 (const char *)text, byteLength, pos, scalarsPerPos
, offset, |
1699 draw.fClip->getBounds()); | 1700 draw.fRC->getBounds()); |
1700 } | 1701 } |
1701 | 1702 |
1702 void SkGpuDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSca
lar x, SkScalar y, | 1703 void SkGpuDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSca
lar x, SkScalar y, |
1703 const SkPaint& paint, SkDrawFilter* drawFilter) { | 1704 const SkPaint& paint, SkDrawFilter* drawFilter) { |
1704 ASSERT_SINGLE_OWNER | 1705 ASSERT_SINGLE_OWNER |
1705 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawTextBlob", fContext); | 1706 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawTextBlob", fContext); |
1706 CHECK_SHOULD_DRAW(draw); | 1707 CHECK_SHOULD_DRAW(draw); |
1707 | 1708 |
1708 SkDEBUGCODE(this->validate();) | 1709 SkDEBUGCODE(this->validate();) |
1709 | 1710 |
1710 fDrawContext->drawTextBlob(fClip, paint, *draw.fMatrix, | 1711 fDrawContext->drawTextBlob(fClip, paint, *draw.fMatrix, |
1711 blob, x, y, drawFilter, draw.fClip->getBounds()); | 1712 blob, x, y, drawFilter, draw.fRC->getBounds()); |
1712 } | 1713 } |
1713 | 1714 |
1714 /////////////////////////////////////////////////////////////////////////////// | 1715 /////////////////////////////////////////////////////////////////////////////// |
1715 | 1716 |
1716 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const { | 1717 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const { |
1717 return GrTextUtils::ShouldDisableLCD(paint); | 1718 return GrTextUtils::ShouldDisableLCD(paint); |
1718 } | 1719 } |
1719 | 1720 |
1720 void SkGpuDevice::flush() { | 1721 void SkGpuDevice::flush() { |
1721 ASSERT_SINGLE_OWNER | 1722 ASSERT_SINGLE_OWNER |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1838 } | 1839 } |
1839 | 1840 |
1840 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1841 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
1841 ASSERT_SINGLE_OWNER | 1842 ASSERT_SINGLE_OWNER |
1842 // We always return a transient cache, so it is freed after each | 1843 // We always return a transient cache, so it is freed after each |
1843 // filter traversal. | 1844 // filter traversal. |
1844 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1845 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
1845 } | 1846 } |
1846 | 1847 |
1847 #endif | 1848 #endif |
OLD | NEW |