RFR: JDK-8294680: Refactor scaled border rendering [v7]
Alexey Ivanov
aivanov at openjdk.org
Thu Jan 19 17:12:51 UTC 2023
On Fri, 13 Jan 2023 20:36:46 GMT, Harshitha Onkar <honkar at openjdk.org> wrote:
>> In this fix, the common code required for scaled border rendering is unified and added to SwingUtilities3. This is achieved by adding a functional interface to SwingUtilities3 and calling the the respective paintBorder function passed as functional parameter to the method.
>>
>> Following are the usual steps for any border scaling -
>>
>> - Resetting transform.
>> - Calculating new width, height, x & y-translations.
>> - Perform the required border rendering.
>> - And at the end restore the previous transform.
>>
>> To test the refactored code, 3 separate border scaling instances were taken (details below) and the SwingUtilities3.paintBorder, (containing the common functionality) was applied. All the tests associated with the respective border changes pass.
>>
>> 1. EtchedBorder - [PR#7449](https://github.com/openjdk/jdk/pull/7449) - Test: ScaledEtchedBorderTest.java
>> 2. LineBorder - [PR#10681](https://github.com/openjdk/jdk/pull/10681) - Test: ScaledLineBorderTest & ScaledTextFieldBorderTest.java
>> 3. JInternalFrame Border - [PR#10274](https://github.com/openjdk/jdk/pull/10274) - Test: InternalFrameBorderTest.java
>>
>> The advantage of this solution is - it avoids code repetition and can be reused across all the border classes requiring border scaling fix.
>
> Harshitha Onkar has updated the pull request incrementally with two additional commits since the last revision:
>
> - copyright year updated
> - formatting changes, docs added
src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 148:
> 146: /**
> 147: * Used within border classes to add specific border implementation details.
> 148: */
Suggestion:
/**
* A task which paints an <i>unscaled</i> border after {@code Graphics}
* transforms are removed. It's used with the
* {@link #paintBorder(Component, Graphics, int, int, int, int, UnscaledBorderPainter)
* SwingUtilities3.paintBorder} which manages changing the transforms and calculating the
* coordinates and size of the border.
*/
src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 151:
> 149: @FunctionalInterface
> 150: public interface UnscaledBorderPainter {
> 151: void paintUnscaledBorder(Component c, Graphics g,
Suggestion:
/**
* Paints the border for the specified component after the
* {@code Graphics} transforms are removed.
*
* <p>
* The <i>x</i> and <i>y</i> of the painted border are zero.
*
* @param c the component for which this border is being painted
* @param g the paint graphics
* @param w the width of the painted border, in physical pixels
* @param h the height of the painted border, in physical pixels
* @param scaleFactor the scale that was in the {@code Graphics}
*
* @see #paintBorder(Component, Graphics, int, int, int, int, UnscaledBorderPainter) SwingUtilities3.paintBorder
* @see javax.swing.border.Border#paintBorder(Component, Graphics, int, int, int, int) Border.paintBorder
*/
void paintUnscaledBorder(Component c, Graphics g,
src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 159:
> 157: * Performs common scaling transformation steps required for rendering
> 158: * the border correctly at different scales.
> 159: */
Suggestion:
/**
* Paints the border for a component ensuring its sides have consistent
* thickness at different scales.
* <p>
* It performs the following steps:
* <ol>
* <li>Reset the scale transform on the {@code Graphics},</li>
* <li>Call {@code painter} to paint the border,</li>
* <li>Restore the transform.</li>
* </ol>
*
* @param c the component for which this border is being painted
* @param g the paint graphics
* @param x the x position of the painted border
* @param y the y position of the painted border
* @param w the width of the painted border
* @param h the height of the painted border
* @param painter the painter object which paints the border after
* the transform on the {@code Graphics} is reset
*/
src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 167:
> 165: // Step 1: Reset Transform
> 166: AffineTransform at = null;
> 167: Stroke oldStk = null;
Suggestion:
Stroke oldStroke = null;
Let's spell the word in full. It's used twice in the method and I see no reason to abbreviate it.
-------------
PR: https://git.openjdk.org/jdk/pull/11571
More information about the client-libs-dev
mailing list