blob: 6664cfe3e175f14fafde61bda01835584c46d5b3 [file] [log] [blame] [edit]
/*
* Copyright 2019 Google LLC.
* Copyright 2022 Rive
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/renderer.hpp"
using namespace rivegm;
using namespace rive;
/**
* Repro case for https://bugs.chromium.org/p/chromium/issues/detail?id=913223
*
* The original bug was filed against square caps, but here we also draw the
* labyrinth using round and butt caps.
*
* Square and round caps expose over-coverage on overlaps when using coverage
* counting.
*
* Butt caps expose under-coverage on abutted strokes when using a 'max()'
* coverage function.
*/
static void draw_labyrinth(Renderer* renderer, StrokeCap cap)
{
constexpr static bool kRows[11][12] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1},
{1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0},
{0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
{1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1},
{0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};
constexpr static bool kCols[13][10] = {
{1, 1, 1, 1, 0, 1, 1, 1, 1, 1},
{0, 0, 1, 0, 0, 0, 1, 1, 1, 0},
{0, 1, 1, 0, 1, 1, 1, 0, 0, 1},
{1, 1, 0, 0, 0, 0, 1, 0, 1, 0},
{0, 0, 1, 0, 1, 0, 0, 0, 0, 1},
{0, 0, 1, 1, 1, 0, 0, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 0, 0, 0, 0},
{1, 1, 1, 0, 1, 1, 1, 0, 1, 0},
{1, 1, 0, 1, 1, 0, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 1, 1, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 0, 1, 1, 1},
};
Path maze;
for (size_t y = 0; y < std::size(kRows); ++y)
{
for (size_t x = 0; x < std::size(kRows[0]); ++x)
{
if (kRows[y][x])
{
maze->moveTo(x, y);
maze->lineTo(x + 1, y);
}
}
}
for (size_t x = 0; x < std::size(kCols); ++x)
{
for (size_t y = 0; y < std::size(kCols[0]); ++y)
{
if (kCols[x][y])
{
maze->moveTo(x, y);
maze->lineTo(x, y + 1);
}
}
}
Paint paint;
paint->style(RenderPaintStyle::stroke);
paint->thickness(.1f);
paint->color(0xff406060);
paint->cap(cap);
renderer->translate(10.5, 10.5);
renderer->scale(40, 40);
renderer->drawPath(maze, paint);
}
constexpr static int kWidth = 500;
constexpr static int kHeight = 420;
DEF_SIMPLE_GM(labyrinth_square, kWidth, kHeight, renderer)
{
draw_labyrinth(renderer, StrokeCap::square);
}
DEF_SIMPLE_GM(labyrinth_round, kWidth, kHeight, renderer)
{
draw_labyrinth(renderer, StrokeCap::round);
}
DEF_SIMPLE_GM(labyrinth_butt, kWidth, kHeight, renderer)
{
draw_labyrinth(renderer, StrokeCap::butt);
}