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 static org.apache.commons.imaging.common.BinaryFunctions.read4Bytes; 020 021import java.io.ByteArrayInputStream; 022import java.io.IOException; 023import java.io.InputStream; 024import java.nio.ByteOrder; 025import java.nio.charset.StandardCharsets; 026import java.util.logging.Logger; 027 028import org.apache.commons.imaging.ImagingException; 029 030public enum IccTagDataTypes implements IccTagDataType { 031 DESC_TYPE("descType", 0x64657363) { 032 @Override 033 public void dump(final String prefix, final byte[] bytes) throws ImagingException, IOException { 034 try (InputStream bis = new ByteArrayInputStream(bytes)) { 035 read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 036 037 // bis.setDebug(true); 038 read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 039 final int stringLength = read4Bytes("stringLength", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 040 041 // bis.readByteArray("ignore", bytes.length -12, "none"); 042 final String s = new String(bytes, 12, stringLength - 1, StandardCharsets.US_ASCII); 043 LOGGER.fine(prefix + "s: '" + s + "'"); 044 } 045 } 046 047 }, 048 049 DATA_TYPE("dataType", 0x64617461) { 050 @Override 051 public void dump(final String prefix, final byte[] bytes) throws ImagingException, IOException { 052 try (InputStream bis = new ByteArrayInputStream(bytes)) { 053 read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 054 } 055 } 056 057 }, 058 059 MULTI_LOCALIZED_UNICODE_TYPE("multiLocalizedUnicodeType", 0x6D6C7563) { 060 @Override 061 public void dump(final String prefix, final byte[] bytes) throws ImagingException, IOException { 062 try (InputStream bis = new ByteArrayInputStream(bytes)) { 063 read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 064 } 065 } 066 067 }, 068 069 SIGNATURE_TYPE("signatureType", 0x73696720) { 070 @Override 071 public void dump(final String prefix, final byte[] bytes) throws ImagingException, IOException { 072 try (InputStream bis = new ByteArrayInputStream(bytes)) { 073 read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 074 read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 075 final int theSignature = read4Bytes("theSignature ", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 076 LOGGER.fine(prefix + "theSignature: " + Integer.toHexString(theSignature) + " (" 077 + new String(new byte[] { (byte) (0xff & theSignature >> 24), (byte) (0xff & theSignature >> 16), 078 (byte) (0xff & theSignature >> 8), (byte) (0xff & theSignature >> 0), }, StandardCharsets.US_ASCII) 079 + ")"); 080 } 081 } 082 083 }, 084 085 TEXT_TYPE("textType", 0x74657874) { 086 @Override 087 public void dump(final String prefix, final byte[] bytes) throws ImagingException, IOException { 088 try (InputStream bis = new ByteArrayInputStream(bytes)) { 089 read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 090 read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN); 091 final String s = new String(bytes, 8, bytes.length - 8, StandardCharsets.US_ASCII); 092 LOGGER.fine(prefix + "s: '" + s + "'"); 093 } 094 } 095 096 }; 097 098 private static final Logger LOGGER = Logger.getLogger(IccTagDataTypes.class.getName()); 099 100 public final String name; 101 public final int signature; 102 103 IccTagDataTypes(final String name, final int signature) { 104 this.name = name; 105 this.signature = signature; 106 } 107 108 @Override 109 public String getName() { 110 return name; 111 } 112 113 @Override 114 public int getSignature() { 115 return signature; 116 } 117}