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

Implement lazy parsing

parent c3e7db58
fs = require 'fs' fs = require 'fs'
File = require './psd/file.coffee' File = require './psd/file.coffee'
LazyExecute = require './psd/lazy_execute.coffee'
Header = require './psd/header.coffee' Header = require './psd/header.coffee'
Resources = require './psd/resources.coffee' Resources = require './psd/resources.coffee'
LayerMask = require './psd/layer_mask.coffee' LayerMask = require './psd/layer_mask.coffee'
...@@ -29,13 +31,22 @@ module.exports = class PSD ...@@ -29,13 +31,22 @@ module.exports = class PSD
@header.parse() @header.parse()
parseResources: -> parseResources: ->
@resources = new Resources(@file) resources = new Resources(@file)
@resources.parse() @resources = new LazyExecute(resources, @file)
.now('skip')
.later('parse')
.get()
parseLayerMask: -> parseLayerMask: ->
@layerMask = new LayerMask(@file, @header) layerMask = new LayerMask(@file, @header)
@layerMask.parse() @layerMask = new LazyExecute(layerMask, @file)
.now('skip')
.later('parse')
.get()
parseImage: -> parseImage: ->
@image = new Image(@file, @header) image = new Image(@file, @header)
@image.parse() @image = new LazyExecute(image, @file)
\ No newline at end of file .later('parse')
.ignore('width', 'height')
.get()
\ No newline at end of file
...@@ -24,8 +24,8 @@ module.exports = class Header ...@@ -24,8 +24,8 @@ module.exports = class Header
@sig = null @sig = null
@version = null @version = null
@channels = null @channels = null
@rows = null @rows = @height = null
@cols = null @cols = @width = null
@depth = null @depth = null
@mode = null @mode = null
...@@ -36,8 +36,8 @@ module.exports = class Header ...@@ -36,8 +36,8 @@ module.exports = class Header
@file.seek 6, true @file.seek 6, true
@channels = @file.readUShort() @channels = @file.readUShort()
@rows = @file.readUInt() @rows = @height = @file.readUInt()
@cols = @file.readUInt() @cols = @width = @file.readUInt()
@depth = @file.readUShort() @depth = @file.readUShort()
@mode = @file.readUShort() @mode = @file.readUShort()
......
module.exports = class Image module.exports = class Image
constructor: (@file, @header) -> constructor: (@file, @header) ->
@width = @header.width
@height = @header.height
parse: -> parse: ->
console.log "parse!"
\ No newline at end of file
...@@ -6,6 +6,8 @@ module.exports = class LayerMask ...@@ -6,6 +6,8 @@ module.exports = class LayerMask
@mergedAlpha = false @mergedAlpha = false
@globalMask = null @globalMask = null
skip: -> @file.seek @file.readInt()
parse: -> parse: ->
maskSize = @file.readInt() maskSize = @file.readInt()
finish = maskSize + @file.tell() 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 ...@@ -4,6 +4,10 @@ module.exports = class Resources
@typeIndex = {} @typeIndex = {}
@length = null @length = null
skip: ->
@length = @file.readInt()
@file.seek @length, true
parse: -> parse: ->
@length = @file.readInt() @length = @file.readInt()
@file.seek @length, true @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