jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java
author darcy
Fri, 03 Apr 2015 10:41:34 -0700
changeset 29894 3e16b51732f5
parent 25859 3317bb8137f4
child 29896 a5ac6d82efa2
permissions -rw-r--r--
8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}} Reviewed-by: alexsch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     1
/*
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
     2
 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     4
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3344
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3344
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    10
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    15
 * accompanied this code).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    16
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3344
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3344
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3344
diff changeset
    23
 * questions.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    24
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    25
package javax.swing.plaf.nimbus;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    26
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    27
import java.awt.*;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    28
import java.awt.image.*;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    29
import java.lang.reflect.Method;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    30
import javax.swing.*;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    31
import javax.swing.plaf.UIResource;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    32
import javax.swing.Painter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    33
import java.awt.print.PrinterGraphics;
25087
dc3f3f90567f 8043151: KSS: javax.swing.plaf.nimbus.AbstractRegionPainter#getComponentColor
malenkov
parents: 23010
diff changeset
    34
import sun.reflect.misc.MethodUtil;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    35
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    36
/**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    37
 * Convenient base class for defining Painter instances for rendering a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    38
 * region or component in Nimbus.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    39
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    40
 * @author Jasper Potts
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    41
 * @author Richard Bair
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    42
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    43
public abstract class AbstractRegionPainter implements Painter<JComponent> {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    44
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    45
     * PaintContext, which holds a lot of the state needed for cache hinting and x/y value decoding
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    46
     * The data contained within the context is typically only computed once and reused over
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    47
     * multiple paint calls, whereas the other values (w, h, f, leftWidth, etc) are recomputed
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    48
     * for each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    49
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    50
     * This field is retrieved from subclasses on each paint operation. It is up
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    51
     * to the subclass to compute and cache the PaintContext over multiple calls.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    52
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    53
    private PaintContext ctx;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    54
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    55
     * The scaling factor. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    56
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    57
    private float f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    58
    /*
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    59
      Various metrics used for decoding x/y values based on the canvas size
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    60
      and stretching insets.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    61
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    62
      On each call to paint, we first ask the subclass for the PaintContext.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    63
      From the context we get the canvas size and stretching insets, and whether
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    64
      the algorithm should be "inverted", meaning the center section remains
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    65
      a fixed size and the other sections scale.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    66
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    67
      We then use these values to compute a series of metrics (listed below)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    68
      which are used to decode points in a specific axis (x or y).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    69
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    70
      The leftWidth represents the distance from the left edge of the region
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    71
      to the first stretching inset, after accounting for any scaling factor
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    72
      (such as DPI scaling). The centerWidth is the distance between the leftWidth
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    73
      and the rightWidth. The rightWidth is the distance from the right edge,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    74
      to the right inset (after scaling has been applied).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    75
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    76
      The same logic goes for topHeight, centerHeight, and bottomHeight.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    77
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    78
      The leftScale represents the proportion of the width taken by the left section.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    79
      The same logic is applied to the other scales.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    80
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    81
      The various widths/heights are used to decode control points. The
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    82
      various scales are used to decode bezier handles (or anchors).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    83
    */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    84
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    85
     * The width of the left section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    86
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    87
    private float leftWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    88
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    89
     * The height of the top section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    90
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    91
    private float topHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    92
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    93
     * The width of the center section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    94
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    95
    private float centerWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    96
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    97
     * The height of the center section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    98
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    99
    private float centerHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   100
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   101
     * The width of the right section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   102
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   103
    private float rightWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   104
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   105
     * The height of the bottom section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   106
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   107
    private float bottomHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   108
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   109
     * The scaling factor to use for the left section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   110
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   111
    private float leftScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   112
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   113
     * The scaling factor to use for the top section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   114
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   115
    private float topScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   116
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   117
     * The scaling factor to use for the center section, in the horizontal
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   118
     * direction. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   119
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   120
    private float centerHScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   121
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   122
     * The scaling factor to use for the center section, in the vertical
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   123
     * direction. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   124
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   125
    private float centerVScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   126
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   127
     * The scaling factor to use for the right section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   128
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   129
    private float rightScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   130
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   131
     * The scaling factor to use for the bottom section. Recomputed on each call to paint.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   132
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   133
    private float bottomScale;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   134
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   135
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   136
     * Create a new AbstractRegionPainter
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   137
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   138
    protected AbstractRegionPainter() { }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   139
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   140
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 5506
diff changeset
   141
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   142
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   143
    @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   144
    public final void paint(Graphics2D g, JComponent c, int w, int h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   145
        //don't render if the width/height are too small
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   146
        if (w <= 0 || h <=0) return;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   147
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   148
        Object[] extendedCacheKeys = getExtendedCacheKeys(c);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   149
        ctx = getPaintContext();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   150
        PaintContext.CacheMode cacheMode = ctx == null ? PaintContext.CacheMode.NO_CACHING : ctx.cacheMode;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   151
        if (cacheMode == PaintContext.CacheMode.NO_CACHING ||
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   152
                !ImageCache.getInstance().isImageCachable(w, h) ||
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   153
                g instanceof PrinterGraphics) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   154
            // no caching so paint directly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   155
            paint0(g, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   156
        } else if (cacheMode == PaintContext.CacheMode.FIXED_SIZES) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   157
            paintWithFixedSizeCaching(g, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   158
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   159
            // 9 Square caching
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   160
            paintWith9SquareCaching(g, ctx, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   161
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   162
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   163
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   164
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   165
     * Get any extra attributes which the painter implementation would like
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   166
     * to include in the image cache lookups. This is checked for every call
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   167
     * of the paint(g, c, w, h) method.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   168
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   169
     * @param c The component on the current paint call
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   170
     * @return Array of extra objects to be included in the cache key
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   171
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   172
    protected Object[] getExtendedCacheKeys(JComponent c) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   173
        return null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   174
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   175
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   176
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   177
     * <p>Gets the PaintContext for this painting operation. This method is called on every
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   178
     * paint, and so should be fast and produce no garbage. The PaintContext contains
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   179
     * information such as cache hints. It also contains data necessary for decoding
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   180
     * points at runtime, such as the stretching insets, the canvas size at which the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   181
     * encoded points were defined, and whether the stretching insets are inverted.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   182
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   183
     * <p> This method allows for subclasses to package the painting of different states
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   184
     * with possibly different canvas sizes, etc, into one AbstractRegionPainter implementation.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   185
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   186
     * @return a PaintContext associated with this paint operation.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   187
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   188
    protected abstract PaintContext getPaintContext();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   189
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   190
    /**
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   191
     * <p>Configures the given Graphics2D. Often, rendering hints or compositing rules are
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   192
     * applied to a Graphics2D object prior to painting, which should affect all of the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   193
     * subsequent painting operations. This method provides a convenient hook for configuring
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   194
     * the Graphics object prior to rendering, regardless of whether the render operation is
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   195
     * performed to an intermediate buffer or directly to the display.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   196
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   197
     * @param g The Graphics2D object to configure. Will not be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   198
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   199
    protected void configureGraphics(Graphics2D g) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   200
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   201
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   202
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   203
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   204
     * Actually performs the painting operation. Subclasses must implement this method.
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   205
     * The graphics object passed may represent the actual surface being rendered to,
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   206
     * or it may be an intermediate buffer. It has also been pre-translated. Simply render
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   207
     * the component as if it were located at 0, 0 and had a width of <code>width</code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   208
     * and a height of <code>height</code>. For performance reasons, you may want to read
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   209
     * the clip from the Graphics2D object and only render within that space.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   210
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   211
     * @param g The Graphics2D surface to paint to
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   212
     * @param c The JComponent related to the drawing event. For example, if the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   213
     *          region being rendered is Button, then <code>c</code> will be a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   214
     *          JButton. If the region being drawn is ScrollBarSlider, then the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   215
     *          component will be JScrollBar. This value may be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   216
     * @param width The width of the region to paint. Note that in the case of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   217
     *              painting the foreground, this value may differ from c.getWidth().
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   218
     * @param height The height of the region to paint. Note that in the case of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   219
     *               painting the foreground, this value may differ from c.getHeight().
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   220
     * @param extendedCacheKeys The result of the call to getExtendedCacheKeys()
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   221
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   222
    protected abstract void doPaint(Graphics2D g, JComponent c, int width,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   223
                                    int height, Object[] extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   224
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   225
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   226
     * Decodes and returns a float value representing the actual pixel location for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   227
     * the given encoded X value.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   228
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   229
     * @param x an encoded x value (0...1, or 1...2, or 2...3)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   230
     * @return the decoded x value
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   231
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   232
     *      if {@code x < 0} or {@code x > 3}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   233
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   234
    protected final float decodeX(float x) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   235
        if (x >= 0 && x <= 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   236
            return x * leftWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   237
        } else if (x > 1 && x < 2) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   238
            return ((x-1) * centerWidth) + leftWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   239
        } else if (x >= 2 && x <= 3) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   240
            return ((x-2) * rightWidth) + leftWidth + centerWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   241
        } else {
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   242
            throw new IllegalArgumentException("Invalid x");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   243
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   244
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   245
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   246
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   247
     * Decodes and returns a float value representing the actual pixel location for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   248
     * the given encoded y value.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   249
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   250
     * @param y an encoded y value (0...1, or 1...2, or 2...3)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   251
     * @return the decoded y value
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   252
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   253
     *      if {@code y < 0} or {@code y > 3}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   254
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   255
    protected final float decodeY(float y) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   256
        if (y >= 0 && y <= 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   257
            return y * topHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   258
        } else if (y > 1 && y < 2) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   259
            return ((y-1) * centerHeight) + topHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   260
        } else if (y >= 2 && y <= 3) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   261
            return ((y-2) * bottomHeight) + topHeight + centerHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   262
        } else {
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   263
            throw new IllegalArgumentException("Invalid y");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   264
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   265
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   266
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   267
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   268
     * Decodes and returns a float value representing the actual pixel location for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   269
     * the anchor point given the encoded X value of the control point, and the offset
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   270
     * distance to the anchor from that control point.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   271
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   272
     * @param x an encoded x value of the bezier control point (0...1, or 1...2, or 2...3)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   273
     * @param dx the offset distance to the anchor from the control point x
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   274
     * @return the decoded x location of the control point
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   275
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   276
     *      if {@code x < 0} or {@code x > 3}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   277
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   278
    protected final float decodeAnchorX(float x, float dx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   279
        if (x >= 0 && x <= 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   280
            return decodeX(x) + (dx * leftScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   281
        } else if (x > 1 && x < 2) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   282
            return decodeX(x) + (dx * centerHScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   283
        } else if (x >= 2 && x <= 3) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   284
            return decodeX(x) + (dx * rightScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   285
        } else {
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   286
            throw new IllegalArgumentException("Invalid x");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   287
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   288
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   289
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   290
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   291
     * Decodes and returns a float value representing the actual pixel location for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   292
     * the anchor point given the encoded Y value of the control point, and the offset
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   293
     * distance to the anchor from that control point.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   294
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   295
     * @param y an encoded y value of the bezier control point (0...1, or 1...2, or 2...3)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   296
     * @param dy the offset distance to the anchor from the control point y
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   297
     * @return the decoded y position of the control point
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   298
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   299
     *      if {@code y < 0} or {@code y > 3}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   300
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   301
    protected final float decodeAnchorY(float y, float dy) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   302
        if (y >= 0 && y <= 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   303
            return decodeY(y) + (dy * topScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   304
        } else if (y > 1 && y < 2) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   305
            return decodeY(y) + (dy * centerVScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   306
        } else if (y >= 2 && y <= 3) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   307
            return decodeY(y) + (dy * bottomScale);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   308
        } else {
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   309
            throw new IllegalArgumentException("Invalid y");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   310
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   311
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   312
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   313
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   314
     * Decodes and returns a color, which is derived from a base color in UI
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   315
     * defaults.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   316
     *
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   317
     * @param key     A key corresponding to the value in the UI Defaults table
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   318
     *                of UIManager where the base color is defined
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   319
     * @param hOffset The hue offset used for derivation.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   320
     * @param sOffset The saturation offset used for derivation.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   321
     * @param bOffset The brightness offset used for derivation.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   322
     * @param aOffset The alpha offset used for derivation. Between 0...255
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   323
     * @return The derived color, whose color value will change if the parent
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   324
     *         uiDefault color changes.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   325
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   326
    protected final Color decodeColor(String key, float hOffset, float sOffset,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   327
                                      float bOffset, int aOffset) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   328
        if (UIManager.getLookAndFeel() instanceof NimbusLookAndFeel){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   329
            NimbusLookAndFeel laf = (NimbusLookAndFeel) UIManager.getLookAndFeel();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   330
            return laf.getDerivedColor(key, hOffset, sOffset, bOffset, aOffset, true);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   331
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   332
            // can not give a right answer as painter sould not be used outside
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   333
            // of nimbus laf but do the best we can
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   334
            return Color.getHSBColor(hOffset,sOffset,bOffset);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   335
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   336
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   337
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   338
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   339
     * Decodes and returns a color, which is derived from a offset between two
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   340
     * other colors.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   341
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   342
     * @param color1   The first color
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   343
     * @param color2   The second color
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   344
     * @param midPoint The offset between color 1 and color 2, a value of 0.0 is
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   345
     *                 color 1 and 1.0 is color 2;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   346
     * @return The derived color
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   347
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   348
    protected final Color decodeColor(Color color1, Color color2,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   349
                                      float midPoint) {
3107
51a846c2c16f 6849805: Nimbus L&F: NimbusLookAndFeel.getDerivedColor() not always returns color2 for 1.0 midPoint
peterz
parents: 2658
diff changeset
   350
        return new Color(NimbusLookAndFeel.deriveARGB(color1, color2, midPoint));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   351
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   352
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   353
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   354
     * Given parameters for creating a LinearGradientPaint, this method will
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   355
     * create and return a linear gradient paint. One primary purpose for this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   356
     * method is to avoid creating a LinearGradientPaint where the start and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   357
     * end points are equal. In such a case, the end y point is slightly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   358
     * increased to avoid the overlap.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   359
     *
22260
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   360
     * @param x1 x1
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   361
     * @param y1 y1
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   362
     * @param x2 x2
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   363
     * @param y2 y2
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   364
     * @param midpoints the midpoints
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   365
     * @param colors the colors
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   366
     * @return a valid LinearGradientPaint. This method never returns null.
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   367
     * @throws NullPointerException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   368
     *      if {@code midpoints} array is null,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   369
     *      or {@code colors} array is null,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   370
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   371
     *      if start and end points are the same points,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   372
     *      or {@code midpoints.length != colors.length},
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   373
     *      or {@code colors} is less than 2 in size,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   374
     *      or a {@code midpoints} value is less than 0.0 or greater than 1.0,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   375
     *      or the {@code midpoints} are not provided in strictly increasing order
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   376
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   377
    protected final LinearGradientPaint decodeGradient(float x1, float y1, float x2, float y2, float[] midpoints, Color[] colors) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   378
        if (x1 == x2 && y1 == y2) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   379
            y2 += .00001f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   380
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   381
        return new LinearGradientPaint(x1, y1, x2, y2, midpoints, colors);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   382
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   383
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   384
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   385
     * Given parameters for creating a RadialGradientPaint, this method will
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   386
     * create and return a radial gradient paint. One primary purpose for this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   387
     * method is to avoid creating a RadialGradientPaint where the radius
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   388
     * is non-positive. In such a case, the radius is just slightly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   389
     * increased to avoid 0.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   390
     *
22260
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   391
     * @param x x-coordinate
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   392
     * @param y y-coordinate
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   393
     * @param r radius
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   394
     * @param midpoints the midpoints
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   395
     * @param colors the colors
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   396
     * @return a valid RadialGradientPaint. This method never returns null.
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   397
     * @throws NullPointerException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   398
     *      if {@code midpoints} array is null,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   399
     *      or {@code colors} array is null
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   400
     * @throws IllegalArgumentException
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   401
     *      if {@code r} is non-positive,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   402
     *      or {@code midpoints.length != colors.length},
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   403
     *      or {@code colors} is less than 2 in size,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   404
     *      or a {@code midpoints} value is less than 0.0 or greater than 1.0,
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   405
     *      or the {@code midpoints} are not provided in strictly increasing order
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   406
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   407
    protected final RadialGradientPaint decodeRadialGradient(float x, float y, float r, float[] midpoints, Color[] colors) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   408
        if (r == 0f) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   409
            r = .00001f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   410
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   411
        return new RadialGradientPaint(x, y, r, midpoints, colors);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   412
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   413
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   414
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   415
     * Get a color property from the given JComponent. First checks for a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   416
     * <code>getXXX()</code> method and if that fails checks for a client
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   417
     * property with key <code>property</code>. If that still fails to return
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   418
     * a Color then <code>defaultColor</code> is returned.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   419
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   420
     * @param c The component to get the color property from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   421
     * @param property The name of a bean style property or client property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   422
     * @param defaultColor The color to return if no color was obtained from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   423
     *        the component.
25159
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   424
     * @param saturationOffset additively modifies the HSB saturation component
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   425
     * of the color returned (ignored if default color is returned).
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   426
     * @param brightnessOffset additively modifies the HSB brightness component
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   427
     * of the color returned (ignored if default color is returned).
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   428
     * @param alphaOffset additively modifies the ARGB alpha component of the
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   429
     * color returned (ignored if default color is returned).
fdacfe8fd602 8044256: Fix doclint warnings (missing javadoc tags) in javax.swing.plaf.nimbus
yan
parents: 25087
diff changeset
   430
     *
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   431
     * @return The color that was obtained from the component or defaultColor
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   432
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   433
    protected final Color getComponentColor(JComponent c, String property,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   434
                                            Color defaultColor,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   435
                                            float saturationOffset,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   436
                                            float brightnessOffset,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   437
                                            int alphaOffset) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   438
        Color color = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   439
        if (c != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   440
            // handle some special cases for performance
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   441
            if ("background".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   442
                color = c.getBackground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   443
            } else if ("foreground".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   444
                color = c.getForeground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   445
            } else if (c instanceof JList && "selectionForeground".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   446
                color = ((JList) c).getSelectionForeground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   447
            } else if (c instanceof JList && "selectionBackground".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   448
                color = ((JList) c).getSelectionBackground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   449
            } else if (c instanceof JTable && "selectionForeground".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   450
                color = ((JTable) c).getSelectionForeground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   451
            } else if (c instanceof JTable && "selectionBackground".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   452
                color = ((JTable) c).getSelectionBackground();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   453
            } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   454
                String s = "get" + Character.toUpperCase(property.charAt(0)) + property.substring(1);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   455
                try {
25087
dc3f3f90567f 8043151: KSS: javax.swing.plaf.nimbus.AbstractRegionPainter#getComponentColor
malenkov
parents: 23010
diff changeset
   456
                    Method method = MethodUtil.getMethod(c.getClass(), s, null);
dc3f3f90567f 8043151: KSS: javax.swing.plaf.nimbus.AbstractRegionPainter#getComponentColor
malenkov
parents: 23010
diff changeset
   457
                    color = (Color) MethodUtil.invoke(method, c, null);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   458
                } catch (Exception e) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   459
                    //don't do anything, it just didn't work, that's all.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   460
                    //This could be a normal occurance if you use a property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   461
                    //name referring to a key in clientProperties instead of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   462
                    //a real property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   463
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   464
                if (color == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   465
                    Object value = c.getClientProperty(property);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   466
                    if (value instanceof Color) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   467
                        color = (Color) value;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   468
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   469
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   470
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   471
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   472
        // we return the defaultColor if the color found is null, or if
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   473
        // it is a UIResource. This is done because the color for the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   474
        // ENABLED state is set on the component, but you don't want to use
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   475
        // that color for the over state. So we only respect the color
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   476
        // specified for the property if it was set by the user, as opposed
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   477
        // to set by us.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   478
        if (color == null || color instanceof UIResource) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   479
            return defaultColor;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   480
        } else if (saturationOffset != 0 || brightnessOffset != 0 || alphaOffset != 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   481
            float[] tmp = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   482
            tmp[1] = clamp(tmp[1] + saturationOffset);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   483
            tmp[2] = clamp(tmp[2] + brightnessOffset);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   484
            int alpha = clamp(color.getAlpha() + alphaOffset);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   485
            return new Color((Color.HSBtoRGB(tmp[0], tmp[1], tmp[2]) & 0xFFFFFF) | (alpha <<24));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   486
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   487
            return color;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   488
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   489
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   490
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   491
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   492
     * A class encapsulating state useful when painting. Generally, instances of this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   493
     * class are created once, and reused for each paint request without modification.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   494
     * This class contains values useful when hinting the cache engine, and when decoding
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   495
     * control points and bezier curve anchors.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   496
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   497
    protected static class PaintContext {
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   498
        /**
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   499
         * Cache mode.
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   500
         */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   501
        protected static enum CacheMode {
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   502
            /** No caching.*/
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   503
            NO_CACHING,
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   504
            /** Fixed sizes.*/
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   505
            FIXED_SIZES,
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   506
            /** Nine square scale.*/
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   507
            NINE_SQUARE_SCALE
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   508
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   509
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   510
        private static Insets EMPTY_INSETS = new Insets(0, 0, 0, 0);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   511
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   512
        private Insets stretchingInsets;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   513
        private Dimension canvasSize;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   514
        private boolean inverted;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   515
        private CacheMode cacheMode;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   516
        private double maxHorizontalScaleFactor;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   517
        private double maxVerticalScaleFactor;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   518
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   519
        private float a; // insets.left
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   520
        private float b; // canvasSize.width - insets.right
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   521
        private float c; // insets.top
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   522
        private float d; // canvasSize.height - insets.bottom;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   523
        private float aPercent; // only used if inverted == true
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   524
        private float bPercent; // only used if inverted == true
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   525
        private float cPercent; // only used if inverted == true
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   526
        private float dPercent; // only used if inverted == true
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   527
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   528
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   529
         * Creates a new PaintContext which does not attempt to cache or scale any cached
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   530
         * images.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   531
         *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   532
         * @param insets The stretching insets. May be null. If null, then assumed to be 0, 0, 0, 0.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   533
         * @param canvasSize The size of the canvas used when encoding the various x/y values. May be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   534
         *                   If null, then it is assumed that there are no encoded values, and any calls
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   535
         *                   to one of the "decode" methods will return the passed in value.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   536
         * @param inverted Whether to "invert" the meaning of the 9-square grid and stretching insets
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   537
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   538
        public PaintContext(Insets insets, Dimension canvasSize, boolean inverted) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   539
            this(insets, canvasSize, inverted, null, 1, 1);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   540
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   541
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   542
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   543
         * Creates a new PaintContext.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   544
         *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   545
         * @param insets The stretching insets. May be null. If null, then assumed to be 0, 0, 0, 0.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   546
         * @param canvasSize The size of the canvas used when encoding the various x/y values. May be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   547
         *                   If null, then it is assumed that there are no encoded values, and any calls
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   548
         *                   to one of the "decode" methods will return the passed in value.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   549
         * @param inverted Whether to "invert" the meaning of the 9-square grid and stretching insets
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   550
         * @param cacheMode A hint as to which caching mode to use. If null, then set to no caching.
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   551
         * @param maxH The maximum scale in the horizontal direction to use before punting and redrawing from scratch.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   552
         *             For example, if maxH is 2, then we will attempt to scale any cached images up to 2x the canvas
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   553
         *             width before redrawing from scratch. Reasonable maxH values may improve painting performance.
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 5506
diff changeset
   554
         *             If set too high, then you may get poor looking graphics at higher zoom levels. Must be &gt;= 1.
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   555
         * @param maxV The maximum scale in the vertical direction to use before punting and redrawing from scratch.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   556
         *             For example, if maxV is 2, then we will attempt to scale any cached images up to 2x the canvas
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   557
         *             height before redrawing from scratch. Reasonable maxV values may improve painting performance.
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 5506
diff changeset
   558
         *             If set too high, then you may get poor looking graphics at higher zoom levels. Must be &gt;= 1.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   559
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   560
        public PaintContext(Insets insets, Dimension canvasSize, boolean inverted,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   561
                            CacheMode cacheMode, double maxH, double maxV) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   562
            if (maxH < 1 || maxH < 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   563
                throw new IllegalArgumentException("Both maxH and maxV must be >= 1");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   564
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   565
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   566
            this.stretchingInsets = insets == null ? EMPTY_INSETS : insets;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   567
            this.canvasSize = canvasSize;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   568
            this.inverted = inverted;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   569
            this.cacheMode = cacheMode == null ? CacheMode.NO_CACHING : cacheMode;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   570
            this.maxHorizontalScaleFactor = maxH;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   571
            this.maxVerticalScaleFactor = maxV;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   572
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   573
            if (canvasSize != null) {
3344
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   574
                a = stretchingInsets.left;
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   575
                b = canvasSize.width - stretchingInsets.right;
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   576
                c = stretchingInsets.top;
e2acdc658d52 6849331: Nimbus L&F: AbstractRegionPainter's paint context is not initialized
peterz
parents: 3107
diff changeset
   577
                d = canvasSize.height - stretchingInsets.bottom;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   578
                this.canvasSize = canvasSize;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   579
                this.inverted = inverted;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   580
                if (inverted) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   581
                    float available = canvasSize.width - (b - a);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   582
                    aPercent = available > 0f ? a / available : 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   583
                    bPercent = available > 0f ? b / available : 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   584
                    available = canvasSize.height - (d - c);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   585
                    cPercent = available > 0f ? c / available : 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   586
                    dPercent = available > 0f ? d / available : 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   587
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   588
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   589
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   590
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   591
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   592
    //---------------------- private methods
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   593
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   594
    //initializes the class to prepare it for being able to decode points
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   595
    private void prepare(float w, float h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   596
        //if no PaintContext has been specified, reset the values and bail
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   597
        //also bail if the canvasSize was not set (since decoding will not work)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   598
        if (ctx == null || ctx.canvasSize == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   599
            f = 1f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   600
            leftWidth = centerWidth = rightWidth = 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   601
            topHeight = centerHeight = bottomHeight = 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   602
            leftScale = centerHScale = rightScale = 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   603
            topScale = centerVScale = bottomScale = 0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   604
            return;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   605
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   606
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   607
        //calculate the scaling factor, and the sizes for the various 9-square sections
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   608
        Number scale = (Number)UIManager.get("scale");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   609
        f = scale == null ? 1f : scale.floatValue();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   610
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   611
        if (ctx.inverted) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   612
            centerWidth = (ctx.b - ctx.a) * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   613
            float availableSpace = w - centerWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   614
            leftWidth = availableSpace * ctx.aPercent;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   615
            rightWidth = availableSpace * ctx.bPercent;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   616
            centerHeight = (ctx.d - ctx.c) * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   617
            availableSpace = h - centerHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   618
            topHeight = availableSpace * ctx.cPercent;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   619
            bottomHeight = availableSpace * ctx.dPercent;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   620
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   621
            leftWidth = ctx.a * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   622
            rightWidth = (float)(ctx.canvasSize.getWidth() - ctx.b) * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   623
            centerWidth = w - leftWidth - rightWidth;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   624
            topHeight = ctx.c * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   625
            bottomHeight = (float)(ctx.canvasSize.getHeight() - ctx.d) * f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   626
            centerHeight = h - topHeight - bottomHeight;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   627
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   628
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   629
        leftScale = ctx.a == 0f ? 0f : leftWidth / ctx.a;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   630
        centerHScale = (ctx.b - ctx.a) == 0f ? 0f : centerWidth / (ctx.b - ctx.a);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   631
        rightScale = (ctx.canvasSize.width - ctx.b) == 0f ? 0f : rightWidth / (ctx.canvasSize.width - ctx.b);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   632
        topScale = ctx.c == 0f ? 0f : topHeight / ctx.c;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   633
        centerVScale = (ctx.d - ctx.c) == 0f ? 0f : centerHeight / (ctx.d - ctx.c);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   634
        bottomScale = (ctx.canvasSize.height - ctx.d) == 0f ? 0f : bottomHeight / (ctx.canvasSize.height - ctx.d);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   635
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   636
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   637
    private void paintWith9SquareCaching(Graphics2D g, PaintContext ctx,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   638
                                         JComponent c, int w, int h,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   639
                                         Object[] extendedCacheKeys) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   640
        // check if we can scale to the requested size
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   641
        Dimension canvas = ctx.canvasSize;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   642
        Insets insets = ctx.stretchingInsets;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   643
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   644
        if (w <= (canvas.width * ctx.maxHorizontalScaleFactor) && h <= (canvas.height * ctx.maxVerticalScaleFactor)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   645
            // get image at canvas size
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   646
            VolatileImage img = getImage(g.getDeviceConfiguration(), c, canvas.width, canvas.height, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   647
            if (img != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   648
                // calculate dst inserts
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   649
                // todo: destination inserts need to take into acount scale factor for high dpi. Note: You can use f for this, I think
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   650
                Insets dstInsets;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   651
                if (ctx.inverted){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   652
                    int leftRight = (w-(canvas.width-(insets.left+insets.right)))/2;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   653
                    int topBottom = (h-(canvas.height-(insets.top+insets.bottom)))/2;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   654
                    dstInsets = new Insets(topBottom,leftRight,topBottom,leftRight);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   655
                } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   656
                    dstInsets = insets;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   657
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   658
                // paint 9 square scaled
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   659
                Object oldScaleingHints = g.getRenderingHint(RenderingHints.KEY_INTERPOLATION);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   660
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   661
                ImageScalingHelper.paint(g, 0, 0, w, h, img, insets, dstInsets,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   662
                        ImageScalingHelper.PaintType.PAINT9_STRETCH, ImageScalingHelper.PAINT_ALL);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   663
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   664
                    oldScaleingHints!=null?oldScaleingHints:RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   665
            } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   666
                // render directly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   667
                paint0(g, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   668
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   669
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   670
            // paint directly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   671
            paint0(g, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   672
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   673
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   674
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   675
    private void paintWithFixedSizeCaching(Graphics2D g, JComponent c, int w,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   676
                                           int h, Object[] extendedCacheKeys) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   677
        VolatileImage img = getImage(g.getDeviceConfiguration(), c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   678
        if (img != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   679
            //render cached image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   680
            g.drawImage(img, 0, 0, null);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   681
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   682
            // render directly
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   683
            paint0(g, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   684
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   685
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   686
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   687
    /** Gets the rendered image for this painter at the requested size, either from cache or create a new one */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   688
    private VolatileImage getImage(GraphicsConfiguration config, JComponent c,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   689
                                   int w, int h, Object[] extendedCacheKeys) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   690
        ImageCache imageCache = ImageCache.getInstance();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   691
        //get the buffer for this component
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   692
        VolatileImage buffer = (VolatileImage) imageCache.getImage(config, w, h, this, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   693
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   694
        int renderCounter = 0; //to avoid any potential, though unlikely, infinite loop
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   695
        do {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   696
            //validate the buffer so we can check for surface loss
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   697
            int bufferStatus = VolatileImage.IMAGE_INCOMPATIBLE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   698
            if (buffer != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   699
                bufferStatus = buffer.validate(config);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   700
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   701
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   702
            //If the buffer status is incompatible or restored, then we need to re-render to the volatile image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   703
            if (bufferStatus == VolatileImage.IMAGE_INCOMPATIBLE || bufferStatus == VolatileImage.IMAGE_RESTORED) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   704
                //if the buffer is null (hasn't been created), or isn't the right size, or has lost its contents,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   705
                //then recreate the buffer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   706
                if (buffer == null || buffer.getWidth() != w || buffer.getHeight() != h ||
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   707
                        bufferStatus == VolatileImage.IMAGE_INCOMPATIBLE) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   708
                    //clear any resources related to the old back buffer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   709
                    if (buffer != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   710
                        buffer.flush();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   711
                        buffer = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   712
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   713
                    //recreate the buffer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   714
                    buffer = config.createCompatibleVolatileImage(w, h,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   715
                            Transparency.TRANSLUCENT);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   716
                    // put in cache for future
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   717
                    imageCache.setImage(buffer, config, w, h, this, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   718
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   719
                //create the graphics context with which to paint to the buffer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   720
                Graphics2D bg = buffer.createGraphics();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   721
                //clear the background before configuring the graphics
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   722
                bg.setComposite(AlphaComposite.Clear);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   723
                bg.fillRect(0, 0, w, h);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   724
                bg.setComposite(AlphaComposite.SrcOver);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   725
                configureGraphics(bg);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   726
                // paint the painter into buffer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   727
                paint0(bg, c, w, h, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   728
                //close buffer graphics
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   729
                bg.dispose();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   730
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   731
        } while (buffer.contentsLost() && renderCounter++ < 3);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   732
        // check if we failed
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   733
        if (renderCounter == 3) return null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   734
        // return image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   735
        return buffer;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   736
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   737
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   738
    //convenience method which creates a temporary graphics object by creating a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   739
    //clone of the passed in one, configuring it, drawing with it, disposing it.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   740
    //These steps have to be taken to ensure that any hints set on the graphics
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   741
    //are removed subsequent to painting.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   742
    private void paint0(Graphics2D g, JComponent c, int width, int height,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   743
                        Object[] extendedCacheKeys) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   744
        prepare(width, height);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   745
        g = (Graphics2D)g.create();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   746
        configureGraphics(g);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   747
        doPaint(g, c, width, height, extendedCacheKeys);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   748
        g.dispose();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   749
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   750
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   751
    private float clamp(float value) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   752
        if (value < 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   753
            value = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   754
        } else if (value > 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   755
            value = 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   756
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   757
        return value;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   758
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   759
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   760
    private int clamp(int value) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   761
        if (value < 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   762
            value = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   763
        } else if (value > 255) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   764
            value = 255;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   765
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   766
        return value;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   767
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   768
}