• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 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 "gm.h"
9 
10 #include "Resources.h"
11 
12 DEF_SIMPLE_GM(skbug_8664, canvas, 830, 550) {
13     const struct {
14         SkScalar    fSx, fSy, fTx, fTy;
15     } xforms[] = {
16         { 1, 1, 0, 0 },
17         { 0.5f, 0.5f, 530, 0 },
18         { 0.25f, 0.25f, 530, 275 },
19         { 0.125f, 0.125f, 530, 420 },
20     };
21 
22     SkPaint imagePaint;
23     // Must be at least medium to require mipmaps when we downscale the image
24     imagePaint.setFilterQuality(kMedium_SkFilterQuality);
25     sk_sp<SkImage> image(GetResourceAsImage("images/mandrill_512.png"));
26 
27     SkPaint overlayPaint;
28     overlayPaint.setColor(0x80FFFFFF);
29 
30     // Make the overlay visible even when the downscaled images fail to render
31     canvas->clear(0xFF888888);
32 
33     canvas->translate(20, 20);
34     for (const auto& xform : xforms) {
35         canvas->save();
36         canvas->translate(xform.fTx, xform.fTy);
37         canvas->scale(xform.fSx, xform.fSy);
38 
39         // Draw an image, possibly down sampled, which forces us to generate mipmaps inline
40         // on the second iteration.
41         canvas->drawImage(image, 0, 0, &imagePaint);
42 
43         // Draw an overlay that requires the scissor test for its clipping, so that the mipmap
44         // generation + scissor interference bug is highlighted in Adreno 330 devices.
45         SkRect inner = SkRect::MakeLTRB(32.f, 32.f, 480.f, 480.f);
46         SkRect outer = inner.makeOutset(16.f, 16.f);
47 
48         // Clip to smaller rectangle
49         canvas->save();
50         canvas->clipRect(inner);
51         // Then apply a rotation and draw a larger rectangle to ensure the clip cannot be dropped
52         canvas->rotate(20.f);
53         canvas->drawRect(outer, overlayPaint);
54         canvas->restore();
55 
56         canvas->restore();
57     }
58 }
59