Advertisement
IncludeUrl

ocbf.py

May 1st, 2018
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.05 KB | None | 0 0
  1. import os
  2. import re
  3. import argparse
  4. import struct
  5. from PIL import Image, ImageDraw, ImageFont
  6. from itertools import chain, product
  7. from tqdm import tqdm
  8. from bitarray import bitarray
  9.  
  10. def argrange(string):
  11.     m = re.match("^([0-9a-fA-F]+)-([0-9a-fA-F]+)$", string)
  12.     lhs, rhs = m.groups()
  13.     return (int(lhs, 16), int(rhs, 16))
  14.  
  15. parser = argparse.ArgumentParser(description="OCBF font converter")
  16. parser.add_argument("font", type=str, help="a ttf font for conversion")
  17. parser.add_argument("sizes", metavar="size", type=int,
  18.                     nargs="+", help="font sizes in points")
  19. parser.add_argument("-o", "--out", type=str, help="output path")
  20. parser.add_argument("-r", "--ranges", metavar="range", type=argrange,
  21.                     default=[(0x0020, 0x007F), (0x00A0, 0x00FF), (0x0400, 0x04FF)],
  22.                     nargs="+", help="unicode ranges (HEX-HEX)")
  23.  
  24. args = parser.parse_args()
  25. args.out = args.out or os.path.splitext(args.font)[0] + '.ocbf'
  26.  
  27. out = None
  28. try:
  29.     out = open(args.out, "wb")
  30. except Exception as e:
  31.     parser.error(e)
  32.  
  33. font = None
  34. try:
  35.     font = ImageFont.truetype(args.font, size=16, encoding="unic")
  36. except Exception as e:
  37.     parser.error(e)
  38.  
  39. name, family = font.getname()
  40. name = name.encode("utf8")
  41. family = family.encode("utf8")
  42.  
  43. out.write(b"ocbf")
  44. out.write(struct.pack(">B", len(name)))
  45. out.write(name)
  46. out.write(struct.pack(">B", len(family)))
  47. out.write(family)
  48.  
  49. total = len(args.sizes) * sum(map(lambda a: a[1] - a[0], args.ranges))
  50. for size, char in tqdm(product(args.sizes, map(chr, chain.from_iterable(
  51.                                map(lambda a: range(a[0], a[1]), args.ranges)))),
  52.                        total=total, leave=False):
  53.     font = font.font_variant(size=int(size * 0.75))
  54.     width, _ = font.getsize(char)
  55.     image = Image.new("1", (width, size))
  56.     draw = ImageDraw.Draw(image)
  57.     draw.text((0, 0), char, font=font, fill=1)
  58.    
  59.     out.write(char.encode("utf8"))
  60.     out.write(struct.pack(">BB", size, width))
  61.    
  62.     bitarray(image.getdata()).tofile(out)
  63.  
  64. out.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement