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