process_font.py 4.8 KB

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