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

node.coffee

lib/psd/
_        = require 'lodash'
{Module} = require 'coffeescript-module'

module.exports = class Node extends Module
  @includes require('./nodes/ancestry.coffee')
  @includes require('./nodes/search.coffee')
  @includes require('./nodes/build_preview.coffee')

  @PROPERTIES: ['name', 'left', 'right', 'top', 'bottom', 'height', 'width']

  type: 'node'

  constructor: (@layer, @parent = null) ->
    @layer.node = @
    @_children = []

    @name = @layer.name

    @forceVisible = null

    @coords =
      top: @layer.top
      bottom: @layer.bottom
      left: @layer.left
      right: @layer.right

    @topOffset = 0
    @leftOffset = 0

    @createProperties()

  createProperties: ->
    Object.defineProperty @, 'top',
      get: -> @coords.top + @topOffset
      set: (val) -> @coords.top = val

    Object.defineProperty @, 'right',
      get: -> @coords.right + @leftOffset
      set: (val) -> @coords.right = val

    Object.defineProperty @, 'bottom',
      get: -> @coords.bottom + @topOffset
      set: (val) -> @coords.bottom = val

    Object.defineProperty @, 'left',
      get: -> @coords.left + @leftOffset
      set: (val) -> @coords.left = val

    Object.defineProperty @, 'width',  get: -> @right - @left
    Object.defineProperty @, 'height', get: -> @bottom - @top

  get: (prop) ->
    value = if @[prop]? then @[prop] else @layer[prop]
    if typeof value is 'function' then value() else value

  visible: ->
    return false if @layer.clipped and not @clippingMask().visible()
    if @forceVisible? then @forceVisible else @layer.visible

  hidden: -> not @visible()

  isLayer: -> @type is 'layer'
  isGroup: -> @type is 'group'
  isRoot: ->  @type is 'root'

  clippingMask: ->
    return null unless @layer.clipped
    @clippingMaskCached or= (
      maskNode = @nextSibling()
      maskNode = maskNode.nextSibling() while maskNode.clipped
      maskNode
    )

  clippedBy: -> @clippingMask()

  export: ->
    hash =
      type: null
      visible: @visible()
      opacity: @layer.opacity / 255.0
      blendingMode: @layer.blendingMode()

    hash[prop] = @[prop] for prop in Node.PROPERTIES
    hash

  updateDimensions: ->
    return if @isLayer()

    child.updateDimensions() for child in @_children

    return if @isRoot()

    nonEmptyChildren = @_children.filter((c) -> not c.isEmpty())
    @left = _.min(nonEmptyChildren.map((c) -> c.left)) or 0
    @top = _.min(nonEmptyChildren.map((c) -> c.top)) or 0
    @bottom = _.max(nonEmptyChildren.map((c) -> c.bottom)) or 0
    @right = _.max(nonEmptyChildren.map((c) -> c.right)) or 0

generated Tue May 12 2015 11:08:14 GMT-0400 (EDT)