skia2/gm/simpleaaclip.cpp
caryclark 65cdba6ba7 Revert of Revert of make gm background colors 565 compatible (patchset #1 id:1 of https://codereview.chromium.org/1184123002/)
Reason for revert:
underlying problem with portable refs deleted more than once fixed

Original issue's description:
> Revert of make gm background colors 565 compatible (patchset #2 id:20001 of https://codereview.chromium.org/1176243006/)
>
> Reason for revert:
> breaks many bots with refcnt error
>
> Original issue's description:
> > make gm background colors 565 compatible
> >
> > Change a batch of GM tests to convert their background color
> > so that it is representable in 8888 and 565.
> >
> > Enable portable text in those same tests to minimize platform
> > differences.
> >
> > In a couple of bitmap tests, use portable typefaces instead of
> > choosing 'Times' which may or may not be available on the platform.
> >
> > R=borenet@google.com
> >
> > Committed: https://skia.googlesource.com/skia/+/be7f768a357aefb39c42d24b81b24d647bb6ab70
>
> TBR=borenet@google.com
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
>
> Committed: https://skia.googlesource.com/skia/+/0bdb08b1ba8fbd18c4838f86a23f1ef4b3a3bfdf

TBR=borenet@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1182403003
2015-06-15 06:51:08 -07:00

204 lines
5.7 KiB
C++

/*
* Copyright 2012 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 "SkAAClip.h"
namespace skiagm {
static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
const SkPaint& paint) {
SkMask mask;
SkBitmap bm;
clip.copyToMask(&mask);
SkAutoMaskFreeImage amfi(mask.fImage);
bm.installMaskPixels(mask);
// need to copy for deferred drawing test to work
SkBitmap bm2;
bm.deepCopyTo(&bm2);
canvas->drawBitmap(bm2,
SK_Scalar1 * mask.fBounds.fLeft,
SK_Scalar1 * mask.fBounds.fTop,
&paint);
}
//////////////////////////////////////////////////////////////////////////////
/*
* This GM tests anti aliased single operation booleans with SkAAClips,
* SkRect and SkPaths.
*/
class SimpleClipGM : public GM {
public:
enum SkGeomTypes {
kRect_GeomType,
kPath_GeomType,
kAAClip_GeomType
};
SimpleClipGM(SkGeomTypes geomType)
: fGeomType(geomType) {
}
protected:
void onOnceBeforeDraw() override {
// offset the rects a bit so we get anti-aliasing in the rect case
fBase.set(100.65f,
100.65f,
150.65f,
150.65f);
fRect = fBase;
fRect.inset(5, 5);
fRect.offset(25, 25);
fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5));
fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5));
INHERITED::setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
}
void buildRgn(SkAAClip* clip, SkRegion::Op op) {
clip->setPath(fBasePath, NULL, true);
SkAAClip clip2;
clip2.setPath(fRectPath, NULL, true);
clip->op(clip2, op);
}
void drawOrig(SkCanvas* canvas) {
SkPaint paint;
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(SK_ColorBLACK);
canvas->drawRect(fBase, paint);
canvas->drawRect(fRect, paint);
}
void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
SkAAClip clip;
this->buildRgn(&clip, op);
this->drawOrig(canvas);
SkPaint paint;
paint.setColor(color);
paint_rgn(canvas, clip, paint);
}
void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
this->drawOrig(canvas);
canvas->save();
// create the clip mask with the supplied boolean op
if (kPath_GeomType == fGeomType) {
// path-based case
canvas->clipPath(fBasePath, SkRegion::kReplace_Op, true);
canvas->clipPath(fRectPath, op, true);
} else {
// rect-based case
canvas->clipRect(fBase, SkRegion::kReplace_Op, true);
canvas->clipRect(fRect, op, true);
}
// draw a rect that will entirely cover the clip mask area
SkPaint paint;
paint.setColor(color);
SkRect r = SkRect::MakeLTRB(SkIntToScalar(90), SkIntToScalar(90),
SkIntToScalar(180), SkIntToScalar(180));
canvas->drawRect(r, paint);
canvas->restore();
}
virtual SkString onShortName() {
SkString str;
str.printf("simpleaaclip_%s",
kRect_GeomType == fGeomType ? "rect" :
(kPath_GeomType == fGeomType ? "path" :
"aaclip"));
return str;
}
virtual SkISize onISize() {
return SkISize::Make(640, 480);
}
virtual void onDraw(SkCanvas* canvas) {
static const struct {
SkColor fColor;
const char* fName;
SkRegion::Op fOp;
} gOps[] = {
{ SK_ColorBLACK, "Difference", SkRegion::kDifference_Op },
{ SK_ColorRED, "Intersect", SkRegion::kIntersect_Op },
{ 0xFF008800, "Union", SkRegion::kUnion_Op },
{ SK_ColorGREEN, "Rev Diff", SkRegion::kReverseDifference_Op },
{ SK_ColorYELLOW, "Replace", SkRegion::kReplace_Op },
{ SK_ColorBLUE, "XOR", SkRegion::kXOR_Op },
};
SkPaint textPaint;
textPaint.setAntiAlias(true);
sk_tool_utils::set_portable_typeface_always(&textPaint);
textPaint.setTextSize(SK_Scalar1*24);
int xOff = 0;
for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
SkIntToScalar(75), SkIntToScalar(50),
textPaint);
if (kAAClip_GeomType == fGeomType) {
this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
} else {
this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor);
}
if (xOff >= 400) {
canvas->translate(SkIntToScalar(-400), SkIntToScalar(250));
xOff = 0;
} else {
canvas->translate(SkIntToScalar(200), 0);
xOff += 200;
}
}
}
private:
SkGeomTypes fGeomType;
SkRect fBase;
SkRect fRect;
SkPath fBasePath; // fBase as a round rect
SkPath fRectPath; // fRect as a round rect
typedef GM INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
// rects
DEF_GM( return new SimpleClipGM(SimpleClipGM::kRect_GeomType); )
DEF_GM( return new SimpleClipGM(SimpleClipGM::kPath_GeomType); )
DEF_GM( return new SimpleClipGM(SimpleClipGM::kAAClip_GeomType); )
}