mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Fix GH-41226 by suppressing path adjustment when not actually drawing a border (#46239)
Summary: When not drawing a border, the mGapBetweenPaths adjustment can create noticable pixelation when drawing curves through a low number of pixels. This is noticable mostly on buttons and such on low-dpi devices. This fix only applies the fix if clipping for the border radius is done. When drawing small radius rounded backgrounds (e.g. to draw a circle or button) we see visible pixelation (see [GH-41226](https://github.com/facebook/react-native/issues/41226)) This is particularly noticable on low DPI devices. ## Changelog: [ANDROID] [FIXED] - Don't use mGapBetweenPaths if not drawing a border Pull Request resolved: https://github.com/facebook/react-native/pull/46239 Test Plan: Built an android app that directly uses CSSBackgroundDrawable to draw a background and verified repro of this issue.  Then modified the code according to this PR and verified that anti-aliasing is appropriately applied  Reviewed By: NickGerleman Differential Revision: D61925281 Pulled By: jorge-cab fbshipit-source-id: 93014629d031bd0d716cd3bb11e2c294dedad639
This commit is contained in:
committed by
Riccardo Cipolleschi
parent
6eb2836f61
commit
af5002b2e1
+9
-4
@@ -605,6 +605,7 @@ public class CSSBackgroundDrawable extends Drawable {
|
||||
}
|
||||
|
||||
// Clip border ONLY if its color is non transparent
|
||||
float pathAdjustment = 0f;
|
||||
if (Color.alpha(colorLeft) != 0
|
||||
&& Color.alpha(colorTop) != 0
|
||||
&& Color.alpha(colorRight) != 0
|
||||
@@ -615,6 +616,10 @@ public class CSSBackgroundDrawable extends Drawable {
|
||||
mInnerClipTempRectForBorderRadius.bottom -= borderWidth.bottom;
|
||||
mInnerClipTempRectForBorderRadius.left += borderWidth.left;
|
||||
mInnerClipTempRectForBorderRadius.right -= borderWidth.right;
|
||||
|
||||
// only close gap between border and main path if we draw the border, otherwise
|
||||
// we wind up pixelating small pixel-radius curves
|
||||
pathAdjustment = mGapBetweenPaths;
|
||||
}
|
||||
|
||||
mTempRectForCenterDrawPath.top += borderWidth.top * 0.5f;
|
||||
@@ -661,10 +666,10 @@ public class CSSBackgroundDrawable extends Drawable {
|
||||
// (mInnerClipTempRectForBorderRadius), ensuring the border can be
|
||||
// drawn on top without the gap.
|
||||
mBackgroundColorRenderPath.addRoundRect(
|
||||
mInnerClipTempRectForBorderRadius.left - mGapBetweenPaths,
|
||||
mInnerClipTempRectForBorderRadius.top - mGapBetweenPaths,
|
||||
mInnerClipTempRectForBorderRadius.right + mGapBetweenPaths,
|
||||
mInnerClipTempRectForBorderRadius.bottom + mGapBetweenPaths,
|
||||
mInnerClipTempRectForBorderRadius.left - pathAdjustment,
|
||||
mInnerClipTempRectForBorderRadius.top - pathAdjustment,
|
||||
mInnerClipTempRectForBorderRadius.right + pathAdjustment,
|
||||
mInnerClipTempRectForBorderRadius.bottom + pathAdjustment,
|
||||
new float[] {
|
||||
innerTopLeftRadiusX,
|
||||
innerTopLeftRadiusY,
|
||||
|
||||
Reference in New Issue
Block a user