diff options
author | Roozbeh Pournader <roozbeh@google.com> | 2015-01-13 08:50:27 -0800 |
---|---|---|
committer | James Godfrey-Kittle <jamesgk@google.com> | 2015-04-16 12:16:25 -0700 |
commit | 36623f13d922461c897fe0ae1ff550a073385329 (patch) | |
tree | 9339ab434222da3393491673ea12090de381495b /third_party/freetype-py/examples/glyph-vector-2.py | |
parent | 9fc4898c2338e4b9bb028171f5f8492f01879fbe (diff) |
Add FreeType python bindings to third_party.
Diffstat (limited to 'third_party/freetype-py/examples/glyph-vector-2.py')
-rw-r--r-- | third_party/freetype-py/examples/glyph-vector-2.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/third_party/freetype-py/examples/glyph-vector-2.py b/third_party/freetype-py/examples/glyph-vector-2.py new file mode 100644 index 0000000..fc2c7da --- /dev/null +++ b/third_party/freetype-py/examples/glyph-vector-2.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# ----------------------------------------------------------------------------- +# +# FreeType high-level python API - Copyright 2011 Nicolas P. Rougier +# Distributed under the terms of the new BSD license. +# +# ----------------------------------------------------------------------------- +''' +Show how to access glyph outline description. +''' +from freetype import * + +if __name__ == '__main__': + import numpy + import matplotlib.pyplot as plt + from matplotlib.path import Path + import matplotlib.patches as patches + + face = Face('./Vera.ttf') + face.set_char_size( 32*64 ) + face.load_char('g') + slot = face.glyph + + bitmap = face.glyph.bitmap + width = face.glyph.bitmap.width + rows = face.glyph.bitmap.rows + pitch = face.glyph.bitmap.pitch + + data = [] + for i in range(rows): + data.extend(bitmap.buffer[i*pitch:i*pitch+width]) + Z = numpy.array(data,dtype=numpy.ubyte).reshape(rows, width) + + outline = slot.outline + points = numpy.array(outline.points, dtype=[('x',float), ('y',float)]) + x, y = points['x'], points['y'] + + figure = plt.figure(figsize=(8,10)) + axis = figure.add_subplot(111) + #axis.scatter(points['x'], points['y'], alpha=.25) + start, end = 0, 0 + + VERTS, CODES = [], [] + # Iterate over each contour + for i in range(len(outline.contours)): + end = outline.contours[i] + points = outline.points[start:end+1] + points.append(points[0]) + tags = outline.tags[start:end+1] + tags.append(tags[0]) + + segments = [ [points[0],], ] + for j in range(1, len(points) ): + segments[-1].append(points[j]) + if tags[j] & (1 << 0) and j < (len(points)-1): + segments.append( [points[j],] ) + verts = [points[0], ] + codes = [Path.MOVETO,] + for segment in segments: + if len(segment) == 2: + verts.extend(segment[1:]) + codes.extend([Path.LINETO]) + elif len(segment) == 3: + verts.extend(segment[1:]) + codes.extend([Path.CURVE3, Path.CURVE3]) + else: + verts.append(segment[1]) + codes.append(Path.CURVE3) + for i in range(1,len(segment)-2): + A,B = segment[i], segment[i+1] + C = ((A[0]+B[0])/2.0, (A[1]+B[1])/2.0) + verts.extend([ C, B ]) + codes.extend([ Path.CURVE3, Path.CURVE3]) + verts.append(segment[-1]) + codes.append(Path.CURVE3) + VERTS.extend(verts) + CODES.extend(codes) + start = end+1 + + + # Draw glyph + path = Path(VERTS, CODES) + glyph = patches.PathPatch(path, fill = True, facecolor=(0.8,0.5,0.8), alpha=.25, lw=0) + glyph_outline = patches.PathPatch(path, fill = False, edgecolor='black', lw=3) + + plt.imshow(Z, extent=[x.min(), x.max(),y.min(), y.max()], origin='lower', + interpolation='nearest', cmap = plt.cm.gray_r, vmin=0, vmax=400) + plt.xticks(numpy.linspace(x.min(), x.max(), Z.shape[1]+1), ()) + plt.yticks(numpy.linspace(y.min(), y.max(), Z.shape[0]+1), ()) + plt.grid(color='k', linewidth=1, linestyle='-') + axis.add_patch(glyph) + axis.add_patch(glyph_outline) + axis.set_xlim(x.min(), x.max()) + axis.set_ylim(y.min(), y.max()) + + plt.savefig('test.svg') + plt.show() |