From 7a27aab7d70d27f8fefd7484ba179c6f6853e359 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 5 Nov 2010 22:47:54 -0400 Subject: [PATCH] core text: fix size / width / height --- kivy/core/text/__init__.py | 46 ++++++++++++++++++++++------------- kivy/core/text/text_cairo.py | 6 ++--- kivy/core/text/text_pil.py | 9 ++++--- kivy/core/text/text_pygame.py | 6 ++--- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/kivy/core/text/__init__.py b/kivy/core/text/__init__.py index 3fee33209..38b7049e8 100644 --- a/kivy/core/text/__init__.py +++ b/kivy/core/text/__init__.py @@ -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): diff --git a/kivy/core/text/text_cairo.py b/kivy/core/text/text_cairo.py index 34222417c..e8bb3b4a8 100644 --- a/kivy/core/text/text_cairo.py +++ b/kivy/core/text/text_cairo.py @@ -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 diff --git a/kivy/core/text/text_pil.py b/kivy/core/text/text_pil.py index e350b922a..d9cec0e1d 100644 --- a/kivy/core/text/text_pil.py +++ b/kivy/core/text/text_pil.py @@ -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 diff --git a/kivy/core/text/text_pygame.py b/kivy/core/text/text_pygame.py index e754c9743..0bc92d4ad 100644 --- a/kivy/core/text/text_pygame.py +++ b/kivy/core/text/text_pygame.py @@ -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