diff options
author | 2012-07-24 21:11:07 -0400 | |
---|---|---|
committer | 2012-07-24 21:11:07 -0400 | |
commit | 5534d471f250ff3afe40144a5af37c7a8cbabecc (patch) | |
tree | 753f2059d638b236a11b2b1aa0b6d3ff3f50831f /src | |
parent | Update documentation (diff) | |
download | psd.js-5534d471f250ff3afe40144a5af37c7a8cbabecc.tar.xz psd.js-5534d471f250ff3afe40144a5af37c7a8cbabecc.zip |
Added parsing of both legacy and current layer effects. Current layer effects needs a lot of work to make it more human readable though.
Diffstat (limited to 'src')
-rwxr-xr-x | src/layerdata/layereffect.coffee | 63 | ||||
-rw-r--r-- | src/psddescriptor.coffee | 12 | ||||
-rwxr-xr-x | src/psdlayer.coffee | 45 |
3 files changed, 76 insertions, 44 deletions
diff --git a/src/layerdata/layereffect.coffee b/src/layerdata/layereffect.coffee index d69586d..7255358 100755 --- a/src/layerdata/layereffect.coffee +++ b/src/layerdata/layereffect.coffee @@ -1,6 +1,69 @@ # libpsd has effect layer parsing # see https://github.com/alco/psdump/blob/master/libpsd-0.9 +class PSDEffectsInfo + constructor: (@layer, @length) -> + @file = @layer.file + + parse: -> + effectsVersion = @file.readInt() + assert effectsVersion is 0 + + version = @file.readInt() + assert version is 16 + + (new PSDEffectsDescriptor(@file)).parse() + + parseLegacy: -> + effects = [] + + [ + v, # always 0 + count + ] = @file.readf ">HH" + + while count-- > 0 + [ + signature, + type + ] = @file.readf ">4s4s" + + [size] = @file.readf ">i" + + pos = @file.tell() + + Log.debug("Parsing effect layer with type #{type} and size #{size}") + + effect = + switch type + when "cmnS" then new PSDLayerEffectCommonStateInfo @file + when "dsdw" then new PSDDropDownLayerEffect @file + when "isdw" then new PSDDropDownLayerEffect @file, true # inner drop shadow + + data = effect?.parse() + + left = (pos + size) - @file.tell() + if left != 0 + Log.debug("Failed to parse effect layer with type #{type}") + @file.seek left + else + effects.push(data) unless type == "cmnS" # ignore commons state info + + legacy: true + effects: effects + +# This is ridiculous. The effects layer does not follow the standard +# descriptor structure. Have to do a little hacking here. +class PSDEffectsDescriptor extends PSDDescriptor + parseItem: (id) -> + type = @file.readString(4) + + data = switch id + when "patternFill" then @parseLayerPatternOverlay() + else super(id, type) + + data + class PSDLayerEffect constructor: (@file) -> diff --git a/src/psddescriptor.coffee b/src/psddescriptor.coffee index 2d0322c..3b6213b 100644 --- a/src/psddescriptor.coffee +++ b/src/psddescriptor.coffee @@ -29,11 +29,13 @@ class PSDDescriptor id: @parseID() parseKeyItem: -> - id: @parseID() - value: @parseItem() + id = @parseID() + value = @parseItem(id) - parseItem: -> - type = @file.readString(4) + id: id, value: value + + parseItem: (id, type = null) -> + type = @file.readString(4) unless type Log.debug "Found descriptor type: #{type}" value = switch type @@ -142,7 +144,7 @@ class PSDDescriptor value parseUnitDouble: -> - unitID = @file.parseString(4) + unitID = @file.readString(4) unit = switch unitID when "#Ang" then "Angle" when "#Rsl" then "Density" diff --git a/src/psdlayer.coffee b/src/psdlayer.coffee index 14c371d..5e1a2bd 100755 --- a/src/psdlayer.coffee +++ b/src/psdlayer.coffee @@ -324,8 +324,11 @@ class PSDLayer @layerId = @file.readInt() when "lsct" @readLayerSectionDivider() - when "lrFX" - @parseEffectsLayer(); @file.read(2) # why these 2 bytes? + when "lrFX" # PS 5.0 + @adjustments.legacyEffects = (new PSDEffectsInfo(@, length)).parseLegacy() + @file.read(2) # why these 2 bytes? + when "lfx2" # PS 6.0 + @adjustments.effects = (new PSDEffectsInfo(@, length)).parse() when "selc" @adjustments.selectiveColor = (new PSDSelectiveColor(@, length)).parse() else @@ -333,45 +336,9 @@ class PSDLayer Log.debug("Skipping additional layer info with key #{key}") if @file.tell() != (pos + length) - Log.debug "Warning: additional layer info with key #{key} - unexpected end" + Log.debug "Warning: additional layer info with key #{key} - unexpected end. Position = #{@file.tell()}, Expected = #{(pos + length)}" @file.seek pos + length, false # Attempt to recover - parseEffectsLayer: -> - effects = [] - - [ - v, # always 0 - count - ] = @file.readf ">HH" - - while count-- > 0 - [ - signature, - type - ] = @file.readf ">4s4s" - - [size] = @file.readf ">i" - - pos = @file.tell() - - Log.debug("Parsing effect layer with type #{type} and size #{size}") - - effect = - switch type - when "cmnS" then new PSDLayerEffectCommonStateInfo @file - when "dsdw" then new PSDDropDownLayerEffect @file - when "isdw" then new PSDDropDownLayerEffect @file, true # inner drop shadow - - data = effect?.parse() - - left = (pos + size) - @file.tell() - if left != 0 - Log.debug("Failed to parse effect layer with type #{type}") - @file.seek left - else - effects.push(data) unless type == "cmnS" # ignore commons state info - - @adjustments.effects = effects readLayerSectionDivider: -> code = @file.readInt() |