process_font.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from __future__ import absolute_import
  4. from __future__ import division
  5. from __future__ import print_function
  6. try:
  7. import Image
  8. except ImportError:
  9. from PIL import Image
  10. import os
  11. from xml.dom import minidom
  12. import tempfile
  13. import hashlib
  14. from . import process
  15. class bmfc_font_Processor(process.Process):
  16. node_id = "bmfc_font"
  17. def __init__(self):
  18. pass
  19. def process(self, context, walker):
  20. el = walker.root
  21. file_name = el.getAttribute("file")
  22. id = el.getAttribute("id")
  23. if not id:
  24. id = os.path.split(os.path.splitext(file_name)[0])[1]
  25. path_font = context.src_data + walker.getPath("file")
  26. chars = walker.getPath("chars")
  27. scale = context.scale * walker.scale_quality * walker.scale_factor
  28. build_bmfont(context.args.hash,
  29. context.get_inner_dest(id + ".fnt"),
  30. path_font,
  31. context.get_inner_dest(""),
  32. scale,
  33. context.src_data + chars)
  34. meta = walker.root_meta
  35. ns = get_bmfc_fontSize(path_font)
  36. font_size = int(ns * walker.scale_factor)
  37. meta.setAttribute("size", str(font_size))
  38. meta.setAttribute("sf", str(scale))
  39. class font_Processor(process.Process):
  40. create_folder = False
  41. node_id = "font"
  42. def __init__(self):
  43. pass
  44. def process(self, context, walker):
  45. el = walker.root
  46. # note: variable unused
  47. file_name = el.getAttribute("file")
  48. meta = walker.root_meta
  49. path = context.src_data + walker.getPath("file")
  50. try:
  51. font_doc = context._open_xml(path)
  52. font_info = font_doc.getElementsByTagName("info")[0]
  53. size = int(font_info.getAttribute("size"))
  54. except:
  55. data = open(path, "r").read()
  56. pos = data.find("size=") + 5
  57. end = data.find(" ", pos)
  58. st = data[pos:end]
  59. size = int(st)
  60. size = int(abs(size) * walker.scale_factor)
  61. meta.setAttribute("size", str(size))
  62. meta.setAttribute("sf", str(1))
  63. def as_int(attr):
  64. if not attr:
  65. return 0
  66. return int(attr)
  67. def get_bmfc_fontSize(bm_config):
  68. font_file = open(bm_config, "r")
  69. lines = font_file.readlines()
  70. for line in lines:
  71. spl = line.split("=")
  72. if spl[0] == "fontSize":
  73. return abs(int(spl[1]))
  74. def build_bmfont(need_md5, fnt, bm_config, ext_folder, scale, font_chars):
  75. # open config file and apply scale to size
  76. if not os.path.exists(font_chars):
  77. print("error! you didn't set to bmfont 'chars'")
  78. bm_config_temp = tempfile.NamedTemporaryFile(
  79. prefix="oxygine", delete=False)
  80. bm_config_temp.close()
  81. bm_config_temp = bm_config_temp.name
  82. # font_size = get_bmfc_fontSize(bm_config)
  83. def rewrite_config(bm_original, bm_new, pngHeight):
  84. font_file = open(bm_original, "r")
  85. scaled_font_file = open(bm_new, "w")
  86. lines = font_file.readlines()
  87. for line in lines:
  88. # line = ""
  89. spl = line.split("=")
  90. if spl[0] == "fontSize":
  91. new_size = int(abs(int(spl[1])) * scale + 0.5)
  92. new_size = -new_size
  93. line = "fontSize=%(size)d\n" % {"size": new_size}
  94. if spl[0] == "outHeight":
  95. line = "outHeight=%(pngHeight)d\n" % {"pngHeight": pngHeight}
  96. scaled_font_file.write(line)
  97. font_file.close()
  98. scaled_font_file.close()
  99. rewrite_config(bm_config, bm_config_temp, 1024)
  100. lang = font_chars
  101. bmfont = os.path.split(__file__)[0] + \
  102. "/../../3rdPartyTools/BMFont/bmfont.com"
  103. cmd = "%(bmfont)s -t %(lang)s -c %(bmfc)s -o %(fnt)s" % {
  104. "bmfont": bmfont, "bmfc": bm_config_temp, "fnt": fnt, "lang": lang}
  105. cmd = cmd.replace("/", "\\")
  106. os.system(cmd)
  107. png_file = os.path.splitext(fnt)[0] + "_0.png"
  108. font_image = Image.open(png_file)
  109. font_image.load()
  110. _, _, _, a = font_image.split()
  111. bbox = a.getbbox()
  112. h = bbox[3] + 2
  113. if h > 512:
  114. h = 1024
  115. elif h > 256:
  116. h = 512
  117. elif h > 128:
  118. h = 256
  119. elif h > 64:
  120. h = 128
  121. elif h < 64:
  122. h = 64
  123. del font_image
  124. rewrite_config(bm_config, bm_config_temp, h)
  125. os.system(cmd)
  126. if need_md5:
  127. # if 0:
  128. md = hashlib.md5()
  129. md.update(open(bm_config_temp).read())
  130. md.update(open(lang).read())
  131. with open(os.path.split(fnt)[0] + "/md5.oxygine", "a") as m:
  132. m.write("%s\n%s\n" % (os.path.split(png_file)[1], md.hexdigest()))
  133. m.write("%s\n%s\n" % (os.path.split(fnt)[1], md.hexdigest()))
  134. file = open(fnt, "r")
  135. doc = minidom.parse(file)
  136. kern = doc.documentElement.getElementsByTagName("kernings")
  137. if kern:
  138. el = kern[0]
  139. el.parentNode.removeChild(el)
  140. pages = doc.documentElement.getElementsByTagName("pages")[0]
  141. for page in pages.getElementsByTagName("page"):
  142. fn = os.path.split(page.getAttribute("file"))[1]
  143. page.setAttribute("file", fn)
  144. file.close()
  145. file = open(fnt, "w")
  146. doc.writexml(file)
  147. file.close()
  148. os.remove(bm_config_temp)