def test_undefined_character_code(self): # To be consistent with pygame.font.Font, undefined codes # are rendered as the undefined character, and has metrics # of None. face = self._TEST_FONTS['sans'] img, size1 = face.render(None, unichr_(1), (0, 0, 0), ptsize=24) img, size0 = face.render(None, "", (0, 0, 0), ptsize=24) self.assertTrue(size1.width > size0.width ) metrics = face.get_metrics(unichr_(1) + unichr_(48), ptsize=24) self.assertEqual(len(metrics), 2) self.assertTrue(metrics[0] is None) self.assertTrue(isinstance(metrics[1], tuple))
def test_freetype_Face_render_raw(self): face = self._TEST_FONTS['sans'] text = "abc" size = face.get_rect(text, ptsize=24).size rend = face.render_raw(text, ptsize=24) self.assertTrue(isinstance(rend, tuple)) self.assertEqual(len(rend), 2) r, s = rend self.assertTrue(isinstance(r, bytes_)) self.assertTrue(isinstance(s, tuple)) self.assertTrue(len(s), 2) w, h = s self.assertTrue(isinstance(w, int)) self.assertTrue(isinstance(w, int)) self.assertEqual(s, size) self.assertEqual(len(r), w * h) r, (w, h) = face.render_raw('', ptsize=24) self.assertEqual(w, 0) self.assertEqual(h, face.height) self.assertEqual(len(r), 0) # bug with decenders: this would crash rend = face.render_raw('render_raw', ptsize=24) # bug with non-printable characters: this would cause a crash # because the text length was not adjusted for skipped characters. text = unicode_("").join([unichr_(i) for i in range(31, 64)]) rend = face.render_raw(text, ptsize=10)
def test_unichr_(self): ordval = 86 c = compat.unichr_(ordval) self.assertIsInstance(c, compat.unicode_) self.assertEqual(ord(c), ordval)
def test_unichr_(self): ordval = 86 c = compat.unichr_(ordval) self.failUnless(isinstance(c, compat.unicode_)) self.failUnlessEqual(ord(c), ordval)
def test_freetype_Face_cache(self): glyphs = "abcde" glen = len(glyphs) other_glyphs = "123" oglen = len(other_glyphs) uempty = unicode_("") ## many_glyphs = (uempty.join([unichr_(i) for i in range(32,127)] + ## [unichr_(i) for i in range(161,172)] + ## [unichr_(i) for i in range(174,239)])) many_glyphs = uempty.join([unichr_(i) for i in range(32,127)]) mglen = len(many_glyphs) count = 0 access = 0 hit = 0 miss = 0 f = ft.Face(None, ptsize=24, style=ft.STYLE_NORMAL, vertical=False) f.antialiased = True # Ensure debug counters are zero self.assertEqual(f._debug_cache_stats, (0, 0, 0, 0, 0)) # Load some basic glyphs count = access = miss = glen f.render_raw(glyphs) self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # Vertical should not affect the cache access += glen hit += glen f.vertical = True f.render_raw(glyphs) f.vertical = False self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # New glyphs will count += oglen access += oglen miss += oglen f.render_raw(other_glyphs) self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # Point size does count += glen access += glen miss += glen f.render_raw(glyphs, ptsize=12) self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # Underline style does not access += oglen hit += oglen f.underline = True f.render_raw(other_glyphs) f.underline = False self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # Oblique style does count += glen access += glen miss += glen f.oblique = True f.render_raw(glyphs) f.oblique = False self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) # Strong style does; by this point cache clears can happen count += glen access += glen miss += glen f.strong = True f.render_raw(glyphs) f.strong = False ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), (count, access, hit, miss)) # Rotation does count += glen access += glen miss += glen f.render_raw(glyphs, rotation=10) ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), (count, access, hit, miss)) # aliased (mono) glyphs do count += oglen access += oglen miss += oglen f.antialiased = False f.render_raw(other_glyphs) f.antialiased = True ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), (count, access, hit, miss)) # Trigger a cleanup for sure. count += 2 * mglen access += 2 * mglen miss += 2 * mglen f.get_metrics(many_glyphs, ptsize=8) f.get_metrics(many_glyphs, ptsize=10) ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats print (ccount, cdelete_count, caccess, chit, cmiss) self.assertTrue(ccount < count) self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), (count, access, hit, miss))
def __init__(self, sdlevent, d=None, **kwargs): self._sdlevent = sdlevent if isinstance(sdlevent, int): # User specificed event with kwargs self.type = sdlevent # XXX: Pygame manipulates __dict__, we're currently don't # this causes a failure in test_Event if d: self._dict = d.copy() else: self._dict = {} if kwargs: self._dict.update(kwargs) for attr, value in self._dict.items(): setattr(self, attr, value) return if not sdlevent: self.type = sdl.SDL_NOEVENT return self.type = self._sdlevent.type if (sdlevent.user.code == int(_USEROBJECT_CHECK1) and sdlevent.user.data1 == _USEROBJECT_CHECK2): eventkey = ffi.cast("SDL_Event *", sdlevent.user.data2) if eventkey in _user_events: self._dict = _user_events[eventkey]._dict del _user_events[eventkey] for attr, value in self._dict.items(): setattr(self, attr, value) return raise NotImplementedError("TODO: Error handling for user-posted events.") if self.type == ACTIVEEVENT: self.gain = sdlevent.active.gain self.state = sdlevent.active.state elif self.type == KEYDOWN: self.unicode = unichr_(sdlevent.key.keysym.unicode) self.key = sdlevent.key.keysym.sym self.mod = sdlevent.key.keysym.mod self.scancode = sdlevent.key.keysym.scancode elif self.type == KEYUP: self.key = sdlevent.key.keysym.sym self.mod = sdlevent.key.keysym.mod self.scancode = sdlevent.key.keysym.scancode elif self.type == MOUSEMOTION: self.pos = (sdlevent.motion.x, sdlevent.motion.y) self.rel = (sdlevent.motion.xrel, sdlevent.motion.yrel) self.buttons = (_button_state(sdlevent.motion.state, 1), _button_state(sdlevent.motion.state, 2), _button_state(sdlevent.motion.state, 3)) elif self.type in (MOUSEBUTTONDOWN, MOUSEBUTTONUP): self.pos = (sdlevent.button.x, sdlevent.button.y) self.button = sdlevent.button.button elif self.type == JOYAXISMOTION: self.joy = sdlevent.jaxis.which self.axis = sdlevent.jaxis.axis self.value = sdlevent.jaxis.value / 32767.0 elif self.type == JOYBALLMOTION: self.joy = sdlevent.jball.which self.ball = sdlevent.jball.ball self.rel = (sdlevent.jball.xrel, sdlevent.jball.yrel) elif self.type == JOYHATMOTION: self.joy = sdlevent.jhat.which self.hat = sdlevent.jhat.hat hx = hy = 0 if sdlevent.jhat.value & sdl.SDL_HAT_UP: hy = 1 elif sdlevent.jhat.value & sdl.SDL_HAT_DOWN: hy = -1 if sdlevent.jhat.value & sdl.SDL_HAT_RIGHT: hx = 1 elif sdlevent.jhat.value & sdl.SDL_HAT_LEFT: hx = -1 self.value = (hx, hy) elif self.type in (JOYBUTTONUP, JOYBUTTONDOWN): self.joy = sdlevent.jbutton.which self.button = sdlevent.jbutton.button elif self.type == VIDEORESIZE: self.size = (sdlevent.resize.w, sdlevent.resize.h) self.w = sdlevent.resize.w self.h = sdlevent.resize.h elif self.type == SYSWMEVENT: raise NotImplementedError("SYSWMEVENT not properly supported yet.") elif self.type in (VIDEOEXPOSE, QUIT): pass # No attributes here. elif USEREVENT <= self.type < NUMEVENTS: self.code = sdlevent.user.code if self.type == USEREVENT and sdlevent.user.code == USEREVENT_DROPFILE: # mirrors what pygame does - not sure if correct self.filename = ffi.string(sdlevent.user.data1) sdl.free(sdlevent.user.data1) sdlevent.user.data1 = ffi.NULL
def __init__(self, sdlevent, d=None, **kwargs): self._sdlevent = sdlevent if isinstance(sdlevent, int): # User specificed event with kwargs self.type = sdlevent # XXX: Pygame manipulates __dict__, we're currently don't # this causes a failure in test_Event if d: self._dict = d.copy() else: self._dict = {} if kwargs: self._dict.update(kwargs) for attr, value in self._dict.items(): setattr(self, attr, value) return if not sdlevent: self.type = sdl.SDL_NOEVENT return self.type = self._sdlevent.type if sdlevent.user.code == int(_USEROBJECT_CHECK1) and sdlevent.user.data1 == _USEROBJECT_CHECK2: eventkey = ffi.cast("SDL_Event *", sdlevent.user.data2) if eventkey in _user_events: self._dict = _user_events[eventkey]._dict del _user_events[eventkey] for attr, value in self._dict.items(): setattr(self, attr, value) return raise NotImplementedError("TODO: Error handling for user-posted events.") if self.type == ACTIVEEVENT: self.gain = sdlevent.active.gain self.state = sdlevent.active.state elif self.type == KEYDOWN: self.unicode = unichr_(sdlevent.key.keysym.unicode) self.key = sdlevent.key.keysym.sym self.mod = sdlevent.key.keysym.mod self.scancode = sdlevent.key.keysym.scancode elif self.type == KEYUP: self.key = sdlevent.key.keysym.sym self.mod = sdlevent.key.keysym.mod self.scancode = sdlevent.key.keysym.scancode elif self.type == MOUSEMOTION: self.pos = (sdlevent.motion.x, sdlevent.motion.y) self.rel = (sdlevent.motion.xrel, sdlevent.motion.yrel) self.buttons = ( _button_state(sdlevent.motion.state, 1), _button_state(sdlevent.motion.state, 2), _button_state(sdlevent.motion.state, 3), ) elif self.type in (MOUSEBUTTONDOWN, MOUSEBUTTONUP): self.pos = (sdlevent.button.x, sdlevent.button.y) self.button = sdlevent.button.button elif self.type == JOYAXISMOTION: self.joy = sdlevent.jaxis.which self.axis = sdlevent.jaxis.axis self.value = sdlevent.jaxis.value / 32767.0 elif self.type == JOYBALLMOTION: self.joy = sdlevent.jball.which self.ball = sdlevent.jball.ball self.rel = (sdlevent.jball.xrel, sdlevent.jball.yrel) elif self.type == JOYHATMOTION: self.joy = sdlevent.jhat.which self.hat = sdlevent.jhat.hat hx = hy = 0 if sdlevent.jhat.value & sdl.SDL_HAT_UP: hy = 1 elif sdlevent.jhat.value & sdl.SDL_HAT_DOWN: hy = -1 if sdlevent.jhat.value & sdl.SDL_HAT_RIGHT: hx = 1 elif sdlevent.jhat.value & sdl.SDL_HAT_LEFT: hx = -1 self.value = (hx, hy) elif self.type in (JOYBUTTONUP, JOYBUTTONDOWN): self.joy = sdlevent.jbutton.which self.button = sdlevent.jbutton.button elif self.type == VIDEORESIZE: self.size = (sdlevent.resize.w, sdlevent.resize.h) self.w = sdlevent.resize.w self.h = sdlevent.resize.h elif self.type == SYSWMEVENT: raise NotImplementedError("SYSWMEVENT not properly supported yet.") elif self.type in (VIDEOEXPOSE, QUIT): pass # No attributes here. elif USEREVENT <= self.type < NUMEVENTS: self.code = sdlevent.user.code if self.type == USEREVENT and sdlevent.user.code == USEREVENT_DROPFILE: # mirrors what pygame does - not sure if correct self.filename = ffi.string(sdlevent.user.data1) sdl.free(sdlevent.user.data1) sdlevent.user.data1 = ffi.NULL