skia2/gm/complexclip2.cpp
commit-bot@chromium.org e0e7cfe44b Change old PRG to be SkLCGRandom; change new one to SkRandom
The goal here is to get people to start using the new random number
generator, while leaving the old one in place so we don't have to 
rebaseline GMs.

R=reed@google.com, bsalomon@google.com

Author: jvanverth@google.com

Review URL: https://chromiumcodereview.appspot.com/23576015

git-svn-id: http://skia.googlecode.com/svn/trunk@11169 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-09-09 20:09:12 +00:00

183 lines
5.6 KiB
C++

/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.h"
#include "SkCanvas.h"
#include "SkPath.h"
#include "SkRandom.h"
namespace skiagm {
class ComplexClip2GM : public GM {
public:
ComplexClip2GM(bool doPaths, bool antiAlias)
: fDoPaths(doPaths)
, fAntiAlias(antiAlias) {
this->setBGColor(SkColorSetRGB(0xDD,0xA0,0xDD));
// offset the rects a bit so we get antialiasing even in the rect case
SkScalar xA = SkFloatToScalar(0.65f);
SkScalar xB = SkFloatToScalar(10.65f);
SkScalar xC = SkFloatToScalar(20.65f);
SkScalar xD = SkFloatToScalar(30.65f);
SkScalar xE = SkFloatToScalar(40.65f);
SkScalar xF = SkFloatToScalar(50.65f);
SkScalar yA = SkFloatToScalar(0.65f);
SkScalar yB = SkFloatToScalar(10.65f);
SkScalar yC = SkFloatToScalar(20.65f);
SkScalar yD = SkFloatToScalar(30.65f);
SkScalar yE = SkFloatToScalar(40.65f);
SkScalar yF = SkFloatToScalar(50.65f);
fWidth = xF - xA;
fHeight = yF - yA;
fRects[0].set(xB, yB, xE, yE);
fPaths[0].addRoundRect(fRects[0], SkIntToScalar(5), SkIntToScalar(5));
fRectColors[0] = SK_ColorRED;
fRects[1].set(xA, yA, xD, yD);
fPaths[1].addRoundRect(fRects[1], SkIntToScalar(5), SkIntToScalar(5));
fRectColors[1] = SK_ColorGREEN;
fRects[2].set(xC, yA, xF, yD);
fPaths[2].addRoundRect(fRects[2], SkIntToScalar(5), SkIntToScalar(5));
fRectColors[2] = SK_ColorBLUE;
fRects[3].set(xA, yC, xD, yF);
fPaths[3].addRoundRect(fRects[3], SkIntToScalar(5), SkIntToScalar(5));
fRectColors[3] = SK_ColorYELLOW;
fRects[4].set(xC, yC, xF, yF);
fPaths[4].addRoundRect(fRects[4], SkIntToScalar(5), SkIntToScalar(5));
fRectColors[4] = SK_ColorCYAN;
fTotalWidth = kCols * fWidth + SK_Scalar1 * (kCols + 1) * kPadX;
fTotalHeight = kRows * fHeight + SK_Scalar1 * (kRows + 1) * kPadY;
SkRegion::Op ops[] = {
SkRegion::kDifference_Op,
SkRegion::kIntersect_Op,
SkRegion::kUnion_Op,
SkRegion::kXOR_Op,
SkRegion::kReverseDifference_Op,
SkRegion::kReplace_Op,
};
SkLCGRandom r;
for (int i = 0; i < kRows; ++i) {
for (int j = 0; j < kCols; ++j) {
for (int k = 0; k < 5; ++k) {
fOps[j*kRows+i][k] = ops[r.nextU() % SK_ARRAY_COUNT(ops)];
}
}
}
}
protected:
static const int kRows = 5;
static const int kCols = 5;
static const int kPadX = 20;
static const int kPadY = 20;
virtual SkString onShortName() {
if (!fDoPaths && !fAntiAlias) {
return SkString("complexclip2");
}
SkString str;
str.printf("complexclip2_%s_%s",
fDoPaths ? "path" : "rect",
fAntiAlias ? "aa" : "bw");
return str;
}
virtual SkISize onISize() {
return make_isize(SkScalarRoundToInt(fTotalWidth),
SkScalarRoundToInt(fTotalHeight));
}
virtual void onDraw(SkCanvas* canvas) {
SkPaint rectPaint;
rectPaint.setStyle(SkPaint::kStroke_Style);
rectPaint.setStrokeWidth(-1);
SkPaint fillPaint;
fillPaint.setColor(SkColorSetRGB(0xA0,0xDD,0xA0));
for (int i = 0; i < kRows; ++i) {
for (int j = 0; j < kCols; ++j) {
canvas->save();
canvas->translate(kPadX * SK_Scalar1 + (fWidth + kPadX * SK_Scalar1)*j,
kPadY * SK_Scalar1 + (fHeight + kPadY * SK_Scalar1)*i);
// draw the original shapes first so we can see the
// antialiasing on the clipped draw
for (int k = 0; k < 5; ++k) {
rectPaint.setColor(fRectColors[k]);
if (fDoPaths) {
canvas->drawPath(fPaths[k], rectPaint);
} else {
canvas->drawRect(fRects[k], rectPaint);
}
}
for (int k = 0; k < 5; ++k) {
if (fDoPaths) {
canvas->clipPath(fPaths[k],
fOps[j*kRows+i][k],
fAntiAlias);
} else {
canvas->clipRect(fRects[k],
fOps[j*kRows+i][k],
fAntiAlias);
}
}
canvas->drawRect(SkRect::MakeWH(fWidth, fHeight), fillPaint);
canvas->restore();
}
}
}
private:
bool fDoPaths;
bool fAntiAlias;
SkRect fRects[5];
SkPath fPaths[5];
SkColor fRectColors[5];
SkRegion::Op fOps[kRows * kCols][5];
SkScalar fWidth;
SkScalar fHeight;
SkScalar fTotalWidth;
SkScalar fTotalHeight;
typedef GM INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
// bw rects
static GM* MyFactory(void*) { return new ComplexClip2GM(false, false); }
static GMRegistry reg(MyFactory);
// bw paths
static GM* MyFactory2(void*) { return new ComplexClip2GM(true, false); }
static GMRegistry reg2(MyFactory2);
// aa rects
static GM* MyFactory3(void*) { return new ComplexClip2GM(false, true); }
static GMRegistry reg3(MyFactory3);
// aa paths
static GM* MyFactory4(void*) { return new ComplexClip2GM(true, true); }
static GMRegistry reg4(MyFactory4);
}