137 lines
4.4 KiB
Python
137 lines
4.4 KiB
Python
"""
|
|
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
|