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 "effects/GrBicubicEffect.h" | 10 #include "effects/GrBicubicEffect.h" |
11 #include "effects/GrDashingEffect.h" | 11 #include "effects/GrDashingEffect.h" |
12 #include "effects/GrTextureDomain.h" | 12 #include "effects/GrTextureDomain.h" |
13 #include "effects/GrSimpleTextureEffect.h" | 13 #include "effects/GrSimpleTextureEffect.h" |
14 | 14 |
15 #include "GrContext.h" | 15 #include "GrContext.h" |
16 #include "GrBitmapTextContext.h" | 16 #include "GrBitmapTextContext.h" |
17 #include "GrDistanceFieldTextContext.h" | 17 #include "GrDistanceFieldTextContext.h" |
18 #include "GrLayerCache.h" | 18 #include "GrLayerCache.h" |
19 #include "GrPictureUtils.h" | 19 #include "GrPictureUtils.h" |
20 | 20 |
21 #include "SkGrTexturePixelRef.h" | 21 #include "SkGrTexturePixelRef.h" |
22 | 22 |
23 #include "SkBounder.h" | |
24 #include "SkDeviceImageFilterProxy.h" | 23 #include "SkDeviceImageFilterProxy.h" |
25 #include "SkDrawProcs.h" | 24 #include "SkDrawProcs.h" |
26 #include "SkGlyphCache.h" | 25 #include "SkGlyphCache.h" |
27 #include "SkImageFilter.h" | 26 #include "SkImageFilter.h" |
28 #include "SkMaskFilter.h" | 27 #include "SkMaskFilter.h" |
29 #include "SkPathEffect.h" | 28 #include "SkPathEffect.h" |
30 #include "SkPicture.h" | 29 #include "SkPicture.h" |
31 #include "SkPicturePlayback.h" | 30 #include "SkPicturePlayback.h" |
32 #include "SkRRect.h" | 31 #include "SkRRect.h" |
33 #include "SkStroke.h" | 32 #include "SkStroke.h" |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 if (paint.getMaskFilter()->canFilterMaskGPU(devRRect.rect(), | 524 if (paint.getMaskFilter()->canFilterMaskGPU(devRRect.rect(), |
526 draw.fClip->getBounds(), | 525 draw.fClip->getBounds(), |
527 fContext->getMatrix(), | 526 fContext->getMatrix(), |
528 &maskRect)) { | 527 &maskRect)) { |
529 SkIRect finalIRect; | 528 SkIRect finalIRect; |
530 maskRect.roundOut(&finalIRect); | 529 maskRect.roundOut(&finalIRect); |
531 if (draw.fClip->quickReject(finalIRect)) { | 530 if (draw.fClip->quickReject(finalIRect)) { |
532 // clipped out | 531 // clipped out |
533 return; | 532 return; |
534 } | 533 } |
535 if (NULL != draw.fBounder && !draw.fBounder->doIRect(finalIR
ect)) { | |
536 // nothing to draw | |
537 return; | |
538 } | |
539 if (paint.getMaskFilter()->directFilterRRectMaskGPU(fContext
, &grPaint, | 534 if (paint.getMaskFilter()->directFilterRRectMaskGPU(fContext
, &grPaint, |
540 stroke,
devRRect)) { | 535 stroke,
devRRect)) { |
541 return; | 536 return; |
542 } | 537 } |
543 } | 538 } |
544 | 539 |
545 } | 540 } |
546 } | 541 } |
547 | 542 |
548 } | 543 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 } | 599 } |
605 | 600 |
606 GrPaint grPaint; | 601 GrPaint grPaint; |
607 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 602 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
608 SkStrokeRec stroke(paint); | 603 SkStrokeRec stroke(paint); |
609 | 604 |
610 fContext->drawOval(grPaint, oval, stroke); | 605 fContext->drawOval(grPaint, oval, stroke); |
611 } | 606 } |
612 | 607 |
613 #include "SkMaskFilter.h" | 608 #include "SkMaskFilter.h" |
614 #include "SkBounder.h" | |
615 | 609 |
616 /////////////////////////////////////////////////////////////////////////////// | 610 /////////////////////////////////////////////////////////////////////////////// |
617 | 611 |
618 // helpers for applying mask filters | 612 // helpers for applying mask filters |
619 namespace { | 613 namespace { |
620 | 614 |
621 // Draw a mask using the supplied paint. Since the coverage/geometry | 615 // Draw a mask using the supplied paint. Since the coverage/geometry |
622 // is already burnt into the mask this boils down to a rect draw. | 616 // is already burnt into the mask this boils down to a rect draw. |
623 // Return true if the mask was successfully drawn. | 617 // Return true if the mask was successfully drawn. |
624 bool draw_mask(GrContext* context, const SkRect& maskRect, | 618 bool draw_mask(GrContext* context, const SkRect& maskRect, |
625 GrPaint* grp, GrTexture* mask) { | 619 GrPaint* grp, GrTexture* mask) { |
626 GrContext::AutoMatrix am; | 620 GrContext::AutoMatrix am; |
627 if (!am.setIdentity(context, grp)) { | 621 if (!am.setIdentity(context, grp)) { |
628 return false; | 622 return false; |
629 } | 623 } |
630 | 624 |
631 SkMatrix matrix; | 625 SkMatrix matrix; |
632 matrix.setTranslate(-maskRect.fLeft, -maskRect.fTop); | 626 matrix.setTranslate(-maskRect.fLeft, -maskRect.fTop); |
633 matrix.postIDiv(mask->width(), mask->height()); | 627 matrix.postIDiv(mask->width(), mask->height()); |
634 | 628 |
635 grp->addCoverageEffect(GrSimpleTextureEffect::Create(mask, matrix))->unref()
; | 629 grp->addCoverageEffect(GrSimpleTextureEffect::Create(mask, matrix))->unref()
; |
636 context->drawRect(*grp, maskRect); | 630 context->drawRect(*grp, maskRect); |
637 return true; | 631 return true; |
638 } | 632 } |
639 | 633 |
640 bool draw_with_mask_filter(GrContext* context, const SkPath& devPath, | 634 bool draw_with_mask_filter(GrContext* context, const SkPath& devPath, |
641 SkMaskFilter* filter, const SkRegion& clip, SkBounder
* bounder, | 635 SkMaskFilter* filter, const SkRegion& clip, |
642 GrPaint* grp, SkPaint::Style style) { | 636 GrPaint* grp, SkPaint::Style style) { |
643 SkMask srcM, dstM; | 637 SkMask srcM, dstM; |
644 | 638 |
645 if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), filter, &context->getMat
rix(), &srcM, | 639 if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), filter, &context->getMat
rix(), &srcM, |
646 SkMask::kComputeBoundsAndRenderImage_CreateMode, sty
le)) { | 640 SkMask::kComputeBoundsAndRenderImage_CreateMode, sty
le)) { |
647 return false; | 641 return false; |
648 } | 642 } |
649 SkAutoMaskFreeImage autoSrc(srcM.fImage); | 643 SkAutoMaskFreeImage autoSrc(srcM.fImage); |
650 | 644 |
651 if (!filter->filterMask(&dstM, srcM, context->getMatrix(), NULL)) { | 645 if (!filter->filterMask(&dstM, srcM, context->getMatrix(), NULL)) { |
652 return false; | 646 return false; |
653 } | 647 } |
654 // this will free-up dstM when we're done (allocated in filterMask()) | 648 // this will free-up dstM when we're done (allocated in filterMask()) |
655 SkAutoMaskFreeImage autoDst(dstM.fImage); | 649 SkAutoMaskFreeImage autoDst(dstM.fImage); |
656 | 650 |
657 if (clip.quickReject(dstM.fBounds)) { | 651 if (clip.quickReject(dstM.fBounds)) { |
658 return false; | 652 return false; |
659 } | 653 } |
660 if (bounder && !bounder->doIRect(dstM.fBounds)) { | |
661 return false; | |
662 } | |
663 | 654 |
664 // we now have a device-aligned 8bit mask in dstM, ready to be drawn using | 655 // we now have a device-aligned 8bit mask in dstM, ready to be drawn using |
665 // the current clip (and identity matrix) and GrPaint settings | 656 // the current clip (and identity matrix) and GrPaint settings |
666 GrTextureDesc desc; | 657 GrTextureDesc desc; |
667 desc.fWidth = dstM.fBounds.width(); | 658 desc.fWidth = dstM.fBounds.width(); |
668 desc.fHeight = dstM.fBounds.height(); | 659 desc.fHeight = dstM.fBounds.height(); |
669 desc.fConfig = kAlpha_8_GrPixelConfig; | 660 desc.fConfig = kAlpha_8_GrPixelConfig; |
670 | 661 |
671 GrAutoScratchTexture ast(context, desc); | 662 GrAutoScratchTexture ast(context, desc); |
672 GrTexture* texture = ast.texture(); | 663 GrTexture* texture = ast.texture(); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 // The context's matrix may change while creating the mask, so save
the CTM here to | 803 // The context's matrix may change while creating the mask, so save
the CTM here to |
813 // pass to filterMaskGPU. | 804 // pass to filterMaskGPU. |
814 const SkMatrix ctm = fContext->getMatrix(); | 805 const SkMatrix ctm = fContext->getMatrix(); |
815 | 806 |
816 SkIRect finalIRect; | 807 SkIRect finalIRect; |
817 maskRect.roundOut(&finalIRect); | 808 maskRect.roundOut(&finalIRect); |
818 if (draw.fClip->quickReject(finalIRect)) { | 809 if (draw.fClip->quickReject(finalIRect)) { |
819 // clipped out | 810 // clipped out |
820 return; | 811 return; |
821 } | 812 } |
822 if (NULL != draw.fBounder && !draw.fBounder->doIRect(finalIRect)) { | |
823 // nothing to draw | |
824 return; | |
825 } | |
826 | 813 |
827 if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, | 814 if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, |
828 stroke, *devPathPtr))
{ | 815 stroke, *devPathPtr))
{ |
829 // the mask filter was able to draw itself directly, so there's
nothing | 816 // the mask filter was able to draw itself directly, so there's
nothing |
830 // left to do. | 817 // left to do. |
831 return; | 818 return; |
832 } | 819 } |
833 | 820 |
834 GrAutoScratchTexture mask; | 821 GrAutoScratchTexture mask; |
835 | 822 |
(...skipping 19 matching lines...) Expand all Loading... |
855 return; | 842 return; |
856 } | 843 } |
857 } | 844 } |
858 } | 845 } |
859 } | 846 } |
860 | 847 |
861 // draw the mask on the CPU - this is a fallthrough path in case the | 848 // draw the mask on the CPU - this is a fallthrough path in case the |
862 // GPU path fails | 849 // GPU path fails |
863 SkPaint::Style style = stroke.isHairlineStyle() ? SkPaint::kStroke_Style
: | 850 SkPaint::Style style = stroke.isHairlineStyle() ? SkPaint::kStroke_Style
: |
864 SkPaint::kFill_Style; | 851 SkPaint::kFill_Style; |
865 draw_with_mask_filter(fContext, *devPathPtr, paint.getMaskFilter(), | 852 draw_with_mask_filter(fContext, *devPathPtr, paint.getMaskFilter(), *dra
w.fClip, &grPaint, |
866 *draw.fClip, draw.fBounder, &grPaint, style); | 853 style); |
867 return; | 854 return; |
868 } | 855 } |
869 | 856 |
870 fContext->drawPath(grPaint, *pathPtr, stroke); | 857 fContext->drawPath(grPaint, *pathPtr, stroke); |
871 } | 858 } |
872 | 859 |
873 static const int kBmpSmallTileSize = 1 << 10; | 860 static const int kBmpSmallTileSize = 1 << 10; |
874 | 861 |
875 static inline int get_tile_count(const SkIRect& srcRect, int tileSize) { | 862 static inline int get_tile_count(const SkIRect& srcRect, int tileSize) { |
876 int tilesX = (srcRect.fRight / tileSize) - (srcRect.fLeft / tileSize) + 1; | 863 int tilesX = (srcRect.fRight / tileSize) - (srcRect.fLeft / tileSize) + 1; |
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2019 GrCachedLayer* layer = fContext->getLayerCache()->findLayerOrCreate(pict
ure, i); | 2006 GrCachedLayer* layer = fContext->getLayerCache()->findLayerOrCreate(pict
ure, i); |
2020 | 2007 |
2021 if (NULL != layer->getTexture()) { | 2008 if (NULL != layer->getTexture()) { |
2022 fContext->unlockScratchTexture(layer->getTexture()); | 2009 fContext->unlockScratchTexture(layer->getTexture()); |
2023 layer->setTexture(NULL); | 2010 layer->setTexture(NULL); |
2024 } | 2011 } |
2025 } | 2012 } |
2026 | 2013 |
2027 return true; | 2014 return true; |
2028 } | 2015 } |
OLD | NEW |