Code coverage report for fontkit/src/DFont.coffee

Statements: 93.75% (45 / 48)      Branches: 80% (8 / 10)      Functions: 100% (7 / 7)      Lines: 95.74% (45 / 47)      Ignored: none     

All files » fontkit/src/ » DFont.coffee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 911 1   1 1   1 1       1             1     12   1   6   1         1             5   5 5   2   3 3 3         3   3 6 15 3 3   12   6 3   3     2   2 4 4 4 4 2       1 1 1 4 4 4   1   1  
r = require 'restructure'
TTFFont = require './TTFFont'
  
class DFont
  get = require('./get')(this)
  
  DFontName = new r.String(r.uint8)
  DFontData = new r.Struct
    len: r.uint32
    buf: new r.Buffer('len')
 
  Ref = new r.Struct
    id: r.uint16
    nameOffset: r.int16
    attr: r.uint8
    dataOffset: r.uint24
    handle: r.uint32
 
  Type = new r.Struct
    name: new r.String(4)
    maxTypeIndex: r.uint16
    refList: new r.Pointer(r.uint16, new r.Array(Ref, -> @maxTypeIndex + 1), type: 'parent')
  
  TypeList = new r.Struct
    length: r.uint16
    types: new r.Array(Type, -> @length + 1)
  
  DFontMap = new r.Struct
    reserved: new r.Reserved(r.uint8, 24)
    typeList: new r.Pointer(r.uint16, TypeList)
    nameListOffset: new r.Pointer(r.uint16, 'void')
 
  DFontHeader = new r.Struct
    dataOffset: r.uint32
    map: new r.Pointer(r.uint32, DFontMap)
    dataLength: r.uint32
    mapLength: r.uint32
    
  @probe: (buffer) ->
    stream = new r.DecodeStream(buffer)
    
    try
      header = DFontHeader.decode stream
    catch e
      return false
      
    for type in header.map.typeList.types
      Eif type.name is 'sfnt'
        return true
      
    return false
    
  constructor: (@stream) ->
    @header = DFontHeader.decode @stream
    
    for type in @header.map.typeList.types
      for ref in type.refList
        if ref.nameOffset >= 0
          @stream.pos = ref.nameOffset + @header.map.nameListOffset
          ref.name = DFontName.decode @stream
        else
          ref.name = null
          
      if type.name is 'sfnt'
        @sfnt = type
          
    return
    
  getFont: (name) ->
    Ireturn null unless @sfnt
    
    for ref in @sfnt.refList
      pos = @header.dataOffset + ref.dataOffset + 4
      stream = new r.DecodeStream @stream.buffer.slice(pos)
      font = new TTFFont stream
      if font.postscriptName is name
        return font
        
    return null
  
  get 'fonts', ->
    fonts = []
    for ref in @sfnt.refList
      pos = @header.dataOffset + ref.dataOffset + 4
      stream = new r.DecodeStream @stream.buffer.slice(pos)
      fonts.push new TTFFont stream
      
    return fonts
 
module.exports = DFont