Module albow.openGL.GLSurface

Source code
from pygame import Rect
from pygame import image

from OpenGL import GL
from OpenGL import GLU


class GLSurface:

    def __init__(self, display, rect):
        self.display = display
        self.rect = rect

    def gl_enter(self):
        r = self.rect
        w = r.width
        h = r.height
        gl = GL
        win_height = self.display.get_height()
        gl.glViewport(r.left, win_height - r.bottom, r.width, r.height)
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glLoadIdentity()
        GLU.gluOrtho2D(0, w, h, 0)
        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glLoadIdentity()
        gl.glPushAttrib(gl.GL_COLOR_BUFFER_BIT)
        gl.glDisable(gl.GL_DEPTH_TEST)
        gl.glEnable(gl.GL_BLEND)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)

    def gl_exit(self):
        GL.glPopAttrib()

    def gl_clear(self, bg):
        if bg:
            r = bg[0] / 255.0
            g = bg[1] / 255.0
            b = bg[2] / 255.0
            GL.glClearColor(r, g, b, 0.0)
        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT
                   | GL.GL_ACCUM_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT)

    def gl_flush(self):
        GL.glFlush()

    def get_size(self):
        return self.rect.size

    def get_width(self):
        return self.rect.width

    def get_height(self):
        return self.rect.height

    def get_rect(self):
        return Rect(self.rect)

    def blit(self, src, dst=(0, 0), area=None):

        if isinstance(dst, Rect):
            dst = dst.topleft
        x, y = dst
        if area is not None:
            area = area.clip(src.get_rect())
            src = src.subsurface(area)
            x += area.left
            y += area.top
        w, h = src.get_size()
        data = image.tostring(src, 'RGBA', 1)

        gl = GL
        gl.glRasterPos2i(x, y + h)
        gl.glDrawPixels(w, h, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data)

    def fill(self, color, rect=None):

        if rect:
            x, y, w, h = rect
        else:
            x = y = 0
            w, h = self.rect.size
        gl = GL
        gl.glColor4ubv(color)
        gl.glBegin(GL.GL_QUADS)
        v = GL.glVertex2i
        v(x, y)
        v(x+w, y)
        v(x+w, y+h)
        v(x, y+h)
        gl.glEnd()

    def subsurface(self, rect):
        r = self.rect
        subrect = rect.move(r.left, r.top)
        return GLSurface(self.display, r.clip(subrect))

Classes

class GLSurface (display, rect)
Source code
class GLSurface:

    def __init__(self, display, rect):
        self.display = display
        self.rect = rect

    def gl_enter(self):
        r = self.rect
        w = r.width
        h = r.height
        gl = GL
        win_height = self.display.get_height()
        gl.glViewport(r.left, win_height - r.bottom, r.width, r.height)
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glLoadIdentity()
        GLU.gluOrtho2D(0, w, h, 0)
        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glLoadIdentity()
        gl.glPushAttrib(gl.GL_COLOR_BUFFER_BIT)
        gl.glDisable(gl.GL_DEPTH_TEST)
        gl.glEnable(gl.GL_BLEND)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)

    def gl_exit(self):
        GL.glPopAttrib()

    def gl_clear(self, bg):
        if bg:
            r = bg[0] / 255.0
            g = bg[1] / 255.0
            b = bg[2] / 255.0
            GL.glClearColor(r, g, b, 0.0)
        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT
                   | GL.GL_ACCUM_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT)

    def gl_flush(self):
        GL.glFlush()

    def get_size(self):
        return self.rect.size

    def get_width(self):
        return self.rect.width

    def get_height(self):
        return self.rect.height

    def get_rect(self):
        return Rect(self.rect)

    def blit(self, src, dst=(0, 0), area=None):

        if isinstance(dst, Rect):
            dst = dst.topleft
        x, y = dst
        if area is not None:
            area = area.clip(src.get_rect())
            src = src.subsurface(area)
            x += area.left
            y += area.top
        w, h = src.get_size()
        data = image.tostring(src, 'RGBA', 1)

        gl = GL
        gl.glRasterPos2i(x, y + h)
        gl.glDrawPixels(w, h, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data)

    def fill(self, color, rect=None):

        if rect:
            x, y, w, h = rect
        else:
            x = y = 0
            w, h = self.rect.size
        gl = GL
        gl.glColor4ubv(color)
        gl.glBegin(GL.GL_QUADS)
        v = GL.glVertex2i
        v(x, y)
        v(x+w, y)
        v(x+w, y+h)
        v(x, y+h)
        gl.glEnd()

    def subsurface(self, rect):
        r = self.rect
        subrect = rect.move(r.left, r.top)
        return GLSurface(self.display, r.clip(subrect))

Methods

def blit(self, src, dst=(0, 0), area=None)
Source code
def blit(self, src, dst=(0, 0), area=None):

    if isinstance(dst, Rect):
        dst = dst.topleft
    x, y = dst
    if area is not None:
        area = area.clip(src.get_rect())
        src = src.subsurface(area)
        x += area.left
        y += area.top
    w, h = src.get_size()
    data = image.tostring(src, 'RGBA', 1)

    gl = GL
    gl.glRasterPos2i(x, y + h)
    gl.glDrawPixels(w, h, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data)
def fill(self, color, rect=None)
Source code
def fill(self, color, rect=None):

    if rect:
        x, y, w, h = rect
    else:
        x = y = 0
        w, h = self.rect.size
    gl = GL
    gl.glColor4ubv(color)
    gl.glBegin(GL.GL_QUADS)
    v = GL.glVertex2i
    v(x, y)
    v(x+w, y)
    v(x+w, y+h)
    v(x, y+h)
    gl.glEnd()
def get_height(self)
Source code
def get_height(self):
    return self.rect.height
def get_rect(self)
Source code
def get_rect(self):
    return Rect(self.rect)
def get_size(self)
Source code
def get_size(self):
    return self.rect.size
def get_width(self)
Source code
def get_width(self):
    return self.rect.width
def gl_clear(self, bg)
Source code
def gl_clear(self, bg):
    if bg:
        r = bg[0] / 255.0
        g = bg[1] / 255.0
        b = bg[2] / 255.0
        GL.glClearColor(r, g, b, 0.0)
    GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT
               | GL.GL_ACCUM_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT)
def gl_enter(self)
Source code
def gl_enter(self):
    r = self.rect
    w = r.width
    h = r.height
    gl = GL
    win_height = self.display.get_height()
    gl.glViewport(r.left, win_height - r.bottom, r.width, r.height)
    gl.glMatrixMode(gl.GL_PROJECTION)
    gl.glLoadIdentity()
    GLU.gluOrtho2D(0, w, h, 0)
    gl.glMatrixMode(gl.GL_MODELVIEW)
    gl.glLoadIdentity()
    gl.glPushAttrib(gl.GL_COLOR_BUFFER_BIT)
    gl.glDisable(gl.GL_DEPTH_TEST)
    gl.glEnable(gl.GL_BLEND)
    gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
def gl_exit(self)
Source code
def gl_exit(self):
    GL.glPopAttrib()
def gl_flush(self)
Source code
def gl_flush(self):
    GL.glFlush()
def subsurface(self, rect)
Source code
def subsurface(self, rect):
    r = self.rect
    subrect = rect.move(r.left, r.top)
    return GLSurface(self.display, r.clip(subrect))