aboutsummaryrefslogtreecommitdiffstats
path: root/demos
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2014-11-21 17:09:44 +1000
committerinmarket <andrewh@inmarket.com.au>2014-11-21 17:09:44 +1000
commit87242d0a6c818e675676cdfb68013dc3af5a7656 (patch)
tree89d8d14cf89ad8dbd625df2773e9ac8d7b25501f /demos
parent74c23de1d2f59a94256fc1f3228a7af44a3ceb64 (diff)
downloaduGFX-87242d0a6c818e675676cdfb68013dc3af5a7656.tar.gz
uGFX-87242d0a6c818e675676cdfb68013dc3af5a7656.tar.bz2
uGFX-87242d0a6c818e675676cdfb68013dc3af5a7656.zip
Add MatrixFloat2D and MatrixFixed2D operations to GMISC.
Add polygon demo
Diffstat (limited to 'demos')
-rw-r--r--demos/modules/gdisp/polygons/demo.mk3
-rw-r--r--demos/modules/gdisp/polygons/gfxconf.h66
-rw-r--r--demos/modules/gdisp/polygons/main.c160
3 files changed, 229 insertions, 0 deletions
diff --git a/demos/modules/gdisp/polygons/demo.mk b/demos/modules/gdisp/polygons/demo.mk
new file mode 100644
index 00000000..81510914
--- /dev/null
+++ b/demos/modules/gdisp/polygons/demo.mk
@@ -0,0 +1,3 @@
+DEMODIR = $(GFXLIB)/demos/modules/gdisp/polygons
+GFXINC += $(DEMODIR)
+GFXSRC += $(DEMODIR)/main.c
diff --git a/demos/modules/gdisp/polygons/gfxconf.h b/demos/modules/gdisp/polygons/gfxconf.h
new file mode 100644
index 00000000..51170ecc
--- /dev/null
+++ b/demos/modules/gdisp/polygons/gfxconf.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
+ * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the <organization> nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* The operating system to use. One of these must be defined - preferably in your Makefile */
+//#define GFX_USE_OS_CHIBIOS FALSE
+//#define GFX_USE_OS_WIN32 FALSE
+//#define GFX_USE_OS_LINUX FALSE
+//#define GFX_USE_OS_OSX FALSE
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GMISC TRUE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_CONVEX_POLYGON TRUE
+
+/* For this demo define either:
+ * GMISC_NEED_MATRIXFLOAT2D to use floating point math operations
+ *
+ * or
+ *
+ * GMISC_NEED_MATRIXFIXED2D to use fixed point math operations.
+ *
+ * If you choose floating point you may optionally define GMISC_NEED_FASTTRIG.
+ * If you choose fixed point you MUST define GMISC_NEED_FIXEDTRIG for this demo.
+ */
+
+//#define GMISC_NEED_FASTTRIG TRUE
+//#define GMISC_NEED_MATRIXFLOAT2D TRUE
+
+#define GMISC_NEED_FIXEDTRIG TRUE
+#define GMISC_NEED_MATRIXFIXED2D TRUE
+
+#endif /* _GFXCONF_H */
+
diff --git a/demos/modules/gdisp/polygons/main.c b/demos/modules/gdisp/polygons/main.c
new file mode 100644
index 00000000..f71505d9
--- /dev/null
+++ b/demos/modules/gdisp/polygons/main.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
+ * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the <organization> nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gfx.h"
+#include <string.h>
+
+#define FRAME_DELAY 100 /* The interframe delay in milliseconds */
+
+// Our shape definition
+static const point shape[] = {
+ { 10, 10 },
+ { 10, 15 },
+ { 17, 17 },
+ { 20, 5 },
+ { 10, 0 },
+ { 3, -10},
+ { -7, -15},
+ { -15, -15},
+ { -13, -12 },
+ { -8, 0 },
+};
+
+#define NUM_POINTS (sizeof(shape)/sizeof(shape[0]))
+
+// Where we put our calculated points
+static point result[NUM_POINTS];
+static point oldresult[NUM_POINTS];
+
+// Make fixed point and floating point options look pretty similar
+#if GMISC_NEED_MATRIXFLOAT2D
+ static MatrixFloat2D m1, m2;
+ typedef float mtype;
+ #define FP2MTYPE(f) (f)
+ #define INT2MTYPE(i) (i)
+#elif GMISC_NEED_MATRIXFIXED2D
+ static MatrixFixed2D m1, m2;
+ typedef fixed mtype;
+ #define FP2MTYPE(f) FP2FIXED(f)
+ #define INT2MTYPE(i) FIXED(i)
+#else
+ #error "Either GMISC_NEED_MATRIXFLOAT2D or GMISC_NEED_MATRIXFIXED2D must be defined for this demo"
+#endif
+
+
+int main(void) {
+ coord_t width, height;
+ mtype scalex, scaley;
+ mtype scaleincx, scaleincy;
+ mtype translatex, translatey;
+ mtype transincx, transincy;
+ mtype transmaxx, transmaxy;
+ mtype transminx, transminy;
+ int angle;
+ int angleinc;
+
+ // Initialize and clear the display
+ gfxInit();
+ gdispClear(White);
+
+ // Get the screen size
+ width = gdispGetWidth();
+ height = gdispGetHeight();
+
+ // Initial position, rotation and scale
+ scalex = scaley = FP2MTYPE(1.0);
+ translatex = INT2MTYPE(width/2);
+ translatey = INT2MTYPE(height/2);
+ angle = 0;
+
+ // How much to change the position, rotation and scale each cycle
+ scaleincx = scaleincy = FP2MTYPE(0.5);
+ transincx = INT2MTYPE(2);
+ transincy = INT2MTYPE(-2);
+ angleinc = 2;
+ transmaxx = INT2MTYPE(width - 15);
+ transminx = INT2MTYPE(15);
+ transmaxy = INT2MTYPE(height - 15);
+ transminy = INT2MTYPE(15);
+
+ while(TRUE) {
+
+ // Move to the new location, rotation and scale
+ scalex += scaleincx;
+ scaley += scaleincy;
+ angle += angleinc;
+ if (angle >= 360)
+ angle -= 360;
+ translatex += transincx;
+ translatey += transincy;
+
+ // Adjust our speed etc
+ if (scalex > FP2MTYPE(10.0)) scaleincx = FP2MTYPE(-0.3);
+ else if (scalex < FP2MTYPE(1.0)) scaleincx = FP2MTYPE(0.5);
+ if (scaley > FP2MTYPE(7.0)) scaleincy = FP2MTYPE(-0.25);
+ else if (scaley < FP2MTYPE(1.0)) scaleincy = FP2MTYPE(0.3);
+ if (translatex > transmaxx || translatex < transminx) transincx = -transincx;
+ if (translatey > transmaxy || translatey < transminy) transincy = -transincy;
+
+ // Build a matrix of all the operations we want to do and then apply it to all the shape points
+ #if GMISC_NEED_MATRIXFLOAT2D
+ gmiscMatrixFloat2DApplyScale(&m1, 0, scalex, scaley);
+ gmiscMatrixFloat2DApplyRotation(&m2, &m1, angle);
+ gmiscMatrixFloat2DApplyTranslation(&m1, &m2, translatex, translatey);
+ gmiscMatrixFloat2DApplyToPoints(result, shape, &m1, NUM_POINTS);
+ #else
+ gmiscMatrixFixed2DApplyScale(&m1, 0, scalex, scaley);
+ gmiscMatrixFixed2DApplyRotation(&m2, &m1, angle);
+ gmiscMatrixFixed2DApplyTranslation(&m1, &m2, translatex, translatey);
+ gmiscMatrixFixed2DApplyToPoints(result, shape, &m1, NUM_POINTS);
+ #endif
+
+ // Clear the old shape
+ gdispDrawPoly(0, 0, oldresult, NUM_POINTS, White);
+ gdispFillConvexPoly(0, 0, oldresult, NUM_POINTS, White);
+
+ // Play the new shape position
+ // NOTE: Because our shape is not a true convex polygon, we get some frames
+ // where the line outline and the filled shape don't match. This is
+ // expected due to the shapes non-convex nature and was left in the
+ // demo to demonstrate this exact point.
+ gdispFillConvexPoly(0, 0, result, NUM_POINTS, Red);
+ gdispDrawPoly(0, 0, result, NUM_POINTS, Blue);
+
+ // Make sure the display is updated
+ gdispFlush();
+
+ // Save the results so we can clear them next cycle
+ memcpy(oldresult, result, sizeof(result));
+
+ // Delay for a while
+ gfxSleepMilliseconds(FRAME_DELAY);
+ }
+}
+