From e7341b719c9bb58d4dc6c03d2eb0d61ee9feea8e Mon Sep 17 00:00:00 2001 From: Eli Gottlieb Date: Thu, 3 Jun 2010 14:43:38 -0400 Subject: [PATCH] Added management and drawing functions for ellipses and polygons. --- Makefile.in | 2 +- include/SDL_ellipse.h | 92 +++++++++++++++++++++++++++++++++++ include/SDL_poly.h | 110 ++++++++++++++++++++++++++++++++++++++++++ include/SDL_video.h | 79 ++++++++++++++++++++++++++++++ 4 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 include/SDL_ellipse.h create mode 100644 include/SDL_poly.h diff --git a/Makefile.in b/Makefile.in index ced88b314..4e2b185fe 100644 --- a/Makefile.in +++ b/Makefile.in @@ -44,7 +44,7 @@ EMBEDSPU = @EMBEDSPU@ DIST = acinclude autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS include INSTALL Makefile.minimal Makefile.in README* sdl-config.in sdl.m4 sdl.pc.in SDL.spec SDL.spec.in src test TODO VisualC.html VisualC VisualCE Watcom-Win32.zip WhatsNew Xcode Xcode-iPhoneOS -HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_shape.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h +HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_ellipse.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_poly.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_shape.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ diff --git a/include/SDL_ellipse.h b/include/SDL_ellipse.h new file mode 100644 index 000000000..bfa0f0402 --- /dev/null +++ b/include/SDL_ellipse.h @@ -0,0 +1,92 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 2010 Eli Gottlieb + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Eli Gottlieb + eligottlieb@gmail.com +*/ + +/** + * \file SDL_ellipse.h + * + * Header file for SDL_ellipse definition and management functions. + */ + +#ifndef _SDL_ellipse_h +#define _SDL_ellipse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +/** + * \brief The structure that defines an ellipse. + * + * \sa SDL_EllipseEmpty + * \sa SDL_EllipseEquals + * \sa SDL_EllipsesIntersect + * \sa SDL_IntersectEllipseAndLine + */ +typedef struct SDL_Ellipse { + int x,y; + int a,b; + int r; +} SDL_Ellipse; + +/** + * \brief Returns true if the ellipse has no area. + */ +#define SDL_EllipseEmpty(X) ((X)->r <= 0) + +/** + * \brief Returns true if the two ellipses are equal. + */ +#define SDL_EllipseEquals(A, B) (((A)->x == (B)->x) && ((A)->y == (B)->y) && \ + ((A)->a == (B)->a) && ((A)->b == (B)->b) && ((A)->r == (B)->r)) + +/** + * \brief Determine whether two ellipses intersect. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EllipsesIntersect(const SDL_Ellipse * A,const SDL_Ellipse * B); + +/** + * \brief Calculate the intersection of an ellipse and line segment. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectEllipseAndLine(const SDL_Ellipse *ellipse,int *X1,int *Y1,int *X2,int *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* _SDL_ellipse_h */ diff --git a/include/SDL_poly.h b/include/SDL_poly.h new file mode 100644 index 000000000..40bbc8d57 --- /dev/null +++ b/include/SDL_poly.h @@ -0,0 +1,110 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 2010 Eli Gottlieb + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Eli Gottlieb + eligottlieb@gmail.com +*/ + +/** + * \file SDL_poly.h + * + * Header file for SDL_poly definition and management functions. + */ + +#ifndef _SDL_poly_h +#define _SDL_poly_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" +#include "SDL_rect.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +/** + * \brief The structure that defines an polygon. + * + * \sa SDL_PolyEmpty + * \sa SDL_PolyEquals + * \sa SDL_PolysIntersect + * \sa SDL_IntersectPoly + * \sa SDL_WrapPoints + * \sa SDL_IntersectPolyAndLine + */ +typedef struct SDL_Poly { + SDL_Point *vertices; + int count; +} SDL_Poly; + +/** + * \brief Returns true if the polygon has no area. + */ +#define SDL_PolyEmpty(X) (((X)->vertices == NULL) || ((X)->count <= 2)) + +/** + * \brief Determine whether two polygons are equal. + * + * \return SDL_TRUE if the polygons are equal, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_PolyEquals(const SDL_Poly *A,const SDL_Poly *A); + +/** + * \brief Determine whether two rectangles intersect. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_PolysIntersect(const SDL_Poly * A,const SDL_Poly * B); + +/** + * \brief Calculate the intersection of two rectangles. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectPoly(const SDL_Poly * A,const SDL_Poly * B,SDL_Poly * result); + +/** + * \brief Calculate a minimal polygon wrapping a set of points + * + * \return 0 on success, -1 if the parameters were invalid, and -2 if an insufficient number of points were supplied + * in the output polygon. + */ +extern DECLSPEC int SDLCALL SDL_WrapPoints(const SDL_Point * points,int count,SDL_Poly *result); + +/** + * \brief Calculate the intersection of a polygon and line segment. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectPolyAndLine(const SDL_Poly *poly,int *X1,int *Y1,int *X2,int *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* _SDL_poly_h */ diff --git a/include/SDL_video.h b/include/SDL_video.h index a0db406cd..51b6adaa1 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -32,6 +32,8 @@ #include "SDL_stdinc.h" #include "SDL_pixels.h" #include "SDL_rect.h" +#include "SDL_ellipse.h" +#include "SDL_poly.h" #include "SDL_surface.h" #include "begin_code.h" @@ -1237,6 +1239,83 @@ extern DECLSPEC int SDLCALL SDL_RenderFillRect(const SDL_Rect * rect); */ extern DECLSPEC int SDLCALL SDL_RenderFillRects(const SDL_Rect ** rect, int count); +/** + * \brief Draw an ellipse on the current rendering target with the drawing color. + * + * \param ellipse The destination ellipse. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawEllipse(const SDL_Ellipse ellipse); + +/** + * \brief Draw some number of ellipses in the current rendering target with the drawing color. + * + * \param ellipse A pointer to an array of destination ellipses. + * \param count The number of ellipses. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawEllipses(const SDL_Ellipse ** ellipse, int count); + +/** + * \brief Fill an ellipse on the current rendering target with the drawing color. + * + * \param ellipse The destination ellipse + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillEllipse(const SDL_Ellipse ellipse); + +/** + * \brief Fill some number of ellipses in the current rendering target with the drawing color. + * + * \param ellipse A pointer to an array of destination ellipses. + * \param count The number of ellipses. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillEllipses(const SDL_Ellipse ** ellipse, int count); + +/** + * \brief Draw a polygon on the current rendering target with the drawing color. + * + * \param poly The destination polygon. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoly(const SDL_Poly poly); + +/** + * \brief Draw some number of polygons in the current rendering target with the drawing color. + * + * \param poly A pointer to an array of destination polygons. + * \param count The number of polygons. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPolys(const SDL_Poly ** poly, int count); + +/** + * \brief Fill a polygon on the current rendering target with the drawing color. + * + * \param poly The destination polygon + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillPoly(const SDL_Poly poly); + +/** + * \brief Fill some number of polygons in the current rendering target with the drawing color. + * + * \param poly A pointer to an array of destination polygons. + * \param count The number of polygons. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillPolys(const SDL_Poly ** poly, int count); + + /** * \brief Copy a portion of the texture to the current rendering target. *