core text: fix size / width / height

This commit is contained in:
Mathieu Virbel 2010-11-05 22:47:54 -04:00
parent f80de20050
commit 7a27aab7d7
4 changed files with 40 additions and 27 deletions

View File

@ -51,7 +51,7 @@ class LabelBase(object):
_cache_glyphs = {}
def __init__(self, label, **kwargs):
def __init__(self, **kwargs):
kwargs.setdefault('font_size', 12)
kwargs.setdefault('font_name', DEFAULT_FONT)
kwargs.setdefault('bold', False)
@ -86,9 +86,9 @@ class LabelBase(object):
if uw != None:
kwargs['size'] = uw - kwargs['padding_x'] * 2, uh
super(LabelBase, self).__init__(**kwargs)
super(LabelBase, self).__init__()
self._label = None
self._text = None
self.color = kwargs.get('color')
self.usersize = kwargs.get('size')
@ -110,7 +110,7 @@ class LabelBase(object):
else:
label_font_cache[fontname] = None
self.label = label
self.text = kwargs.get('text', '')
def get_extents(self, text):
'''Return a tuple with (width, height) for a text.'''
@ -143,7 +143,7 @@ class LabelBase(object):
# no width specified, faster method
if uw is None:
for line in self.label.split('\n'):
for line in self.text.split('\n'):
lw, lh = self.get_extents(line)
if real:
x = 0
@ -166,7 +166,7 @@ class LabelBase(object):
if not real:
# verify that each glyph have size
glyphs = list(set(self.label))
glyphs = list(set(self.text))
for glyph in glyphs:
if not glyph in cache:
cache[glyph] = self.get_extents(glyph)
@ -175,7 +175,7 @@ class LabelBase(object):
glyphs = []
lines = []
lw = lh = 0
for word in re.split(r'( |\n)', self.label):
for word in re.split(r'( |\n)', self.text):
# calculate the word width
ww, wh = 0, 0
@ -262,7 +262,7 @@ class LabelBase(object):
def refresh(self):
'''Force re-rendering of the label'''
'''Force re-rendering of the text'''
# first pass, calculating width/height
sz = self.render()
self._size = sz
@ -271,22 +271,34 @@ class LabelBase(object):
self._size = sz[0] + self.options['padding_x'] * 2, \
sz[1] + self.options['padding_y'] * 2
def _get_label(self):
return self._label
def _set_label(self, label):
if label == self._label:
def _get_text(self):
return self._text
def _set_text(self, text):
if text == self._text:
return
# try to automaticly decode unicode
try:
self._label = label.decode('utf8')
self._text = text.decode('utf8')
except:
try:
self._label = str(label)
self._text = str(text)
except:
self._label = label
self._text = text
self.refresh()
label = property(_get_label, _set_label, doc='Get/Set the label text')
text = property(_get_label, _set_label, doc='Get/Set the label text')
text = property(_get_text, _set_text, doc='Get/Set the text')
label = property(_get_text, _set_text, doc='Get/Set the text')
@property
def size(self):
return self._size
@property
def width(self):
return self._size[0]
@property
def height(self):
return self._size[1]
@property
def content_width(self):

View File

@ -4,8 +4,8 @@ Text Cairo: Draw text with cairo
__all__ = ('LabelCairo', )
import kivy
from . import LabelBase
from kivy.core.image import ImageData
try:
import cairo
@ -61,7 +61,7 @@ class LabelCairo(LabelBase):
def _render_begin(self):
# create a surface, context, font...
self._cairo_surface = cairo.ImageSurface(
cairo.FORMAT_ARGB32, *self.size)
cairo.FORMAT_ARGB32, *self._size)
self._cairo_context = cairo.Context(self._cairo_surface)
self._select_font(self._cairo_context)
@ -74,7 +74,7 @@ class LabelCairo(LabelBase):
self._cairo_context.show_text(text)
def _render_end(self):
data = kivy.ImageData(self.width, self.height,
data = ImageData(self._size[0], self._size[1],
'RGBA', buffer(self._cairo_surface.get_data())[:])
del self._cairo_surface

View File

@ -9,9 +9,10 @@ try:
except:
raise
import kivy
import os
from . import LabelBase
from kivy import kivy_data_dir
from kivy.core.image import ImageData
# used for fetching extends before creature image surface
default_font = ImageFont.load_default()
@ -23,7 +24,7 @@ class LabelPIL(LabelBase):
fontname = self.options['font_name'].split(',')[0]
id = '%s.%s' % (unicode(fontname), unicode(fontsize))
if not id in self._cache:
filename = os.path.join(kivy.kivy_data_dir, 'DejaVuSans.ttf')
filename = os.path.join(kivy_data_dir, 'DejaVuSans.ttf')
font = ImageFont.truetype(filename, fontsize)
self._cache[id] = font
@ -36,7 +37,7 @@ class LabelPIL(LabelBase):
def _render_begin(self):
# create a surface, context, font...
self._pil_im = Image.new('RGBA', self.size)
self._pil_im = Image.new('RGBA', self._size)
self._pil_draw = ImageDraw.Draw(self._pil_im)
def _render_text(self, text, x, y):
@ -44,7 +45,7 @@ class LabelPIL(LabelBase):
self._pil_draw.text((int(x), int(y)), text, font=self._select_font(), fill=color)
def _render_end(self):
data = kivy.ImageData(self.width, self.height,
data = ImageData(self._size[0], self._size[1],
self._pil_im.mode, self._pil_im.tostring())
del self._pil_im

View File

@ -4,8 +4,8 @@ Text Pygame: Draw text with pygame
__all__ = ('LabelPygame', )
import kivy
from . import LabelBase
from kivy.core.image import ImageData
try:
import pygame
@ -55,7 +55,7 @@ class LabelPygame(LabelBase):
return w, h
def _render_begin(self):
self._pygame_surface = pygame.Surface(self.size, pygame.SRCALPHA, 32)
self._pygame_surface = pygame.Surface(self._size, pygame.SRCALPHA, 32)
self._pygame_surface.fill((0, 0, 0, 0))
def _render_text(self, text, x, y):
@ -66,7 +66,7 @@ class LabelPygame(LabelBase):
self._pygame_surface.blit(text, (x, y), None, pygame.BLEND_RGBA_ADD)
def _render_end(self):
data = kivy.ImageData(self.width, self.height,
data = ImageData(self._size[0], self._size[1],
'RGBA', buffer(self._pygame_surface.get_buffer())[:])
del self._pygame_surface