blob: 97da3672515bbed3efda6386f9042a77ae4a2553 [file] [log] [blame]
"""Generates a Graphviz DOT file representing the (directed) graph of OTTableWriter objects."""
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.ttLib import TTFont
from fontTools.ttLib.tables.otBase import OTTableWriter
import logging
import sys
import math
from collections import deque
log = logging.getLogger(__name__)
def writerId(writer):
s = '"' + writer.name
if hasattr(writer, 'repeatIndex'):
s += ' ' + str(writer.repeatIndex)
s += '\n' + str(id(writer))
return s + '"'
def writerLabel(writer):
size = writer.getDataLength()
return "%s\n%s bytes" % (writer.name, size)
def graph(font, tableTags, stream=sys.stdout):
f = stream
for tableTag in tableTags:
log.debug("Processing %s", tableTag)
table = font[tableTag].table
writer = OTTableWriter(tableTag=tableTag)
writer.name = tableTag
table.compile(writer, font)
f.write("digraph %s {\n" % tableTag)
f.write(" rankdir=LR;\n")
names = {}
queue = deque()
queue.append (writer)
names[id(writer)] = tableTag
f.write('graph [root=%s];\n' % tableTag)
f.write('node [margin=0,width=0,height=0];\n')
while queue:
writer = queue.popleft()
lhs = names[id(writer)]
label = writerLabel(writer)
size = writer.getDataLength()
fontsize = 5+math.log(size) * 4
color = "green" if len(writer.parents) > 1 else "black"
f.write('%s [fontsize=%s,label="%s",color=%s]\n' % (lhs, fontsize, label, color))
for item in writer.items:
if not hasattr(item, "getData"):
continue
offsetSize = 4 if item.longOffset else 2
rhs = writerId(item)
f.write(' '+lhs+' -> '+rhs+';\n')
if id(item) not in names:
names[id(item)] = rhs
queue.append(item)
f.write("}\n")
def main(args=None):
from fontTools import configLogger
if args is None:
args = sys.argv[1:]
# configure the library logger (for >= WARNING)
configLogger()
# comment this out to enable debug messages from logger
# log.setLevel(logging.DEBUG)
if len(args) < 1:
print("usage: fonttools ttLib.tables.distillery.dot font-file.ttf [table-tags...]", file=sys.stderr)
sys.exit(1)
font = TTFont(args[0])
tags = args[1:]
graph(font, tags)
if __name__ == '__main__':
import sys
sys.exit(main())