blob: 302785b61983df69049988aea860ba8baf69db59 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "impeller/geometry/wangs_formula.h"
namespace impeller {
namespace {
// Don't allow linearized segments to be off by more than 1/4th of a pixel from
// the true curve. This value should be scaled by the max basis of the
// X and Y directions.
constexpr static Scalar kPrecision = 4;
constexpr Scalar length(Point n) {
Point nn = n * n;
return std::sqrt(nn.x + nn.y);
}
} // namespace
Scalar ComputeCubicSubdivisions(Scalar scale_factor,
Point p0,
Point p1,
Point p2,
Point p3) {
Scalar k = scale_factor * .75f * kPrecision;
Point a = (p0 - p1 * 2 + p2).Abs();
Point b = (p1 - p2 * 2 + p3).Abs();
return std::sqrt(k * length(a.Max(b)));
}
Scalar ComputeQuadradicSubdivisions(Scalar scale_factor,
Point p0,
Point p1,
Point p2) {
Scalar k = scale_factor * .25f * kPrecision;
return std::sqrt(k * length(p0 - p1 * 2 + p2));
}
Scalar ComputeQuadradicSubdivisions(Scalar scale_factor,
const QuadraticPathComponent& quad) {
return ComputeQuadradicSubdivisions(scale_factor, quad.p1, quad.cp, quad.p2);
}
Scalar ComputeCubicSubdivisions(float scale_factor,
const CubicPathComponent& cub) {
return ComputeCubicSubdivisions(scale_factor, cub.p1, cub.cp1, cub.cp2,
cub.p2);
}
} // namespace impeller