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

Alexey Ivanov aivanov at openjdk.org
Fri Jan 13 19:57:26 UTC 2023


On Wed, 11 Jan 2023 23:20:02 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 with a new target base due to a merge or a rebase. The pull request now contains 15 commits:
> 
>  - removed unused parameters, old stroke changes
>  - Merge branch 'master' into RefactorBorder_8294484
>  - moved strokeWidth logic to individual classes
>  - review changes
>  - Revert "test changes"
>    
>    This reverts commit abed51bd420941d8efa7b779b86257978f56810e.
>  - test changes
>  - minor changes
>  - Merge branch 'master' into RefactorBorder_8294484
>  - Merge branch 'master' into RefactorBorder_8294484
>  - review changes
>  - ... and 5 more: https://git.openjdk.org/jdk/compare/43847c43...9caca6b2

Looks good to me.

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

> 171: 
> 172:             // if m01 or m10 is non-zero, then there is a rotation or shear
> 173:             // or if scale=1, skip resetting the transform

Suggestion:

            // if m01 or m10 is non-zero, then there is a rotation or shear,
            // or if scale=1, skip resetting the transform in these cases

The added comma separates the two sentences. The added “in these cases” clarifies that we don't reset in either of the two cases: m01 or m10 is non-zero or scale is 1.

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

> 159:         if (g instanceof Graphics2D) {
> 160:             Graphics2D g2d = (Graphics2D) g;
> 161:             g2d.setStroke(new BasicStroke((float) stkWidth));

There's only one statement left inside the `if` block, shall get rid of another local variable?

            ((Graphics2D) g).setStroke(new BasicStroke((float) stkWidth));

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

> 151:         if ((this.thickness > 0) && (g instanceof Graphics2D)) {
> 152:             Graphics2D g2d = (Graphics2D) g;
> 153:             int offs = this.thickness * (int) scaleFactor;

It looks good, however, I suggest re-arranging the code a bit:


            Graphics2D g2d = (Graphics2D) g;

            Color oldColor = g2d.getColor();
            g2d.setColor(this.lineColor);

            Shape outer;
            Shape inner;

            int offs = this.thickness * (int) scaleFactor;
            int size = offs + offs;
            if (this.roundedCorners) {
// following code


That is add a blank line after `g2d` declaration. Then save the old color; the next block is declaration for `outer` and `inner`; followed by the block with `offs` and `size` right before they're used.

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

> 171:             path.append(inner, false);
> 172:             g2d.fill(path);
> 173:             g.setColor(oldColor);

Suggestion:


            g2d.setColor(oldColor);

Use `g2d` as it was originally and add a blank line to separate fill — painting the border — from the cleanup, restoring the color.

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

> 292:                     Graphics2D g2d = (Graphics2D) g;
> 293:                     g2d.setStroke(new BasicStroke((float) stkWidth));
> 294:                 }

Suggestion:

                if (g instanceof Graphics2D) {
                    ((Graphics2D) g).setStroke(new BasicStroke((float) stkWidth));
                }

?

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

Marked as reviewed by aivanov (Reviewer).

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



More information about the client-libs-dev mailing list