blob: eeb105e2cbf9f5ad731829d3bcd57131780ddaa3 [file] [log] [blame]
joshualitt44701df2015-02-23 14:44:57 -08001/*
2 * Copyright 2010 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrClip.h"
9
cdalton846c0512016-05-13 10:25:00 -070010#include "GrClipMaskManager.h"
joshualitt44701df2015-02-23 14:44:57 -080011
cdalton846c0512016-05-13 10:25:00 -070012void GrNoClip::getConservativeBounds(int width, int height, SkIRect* devResult,
13 bool* isIntersectionOfRects) const {
14 devResult->setXYWH(0, 0, width, height);
15 if (isIntersectionOfRects) {
16 *isIntersectionOfRects = true;
joshualitt44701df2015-02-23 14:44:57 -080017 }
18}
joshualitt9ece6a92015-02-23 17:03:33 -080019
cdalton846c0512016-05-13 10:25:00 -070020bool GrFixedClip::quickContains(const SkRect& rect) const {
21 if (fHasStencilClip) {
22 return false;
23 }
24 if (!fScissorState.enabled()) {
25 return true;
26 }
27 return fScissorState.rect().contains(rect);
28}
29
30void GrFixedClip::getConservativeBounds(int width, int height, SkIRect* devResult,
31 bool* isIntersectionOfRects) const {
32 devResult->setXYWH(0, 0, width, height);
33 if (fScissorState.enabled()) {
34 if (!devResult->intersect(fScissorState.rect())) {
35 devResult->setEmpty();
36 }
37 }
38 if (isIntersectionOfRects) {
39 *isIntersectionOfRects = true;
40 }
41}
42
43bool GrFixedClip::apply(GrClipMaskManager*, const GrPipelineBuilder& pipelineBuilder,
44 const SkRect* devBounds, GrAppliedClip* out) const {
45 if (fScissorState.enabled()) {
46 const GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
47 SkIRect tightScissor;
48 if (!tightScissor.intersect(fScissorState.rect(),
49 SkIRect::MakeWH(rt->width(), rt->height()))) {
50 return false;
51 }
52 if (devBounds && !devBounds->intersects(SkRect::Make(tightScissor))) {
53 return false;
54 }
robertphillips5f2fa472016-05-19 11:36:25 -070055 out->makeScissoredStencil(fHasStencilClip, tightScissor);
56 return true;
cdalton846c0512016-05-13 10:25:00 -070057 }
robertphillips5f2fa472016-05-19 11:36:25 -070058
59 out->makeStencil(fHasStencilClip);
cdalton846c0512016-05-13 10:25:00 -070060 return true;
61}
62
63bool GrClipStackClip::quickContains(const SkRect& rect) const {
64 if (!fStack) {
65 return true;
66 }
67 return fStack->quickContains(rect.makeOffset(SkIntToScalar(fOrigin.x()),
68 SkIntToScalar(fOrigin.y())));
69}
70
71void GrClipStackClip::getConservativeBounds(int width, int height, SkIRect* devResult,
72 bool* isIntersectionOfRects) const {
73 if (!fStack) {
74 devResult->setXYWH(0, 0, width, height);
75 if (isIntersectionOfRects) {
76 *isIntersectionOfRects = true;
77 }
78 return;
79 }
80 SkRect devBounds;
81 fStack->getConservativeBounds(-fOrigin.x(), -fOrigin.y(), width, height, &devBounds,
82 isIntersectionOfRects);
83 devBounds.roundOut(devResult);
84}
85
86bool GrClipStackClip::apply(GrClipMaskManager* clipMaskManager,
87 const GrPipelineBuilder& pipelineBuilder, const SkRect* devBounds,
88 GrAppliedClip* out) const {
89 // TODO: Collapse ClipMaskManager into this class.(?)
90 return clipMaskManager->setupClipping(pipelineBuilder, *this, devBounds, out);
joshualitt9ece6a92015-02-23 17:03:33 -080091}