| /* |
| * 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/gm.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkColor.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkPath.h" |
| #include "include/core/SkRect.h" |
| #include "include/core/SkScalar.h" |
| #include "include/core/SkSize.h" |
| #include "include/core/SkString.h" |
| #include "tools/ToolUtils.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(0xFFDDDDDD); |
| } |
| |
| protected: |
| SkISize getISize() override { return SkISize::Make(770, 770); } |
| |
| SkString getName() const 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(hasInterior ? ToolUtils::color_to_565(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 ? SkPathFillType::kEvenOdd : SkPathFillType::kWinding); |
| SkPathDirection outerDir = outerCW ? SkPathDirection::kCW : SkPathDirection::kCCW; |
| SkPathDirection innerDir = innerCW ? SkPathDirection::kCW : SkPathDirection::kCCW; |
| |
| 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: |
| |
| using INHERITED = GM; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| DEF_GM( return new PathInteriorGM; ) |