| 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 |