001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.imaging.icc;
018
019import java.io.IOException;
020import java.io.PrintWriter;
021import java.io.StringWriter;
022import java.util.logging.Logger;
023
024import org.apache.commons.imaging.ImageReadException;
025
026public class IccProfileInfo {
027
028    private static final Logger LOGGER = Logger.getLogger(IccProfileInfo.class.getName());
029
030    private final byte[] data;
031    public final int profileSize;
032    public final int cmmTypeSignature;
033    public final int profileVersion;
034    public final int profileDeviceClassSignature;
035    public final int colorSpace;
036    public final int profileConnectionSpace;
037    public final int profileFileSignature;
038    public final int primaryPlatformSignature;
039    public final int variousFlags;
040    public final int deviceManufacturer;
041    public final int deviceModel;
042    public final int renderingIntent;
043    public final int profileCreatorSignature;
044    private final byte[] profileId;
045    private final IccTag[] tags;
046
047    public IccProfileInfo(final byte[] data, final int profileSize, final int cmmTypeSignature,
048            final int profileVersion, final int profileDeviceClassSignature,
049            final int colorSpace, final int profileConnectionSpace,
050            final int profileFileSignature, final int primaryPlatformSignature,
051            final int variousFlags, final int deviceManufacturer, final int deviceModel,
052            final int renderingIntent, final int profileCreatorSignature, final byte[] profileId,
053            final IccTag[] tags) {
054        this.data = data;
055
056        this.profileSize = profileSize;
057        this.cmmTypeSignature = cmmTypeSignature;
058        this.profileVersion = profileVersion;
059        this.profileDeviceClassSignature = profileDeviceClassSignature;
060        this.colorSpace = colorSpace;
061        this.profileConnectionSpace = profileConnectionSpace;
062        this.profileFileSignature = profileFileSignature;
063        this.primaryPlatformSignature = primaryPlatformSignature;
064        this.variousFlags = variousFlags;
065        this.deviceManufacturer = deviceManufacturer;
066        this.deviceModel = deviceModel;
067        this.renderingIntent = renderingIntent;
068        this.profileCreatorSignature = profileCreatorSignature;
069        this.profileId = profileId;
070
071        this.tags = tags;
072    }
073
074    public byte[] getData() {
075        return data.clone();
076    }
077
078    public byte[] getProfileId() {
079        return profileId.clone();
080    }
081
082    public IccTag[] getTags() {
083        return tags;
084    }
085
086    public boolean issRGB() {
087        return deviceManufacturer == IccConstants.IEC
088                && deviceModel == IccConstants.sRGB;
089    }
090
091    private void printCharQuad(final PrintWriter pw, final String msg, final int i) {
092        pw.println(msg + ": '" + (char) (0xff & (i >> 24))
093                + (char) (0xff & (i >> 16)) + (char) (0xff & (i >> 8))
094                + (char) (0xff & (i >> 0)) + "'");
095    }
096
097    public void dump(final String prefix) {
098        LOGGER.fine(toString());
099    }
100
101    @Override
102    public String toString() {
103        try {
104            return toString("");
105        } catch (final Exception e) {
106            return "IccProfileInfo: Error";
107        }
108    }
109
110    public String toString(final String prefix) throws ImageReadException,
111            IOException {
112        final StringWriter sw = new StringWriter();
113        final PrintWriter pw = new PrintWriter(sw);
114
115        pw.println(prefix + ": " + "data length: " + data.length);
116
117        printCharQuad(pw, prefix + ": " + "ProfileDeviceClassSignature", profileDeviceClassSignature);
118        printCharQuad(pw, prefix + ": " + "CMMTypeSignature", cmmTypeSignature);
119        printCharQuad(pw, prefix + ": " + "ProfileDeviceClassSignature", profileDeviceClassSignature);
120        printCharQuad(pw, prefix + ": " + "ColorSpace", colorSpace);
121        printCharQuad(pw, prefix + ": " + "ProfileConnectionSpace", profileConnectionSpace);
122        printCharQuad(pw, prefix + ": " + "ProfileFileSignature", profileFileSignature);
123        printCharQuad(pw, prefix + ": " + "PrimaryPlatformSignature", primaryPlatformSignature);
124        printCharQuad(pw, prefix + ": " + "ProfileFileSignature", profileFileSignature);
125        printCharQuad(pw, prefix + ": " + "DeviceManufacturer", deviceManufacturer);
126        printCharQuad(pw, prefix + ": " + "DeviceModel", deviceModel);
127        printCharQuad(pw, prefix + ": " + "RenderingIntent", renderingIntent);
128        printCharQuad(pw, prefix + ": " + "ProfileCreatorSignature", profileCreatorSignature);
129
130        for (int i = 0; i < tags.length; i++) {
131            final IccTag tag = tags[i];
132            tag.dump(pw, "\t" + i + ": ");
133        }
134
135        pw.println(prefix + ": " + "issRGB: " + issRGB());
136        pw.flush();
137
138        return sw.getBuffer().toString();
139    }
140
141}