Hello,
from other topics (and my own experience) when you try to inspect a descriptor you may run into 'legacyContentData' raw data.
As someone has suggested it may be the equivalent of the saved file - i.e. if you try to inspect a 'legacyContentData' from a Hue/Saturation adjustment layer, it may contain the same data as the .ahu file. So the PS File Format whitepaper could help deciphering it. Possibly.
Has someone come up with a 'legacyContentData' parser so far? (from the descriptor, not the File, or maybe both) - or something close to it that I could try to use as a base for further development?
Thank you!
Davide Barranca
'legacyContentData' parser
'legacyContentData' parser
I haven't seen a general parser for that key. I think the data in that key varies too much for a general parser to be worth the effort.
Here is my version of a hue/sat parser.Code: Select allgetHueSatAdjustment().colorized.hue;
function getHueSatAdjustment(){
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref).getList(stringIDToTypeID('adjustment')).getObjectValue(0);
var rawData = desc.getData(stringIDToTypeID('legacyContentData'));
var hueSatAdjustment = {};
hueSatAdjustment.isColorized = Boolean(readInteger(rawData, 2));
hueSatAdjustment.colorized = {};
hueSatAdjustment.colorized.hue = readAngle(rawData, 4);
hueSatAdjustment.colorized.sat = readInteger(rawData, 6);
hueSatAdjustment.colorized.brightness = readInteger(rawData, 8);
hueSatAdjustment.master = {};
hueSatAdjustment.master.hue = readInteger(rawData, 10);
hueSatAdjustment.master.sat = readInteger(rawData, 12);
hueSatAdjustment.master.brightness = readInteger(rawData, 14);
hueSatAdjustment.reds = {};
hueSatAdjustment.reds.beginRamp = readInteger(rawData, 16);
hueSatAdjustment.reds.beginSustain = readInteger(rawData, 18);
hueSatAdjustment.reds.endSustain = readInteger(rawData, 20);
hueSatAdjustment.reds.endRamp = readInteger(rawData, 22);
hueSatAdjustment.reds.hue = readInteger(rawData, 24);
hueSatAdjustment.reds.sat = readInteger(rawData, 26);
hueSatAdjustment.reds.brightness = readInteger(rawData, 28);
hueSatAdjustment.yellows = {};
hueSatAdjustment.yellows.beginRamp = readInteger(rawData, 30);
hueSatAdjustment.yellows.beginSustain = readInteger(rawData, 32);
hueSatAdjustment.yellows.endSustain = readInteger(rawData, 34);
hueSatAdjustment.yellows.endRamp = readInteger(rawData, 36);
hueSatAdjustment.yellows.hue = readInteger(rawData, 38);
hueSatAdjustment.yellows.sat = readInteger(rawData, 40);
hueSatAdjustment.yellows.brightness = readInteger(rawData, 42);
hueSatAdjustment.greens = {};
hueSatAdjustment.greens.beginRamp = readInteger(rawData, 44);
hueSatAdjustment.greens.beginSustain = readInteger(rawData, 46);
hueSatAdjustment.greens.endSustain = readInteger(rawData, 48);
hueSatAdjustment.greens.endRamp = readInteger(rawData, 50);
hueSatAdjustment.greens.hue = readInteger(rawData, 52);
hueSatAdjustment.greens.sat = readInteger(rawData, 54);
hueSatAdjustment.greens.brightness = readInteger(rawData, 56);
hueSatAdjustment.cyans = {};
hueSatAdjustment.cyans.beginRamp = readInteger(rawData, 58);
hueSatAdjustment.cyans.beginSustain = readInteger(rawData, 60);
hueSatAdjustment.cyans.endSustain = readInteger(rawData, 62);
hueSatAdjustment.cyans.endRamp = readInteger(rawData, 64);
hueSatAdjustment.cyans.hue = readInteger(rawData, 66);
hueSatAdjustment.cyans.sat = readInteger(rawData, 68);
hueSatAdjustment.cyans.brightness = readInteger(rawData, 70);
hueSatAdjustment.blues = {};
hueSatAdjustment.blues.beginRamp = readInteger(rawData, 72);
hueSatAdjustment.blues.beginSustain = readInteger(rawData, 74);
hueSatAdjustment.blues.endSustain = readInteger(rawData, 76);
hueSatAdjustment.blues.endRamp = readInteger(rawData, 78);
hueSatAdjustment.blues.hue = readInteger(rawData, 80);
hueSatAdjustment.blues.sat = readInteger(rawData, 82);
hueSatAdjustment.blues.brightness = readInteger(rawData, 84);
hueSatAdjustment.magentas = {};
hueSatAdjustment.magentas.beginRamp = readInteger(rawData, 86);
hueSatAdjustment.magentas.beginSustain = readInteger(rawData, 88);
hueSatAdjustment.magentas.endSustain = readInteger(rawData, 90);
hueSatAdjustment.magentas.endRamp = readInteger(rawData, 92);
hueSatAdjustment.magentas.hue = readInteger(rawData, 94);
hueSatAdjustment.magentas.sat = readInteger(rawData, 96);
hueSatAdjustment.magentas.brightness = readInteger(rawData, 98);
return hueSatAdjustment;
};
function readInteger(str, pointer) {
var byte1 = str.charCodeAt(pointer);
var byte2 = str.charCodeAt(pointer + 1);
var singedsShort = (byte1 <<8) + byte2;
if (singedsShort > 0x7FFF) {
singedsShort = 0xFFFF0000 ^ singedsShort;
}
return singedsShort;
}
function readAngle(str, pointer) {
var b1 = str.charCodeAt(pointer);
var b2 = str.charCodeAt(pointer+1);
if(b1==0){
var ss = b2;
}else{
var ss = b2+104;//???
}
return ss;
};Note that was done before Adobe made the PS File Format spec available again and I couldn't find any data about the hue/sat preset file in the Photoshop 6 version I had on hand at the time.
Some of the preset file formats are a little different than the data in the descriptor for that layer type. But I think that is because some of the preset files have headers that the descriptor doesn't need.
Here is my version of a hue/sat parser.Code: Select allgetHueSatAdjustment().colorized.hue;
function getHueSatAdjustment(){
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref).getList(stringIDToTypeID('adjustment')).getObjectValue(0);
var rawData = desc.getData(stringIDToTypeID('legacyContentData'));
var hueSatAdjustment = {};
hueSatAdjustment.isColorized = Boolean(readInteger(rawData, 2));
hueSatAdjustment.colorized = {};
hueSatAdjustment.colorized.hue = readAngle(rawData, 4);
hueSatAdjustment.colorized.sat = readInteger(rawData, 6);
hueSatAdjustment.colorized.brightness = readInteger(rawData, 8);
hueSatAdjustment.master = {};
hueSatAdjustment.master.hue = readInteger(rawData, 10);
hueSatAdjustment.master.sat = readInteger(rawData, 12);
hueSatAdjustment.master.brightness = readInteger(rawData, 14);
hueSatAdjustment.reds = {};
hueSatAdjustment.reds.beginRamp = readInteger(rawData, 16);
hueSatAdjustment.reds.beginSustain = readInteger(rawData, 18);
hueSatAdjustment.reds.endSustain = readInteger(rawData, 20);
hueSatAdjustment.reds.endRamp = readInteger(rawData, 22);
hueSatAdjustment.reds.hue = readInteger(rawData, 24);
hueSatAdjustment.reds.sat = readInteger(rawData, 26);
hueSatAdjustment.reds.brightness = readInteger(rawData, 28);
hueSatAdjustment.yellows = {};
hueSatAdjustment.yellows.beginRamp = readInteger(rawData, 30);
hueSatAdjustment.yellows.beginSustain = readInteger(rawData, 32);
hueSatAdjustment.yellows.endSustain = readInteger(rawData, 34);
hueSatAdjustment.yellows.endRamp = readInteger(rawData, 36);
hueSatAdjustment.yellows.hue = readInteger(rawData, 38);
hueSatAdjustment.yellows.sat = readInteger(rawData, 40);
hueSatAdjustment.yellows.brightness = readInteger(rawData, 42);
hueSatAdjustment.greens = {};
hueSatAdjustment.greens.beginRamp = readInteger(rawData, 44);
hueSatAdjustment.greens.beginSustain = readInteger(rawData, 46);
hueSatAdjustment.greens.endSustain = readInteger(rawData, 48);
hueSatAdjustment.greens.endRamp = readInteger(rawData, 50);
hueSatAdjustment.greens.hue = readInteger(rawData, 52);
hueSatAdjustment.greens.sat = readInteger(rawData, 54);
hueSatAdjustment.greens.brightness = readInteger(rawData, 56);
hueSatAdjustment.cyans = {};
hueSatAdjustment.cyans.beginRamp = readInteger(rawData, 58);
hueSatAdjustment.cyans.beginSustain = readInteger(rawData, 60);
hueSatAdjustment.cyans.endSustain = readInteger(rawData, 62);
hueSatAdjustment.cyans.endRamp = readInteger(rawData, 64);
hueSatAdjustment.cyans.hue = readInteger(rawData, 66);
hueSatAdjustment.cyans.sat = readInteger(rawData, 68);
hueSatAdjustment.cyans.brightness = readInteger(rawData, 70);
hueSatAdjustment.blues = {};
hueSatAdjustment.blues.beginRamp = readInteger(rawData, 72);
hueSatAdjustment.blues.beginSustain = readInteger(rawData, 74);
hueSatAdjustment.blues.endSustain = readInteger(rawData, 76);
hueSatAdjustment.blues.endRamp = readInteger(rawData, 78);
hueSatAdjustment.blues.hue = readInteger(rawData, 80);
hueSatAdjustment.blues.sat = readInteger(rawData, 82);
hueSatAdjustment.blues.brightness = readInteger(rawData, 84);
hueSatAdjustment.magentas = {};
hueSatAdjustment.magentas.beginRamp = readInteger(rawData, 86);
hueSatAdjustment.magentas.beginSustain = readInteger(rawData, 88);
hueSatAdjustment.magentas.endSustain = readInteger(rawData, 90);
hueSatAdjustment.magentas.endRamp = readInteger(rawData, 92);
hueSatAdjustment.magentas.hue = readInteger(rawData, 94);
hueSatAdjustment.magentas.sat = readInteger(rawData, 96);
hueSatAdjustment.magentas.brightness = readInteger(rawData, 98);
return hueSatAdjustment;
};
function readInteger(str, pointer) {
var byte1 = str.charCodeAt(pointer);
var byte2 = str.charCodeAt(pointer + 1);
var singedsShort = (byte1 <<8) + byte2;
if (singedsShort > 0x7FFF) {
singedsShort = 0xFFFF0000 ^ singedsShort;
}
return singedsShort;
}
function readAngle(str, pointer) {
var b1 = str.charCodeAt(pointer);
var b2 = str.charCodeAt(pointer+1);
if(b1==0){
var ss = b2;
}else{
var ss = b2+104;//???
}
return ss;
};Note that was done before Adobe made the PS File Format spec available again and I couldn't find any data about the hue/sat preset file in the Photoshop 6 version I had on hand at the time.
Some of the preset file formats are a little different than the data in the descriptor for that layer type. But I think that is because some of the preset files have headers that the descriptor doesn't need.
'legacyContentData' parser
Thank you Mike!
I'll get a look at it as soon as possible - my problem was to parse binary data so your example is really useful.
I'll let you know if/when I'll hit some comprehension-wall
Best
Davide
I'll get a look at it as soon as possible - my problem was to parse binary data so your example is really useful.
I'll let you know if/when I'll hit some comprehension-wall
Best
Davide
'legacyContentData' parser
Fascinating stuff, the readInteger() function!
I don't understand it, but as long as it works... does it comes from Xtools or it's your own?
Davide
I don't understand it, but as long as it works... does it comes from Xtools or it's your own?
Davide
'legacyContentData' parser
I am not sure if it came from Xbytor or a Google search. Or because of the typos in 'singedsShort' it could be something I wrote. It should have a better name as it doesn't exactly read an integer. It reads a two byte signed integer.
'legacyContentData' parser
Speaking of parsers and binary files, I've run into a nice little OSX app called "Synalize It" which has a build it so-called "grammar" for PS Curves.
Basically it parses the acv file and orders/shows the values in a tree, using the grammar file as a reference. The grammar is nothing else but a set of rules extracted (in this case) from the PS File Format page - shouldn't be difficult to make grammars for other filetypes.
(as a side note, I can't get why in a Curves preset there are 5 curves: I can understand 1 for the composite, 1+1+1 for the RGB channels, but the last one? Just a curiosity)
Davide
Basically it parses the acv file and orders/shows the values in a tree, using the grammar file as a reference. The grammar is nothing else but a set of rules extracted (in this case) from the PS File Format page - shouldn't be difficult to make grammars for other filetypes.
(as a side note, I can't get why in a Curves preset there are 5 curves: I can understand 1 for the composite, 1+1+1 for the RGB channels, but the last one? Just a curiosity)
Davide