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