| 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 26 matching lines...) Expand all Loading... |
| 37 #include "SkStroke.h" | 37 #include "SkStroke.h" |
| 38 #include "SkSurface.h" | 38 #include "SkSurface.h" |
| 39 #include "SkSurface_Gpu.h" | 39 #include "SkSurface_Gpu.h" |
| 40 #include "SkTLazy.h" | 40 #include "SkTLazy.h" |
| 41 #include "SkUtils.h" | 41 #include "SkUtils.h" |
| 42 #include "SkVertState.h" | 42 #include "SkVertState.h" |
| 43 #include "SkXfermode.h" | 43 #include "SkXfermode.h" |
| 44 #include "batches/GrRectBatchFactory.h" | 44 #include "batches/GrRectBatchFactory.h" |
| 45 #include "effects/GrBicubicEffect.h" | 45 #include "effects/GrBicubicEffect.h" |
| 46 #include "effects/GrDashingEffect.h" | 46 #include "effects/GrDashingEffect.h" |
| 47 #include "effects/GrRRectEffect.h" |
| 47 #include "effects/GrSimpleTextureEffect.h" | 48 #include "effects/GrSimpleTextureEffect.h" |
| 48 #include "effects/GrTextureDomain.h" | 49 #include "effects/GrTextureDomain.h" |
| 49 #include "text/GrTextUtils.h" | 50 #include "text/GrTextUtils.h" |
| 50 | 51 |
| 51 #if SK_SUPPORT_GPU | 52 #if SK_SUPPORT_GPU |
| 52 | 53 |
| 53 #define ASSERT_SINGLE_OWNER \ | 54 #define ASSERT_SINGLE_OWNER \ |
| 54 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fContext->debugSing
leOwner());) | 55 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fContext->debugSing
leOwner());) |
| 55 | 56 |
| 56 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; | 57 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 *draw.fMatrix, nullptr, | 556 *draw.fMatrix, nullptr, |
| 556 draw.fClip->getBounds(), true); | 557 draw.fClip->getBounds(), true); |
| 557 return; | 558 return; |
| 558 } | 559 } |
| 559 | 560 |
| 560 SkASSERT(!strokeInfo.isDashed()); | 561 SkASSERT(!strokeInfo.isDashed()); |
| 561 | 562 |
| 562 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); | 563 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); |
| 563 } | 564 } |
| 564 | 565 |
| 566 bool SkGpuDevice::drawFilledDRRect(const SkMatrix& viewMatrix, const SkRRect& or
igOuter, |
| 567 const SkRRect& origInner, const SkPaint& pain
t) { |
| 568 SkASSERT(!origInner.isEmpty()); |
| 569 SkASSERT(!origOuter.isEmpty()); |
| 570 |
| 571 bool applyAA = paint.isAntiAlias() && !fRenderTarget->isUnifiedMultisampled(
); |
| 572 |
| 573 GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdge
Type : |
| 574 kInverseFillBW_GrProcessorEdge
Type; |
| 575 GrPrimitiveEdgeType outerEdgeType = applyAA ? kFillAA_GrProcessorEdgeType : |
| 576 kFillBW_GrProcessorEdgeType; |
| 577 |
| 578 SkTCopyOnFirstWrite<SkRRect> inner(origInner), outer(origOuter); |
| 579 SkMatrix inverseVM; |
| 580 if (!viewMatrix.isIdentity()) { |
| 581 if (!origInner.transform(viewMatrix, inner.writable())) { |
| 582 return false; |
| 583 } |
| 584 if (!origOuter.transform(viewMatrix, outer.writable())) { |
| 585 return false; |
| 586 } |
| 587 if (!viewMatrix.invert(&inverseVM)) { |
| 588 return false; |
| 589 } |
| 590 } else { |
| 591 inverseVM.reset(); |
| 592 } |
| 593 |
| 594 GrPaint grPaint; |
| 595 |
| 596 if (!SkPaintToGrPaint(this->context(), paint, viewMatrix, &grPaint)) { |
| 597 return false; |
| 598 } |
| 599 |
| 600 grPaint.setAntiAlias(false); |
| 601 |
| 602 // TODO these need to be a geometry processors |
| 603 SkAutoTUnref<GrFragmentProcessor> innerEffect(GrRRectEffect::Create(innerEdg
eType, *inner)); |
| 604 if (!innerEffect) { |
| 605 return false; |
| 606 } |
| 607 |
| 608 SkAutoTUnref<GrFragmentProcessor> outerEffect(GrRRectEffect::Create(outerEdg
eType, *outer)); |
| 609 if (!outerEffect) { |
| 610 return false; |
| 611 } |
| 612 |
| 613 grPaint.addCoverageFragmentProcessor(innerEffect); |
| 614 grPaint.addCoverageFragmentProcessor(outerEffect); |
| 615 |
| 616 SkRect bounds = outer->getBounds(); |
| 617 if (applyAA) { |
| 618 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
| 619 } |
| 620 |
| 621 fDrawContext->fillRectWithLocalMatrix(fClip, grPaint, SkMatrix::I(), bounds,
inverseVM); |
| 622 return true; |
| 623 } |
| 624 |
| 625 |
| 565 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 626 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, |
| 566 const SkRRect& inner, const SkPaint& paint) { | 627 const SkRRect& inner, const SkPaint& paint) { |
| 567 ASSERT_SINGLE_OWNER | 628 ASSERT_SINGLE_OWNER |
| 568 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDRRect", fContext); | 629 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDRRect", fContext); |
| 569 CHECK_FOR_ANNOTATION(paint); | 630 CHECK_FOR_ANNOTATION(paint); |
| 570 CHECK_SHOULD_DRAW(draw); | 631 CHECK_SHOULD_DRAW(draw); |
| 571 | 632 |
| 633 if (outer.isEmpty()) { |
| 634 return; |
| 635 } |
| 636 |
| 637 if (inner.isEmpty()) { |
| 638 return this->drawRRect(draw, outer, paint); |
| 639 } |
| 640 |
| 572 SkStrokeRec stroke(paint); | 641 SkStrokeRec stroke(paint); |
| 573 | 642 |
| 574 if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()
) { | 643 if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()
) { |
| 575 GrPaint grPaint; | 644 if (this->drawFilledDRRect(*draw.fMatrix, outer, inner, paint)) { |
| 576 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint))
{ | |
| 577 return; | 645 return; |
| 578 } | 646 } |
| 579 | |
| 580 fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner); | |
| 581 return; | |
| 582 } | 647 } |
| 583 | 648 |
| 584 SkPath path; | 649 SkPath path; |
| 585 path.setIsVolatile(true); | 650 path.setIsVolatile(true); |
| 586 path.addRRect(outer); | 651 path.addRRect(outer); |
| 587 path.addRRect(inner); | 652 path.addRRect(inner); |
| 588 path.setFillType(SkPath::kEvenOdd_FillType); | 653 path.setFillType(SkPath::kEvenOdd_FillType); |
| 589 | 654 |
| 590 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 655 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
| 591 fClip, path, paint, | 656 fClip, path, paint, |
| (...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1883 } | 1948 } |
| 1884 | 1949 |
| 1885 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1950 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1886 ASSERT_SINGLE_OWNER | 1951 ASSERT_SINGLE_OWNER |
| 1887 // We always return a transient cache, so it is freed after each | 1952 // We always return a transient cache, so it is freed after each |
| 1888 // filter traversal. | 1953 // filter traversal. |
| 1889 return SkGpuDevice::NewImageFilterCache(); | 1954 return SkGpuDevice::NewImageFilterCache(); |
| 1890 } | 1955 } |
| 1891 | 1956 |
| 1892 #endif | 1957 #endif |
| OLD | NEW |