Class RadialGradientPaintContext

java.lang.Object
org.apache.batik.ext.awt.MultipleGradientPaintContext
org.apache.batik.ext.awt.RadialGradientPaintContext
All Implemented Interfaces:
PaintContext

final class RadialGradientPaintContext extends MultipleGradientPaintContext
Provides the actual implementation for the RadialGradientPaint. This is where the pixel processing is done. A RadialGradienPaint only supports circular gradients, but it should be possible to scale the circle to look approximately elliptical, by means of a gradient transform passed into the RadialGradientPaint constructor.
Version:
$Id: RadialGradientPaintContext.java 1733416 2016-03-03 07:07:13Z gadams $
  • Field Details

    • isSimpleFocus

      private boolean isSimpleFocus
      True when (focus == center)
    • isNonCyclic

      private boolean isNonCyclic
      True when (cycleMethod == NO_CYCLE)
    • radius

      private float radius
      Radius of the outermost circle defining the 100% gradient stop.
    • centerX

      private float centerX
      Variables representing center and focus points.
    • centerY

      private float centerY
      Variables representing center and focus points.
    • focusX

      private float focusX
      Variables representing center and focus points.
    • focusY

      private float focusY
      Variables representing center and focus points.
    • radiusSq

      private float radiusSq
      Radius of the gradient circle squared.
    • constA

      private float constA
      Constant part of X, Y user space coordinates.
    • constB

      private float constB
      Constant part of X, Y user space coordinates.
    • trivial

      private float trivial
      This value represents the solution when focusX == X. It is called trivial because it is easier to calculate than the general case.
    • FIXED_POINT_IMPL

      private static final int FIXED_POINT_IMPL
      See Also:
    • DEFAULT_IMPL

      private static final int DEFAULT_IMPL
      See Also:
    • ANTI_ALIAS_IMPL

      private static final int ANTI_ALIAS_IMPL
      See Also:
    • fillMethod

      private int fillMethod
    • SCALEBACK

      private static final float SCALEBACK
      Amount for offset when clamping focus.
      See Also:
    • invSqStepFloat

      private float invSqStepFloat
      Length of a square distance intervale in the lookup table
    • MAX_PRECISION

      private static final int MAX_PRECISION
      Used to limit the size of the square root lookup table
      See Also:
    • sqrtLutFixed

      private int[] sqrtLutFixed
      Square root lookup table
  • Constructor Details

    • RadialGradientPaintContext

      public RadialGradientPaintContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform t, RenderingHints hints, float cx, float cy, float r, float fx, float fy, float[] fractions, Color[] colors, MultipleGradientPaint.CycleMethodEnum cycleMethod, MultipleGradientPaint.ColorSpaceEnum colorSpace) throws NoninvertibleTransformException
      Constructor for RadialGradientPaintContext.
      Parameters:
      cm - ColorModel that receives the Paint data. This is used only as a hint.
      deviceBounds - the device space bounding box of the graphics primitive being rendered
      userBounds - the user space bounding box of the graphics primitive being rendered
      t - the AffineTransform from user space into device space (gradientTransform should be concatenated with this)
      hints - the hints that the context object uses to choose between rendering alternatives
      cx - the center point in user space of the circle defining the gradient. The last color of the gradient is mapped to the perimeter of this circle X coordinate
      cy - the center point in user space of the circle defining the gradient. The last color of the gradient is mapped to the perimeter of this circle Y coordinate
      r - the radius of the circle defining the extents of the color gradient
      fx - the point in user space to which the first color is mapped X coordinate
      fy - the point in user space to which the first color is mapped Y coordinate
      fractions - the fractions specifying the gradient distribution
      colors - the gradient colors
      cycleMethod - either NO_CYCLE, REFLECT, or REPEAT
      colorSpace - which colorspace to use for interpolation, either SRGB or LINEAR_RGB
      Throws:
      NoninvertibleTransformException
  • Method Details

    • fillRaster

      protected void fillRaster(int[] pixels, int off, int adjust, int x, int y, int w, int h)
      Return a Raster containing the colors generated for the graphics operation.
      Specified by:
      fillRaster in class MultipleGradientPaintContext
      Parameters:
      x - The x coordinate of the area in device space for which colors are generated.
      y - The y coordinate of the area in device space for which colors are generated.
      w - The width of the area in device space for which colors are generated.
      h - The height of the area in device space for which colors are generated.
    • fixedPointSimplestCaseNonCyclicFillRaster

      private void fixedPointSimplestCaseNonCyclicFillRaster(int[] pixels, int off, int adjust, int x, int y, int w, int h)
      This code works in the simplest of cases, where the focus == center point, the gradient is noncyclic, and the gradient lookup method is fast (single array index, no conversion necessary).
    • calculateFixedPointSqrtLookupTable

      private void calculateFixedPointSqrtLookupTable()
      Build square root lookup table
    • cyclicCircularGradientFillRaster

      private void cyclicCircularGradientFillRaster(int[] pixels, int off, int adjust, int x, int y, int w, int h)
      Fill the raster, cycling the gradient colors when a point falls outside of the perimeter of the 100% stop circle. This calculation first computes the intersection point of the line from the focus through the current point in the raster, and the perimeter of the gradient circle. Then it determines the percentage distance of the current point along that line (focus is 0%, perimeter is 100%). Equation of a circle centered at (a,b) with radius r: (x-a)^2 + (y-b)^2 = r^2 Equation of a line with slope m and y-intercept b y = mx + b replacing y in the cirlce equation and solving using the quadratic formula produces the following set of equations. Constant factors have been extracted out of the inner loop.
    • antiAliasFillRaster

      private void antiAliasFillRaster(int[] pixels, int off, int adjust, int x, int y, int w, int h)
      Fill the raster, cycling the gradient colors when a point falls outside of the perimeter of the 100% stop circle. Use the anti-aliased gradient lookup. This calculation first computes the intersection point of the line from the focus through the current point in the raster, and the perimeter of the gradient circle. Then it determines the percentage distance of the current point along that line (focus is 0%, perimeter is 100%). Equation of a circle centered at (a,b) with radius r: (x-a)^2 + (y-b)^2 = r^2 Equation of a line with slope m and y-intercept b y = mx + b replacing y in the cirlce equation and solving using the quadratic formula produces the following set of equations. Constant factors have been extracted out of the inner loop.