/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id: ICCColorSpaceWithIntent.java 1732018 2016-02-24 04:51:06Z gadams $ */
package org.apache.xmlgraphics.java2d.color;
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
This class extends the ICCColorSpace class by providing
convenience methods to convert to sRGB using various
methods, forcing a given intent, such as perceptual or
relative colorimetric. It also additionally holds the name
and source URI of the color profile.
/**
* This class extends the ICCColorSpace class by providing
* convenience methods to convert to sRGB using various
* methods, forcing a given intent, such as perceptual or
* relative colorimetric. It also additionally holds the name
* and source URI of the color profile.
*/
public class ICCColorSpaceWithIntent extends ICC_ColorSpace implements ColorSpaceOrigin {
private static final long serialVersionUID = -3338065900662625221L;
static final ColorSpace SRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
private RenderingIntent intent;
private String profileName;
private String profileURI;
Creates a new ICC-based color space.
Params: - p – the color profile
- intent – the overriding rendering intent (use
RenderingIntent.AUTO
to preserve the profile's) - profileName – the color profile name
- profileURI – the source URI of the color profile
/**
* Creates a new ICC-based color space.
* @param p the color profile
* @param intent the overriding rendering intent (use {@link RenderingIntent#AUTO}
* to preserve the profile's)
* @param profileName the color profile name
* @param profileURI the source URI of the color profile
*/
public ICCColorSpaceWithIntent(ICC_Profile p, RenderingIntent intent,
String profileName, String profileURI) {
super(p);
this.intent = intent;
/**
* Apply the requested intent into the profile
*/
if (intent != RenderingIntent.AUTO) {
byte[] hdr = p.getData(ICC_Profile.icSigHead);
hdr[ICC_Profile.icHdrRenderingIntent] = (byte)intent.getIntegerValue();
}
this.profileName = profileName;
this.profileURI = profileURI;
}
Returns the sRGB value obtained by forcing the
conversion method to the intent passed to the
constructor.
Params: - values – the color values in the local color space
Returns: the sRGB values
/**
* Returns the sRGB value obtained by forcing the
* conversion method to the intent passed to the
* constructor.
* @param values the color values in the local color space
* @return the sRGB values
*/
public float[] intendedToRGB(float[] values) {
switch(intent) {
case ABSOLUTE_COLORIMETRIC:
return absoluteColorimetricToRGB(values);
case PERCEPTUAL:
case AUTO:
return perceptualToRGB(values);
case RELATIVE_COLORIMETRIC:
return relativeColorimetricToRGB(values);
case SATURATION:
return saturationToRGB(values);
default:
throw new RuntimeException("invalid intent:" + intent);
}
}
Perceptual conversion is the method implemented by the
base class's toRGB method
Params: - values – the color values in the local color space
Returns: the sRGB values
/**
* Perceptual conversion is the method implemented by the
* base class's toRGB method
* @param values the color values in the local color space
* @return the sRGB values
*/
private float[] perceptualToRGB(float[] values) {
return toRGB(values);
}
Relative colorimetric needs to happen through CIEXYZ
conversion.
Params: - values – the color values in the local color space
Returns: the sRGB values
/**
* Relative colorimetric needs to happen through CIEXYZ
* conversion.
* @param values the color values in the local color space
* @return the sRGB values
*/
private float[] relativeColorimetricToRGB(float[] values) {
float[] ciexyz = toCIEXYZ(values);
return SRGB.fromCIEXYZ(ciexyz);
}
Absolute colorimetric. NOT IMPLEMENTED.
Temporarily returns same as perceptual.
Params: - values – the color values in the local color space
Returns: the sRGB values
/**
* Absolute colorimetric. NOT IMPLEMENTED.
* Temporarily returns same as perceptual.
* @param values the color values in the local color space
* @return the sRGB values
*/
private float[] absoluteColorimetricToRGB(float[] values) {
return perceptualToRGB(values);
}
Saturation. NOT IMPLEMENTED. Temporarily returns same
as perceptual.
Params: - values – the color values in the local color space
Returns: the sRGB values
/**
* Saturation. NOT IMPLEMENTED. Temporarily returns same
* as perceptual.
* @param values the color values in the local color space
* @return the sRGB values
*/
private float[] saturationToRGB(float[] values) {
return perceptualToRGB(values);
}
{@inheritDoc} /** {@inheritDoc} */
public String getProfileName() {
return this.profileName;
}
{@inheritDoc} /** {@inheritDoc} */
public String getProfileURI() {
return this.profileURI;
}
}