Exemplo n.º 1
0
Arquivo: Font.py Projeto: fofix/fofix
    def render(self, text, pos=(0, 0), rotate=0, scale=DEFAULT_SCALE, shadowoffset=(.0022, .0005), align=LEFT, shadow=False, outline=False, shadowOpacity=1.0):
        """
        Draw some text.

        :param text: Text to draw
        :param pos: Text coordinate tuple (x, y)
        :param rotate: Angle to rotate text, in degrees
        :param scale: Scale factor
        :param shadowoffset: Shadow offset (x, y)
        :param align: how to align the text
        :param shadow: if there will be shadow (default: False)
        :param outline: if there will be outline (default: False)
        :param shadowOpacity: opacity of the shadow (default: 1.0)
        """
        if not text:
            return

        try:
            t, w, h = self.stringsCache.get(text)
        except KeyError:
            s = self.font.render(text, True, (255, 255, 255))
            t = Texture()
            t.setFilter(GL_LINEAR, GL_LINEAR)
            t.setRepeat(GL_CLAMP, GL_CLAMP)
            t.loadSurface(s, alphaChannel=True)
            del s
            w, h = self.font.size(text)
            self.stringsCache.add(text, (t, w, h))

        x, y = pos
        scale *= self.scale
        w, h = w * scale * self.aspectRatioFactor, h * scale
        if align == CENTER:
            x -= (w / 2)
        elif align == RIGHT:
            x -= w
        y -= (h / 2)

        tw, th = t.size
        glEnable(GL_TEXTURE_2D)
        with cmgl.PushedMatrix():
            if rotate:
                if not isinstance(rotate, tuple):
                    glRotatef(rotate, 0, 0, 1.0)
                else:
                    glRotatef(0, *rotate)
            glTranslatef(x, y, 0)
            t.bind()

            # Outline
            if self.outline or outline:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, .25 * glGetDoublev(GL_CURRENT_COLOR)[3])

                    blur = 2 * DEFAULT_SCALE
                    for offset in [(-.7, -.7), (0, -1), (.7, -.7), (-1, 0),
                                   (1, 0), (-.7, .7), (0, 1), (.7, .7)]:
                        with cmgl.PushedMatrix():
                            glTranslatef(blur * offset[0], blur * offset[1], 0)
                            self.drawSquare(w, h, tw, th)

            # Shadow
            if self.shadow or shadow:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, glGetDoublev(GL_CURRENT_COLOR)[3] * shadowOpacity)
                    with cmgl.PushedMatrix():
                        glTranslatef(shadowoffset[0], shadowoffset[1], 0)
                        self.drawSquare(w, h, tw, th)

            self.drawSquare(w,h,tw,th)

        glDisable(GL_TEXTURE_2D)
Exemplo n.º 2
0
    def render(self,
               text,
               pos=(0, 0),
               rotate=0,
               scale=DEFAULT_SCALE,
               shadowoffset=(.0022, .0005),
               align=LEFT,
               new=False,
               shadow=False,
               outline=False,
               shadowOpacity=1.0):
        """
        Draw some text.

        @param text:      Text to draw
        @param pos:       Text coordinate tuple (x, y)
        @param rotate:    Angle to rotate text, in degrees
        @param scale:     Scale factor
        """

        # deufeufeu : new drawing relaying only on pygame.font.render
        #           : I know me miss special unicodes characters, but the gain
        #           : is really important.
        # evilynux : Use arrays to increase performance
        def drawSquare(w, h, tw, th):
            self.square_prim[1, 0] = self.square_prim[3, 0] = w
            self.square_prim[2, 1] = self.square_prim[3, 1] = h
            self.square_tex[0, 1] = self.square_tex[1, 1] = th
            self.square_tex[1, 0] = self.square_tex[3, 0] = tw
            cmgl.drawArrays(GL_TRIANGLE_STRIP,
                            vertices=self.square_prim,
                            texcoords=self.square_tex)

        if not text:
            return

        try:
            t, w, h = self.stringsCache.get(text)
        except KeyError:
            s = self.font.render(text, True, (255, 255, 255))
            t = Texture()
            t.setFilter(GL_LINEAR, GL_LINEAR)
            t.setRepeat(GL_CLAMP, GL_CLAMP)
            t.loadSurface(s, alphaChannel=True)
            del s
            w, h = self.font.size(text)
            self.stringsCache.add(text, (t, w, h))

        x, y = pos
        scale *= self.scale
        w, h = w * scale * self.aspectRatioFactor, h * scale
        if align == CENTER:  #we have already done all the calculating. Why not add this? - akedrou
            x -= (w / 2)
        elif align == RIGHT:
            x -= w
        y -= (h / 2)
        tw, th = t.size
        glEnable(GL_TEXTURE_2D)
        with cmgl.PushedMatrix():
            if rotate:
                if not isinstance(rotate, tuple):
                    glRotatef(rotate, 0, 0, 1.0)
                else:
                    glRotatef(0, *rotate)
            glTranslatef(x, y, 0)
            t.bind()
            if self.outline or outline:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, .25 * glGetDoublev(GL_CURRENT_COLOR)[3])

                    blur = 2 * DEFAULT_SCALE
                    for offset in [(-.7, -.7), (0, -1), (.7, -.7), (-1, 0),
                                   (1, 0), (-.7, .7), (0, 1), (.7, .7)]:
                        with cmgl.PushedMatrix():
                            glTranslatef(blur * offset[0], blur * offset[1], 0)
                            drawSquare(w, h, tw, th)

            if self.shadow or shadow:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(
                        0, 0, 0,
                        glGetDoublev(GL_CURRENT_COLOR)[3] * shadowOpacity)
                    with cmgl.PushedMatrix():
                        glTranslatef(shadowoffset[0], shadowoffset[1], 0)
                        drawSquare(w, h, tw, th)

            drawSquare(w, h, tw, th)

        glDisable(GL_TEXTURE_2D)
Exemplo n.º 3
0
    def render(self, text, pos = (0, 0), rotate = 0, scale = DEFAULT_SCALE, shadowoffset = (.0022, .0005), align = LEFT, new = False, shadow = False, outline = False, shadowOpacity = 1.0):
        """
        Draw some text.

        @param text:      Text to draw
        @param pos:       Text coordinate tuple (x, y)
        @param rotate:    Angle to rotate text, in degrees
        @param scale:     Scale factor
        """
        # deufeufeu : new drawing relaying only on pygame.font.render
        #           : I know me miss special unicodes characters, but the gain
        #           : is really important.
        # evilynux : Use arrays to increase performance
        def drawSquare(w,h,tw,th):
            self.square_prim[1,0] = self.square_prim[3,0] = w
            self.square_prim[2,1] = self.square_prim[3,1] = h
            self.square_tex[0,1] = self.square_tex[1,1] = th
            self.square_tex[1,0] = self.square_tex[3,0] = tw
            cmgl.drawArrays(GL_TRIANGLE_STRIP, vertices=self.square_prim, texcoords=self.square_tex)

        if not text:
            return

        try:
            t,w,h = self.stringsCache.get(text)
        except KeyError:
            s = self.font.render(text, True, (255,255,255))
            t = Texture()
            t.setFilter(GL_LINEAR, GL_LINEAR)
            t.setRepeat(GL_CLAMP, GL_CLAMP)
            t.loadSurface(s, alphaChannel = True)
            del s
            w, h = self.font.size(text)
            self.stringsCache.add(text,(t,w,h))

        x, y = pos
        scale *= self.scale
        w, h = w*scale*self.aspectRatioFactor, h*scale
        if align == CENTER: #we have already done all the calculating. Why not add this? - akedrou
            x -= (w/2)
        elif align == RIGHT:
            x -= w
        y -= (h/2)
        tw,th = t.size
        glEnable(GL_TEXTURE_2D)
        with cmgl.PushedMatrix():
            if rotate:
                if not isinstance(rotate, tuple):
                    glRotatef(rotate, 0, 0, 1.0)
                else:
                    glRotatef(0, *rotate)
            glTranslatef(x,y,0)
            t.bind()
            if self.outline or outline:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, .25 * glGetDoublev(GL_CURRENT_COLOR)[3])

                    blur = 2 * DEFAULT_SCALE
                    for offset in [(-.7, -.7), (0, -1), (.7, -.7), (-1, 0),
                                   (1, 0), (-.7, .7), (0, 1), (.7, .7)]:
                        with cmgl.PushedMatrix():
                            glTranslatef(blur * offset[0], blur * offset[1], 0)
                            drawSquare(w,h,tw,th)

            if self.shadow or shadow:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, glGetDoublev(GL_CURRENT_COLOR)[3]*shadowOpacity)
                    with cmgl.PushedMatrix():
                        glTranslatef(shadowoffset[0], shadowoffset[1], 0)
                        drawSquare(w,h,tw,th)

            drawSquare(w,h,tw,th)

        glDisable(GL_TEXTURE_2D)
Exemplo n.º 4
0
    def render(self, text, pos=(0, 0), rotate=0, scale=DEFAULT_SCALE, shadowoffset=(.0022, .0005), align=LEFT, shadow=False, outline=False, shadowOpacity=1.0):
        """
        Draw some text.

        :param text: Text to draw
        :param pos: Text coordinate tuple (x, y)
        :param rotate: Angle to rotate text, in degrees
        :param scale: Scale factor
        :param shadowoffset: Shadow offset (x, y)
        :param align: how to align the text
        :param shadow: if there will be shadow (default: False)
        :param outline: if there will be outline (default: False)
        :param shadowOpacity: opacity of the shadow (default: 1.0)
        """
        if not text:
            return

        try:
            t, w, h = self.stringsCache.get(text)
        except KeyError:
            s = self.font.render(text, True, (255, 255, 255))
            t = Texture()
            t.setFilter(GL_LINEAR, GL_LINEAR)
            t.setRepeat(GL_CLAMP, GL_CLAMP)
            t.loadSurface(s, alphaChannel=True)
            del s
            w, h = self.font.size(text)
            self.stringsCache.add(text, (t, w, h))

        x, y = pos
        scale *= self.scale
        w, h = w * scale * self.aspectRatioFactor, h * scale
        if align == CENTER:
            x -= (w / 2)
        elif align == RIGHT:
            x -= w
        y -= (h / 2)

        tw, th = t.size
        glEnable(GL_TEXTURE_2D)
        with cmgl.PushedMatrix():
            if rotate:
                if not isinstance(rotate, tuple):
                    glRotatef(rotate, 0, 0, 1.0)
                else:
                    glRotatef(0, *rotate)
            glTranslatef(x, y, 0)
            t.bind()

            # Outline
            if self.outline or outline:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, .25 * glGetDoublev(GL_CURRENT_COLOR)[3])

                    blur = 2 * DEFAULT_SCALE
                    for offset in [(-.7, -.7), (0, -1), (.7, -.7), (-1, 0),
                                   (1, 0), (-.7, .7), (0, 1), (.7, .7)]:
                        with cmgl.PushedMatrix():
                            glTranslatef(blur * offset[0], blur * offset[1], 0)
                            self.drawSquare(w, h, tw, th)

            # Shadow
            if self.shadow or shadow:
                with cmgl.PushedAttrib(GL_CURRENT_BIT):
                    glColor4f(0, 0, 0, glGetDoublev(GL_CURRENT_COLOR)[3] * shadowOpacity)
                    with cmgl.PushedMatrix():
                        glTranslatef(shadowoffset[0], shadowoffset[1], 0)
                        self.drawSquare(w, h, tw, th)

            self.drawSquare(w,h,tw,th)

        glDisable(GL_TEXTURE_2D)