| /* |
| * 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 "sk_tool_utils.h" |
| #include "SkBlurMaskFilter.h" |
| #include "SkCanvas.h" |
| #include "SkGraphics.h" |
| #include "SkLayerDrawLooper.h" |
| #include "SkPath.h" |
| #include "SkRandom.h" |
| |
| static SkRect inset(const SkRect& r) { |
| SkRect rect = r; |
| rect.inset(r.width() / 8, r.height() / 8); |
| return rect; |
| } |
| |
| class PathInteriorGM : public skiagm::GM { |
| public: |
| PathInteriorGM() { |
| this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); |
| } |
| |
| protected: |
| SkISize onISize() override { |
| return SkISize::Make(770, 770); |
| } |
| |
| SkString onShortName() override { |
| return SkString("pathinterior"); |
| } |
| |
| void show(SkCanvas* canvas, const SkPath& path) { |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| |
| SkRect rect; |
| #if 0 |
| bool hasInterior = path.hasRectangularInterior(&rect); |
| #else |
| bool hasInterior = false; |
| #endif |
| |
| paint.setColor(sk_tool_utils::color_to_565(hasInterior ? 0xFF8888FF : SK_ColorGRAY)); |
| canvas->drawPath(path, paint); |
| paint.setStyle(SkPaint::kStroke_Style); |
| paint.setColor(SK_ColorRED); |
| canvas->drawPath(path, paint); |
| |
| if (hasInterior) { |
| paint.setStyle(SkPaint::kFill_Style); |
| paint.setColor(0x8800FF00); |
| canvas->drawRect(rect, paint); |
| } |
| } |
| |
| void onDraw(SkCanvas* canvas) override { |
| canvas->translate(8.5f, 8.5f); |
| |
| const SkRect rect = { 0, 0, 80, 80 }; |
| const SkScalar RAD = rect.width()/8; |
| |
| int i = 0; |
| for (int insetFirst = 0; insetFirst <= 1; ++insetFirst) { |
| for (int doEvenOdd = 0; doEvenOdd <= 1; ++doEvenOdd) { |
| for (int outerRR = 0; outerRR <= 1; ++outerRR) { |
| for (int innerRR = 0; innerRR <= 1; ++innerRR) { |
| for (int outerCW = 0; outerCW <= 1; ++outerCW) { |
| for (int innerCW = 0; innerCW <= 1; ++innerCW) { |
| SkPath path; |
| path.setFillType(doEvenOdd ? SkPath::kEvenOdd_FillType : SkPath::kWinding_FillType); |
| SkPath::Direction outerDir = outerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction; |
| SkPath::Direction innerDir = innerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction; |
| |
| SkRect r = insetFirst ? inset(rect) : rect; |
| if (outerRR) { |
| path.addRoundRect(r, RAD, RAD, outerDir); |
| } else { |
| path.addRect(r, outerDir); |
| } |
| r = insetFirst ? rect : inset(rect); |
| if (innerRR) { |
| path.addRoundRect(r, RAD, RAD, innerDir); |
| } else { |
| path.addRect(r, innerDir); |
| } |
| |
| SkScalar dx = (i / 8) * rect.width() * 6 / 5; |
| SkScalar dy = (i % 8) * rect.height() * 6 / 5; |
| i++; |
| path.offset(dx, dy); |
| |
| this->show(canvas, path); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| private: |
| |
| typedef GM INHERITED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| DEF_GM( return new PathInteriorGM; ) |