From 718936110b9511631fa1f4396be992752bf8b719 Mon Sep 17 00:00:00 2001 From: Alex Xu Date: Thu, 22 Aug 2013 22:45:26 -0400 Subject: include renpy --- unrpyc/renpy/display/pgrender.py | 167 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 unrpyc/renpy/display/pgrender.py (limited to 'unrpyc/renpy/display/pgrender.py') diff --git a/unrpyc/renpy/display/pgrender.py b/unrpyc/renpy/display/pgrender.py new file mode 100644 index 0000000..32d1df8 --- /dev/null +++ b/unrpyc/renpy/display/pgrender.py @@ -0,0 +1,167 @@ +# Copyright 2004-2013 Tom Rothamel +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# This module wraps the pygame surface class (and associated functions). It +# ensures that returned surfaces have a 2px border around them. + +import sys +import pygame +import renpy.display + +# Sample surfaces, with and without alpha. +sample_alpha = None +sample_noalpha = None + +def set_rgba_masks(): + """ + This rebuilds the sample surfaces, to ones that use the given + masks. + """ + + # Annoyingly, the value for the big mask seems to vary from + # platform to platform. So we read it out of a surface. + + global sample_alpha + global sample_noalpha + + # Create a sample surface. + s = pygame.Surface((10, 10), 0, 32) + sample_alpha = s.convert_alpha() + + # Sort the components by absolute value. + masks = list(sample_alpha.get_masks()) + masks.sort(key=lambda a : abs(a)) + + # Choose the masks. + if sys.byteorder == 'big': + masks = ( masks[3], masks[2], masks[1], masks[0] ) + else: + masks = ( masks[0], masks[1], masks[2], masks[3] ) + + # Create the sample surface. + sample_alpha = pygame.Surface((10, 10), 0, 32, masks) + sample_noalpha = pygame.Surface((10, 10), 0, 32, masks[:3] + (0,)) + + +class Surface(pygame.Surface): + """ + This allows us to wrap around pygame's surface, to change + its mode, as necessary. + """ + + opaque = False + + def is_opaque(self): + return self.opaque + + def convert_alpha(self, surface=None): + return copy_surface_unscaled(self, True) + + def convert(self, surface=None): + return copy_surface(self, False) + + def copy(self): + return copy_surface(self, self) + + def subsurface(self, rect): + rv = pygame.Surface.subsurface(self, rect) + return rv + +def surface(xxx_todo_changeme, alpha): + """ + Constructs a new surface. The allocated surface is actually a subsurface + of a surface that has a 2 pixel border in all directions. + + `alpha` - True if the new surface should have an alpha channel. + """ + (width, height) = xxx_todo_changeme + if isinstance(alpha, pygame.Surface): + alpha = alpha.get_masks()[3] + + if alpha: + sample = sample_alpha + else: + sample = sample_noalpha + + # We might not have initialized properly yet. This is enough + # to get us underway. + if sample is None: + sample = pygame.Surface((4, 4), pygame.SRCALPHA, 32) + + surf = Surface((width + 4, height + 4), 0, sample) + return surf.subsurface((2, 2, width, height)) # E1101 + +surface_unscaled = surface + +def copy_surface(surf, alpha=True): + """ + Creates a copy of the surface. + """ + + rv = surface_unscaled(surf.get_size(), alpha) + renpy.display.accelerator.nogil_copy(surf, rv) # @UndefinedVariable + return rv + +copy_surface_unscaled = copy_surface + + +# Wrapper around image loading. + +def load_image(f, filename): + surf = pygame.image.load(f, renpy.exports.fsencode(filename)) + rv = copy_surface_unscaled(surf) + return rv + +load_image_unscaled = load_image + + +# Wrapper around functions we use from pygame.surface. + +def flip(surf, horizontal, vertical): + surf = pygame.transform.flip(surf, horizontal, vertical) + return copy_surface_unscaled(surf) + +flip_unscaled = flip + + +def rotozoom(surf, angle, zoom): + + surf = pygame.transform.rotozoom(surf, angle, zoom) + return copy_surface_unscaled(surf) + +rotozoom_unscaled = rotozoom + + +def transform_scale(surf, size): + surf = pygame.transform.scale(surf, size) + return copy_surface_unscaled(surf, surf) + +transform_scale_unscaled = transform_scale + + +def transform_rotate(surf, angle): + surf = pygame.transform.rotate(surf, angle) + return copy_surface(surf) + +transform_rotate_unscaled = transform_rotate + + + -- cgit v1.2.3-54-g00ecf