From b21fac156d9287d6c0cfd446d707c4c7be6fae6e Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Fri, 7 Feb 2014 21:13:11 +0000 Subject: Make GMs aware of what tool they're being run in. Add a saveLayer set of draws to convex_poly_clip and fix GPU bug where polygon clips don't account for the translation between clip and device space. BUG=skia:2051 R=robertphillips@google.com, reed@google.com Author: bsalomon@google.com Review URL: https://codereview.chromium.org/148283017 git-svn-id: http://skia.googlecode.com/svn/trunk@13371 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/convexpolyclip.cpp | 124 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 83 insertions(+), 41 deletions(-) (limited to 'gm/convexpolyclip.cpp') diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp index 0822f4c219..a8037aaa54 100644 --- a/gm/convexpolyclip.cpp +++ b/gm/convexpolyclip.cpp @@ -83,7 +83,12 @@ protected: } virtual SkISize onISize() SK_OVERRIDE { - return make_isize(435, 540); + // When benchmarking the saveLayer set of draws is skipped. + int w = 435; + if (kBench_Mode != this->getMode()) { + w *= 2; + } + return make_isize(w, 540); } virtual void onOnceBeforeDraw() SK_OVERRIDE { @@ -140,47 +145,70 @@ protected: SkIntToScalar(size.fHeight)); canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint); - for (SkTLList::Iter iter(fClips, SkTLList::Iter::kHead_IterStart); - NULL != iter.get(); - iter.next()) { - const Clip* clip = iter.get(); - SkScalar x = 0; - for (int aa = 0; aa < 2; ++aa) { - canvas->save(); - canvas->translate(x, y); - clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); - canvas->drawBitmap(fBmp, 0, 0); - canvas->restore(); - x += fBmp.width() + kMargin; - } - for (int aa = 0; aa < 2; ++aa) { - static const char kTxt[] = "Clip Me!"; - SkPaint txtPaint; - txtPaint.setTextSize(23.f); - txtPaint.setAntiAlias(true); - txtPaint.setColor(SK_ColorDKGRAY); - - SkPaint clipOutlinePaint; - clipOutlinePaint.setAntiAlias(true); - clipOutlinePaint.setColor(0x50505050); - clipOutlinePaint.setStyle(SkPaint::kStroke_Style); - clipOutlinePaint.setStrokeWidth(0); - - canvas->save(); - canvas->translate(x, y); - SkPath closedClipPath; - clip->asClosedPath(&closedClipPath); - canvas->drawPath(closedClipPath, clipOutlinePaint); - clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); - canvas->scale(1.f, 1.8f); - canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, - 0, 1.5f * txtPaint.getTextSize(), - txtPaint); - canvas->restore(); - x += fBmp.width() + kMargin; + static const char kTxt[] = "Clip Me!"; + SkPaint txtPaint; + txtPaint.setTextSize(23.f); + txtPaint.setAntiAlias(true); + txtPaint.setColor(SK_ColorDKGRAY); + SkScalar textW = txtPaint.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1); + + SkScalar startX = 0; + int testLayers = kBench_Mode != this->getMode(); + for (int doLayer = 0; doLayer <= testLayers; ++doLayer) { + for (SkTLList::Iter iter(fClips, SkTLList::Iter::kHead_IterStart); + NULL != iter.get(); + iter.next()) { + const Clip* clip = iter.get(); + SkScalar x = startX; + for (int aa = 0; aa < 2; ++aa) { + if (doLayer) { + SkRect bounds; + clip->getBounds(&bounds); + bounds.outset(2, 2); + bounds.offset(x, y); + canvas->saveLayer(&bounds, NULL); + } else { + canvas->save(); + } + canvas->translate(x, y); + clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); + canvas->drawBitmap(fBmp, 0, 0); + canvas->restore(); + x += fBmp.width() + kMargin; + } + for (int aa = 0; aa < 2; ++aa) { + + SkPaint clipOutlinePaint; + clipOutlinePaint.setAntiAlias(true); + clipOutlinePaint.setColor(0x50505050); + clipOutlinePaint.setStyle(SkPaint::kStroke_Style); + clipOutlinePaint.setStrokeWidth(0); + + if (doLayer) { + SkRect bounds; + clip->getBounds(&bounds); + bounds.outset(2, 2); + bounds.offset(x, y); + canvas->saveLayer(&bounds, NULL); + } else { + canvas->save(); + } + canvas->translate(x, y); + SkPath closedClipPath; + clip->asClosedPath(&closedClipPath); + canvas->drawPath(closedClipPath, clipOutlinePaint); + clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); + canvas->scale(1.f, 1.8f); + canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, + 0, 1.5f * txtPaint.getTextSize(), + txtPaint); + canvas->restore(); + x += textW + 2 * kMargin; + } + y += fBmp.height() + kMargin; } - - y += fBmp.height() + kMargin; + y = 0; + startX += 2 * fBmp.width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin; } } @@ -242,6 +270,20 @@ private: ClipType getType() const { return fClipType; } + void getBounds(SkRect* bounds) const { + switch (fClipType) { + case kPath_ClipType: + *bounds = fPath.getBounds(); + break; + case kRect_ClipType: + *bounds = fRect; + break; + case kNone_ClipType: + SkDEBUGFAIL("Uninitialized Clip."); + break; + } + } + private: ClipType fClipType; SkPath fPath; -- cgit v1.2.3