From 2d0b5e81813304f8be82728a3cca9f61949704b6 Mon Sep 17 00:00:00 2001 From: James Turk Date: Sat, 26 Mar 2011 22:46:16 -0400 Subject: [PATCH] events/video namespaces --- csdl/__init__.py | 383 +------------------------------------- csdl/events.py | 50 +++++ csdl/internal.py | 11 ++ csdl/sysinfo.py | 3 + csdl/video.py | 324 ++++++++++++++++++++++++++++++++ demo/random_rectangles.py | 3 +- demo/random_triangles.py | 4 +- 7 files changed, 394 insertions(+), 384 deletions(-) create mode 100644 csdl/events.py create mode 100644 csdl/video.py diff --git a/csdl/__init__.py b/csdl/__init__.py index cc407f6..d80fd10 100644 --- a/csdl/__init__.py +++ b/csdl/__init__.py @@ -1,5 +1,5 @@ import ctypes -from .internal import _SDL +from .internal import _SDL, errcheck # Constants class INIT(object): @@ -11,58 +11,8 @@ class INIT(object): NOPARACHUTE = 0x00100000 EVERYTHING = 0x0000FFFF -class Event(object): - FIRSTEVENT = 0 - - QUIT = 0x100 - - WINDOWEVENT = 0x200 - SYSWMEVENT = 0x201 - - KEYDOWN = 0x300 - KEYUP = 0x301 - TEXTEDITING = 0x302 - TEXTINPUT = 0x303 - - MOUSEMOTION = 0x400 - MOUSEBUTTONDOWN = 0x401 - MOUSEBUTTONUP = 0x402 - MOUSEWHEEL = 0x403 - - INPUTMOTION = 0x500 - INPUTBUTTONDOWN = 0x501 - INPUTBUTTONUP = 0x502 - INPUTWHEEL = 0x503 - INPUTPROXIMITYIN = 0x504 - INPUTPROXIMITYOUT = 0x505 - - JOYAXISMOTION = 0x600 - JOYBALLMOTION = 0x601 - JOYHATMOTION = 0x602 - JOYBUTTONDOWN = 0x603 - JOYBUTTONUP = 0x604 - - FINGERDOWN = 0x700 - FINGERUP = 0x701 - FINGERMOTION = 0x702 - TOUCHBUTTONDOWN = 0x703 - TOUCHBUTTONUP = 0x704 - - DOLLARGESTURE = 0x800 - DOLLARRECORD = 0x801 - MULTIGESTURE = 0x802 - - CLIPBOARDUPDATE = 0x900 - - USEREVENT = 0x8000 - LASTEVENT = 0xFFFF - - ##### Error Handling -class SDLError(Exception): - """ Exception representing an error in an SDL call """ - _SDL.SDL_GetError.restype = ctypes.c_char_p def get_error(): return _SDL.SDL_GetError() @@ -73,13 +23,6 @@ def set_error(msg): def clear_error(): _SDL.SDL_ClearError() -def errcheck(result): - if result < 0: - msg = _SDL.SDL_GetError() - _SDL.SDL_ClearError() - raise SDLError(msg) - return result - ##### Initialization def init(flags): @@ -122,327 +65,3 @@ _SDL.SDL_GetRevision.restype = ctypes.c_char_p def get_revision(): return _SDL.SDL_GetRevision() - -#### System Information - -class DisplayMode(ctypes.Structure): - _fields_ = ( - ('format', ctypes.c_uint32), - ('width', ctypes.c_int), - ('height', ctypes.c_int), - ('refresh_rate', ctypes.c_int), - ('driver_data', ctypes.c_void_p) - ) - - def __repr__(self): - return '{0}x{1} @{2}Hz ({3})'.format(self.width, - self.height, - self.refresh_rate, - get_pixel_format_name(self.format) - ) - -class RendererInfo(ctypes.Structure): - _fields_ = ( - ('name', ctypes.c_char_p), - ('flags', ctypes.c_uint32), - ('mod_modes', ctypes.c_uint32), - ('blend_modes', ctypes.c_uint32), - ('scale_modes', ctypes.c_uint32), - ('num_texture_formats', ctypes.c_uint32), - ('texture_formats', ctypes.c_uint32*50), - ('max_texture_width', ctypes.c_int), - ('max_texture_height', ctypes.c_int) - ) - -_render_driver_list = [] -def get_render_drivers(): - if not _render_driver_list: - num = _SDL.SDL_GetNumRenderDrivers() - for i in xrange(num): - rinfo = RendererInfo() - errcheck(_SDL.SDL_GetRenderDriverInfo(i, ctypes.byref(rinfo))) - _render_driver_list.append(rinfo) - return _render_driver_list - -class Renderer(object): - - def __init__(self, window, index=-1, flags=0): - self._renderer = errcheck(_SDL.SDL_CreateRenderer(window, index, flags)) - - def get_info(self): - rinfo = RendererInfo() - errcheck(_SDL.SDL_GetRendererInfo(self._renderer, ctypes.byref(rinfo))) - return rinfo - - def set_draw_color(self, r, g, b, a=255): - errcheck(_SDL.SDL_SetRenderDrawColor(self._renderer, r, g, b, a)) - - @property - def draw_color(self): - r = ctypes.c_uint8() - g = ctypes.c_uint8() - b = ctypes.c_uint8() - a = ctypes.c_uint8() - errcheck(_SDL.SDL_GetRenderDrawColor(self._renderer, ctypes.byref(r), - ctypes.byref(g), ctypes.byref(b), - ctypes.byref(a))) - return (r,g,b,a) - - @property - def viewport(self): - rect = Rect() - _SDL.SDL_RenderGetViewport(self._renderer, ctypes.byref(rect)) - return rect - - @viewport.setter - def viewport(self, rect): - _SDL.SDL_RenderSetViewport(self._renderer, ctypes.pointer(rect)) - - def clear(self): - errcheck(_SDL.SDL_RenderClear(self._renderer)) - - def present(self): - errcheck(_SDL.SDL_RenderPresent(self._renderer)) - - def draw_line(self, x1, y1, x2, y2): - errcheck(_SDL.SDL_RenderDrawLine(self._renderer, x1, y1, x2, y2)) - - def draw_lines(self, points): - PtArray = Point*len(points) - _sdl_points = PtArray(*[Point(*pt) for pt in points]) - errcheck(_SDL.SDL_RenderDrawLines(self._renderer, _sdl_points, - len(points))) - - def draw_point(self, x, y): - errcheck(_SDL.SDL_RenderDrawPoint(self._renderer, x, y)) - - def draw_points(self, points): - PtArray = Point*len(points) - _sdl_points = PtArray(*[Point(*pt) for pt in points]) - errcheck(_SDL.SDL_RenderDrawPoints(self._renderer, _sdl_points, - len(points))) - - def draw_rect(self, rect): - _SDL.SDL_RenderDrawRect(self._renderer, ctypes.pointer(rect)) - - def draw_rects(self, rects): - RectArray = Rect*len(rects) - rects = RectArray(*rects) - _SDL.SDL_RenderDrawRects(self._renderer, rects, len(rects)) - - def fill_rect(self, rect): - _SDL.SDL_RenderFillRect(self._renderer, ctypes.pointer(rect)) - - def fill_rects(self, rects): - RectArray = Rect*len(rects) - rects = RectArray(*rects) - _SDL.SDL_RenderFillRects(self._renderer, rects, len(rects)) - -_SDL.SDL_GetWindowTitle.restype = ctypes.c_char_p - -class Window(object): - - def __init__(self, title, x, y, w, h, flags=0): - self._handle = errcheck(_SDL.SDL_CreateWindow(title, x, y, w, h, - flags)) - self.renderer = Renderer(self._handle) - - def destroy(self): - _SDL.SDL_DestroyWindow(self._handle) - - @property - def display(self): - return errcheck(_SDL.SDL_GetWindowDisplay(self._handle)) - - def get_display_mode(self): - mode = DisplayMode() - errcheck(_SDL.SDL_GetWindowDisplayMode(self._handle, - ctypes.byref(mode))) - return mode - - def get_flags(self): - return _SDL.SDL_GetWindowFlags(self._handle) - - @property - def grab(self): - return _SDL.SDL_GetWindowGrab(self._handle) == 1 - - @grab.setter - def grab(self, grab_mode): - _SDL.SDL_SetWindowGrab(self._handle, 1 if grab_mode else 0) - - @property - def id(self): - return _SDL.SDL_GetWindowID(self._handle) - - @property - def pixel_format(self): - return errcheck(_SDL.SDL_GetWindowPixelFormat(self._handle)) - - @property - def position(self): - x = ctypes.c_int() - y = ctypes.c_int() - _SDL.SDL_GetWindowPosition(self._handle, ctypes.byref(x), - ctypes.byref(y)) - return x.value, y.value - - def move(self, x, y): - _SDL.SDL_SetWindowPosition(self._handle, x, y) - - @property - def size(self): - w = ctypes.c_int() - h = ctypes.c_int() - _SDL.SDL_GetWindowSize(self._handle, ctypes.byref(w), - ctypes.byref(h)) - return w,h - - def resize(self, w, h): - _SDL.SDL_SetWindowSize(self._handle, w, h) - - @property - def title(self): - return _SDL.SDL_GetWindowTitle(self._handle) - - @title.setter - def title(self, title_str): - _SDL.SDL_SetWindowTitle(self._handle, title_str) - - def hide(self): - _SDL.SDL_HideWindow(self._handle) - - def maximize(self): - _SDL.SDL_MaximizeWindow(self._handle) - - def minimize(self): - _SDL.SDL_MinimizeWindow(self._handle) - - def raise_window(self): - _SDL.SDL_RaiseWindow(self._handle) - - def restore(self): - _SDL.SDL_RestoreWindow(self._handle) - - def show(self): - _SDL.SDL_ShowWindow(self._handle) - -def disable_screensaver(): - _SDL.SDL_DisableScreenSaver() - -def enable_screensaver(): - _SDL.SDL_EnableScreenSaver() - -def is_screensaver_enabled(): - return _SDL.SDL_IsScreenSaverEnabled() == 1 - -def get_current_display_mode(display): - mode = DisplayMode() - errcheck(_SDL.SDL_GetCurrentDisplayMode(display, ctypes.byref(mode))) - return mode - -_SDL.SDL_GetPixelFormatName.restype = ctypes.c_char_p -def get_pixel_format_name(format): - return _SDL.SDL_GetPixelFormatName(format) - -_SDL.SDL_GetCurrentVideoDriver.restype = ctypes.c_char_p -def get_current_video_driver(): - return _SDL.SDL_GetCurrentVideoDriver() - -def get_num_video_displays(): - return _SDL.SDL_GetNumVideoDisplays() - -_video_driver_list = [] -_SDL.SDL_GetVideoDriver.restype = ctypes.c_char_p -def get_video_drivers(): - if not _video_driver_list: - num = _SDL.SDL_GetNumVideoDrivers() - for i in xrange(num): - _video_driver_list.append(_SDL.SDL_GetVideoDriver(i)) - return _video_driver_list - -_display_mode_list = {} -def get_display_modes(display_index): - if not display_index in _display_mode_list: - _display_mode_list[display_index] = [] - num = _SDL.SDL_GetNumDisplayModes(display_index) - for i in xrange(num): - mode = DisplayMode() - _SDL.SDL_GetDisplayMode(display_index, i, ctypes.byref(mode)) - _display_mode_list[display_index].append(mode) - return _display_mode_list[display_index] - -def get_desktop_display_mode(display_index): - mode = DisplayMode() - errcheck(_SDL.SDL_GetDesktopDisplayMode(display_index, ctypes.byref(mode))) - return mode - -class Rect(ctypes.Structure): - _fields_ = ( - ('x', ctypes.c_int), - ('y', ctypes.c_int), - ('width', ctypes.c_int), - ('height', ctypes.c_int), - ) - - def __eq__(self, other): - return (self.x == other.x and self.y == other.y and - self.width == other.width and self.height == other.height) - - @staticmethod - def enclose_points(points, clip=None): - PtArray = Point*len(points) - _sdl_points = PtArray(*[Point(*pt) for pt in points]) - result = Rect() - - # returns True if a rect is created - if _SDL.SDL_EnclosePoints(_sdl_points, len(points), - ctypes.pointer(clip) if clip else None, - ctypes.byref(result)): - return result - - def intersects(self, other): - return _SDL.SDL_HasIntersection(ctypes.pointer(self), - ctypes.pointer(other)) == 1 - - def intersection(self, other): - result = Rect() - - # returns True if an intersection is found - if _SDL.SDL_IntersectRect(ctypes.pointer(self), ctypes.pointer(other), - ctypes.byref(result)): - return result - - def union(self, other): - result = Rect() - _SDL.SDL_UnionRect(ctypes.pointer(self), ctypes.pointer(other), - ctypes.byref(result)) - return result - - def intersects_line(self, x1, y1, x2, y2): - return _SDL.SDL_IntersectRectAndLine(ctypes.pointer(self), - ctypes.pointer(x1), - ctypes.pointer(y1), - ctypes.pointer(x2), - ctypes.pointer(y2)) == 1 - - def is_empty(self): - return self.width <= 0 or self.height <= 0 - - def __repr__(self): - return 'Rect({0}, {1}, {2}, {3})'.format(self.x, self.y, - self.width, self.height) - -class Point(ctypes.Structure): - _fields_ = ( - ('x', ctypes.c_int), - ('y', ctypes.c_int), - ) - - def __repr__(self): - return 'Point({0}, {1})'.format(self.x, self.y) - -def get_display_bounds(display_index): - rect = Rect() - errcheck(_SDL.SDL_GetDisplayBounds(display_index, ctypes.byref(rect))) - return rect diff --git a/csdl/events.py b/csdl/events.py new file mode 100644 index 0000000..16c329e --- /dev/null +++ b/csdl/events.py @@ -0,0 +1,50 @@ +import ctypes +from .internal import _SDL + +class Event(object): + FIRSTEVENT = 0 + + QUIT = 0x100 + + WINDOWEVENT = 0x200 + SYSWMEVENT = 0x201 + + KEYDOWN = 0x300 + KEYUP = 0x301 + TEXTEDITING = 0x302 + TEXTINPUT = 0x303 + + MOUSEMOTION = 0x400 + MOUSEBUTTONDOWN = 0x401 + MOUSEBUTTONUP = 0x402 + MOUSEWHEEL = 0x403 + + INPUTMOTION = 0x500 + INPUTBUTTONDOWN = 0x501 + INPUTBUTTONUP = 0x502 + INPUTWHEEL = 0x503 + INPUTPROXIMITYIN = 0x504 + INPUTPROXIMITYOUT = 0x505 + + JOYAXISMOTION = 0x600 + JOYBALLMOTION = 0x601 + JOYHATMOTION = 0x602 + JOYBUTTONDOWN = 0x603 + JOYBUTTONUP = 0x604 + + FINGERDOWN = 0x700 + FINGERUP = 0x701 + FINGERMOTION = 0x702 + TOUCHBUTTONDOWN = 0x703 + TOUCHBUTTONUP = 0x704 + + DOLLARGESTURE = 0x800 + DOLLARRECORD = 0x801 + MULTIGESTURE = 0x802 + + CLIPBOARDUPDATE = 0x900 + + USEREVENT = 0x8000 + LASTEVENT = 0xFFFF + + diff --git a/csdl/internal.py b/csdl/internal.py index cb9fa31..56e2e5e 100644 --- a/csdl/internal.py +++ b/csdl/internal.py @@ -1,2 +1,13 @@ import ctypes _SDL = ctypes.cdll.LoadLibrary('/usr/local/lib/libSDL-1.3.so.0.0.0') + +class SDLError(Exception): + """ Exception representing an error in an SDL call """ + +def errcheck(result): + if result < 0: + msg = _SDL.SDL_GetError() + _SDL.SDL_ClearError() + raise SDLError(msg) + return result + diff --git a/csdl/sysinfo.py b/csdl/sysinfo.py index e3b0174..4b1307c 100644 --- a/csdl/sysinfo.py +++ b/csdl/sysinfo.py @@ -1,3 +1,6 @@ +import ctypes +from .internal import _SDL + _SDL.SDL_GetPlatform.restype = ctypes.c_char_p def get_platform(): diff --git a/csdl/video.py b/csdl/video.py new file mode 100644 index 0000000..a95aedb --- /dev/null +++ b/csdl/video.py @@ -0,0 +1,324 @@ +import ctypes +from .internal import _SDL, errcheck + +class DisplayMode(ctypes.Structure): + _fields_ = ( + ('format', ctypes.c_uint32), + ('width', ctypes.c_int), + ('height', ctypes.c_int), + ('refresh_rate', ctypes.c_int), + ('driver_data', ctypes.c_void_p) + ) + + def __repr__(self): + return '{0}x{1} @{2}Hz ({3})'.format(self.width, + self.height, + self.refresh_rate, + get_pixel_format_name(self.format) + ) + +class RendererInfo(ctypes.Structure): + _fields_ = ( + ('name', ctypes.c_char_p), + ('flags', ctypes.c_uint32), + ('mod_modes', ctypes.c_uint32), + ('blend_modes', ctypes.c_uint32), + ('scale_modes', ctypes.c_uint32), + ('num_texture_formats', ctypes.c_uint32), + ('texture_formats', ctypes.c_uint32*50), + ('max_texture_width', ctypes.c_int), + ('max_texture_height', ctypes.c_int) + ) + +_render_driver_list = [] +def get_render_drivers(): + if not _render_driver_list: + num = _SDL.SDL_GetNumRenderDrivers() + for i in xrange(num): + rinfo = RendererInfo() + errcheck(_SDL.SDL_GetRenderDriverInfo(i, ctypes.byref(rinfo))) + _render_driver_list.append(rinfo) + return _render_driver_list + +class Renderer(object): + + def __init__(self, window, index=-1, flags=0): + self._renderer = errcheck(_SDL.SDL_CreateRenderer(window, index, flags)) + + def get_info(self): + rinfo = RendererInfo() + errcheck(_SDL.SDL_GetRendererInfo(self._renderer, ctypes.byref(rinfo))) + return rinfo + + def set_draw_color(self, r, g, b, a=255): + errcheck(_SDL.SDL_SetRenderDrawColor(self._renderer, r, g, b, a)) + + @property + def draw_color(self): + r = ctypes.c_uint8() + g = ctypes.c_uint8() + b = ctypes.c_uint8() + a = ctypes.c_uint8() + errcheck(_SDL.SDL_GetRenderDrawColor(self._renderer, ctypes.byref(r), + ctypes.byref(g), ctypes.byref(b), + ctypes.byref(a))) + return (r,g,b,a) + + @property + def viewport(self): + rect = Rect() + _SDL.SDL_RenderGetViewport(self._renderer, ctypes.byref(rect)) + return rect + + @viewport.setter + def viewport(self, rect): + _SDL.SDL_RenderSetViewport(self._renderer, ctypes.pointer(rect)) + + def clear(self): + errcheck(_SDL.SDL_RenderClear(self._renderer)) + + def present(self): + errcheck(_SDL.SDL_RenderPresent(self._renderer)) + + def draw_line(self, x1, y1, x2, y2): + errcheck(_SDL.SDL_RenderDrawLine(self._renderer, x1, y1, x2, y2)) + + def draw_lines(self, points): + PtArray = Point*len(points) + _sdl_points = PtArray(*[Point(*pt) for pt in points]) + errcheck(_SDL.SDL_RenderDrawLines(self._renderer, _sdl_points, + len(points))) + + def draw_point(self, x, y): + errcheck(_SDL.SDL_RenderDrawPoint(self._renderer, x, y)) + + def draw_points(self, points): + PtArray = Point*len(points) + _sdl_points = PtArray(*[Point(*pt) for pt in points]) + errcheck(_SDL.SDL_RenderDrawPoints(self._renderer, _sdl_points, + len(points))) + + def draw_rect(self, rect): + _SDL.SDL_RenderDrawRect(self._renderer, ctypes.pointer(rect)) + + def draw_rects(self, rects): + RectArray = Rect*len(rects) + rects = RectArray(*rects) + _SDL.SDL_RenderDrawRects(self._renderer, rects, len(rects)) + + def fill_rect(self, rect): + _SDL.SDL_RenderFillRect(self._renderer, ctypes.pointer(rect)) + + def fill_rects(self, rects): + RectArray = Rect*len(rects) + rects = RectArray(*rects) + _SDL.SDL_RenderFillRects(self._renderer, rects, len(rects)) + +_SDL.SDL_GetWindowTitle.restype = ctypes.c_char_p + +class Window(object): + + def __init__(self, title, x, y, w, h, flags=0): + self._handle = errcheck(_SDL.SDL_CreateWindow(title, x, y, w, h, + flags)) + self.renderer = Renderer(self._handle) + + def destroy(self): + _SDL.SDL_DestroyWindow(self._handle) + + @property + def display(self): + return errcheck(_SDL.SDL_GetWindowDisplay(self._handle)) + + def get_display_mode(self): + mode = DisplayMode() + errcheck(_SDL.SDL_GetWindowDisplayMode(self._handle, + ctypes.byref(mode))) + return mode + + def get_flags(self): + return _SDL.SDL_GetWindowFlags(self._handle) + + @property + def grab(self): + return _SDL.SDL_GetWindowGrab(self._handle) == 1 + + @grab.setter + def grab(self, grab_mode): + _SDL.SDL_SetWindowGrab(self._handle, 1 if grab_mode else 0) + + @property + def id(self): + return _SDL.SDL_GetWindowID(self._handle) + + @property + def pixel_format(self): + return errcheck(_SDL.SDL_GetWindowPixelFormat(self._handle)) + + @property + def position(self): + x = ctypes.c_int() + y = ctypes.c_int() + _SDL.SDL_GetWindowPosition(self._handle, ctypes.byref(x), + ctypes.byref(y)) + return x.value, y.value + + def move(self, x, y): + _SDL.SDL_SetWindowPosition(self._handle, x, y) + + @property + def size(self): + w = ctypes.c_int() + h = ctypes.c_int() + _SDL.SDL_GetWindowSize(self._handle, ctypes.byref(w), + ctypes.byref(h)) + return w,h + + def resize(self, w, h): + _SDL.SDL_SetWindowSize(self._handle, w, h) + + @property + def title(self): + return _SDL.SDL_GetWindowTitle(self._handle) + + @title.setter + def title(self, title_str): + _SDL.SDL_SetWindowTitle(self._handle, title_str) + + def hide(self): + _SDL.SDL_HideWindow(self._handle) + + def maximize(self): + _SDL.SDL_MaximizeWindow(self._handle) + + def minimize(self): + _SDL.SDL_MinimizeWindow(self._handle) + + def raise_window(self): + _SDL.SDL_RaiseWindow(self._handle) + + def restore(self): + _SDL.SDL_RestoreWindow(self._handle) + + def show(self): + _SDL.SDL_ShowWindow(self._handle) + +def disable_screensaver(): + _SDL.SDL_DisableScreenSaver() + +def enable_screensaver(): + _SDL.SDL_EnableScreenSaver() + +def is_screensaver_enabled(): + return _SDL.SDL_IsScreenSaverEnabled() == 1 + +def get_current_display_mode(display): + mode = DisplayMode() + errcheck(_SDL.SDL_GetCurrentDisplayMode(display, ctypes.byref(mode))) + return mode + +_SDL.SDL_GetPixelFormatName.restype = ctypes.c_char_p +def get_pixel_format_name(format): + return _SDL.SDL_GetPixelFormatName(format) + +_SDL.SDL_GetCurrentVideoDriver.restype = ctypes.c_char_p +def get_current_video_driver(): + return _SDL.SDL_GetCurrentVideoDriver() + +def get_num_video_displays(): + return _SDL.SDL_GetNumVideoDisplays() + +_video_driver_list = [] +_SDL.SDL_GetVideoDriver.restype = ctypes.c_char_p +def get_video_drivers(): + if not _video_driver_list: + num = _SDL.SDL_GetNumVideoDrivers() + for i in xrange(num): + _video_driver_list.append(_SDL.SDL_GetVideoDriver(i)) + return _video_driver_list + +_display_mode_list = {} +def get_display_modes(display_index): + if not display_index in _display_mode_list: + _display_mode_list[display_index] = [] + num = _SDL.SDL_GetNumDisplayModes(display_index) + for i in xrange(num): + mode = DisplayMode() + _SDL.SDL_GetDisplayMode(display_index, i, ctypes.byref(mode)) + _display_mode_list[display_index].append(mode) + return _display_mode_list[display_index] + +def get_desktop_display_mode(display_index): + mode = DisplayMode() + errcheck(_SDL.SDL_GetDesktopDisplayMode(display_index, ctypes.byref(mode))) + return mode + +class Rect(ctypes.Structure): + _fields_ = ( + ('x', ctypes.c_int), + ('y', ctypes.c_int), + ('width', ctypes.c_int), + ('height', ctypes.c_int), + ) + + def __eq__(self, other): + return (self.x == other.x and self.y == other.y and + self.width == other.width and self.height == other.height) + + @staticmethod + def enclose_points(points, clip=None): + PtArray = Point*len(points) + _sdl_points = PtArray(*[Point(*pt) for pt in points]) + result = Rect() + + # returns True if a rect is created + if _SDL.SDL_EnclosePoints(_sdl_points, len(points), + ctypes.pointer(clip) if clip else None, + ctypes.byref(result)): + return result + + def intersects(self, other): + return _SDL.SDL_HasIntersection(ctypes.pointer(self), + ctypes.pointer(other)) == 1 + + def intersection(self, other): + result = Rect() + + # returns True if an intersection is found + if _SDL.SDL_IntersectRect(ctypes.pointer(self), ctypes.pointer(other), + ctypes.byref(result)): + return result + + def union(self, other): + result = Rect() + _SDL.SDL_UnionRect(ctypes.pointer(self), ctypes.pointer(other), + ctypes.byref(result)) + return result + + def intersects_line(self, x1, y1, x2, y2): + return _SDL.SDL_IntersectRectAndLine(ctypes.pointer(self), + ctypes.pointer(x1), + ctypes.pointer(y1), + ctypes.pointer(x2), + ctypes.pointer(y2)) == 1 + + def is_empty(self): + return self.width <= 0 or self.height <= 0 + + def __repr__(self): + return 'Rect({0}, {1}, {2}, {3})'.format(self.x, self.y, + self.width, self.height) + +class Point(ctypes.Structure): + _fields_ = ( + ('x', ctypes.c_int), + ('y', ctypes.c_int), + ) + + def __repr__(self): + return 'Point({0}, {1})'.format(self.x, self.y) + +def get_display_bounds(display_index): + rect = Rect() + errcheck(_SDL.SDL_GetDisplayBounds(display_index, ctypes.byref(rect))) + return rect diff --git a/demo/random_rectangles.py b/demo/random_rectangles.py index 6b24a68..49ff636 100644 --- a/demo/random_rectangles.py +++ b/demo/random_rectangles.py @@ -1,4 +1,5 @@ -from csdl import init, Window, INIT, Rect +from csdl import init, INIT +from csdl.video import Window, Rect import random import time diff --git a/demo/random_triangles.py b/demo/random_triangles.py index 9c038d4..b78baea 100644 --- a/demo/random_triangles.py +++ b/demo/random_triangles.py @@ -1,4 +1,6 @@ -from csdl import init, Window, INIT +from csdl import init, INIT +from csdl.video import Window + import random import time