skia2/gm/crbug_1167277.cpp
Brian Salomon 6d717d401a GrQuadUtils: Handle degenerate persp quads where edges intersect outside quad
We were replacing points with the intersection of opposite edges.
Because of the distance tolerance we're using that may fall outside
of the original quad. Detect those cases and use averages of
intersection points instead.

Bug: chromium:1167277
Change-Id: I36b172f19339839bb21c060ddfe8109c184e9327
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/356311
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
2021-01-20 23:01:23 +00:00

42 lines
1.9 KiB
C++

/*
* Copyright 2021 Google LLC
*
* 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/SkMatrix.h"
#include "include/core/SkRect.h"
// This quad would, depending on which aa flags are used, would degenerate when inset. We'd replace
// and duplicate some of the inset points to make a triangle. However, one of the triangle points
// would be far outside the original quad.
DEF_SIMPLE_GM(crbug_1167277, canvas, 230, 320) {
canvas->translate(-1250, -900);
// Matrix, clip, and quad values taken from Chrome repro scenario.
SkMatrix ctm = SkMatrix::MakeAll(
SkBits2Float(0xbf8fcfae), SkBits2Float(0xbeae25ee), SkBits2Float(0x449ca6db),
SkBits2Float(0x3c9dc40f), SkBits2Float(0xbf950e35), SkBits2Float(0x4487da43),
SkBits2Float(0xb8d4d6bc), SkBits2Float(0xb92fbb29), SkBits2Float(0x3f6f605c));
SkRect rect = {SkBits2Float(0x00000000), SkBits2Float(0x00000000),
SkBits2Float(0x41880000), SkBits2Float(0x43440000)};
SkPoint clip[4] = {{SkBits2Float(0x3ef434a2), SkBits2Float(0x43440004)},
{SkBits2Float(0x00000000), SkBits2Float(0x43440009)},
{SkBits2Float(0x38ef605d), SkBits2Float(0x38ef605d)},
{SkBits2Float(0x3ef436e3), SkBits2Float(0x396f5d30)}};
SkColor color = SK_ColorGREEN;
for (int flags = 0; flags < static_cast<int>(SkCanvas::kAll_QuadAAFlags); ++flags) {
SkCanvas::QuadAAFlags aaFlags = static_cast<SkCanvas::QuadAAFlags>(flags);
canvas->save();
canvas->concat(ctm);
canvas->experimental_DrawEdgeAAQuad(rect, clip, aaFlags, color, SkBlendMode::kSrcOver);
canvas->restore();
canvas->translate(5, 0);
SkColor rgb = color & 0x00FFFFFF;
color = 0xFF000000 | (rgb << 4) | (rgb >> 20);
}
}