/examples/opengl.py

https://github.com/titusz/freetype-py · Python · 122 lines · 97 code · 12 blank · 13 comment · 11 complexity · e464eb130864b885ca1ec0fcfdf0664f MD5 · raw file

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # -----------------------------------------------------------------------------
  4. #
  5. # FreeType high-level python API - Copyright 2011 Nicolas P. Rougier
  6. # Distributed under the terms of the new BSD license.
  7. #
  8. # -----------------------------------------------------------------------------
  9. import numpy
  10. from freetype import *
  11. import OpenGL.GL as gl
  12. import OpenGL.GLUT as glut
  13. base, texid = 0, 0
  14. text = '''Hello World !'''
  15. def on_display( ):
  16. global texid
  17. gl.glClearColor(1,1,1,1)
  18. gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
  19. gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
  20. gl.glColor(0,0,0,1)
  21. gl.glPushMatrix( )
  22. gl.glTranslate( 10, 100, 0 )
  23. gl.glPushMatrix( )
  24. gl.glListBase( base+1 )
  25. gl.glCallLists( [ord(c) for c in text] )
  26. gl.glPopMatrix( )
  27. gl.glPopMatrix( )
  28. glut.glutSwapBuffers( )
  29. def on_reshape( width, height ):
  30. gl.glViewport( 0, 0, width, height )
  31. gl.glMatrixMode( gl.GL_PROJECTION )
  32. gl.glLoadIdentity( )
  33. gl.glOrtho( 0, width, 0, height, -1, 1 )
  34. gl.glMatrixMode( gl.GL_MODELVIEW )
  35. gl.glLoadIdentity( )
  36. def on_keyboard( key, x, y ):
  37. if key == '\033': sys.exit( )
  38. def makefont(filename, size):
  39. global texid
  40. # Load font and check it is monotype
  41. face = Face(filename)
  42. face.set_char_size( size*64 )
  43. if not face.is_fixed_width:
  44. raise 'Font is not monotype'
  45. # Determine largest glyph size
  46. width, height, ascender, descender = 0, 0, 0, 0
  47. for c in range(32,128):
  48. face.load_char( chr(c), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
  49. bitmap = face.glyph.bitmap
  50. width = max( width, bitmap.width )
  51. ascender = max( ascender, face.glyph.bitmap_top )
  52. descender = max( descender, bitmap.rows-face.glyph.bitmap_top )
  53. height = ascender+descender
  54. # Generate texture data
  55. Z = numpy.zeros((height*6, width*16), dtype=numpy.ubyte)
  56. for j in range(6):
  57. for i in range(16):
  58. face.load_char(chr(32+j*16+i), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
  59. bitmap = face.glyph.bitmap
  60. x = i*width + face.glyph.bitmap_left
  61. y = j*height + ascender - face.glyph.bitmap_top
  62. Z[y:y+bitmap.rows,x:x+bitmap.width].flat = bitmap.buffer
  63. # Bound texture
  64. texid = gl.glGenTextures(1)
  65. gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
  66. gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR )
  67. gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR )
  68. gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_ALPHA, Z.shape[1], Z.shape[0], 0,
  69. gl.GL_ALPHA, gl.GL_UNSIGNED_BYTE, Z )
  70. # Generate display lists
  71. dx, dy = width/float(Z.shape[1]), height/float(Z.shape[0])
  72. base = gl.glGenLists(8*16)
  73. for i in range(8*16):
  74. c = chr(i)
  75. x = i%16
  76. y = i//16-2
  77. gl.glNewList(base+i, gl.GL_COMPILE)
  78. if (c == '\n'):
  79. gl.glPopMatrix( )
  80. gl.glTranslatef( 0, -height, 0 )
  81. gl.glPushMatrix( )
  82. elif (c == '\t'):
  83. gl.glTranslatef( 4*width, 0, 0 )
  84. elif (i >= 32):
  85. gl.glBegin( gl.GL_QUADS )
  86. gl.glTexCoord2f( (x )*dx, (y+1)*dy ), gl.glVertex( 0, -height )
  87. gl.glTexCoord2f( (x )*dx, (y )*dy ), gl.glVertex( 0, 0 )
  88. gl.glTexCoord2f( (x+1)*dx, (y )*dy ), gl.glVertex( width, 0 )
  89. gl.glTexCoord2f( (x+1)*dx, (y+1)*dy ), gl.glVertex( width, -height )
  90. gl.glEnd( )
  91. gl.glTranslatef( width, 0, 0 )
  92. gl.glEndList( )
  93. if __name__ == '__main__':
  94. import sys
  95. glut.glutInit( sys.argv )
  96. glut.glutInitDisplayMode( glut.GLUT_DOUBLE | glut.GLUT_RGB | glut.GLUT_DEPTH )
  97. glut.glutCreateWindow( "Freetype OpenGL" )
  98. glut.glutReshapeWindow( 600, 100 )
  99. glut.glutDisplayFunc( on_display )
  100. glut.glutReshapeFunc( on_reshape )
  101. glut.glutKeyboardFunc( on_keyboard )
  102. gl.glTexEnvf( gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE )
  103. gl.glEnable( gl.GL_DEPTH_TEST )
  104. gl.glEnable( gl.GL_BLEND )
  105. gl.glEnable( gl.GL_COLOR_MATERIAL )
  106. gl.glColorMaterial( gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE )
  107. gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA )
  108. gl.glEnable( gl.GL_TEXTURE_2D )
  109. makefont( './VeraMono.ttf', 64 )
  110. glut.glutMainLoop( )