| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals, print_function
- try:
- import Image
- except ImportError:
- from PIL import Image
- import os
- from xml.dom import minidom
- import tempfile
- import hashlib
- from . import process
- class bmfc_font_Processor(process.Process):
- node_id = "bmfc_font"
- def __init__(self):
- pass
- def process(self, context, walker):
- el = walker.root
- file_name = el.getAttribute("file")
- id = el.getAttribute("id")
- if not id:
- id = os.path.split(os.path.splitext(file_name)[0])[1]
- path_font = context.src_data + walker.getPath("file")
- chars = walker.getPath("chars")
- scale = context.scale * walker.scale_quality * walker.scale_factor
- build_bmfont(context.args.hash,
- context.get_inner_dest(id + ".fnt"),
- path_font,
- context.get_inner_dest(""),
- scale,
- context.src_data + chars)
- meta = walker.root_meta
- ns = get_bmfc_fontSize(path_font)
- font_size = int(ns * walker.scale_factor)
- meta.setAttribute("size", str(font_size))
- meta.setAttribute("sf", str(scale))
- class font_Processor(process.Process):
- create_folder = False
- node_id = "font"
- def __init__(self):
- pass
- def process(self, context, walker):
- el = walker.root
- # note: variable unused
- file_name = el.getAttribute("file")
- meta = walker.root_meta
-
- path = context.src_data + walker.getPath("file")
- try:
- font_doc = context._open_xml(path)
- font_info = font_doc.getElementsByTagName("info")[0]
- size = int(font_info.getAttribute("size"))
- except:
- data = open(path, "r").read()
- pos = data.find("size=") + 5
- end = data.find(" ", pos)
- st = data[pos:end]
- size = int(st)
-
- size = int(abs(size) * walker.scale_factor)
-
- meta.setAttribute("size", str(size))
- meta.setAttribute("sf", str(1))
- def as_int(attr):
- if not attr:
- return 0
- return int(attr)
- def get_bmfc_fontSize(bm_config):
- font_file = open(bm_config, "r")
- lines = font_file.readlines()
- for line in lines:
- spl = line.split("=")
- if spl[0] == "fontSize":
- return abs(int(spl[1]))
- def build_bmfont(need_md5, fnt, bm_config, ext_folder, scale, font_chars):
- # open config file and apply scale to size
- if not os.path.exists(font_chars):
- print("error! you didn't set to bmfont 'chars'")
- bm_config_temp = tempfile.NamedTemporaryFile(
- prefix="oxygine", delete=False)
- bm_config_temp.close()
- bm_config_temp = bm_config_temp.name
- # font_size = get_bmfc_fontSize(bm_config)
- def rewrite_config(bm_original, bm_new, pngHeight):
- font_file = open(bm_original, "r")
- scaled_font_file = open(bm_new, "w")
- lines = font_file.readlines()
- for line in lines:
- # line = ""
- spl = line.split("=")
- if spl[0] == "fontSize":
- new_size = int(abs(int(spl[1])) * scale + 0.5)
- new_size = -new_size
- line = "fontSize=%(size)d\n" % {"size": new_size}
- if spl[0] == "outHeight":
- line = "outHeight=%(pngHeight)d\n" % {"pngHeight": pngHeight}
- scaled_font_file.write(line)
- font_file.close()
- scaled_font_file.close()
- rewrite_config(bm_config, bm_config_temp, 1024)
- lang = font_chars
- bmfont = os.path.split(__file__)[0] + \
- "/../../3rdPartyTools/BMFont/bmfont.com"
- cmd = "%(bmfont)s -t %(lang)s -c %(bmfc)s -o %(fnt)s" % {
- "bmfont": bmfont, "bmfc": bm_config_temp, "fnt": fnt, "lang": lang}
- cmd = cmd.replace("/", "\\")
- os.system(cmd)
- png_file = os.path.splitext(fnt)[0] + "_0.png"
- font_image = Image.open(png_file)
- font_image.load()
- _, _, _, a = font_image.split()
- bbox = a.getbbox()
- h = bbox[3] + 2
- if h > 512:
- h = 1024
- elif h > 256:
- h = 512
- elif h > 128:
- h = 256
- elif h > 64:
- h = 128
- elif h < 64:
- h = 64
- del font_image
- rewrite_config(bm_config, bm_config_temp, h)
- os.system(cmd)
- if need_md5:
- # if 0:
- md = hashlib.md5()
- md.update(open(bm_config_temp).read())
- md.update(open(lang).read())
- with open(os.path.split(fnt)[0] + "/md5.oxygine", "a") as m:
- m.write("%s\n%s\n" % (os.path.split(png_file)[1], md.hexdigest()))
- m.write("%s\n%s\n" % (os.path.split(fnt)[1], md.hexdigest()))
- file = open(fnt, "r")
- doc = minidom.parse(file)
- kern = doc.documentElement.getElementsByTagName("kernings")
- if kern:
- el = kern[0]
- el.parentNode.removeChild(el)
- pages = doc.documentElement.getElementsByTagName("pages")[0]
- for page in pages.getElementsByTagName("page"):
- fn = os.path.split(page.getAttribute("file"))[1]
- page.setAttribute("file", fn)
- file.close()
- file = open(fnt, "w")
- doc.writexml(file)
- file.close()
- os.remove(bm_config_temp)
|