コード例 #1
0
def _add_HVAR(font, model, master_ttfs, axisTags):

    print("Generating HVAR")

    hAdvanceDeltas = {}
    metricses = [m["hmtx"].metrics for m in master_ttfs]
    for glyph in font.getGlyphOrder():
        hAdvances = [metrics[glyph][0] for metrics in metricses]
        # TODO move round somewhere else?
        hAdvanceDeltas[glyph] = tuple(
            round(d) for d in model.getDeltas(hAdvances)[1:])

    # We only support the direct mapping right now.

    supports = model.supports[1:]
    varTupleList = builder.buildVarRegionList(supports, axisTags)
    varTupleIndexes = list(range(len(supports)))
    n = len(supports)
    items = []
    zeroes = [0] * n
    for glyphName in font.getGlyphOrder():
        items.append(hAdvanceDeltas.get(glyphName, zeroes))
    while items and items[-1] is zeroes:
        del items[-1]

    advanceMapping = None
    # Add indirect mapping to save on duplicates
    uniq = set(items)
    # TODO Improve heuristic
    if (len(items) - len(uniq)) * len(varTupleIndexes) > len(items):
        newItems = sorted(uniq)
        mapper = {v: i for i, v in enumerate(newItems)}
        mapping = [mapper[item] for item in items]
        while len(mapping) > 1 and mapping[-1] == mapping[-2]:
            del mapping[-1]
        advanceMapping = builder.buildVarIdxMap(mapping)
        items = newItems
        del mapper, mapping, newItems
    del uniq

    varData = builder.buildVarData(varTupleIndexes, items)
    varStore = builder.buildVarStore(varTupleList, [varData])

    assert "HVAR" not in font
    HVAR = font["HVAR"] = newTable('HVAR')
    hvar = HVAR.table = ot.HVAR()
    hvar.Version = 0x00010000
    hvar.VarStore = varStore
    hvar.AdvWidthMap = advanceMapping
    hvar.LsbMap = hvar.RsbMap = None
コード例 #2
0
def _add_HVAR(font, masterModel, master_ttfs, axisTags):

    log.info("Generating HVAR")

    glyphOrder = font.getGlyphOrder()

    hAdvanceDeltasAndSupports = {}
    metricses = [m["hmtx"].metrics for m in master_ttfs]
    for glyph in glyphOrder:
        hAdvances = [
            metrics[glyph][0] if glyph in metrics else None
            for metrics in metricses
        ]
        hAdvanceDeltasAndSupports[glyph] = masterModel.getDeltasAndSupports(
            hAdvances)

    singleModel = models.allEqual(
        id(v[1]) for v in hAdvanceDeltasAndSupports.values())

    directStore = None
    if singleModel:
        # Build direct mapping

        supports = next(iter(hAdvanceDeltasAndSupports.values()))[1][1:]
        varTupleList = builder.buildVarRegionList(supports, axisTags)
        varTupleIndexes = list(range(len(supports)))
        varData = builder.buildVarData(varTupleIndexes, [], optimize=False)
        for glyphName in glyphOrder:
            varData.addItem(hAdvanceDeltasAndSupports[glyphName][0])
        varData.optimize()
        directStore = builder.buildVarStore(varTupleList, [varData])

    # Build optimized indirect mapping
    storeBuilder = varStore.OnlineVarStoreBuilder(axisTags)
    mapping = {}
    for glyphName in glyphOrder:
        deltas, supports = hAdvanceDeltasAndSupports[glyphName]
        storeBuilder.setSupports(supports)
        mapping[glyphName] = storeBuilder.storeDeltas(deltas)
    indirectStore = storeBuilder.finish()
    mapping2 = indirectStore.optimize()
    mapping = [mapping2[mapping[g]] for g in glyphOrder]
    advanceMapping = builder.buildVarIdxMap(mapping, glyphOrder)

    use_direct = False
    if directStore:
        # Compile both, see which is more compact

        writer = OTTableWriter()
        directStore.compile(writer, font)
        directSize = len(writer.getAllData())

        writer = OTTableWriter()
        indirectStore.compile(writer, font)
        advanceMapping.compile(writer, font)
        indirectSize = len(writer.getAllData())

        use_direct = directSize < indirectSize

    # Done; put it all together.
    assert "HVAR" not in font
    HVAR = font["HVAR"] = newTable('HVAR')
    hvar = HVAR.table = ot.HVAR()
    hvar.Version = 0x00010000
    hvar.LsbMap = hvar.RsbMap = None
    if use_direct:
        hvar.VarStore = directStore
        hvar.AdvWidthMap = None
    else:
        hvar.VarStore = indirectStore
        hvar.AdvWidthMap = advanceMapping
コード例 #3
0
ファイル: __init__.py プロジェクト: lisuke/fonttools
def _add_HVAR(font, model, master_ttfs, axisTags):

    log.info("Generating HVAR")

    hAdvanceDeltas = {}
    metricses = [m["hmtx"].metrics for m in master_ttfs]
    for glyph in font.getGlyphOrder():
        hAdvances = [metrics[glyph][0] for metrics in metricses]
        # TODO move round somewhere else?
        hAdvanceDeltas[glyph] = tuple(
            round(d) for d in model.getDeltas(hAdvances)[1:])

    # Direct mapping
    supports = model.supports[1:]
    varTupleList = builder.buildVarRegionList(supports, axisTags)
    varTupleIndexes = list(range(len(supports)))
    n = len(supports)
    items = []
    for glyphName in font.getGlyphOrder():
        items.append(hAdvanceDeltas[glyphName])

    # Build indirect mapping to save on duplicates, compare both sizes
    uniq = list(set(items))
    mapper = {v: i for i, v in enumerate(uniq)}
    mapping = [mapper[item] for item in items]
    advanceMapping = builder.buildVarIdxMap(mapping, font.getGlyphOrder())

    # Direct
    varData = builder.buildVarData(varTupleIndexes, items)
    directStore = builder.buildVarStore(varTupleList, [varData])

    # Indirect
    varData = builder.buildVarData(varTupleIndexes, uniq)
    indirectStore = builder.buildVarStore(varTupleList, [varData])
    mapping = indirectStore.optimize()
    advanceMapping.mapping = {
        k: mapping[v]
        for k, v in advanceMapping.mapping.items()
    }

    # Compile both, see which is more compact

    writer = OTTableWriter()
    directStore.compile(writer, font)
    directSize = len(writer.getAllData())

    writer = OTTableWriter()
    indirectStore.compile(writer, font)
    advanceMapping.compile(writer, font)
    indirectSize = len(writer.getAllData())

    use_direct = directSize < indirectSize

    # Done; put it all together.
    assert "HVAR" not in font
    HVAR = font["HVAR"] = newTable('HVAR')
    hvar = HVAR.table = ot.HVAR()
    hvar.Version = 0x00010000
    hvar.LsbMap = hvar.RsbMap = None
    if use_direct:
        hvar.VarStore = directStore
        hvar.AdvWidthMap = None
    else:
        hvar.VarStore = indirectStore
        hvar.AdvWidthMap = advanceMapping