class PSDTypeTool constructor: (@layer, @length) -> @file = @layer.file @data = {} parse: (legacy = false) -> version = @file.readShortInt() assert version is 1 # 6 * 8 double numbers for transform info # xx, xy, yx, yy, tx, ty @data.transformInfo = {} [ @data.transformInfo.xx @data.transformInfo.xy @data.transformInfo.yx @data.transformInfo.yy @data.transformInfo.tx @data.transformInfo.ty ] = @file.readf(">6d") return @parseLegacy() if legacy # Below is code for PS >= 6 textVersion = @file.readShortInt() assert textVersion is 50 descriptorVersion = @file.readInt() assert descriptorVersion is 16 # Read descriptor (NOTE: not sure if correct...) @data.text = (new PSDDescriptor(@file)).parse() # This isn't documented, but it seems like the raw EngineData # can be parsed as character codes. It's not perfect, but you # can get a general idea. Hopefully this can be improved in the # future. engineData = "" for char in @data.text.EngineData engineData += String.fromCharCode(char) @data.text.EngineData = engineData.replace /\u0000/g, "" # This is a bit verbose #Log.debug "Text:", @data.text warpVersion = @file.readShortInt() assert warpVersion is 1 descriptorVersion = @file.readInt() assert descriptorVersion is 16 @data.warp = (new PSDDescriptor(@file)).parse() #Log.debug "Warp:", @data.warp [ @data.left @data.top @data.right @data.bottom ] = @file.readf ">4d" @data parseLegacy: -> # # Font Information # version = @file.readShortInt() assert version is 6 # Count of faces @data.facesCount = @file.readShortInt() @data.face = [] for i in [0...@data.facesCount] @data.face[i] = {} @data.face[i].mark = @file.readShortInt() @data.face[i].fontType = @file.readInt() @data.face[i].fontName = @file.readLengthWithString() @data.face[i].fontFamilyName = @file.readLengthWithString() @data.face[i].fontStyleName = @file.readLengthWithString() @data.face[i].script = @file.readShortInt() @data.face[i].numberAxesVector = @file.readInt() @data.face[i].vector = [] for j in [0...@data.face[i].numberAxesVector] @data.face[i].vector[j] = @file.readInt() # # Style Information # @data.stylesCount = @file.readShortInt() @data.style = [] for i in [0...@data.stylesCount] @data.style[i] = {} @data.style[i].mark = @file.readShortInt() @data.style[i].faceMark = @file.readShortInt() @data.style[i].size = @file.readInt() @data.style[i].tracking = @file.readInt() @data.style[i].kerning = @file.readInt() @data.style[i].leading = @file.readInt() @data.style[i].baseShift = @file.readInt() @data.style[i].autoKern = @file.readBoolean() # Only present in version <= 5 @file.read 1 @data.style[i].rotate = @file.readBoolean() # # Text Information # @data.type = @file.readShortInt() @data.scalingFactor = @file.readInt() @data.sharacterCount = @file.readInt() @data.horzPlace = @file.readInt() @data.vertPlace = @file.readInt() @data.selectStart = @file.readInt() @data.selectEnd = @file.readInt() @data.linesCount = @file.readShortInt() @data.line = [] for i in [0...@data.linesCount] @data.line[i].charCount = @file.readInt() @data.line[i].orientation = @file.readShortInt() @data.line[i].alignment = @file.readShortInt() @data.line[i].actualChar = @file.readShortInt() @data.line[i].style = @file.readShortInt() # # Color Information # @data.color = @file.readSpaceColor() @data.antialias = @file.readBoolean() @data