Commit 969ddd48 authored by Ryan LeFevre's avatar Ryan LeFevre

Implement lazy parsing

parent c3e7db58
fs = require 'fs'
File = require './psd/file.coffee'
LazyExecute = require './psd/lazy_execute.coffee'
Header = require './psd/header.coffee'
Resources = require './psd/resources.coffee'
LayerMask = require './psd/layer_mask.coffee'
......@@ -29,13 +31,22 @@ module.exports = class PSD
@header.parse()
parseResources: ->
@resources = new Resources(@file)
@resources.parse()
resources = new Resources(@file)
@resources = new LazyExecute(resources, @file)
.now('skip')
.later('parse')
.get()
parseLayerMask: ->
@layerMask = new LayerMask(@file, @header)
@layerMask.parse()
layerMask = new LayerMask(@file, @header)
@layerMask = new LazyExecute(layerMask, @file)
.now('skip')
.later('parse')
.get()
parseImage: ->
@image = new Image(@file, @header)
@image.parse()
\ No newline at end of file
image = new Image(@file, @header)
@image = new LazyExecute(image, @file)
.later('parse')
.ignore('width', 'height')
.get()
\ No newline at end of file
......@@ -24,8 +24,8 @@ module.exports = class Header
@sig = null
@version = null
@channels = null
@rows = null
@cols = null
@rows = @height = null
@cols = @width = null
@depth = null
@mode = null
......@@ -36,8 +36,8 @@ module.exports = class Header
@file.seek 6, true
@channels = @file.readUShort()
@rows = @file.readUInt()
@cols = @file.readUInt()
@rows = @height = @file.readUInt()
@cols = @width = @file.readUInt()
@depth = @file.readUShort()
@mode = @file.readUShort()
......
module.exports = class Image
constructor: (@file, @header) ->
@width = @header.width
@height = @header.height
parse: ->
console.log "parse!"
\ No newline at end of file
......@@ -6,6 +6,8 @@ module.exports = class LayerMask
@mergedAlpha = false
@globalMask = null
skip: -> @file.seek @file.readInt()
parse: ->
maskSize = @file.readInt()
finish = maskSize + @file.tell()
......
module.exports = class LazyExecute
constructor: (@obj, @file) ->
@startPos = @file.tell()
@loaded = false
@loadMethod = null
@loadArgs = []
@passthru = []
now: (method, args...) ->
@obj[method].apply(@obj, args)
return @
later: (method, args...) ->
@loadMethod = method
@loadArgs = args
return @
ignore: (args...) ->
@passthru.concat args
return @
get: ->
for own key, val of @obj then do (key, val) =>
return if @[key]?
Object.defineProperty @, key,
get: ->
@load() if not @loaded and not (key in @passthru)
@obj[key]
@
load: ->
origPos = @file.tell()
@file.seek @startPos
@obj[@loadMethod].apply(@obj, @loadArgs)
@file.seek origPos
@loaded = true
......@@ -4,6 +4,10 @@ module.exports = class Resources
@typeIndex = {}
@length = null
skip: ->
@length = @file.readInt()
@file.seek @length, true
parse: ->
@length = @file.readInt()
@file.seek @length, true
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment