Flutter Engine
The Flutter Engine
skbug_8664.cpp
Go to the documentation of this file.
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/gm.h"
12#include "include/core/SkRect.h"
15#include "tools/DecodeUtils.h"
16#include "tools/Resources.h"
17
18DEF_SIMPLE_GM(skbug_8664, canvas, 830, 550) {
19 const struct {
20 SkScalar fSx, fSy, fTx, fTy;
21 } xforms[] = {
22 { 1, 1, 0, 0 },
23 { 0.5f, 0.5f, 530, 0 },
24 { 0.25f, 0.25f, 530, 275 },
25 { 0.125f, 0.125f, 530, 420 },
26 };
27
28 // Must be at least medium to require mipmaps when we downscale the image
31
32 sk_sp<SkImage> image(ToolUtils::GetResourceAsImage("images/mandrill_512.png"));
33
34 SkPaint overlayPaint;
35 overlayPaint.setColor(0x80FFFFFF);
36
37 // Make the overlay visible even when the downscaled images fail to render
38 canvas->clear(0xFF888888);
39
40 canvas->translate(20, 20);
41 for (const auto& xform : xforms) {
42 canvas->save();
43 canvas->translate(xform.fTx, xform.fTy);
44 canvas->scale(xform.fSx, xform.fSy);
45
46 // Draw an image, possibly down sampled, which forces us to generate mipmaps inline
47 // on the second iteration.
48 canvas->drawImage(image, 0, 0, sampling, nullptr);
49
50 // Draw an overlay that requires the scissor test for its clipping, so that the mipmap
51 // generation + scissor interference bug is highlighted in Adreno 330 devices.
52 SkRect inner = SkRect::MakeLTRB(32.f, 32.f, 480.f, 480.f);
53 SkRect outer = inner.makeOutset(16.f, 16.f);
54
55 // Clip to smaller rectangle
56 canvas->save();
57 canvas->clipRect(inner);
58 // Then apply a rotation and draw a larger rectangle to ensure the clip cannot be dropped
59 canvas->rotate(20.f);
60 canvas->drawRect(outer, overlayPaint);
61 canvas->restore();
62
63 canvas->restore();
64 }
65}
void setColor(SkColor color)
Definition: SkPaint.cpp:119
float SkScalar
Definition: extension.cpp:12
sk_sp< const SkImage > image
Definition: SkRecords.h:269
PODArray< SkRSXform > xforms
Definition: SkRecords.h:332
SkSamplingOptions sampling
Definition: SkRecords.h:337
sk_sp< SkImage > GetResourceAsImage(const char *resource)
Definition: DecodeUtils.h:25
DEF_SIMPLE_GM(skbug_8664, canvas, 830, 550)
Definition: skbug_8664.cpp:18
SkRect makeOutset(float dx, float dy) const
Definition: SkRect.h:1002
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
Definition: SkRect.h:646