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 134 135 136
|
"""
EXPERIMENTAL CODE!
Here we load a .TTF font file, and display it in
a basic pygame window. It demonstrates several of the
Font object attributes. Nothing exciting in here, but
it makes a great example for basic window, event, and
font management.
"""
import pygame
import math
from pygame.locals import *
from pygame import Surface
from pygame.surfarray import blit_array, make_surface, pixels3d, pixels2d
import Numeric
from Foundation import *
from AppKit import *
def _getColor(color=None):
if color is None:
return NSColor.clearColor()
div255 = (0.00390625).__mul__
if len(color) == 3:
color = tuple(color) + (255.0,)
return NSColor.colorWithDeviceRed_green_blue_alpha_(*map(div255, color))
def _getBitmapImageRep(size, hasAlpha=True):
width, height = map(int, size)
return NSBitmapImageRep.alloc().initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel_(None, width, height, 8, 4, hasAlpha, False, NSDeviceRGBColorSpace, width*4, 32)
class SysFont(object):
def __init__(self, name, size):
self._font = NSFont.fontWithName_size_(name, size)
self._isBold = False
self._isOblique = False
self._isUnderline = False
self._family = name
self._size = size
self._setupFont()
def _setupFont(self):
name = self._family
if self._isBold or self._isOblique:
name = '%s-%s%s' % (
name,
self._isBold and 'Bold' or '',
self._isOblique and 'Oblique' or '')
self._font = NSFont.fontWithName_size_(name, self._size)
print (name, self._font)
if self._font is None:
if self._isBold:
self._font = NSFont.boldSystemFontOfSize(self._size)
else:
self._font = NSFont.systemFontOfSize_(self._size)
def get_ascent(self):
return self._font.ascender()
def get_descent(self):
return -self._font.descender()
def get_bold(self):
return self._isBold
def get_height(self):
return self._font.defaultLineHeightForFont()
def get_italic(self):
return self._isOblique
def get_linesize(self):
pass
def get_underline(self):
return self._isUnderline
def set_bold(self, isBold):
if isBold != self._isBold:
self._isBold = isBold
self._setupFont()
def set_italic(self, isOblique):
if isOblique != self._isOblique:
self._isOblique = isOblique
self._setupFont()
def set_underline(self, isUnderline):
self._isUnderline = isUnderline
def size(self, text):
return tuple(map(int,map(math.ceil, NSString.sizeWithAttributes_(text, {
NSFontAttributeName: self._font,
NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None,
}))))
def render(self, text, antialias, forecolor, backcolor=(0,0,0,255)):
size = self.size(text)
img = NSImage.alloc().initWithSize_(size)
img.lockFocus()
NSString.drawAtPoint_withAttributes_(text, (0.0, 0.0), {
NSFontAttributeName: self._font,
NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None,
NSBackgroundColorAttributeName: backcolor and _getColor(backcolor) or None,
NSForegroundColorAttributeName: _getColor(forecolor),
})
rep = NSBitmapImageRep.alloc().initWithFocusedViewRect_(((0.0, 0.0), size))
img.unlockFocus()
if rep.samplesPerPixel() == 4:
s = Surface(size, SRCALPHA|SWSURFACE, 32, [-1<<24,0xff<<16,0xff<<8,0xff])
a = Numeric.reshape(Numeric.fromstring(rep.bitmapData(), typecode=Numeric.Int32), (size[1], size[0]))
blit_array(s, Numeric.swapaxes(a,0,1))
return s.convert_alpha()
if __name__=='__main__':
pygame.init()
screen = pygame.display.set_mode((600, 600))
s = SysFont('Gill Sans', 36)
s.set_italic(1)
s.set_underline(1)
done = False
surf = s.render('OS X Fonts!', True, (255,0,0,255), (0,0,0,0))
screen.blit(surf, (0,0))
screen.blit(surf, (2, 2))
pygame.display.update()
while not done:
for e in pygame.event.get():
if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE):
done = True
break
|