/*
- * Copyright (C) 2010 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2010-2011 Andy Spencer <andy753421@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include <config.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
+#include "gtkgl.h"
#include "grits-poly.h"
/* Drawing */
//g_debug("GritsPoly: draw");
GritsPoly *poly = GRITS_POLY(_poly);
- glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_CURRENT_BIT);
+ glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_CURRENT_BIT |
+ GL_POINT_BIT | GL_LINE_BIT | GL_POLYGON_BIT);
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
+
glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(1, 1);
+ glEnable(GL_POLYGON_OFFSET_LINE);
+ glEnable(GL_POLYGON_OFFSET_POINT);
+
if (poly->color[3]) {
+ /* Draw background farthest back */
+ glPolygonOffset(3, 3);
glColor4dv(poly->color);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
grits_poly_runlist(poly, 0, grits_poly_tess);
}
- glLineWidth(poly->width);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ glEnable(GL_POLYGON_SMOOTH);
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POINT_SMOOTH);
+
+ if (!poly->color[3] && poly->border[3] && poly->width > 1) {
+ /* Draw line border in the middle */
+ glColor4d(0,0,0,1);
+
+ glPointSize(poly->width*2);
+ glLineWidth(poly->width*2);
+
+ glPolygonOffset(2, 2);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+ grits_poly_runlist(poly, 1, grits_poly_outline);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ grits_poly_runlist(poly, 1, grits_poly_outline);
+ }
+
if (poly->border[3]) {
+ /* Draw border front-most */
glColor4dv(poly->border);
+
+ glPointSize(poly->width);
+ glLineWidth(poly->width);
+
+ glPolygonOffset(1, 1);
+ if (poly->width > 1) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+ grits_poly_runlist(poly, 1, grits_poly_outline);
+ }
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
grits_poly_runlist(poly, 1, grits_poly_outline);
}
+
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPopAttrib();
}
glPopAttrib();
}
+static gboolean grits_poly_delete(gpointer list)
+{
+ glDeleteLists((guintptr)list, 1);
+ return FALSE;
+}
+
/**
* grits_poly_new:
* @points: TODO
return poly;
}
+static void _free_points(gdouble (**points)[3])
+{
+ for (int i = 0; points[i]; i++)
+ g_free(points[i]);
+ g_free(points);
+}
+
GritsPoly *grits_poly_parse(const gchar *str,
const gchar *poly_sep, const gchar *point_sep, const gchar *coord_sep)
{
polys[pi] = coords;
g_strfreev(scoords);
}
+ g_strfreev(spolys);
/* Create GritsPoly */
GritsPoly *poly = grits_poly_new(polys);
GRITS_OBJECT(poly)->center.lon = lon_avg(bounds.e, bounds.w);
GRITS_OBJECT(poly)->center.elev = 0;
GRITS_OBJECT(poly)->skip = GRITS_SKIP_CENTER;
+ g_object_weak_ref(G_OBJECT(poly), (GWeakNotify)_free_points, polys);
return poly;
}
static void grits_poly_finalize(GObject *_poly)
{
- g_debug("GritsPoly: finalize");
+ //g_debug("GritsPoly: finalize");
GritsPoly *poly = GRITS_POLY(_poly);
- (void)poly;
- // TODO: free points
+ if (poly->list[0]) g_idle_add(grits_poly_delete, (gpointer)(guintptr)poly->list[0]);
+ if (poly->list[1]) g_idle_add(grits_poly_delete, (gpointer)(guintptr)poly->list[1]);
}
static void grits_poly_class_init(GritsPolyClass *klass)