Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 1733993003: Mv DRRect drawing code from GrDrawContext into SkGpuDevice (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix bug Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698