blob: 0290af2ce673d5fab6e230b7b9a26fb2ce2aa943 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SampleCode.h"
#include "SkCanvas.h"
#include "SkDevice.h"
#include "SkPaint.h"
#include "SkRandom.h"
#include "SkShader.h"
#include "SkView.h"
/**
* Animated sample used to develop batched rect implementation in GrBufferedDrawTarget.
*/
class ManyRectsView : public SampleView {
private:
enum {
N = 1000,
};
public:
ManyRectsView() {}
protected:
bool onQuery(SkEvent* evt) override {
if (SampleCode::TitleQ(*evt)) {
SampleCode::TitleR(evt, "ManyRects");
return true;
}
return this->INHERITED::onQuery(evt);
}
void onDrawContent(SkCanvas* canvas) override {
SkISize dsize = canvas->getDeviceSize();
canvas->clear(0xFFF0E0F0);
for (int i = 0; i < N; ++i) {
SkRect rect = SkRect::MakeWH(SkIntToScalar(fRandom.nextRangeU(10, 100)),
SkIntToScalar(fRandom.nextRangeU(10, 100)));
int x = fRandom.nextRangeU(0, dsize.fWidth);
int y = fRandom.nextRangeU(0, dsize.fHeight);
canvas->save();
canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
// Rotation messes up the GPU batching because of the clip below. We don't notice
// that the rect is inside the clip so the clip changes interrupt batching.
if (false) {
SkMatrix rotate;
rotate.setRotate(fRandom.nextUScalar1() * 360,
SkIntToScalar(x) + SkScalarHalf(rect.fRight),
SkIntToScalar(y) + SkScalarHalf(rect.fBottom));
canvas->concat(rotate);
}
SkRect clipRect = rect;
// This clip will always contain the entire rect. It's here to give the GPU batching
// code a little more challenge.
clipRect.outset(10, 10);
canvas->clipRect(clipRect);
SkPaint paint;
paint.setColor(fRandom.nextU());
canvas->drawRect(rect, paint);
canvas->restore();
}
this->inval(nullptr);
}
private:
SkRandom fRandom;
typedef SampleView INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
static SkView* MyFactory() { return new ManyRectsView; }
static SkViewRegister reg(MyFactory);
|