RFR: JDK-8294680: Refactor scaled border rendering [v5]

Alexey Ivanov aivanov at openjdk.org
Wed Jan 11 20:54:22 UTC 2023


On Thu, 5 Jan 2023 19:03:17 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 one additional commit since the last revision:
> 
>   moved strokeWidth logic to individual classes

src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 46:

> 44: import sun.awt.SunToolkit;
> 45: 
> 46: 

One line is enough between regular imports and static ones.

src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 176:

> 174:             // or if scale=1, skip resetting the transform
> 175:             resetTransform = ((at.getShearX() == 0) && (at.getShearY() == 0)) &&
> 176:                     ((at.getScaleX() > 1) || (at.getScaleY() > 1));

Suggestion:

            resetTransform = ((at.getShearX() == 0) && (at.getShearY() == 0))
                    && ((at.getScaleX() > 1) || (at.getScaleY() > 1));

The operator at the start of a line makes it clear it's an continuation line. This style was advocated in the Java Style Guidelines.

I don't insist though.

src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 196:

> 194: 
> 195:         // Step 2: Call respective paintBorder with transformed values
> 196:         painter.paintUnscaledBorder(c, g, x, y, width, height, scaleFactor);

Why do you pass the original `x` and `y`? They must be 0 inside `paintUnscaledBorder`. As such, `x` and `y` parameters can be dropped.

src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java line 203:

> 201:             Graphics2D g2d = (Graphics2D) g;
> 202:             g2d.setTransform(at);
> 203:             g2d.setStroke(oldStk);

The stroke should always be restored even if the transform wasn't reset. Or it should be done in the implementation of `paintUnscaledBorder`.

src/java.desktop/share/classes/javax/swing/border/EtchedBorder.java line 156:

> 154: 
> 155:     private void paintUnscaledBorder(Component c, Graphics g, int x, int y,
> 156:                                     int w, int h, double scaleFactor) {

Suggestion:

    private void paintUnscaledBorder(Component c, Graphics g, int x, int y,
                                     int w, int h, double scaleFactor) {

One more space is missing to align.

src/java.desktop/share/classes/javax/swing/border/LineBorder.java line 27:

> 25: package javax.swing.border;
> 26: 
> 27: import com.sun.java.swing.SwingUtilities3;

Let's be consistent: it should go after `java.*` and `javax.*` packages.

Either there should be a blank line before `com.*` or `sun.*` imports or there shouldn't be.

src/java.desktop/share/classes/javax/swing/border/LineBorder.java line 155:

> 153:             int offs = this.thickness * (int) scaleFactor;
> 154:             Color oldColor = g.getColor();
> 155:             g.setColor(this.lineColor);

I'd rather leave the lines unchanged. I mean `getColor` and `setColor` could still use `g2d` as before.

src/java.desktop/share/classes/javax/swing/plaf/metal/MetalBorders.java line 69:

> 67: import static sun.java2d.pipe.Region.clipRound;
> 68: 
> 69: 

It's probably unnecessary.

-------------

PR: https://git.openjdk.org/jdk/pull/11571



More information about the client-libs-dev mailing list