/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed 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. */ package org.icepdf.core.pobjects.graphics; import java.awt.color.ColorSpace; /** * @author Mark Collette * @since 2.0 */ @SuppressWarnings("serial") public class ColorSpaceCMYK extends ColorSpace { private static final String[] NAMES = new String[]{"Cyan", "Magenta", "Yellow", "Black"}; private static final ColorSpace COLOR_SPACE_sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB); public ColorSpaceCMYK() { super(TYPE_CMYK, 4); } public int getNumComponents() { return 4; } public String getName(int index) { return NAMES[index]; } public int getType() { return TYPE_CMYK; } public boolean isCS_sRGB() { return false; } public float[] fromRGB(float[] rgbValues) { float c = 1.0f - rgbValues[0]; float m = 1.0f - rgbValues[1]; float y = 1.0f - rgbValues[2]; float k = Math.min(c, Math.min(m, y)); float km = Math.max(c, Math.max(m, y)); if (km > k) k = k * k * k / (km * km); c -= k; m -= k; y -= k; float[] cmykValues = new float[4]; cmykValues[0] = c; cmykValues[1] = m; cmykValues[2] = y; cmykValues[3] = k; return cmykValues; } public float[] toRGB(float[] cmykValues) { //System.out.println("CMYK: " + cmykValues[0] + " " + cmykValues[1] + " " + cmykValues[2] + " " + cmykValues[3]); /* float c = 1.0f - cmykValues[0]; float m = 1.0f - cmykValues[1]; float y = 1.0f - cmykValues[2]; float k = cmykValues[3]; c -= k; m -= k; y -= k; if( c < 0.0f ) c = 0.0f; if( m < 0.0f ) m = 0.0f; if( y < 0.0f ) y = 0.0f; */ float c = cmykValues[0]; float m = cmykValues[1]; float y = cmykValues[2]; float k = cmykValues[3]; c += k; m += k; y += k; if (c < 0.0f) c = 0.0f; else if (c > 1.0f) c = 1.0f; if (m < 0.0f) m = 0.0f; else if (m > 1.0f) m = 1.0f; if (y < 0.0f) y = 0.0f; else if (y > 1.0f) y = 1.0f; c = 1.0f - c; m = 1.0f - m; y = 1.0f - y; float[] rgbValues = new float[4]; rgbValues[0] = c; rgbValues[1] = m; rgbValues[2] = y; return rgbValues; } private float[] _rgbValues = new float[4]; public float[] fromCIEXYZ(float[] colorvalue) { return fromRGB(COLOR_SPACE_sRGB.fromCIEXYZ(colorvalue)); } public float[] toCIEXYZ(float[] colorvalue) { return COLOR_SPACE_sRGB.toCIEXYZ(toRGB(colorvalue)); } }