private void ParseLrfxKeyword(AdjustmentLayerInfo adjustmentLayerInfo) { BinaryReverseReader dataReader = adjustmentLayerInfo.DataReader; int version = dataReader.ReadInt16(); int effectCount = dataReader.ReadInt16(); for (int index = 0; index < effectCount; index++) { string sigNature = dataReader.ReadStringNew(4); string type = dataReader.ReadStringNew(4); switch (type) { case "cmnS": //OK int cmnsSize = dataReader.ReadInt32(); int cmnsVersion = dataReader.ReadInt32(); bool cmnsBool = dataReader.ReadBoolean(); int cmnsUnused = dataReader.ReadInt16(); break; case "dsdw": // 投影效果 byte[] testbyte2 = dataReader.ReadBytes(55); break; case "isdw": //内阴影效果 int dropSize = dataReader.ReadInt32(); int dropVersion = dataReader.ReadInt32(); int dropBlurValue = dataReader.ReadInt32(); int Intensityasapercent = dataReader.ReadInt32(); int angleindegrees = dataReader.ReadInt32(); int distanceinp = dataReader.ReadInt32(); byte[] colortest = dataReader.ReadBytes(10); dataReader.ReadBytes(4); string dropBlendmode = dataReader.ReadStringNew(4); bool dropeffectEnable = dataReader.ReadBoolean(); byte usethisangle = dataReader.ReadByte(); int dropOpacity = dataReader.ReadByte(); int dropSpace11 = dataReader.ReadInt16(); int color111 = dataReader.ReadInt16(); int color211 = dataReader.ReadInt16(); int color311 = dataReader.ReadInt16(); int color411 = dataReader.ReadInt16(); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(10); string sign1 = dataReader.ReadStringNew(4); string key1 = dataReader.ReadStringNew(4); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); if (dropVersion == 2) { dataReader.ReadBytes(10); } break; case "oglw": //有用:字体的描边! int sizeofRemainItems = dataReader.ReadInt32(); int oglwversion = dataReader.ReadInt32(); byte[] blurdata = dataReader.ReadBytes(4); _outLineDis = Convert.ToInt32(blurdata[1]); //也是小坑,四个故意放在第二个字节 也不说明( ▼-▼ ) //int blurvalue = dataReader.ReadInt32(); int intensityPercent = dataReader.ReadInt32(); byte outline_r = 0; byte outline_g = 0; byte outline_b = 0; byte outline_a = 0; dataReader.ReadBytes(2); outline_r = dataReader.ReadByte(); dataReader.ReadByte(); outline_g = dataReader.ReadByte(); dataReader.ReadByte(); outline_b = dataReader.ReadByte(); dataReader.ReadByte(); outline_a = dataReader.ReadByte(); dataReader.ReadByte(); string curSign = dataReader.ReadStringNew(4); string key = dataReader.ReadStringNew(4); bool effectEnable = dataReader.ReadBoolean(); //yanruTODO 不可靠,如果整个effect 层 禁用了,子字段可能依然为true,暂时找不到上层effect开关 byte opacityPercent = dataReader.ReadByte(); //描边透明度 if (oglwversion == 2) { byte[] oglwColor2 = dataReader.ReadBytes(10); } if (!effectEnable) //指明了没有描边 { TextOutlineColor = new Color(0, 0, 0, 0); } else { TextOutlineColor = new Color(outline_r / 255f, outline_g / 255f, outline_b / 255f, opacityPercent / 255f); } break; case "iglw": byte[] testdata5 = dataReader.ReadBytes(47); //effectStr += "\n" + printbytes(testdata5, "iglw"); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(10); //dataReader.ReadBytes(8); //dataReader.ReadBytes(1); //dataReader.ReadBytes(1); //dataReader.ReadBytes(1); //dataReader.ReadBytes(10); break; case "bevl": int bevelSizeofRemain = dataReader.ReadInt32(); //.ReadBytes(4); int bevelversion = dataReader.ReadInt32(); //dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(8); dataReader.ReadBytes(8); dataReader.ReadBytes(10); dataReader.ReadBytes(10); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); if (bevelversion == 2) { dataReader.ReadBytes(10); dataReader.ReadBytes(10); } break; case "sofi": int solidSize = dataReader.ReadInt32(); //.ReadBytes(4); int solidVersion = dataReader.ReadInt32(); // (4); string sign = dataReader.ReadStringNew(4); string solidBlendmode = dataReader.ReadStringNew(4); //.ReadBytes(4); byte[] solidColor = dataReader.ReadBytes(10); byte opacity = dataReader.ReadByte(); byte solidenable = dataReader.ReadByte(); dataReader.ReadBytes(10); break; } } }
//图层效果相关 private void parseLrfxKeyword(AdjustmentLayerInfo adjustmentLayerInfo) { BinaryReverseReader dataReader = adjustmentLayerInfo.DataReader; int version = dataReader.ReadInt16(); int effectCount = dataReader.ReadInt16(); //Debug.Log("lrfx version=" + version + ",effectCount=" + effectCount); string effectStr = ""; for (int index = 0; index < effectCount; index++) { string sigNature = dataReader.readStringNew(4); string type = dataReader.readStringNew(4); //Debug.Log("cur read type=" + type + ",sigNature=" + sigNature); switch (type) { case "cmnS": //OK int cmnsSize = dataReader.ReadInt32(); int cmnsVersion = dataReader.ReadInt32(); bool cmnsBool = dataReader.ReadBoolean(); int cmnsUnused = dataReader.ReadInt16(); Debug.Log("cmnsSize =" + cmnsSize + ",cmnsBool=" + cmnsBool); break; case "dsdw": //可能有用 //byte[] testbyte2 = dataReader.ReadBytes(55); //effectStr += "\n" + printbytes(testbyte2, "dsdw"); //break; case "isdw": int dropSize = dataReader.ReadInt32(); int dropVersion = dataReader.ReadInt32(); int dropBlurValue = dataReader.ReadInt32(); int Intensityasapercent = dataReader.ReadInt32(); int angleindegrees = dataReader.ReadInt32(); int distanceinp = dataReader.ReadInt32(); byte[] colortest = dataReader.ReadBytes(10); dataReader.ReadBytes(4); string dropBlendmode = dataReader.readStringNew(4); bool dropeffectEnable = dataReader.ReadBoolean(); byte usethisangle = dataReader.ReadByte(); int dropOpacity = dataReader.ReadByte(); int dropSpace11 = dataReader.ReadInt16(); int color111 = dataReader.ReadInt16(); int color211 = dataReader.ReadInt16(); int color311 = dataReader.ReadInt16(); int color411 = dataReader.ReadInt16(); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); effectStr += "\n" + dataReader.ReadBytes(10); string sign1 = dataReader.readStringNew(4); string key1 = dataReader.readStringNew(4); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); if (dropVersion == 2) { dataReader.ReadBytes(10); } break; case "oglw": //有用:字体的描边! int sizeofRemainItems = dataReader.ReadInt32(); int oglwversion = dataReader.ReadInt32(); byte[] blurdata = dataReader.ReadBytes(4); outLineDis = Convert.ToInt32(blurdata[1]); //也是小坑,四个故意放在第二个字节 也不说明( ▼-▼ ) effectStr += printbytes(blurdata, "blurdata "); //int blurvalue = dataReader.ReadInt32(); int intensityPercent = dataReader.ReadInt32(); byte outline_r = 0; byte outline_g = 0; byte outline_b = 0; byte outline_a = 0; dataReader.ReadBytes(2); outline_r = dataReader.ReadByte(); dataReader.ReadByte(); outline_g = dataReader.ReadByte(); dataReader.ReadByte(); outline_b = dataReader.ReadByte(); dataReader.ReadByte(); outline_a = dataReader.ReadByte(); dataReader.ReadByte(); string curSign = dataReader.readStringNew(4); string key = dataReader.readStringNew(4); bool effectEnable = dataReader.ReadBoolean(); //yanruTODO 不可靠,如果整个effect 层 禁用了,子字段可能依然为true,暂时找不到上层effect开关 byte opacityPercent = dataReader.ReadByte(); //描边透明度 if (oglwversion == 2) { byte[] oglwColor2 = dataReader.ReadBytes(10); } if (!effectEnable) //指明了没有描边 { TextOutlineColor = new Color(0, 0, 0, 0); } else { TextOutlineColor = new Color(outline_r / 255f, outline_g / 255f, outline_b / 255f, opacityPercent / 255f); } Debug.Log("sizeofRemainItems=" + sizeofRemainItems + ",oglwversion=" + oglwversion + ",intensityPercent=" + intensityPercent + ",curSign=" + curSign + ",key=" + key + ",color_r=" + outline_r + ",color_g=" + outline_g + ",color_b=" + outline_b + ",color_a=" + outline_a + ",effectEnable=" + effectEnable + ",opacityPercent=" + opacityPercent + ",outLineDis=" + outLineDis ); break; case "iglw": byte[] testdata5 = dataReader.ReadBytes(47); //effectStr += "\n" + printbytes(testdata5, "iglw"); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(4); //dataReader.ReadBytes(10); //dataReader.ReadBytes(8); //dataReader.ReadBytes(1); //dataReader.ReadBytes(1); //dataReader.ReadBytes(1); //dataReader.ReadBytes(10); break; case "bevl": int bevelSizeofRemain = dataReader.ReadInt32(); //.ReadBytes(4); int bevelversion = dataReader.ReadInt32(); //dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(4); dataReader.ReadBytes(8); dataReader.ReadBytes(8); dataReader.ReadBytes(10); dataReader.ReadBytes(10); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); dataReader.ReadBytes(1); if (bevelversion == 2) { dataReader.ReadBytes(10); dataReader.ReadBytes(10); } break; //case "sofi": // int solidSize = dataReader.ReadInt32();//.ReadBytes(4); // int solidVersion = dataReader.ReadInt32();// (4); // string solidBlendmode = dataReader.readStringNew(4);//.ReadBytes(4); // byte[] solidColor = dataReader.ReadBytes(10); // effectStr += printbytes(solidColor, "sofi solidColor"); // byte opacity = dataReader.ReadByte(); // byte solidenable = dataReader.ReadByte(); // //dataReader.ReadBytes(1); // //dataReader.ReadBytes(1); // dataReader.ReadBytes(10); // Debug.Log("sofi solidSize=" + solidSize // + ",solidVersion=" + solidVersion // + ",solidBlendmode=" + solidBlendmode // + ",opacity=" + opacity // + ",solidenable=" + solidenable // ); // break; } } Debug.Log("effectStr=" + effectStr); }
public Layer(BinaryReverseReader reader, PsdFile psdFile) { Debug.WriteLine("Layer started at " + reader.BaseStream.Position.ToString()); m_psdFile = psdFile; m_rect = new Rectangle(); m_rect.Y = reader.ReadInt32(); m_rect.X = reader.ReadInt32(); m_rect.Height = reader.ReadInt32() - m_rect.Y; m_rect.Width = reader.ReadInt32() - m_rect.X; //----------------------------------------------------------------------- int numberOfChannels = reader.ReadUInt16(); this.m_channels.Clear(); for (int channel = 0; channel < numberOfChannels; channel++) { Channel ch = new Channel(reader, this); m_channels.Add(ch); m_sortedChannels.Add(ch.ID, ch); } //----------------------------------------------------------------------- string signature = new string(reader.ReadChars(4)); if (signature != "8BIM") { throw (new IOException("Layer Channelheader error!")); } m_blendModeKey = new string(reader.ReadChars(4)); m_opacity = reader.ReadByte(); m_clipping = reader.ReadByte() > 0; //----------------------------------------------------------------------- byte flags = reader.ReadByte(); m_flags = new BitVector32(flags); //----------------------------------------------------------------------- reader.ReadByte(); //padding //----------------------------------------------------------------------- Debug.WriteLine("Layer extraDataSize started at " + reader.BaseStream.Position.ToString()); // this is the total size of the MaskData, the BlendingRangesData, the // Name and the AdjustmentLayerInfo uint extraDataSize = reader.ReadUInt32(); // remember the start position for calculation of the // AdjustmentLayerInfo size long extraDataStartPosition = reader.BaseStream.Position; m_maskData = new Mask(reader, this); m_blendingRangesData = new BlendingRanges(reader, this); //----------------------------------------------------------------------- long namePosition = reader.BaseStream.Position; m_name = reader.ReadPascalString(); int paddingBytes = (int)((reader.BaseStream.Position - namePosition) % 4); Debug.Print("Layer {0} padding bytes after name", paddingBytes); reader.ReadBytes(paddingBytes); //----------------------------------------------------------------------- m_adjustmentInfo.Clear(); long adjustmentLayerEndPos = extraDataStartPosition + extraDataSize; while (reader.BaseStream.Position < adjustmentLayerEndPos) { try { AdjustmentLayerInfo ali = new AdjustmentLayerInfo(reader, this); if (ali.Key.Equals("lrFX")) { //A sub-key - we want to merge its sub-layer info items with this dict. m_adjustmentInfo.AddRange(new Effects(ali)._resources.Values); } else { m_adjustmentInfo.Add(ali); // Just add the items } } catch { reader.BaseStream.Position = adjustmentLayerEndPos; } } //----------------------------------------------------------------------- // make sure we are not on a wrong offset, so set the stream position // manually reader.BaseStream.Position = adjustmentLayerEndPos; }
public Layer(BinaryReverseReader reader, PsdFile psdFile) { Debug.WriteLine("Layer started at " + reader.BaseStream.Position.ToString()); m_psdFile = psdFile; m_rect = new Rectangle(); m_rect.Y = reader.ReadInt32(); m_rect.X = reader.ReadInt32(); m_rect.Height = reader.ReadInt32() - m_rect.Y; m_rect.Width = reader.ReadInt32() - m_rect.X; //----------------------------------------------------------------------- int numberOfChannels = reader.ReadUInt16(); this.m_channels.Clear(); for (int channel = 0; channel < numberOfChannels; channel++) { Channel ch = new Channel(reader, this); m_channels.Add(ch); m_sortedChannels.Add(ch.ID, ch); } //----------------------------------------------------------------------- string signature = new string(reader.ReadChars(4)); if (signature != "8BIM") throw (new IOException("Layer Channelheader error!")); m_blendModeKey = new string(reader.ReadChars(4)); m_opacity = reader.ReadByte(); m_clipping = reader.ReadByte() > 0; //----------------------------------------------------------------------- byte flags = reader.ReadByte(); m_flags = new BitVector32(flags); //----------------------------------------------------------------------- reader.ReadByte(); //padding //----------------------------------------------------------------------- Debug.WriteLine("Layer extraDataSize started at " + reader.BaseStream.Position.ToString()); // this is the total size of the MaskData, the BlendingRangesData, the // Name and the AdjustmentLayerInfo uint extraDataSize = reader.ReadUInt32(); // remember the start position for calculation of the // AdjustmentLayerInfo size long extraDataStartPosition = reader.BaseStream.Position; m_maskData = new Mask(reader, this); m_blendingRangesData = new BlendingRanges(reader, this); //----------------------------------------------------------------------- long namePosition = reader.BaseStream.Position; m_name = reader.ReadPascalString(); int paddingBytes =(int)((reader.BaseStream.Position - namePosition) % 4); Debug.Print("Layer {0} padding bytes after name", paddingBytes); reader.ReadBytes(paddingBytes); //----------------------------------------------------------------------- m_adjustmentInfo.Clear(); long adjustmentLayerEndPos = extraDataStartPosition + extraDataSize; while (reader.BaseStream.Position < adjustmentLayerEndPos) { try { AdjustmentLayerInfo ali = new AdjustmentLayerInfo(reader, this); if (ali.Key.Equals("lrFX")) { //A sub-key - we want to merge its sub-layer info items with this dict. m_adjustmentInfo.AddRange(new Effects(ali)._resources.Values); } else m_adjustmentInfo.Add(ali); // Just add the items } catch { reader.BaseStream.Position = adjustmentLayerEndPos; } } //----------------------------------------------------------------------- // make sure we are not on a wrong offset, so set the stream position // manually reader.BaseStream.Position = adjustmentLayerEndPos; }