Jump To …

psdheader.coffee

The PSD header describes all kinds of important information pertaining to the PSD file such as size, color channels, color depth, and so on.

class PSDHeader

All of the sections that the header contains. These will become properties of the instantiated header object once parsed.

  HEADER_SECTIONS = [
    "sig"
    "version"
    

These are reserved bytes, always zero

    "r0"
    "r1"
    "r2"
    "r3"
    "r4"
    "r5"

    "channels"
    "rows"
    "cols"
    "depth"
    "mode"
  ]

Common names for various color modes, which are specified by an integer in the header.

  MODES =
    0:  'Bitmap'
    1:  'GrayScale'
    2:  'IndexedColor'
    3:  'RGBColor'
    4:  'CMYKColor'
    5:  'HSLColor'
    6:  'HSBColor'
    7:  'Multichannel'
    8:  'Duotone'
    9:  'LabColor'
    10: 'Gray16'
    11: 'RGB48'
    12: 'Lab48'
    13: 'CMYK64'
    14: 'DeepMultichannel'
    15: 'Duotone16'

  constructor: (@file) ->

  parse: ->

Read the header section

    data = @file.readf ">4sH 6B HLLHH"

Add all of the header sections as properties of this object.

    @[section] = data.shift() for section in HEADER_SECTIONS

Store size in an easy to use place for later

    @size = [@rows, @cols]

This must be 8BPS according to the spec, or else this is not a valid PSD file.

    if @sig isnt "8BPS"
      throw "Not a PSD signature: #{@header['sig']}"
    

The spec only covers version 1 of PSDs. I believe this is the only version available at this time, anyways.

    if @version isnt 1
      throw "Can not handle PSD version #{@header['version']}"

Store the common mode name

    if 0 <= @mode < 16
      @modename = MODES[@mode]
    else
      @modename = "(#{@mode})"

Information about the color mode is a bit complex. We're skipping this for now. TODO.

    @colormodepos = @file.pos
    @file.skipBlock "color mode data"

  toJSON: ->
    data = {}
    for section in HEADER_SECTIONS
      data[section] = @[section]

Some extra data

    data.modename = @modename
    data