aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormeltingice <meltingice8917@gmail.com>2012-07-17 22:26:40 -0400
committermeltingice <meltingice8917@gmail.com>2012-07-17 22:26:40 -0400
commitad2fb87c7c1d1ddf99f895cfa1a0b8660f70672e (patch)
tree7eed2e8ff7e0b67cb4dd1cf2de210fda78bfd91b
parentFix layer name parsing bug and add solid color layer data (diff)
downloadpsd.js-ad2fb87c7c1d1ddf99f895cfa1a0b8660f70672e.tar.xz
psd.js-ad2fb87c7c1d1ddf99f895cfa1a0b8660f70672e.zip
Added support for 6 more additional layer settings
-rwxr-xr-xCakefile6
-rw-r--r--lib/psd.js174
-rw-r--r--lib/psd.min.js28
-rw-r--r--src/layerdata/blackwhite.coffee9
-rw-r--r--src/layerdata/exposure.coffee11
-rw-r--r--src/layerdata/gradient.coffee9
-rw-r--r--src/layerdata/pattern.coffee9
-rw-r--r--src/layerdata/photofilter.coffee17
-rwxr-xr-xsrc/layerdata/typetool.coffee2
-rw-r--r--src/layerdata/vibrance.coffee9
-rw-r--r--src/psddescriptor.coffee8
-rwxr-xr-xsrc/psdlayer.coffee28
12 files changed, 272 insertions, 38 deletions
diff --git a/Cakefile b/Cakefile
index 6023d76..d01ab6b 100755
--- a/Cakefile
+++ b/Cakefile
@@ -34,18 +34,24 @@ coffeeFiles = [
"psdlayer"
"psdlayermask"
+ "layerdata/blackwhite"
"layerdata/brightnesscontrast"
"layerdata/colorbalance"
"layerdata/curves"
+ "layerdata/exposure"
+ "layerdata/gradient"
"layerdata/huesaturation"
"layerdata/invert"
"layerdata/layereffect"
"layerdata/levels"
+ "layerdata/pattern"
+ "layerdata/photofilter"
"layerdata/posterize"
"layerdata/selectivecolor"
"layerdata/solidcolor"
"layerdata/threshold"
"layerdata/typetool"
+ "layerdata/vibrance"
"psdresource"
"util"
diff --git a/lib/psd.js b/lib/psd.js
index fe2e9d3..93ac499 100644
--- a/lib/psd.js
+++ b/lib/psd.js
@@ -307,7 +307,7 @@ var jspack = new JSPack(); ;
END DEPENDENCIES
*/
- var Log, PSD, PSDBrightnessContrast, PSDChannelImage, PSDColor, PSDColorBalance, PSDCurves, PSDDescriptor, PSDDropDownLayerEffect, PSDFile, PSDHeader, PSDHueSaturation, PSDImage, PSDInvert, PSDLayer, PSDLayerEffect, PSDLayerEffectCommonStateInfo, PSDLayerMask, PSDLevels, PSDPosterize, PSDResource, PSDSelectiveColor, PSDSolidColor, PSDThreshold, PSDTypeTool, Root, Util, assert, fs,
+ var Log, PSD, PSDBlackWhite, PSDBrightnessContrast, PSDChannelImage, PSDColor, PSDColorBalance, PSDCurves, PSDDescriptor, PSDDropDownLayerEffect, PSDExposure, PSDFile, PSDGradient, PSDHeader, PSDHueSaturation, PSDImage, PSDInvert, PSDLayer, PSDLayerEffect, PSDLayerEffectCommonStateInfo, PSDLayerMask, PSDLevels, PSDPattern, PSDPhotoFilter, PSDPosterize, PSDResource, PSDSelectiveColor, PSDSolidColor, PSDThreshold, PSDTypeTool, PSDVibrance, Root, Util, assert, fs,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
@@ -998,20 +998,20 @@ var jspack = new JSPack(); ;
function PSDDescriptor(file) {
this.file = file;
- this.data = {};
}
PSDDescriptor.prototype.parse = function() {
- var i, item, numItems, _i;
+ var data, i, item, numItems, _i;
Log.debug("Parsing descriptor...");
- this.data["class"] = this.parseClass();
+ data = {};
+ data["class"] = this.parseClass();
numItems = this.file.readInt();
Log.debug("Descriptor contains " + numItems + " items");
for (i = _i = 0; 0 <= numItems ? _i < numItems : _i > numItems; i = 0 <= numItems ? ++_i : --_i) {
item = this.parseKeyItem();
- this.data[item.id] = item.value;
+ data[item.id] = item.value;
}
- return this.data;
+ return data;
};
PSDDescriptor.prototype.parseID = function() {
@@ -2378,6 +2378,16 @@ var jspack = new JSPack(); ;
switch (key) {
case "SoCo":
this.adjustments.solidColor = (new PSDSolidColor(this, length)).parse();
+ console.log("SoCo:", this.adjustments.solidColor);
+ break;
+ case "GdFl":
+ this.adjustments.gradient = (new PSDGradient(this, length)).parse();
+ break;
+ case "PtFl":
+ this.adjustments.pattern = (new PSDPattern(this, length)).parse();
+ break;
+ case "brit":
+ this.adjustments.brightnessContrast = (new PSDBrightnessContrast(this, length)).parse();
break;
case "levl":
this.adjustments.levels = (new PSDLevels(this, length)).parse();
@@ -2385,17 +2395,23 @@ var jspack = new JSPack(); ;
case "curv":
this.adjustments.curves = (new PSDCurves(this, length)).parse();
break;
- case "brit":
- this.adjustments.brightnessContrast = (new PSDBrightnessContrast(this, length)).parse();
+ case "expA":
+ this.adjustments.exposure = (new PSDExposure(this, length)).parse();
break;
- case "blnc":
- this.adjustments.colorBalance = (new PSDColorBalance(this, length)).parse();
+ case "vibA":
+ this.adjustments.vibrance = (new PSDVibrance(this, length)).parse();
break;
case "hue2":
this.adjustments.hueSaturation = (new PSDHueSaturation(this, length)).parse();
break;
- case "selc":
- this.adjustments.selectiveColor = (new PSDSelectiveColor(this, length)).parse();
+ case "blnc":
+ this.adjustments.colorBalance = (new PSDColorBalance(this, length)).parse();
+ break;
+ case "blwh":
+ this.adjustments.blackWhite = (new PSDBlackWhite(this, length)).parse();
+ break;
+ case "phfl":
+ this.adjustments.photoFilter = (new PSDPhotoFilter(this, length)).parse();
break;
case "thrs":
this.adjustments.threshold = (new PSDThreshold(this, length)).parse();
@@ -2413,7 +2429,7 @@ var jspack = new JSPack(); ;
this.adjustments.typeTool = (new PSDTypeTool(this, length)).parse();
break;
case "luni":
- this.name = this.file.readUnicodeString(Util.pad4);
+ this.name = this.file.readUnicodeString();
this.file.seek(pos + length, false);
break;
case "lyid":
@@ -2426,6 +2442,9 @@ var jspack = new JSPack(); ;
this.parseEffectsLayer();
this.file.read(2);
break;
+ case "selc":
+ this.adjustments.selectiveColor = (new PSDSelectiveColor(this, length)).parse();
+ break;
default:
this.file.seek(length);
Log.debug("Skipping additional layer info with key " + key);
@@ -2489,7 +2508,7 @@ var jspack = new JSPack(); ;
PSDLayer.prototype.toJSON = function() {
var data, section, sections, _i, _len;
- sections = ['name', 'top', 'left', 'bottom', 'right', 'channels', 'rows', 'cols', 'channelsInfo', 'mask', 'layerType', 'blendMode', 'adjustments', 'visible'];
+ sections = ['name', 'legacyName', 'top', 'left', 'bottom', 'right', 'channels', 'rows', 'cols', 'channelsInfo', 'mask', 'layerType', 'blendMode', 'adjustments', 'visible'];
data = {};
for (_i = 0, _len = sections.length; _i < _len; _i++) {
section = sections[_i];
@@ -2637,6 +2656,25 @@ var jspack = new JSPack(); ;
})();
+ PSDBlackWhite = (function() {
+
+ function PSDBlackWhite(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDBlackWhite.prototype.parse = function() {
+ var version;
+ version = this.file.readInt();
+ assert(version === 16);
+ return (new PSDDescriptor(this.file)).parse();
+ };
+
+ return PSDBlackWhite;
+
+ })();
+
PSDBrightnessContrast = (function() {
function PSDBrightnessContrast(layer, length) {
@@ -2760,6 +2798,48 @@ var jspack = new JSPack(); ;
})();
+ PSDExposure = (function() {
+
+ function PSDExposure(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDExposure.prototype.parse = function() {
+ var version;
+ version = this.file.parseInt();
+ assert(version === 1);
+ return {
+ exposure: this.file.parseInt(),
+ offset: this.file.parseInt(),
+ gamma: this.file.parseInt()
+ };
+ };
+
+ return PSDExposure;
+
+ })();
+
+ PSDGradient = (function() {
+
+ function PSDGradient(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDGradient.prototype.parse = function() {
+ var version;
+ version = this.file.readInt();
+ assert(version === 16);
+ return (new PSDDescriptor(this.file)).parse();
+ };
+
+ return PSDGradient;
+
+ })();
+
PSDHueSaturation = (function() {
function PSDHueSaturation(layer, length) {
@@ -2959,6 +3039,52 @@ var jspack = new JSPack(); ;
})();
+ PSDPattern = (function() {
+
+ function PSDPattern(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDPattern.prototype.parse = function() {
+ var version;
+ version = this.file.parseInt();
+ assert(version === 16);
+ return (new PSDDescriptor(this.file)).parse();
+ };
+
+ return PSDPattern;
+
+ })();
+
+ PSDPhotoFilter = (function() {
+
+ function PSDPhotoFilter(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDPhotoFilter.prototype.parse = function() {
+ var data, version;
+ version = this.file.parseInt();
+ assert(version === 3);
+ data = {};
+ data.color = {
+ x: this.file.readInt(),
+ y: this.file.readInt(),
+ z: this.file.readInt()
+ };
+ data.density = this.file.readInt();
+ data.preserveLuminosity = this.file.readBoolean();
+ return data;
+ };
+
+ return PSDPhotoFilter;
+
+ })();
+
PSDPosterize = (function() {
function PSDPosterize(layer, length) {
@@ -3088,7 +3214,6 @@ var jspack = new JSPack(); ;
descriptorVersion = this.file.readInt();
assert(descriptorVersion === 16);
this.data.warp = (new PSDDescriptor(this.file)).parse();
- Log.debug("Warp:", this.data.warp);
_ref2 = this.file.readf(">4d"), this.data.left = _ref2[0], this.data.top = _ref2[1], this.data.right = _ref2[2], this.data.bottom = _ref2[3];
return this.data;
};
@@ -3153,6 +3278,25 @@ var jspack = new JSPack(); ;
})();
+ PSDVibrance = (function() {
+
+ function PSDVibrance(layer, length) {
+ this.layer = layer;
+ this.length = length;
+ this.file = this.layer.file;
+ }
+
+ PSDVibrance.prototype.parse = function() {
+ var version;
+ version = this.file.readInt();
+ assert(version === 16);
+ return (new PSDDescriptor(this.file)).parse();
+ };
+
+ return PSDVibrance;
+
+ })();
+
PSDResource = (function() {
var RESOURCE_DESCRIPTIONS;
diff --git a/lib/psd.min.js b/lib/psd.min.js
index 1d21ce4..b6d966b 100644
--- a/lib/psd.min.js
+++ b/lib/psd.min.js
@@ -69,7 +69,7 @@ return a;};m.Pack=function(fmt,values)
{return this.PackTo(fmt,new Array(this.CalcLength(fmt)),0,values);};m.CalcLength=function(fmt)
{var re=new RegExp(this._sPattern,'g'),m,sum=0;while(m=re.exec(fmt))
{sum+=(((m[1]==undefined)||(m[1]==''))?1:parseInt(m[1]))*this._lenLut[m[2]];}
-return sum;};};var jspack=new JSPack();;var Log,PSD,PSDBrightnessContrast,PSDChannelImage,PSDColor,PSDColorBalance,PSDCurves,PSDDescriptor,PSDDropDownLayerEffect,PSDFile,PSDHeader,PSDHueSaturation,PSDImage,PSDInvert,PSDLayer,PSDLayerEffect,PSDLayerEffectCommonStateInfo,PSDLayerMask,PSDLevels,PSDPosterize,PSDResource,PSDSelectiveColor,PSDSolidColor,PSDThreshold,PSDTypeTool,Root,Util,assert,fs,__hasProp={}.hasOwnProperty,__extends=function(child,parent){for(var key in parent){if(__hasProp.call(parent,key))child[key]=parent[key];}function ctor(){this.constructor=child;}ctor.prototype=parent.prototype;child.prototype=new ctor();child.__super__=parent.prototype;return child;};assert=(function(assert){if(typeof exports!=="undefined"&&exports!==null){return require('assert');}
+return sum;};};var jspack=new JSPack();;var Log,PSD,PSDBlackWhite,PSDBrightnessContrast,PSDChannelImage,PSDColor,PSDColorBalance,PSDCurves,PSDDescriptor,PSDDropDownLayerEffect,PSDExposure,PSDFile,PSDGradient,PSDHeader,PSDHueSaturation,PSDImage,PSDInvert,PSDLayer,PSDLayerEffect,PSDLayerEffectCommonStateInfo,PSDLayerMask,PSDLevels,PSDPattern,PSDPhotoFilter,PSDPosterize,PSDResource,PSDSelectiveColor,PSDSolidColor,PSDThreshold,PSDTypeTool,PSDVibrance,Root,Util,assert,fs,__hasProp={}.hasOwnProperty,__extends=function(child,parent){for(var key in parent){if(__hasProp.call(parent,key))child[key]=parent[key];}function ctor(){this.constructor=child;}ctor.prototype=parent.prototype;child.prototype=new ctor();child.__super__=parent.prototype;return child;};assert=(function(assert){if(typeof exports!=="undefined"&&exports!==null){return require('assert');}
assert=function(test){if(test!==true){throw"Assertion error";}};assert.equal=function(actual,expected){if(actual!==expected){throw"Assertion error";}};return assert;})(assert);if(typeof exports!=="undefined"&&exports!==null){Root=exports;fs=require('fs');}else{Root=window;}
Root.PSD=PSD=(function(){PSD.VERSION="0.4.4";PSD.DEBUG=false;PSD.fromFile=function(file,cb){var data,reader;if(cb==null){cb=function(){};}
if(typeof exports!=="undefined"&&exports!==null){data=fs.readFileSync(file);return new PSD(data);}else{reader=new FileReader();reader.onload=function(f){var bytes,psd;bytes=new Uint8Array(f.target.result);psd=new PSD(bytes);return cb(psd);};return reader.readAsArrayBuffer(file);}};PSD.fromURL=function(url,cb){var xhr;if(cb==null){cb=function(){};}
@@ -124,9 +124,9 @@ return{x:x*95.047,y:y*100.0,z:z*108.883};};PSDColor.labToRGB=function(l,a,b){var
m1=2*brightness-m2;r=this.hueToColor(hue+120,m1,m2);g=this.hueToColor(hue,m1,m2);b=this.hueToColor(hue-120,m1,m2);}
return this.argbToColor(alpha,r,g,b);};PSDColor.hueToColor=function(hue,m1,m2){var v;hue%=360;if(hue<60){v=m1+(m2-m1)*hue/60;}else if(hue<180){v=m2;}else if(hue<240){v=m1+(m2-m1)*(240-hue)/60;}else{v=m1;}
return v*255;};PSDColor.cmykToColor=function(cyan,magenta,yellow,black){var b,g,r;r=1-(cyan*(1-black)+black)*255;g=1-(magenta*(1-black)+black)*255;b=1-(yellow*(1-black)+black)*255;r=Util.clamp(r,0,255);g=Util.clamp(g,0,255);b=Util.clamp(b,0,255);return this.rgbToColor(r,g,b);};PSDColor.labToColor=function(l,a,b){return this.alabToColor(255,l,a,b);};PSDColor.alabToColor=function(alpha,lightness,a,b){var xyz;xyz=this.labToXYZ(lightness,a,b);return this.axyzToColor(alpha,xyz.x,xyz.y,xyz.z);};PSDColor.axyzToColor=function(alpha,x,y,z){var rgb;rgb=this.xyzToRGB(x,y,z);return this.argbToColor(alpha,rgb.r,rgb.g,rgb.b);};PSDColor.colorSpaceToARGB=function(colorSpace,colorComponent){var dstColor;switch(colorSpace){case 0:dstColor=this.rgbToColor(colorComponent[0],colorComponent[1],colorComponent[2]);break;case 1:dstColor=this.hsbToColor(colorComponent[0],colorComponent[1]/100.0,colorComponent[2]/100.0);break;case 2:dstColor=this.cmykToColor(colorComponent[0]/100.0,colorComponent[1]/100.0,colorComponent[2]/100.0,colorComponent[3]/100.0);break;case 7:dstColor=this.labToColor(colorComponent[0],colorComponent[1],colorComponent[2]);break;default:dstColor=0x00FFFFFF;}
-return dstColor;};return PSDColor;})();PSDDescriptor=(function(){function PSDDescriptor(file){this.file=file;this.data={};}
-PSDDescriptor.prototype.parse=function(){var i,item,numItems,_i;Log.debug("Parsing descriptor...");this.data["class"]=this.parseClass();numItems=this.file.readInt();Log.debug("Descriptor contains "+numItems+" items");for(i=_i=0;0<=numItems?_i<numItems:_i>numItems;i=0<=numItems?++_i:--_i){item=this.parseKeyItem();this.data[item.id]=item.value;}
-return this.data;};PSDDescriptor.prototype.parseID=function(){var len;len=this.file.readInt();if(len===0){return this.file.readInt();}else{return this.file.readString(len);}};PSDDescriptor.prototype.parseClass=function(){return{name:this.file.readUnicodeString(),id:this.parseID()};};PSDDescriptor.prototype.parseKeyItem=function(){return{id:this.parseID(),value:this.parseItem()};};PSDDescriptor.prototype.parseItem=function(){var type,value;type=this.file.readString(4);Log.debug("Found descriptor type: "+type);value=(function(){switch(type){case'bool':return this.parseBoolean();case'type':case'GlbC':return this.parseClass();case'Objc':case'GlbO':return this.parse();case'doub':return this.parseDouble();case'enum':return this.parseEnum();case'alis':return this.parseAlias();case'Pth ':return this.parseFilePath();case'long':return this.parseInteger();case'comp':return this.parseLargeInteger();case'VlLs':return this.parseList();case'ObAr':return this.parseObjectArray();case'tdta':return this.parseRawData();case'obj ':return this.parseReference();case'TEXT':return this.file.readUnicodeString();case'UntF':return this.parseUnitDouble();}}).call(this);return value;};PSDDescriptor.prototype.parseBoolean=function(){return this.file.readBoolean();};PSDDescriptor.prototype.parseDouble=function(){return this.file.readDouble();};PSDDescriptor.prototype.parseInteger=function(){return this.file.readInt();};PSDDescriptor.prototype.parseLargeInteger=function(){return this.file.readLongLong();};PSDDescriptor.prototype.parseIdentifier=function(){return this.file.readInt();};PSDDescriptor.prototype.parseIndex=function(){return this.file.readInt();};PSDDescriptor.prototype.parseOffset=function(){return this.file.readInt();};PSDDescriptor.prototype.parseProperty=function(){return this.parseID();};PSDDescriptor.prototype.parseEnum=function(){this.parseID();return this.parseID();};PSDDescriptor.prototype.parseAlias=function(){var len;len=this.file.readInt();return this.file.read(len);};PSDDescriptor.prototype.parseFilePath=function(){var charBytes,len,numChars,path,pathSize,sig,_ref;len=this.file.readInt();_ref=this.file.readf("<4s2i"),sig=_ref[0],pathSize=_ref[1],numChars=_ref[2];charBytes=numChars*2;path=this.file.read(charBytes);return{sig:sig,path:path};};PSDDescriptor.prototype.parseList=function(){var i,items,numItems,_i;numItems=this.file.readInt();items=[];for(i=_i=0;0<=numItems?_i<numItems:_i>numItems;i=0<=numItems?++_i:--_i){items.push(this.parseItem());}
+return dstColor;};return PSDColor;})();PSDDescriptor=(function(){function PSDDescriptor(file){this.file=file;}
+PSDDescriptor.prototype.parse=function(){var data,i,item,numItems,_i;Log.debug("Parsing descriptor...");data={};data["class"]=this.parseClass();numItems=this.file.readInt();Log.debug("Descriptor contains "+numItems+" items");for(i=_i=0;0<=numItems?_i<numItems:_i>numItems;i=0<=numItems?++_i:--_i){item=this.parseKeyItem();data[item.id]=item.value;}
+return data;};PSDDescriptor.prototype.parseID=function(){var len;len=this.file.readInt();if(len===0){return this.file.readInt();}else{return this.file.readString(len);}};PSDDescriptor.prototype.parseClass=function(){return{name:this.file.readUnicodeString(),id:this.parseID()};};PSDDescriptor.prototype.parseKeyItem=function(){return{id:this.parseID(),value:this.parseItem()};};PSDDescriptor.prototype.parseItem=function(){var type,value;type=this.file.readString(4);Log.debug("Found descriptor type: "+type);value=(function(){switch(type){case'bool':return this.parseBoolean();case'type':case'GlbC':return this.parseClass();case'Objc':case'GlbO':return this.parse();case'doub':return this.parseDouble();case'enum':return this.parseEnum();case'alis':return this.parseAlias();case'Pth ':return this.parseFilePath();case'long':return this.parseInteger();case'comp':return this.parseLargeInteger();case'VlLs':return this.parseList();case'ObAr':return this.parseObjectArray();case'tdta':return this.parseRawData();case'obj ':return this.parseReference();case'TEXT':return this.file.readUnicodeString();case'UntF':return this.parseUnitDouble();}}).call(this);return value;};PSDDescriptor.prototype.parseBoolean=function(){return this.file.readBoolean();};PSDDescriptor.prototype.parseDouble=function(){return this.file.readDouble();};PSDDescriptor.prototype.parseInteger=function(){return this.file.readInt();};PSDDescriptor.prototype.parseLargeInteger=function(){return this.file.readLongLong();};PSDDescriptor.prototype.parseIdentifier=function(){return this.file.readInt();};PSDDescriptor.prototype.parseIndex=function(){return this.file.readInt();};PSDDescriptor.prototype.parseOffset=function(){return this.file.readInt();};PSDDescriptor.prototype.parseProperty=function(){return this.parseID();};PSDDescriptor.prototype.parseEnum=function(){this.parseID();return this.parseID();};PSDDescriptor.prototype.parseAlias=function(){var len;len=this.file.readInt();return this.file.read(len);};PSDDescriptor.prototype.parseFilePath=function(){var charBytes,len,numChars,path,pathSize,sig,_ref;len=this.file.readInt();_ref=this.file.readf("<4s2i"),sig=_ref[0],pathSize=_ref[1],numChars=_ref[2];charBytes=numChars*2;path=this.file.read(charBytes);return{sig:sig,path:path};};PSDDescriptor.prototype.parseList=function(){var i,items,numItems,_i;numItems=this.file.readInt();items=[];for(i=_i=0;0<=numItems?_i<numItems:_i>numItems;i=0<=numItems?++_i:--_i){items.push(this.parseItem());}
return items;};PSDDescriptor.prototype.parseObjectArray=function(){var i,item,itemsInObj,j,klass,numItems,obj,_i,_j;numItems=this.file.readInt();klass=this.parseClass();itemsInObj=this.file.readInt();obj=[];for(i=_i=0;0<=numItems?_i<numItems:_i>numItems;i=0<=numItems?++_i:--_i){item=[];for(j=_j=0;0<=itemsInObj?_j<itemsInObj:_j>itemsInObj;j=0<=itemsInObj?++_j:--_j){item.push(this.parseObjectArray());}
obj.push(item);}
return obj;};PSDDescriptor.prototype.parseObjectArray=function(){var i,id,num,type,unitID,values,_i;id=this.parseID();type=this.file.readString(4);unitID=this.file.readString();num=this.file.readInt();values=[];for(i=_i=0;0<=num?_i<num:_i>num;i=0<=num?++_i:--_i){values.push(this.file.readDouble());}
@@ -218,10 +218,10 @@ return _results;};PSDLayer.prototype.parseBlendModes=function(){var filler,flags
this.blendingMode=this.blendMode.blender;this.opacity=this.blendMode.opacity;this.visible=this.blendMode.visible;return Log.debug("Blending mode:",this.blendMode);};PSDLayer.prototype.parseMaskData=function(){var flags,_ref,_ref1,_ref2,_ref3;this.mask.size=this.file.readInt();assert((_ref=this.mask.size)===36||_ref===20||_ref===0);if(this.mask.size===0){return true;}
_ref1=this.file.readf(">llllBB"),this.mask.top=_ref1[0],this.mask.left=_ref1[1],this.mask.bottom=_ref1[2],this.mask.right=_ref1[3],this.mask.defaultColor=_ref1[4],flags=_ref1[5];assert((_ref2=this.mask.defaultColor)===0||_ref2===255);this.mask.width=this.mask.right-this.mask.left;this.mask.height=this.mask.bottom-this.mask.top;this.mask.relative=flags&0x01;this.mask.disabled=(flags&(0x01<<1))>0;this.mask.invert=(flags&(0x01<<2))>0;if(this.mask.size===20){this.file.seek(2);}else{_ref3=this.file.readf(">BB"),flags=_ref3[0],this.mask.defaultColor=_ref3[1];this.mask.relative=flags&0x01;this.mask.disabled=(flags&(0x01<<1))>0;this.mask.invert=(flags&(0x01<<2))>0;this.file.seek(16);}
return true;};PSDLayer.prototype.parseBlendingRanges=function(){var i,length,pos,_i,_ref,_results;length=this.file.readInt();this.blendingRanges.grey={source:{black:this.file.readShortInt(),white:this.file.readShortInt()},dest:{black:this.file.readShortInt(),white:this.file.readShortInt()}};pos=this.file.tell();this.blendingRanges.numChannels=(length-8)/8;assert(this.blendingRanges.numChannels>0);this.blendingRanges.channels=[];_results=[];for(i=_i=0,_ref=this.blendingRanges.numChannels;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){_results.push(this.blendingRanges.channels.push({source:{black:this.file.readShortInt(),white:this.file.readShortInt()},dest:{black:this.file.readShortInt(),white:this.file.readShortInt()}}));}
-return _results;};PSDLayer.prototype.parseLegacyLayerName=function(){var namelen;namelen=Util.pad4(this.file.read(1)[0]);return this.legacyName=Util.decodeMacroman(this.file.read(namelen)).replace(/\u0000/g,'');};PSDLayer.prototype.parseExtraData=function(){var key,length,pos,signature,_ref,_results;_results=[];while(this.file.tell()<this.layerEnd){_ref=this.file.readf(">4s4s"),signature=_ref[0],key=_ref[1];assert.equal(signature,"8BIM");length=Util.pad2(this.file.readInt());pos=this.file.tell();Log.debug("Extra layer info: key = "+key+", length = "+length);switch(key){case"SoCo":this.adjustments.solidColor=(new PSDSolidColor(this,length)).parse();break;case"levl":this.adjustments.levels=(new PSDLevels(this,length)).parse();break;case"curv":this.adjustments.curves=(new PSDCurves(this,length)).parse();break;case"brit":this.adjustments.brightnessContrast=(new PSDBrightnessContrast(this,length)).parse();break;case"blnc":this.adjustments.colorBalance=(new PSDColorBalance(this,length)).parse();break;case"hue2":this.adjustments.hueSaturation=(new PSDHueSaturation(this,length)).parse();break;case"selc":this.adjustments.selectiveColor=(new PSDSelectiveColor(this,length)).parse();break;case"thrs":this.adjustments.threshold=(new PSDThreshold(this,length)).parse();break;case"nvrt":this.adjustments.invert=(new PSDInvert(this,length)).parse();break;case"post":this.adjustments.posterize=(new PSDPosterize(this,length)).parse();break;case"tySh":this.adjustments.typeTool=(new PSDTypeTool(this,length)).parse(true);break;case"TySh":this.adjustments.typeTool=(new PSDTypeTool(this,length)).parse();break;case"luni":this.name=this.file.readUnicodeString(Util.pad4);this.file.seek(pos+length,false);break;case"lyid":this.layerId=this.file.readInt();break;case"lsct":this.readLayerSectionDivider();break;case"lrFX":this.parseEffectsLayer();this.file.read(2);break;default:this.file.seek(length);Log.debug("Skipping additional layer info with key "+key);}
+return _results;};PSDLayer.prototype.parseLegacyLayerName=function(){var namelen;namelen=Util.pad4(this.file.read(1)[0]);return this.legacyName=Util.decodeMacroman(this.file.read(namelen)).replace(/\u0000/g,'');};PSDLayer.prototype.parseExtraData=function(){var key,length,pos,signature,_ref,_results;_results=[];while(this.file.tell()<this.layerEnd){_ref=this.file.readf(">4s4s"),signature=_ref[0],key=_ref[1];assert.equal(signature,"8BIM");length=Util.pad2(this.file.readInt());pos=this.file.tell();Log.debug("Extra layer info: key = "+key+", length = "+length);switch(key){case"SoCo":this.adjustments.solidColor=(new PSDSolidColor(this,length)).parse();console.log("SoCo:",this.adjustments.solidColor);break;case"GdFl":this.adjustments.gradient=(new PSDGradient(this,length)).parse();break;case"PtFl":this.adjustments.pattern=(new PSDPattern(this,length)).parse();break;case"brit":this.adjustments.brightnessContrast=(new PSDBrightnessContrast(this,length)).parse();break;case"levl":this.adjustments.levels=(new PSDLevels(this,length)).parse();break;case"curv":this.adjustments.curves=(new PSDCurves(this,length)).parse();break;case"expA":this.adjustments.exposure=(new PSDExposure(this,length)).parse();break;case"vibA":this.adjustments.vibrance=(new PSDVibrance(this,length)).parse();break;case"hue2":this.adjustments.hueSaturation=(new PSDHueSaturation(this,length)).parse();break;case"blnc":this.adjustments.colorBalance=(new PSDColorBalance(this,length)).parse();break;case"blwh":this.adjustments.blackWhite=(new PSDBlackWhite(this,length)).parse();break;case"phfl":this.adjustments.photoFilter=(new PSDPhotoFilter(this,length)).parse();break;case"thrs":this.adjustments.threshold=(new PSDThreshold(this,length)).parse();break;case"nvrt":this.adjustments.invert=(new PSDInvert(this,length)).parse();break;case"post":this.adjustments.posterize=(new PSDPosterize(this,length)).parse();break;case"tySh":this.adjustments.typeTool=(new PSDTypeTool(this,length)).parse(true);break;case"TySh":this.adjustments.typeTool=(new PSDTypeTool(this,length)).parse();break;case"luni":this.name=this.file.readUnicodeString();this.file.seek(pos+length,false);break;case"lyid":this.layerId=this.file.readInt();break;case"lsct":this.readLayerSectionDivider();break;case"lrFX":this.parseEffectsLayer();this.file.read(2);break;case"selc":this.adjustments.selectiveColor=(new PSDSelectiveColor(this,length)).parse();break;default:this.file.seek(length);Log.debug("Skipping additional layer info with key "+key);}
if(this.file.tell()!==(pos+length)){Log.debug("Warning: additional layer info with key "+key+" - unexpected end");_results.push(this.file.seek(pos+length,false));}else{_results.push(void 0);}}
return _results;};PSDLayer.prototype.parseEffectsLayer=function(){var count,data,effect,effects,left,pos,signature,size,type,v,_ref,_ref1;effects=[];_ref=this.file.readf(">HH"),v=_ref[0],count=_ref[1];while(count-->0){_ref1=this.file.readf(">4s4s"),signature=_ref1[0],type=_ref1[1];size=this.file.readf(">i")[0];pos=this.file.tell();Log.debug("Parsing effect layer with type "+type+" and size "+size);effect=(function(){switch(type){case"cmnS":return new PSDLayerEffectCommonStateInfo(this.file);case"dsdw":return new PSDDropDownLayerEffect(this.file);case"isdw":return new PSDDropDownLayerEffect(this.file,true);}}).call(this);data=effect!=null?effect.parse():void 0;left=(pos+size)-this.file.tell();if(left!==0){Log.debug("Failed to parse effect layer with type "+type);this.file.seek(left);}else{if(type!=="cmnS"){effects.push(data);}}}
-return this.adjustments.effects=effects;};PSDLayer.prototype.readLayerSectionDivider=function(){var code;code=this.file.readInt();this.layerType=SECTION_DIVIDER_TYPES[code];Log.debug("Layer type:",this.layerType);switch(code){case 1:case 2:return this.isFolder=true;case 3:return this.isHidden=true;}};PSDLayer.prototype.toJSON=function(){var data,section,sections,_i,_len;sections=['name','top','left','bottom','right','channels','rows','cols','channelsInfo','mask','layerType','blendMode','adjustments','visible'];data={};for(_i=0,_len=sections.length;_i<_len;_i++){section=sections[_i];data[section]=this[section];}
+return this.adjustments.effects=effects;};PSDLayer.prototype.readLayerSectionDivider=function(){var code;code=this.file.readInt();this.layerType=SECTION_DIVIDER_TYPES[code];Log.debug("Layer type:",this.layerType);switch(code){case 1:case 2:return this.isFolder=true;case 3:return this.isHidden=true;}};PSDLayer.prototype.toJSON=function(){var data,section,sections,_i,_len;sections=['name','legacyName','top','left','bottom','right','channels','rows','cols','channelsInfo','mask','layerType','blendMode','adjustments','visible'];data={};for(_i=0,_len=sections.length;_i<_len;_i++){section=sections[_i];data[section]=this[section];}
return data;};return PSDLayer;})();PSDLayerMask=(function(){function PSDLayerMask(file,header,options){this.file=file;this.header=header;this.options=options;this.layers=[];this.mergedAlpha=false;this.globalMask={};this.extras=[];}
PSDLayerMask.prototype.skip=function(){return this.file.seek(this.file.readInt());};PSDLayerMask.prototype.parse=function(){var endLoc,i,layer,layerInfoSize,maskSize,pos,_i,_j,_len,_ref,_ref1;maskSize=this.file.readInt();endLoc=this.file.tell()+maskSize;Log.debug("Layer mask size is "+maskSize);if(maskSize<=0){return;}
layerInfoSize=Util.pad2(this.file.readInt());pos=this.file.tell();if(layerInfoSize>0){this.numLayers=this.file.readShortInt();if(this.numLayers<0){Log.debug("Note: first alpha channel contains transparency data");this.numLayers=Math.abs(this.numLayers);this.mergedAlpha=true;}
@@ -235,7 +235,8 @@ start=this.file.tell();end=this.file.tell()+length;Log.debug("Global mask length
this.globalMask.opacity=this.file.readShortInt();this.globalMask.kind=this.file.read(1)[0];Log.debug("Global mask:",this.globalMask);return this.file.seek(end,false);};PSDLayerMask.prototype.parseExtraInfo=function(end){var key,length,sig,_ref,_results;_results=[];while(this.file.tell()<end){_ref=this.file.readf(">4s4sI"),sig=_ref[0],key=_ref[1],length=_ref[2];length=Util.pad2(length);Log.debug("Layer extra:",sig,key,length);_results.push(this.file.seek(length));}
return _results;};PSDLayerMask.prototype.groupLayers=function(){var groupLayer,layer,_i,_len,_ref,_results;groupLayer=null;_ref=this.layers;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){layer=_ref[_i];if(layer.isFolder){_results.push(groupLayer=layer);}else if(layer.isHidden){_results.push(groupLayer=null);}else{_results.push(layer.groupLayer=groupLayer);}}
return _results;};PSDLayerMask.prototype.toJSON=function(){var data,layer,_i,_len,_ref;data={mergedAlpha:this.mergedAlpha,globalMask:this.globalMask,extraInfo:this.extras,numLayers:this.numLayers,layers:[]};_ref=this.layers;for(_i=0,_len=_ref.length;_i<_len;_i++){layer=_ref[_i];data.layers.push(layer.toJSON());}
-return data;};return PSDLayerMask;})();PSDBrightnessContrast=(function(){function PSDBrightnessContrast(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={};}
+return data;};return PSDLayerMask;})();PSDBlackWhite=(function(){function PSDBlackWhite(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDBlackWhite.prototype.parse=function(){var version;version=this.file.readInt();assert(version===16);return(new PSDDescriptor(this.file)).parse();};return PSDBlackWhite;})();PSDBrightnessContrast=(function(){function PSDBrightnessContrast(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={};}
PSDBrightnessContrast.prototype.parse=function(){this.data.brightness=this.file.getShortInt();this.data.contrast=this.file.getShortInt();this.data.meanValue=this.file.getShortInt();this.data.labColor=this.file.getShortInt();return this.data;};return PSDBrightnessContrast;})();PSDColorBalance=(function(){function PSDColorBalance(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={cyanRed:[],magentaGreen:[],yellowBlue:[]};}
PSDColorBalance.prototype.parse=function(){var i,_i;for(i=_i=0;_i<3;i=++_i){this.data.cyanRed.push(this.file.getShortInt());this.data.magentaGreen.push(this.file.getShortInt());this.data.yellowBlue.push(this.file.getShortInt());}
return this.data;};return PSDColorBalance;})();PSDCurves=(function(){function PSDCurves(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={curve:[]};}
@@ -244,7 +245,9 @@ for(i=_j=0,_ref=this.data.curveCount;0<=_ref?_j<_ref:_j>_ref;i=0<=_ref?++_j:--_j
count++;}}
this.data.curve[i].pointCount=this.file.getShortInt();assert(this.data.curve[i].pointCount>=2);assert(this.data.curve[i].pointCount<=19);for(j=_l=0,_ref1=this.data.curve[i].pointCount;0<=_ref1?_l<_ref1:_l>_ref1;j=0<=_ref1?++_l:--_l){this.data.curve[i].outputValue[j]=this.file.readShortInt();this.data.curve[i].inputValue[j]=this.file.readShortInt();assert(this.data.curve[i].outputValue[j]>=0);assert(this.data.curve[i].outputValue[j]<=255);assert(this.data.curve[i].inputValue[j]>=0);assert(this.data.curve[i].inputValue[j]<=255);}}
if(this.file.tell()-start<this.length-4){tag=this.file.readString(4);assert.equal(tag,'Crv ');version=this.file.readShortInt();assert(version===4);curveCount=this.file.readInt();assert.equal(curveCount,this.data.curveCount);for(i=_m=0,_ref2=this.data.curveCount;0<=_ref2?_m<_ref2:_m>_ref2;i=0<=_ref2?++_m:--_m){this.data.curve[i].channelIndex=this.file.readShortInt();pointCount=this.file.readShortInt();assert(pointCount===this.data.curve[i].pointCount);for(j=_n=0;0<=pointCount?_n<pointCount:_n>pointCount;j=0<=pointCount?++_n:--_n){outputValue=this.file.getShortInt();inputValue=this.file.getShortInt();assert.equal(outputValue,this.data.curve[i].outputValue[j]);assert.equal(inputValue,this.data.curve[i].inputValue[j]);}}}
-return this.data;};return PSDCurves;})();PSDHueSaturation=(function(){function PSDHueSaturation(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+return this.data;};return PSDCurves;})();PSDExposure=(function(){function PSDExposure(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDExposure.prototype.parse=function(){var version;version=this.file.parseInt();assert(version===1);return{exposure:this.file.parseInt(),offset:this.file.parseInt(),gamma:this.file.parseInt()};};return PSDExposure;})();PSDGradient=(function(){function PSDGradient(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDGradient.prototype.parse=function(){var version;version=this.file.readInt();assert(version===16);return(new PSDDescriptor(this.file)).parse();};return PSDGradient;})();PSDHueSaturation=(function(){function PSDHueSaturation(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
PSDHueSaturation.prototype.parse=function(){var i,j,version,_i,_j,_k;version=this.file.getShortInt();assert(version===2);this.data.colorization=this.file.readBoolean();this.file.seek(1);this.data.hue=this.file.getShortInt();this.data.saturation=this.file.getShortInt();this.data.lightness=this.file.getShortInt();this.data.masterHue=this.file.getShortInt();this.data.masterSaturation=this.file.getShortInt();this.data.masterLightness=this.file.getShortInt();this.data.rangeValues=[];this.data.settingValues=[];for(i=_i=0;_i<6;i=++_i){this.data.rangeValues[i]=[];this.data.settingValues[i]=[];for(j=_j=0;_j<4;j=++_j){this.data.rangeValues[i][j]=this.file.getShortInt();}
for(j=_k=0;_k<3;j=++_k){this.data.settingValues[i][j]=this.file.getShortInt();}}
return this.data;};return PSDHueSaturation;})();PSDInvert=(function(){function PSDInvert(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
@@ -258,7 +261,9 @@ return data;};return PSDDropDownLayerEffect;})(PSDLayerEffect);PSDLevels=(functi
PSDLevels.prototype.parse=function(){var start,tag,version;start=this.file.tell();version=this.file.readShortInt();assert(version===1);this.parseLevelRecords();if(this.file.tell()-start<this.length-4){tag=this.file.readf(">4s");assert.equal(tag,"Lvls");version=this.file.readShortInt();assert.equal(version,3);this.data.levelCount=this.file.readShortInt()-29;assert(levelCount>=0);this.parseLevelRecords(levelCount);return this.data;}};PSDLevels.prototype.parseLevelRecords=function(count){var i,record,_i,_ref,_results;if(count==null){count=29;}
_results=[];for(i=_i=0;0<=count?_i<count:_i>count;i=0<=count?++_i:--_i){record={};_ref=this.file.readf(">hhhhh"),record.inputFloor=_ref[0],record.inputCeiling=_ref[1],record.outputFloor=_ref[2],record.outputCeiling=_ref[3],record.gamma=_ref[4];record.gamma/=100;if(i<27){assert(record.inputFloor>=0&&record.inputFloor<=255);assert(record.inputCeiling>=2&&record.inputCeiling<=255);assert(record.outputFloor>=0&&record.outputFloor<=255);assert(record.outputCeiling>=0&&record.outputCeiling<=255);assert(record.gamma>=0.1&&record.gamma<=9.99);}
_results.push(this.data.records.push(record));}
-return _results;};return PSDLevels;})();PSDPosterize=(function(){function PSDPosterize(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={};}
+return _results;};return PSDLevels;})();PSDPattern=(function(){function PSDPattern(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDPattern.prototype.parse=function(){var version;version=this.file.parseInt();assert(version===16);return(new PSDDescriptor(this.file)).parse();};return PSDPattern;})();PSDPhotoFilter=(function(){function PSDPhotoFilter(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDPhotoFilter.prototype.parse=function(){var data,version;version=this.file.parseInt();assert(version===3);data={};data.color={x:this.file.readInt(),y:this.file.readInt(),z:this.file.readInt()};data.density=this.file.readInt();data.preserveLuminosity=this.file.readBoolean();return data;};return PSDPhotoFilter;})();PSDPosterize=(function(){function PSDPosterize(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={};}
PSDPosterize.prototype.parse=function(){this.data.levels=this.file.readShortInt();assert(this.data.levels>=2&&this.data.levels<=255);this.file.seek(2);return this.data;};return PSDPosterize;})();PSDSelectiveColor=(function(){function PSDSelectiveColor(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;this.data={cyanCorrection:[],magentaCorrection:[],yellowCorrection:[],blackCorrection:[]};}
PSDSelectiveColor.prototype.parse=function(){var i,version,_i;version=this.file.getShortInt();assert(version===1);this.data.correctionMethod=this.file.getShortInt();for(i=_i=0;_i<10;i=++_i){this.data.cyanCorrection.push(this.file.getShortInt());this.data.magentaCorrection.push(this.file.getShortInt());this.data.yellowCorrection.push(this.file.getShortInt());this.data.blackCorrection.push(this.file.getShortInt());}
return this.data;};return PSDSelectiveColor;})();PSDSolidColor=(function(){function PSDSolidColor(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
@@ -267,10 +272,11 @@ PSDThreshold.prototype.parse=function(){this.data.level=this.file.readShortInt()
PSDTypeTool.prototype.parse=function(legacy){var char,descriptorVersion,engineData,textVersion,version,warpVersion,_i,_len,_ref,_ref1,_ref2;if(legacy==null){legacy=false;}
version=this.file.readShortInt();assert(version===1);this.data.transformInfo={};_ref=this.file.readf(">6d"),this.data.transformInfo.xx=_ref[0],this.data.transformInfo.xy=_ref[1],this.data.transformInfo.yx=_ref[2],this.data.transformInfo.yy=_ref[3],this.data.transformInfo.tx=_ref[4],this.data.transformInfo.ty=_ref[5];if(legacy){return this.parseLegacy();}
textVersion=this.file.readShortInt();assert(textVersion===50);descriptorVersion=this.file.readInt();assert(descriptorVersion===16);this.data.text=(new PSDDescriptor(this.file)).parse();engineData="";_ref1=this.data.text.EngineData;for(_i=0,_len=_ref1.length;_i<_len;_i++){char=_ref1[_i];engineData+=String.fromCharCode(char);}
-this.data.text.EngineData=engineData.replace(/\u0000/g,"");warpVersion=this.file.readShortInt();assert(warpVersion===1);descriptorVersion=this.file.readInt();assert(descriptorVersion===16);this.data.warp=(new PSDDescriptor(this.file)).parse();Log.debug("Warp:",this.data.warp);_ref2=this.file.readf(">4d"),this.data.left=_ref2[0],this.data.top=_ref2[1],this.data.right=_ref2[2],this.data.bottom=_ref2[3];return this.data;};PSDTypeTool.prototype.parseLegacy=function(){var i,j,version,_i,_j,_k,_l,_ref,_ref1,_ref2,_ref3;version=this.file.readShortInt();assert(version===6);this.data.facesCount=this.file.readShortInt();this.data.face=[];for(i=_i=0,_ref=this.data.facesCount;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.data.face[i]={};this.data.face[i].mark=this.file.readShortInt();this.data.face[i].fontType=this.file.readInt();this.data.face[i].fontName=this.file.readLengthWithString();this.data.face[i].fontFamilyName=this.file.readLengthWithString();this.data.face[i].fontStyleName=this.file.readLengthWithString();this.data.face[i].script=this.file.readShortInt();this.data.face[i].numberAxesVector=this.file.readInt();this.data.face[i].vector=[];for(j=_j=0,_ref1=this.data.face[i].numberAxesVector;0<=_ref1?_j<_ref1:_j>_ref1;j=0<=_ref1?++_j:--_j){this.data.face[i].vector[j]=this.file.readInt();}}
+this.data.text.EngineData=engineData.replace(/\u0000/g,"");warpVersion=this.file.readShortInt();assert(warpVersion===1);descriptorVersion=this.file.readInt();assert(descriptorVersion===16);this.data.warp=(new PSDDescriptor(this.file)).parse();_ref2=this.file.readf(">4d"),this.data.left=_ref2[0],this.data.top=_ref2[1],this.data.right=_ref2[2],this.data.bottom=_ref2[3];return this.data;};PSDTypeTool.prototype.parseLegacy=function(){var i,j,version,_i,_j,_k,_l,_ref,_ref1,_ref2,_ref3;version=this.file.readShortInt();assert(version===6);this.data.facesCount=this.file.readShortInt();this.data.face=[];for(i=_i=0,_ref=this.data.facesCount;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.data.face[i]={};this.data.face[i].mark=this.file.readShortInt();this.data.face[i].fontType=this.file.readInt();this.data.face[i].fontName=this.file.readLengthWithString();this.data.face[i].fontFamilyName=this.file.readLengthWithString();this.data.face[i].fontStyleName=this.file.readLengthWithString();this.data.face[i].script=this.file.readShortInt();this.data.face[i].numberAxesVector=this.file.readInt();this.data.face[i].vector=[];for(j=_j=0,_ref1=this.data.face[i].numberAxesVector;0<=_ref1?_j<_ref1:_j>_ref1;j=0<=_ref1?++_j:--_j){this.data.face[i].vector[j]=this.file.readInt();}}
this.data.stylesCount=this.file.readShortInt();this.data.style=[];for(i=_k=0,_ref2=this.data.stylesCount;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){this.data.style[i]={};this.data.style[i].mark=this.file.readShortInt();this.data.style[i].faceMark=this.file.readShortInt();this.data.style[i].size=this.file.readInt();this.data.style[i].tracking=this.file.readInt();this.data.style[i].kerning=this.file.readInt();this.data.style[i].leading=this.file.readInt();this.data.style[i].baseShift=this.file.readInt();this.data.style[i].autoKern=this.file.readBoolean();this.file.read(1);this.data.style[i].rotate=this.file.readBoolean();}
this.data.type=this.file.readShortInt();this.data.scalingFactor=this.file.readInt();this.data.sharacterCount=this.file.readInt();this.data.horzPlace=this.file.readInt();this.data.vertPlace=this.file.readInt();this.data.selectStart=this.file.readInt();this.data.selectEnd=this.file.readInt();this.data.linesCount=this.file.readShortInt();this.data.line=[];for(i=_l=0,_ref3=this.data.linesCount;0<=_ref3?_l<_ref3:_l>_ref3;i=0<=_ref3?++_l:--_l){this.data.line[i].charCount=this.file.readInt();this.data.line[i].orientation=this.file.readShortInt();this.data.line[i].alignment=this.file.readShortInt();this.data.line[i].actualChar=this.file.readShortInt();this.data.line[i].style=this.file.readShortInt();}
-this.data.color=this.file.readSpaceColor();this.data.antialias=this.file.readBoolean();return this.data;};return PSDTypeTool;})();PSDResource=(function(){var RESOURCE_DESCRIPTIONS;RESOURCE_DESCRIPTIONS={1000:{name:'PS2.0 mode data',parse:function(){var _ref;return _ref=this.file.readf(">5H"),this.channels=_ref[0],this.rows=_ref[1],this.cols=_ref[2],this.depth=_ref[3],this.mode=_ref[4],_ref;}},1001:{name:'Macintosh print record'},1003:{name:'PS2.0 indexed color table'},1005:{name:'ResolutionInfo'},1006:{name:'Names of the alpha channels'},1007:{name:'DisplayInfo'},1008:{name:'Caption',parse:function(){return this.caption=this.file.readLengthWithString();}},1009:{name:'Border information',parse:function(){var units,_ref;_ref=this.file.readf(">fH"),this.width=_ref[0],units=_ref[1];return this.units=(function(){switch(units){case 1:return"inches";case 2:return"cm";case 3:return"points";case 4:return"picas";case 5:return"columns";}})();}},1010:{name:'Background color'},1011:{name:'Print flags',parse:function(){var start,_ref;start=this.file.tell();_ref=this.file.readf(">9B"),this.labels=_ref[0],this.cropMarks=_ref[1],this.colorBars=_ref[2],this.registrationMarks=_ref[3],this.negative=_ref[4],this.flip=_ref[5],this.interpolate=_ref[6],this.caption=_ref[7];return this.file.seek(start+this.size,false);}},1012:{name:'Grayscale/multichannel halftoning info'},1013:{name:'Color halftoning info'},1014:{name:'Duotone halftoning info'},1015:{name:'Grayscale/multichannel transfer function'},1016:{name:'Color transfer functions'},1017:{name:'Duotone transfer functions'},1018:{name:'Duotone image info'},1019:{name:'B&W values for the dot range',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.bwvalues=_ref[0],_ref;}},1021:{name:'EPS options'},1022:{name:'Quick Mask info',parse:function(){var _ref;return _ref=this.file.readf(">HB"),this.quickMaskChannelID=_ref[0],this.wasMaskEmpty=_ref[1],_ref;}},1024:{name:'Layer state info',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.targetLayer=_ref[0],_ref;}},1025:{name:'Working path'},1026:{name:'Layers group info',parse:function(){var info,start,_results;start=this.file.tell();this.layerGroupInfo=[];_results=[];while(this.file.tell()<start+this.size){info=this.file.readf(">H")[0];_results.push(this.layerGroupInfo.push(info));}
+this.data.color=this.file.readSpaceColor();this.data.antialias=this.file.readBoolean();return this.data;};return PSDTypeTool;})();PSDVibrance=(function(){function PSDVibrance(layer,length){this.layer=layer;this.length=length;this.file=this.layer.file;}
+PSDVibrance.prototype.parse=function(){var version;version=this.file.readInt();assert(version===16);return(new PSDDescriptor(this.file)).parse();};return PSDVibrance;})();PSDResource=(function(){var RESOURCE_DESCRIPTIONS;RESOURCE_DESCRIPTIONS={1000:{name:'PS2.0 mode data',parse:function(){var _ref;return _ref=this.file.readf(">5H"),this.channels=_ref[0],this.rows=_ref[1],this.cols=_ref[2],this.depth=_ref[3],this.mode=_ref[4],_ref;}},1001:{name:'Macintosh print record'},1003:{name:'PS2.0 indexed color table'},1005:{name:'ResolutionInfo'},1006:{name:'Names of the alpha channels'},1007:{name:'DisplayInfo'},1008:{name:'Caption',parse:function(){return this.caption=this.file.readLengthWithString();}},1009:{name:'Border information',parse:function(){var units,_ref;_ref=this.file.readf(">fH"),this.width=_ref[0],units=_ref[1];return this.units=(function(){switch(units){case 1:return"inches";case 2:return"cm";case 3:return"points";case 4:return"picas";case 5:return"columns";}})();}},1010:{name:'Background color'},1011:{name:'Print flags',parse:function(){var start,_ref;start=this.file.tell();_ref=this.file.readf(">9B"),this.labels=_ref[0],this.cropMarks=_ref[1],this.colorBars=_ref[2],this.registrationMarks=_ref[3],this.negative=_ref[4],this.flip=_ref[5],this.interpolate=_ref[6],this.caption=_ref[7];return this.file.seek(start+this.size,false);}},1012:{name:'Grayscale/multichannel halftoning info'},1013:{name:'Color halftoning info'},1014:{name:'Duotone halftoning info'},1015:{name:'Grayscale/multichannel transfer function'},1016:{name:'Color transfer functions'},1017:{name:'Duotone transfer functions'},1018:{name:'Duotone image info'},1019:{name:'B&W values for the dot range',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.bwvalues=_ref[0],_ref;}},1021:{name:'EPS options'},1022:{name:'Quick Mask info',parse:function(){var _ref;return _ref=this.file.readf(">HB"),this.quickMaskChannelID=_ref[0],this.wasMaskEmpty=_ref[1],_ref;}},1024:{name:'Layer state info',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.targetLayer=_ref[0],_ref;}},1025:{name:'Working path'},1026:{name:'Layers group info',parse:function(){var info,start,_results;start=this.file.tell();this.layerGroupInfo=[];_results=[];while(this.file.tell()<start+this.size){info=this.file.readf(">H")[0];_results.push(this.layerGroupInfo.push(info));}
return _results;}},1028:{name:'IPTC-NAA record (File Info)'},1029:{name:'Image mode for raw format files'},1030:{name:'JPEG quality'},1032:{name:'Grid and guides info'},1033:{name:'Thumbnail resource'},1034:{name:'Copyright flag',parse:function(){var _ref;return _ref=this.file.readf(">"+this.size+"B"),this.copyrighted=_ref[0],_ref;}},1035:{name:'URL',parse:function(){var _ref;return _ref=this.file.readf(">"+this.size+"s"),this.url=_ref[0],_ref;}},1036:{name:'Thumbnail resource'},1037:{name:'Global Angle'},1038:{name:'Color samplers resource'},1039:{name:'ICC Profile'},1040:{name:'Watermark',parse:function(){var _ref;return _ref=this.file.readf(">B"),this.watermarked=_ref[0],_ref;}},1041:{name:'ICC Untagged'},1042:{name:'Effects visible',parse:function(){var _ref;return _ref=this.file.readf(">B"),this.showEffects=_ref[0],_ref;}},1043:{name:'Spot Halftone',parse:function(){[this.halftoneVersion,length](this.file.readf(">LL"));return this.halftoneData=this.file.read(length);}},1044:{name:'Document specific IDs seed number',parse:function(){var _ref;return _ref=this.file.readf(">L"),this.docIdSeedNumber=_ref[0],_ref;}},1045:{name:'Unicode Alpha Names'},1046:{name:'Indexed Color Table Count',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.indexedColorCount=_ref[0],_ref;}},1047:{name:'Transparent Index',parse:function(){var _ref;return _ref=this.file.readf(">H"),this.transparencyIndex=_ref[0],_ref;}},1049:{name:'Global Altitude',parse:function(){var _ref;return _ref=this.file.readf(">L"),this.globalAltitude=_ref[0],_ref;}},1050:{name:'Slices'},1051:{name:'Workflow URL',parse:function(){return this.workflowName=this.file.readLengthWithString();}},1052:{name:'Jump To XPEP',parse:function(){var block,count,i,_i,_ref,_results;_ref=this.file.readf(">HHL"),this.majorVersion=_ref[0],this.minorVersion=_ref[1],count=_ref[2];this.xpepBlocks=[];_results=[];for(i=_i=0;0<=count?_i<count:_i>count;i=0<=count?++_i:--_i){block={size:this.file.readf(">L"),key:this.file.readf(">4s")};if(block.key==="jtDd"){block.dirty=this.file.readBoolean();}else{block.modDate=this.file.readf(">L");}
_results.push(this.xpepBlocks.push(block));}
return _results;}},1053:{name:'Alpha Identifiers'},1054:{name:'URL List'},1057:{name:'Version Info'},1058:{name:'EXIF data 1'},1059:{name:'EXIF data 3'},1060:{name:'XMP metadata'},1061:{name:'Caption digest'},1062:{name:'Print scale'},1064:{name:'Pixel Aspect Ratio'},1065:{name:'Layer Comps'},1066:{name:'Alternate Duotone Colors'},1067:{name:'Alternate Spot Colors'},1069:{name:'Layer Selection ID(s)'},1070:{name:'HDR Toning information'},1071:{name:"Print info"},1072:{name:"Layer Groups Enabled"},1073:{name:"Color samplers resource"},1074:{name:"Measurement Scale"},1075:{name:"Timeline Information"},1076:{name:"Sheet Disclosure"},1077:{name:"DisplayInfo"},1078:{name:"Onion Skins"},1080:{name:"Count Information"},1082:{name:"Print Information"},1083:{name:"Print Style"},1084:{name:"Macintosh NSPrintInfo"},1085:{name:"Windows DEVMODE"},2999:{name:'Name of clipping path'},7000:{name:"Image Ready variables"},7001:{name:"Image Ready data sets"},8000:{name:"Lightroom workflow",parse:PSDResource.isLightroom=true},10000:{name:'Print flags info',parse:function(){var padding,_ref;return _ref=this.file.readf(">HBBLH"),this.version=_ref[0],this.centerCropMarks=_ref[1],padding=_ref[2],this.bleedWidth=_ref[3],this.bleedWidthScale=_ref[4],_ref;}}};function PSDResource(file){this.file=file;}
diff --git a/src/layerdata/blackwhite.coffee b/src/layerdata/blackwhite.coffee
new file mode 100644
index 0000000..3eef05b
--- /dev/null
+++ b/src/layerdata/blackwhite.coffee
@@ -0,0 +1,9 @@
+class PSDBlackWhite
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.readInt()
+ assert version is 16
+
+ (new PSDDescriptor(@file)).parse() \ No newline at end of file
diff --git a/src/layerdata/exposure.coffee b/src/layerdata/exposure.coffee
new file mode 100644
index 0000000..9516742
--- /dev/null
+++ b/src/layerdata/exposure.coffee
@@ -0,0 +1,11 @@
+class PSDExposure
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.parseInt()
+ assert version is 1
+
+ exposure: @file.parseInt()
+ offset: @file.parseInt()
+ gamma: @file.parseInt() \ No newline at end of file
diff --git a/src/layerdata/gradient.coffee b/src/layerdata/gradient.coffee
new file mode 100644
index 0000000..6b31ff8
--- /dev/null
+++ b/src/layerdata/gradient.coffee
@@ -0,0 +1,9 @@
+class PSDGradient
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.readInt()
+ assert version is 16
+
+ (new PSDDescriptor(@file)).parse() \ No newline at end of file
diff --git a/src/layerdata/pattern.coffee b/src/layerdata/pattern.coffee
new file mode 100644
index 0000000..58ff704
--- /dev/null
+++ b/src/layerdata/pattern.coffee
@@ -0,0 +1,9 @@
+class PSDPattern
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.parseInt()
+ assert version is 16
+
+ (new PSDDescriptor(@file)).parse() \ No newline at end of file
diff --git a/src/layerdata/photofilter.coffee b/src/layerdata/photofilter.coffee
new file mode 100644
index 0000000..d2ec1c4
--- /dev/null
+++ b/src/layerdata/photofilter.coffee
@@ -0,0 +1,17 @@
+class PSDPhotoFilter
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.parseInt()
+ assert version is 3
+
+ data = {}
+ data.color =
+ x: @file.readInt()
+ y: @file.readInt()
+ z: @file.readInt()
+
+ data.density = @file.readInt()
+ data.preserveLuminosity = @file.readBoolean()
+ data \ No newline at end of file
diff --git a/src/layerdata/typetool.coffee b/src/layerdata/typetool.coffee
index faf964d..3f1d4fd 100755
--- a/src/layerdata/typetool.coffee
+++ b/src/layerdata/typetool.coffee
@@ -52,7 +52,7 @@ class PSDTypeTool
assert descriptorVersion is 16
@data.warp = (new PSDDescriptor(@file)).parse()
- Log.debug "Warp:", @data.warp
+ #Log.debug "Warp:", @data.warp
[
@data.left
diff --git a/src/layerdata/vibrance.coffee b/src/layerdata/vibrance.coffee
new file mode 100644
index 0000000..e96ebbe
--- /dev/null
+++ b/src/layerdata/vibrance.coffee
@@ -0,0 +1,9 @@
+class PSDVibrance
+ constructor: (@layer, @length) ->
+ @file = @layer.file
+
+ parse: ->
+ version = @file.readInt()
+ assert version is 16
+
+ (new PSDDescriptor(@file)).parse() \ No newline at end of file
diff --git a/src/psddescriptor.coffee b/src/psddescriptor.coffee
index 4b2ce02..2d0322c 100644
--- a/src/psddescriptor.coffee
+++ b/src/psddescriptor.coffee
@@ -1,21 +1,21 @@
class PSDDescriptor
constructor: (@file) ->
- @data = {}
# Main entry point for parsing a descriptor
parse: ->
Log.debug "Parsing descriptor..."
- @data.class = @parseClass()
+ data = {}
+ data.class = @parseClass()
numItems = @file.readInt()
Log.debug "Descriptor contains #{numItems} items"
for i in [0...numItems]
item = @parseKeyItem()
- @data[item.id] = item.value
+ data[item.id] = item.value
- @data
+ data
parseID: ->
len = @file.readInt()
diff --git a/src/psdlayer.coffee b/src/psdlayer.coffee
index 454163c..fa54216 100755
--- a/src/psdlayer.coffee
+++ b/src/psdlayer.coffee
@@ -282,18 +282,29 @@ class PSDLayer
switch key
when "SoCo"
@adjustments.solidColor = (new PSDSolidColor(@, length)).parse()
+ console.log "SoCo:", @adjustments.solidColor
+ when "GdFl"
+ @adjustments.gradient = (new PSDGradient(@, length)).parse()
+ when "PtFl"
+ @adjustments.pattern = (new PSDPattern(@, length)).parse()
+ when "brit"
+ @adjustments.brightnessContrast = (new PSDBrightnessContrast(@, length)).parse()
when "levl"
@adjustments.levels = (new PSDLevels(@, length)).parse()
when "curv"
@adjustments.curves = (new PSDCurves(@, length)).parse()
- when "brit"
- @adjustments.brightnessContrast = (new PSDBrightnessContrast(@, length)).parse()
+ when "expA"
+ @adjustments.exposure = (new PSDExposure(@, length)).parse()
+ when "vibA"
+ @adjustments.vibrance = (new PSDVibrance(@, length)).parse()
+ when "hue2" # PS >= 5.0
+ @adjustments.hueSaturation = (new PSDHueSaturation(@, length)).parse()
when "blnc"
@adjustments.colorBalance = (new PSDColorBalance(@, length)).parse()
- when "hue2"
- @adjustments.hueSaturation = (new PSDHueSaturation(@, length)).parse()
- when "selc"
- @adjustments.selectiveColor = (new PSDSelectiveColor(@, length)).parse()
+ when "blwh"
+ @adjustments.blackWhite = (new PSDBlackWhite(@, length)).parse()
+ when "phfl"
+ @adjustments.photoFilter = (new PSDPhotoFilter(@, length)).parse()
when "thrs"
@adjustments.threshold = (new PSDThreshold(@, length)).parse()
when "nvrt"
@@ -305,7 +316,7 @@ class PSDLayer
when "TySh" # PS >= 6
@adjustments.typeTool = (new PSDTypeTool(@, length)).parse()
when "luni" # PS >= 5.0
- @name = @file.readUnicodeString(Util.pad4)
+ @name = @file.readUnicodeString()
# This seems to be padded with null bytes (by 4?), but the easiest
# thing to do is to simply jump to the end of this section.
@@ -316,6 +327,8 @@ class PSDLayer
@readLayerSectionDivider()
when "lrFX"
@parseEffectsLayer(); @file.read(2) # why these 2 bytes?
+ when "selc"
+ @adjustments.selectiveColor = (new PSDSelectiveColor(@, length)).parse()
else
@file.seek length
Log.debug("Skipping additional layer info with key #{key}")
@@ -374,6 +387,7 @@ class PSDLayer
toJSON: ->
sections = [
'name'
+ 'legacyName'
'top'
'left'
'bottom'