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

# file.coffee

lib/psd/

¶

    {jspack} = require 'jspack'
    iconv = require 'iconv-lite'
    Color = require './color.coffee'
    Util = require './util.coffee'

¶

A file abstraction that stores the PSD file data, and assists in parsing it.

    module.exports = class File
      FORMATS =
        Int:
          code: '>i'
          length: 4
        UInt:
          code: '>I'
          length: 4
        Short:
          code: '>h'
          length: 2
        UShort:
          code: '>H'
          length: 2
        Float:
          code: '>f'
          length: 4
        Double:
          code: '>d'
          length: 8
        LongLong:
          code: '>q'
          length: 8

      for own format, info of FORMATS then do (format, info) =>
        @::["read#{format}"] = -> @readf(info.code, info.length)[0]

¶

The current cursor position in the file.

      pos: 0

¶

Creates a new File with the given Uint8Array.

      constructor: (@data) ->

¶

Returns the current cursor position.

      tell: -> @pos

¶

Reads raw file data with no processing.

      read: (length) -> (@data[@pos++] for i in [0...length])

¶

Reads file data and processes it with the given unpack format string. If the length is omitted, then it will be calculated automatically based on the format string.

      readf: (format, len = null) -> jspack.Unpack format, @read(len or jspack.CalcLength(format))

¶

Moves the cursor without parsing data. If `rel = false`, then the cursor will be set to the given value, which effectively sets the position relative to the start of the file. If `rel = true`, then the cursor will be moved relative to the current position.

      seek: (amt, rel = false) -> if rel then @pos += amt else @pos = amt

¶

Reads a String of the given length.

      readString: (length) -> String.fromCharCode.apply(null, @read(length)).replace /\u0000/g, ""

¶

Reads a Unicode UTF-16BE encoded string.

      readUnicodeString: (length = null) ->
        length or= @readInt()
        iconv.decode(new Buffer(@read(length * 2)),'utf-16be').replace /\u0000/g, ""

¶

Helper that reads a single byte.

      readByte: -> @read(1)[0]

¶

Helper that reads a single byte and interprets it as a boolean.

      readBoolean: -> @readByte() isnt 0

¶

Reads a 32-bit color space value.

      readSpaceColor: ->
        colorSpace = @readShort()
        colorComponent = (@readShort() >> 8) for i in [0...4]

        colorSpace: colorSpace, components: colorComponent

¶

Adobe's lovely signed 32-bit fixed-point number with 8bits.24bits http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm#50577409_17587

      readPathNumber: ->
        a = @readByte()

        arr = @read(3)
        b1 = arr[0] << 16
        b2 = arr[1] << 8
        b3 = arr[2]
        b = b1 | b2 | b3

        parseFloat(a, 10) + parseFloat(b / Math.pow(2, 24), 10)

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