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; } } }
public static DynVal ReadValue(BinaryReverseReader r, bool skipKey) { DynVal vt = new DynVal(); if (!skipKey) { vt.Name = GetMeaningOfFourCC(ReadSpecialString(r)); } //TODO: should be assigned a sequential number? vt.Type = parseTypeString(new string(r.ReadPSDChars(4))); switch (vt.Type) { case OSType.tdta: uint unknown = r.ReadUInt32(); TdTaParser p = new TdTaParser(r); object o = p.ParseOneTree(); vt.Value = o; break; case OSType.Descriptor: vt = DynVal.ReadDescriptor(r); break; case OSType.List: vt.Children = ReadValues(r, true); break; case OSType.Double: vt.Value = r.ReadDouble(); break; case OSType.UnitFloat: //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.ReadDouble(); tst += ": " + d; vt.Value = tst; break; case OSType.Enumerated: 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 OSType.Integer: vt.Value = r.ReadInt32(); //4 byte integer break; case OSType.Boolean: vt.Value = r.ReadBoolean(); break; case OSType.String: vt.Value = r.ReadPSDUnicodeString(); break; default: throw new Exception("Unhandled type: " + vt.Type); } return(vt); }
public static DynVal ReadValue(BinaryReverseReader r, bool skipKey) { DynVal vt = new DynVal(); if (!skipKey) vt.Name = GetMeaningOfFourCC(ReadSpecialString(r)); //TODO: should be assigned a sequential number? vt.Type = parseTypeString(new string(r.ReadPSDChars(4))); switch (vt.Type) { case OSType.tdta: uint unknown = r.ReadUInt32(); TdTaParser p = new TdTaParser(r); object o = p.ParseOneTree(); vt.Value = o; break; case OSType.Descriptor: vt = DynVal.ReadDescriptor(r); break; case OSType.List: vt.Children = ReadValues(r,true); break; case OSType.Double: vt.Value = r.ReadDouble(); break; case OSType.UnitFloat: //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.ReadDouble(); tst += ": " + d; vt.Value = tst; break; case OSType.Enumerated: 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 OSType.Integer: vt.Value = r.ReadInt32(); //4 byte integer break; case OSType.Boolean: vt.Value = r.ReadBoolean(); break; case OSType.String: vt.Value = r.ReadPSDUnicodeString(); break; default: throw new Exception("Unhandled type: " + vt.Type); } return vt; }
public PsdBoolean(BinaryReverseReader stream) { value = stream.ReadBoolean(); }
//图层效果相关 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); }