    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.ImagingException;
    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, final int profileVersion, final int profileDeviceClassSignature,
    048            final int colorSpace, final int profileConnectionSpace, final int profileFileSignature, final int primaryPlatformSignature, final int variousFlags,
    049            final int deviceManufacturer, final int deviceModel, final int renderingIntent, final int profileCreatorSignature, final byte[] profileId,
    050            final IccTag[] tags) {
    051        this.data = data;
    052
    053        this.profileSize = profileSize;
    054        this.cmmTypeSignature = cmmTypeSignature;
    055        this.profileVersion = profileVersion;
    056        this.profileDeviceClassSignature = profileDeviceClassSignature;
    057        this.colorSpace = colorSpace;
    058        this.profileConnectionSpace = profileConnectionSpace;
    059        this.profileFileSignature = profileFileSignature;
    060        this.primaryPlatformSignature = primaryPlatformSignature;
    061        this.variousFlags = variousFlags;
    062        this.deviceManufacturer = deviceManufacturer;
    063        this.deviceModel = deviceModel;
    064        this.renderingIntent = renderingIntent;
    065        this.profileCreatorSignature = profileCreatorSignature;
    066        this.profileId = profileId;
    067
    068        this.tags = tags;
    069    }
    070
    071    public void dump(final String prefix) {
    072        LOGGER.fine(toString());
    073    }
    074
    075    public byte[] getData() {
    076        return data.clone();
    077    }
    078
    079    public byte[] getProfileId() {
    080        return profileId.clone();
    081    }
    082
    083    public IccTag[] getTags() {
    084        return tags;
    085    }
    086
    087    public boolean isSrgb() {
    088        return deviceManufacturer == IccConstants.IEC && 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) + (char) (0xff & i >> 16) + (char) (0xff & i >> 8) + (char) (0xff & i >> 0) + "'");
    093    }
    094
    095    @Override
    096    public String toString() {
    097        try {
    098            return toString("");
    099        } catch (final Exception e) {
    100            return "IccProfileInfo: Error";
    101        }
    102    }
    103
    104    public String toString(final String prefix) throws ImagingException, IOException {
    105        final StringWriter sw = new StringWriter();
    106        final PrintWriter pw = new PrintWriter(sw);
    107
    108        pw.println(prefix + ": " + "data length: " + data.length);
    109
    110        printCharQuad(pw, prefix + ": " + "ProfileDeviceClassSignature", profileDeviceClassSignature);
    111        printCharQuad(pw, prefix + ": " + "CMMTypeSignature", cmmTypeSignature);
    112        printCharQuad(pw, prefix + ": " + "ProfileDeviceClassSignature", profileDeviceClassSignature);
    113        printCharQuad(pw, prefix + ": " + "ColorSpace", colorSpace);
    114        printCharQuad(pw, prefix + ": " + "ProfileConnectionSpace", profileConnectionSpace);
    115        printCharQuad(pw, prefix + ": " + "ProfileFileSignature", profileFileSignature);
    116        printCharQuad(pw, prefix + ": " + "PrimaryPlatformSignature", primaryPlatformSignature);
    117        printCharQuad(pw, prefix + ": " + "ProfileFileSignature", profileFileSignature);
    118        printCharQuad(pw, prefix + ": " + "DeviceManufacturer", deviceManufacturer);
    119        printCharQuad(pw, prefix + ": " + "DeviceModel", deviceModel);
    120        printCharQuad(pw, prefix + ": " + "RenderingIntent", renderingIntent);
    121        printCharQuad(pw, prefix + ": " + "ProfileCreatorSignature", profileCreatorSignature);
    122
    123        for (int i = 0; i < tags.length; i++) {
    124            final IccTag tag = tags[i];
    125            tag.dump(pw, "\t" + i + ": ");
    126        }
    127
    128        pw.println(prefix + ": " + "isSrgb: " + isSrgb());
    129        pw.flush();
    130
    131        return sw.getBuffer().toString();
    132    }
    133
    134}