public Color getColor(float[] f, boolean fillAndStroke) { init(); if (colorSpace != null && !failed) { try { // generate a key for the colour int key = generateKey(f); if (f.length <= 3) { return addColorToCache(iccColorCache3B, key, colorSpace, f); } else { return addColorToCache(iccColorCache4B, key, colorSpace, f); } } catch (Exception e) { logger.log(Level.FINE, "Error getting ICCBased colour", e); failed = true; } } return alternate.getColor(f); }
/** * Calculate the colours value of the point xy on the line point1 and point2. * * @param colorSpace colour space to apply to the function output * @param xy point to calcualte the colour of. * @param point1 start of gradient line * @param point2 end of gradient line. * @param t0 domain min * @param t1 domain max * @return colour derived from the input parameters. */ private Color calculateColour( PColorSpace colorSpace, Point2D.Float xy, Point2D.Float point1, Point2D.Float point2, float t0, float t1) { // find colour at point 1 float xPrime = linearMapping(xy, point1, point2); float t = parametrixValue(xPrime, t0, t1, extend); // find colour at point 2 float[] input = new float[1]; input[0] = t; // apply the function to the given input if (function != null) { float[] output; int length = function.length; // simple 1 in N out function if (length == 1) { output = function[0].calculate(input); } else { // vector of function for each colour component, 1 in 1 out. output = new float[length]; for (int i = 0; i < length; i++) { output[i] = function[i].calculate(input)[0]; } } if (output != null) { output = PColorSpace.reverse(output); return colorSpace.getColor(output, true); } else { return null; } } else { logger.fine("Error processing Shading Type 2 Pattern."); return null; } }