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

# layer_mask.coffee

lib/psd/

¶

    _ = require 'lodash'
    Util = require './util.coffee'
    Layer = require './layer.coffee'

¶

The layer mask is the overarching data structure that describes both the layers/groups in the PSD document, and the global mask. This part of the document is ordered as such:

- Layers
- Layer images
- Global Mask

The file does not need to have a global mask. If there is none, then its length will be zero.

    module.exports = class LayerMask
      constructor: (@file, @header) ->
        @layers = []
        @mergedAlpha = false
        @globalMask = null

      skip: -> @file.seek @file.readInt(), true

      parse: ->
        maskSize = @file.readInt()
        finish = maskSize + @file.tell()

        return if maskSize <= 0

        @parseLayers()
        @parseGlobalMask()

¶

The layers are stored in the reverse order that we would like them. In other words, they're stored bottom to top and we want them top to bottom.

        @layers.reverse()

        @file.seek finish

      parseLayers: ->
        layerInfoSize = Util.pad2 @file.readInt()

        if layerInfoSize > 0
          layerCount = @file.readShort()

          if layerCount < 0
            layerCount = Math.abs layerCount
            @mergedAlpha = true

          for i in [0...layerCount]
            @layers.push new Layer(@file, @header).parse()

          layer.parseChannelImage() for layer in @layers

      parseGlobalMask: ->
        length = @file.readInt()
        return if length <= 0

        maskEnd = @file.tell() + length

        @globalMask = _({}).tap (mask) =>
          mask.overlayColorSpace = @file.readShort()
          mask.colorComponents = [
            @file.readShort() >> 8
            @file.readShort() >> 8
            @file.readShort() >> 8
            @file.readShort() >> 8
          ]

          mask.opacity = @file.readShort() / 16.0

¶

0 = color selected, 1 = color protected, 128 = use value per layer

          mask.kind = @file.readByte()

        @file.seek maskEnd

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