Improve integer aligned coordinate detection
65.9998 should be detected as integer aligned. Before this CL only 65.0001 was detected as an integer. Test: Pass TextureViewTest#testSamplingWithTransform Bug: 137682518 Change-Id: I65e650f50040ab56d2237c14d5d8ee191349b93e
This commit is contained in:
@@ -33,6 +33,10 @@ void LayerDrawable::onDraw(SkCanvas* canvas) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline SkScalar isIntegerAligned(SkScalar x) {
|
||||
return fabsf(roundf(x) - x) <= NON_ZERO_EPSILON;
|
||||
}
|
||||
|
||||
// Disable filtering when there is no scaling in screen coordinates and the corners have the same
|
||||
// fraction (for translate) or zero fraction (for any other rect-to-rect transform).
|
||||
static bool shouldFilterRect(const SkMatrix& matrix, const SkRect& srcRect, const SkRect& dstRect) {
|
||||
@@ -62,10 +66,10 @@ static bool shouldFilterRect(const SkMatrix& matrix, const SkRect& srcRect, cons
|
||||
if (requiresIntegerTranslate) {
|
||||
// Device rect and source rect should be integer aligned to ensure there's no difference
|
||||
// in how nearest-neighbor sampling is resolved.
|
||||
return !(MathUtils::isZero(SkScalarFraction(srcRect.x())) &&
|
||||
MathUtils::isZero(SkScalarFraction(srcRect.y())) &&
|
||||
MathUtils::isZero(SkScalarFraction(dstDevRect.x())) &&
|
||||
MathUtils::isZero(SkScalarFraction(dstDevRect.y())));
|
||||
return !(isIntegerAligned(srcRect.x()) &&
|
||||
isIntegerAligned(srcRect.y()) &&
|
||||
isIntegerAligned(dstDevRect.x()) &&
|
||||
isIntegerAligned(dstDevRect.y()));
|
||||
} else {
|
||||
// As long as src and device rects are translated by the same fractional amount,
|
||||
// filtering won't be needed
|
||||
|
||||
Reference in New Issue
Block a user