'legacyContentData' parser

Discussion of Photoshop Scripting, Photoshop Actions and Photoshop Automation in General

Moderators: Tom, Kukurykus

undavide

'legacyContentData' parser

Post by undavide »

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

Professional AI Audio Generation within Adobe Premiere Pro - Download Free Plugin here

Mike Hale

'legacyContentData' parser

Post by Mike Hale »

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.
undavide

'legacyContentData' parser

Post by undavide »

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
undavide

'legacyContentData' parser

Post by undavide »

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
Mike Hale

'legacyContentData' parser

Post by Mike Hale »

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.
undavide

'legacyContentData' parser

Post by undavide »

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