AL-2020/venv/Lib/site-packages/pygame/examples/macosx/macfont.py

137 lines
4.4 KiB
Python
Raw Normal View History

2020-05-15 17:25:01 +02:00
"""
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