1
2 /*
3 * Copyright 2015 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9 #include "Test.h"
10 // This is a GR test
11 #if SK_SUPPORT_GPU
12 #include "GrClipMaskManager.h"
13 #include "GrContext.h"
14
15 // Ensure that the 'getConservativeBounds' calls are returning bounds clamped
16 // to the render target
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrClipBounds,reporter,context)17 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrClipBounds, reporter, context) {
18 static const int kXSize = 100;
19 static const int kYSize = 100;
20
21 GrSurfaceDesc desc;
22 desc.fFlags = kRenderTarget_GrSurfaceFlag;
23 desc.fConfig = kAlpha_8_GrPixelConfig;
24 desc.fWidth = kXSize;
25 desc.fHeight = kYSize;
26
27 SkAutoTUnref<GrTexture> texture(
28 context->textureProvider()->createTexture(desc, SkBudgeted::kYes, nullptr, 0));
29 if (!texture) {
30 return;
31 }
32
33 SkIRect intScreen = SkIRect::MakeWH(kXSize, kYSize);
34 SkRect screen = SkRect::Make(intScreen);
35
36 SkRect clipRect(screen);
37 clipRect.outset(10, 10);
38
39 // create a clip stack that will (trivially) reduce to a single rect that
40 // is larger than the screen
41 SkClipStack stack;
42 stack.clipDevRect(clipRect, SkRegion::kReplace_Op, false);
43
44 bool isIntersectionOfRects = true;
45 SkRect devStackBounds;
46
47 stack.getConservativeBounds(0, 0, kXSize, kYSize,
48 &devStackBounds,
49 &isIntersectionOfRects);
50
51 // make sure that the SkClipStack is behaving itself
52 REPORTER_ASSERT(reporter, screen == devStackBounds);
53 REPORTER_ASSERT(reporter, isIntersectionOfRects);
54
55 // wrap the SkClipStack in a GrClip
56 GrClip clipData;
57 clipData.setClipStack(&stack);
58
59 SkIRect devGrClipBound;
60 clipData.getConservativeBounds(texture->width(), texture->height(),
61 &devGrClipBound,
62 &isIntersectionOfRects);
63
64 // make sure that GrClip is behaving itself
65 REPORTER_ASSERT(reporter, intScreen == devGrClipBound);
66 REPORTER_ASSERT(reporter, isIntersectionOfRects);
67 }
68
69 #endif
70