Jump To …
README lib / psd / blend_mode.coffee lib / psd / channel_image.coffee lib / psd / color.coffee lib / psd / descriptor.coffee lib / psd / file.coffee lib / psd / header.coffee lib / psd / image.coffee lib / psd / image_export.coffee lib / psd / image_exports / png.coffee lib / psd / image_format.coffee lib / psd / image_formats / layer_raw.coffee lib / psd / image_formats / layer_rle.coffee lib / psd / image_formats / raw.coffee lib / psd / image_formats / rle.coffee lib / psd / image_mode.coffee lib / psd / image_modes / cmyk.coffee lib / psd / image_modes / greyscale.coffee lib / psd / image_modes / rgb.coffee lib / psd / init.coffee lib / psd / layer / blend_modes.coffee lib / psd / layer / blending_ranges.coffee lib / psd / layer / channel_image.coffee lib / psd / layer / helpers.coffee lib / psd / layer / info.coffee lib / psd / layer / mask.coffee lib / psd / layer / name.coffee lib / psd / layer / position_channels.coffee lib / psd / layer.coffee lib / psd / layer_info / blend_clipping_elements.coffee lib / psd / layer_info / blend_interior_elements.coffee lib / psd / layer_info / fill_opacity.coffee lib / psd / layer_info / gradient_fill.coffee lib / psd / layer_info / layer_id.coffee lib / psd / layer_info / layer_name_source.coffee lib / psd / layer_info / legacy_typetool.coffee lib / psd / layer_info / locked.coffee lib / psd / layer_info / metadata.coffee lib / psd / layer_info / nested_section_divider.coffee lib / psd / layer_info / object_effects.coffee lib / psd / layer_info / section_divider.coffee lib / psd / layer_info / solid_color.coffee lib / psd / layer_info / typetool.coffee lib / psd / layer_info / unicode_name.coffee lib / psd / layer_info / vector_mask.coffee lib / psd / layer_info / vector_origination.coffee lib / psd / layer_info / vector_stroke.coffee lib / psd / layer_info / vector_stroke_content.coffee lib / psd / layer_info.coffee lib / psd / layer_mask.coffee lib / psd / lazy_execute.coffee lib / psd / mask.coffee lib / psd / node.coffee lib / psd / nodes / ancestry.coffee lib / psd / nodes / build_preview.coffee lib / psd / nodes / group.coffee lib / psd / nodes / layer.coffee lib / psd / nodes / root.coffee lib / psd / nodes / search.coffee lib / psd / path_record.coffee lib / psd / resource.coffee lib / psd / resource_section.coffee lib / psd / resources / layer_comps.coffee lib / psd / resources.coffee lib / psd / util.coffee lib / psd.coffee shims / init.coffee shims / png.coffee

# info.coffee

lib/psd/layer/

¶

    LazyExecute = require '../lazy_execute.coffee'
    Util = require '../util.coffee'

¶

This is an incredibly important object because the majority of the layer information is contained in layer info blocks. The keys of this object define how the layer info can be accessed. Each layer info block contains different data, so accessing the data within each differs from type to type.

Here's an example of how to access some of this data:

    node = psd.tree().childrenAtPath('path/to/layer')[0]
    node.get('locked').allLocked
    node.get('metadata').data.layerComp
    node.get('typeTool').export()

    LAYER_INFO = {
      blendClippingElements:  require('../layer_info/blend_clipping_elements.coffee')
      blendInteriorElements:  require('../layer_info/blend_interior_elements.coffee')
      fillOpacity:            require('../layer_info/fill_opacity.coffee')
      gradientFill:           require('../layer_info/gradient_fill.coffee')
      layerId:                require('../layer_info/layer_id.coffee')
      layerNameSource:        require('../layer_info/layer_name_source.coffee')
      legacyTypetool:         require('../layer_info/legacy_typetool.coffee')
      locked:                 require('../layer_info/locked.coffee')
      metadata:               require('../layer_info/metadata.coffee')
      name:                   require('../layer_info/unicode_name.coffee')
      nestedSectionDivider:   require('../layer_info/nested_section_divider.coffee')
      objectEffects:          require('../layer_info/object_effects.coffee')
      sectionDivider:         require('../layer_info/section_divider.coffee')
      solidColor:             require('../layer_info/solid_color.coffee')
      typeTool:               require('../layer_info/typetool.coffee')
      vectorMask:             require('../layer_info/vector_mask.coffee')
      vectorOrigination:      require('../layer_info/vector_origination.coffee')
      vectorStroke:           require('../layer_info/vector_stroke.coffee')
      vectorStrokeContent:    require('../layer_info/vector_stroke_content.coffee')
    }

    module.exports =
      parseLayerInfo: ->

¶

Layer info blocks are the last section in the layer, so we can continue until our file cursor reaches the end of the layer.

        while @file.tell() < @layerEnd
          @file.seek 4, true # sig

¶

Every layer info block is identified by a unique 4 character string.

          key = @file.readString(4)
          length = Util.pad2 @file.readInt()
          pos = @file.tell()

          keyParseable = false
          for own name, klass of LAYER_INFO
            continue unless klass.shouldParse(key)

¶

Once we find the right class to handle the layer info block, we create it and register it with LazyExecute. This allows us to parse the PSD significantly faster because we don't bother parsing the layer info block until it's accessed.

            i = new klass(@, length)
            @adjustments[name] = new LazyExecute(i, @file)
              .now('skip')
              .later('parse')
              .get()

¶

We create a function that lets us easily access the data.

            unless @[name]?
              do (name) => @[name] = => @adjustments[name]

¶

For debugging purposes, we store every key that we can parse.

            @infoKeys.push key
            keyParseable = true
            break

¶

If we don't know how to parse this particular layer info block, we can skip it since we know the end position of the data.

          @file.seek length, true if not keyParseable

generated Tue May 12 2015 10:08:56 GMT-0400 (EDT)