2023-06-21 12:46:23 -04:00

109 lines
3.4 KiB
C#

using System;
using System.Text;
using System.Collections;
using System.IO;
namespace iTextSharp.text.pdf
{
/// <summary>
/// Summary description for ICC_Profile.
/// </summary>
public class ICC_Profile
{
protected byte[] data;
protected int numComponents;
private static Hashtable cstags = new Hashtable();
protected ICC_Profile() {
}
public static ICC_Profile GetInstance(byte[] data) {
if (data.Length < 128 | data[36] != 0x61 || data[37] != 0x63
|| data[38] != 0x73 || data[39] != 0x70)
throw new ArgumentException("Invalid ICC profile");
ICC_Profile icc = new ICC_Profile();
icc.data = data;
object cs = cstags[Encoding.ASCII.GetString(data, 16, 4)];
icc.numComponents = (cs == null ? 0 : (int)cs);
return icc;
}
public static ICC_Profile GetInstance(Stream file) {
byte[] head = new byte[128];
int remain = head.Length;
int ptr = 0;
while (remain > 0) {
int n = file.Read(head, ptr, remain);
if (n <= 0)
throw new ArgumentException("Invalid ICC profile");
remain -= n;
ptr += n;
}
if (head[36] != 0x61 || head[37] != 0x63
|| head[38] != 0x73 || head[39] != 0x70)
throw new ArgumentException("Invalid ICC profile");
remain = ((head[0] & 0xff) << 24) | ((head[1] & 0xff) << 16)
| ((head[2] & 0xff) << 8) | (head[3] & 0xff);
byte[] icc = new byte[remain];
System.Array.Copy(head, 0, icc, 0, head.Length);
remain -= head.Length;
ptr = head.Length;
while (remain > 0) {
int n = file.Read(icc, ptr, remain);
if (n <= 0)
throw new ArgumentException("Invalid ICC profile");
remain -= n;
ptr += n;
}
return GetInstance(icc);
}
public static ICC_Profile GetInstance(String fname) {
FileStream fs = new FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.Read);
ICC_Profile icc = GetInstance(fs);
fs.Close();
return icc;
}
public byte[] Data {
get {
return data;
}
}
public int NumComponents {
get {
return numComponents;
}
}
static ICC_Profile() {
cstags["XYZ "] = 3;
cstags["Lab "] = 3;
cstags["Luv "] = 3;
cstags["YCbr"] = 3;
cstags["Yxy "] = 3;
cstags["RGB "] = 3;
cstags["GRAY"] = 1;
cstags["HSV "] = 3;
cstags["HLS "] = 3;
cstags["CMYK"] = 4;
cstags["CMY "] = 3;
cstags["2CLR"] = 2;
cstags["3CLR"] = 3;
cstags["4CLR"] = 4;
cstags["5CLR"] = 5;
cstags["6CLR"] = 6;
cstags["7CLR"] = 7;
cstags["8CLR"] = 8;
cstags["9CLR"] = 9;
cstags["ACLR"] = 10;
cstags["BCLR"] = 11;
cstags["CCLR"] = 12;
cstags["DCLR"] = 13;
cstags["ECLR"] = 14;
cstags["FCLR"] = 15;
}
}
}