process_font.py 4.7 KB

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