public ImageResource(BinaryPSDReader reader) { this.ID = reader.ReadUInt16(); this.Name = reader.ReadPascalString(); uint settingLength = reader.ReadUInt32(); this.Data = reader.ReadBytes((int)settingLength); if (reader.BaseStream.Position % 2 == 1) reader.ReadByte(); }
public DynVal(BinaryPSDReader r, bool asDescriptor) { if (asDescriptor) { uint version = r.ReadUInt32(); string unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(r.ReadBytes(6)); } this.ObjectType = GetMeaningOfFourCC(ReadSpecialString(r)); this.Children = DynVal.ReadValues(r); }
//public LayerResource(LayerResource res) //{ // Prepare(); // this.Tag = res.Tag; //} public LayerResource(BinaryPSDReader reader) { //this.Tag = new string(reader.ReadPSDChars(4)); uint settingLength = reader.ReadUInt32(); this.Data = reader.ReadBytes((int)settingLength); if (!(this is EffectBase)) { reader.JumpToEvenNthByte(2); } }
public static DynVal ReadValue(BinaryPSDReader r, bool ignoreName) { DynVal vt = new DynVal(); if (!ignoreName) vt.Name = GetMeaningOfFourCC(ReadSpecialString(r)); // r.ReadPascalString(); //else //TODO: should be assigned a sequential number? string type = new string(r.ReadPSDChars(4)); switch (type) { case "tdta": vt.Value = Endogine.Serialization.ReadableBinary.CreateHexEditorString(r.ReadBytes(9)); vt.Children = new List<DynVal>(); while (true) { DynVal child = new DynVal(); vt.Children.Add(child); if (child.ReadTdtaItem(r) == false) break; } //r.BaseStream.Position += 9; break; case "Objc": //Decriptor case "GlbO": //GlobalObject (same) string uniName = r.ReadPSDUnicodeString(); //uint numSub = r.ReadUInt32(); //if (numSub > 1) //{ // //A unicode text here!? What does this have to do with numSub?? // r.BaseStream.Position -= 4; // r.ReadPSDUnicodeString(); // r.BaseStream.Position -= 2; //Ehh... What?! //} ////TODO: ah: 1 = 1 short = unknown... //ushort unknown = r.ReadUInt16(); //vt.Children = ReadValues(r); vt = new DynVal(r, false); if (uniName.Length > 0) vt.UnicodeName = uniName; break; case "VlLs": //List vt.Children = new List<DynVal>(); int numValues = (int)r.ReadUInt32(); for (int i = 0; i < numValues; i++) { DynVal ob = ReadValue(r, true); if (ob != null) vt.Children.Add(ob); } break; case "doub": vt.Value = r.ReadPSDDouble(); break; case "UntF": //Unif float //TODO: need a specific type for this, with a double and a type (percent/pixel)? string tst = GetMeaningOfFourCC(new string(r.ReadPSDChars(4))); //#Prc #Pxl #Ang = percent / pixels / angle? double d = r.ReadPSDDouble(); tst += ": " + d; vt.Value = tst; break; case "enum": string namesp = ReadSpecialString(r); string item = ReadSpecialString(r); //vt.Value = namesp + "." + item; //TODO: cast to real enum vt.Value = GetMeaningOfFourCC(namesp) + "." + GetMeaningOfFourCC(item); break; case "long": vt.Value = r.ReadInt32(); //64? break; case "bool": vt.Value = r.ReadBoolean(); break; //case "obj ": //reference // break; case "TEXT": vt.Value = r.ReadPSDUnicodeString(); break; //case "Enmr": //Enumerated // break; //case "Clss": //Class // break; //case "GlbC": //GlobalClass // break; //case "alis": //Alias // break; default: throw new Exception("Unknown type: " + type); } if (vt.Value == null && vt.Children == null) return null; return vt; }
public Document(string a_sFilename) { this.Init(); FileStream stream = new FileStream(a_sFilename, FileMode.Open, FileAccess.Read); //stream. BinaryPSDReader reader = new BinaryPSDReader(stream); string signature = new string(reader.ReadPSDChars(4)); if (signature != "8BPS") return; this._header = new Header(reader); //this.Version = reader.ReadUInt16(); //if (Version != 1) // throw new Exception("Can not read .psd version " + Version); //byte[] buf = new byte[256]; //reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved //this.Channels = reader.ReadInt16(); //this.Rows = reader.ReadUInt32(); //this.Columns = reader.ReadUInt32(); //this.BitsPerPixel = (int)reader.ReadUInt16(); //this.ColorMode = (ColorModes)reader.ReadInt16(); #region Palette uint nPaletteLength = reader.ReadUInt32(); if (nPaletteLength > 0) { this.ColorTable = new List<Color>(); for (int i = 0; i < nPaletteLength; i+=3) { this.ColorTable.Add(Color.FromArgb((int)reader.ReadByte(), (int)reader.ReadByte(), (int)reader.ReadByte())); } //this.ColorTable.Add(Color.FromArgb(255, 10, 20)); if (this.ColorMode == ColorModes.Duotone) { } else { } } #endregion uint nResLength = reader.ReadUInt32(); //? Number of bytes, or number of entries?? if (nResLength > 0) { //read settings this._imageResources = ImageResource.ReadImageResources(reader); } //reader.JumpToEvenNthByte(4); uint nTotalLayersBytes = reader.ReadUInt32(); long nAfterLayersDefinitions = reader.BaseStream.Position + nTotalLayersBytes; if (nTotalLayersBytes == 8) { stream.Position += nTotalLayersBytes; //this.Unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(reader.ReadBytes((int)reader.BytesToEnd)); } else { uint nSize = reader.ReadUInt32(); //What's the difference between nTotalLayersBytes and nSize really? long nLayersEndPos = reader.BaseStream.Position + nSize; short nNumLayers = reader.ReadInt16(); bool bSkipFirstAlpha = false; if (nNumLayers < 0) { bSkipFirstAlpha = true; nNumLayers = (short)-nNumLayers; } List<Layer> loadOrderLayers = new List<Layer>(); this._layers = new List<Layer>(); // new Dictionary<int, Layer>(); for (int nLayerNum = 0; nLayerNum < nNumLayers; nLayerNum++) { Layer layerInfo = new Layer(reader, this); layerInfo.DebugLayerLoadOrdinal = nLayerNum; //if (layerInfo.LayerID < 0) // layerInfo.LayerID = nLayerNum; //if (this._layers.ContainsKey(layerInfo.LayerID)) // throw(new Exception("Duplicate layer IDs! " + layerInfo.LayerID.ToString())); //else // this._layers.Add(layerInfo.LayerID, layerInfo); this._layers.Add(layerInfo); loadOrderLayers.Add(layerInfo); } for (int layerNum = 0; layerNum < nNumLayers; layerNum++) { Layer layer = (Layer)loadOrderLayers[layerNum]; layer.ReadPixels(reader); } reader.JumpToEvenNthByte(4); if (reader.BaseStream.Position != nLayersEndPos) reader.BaseStream.Position = nLayersEndPos; // nAfterLayersDefinitions; //Global layer mask uint maskLength = reader.ReadUInt32(); this._tempGlobalLayerMask = null; if (maskLength > 0) { this._tempGlobalLayerMask = reader.ReadBytes((int)maskLength); //TODO: the docs are obviously wrong here... //ushort overlayColorSpace = reader.ReadUInt16(); //undefined in docs //for (int i = 0; i < 4; i++) // reader.ReadUInt16(); //TODO: UInt16 if 16-bit color? Color components - says *both* 4*2 bytes, and 8 bytes in the docs? //reader.ReadUInt16(); //opacity (0-100) //reader.ReadByte(); //Kind: 0=Color selectedi.e. inverted; 1=Color protected;128=use value stored per layer. //reader.ReadByte(); //padding } //hmm... another section of "global" layer resources..? while (true) { long cpPos = reader.BaseStream.Position; string sHeader = new string(reader.ReadPSDChars(4)); reader.BaseStream.Position = cpPos; //TODO: -= 4 should work, but sometimes ReadPSDChars advances 5?!?! if (sHeader != "8BIM") { break; } LayerResource res = LayerResource.ReadLayerResource(reader, null); this._globalLayerResources.Add(res); } } bool readGlobalImage = true; if (readGlobalImage) { this._globalImage = new GlobalImage(this); this._globalImage.Load(reader); //the big merged bitmap (which is how the photoshop document looked when it was saved) //Bitmap bmp = this._globalImage.Bitmap; } reader.Close(); stream.Close(); }
public Document(string a_sFilename) { this.Init(); FileStream stream = new FileStream(a_sFilename, FileMode.Open, FileAccess.Read); //stream. BinaryPSDReader reader = new BinaryPSDReader(stream); string signature = new string(reader.ReadPSDChars(4)); if (signature != "8BPS") { return; } this._header = new Header(reader); //this.Version = reader.ReadUInt16(); //if (Version != 1) // throw new Exception("Can not read .psd version " + Version); //byte[] buf = new byte[256]; //reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved //this.Channels = reader.ReadInt16(); //this.Rows = reader.ReadUInt32(); //this.Columns = reader.ReadUInt32(); //this.BitsPerPixel = (int)reader.ReadUInt16(); //this.ColorMode = (ColorModes)reader.ReadInt16(); #region Palette uint nPaletteLength = reader.ReadUInt32(); if (nPaletteLength > 0) { this.ColorTable = new List <Color>(); for (int i = 0; i < nPaletteLength; i += 3) { this.ColorTable.Add(Color.FromArgb((int)reader.ReadByte(), (int)reader.ReadByte(), (int)reader.ReadByte())); } //this.ColorTable.Add(Color.FromArgb(255, 10, 20)); if (this.ColorMode == ColorModes.Duotone) { } else { } } #endregion uint nResLength = reader.ReadUInt32(); //? Number of bytes, or number of entries?? if (nResLength > 0) { //read settings this._imageResources = ImageResource.ReadImageResources(reader); } //reader.JumpToEvenNthByte(4); uint nTotalLayersBytes = reader.ReadUInt32(); long nAfterLayersDefinitions = reader.BaseStream.Position + nTotalLayersBytes; if (nTotalLayersBytes == 8) { stream.Position += nTotalLayersBytes; //this.Unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(reader.ReadBytes((int)reader.BytesToEnd)); } else { uint nSize = reader.ReadUInt32(); //What's the difference between nTotalLayersBytes and nSize really? long nLayersEndPos = reader.BaseStream.Position + nSize; short nNumLayers = reader.ReadInt16(); bool bSkipFirstAlpha = false; if (nNumLayers < 0) { bSkipFirstAlpha = true; nNumLayers = (short)-nNumLayers; } List <Layer> loadOrderLayers = new List <Layer>(); this._layers = new List <Layer>(); // new Dictionary<int, Layer>(); for (int nLayerNum = 0; nLayerNum < nNumLayers; nLayerNum++) { Layer layerInfo = new Layer(reader, this); layerInfo.DebugLayerLoadOrdinal = nLayerNum; //if (layerInfo.LayerID < 0) // layerInfo.LayerID = nLayerNum; //if (this._layers.ContainsKey(layerInfo.LayerID)) // throw(new Exception("Duplicate layer IDs! " + layerInfo.LayerID.ToString())); //else // this._layers.Add(layerInfo.LayerID, layerInfo); this._layers.Add(layerInfo); loadOrderLayers.Add(layerInfo); } for (int layerNum = 0; layerNum < nNumLayers; layerNum++) { Layer layer = (Layer)loadOrderLayers[layerNum]; layer.ReadPixels(reader); } reader.JumpToEvenNthByte(4); if (reader.BaseStream.Position != nLayersEndPos) { reader.BaseStream.Position = nLayersEndPos; // nAfterLayersDefinitions; } //Global layer mask uint maskLength = reader.ReadUInt32(); this._tempGlobalLayerMask = null; if (maskLength > 0) { this._tempGlobalLayerMask = reader.ReadBytes((int)maskLength); //TODO: the docs are obviously wrong here... //ushort overlayColorSpace = reader.ReadUInt16(); //undefined in docs //for (int i = 0; i < 4; i++) // reader.ReadUInt16(); //TODO: UInt16 if 16-bit color? Color components - says *both* 4*2 bytes, and 8 bytes in the docs? //reader.ReadUInt16(); //opacity (0-100) //reader.ReadByte(); //Kind: 0=Color selectedi.e. inverted; 1=Color protected;128=use value stored per layer. //reader.ReadByte(); //padding } //hmm... another section of "global" layer resources..? while (true) { long cpPos = reader.BaseStream.Position; string sHeader = new string(reader.ReadPSDChars(4)); reader.BaseStream.Position = cpPos; //TODO: -= 4 should work, but sometimes ReadPSDChars advances 5?!?! if (sHeader != "8BIM") { break; } LayerResource res = LayerResource.ReadLayerResource(reader, null); this._globalLayerResources.Add(res); } } bool readGlobalImage = true; if (readGlobalImage) { this._globalImage = new GlobalImage(this); this._globalImage.Load(reader); //the big merged bitmap (which is how the photoshop document looked when it was saved) //Bitmap bmp = this._globalImage.Bitmap; } reader.Close(); stream.Close(); }
//public LayerResource(LayerResource res) //{ // Prepare(); // this.Tag = res.Tag; //} public LayerResource(BinaryPSDReader reader) { //this.Tag = new string(reader.ReadPSDChars(4)); uint settingLength = reader.ReadUInt32(); this.Data = reader.ReadBytes((int)settingLength); if (!(this is EffectBase)) reader.JumpToEvenNthByte(2); }
public DynVal(BinaryPSDReader r, bool asDescriptor) { if (asDescriptor) { uint version = r.ReadUInt32(); string unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(r.ReadBytes(6)); } this.ObjectType = GetMeaningOfFourCC(ReadSpecialString(r)); this.Children = DynVal.ReadValues(r); }
public static DynVal ReadValue(BinaryPSDReader r, bool ignoreName) { DynVal vt = new DynVal(); if (!ignoreName) { vt.Name = GetMeaningOfFourCC(ReadSpecialString(r)); // r.ReadPascalString(); } //else //TODO: should be assigned a sequential number? string type = new string(r.ReadPSDChars(4)); switch (type) { case "tdta": vt.Value = Endogine.Serialization.ReadableBinary.CreateHexEditorString(r.ReadBytes(9)); vt.Children = new List <DynVal>(); while (true) { DynVal child = new DynVal(); vt.Children.Add(child); if (child.ReadTdtaItem(r) == false) { break; } } //r.BaseStream.Position += 9; break; case "Objc": //Decriptor case "GlbO": //GlobalObject (same) string uniName = r.ReadPSDUnicodeString(); //uint numSub = r.ReadUInt32(); //if (numSub > 1) //{ // //A unicode text here!? What does this have to do with numSub?? // r.BaseStream.Position -= 4; // r.ReadPSDUnicodeString(); // r.BaseStream.Position -= 2; //Ehh... What?! //} ////TODO: ah: 1 = 1 short = unknown... //ushort unknown = r.ReadUInt16(); //vt.Children = ReadValues(r); vt = new DynVal(r, false); if (uniName.Length > 0) { vt.UnicodeName = uniName; } break; case "VlLs": //List vt.Children = new List <DynVal>(); int numValues = (int)r.ReadUInt32(); for (int i = 0; i < numValues; i++) { DynVal ob = ReadValue(r, true); if (ob != null) { vt.Children.Add(ob); } } break; case "doub": vt.Value = r.ReadPSDDouble(); break; case "UntF": //Unif float //TODO: need a specific type for this, with a double and a type (percent/pixel)? string tst = GetMeaningOfFourCC(new string(r.ReadPSDChars(4))); //#Prc #Pxl #Ang = percent / pixels / angle? double d = r.ReadPSDDouble(); tst += ": " + d; vt.Value = tst; break; case "enum": string namesp = ReadSpecialString(r); string item = ReadSpecialString(r); //vt.Value = namesp + "." + item; //TODO: cast to real enum vt.Value = GetMeaningOfFourCC(namesp) + "." + GetMeaningOfFourCC(item); break; case "long": vt.Value = r.ReadInt32(); //64? break; case "bool": vt.Value = r.ReadBoolean(); break; //case "obj ": //reference // break; case "TEXT": vt.Value = r.ReadPSDUnicodeString(); break; //case "Enmr": //Enumerated // break; //case "Clss": //Class // break; //case "GlbC": //GlobalClass // break; //case "alis": //Alias // break; default: throw new Exception("Unknown type: " + type); } if (vt.Value == null && vt.Children == null) { return(null); } return(vt); }
public ImageResource(BinaryPSDReader reader) { this.ID = reader.ReadUInt16(); this.Name = reader.ReadPascalString(); uint settingLength = reader.ReadUInt32(); this.Data = reader.ReadBytes((int)settingLength); if (reader.BaseStream.Position % 2 == 1) reader.ReadByte(); }