summaryrefslogtreecommitdiff
path: root/third_party/freetype-py/examples/opengl.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/freetype-py/examples/opengl.py')
-rw-r--r--third_party/freetype-py/examples/opengl.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/third_party/freetype-py/examples/opengl.py b/third_party/freetype-py/examples/opengl.py
new file mode 100644
index 0000000..19309be
--- /dev/null
+++ b/third_party/freetype-py/examples/opengl.py
@@ -0,0 +1,122 @@
+#!/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.
+#
+# -----------------------------------------------------------------------------
+import numpy
+from freetype import *
+import OpenGL.GL as gl
+import OpenGL.GLUT as glut
+
+base, texid = 0, 0
+text = '''Hello World !'''
+
+def on_display( ):
+ global texid
+ gl.glClearColor(1,1,1,1)
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
+ gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
+ gl.glColor(0,0,0,1)
+ gl.glPushMatrix( )
+ gl.glTranslate( 10, 100, 0 )
+ gl.glPushMatrix( )
+ gl.glListBase( base+1 )
+ gl.glCallLists( [ord(c) for c in text] )
+ gl.glPopMatrix( )
+ gl.glPopMatrix( )
+ glut.glutSwapBuffers( )
+
+def on_reshape( width, height ):
+ gl.glViewport( 0, 0, width, height )
+ gl.glMatrixMode( gl.GL_PROJECTION )
+ gl.glLoadIdentity( )
+ gl.glOrtho( 0, width, 0, height, -1, 1 )
+ gl.glMatrixMode( gl.GL_MODELVIEW )
+ gl.glLoadIdentity( )
+
+def on_keyboard( key, x, y ):
+ if key == '\033': sys.exit( )
+
+def makefont(filename, size):
+ global texid
+
+ # Load font and check it is monotype
+ face = Face(filename)
+ face.set_char_size( size*64 )
+ if not face.is_fixed_width:
+ raise 'Font is not monotype'
+
+ # Determine largest glyph size
+ width, height, ascender, descender = 0, 0, 0, 0
+ for c in range(32,128):
+ face.load_char( chr(c), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
+ bitmap = face.glyph.bitmap
+ width = max( width, bitmap.width )
+ ascender = max( ascender, face.glyph.bitmap_top )
+ descender = max( descender, bitmap.rows-face.glyph.bitmap_top )
+ height = ascender+descender
+
+ # Generate texture data
+ Z = numpy.zeros((height*6, width*16), dtype=numpy.ubyte)
+ for j in range(6):
+ for i in range(16):
+ face.load_char(chr(32+j*16+i), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
+ bitmap = face.glyph.bitmap
+ x = i*width + face.glyph.bitmap_left
+ y = j*height + ascender - face.glyph.bitmap_top
+ Z[y:y+bitmap.rows,x:x+bitmap.width].flat = bitmap.buffer
+
+ # Bound texture
+ texid = gl.glGenTextures(1)
+ gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
+ gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR )
+ gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR )
+ gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_ALPHA, Z.shape[1], Z.shape[0], 0,
+ gl.GL_ALPHA, gl.GL_UNSIGNED_BYTE, Z )
+
+ # Generate display lists
+ dx, dy = width/float(Z.shape[1]), height/float(Z.shape[0])
+ base = gl.glGenLists(8*16)
+ for i in range(8*16):
+ c = chr(i)
+ x = i%16
+ y = i//16-2
+ gl.glNewList(base+i, gl.GL_COMPILE)
+ if (c == '\n'):
+ gl.glPopMatrix( )
+ gl.glTranslatef( 0, -height, 0 )
+ gl.glPushMatrix( )
+ elif (c == '\t'):
+ gl.glTranslatef( 4*width, 0, 0 )
+ elif (i >= 32):
+ gl.glBegin( gl.GL_QUADS )
+ gl.glTexCoord2f( (x )*dx, (y+1)*dy ), gl.glVertex( 0, -height )
+ gl.glTexCoord2f( (x )*dx, (y )*dy ), gl.glVertex( 0, 0 )
+ gl.glTexCoord2f( (x+1)*dx, (y )*dy ), gl.glVertex( width, 0 )
+ gl.glTexCoord2f( (x+1)*dx, (y+1)*dy ), gl.glVertex( width, -height )
+ gl.glEnd( )
+ gl.glTranslatef( width, 0, 0 )
+ gl.glEndList( )
+
+
+if __name__ == '__main__':
+ import sys
+ glut.glutInit( sys.argv )
+ glut.glutInitDisplayMode( glut.GLUT_DOUBLE | glut.GLUT_RGB | glut.GLUT_DEPTH )
+ glut.glutCreateWindow( "Freetype OpenGL" )
+ glut.glutReshapeWindow( 600, 100 )
+ glut.glutDisplayFunc( on_display )
+ glut.glutReshapeFunc( on_reshape )
+ glut.glutKeyboardFunc( on_keyboard )
+ gl.glTexEnvf( gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE )
+ gl.glEnable( gl.GL_DEPTH_TEST )
+ gl.glEnable( gl.GL_BLEND )
+ gl.glEnable( gl.GL_COLOR_MATERIAL )
+ gl.glColorMaterial( gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE )
+ gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA )
+ gl.glEnable( gl.GL_TEXTURE_2D )
+ makefont( './VeraMono.ttf', 64 )
+ glut.glutMainLoop( )