aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authormeltingice <meltingice8917@gmail.com>2012-07-24 21:11:07 -0400
committermeltingice <meltingice8917@gmail.com>2012-07-24 21:11:07 -0400
commit5534d471f250ff3afe40144a5af37c7a8cbabecc (patch)
tree753f2059d638b236a11b2b1aa0b6d3ff3f50831f /src
parentUpdate documentation (diff)
downloadpsd.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-xsrc/layerdata/layereffect.coffee63
-rw-r--r--src/psddescriptor.coffee12
-rwxr-xr-xsrc/psdlayer.coffee45
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()