-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfont_ascii.py
More file actions
133 lines (117 loc) · 4.75 KB
/
font_ascii.py
File metadata and controls
133 lines (117 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
#
# FreeType high-level python API - Copyright 2011-2015 Nicolas P. Rougier
# Distributed under the terms of the new BSD license.
#
# -----------------------------------------------------------------------------
import numpy
import os, sys
from freetype import *
class ColorMap:
''' A colormap is used to map scalar values to colors. It is build by
adding couples of (value,color) where value must be between 0 and 1.
The 'scale' method allows to specify the range of the colormap and
the 'color' method then returns a color for any value. '''
def __init__ (self, colors):
self.colors = colors
self.min = 0
self.max = 1
def scale (self, min, max):
self.min, self.max = min,max
def color (self, value):
''' Return the color corresponding to value. '''
if not len(self.colors):
return (0,0,0)
elif len(self.colors) == 1:
return self.colors[0][1]
elif value < self.min:
return self.colors[0][1]
elif value > self.max:
return self.colors[-1][1]
value = (value-self.min)/(self.max-self.min)
sup_color = self.colors[0]
inf_color = self.colors[-1]
for i in range (len(self.colors)-1):
if value < self.colors[i+1][0]:
inf_color = self.colors[i]
sup_color = self.colors[i+1]
break
r = (value-inf_color[0]) / (sup_color[0] - inf_color[0])
if r < 0: r = -r
color = [sup_color[1][0]*r + inf_color[1][0]*(1-r),
sup_color[1][1]*r + inf_color[1][1]*(1-r),
sup_color[1][2]*r + inf_color[1][2]*(1-r)]
return color
# Some colormaps
CM_IceAndFire = ColorMap([(0.00, (0.0, 0.0, 1.0)),
(0.25, (0.0, 0.5, 1.0)),
(0.50, (1.0, 1.0, 1.0)),
(0.75, (1.0, 1.0, 0.0)),
(1.00, (1.0, 0.0, 0.0))])
CM_Ice = ColorMap([(0.00, (0.0, 0.0, 1.0)),
(0.50, (0.5, 0.5, 1.0)),
(1.00, (1.0, 1.0, 1.0))])
CM_Fire = ColorMap([(0.00, (1.0, 1.0, 1.0)),
(0.50, (1.0, 1.0, 0.0)),
(1.00, (1.0, 0.0, 0.0))])
CM_Hot = ColorMap([(0.00, (0.0, 0.0, 0.0)),
(0.33, (1.0, 0.0, 0.0)),
(0.66, (1.0, 1.0, 0.0)),
(1.00, (1.0, 1.0, 1.0))])
CM_InvGrey = ColorMap([(0.00, (0.0, 0.0, 0.0)), (1.00, (1.0, 1.0, 1.0))])
CM_Grey = ColorMap([(0.00, (1.0, 1.0, 1.0)), (1.00, (0.0, 0.0, 0.0))])
def imshow (Z, vmin=None, vmax=None, cmap=CM_Hot, show_cmap=False):
''' Show a 2D numpy array using terminal colors '''
if len(Z.shape) != 2:
print ("Cannot display non 2D array")
return
vmin = vmin or Z.min()
vmax = vmax or Z.max()
cmap.scale (vmin, vmax)
# Build initialization string that setup terminal colors
init = ''
for i in range(240):
v = cmap.min + (i/240.0)* (cmap.max - cmap.min)
r,g,b = cmap.color (v)
init += "\x1b]4;%d;rgb:%02x/%02x/%02x\x1b\\" % (16+i, int(r*255),int(g*255),int(b*255))
# Build array data string
data = ''
for i in range(Z.shape[0]):
for j in range(Z.shape[1]):
c = 16 + int( ((Z[Z.shape[0]-i-1,j]-cmap.min) / (cmap.max-cmap.min))*239)
if (c < 16):
c=16
elif (c > 255):
c=255
data += "\x1b[48;5;%dm " % c
u = cmap.max - (i/float(Z.shape[0]-1)) * ((cmap.max-cmap.min))
if show_cmap:
data += "\x1b[0m "
data += "\x1b[48;5;%dm " % (16 + (1-i/float(Z.shape[0]))*239)
data += "\x1b[0m %+.2f" % u
data += "\x1b[0m\n"
print (init+data[:-1]+'\x1b[0m')
if __name__ == '__main__':
name = "fonts/cour.ttf" if len(sys.argv) <= 1 else sys.argv[1]
#text = 'Wg|JKR' if len(sys.argv) <= 2 else sys.argv[2]
text = 'S' if len(sys.argv) <= 2 else sys.argv[2]
face = Face(name)
#face.set_char_size( 16*64 )
face.set_pixel_sizes(0,32)
print("height:",face.height)
print("ascent:",face.ascender)
print("descent:",face.descender)
for i in text:
face.load_glyph(face.get_char_index(i))
slot = face.glyph
print()
print('WxH:',slot.bitmap.width,'x',slot.bitmap.rows)
print('top/left:',slot.bitmap_top,'/',slot.bitmap_left)
print('advance x/y:',slot.advance.x//64,'/',slot.advance.y)
bitmap = slot.bitmap
data, rows, width = bitmap.buffer, bitmap.rows, bitmap.width
Z = numpy.array(data,dtype=float).reshape(rows,width)
Z = Z[::-1,:]
imshow (Z, cmap=CM_Grey)