def run(self, text_content = None, duration = 5, vsync_value = None, scale_refObj = None): if not text_content is None: self.text_content = text_content if vsync_value is None: vsync_value = self.vsync_value duration *= 1e3 #convert to milliseconds t0 = pygame.time.get_ticks() t = pygame.time.get_ticks() is_running = True #render textSurface self.textSurface = self.render_surface(self.text_content, self.font_size) # check if we are scaling size to match other TextDisplay obj's last run() and scale textSurface if needed if not scale_refObj is None: ref_surface = scale_refObj.render_surface(scale_refObj.text_content, scale_refObj.font_size) width_scale = float(ref_surface.get_width()) / float(self.textSurface.get_width()) height_scale = float(ref_surface.get_height()) / float(self.textSurface.get_height()) self.textSurface = pygame.transform.scale(self.textSurface, (int(width_scale * self.textSurface.get_width()), int(height_scale * self.textSurface.get_height()))) #set background color gl.glClearColor(self.screen_bgColor[0], self.screen_bgColor[1], self.screen_bgColor[2], 1.0) #prepare some values for rendering centered text centerOffset_pixels = [-self.textSurface.get_width()/2, -self.textSurface.get_height()/2] raster_position = self.get_coords(*centerOffset_pixels) textData = pygame.image.tostring(self.textSurface, "RGBA", True) while is_running: #prepare rendering model gl.glClear(gl.GL_COLOR_BUFFER_BIT) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadIdentity() #render text gl.glRasterPos2d(*raster_position) gl.glDrawPixels(self.textSurface.get_width(), self.textSurface.get_height(), gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, textData) #render the vsync patch self.vsync_patch.render(value = vsync_value) #show the scene pygame.display.flip() #handle outstanding events is_running = self.handle_events() dt = self.clock.tick_busy_loop(self.render_loop_rate) #more accurate than tick, but uses more CPU resources t = pygame.time.get_ticks() if t - t0 > duration: is_running = False
def render(self): #this will draw background and vsync_patch Screen.render(self) # get file path for font file if it was specified font_path = None if self.font_type is None: font_path = self.font_type else: font_path = resources.get_fontpath(self.font_type) #render textSurface from text_content self.font = pygame.font.Font(font_path, self.font_size) rgb = [int(c*255) for c in self.text_color] rgb_bg = [int(c*255) for c in self.text_bgColor] self.textSurface = self.font.render(self.text_content, 1, rgb, rgb_bg) #Scaling font; attempting to render text that is too wide/tall sets the raster position off screen and nothing is rendered if self.textSurface.get_width() > self.screen_width: percent_scale = float(self.screen_width) / self.textSurface.get_width() self.font = pygame.font.Font(font_path, int(font_size * percent_scale)) self.textSurface = self.font.render(text_content, 1, rgb, rgb_bg) print("'", text_content, "' is too wide for screen; scaling to fit") if self.textSurface.get_height() > self.screen_height: percent_scale = float(self.screen_height) / self.textSurface.get_height() self.font = pygame.font.Font(font_path, int(font_size * percent_scale)) self.textSurface = self.font.render(text_content, 1, rgb, rgb_bg) print("'", text_content, "' is too tall for screen; scaling to fit") #prepare some values for rendering centered text centerOffset_pixels = [-self.textSurface.get_width()/2, -self.textSurface.get_height()/2] raster_position = self.get_coords(*centerOffset_pixels) textData = pygame.image.tostring(self.textSurface, "RGBA", True) #render text gl.glRasterPos2d(*raster_position) gl.glDrawPixels(self.textSurface.get_width(), self.textSurface.get_height(), gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, textData) # check if we are scaling size to match other TextDisplay obj's last run() and scale textSurface if needed if not self.scale_refObj is None: ref_surface = scale_refObj.render_surface(scale_refObj.text_content, scale_refObj.font_size) width_scale = float(ref_surface.get_width()) / float(self.textSurface.get_width()) height_scale = float(ref_surface.get_height()) / float(self.textSurface.get_height()) new_width = int(width_scale * self.textSurface.get_width()) new_height = int(height_scale * self.textSurface.get_height()) self.textSurface = pygame.transform.scale(self.textSurface, (new_width,new_height))