From 036123cc8bb3f1b0ef96f6bd15f0c4d0eefe571e Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@tavianator.com>
Date: Mon, 26 May 2014 16:20:25 -0400
Subject: camera: Kill the ->ptr field.

---
 libdimension/camera.c           | 23 ++++++++++++++++-------
 libdimension/dimension/camera.h | 20 +++++++++++++++-----
 libdimension/perspective.c      |  4 ++--
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/libdimension/camera.c b/libdimension/camera.c
index 1c5a1fc..38fde35 100644
--- a/libdimension/camera.c
+++ b/libdimension/camera.c
@@ -26,26 +26,35 @@
 #include "dimension-internal.h"
 #include <stdlib.h>
 
+static void dmnsn_default_camera_free_fn(dmnsn_camera *camera)
+{
+  dmnsn_free(camera);
+}
+
 /* Allocate a new dummy camera */
 dmnsn_camera *
 dmnsn_new_camera(void)
 {
   dmnsn_camera *camera = DMNSN_MALLOC(dmnsn_camera);
-  camera->free_fn = NULL;
-  camera->trans   = dmnsn_identity_matrix();
-  DMNSN_REFCOUNT_INIT(camera);
+  dmnsn_init_camera(camera);
   return camera;
 }
 
+/* Initialize a camera */
+void
+dmnsn_init_camera(dmnsn_camera *camera)
+{
+  camera->free_fn = dmnsn_default_camera_free_fn;
+  camera->trans = dmnsn_identity_matrix();
+  DMNSN_REFCOUNT_INIT(camera);
+}
+
 /* Free a dummy camera */
 void
 dmnsn_delete_camera(dmnsn_camera *camera)
 {
   if (DMNSN_DECREF(camera)) {
-    if (camera->free_fn) {
-      camera->free_fn(camera->ptr);
-    }
-    dmnsn_free(camera);
+    camera->free_fn(camera);
   }
 }
 
diff --git a/libdimension/dimension/camera.h b/libdimension/dimension/camera.h
index 00f0ad5..d8e0bdf 100644
--- a/libdimension/dimension/camera.h
+++ b/libdimension/dimension/camera.h
@@ -1,5 +1,5 @@
 /*************************************************************************
- * Copyright (C) 2009-2011 Tavian Barnes <tavianator@tavianator.com>     *
+ * Copyright (C) 2009-2014 Tavian Barnes <tavianator@tavianator.com>     *
  *                                                                       *
  * This file is part of The Dimension Library.                           *
  *                                                                       *
@@ -36,16 +36,20 @@ typedef struct dmnsn_camera dmnsn_camera;
 typedef dmnsn_line dmnsn_camera_ray_fn(const dmnsn_camera *camera,
                                        double x, double y);
 
+/**
+ * Camera destruction callback.
+ * @param[in,out] camera  The camera to delete.
+ */
+typedef void dmnsn_camera_free_fn(dmnsn_camera *camera);
+
 /** A camera. */
 struct dmnsn_camera {
   /* Callback functions */
-  dmnsn_camera_ray_fn *ray_fn;  /**< Camera ray callback. */
-  dmnsn_free_fn       *free_fn; /**< Destructor callback. */
+  dmnsn_camera_ray_fn *ray_fn; /**< Camera ray callback. */
+  dmnsn_camera_free_fn *free_fn; /**< Destructor callback. */
 
   dmnsn_matrix trans; /**< Transformation matrix. */
 
-  void *ptr; /**< Generic pointer for camera info. */
-
   DMNSN_REFCOUNT; /**< Reference count. */
 };
 
@@ -55,6 +59,12 @@ struct dmnsn_camera {
  */
 dmnsn_camera *dmnsn_new_camera(void);
 
+/**
+ * Initialize a dmnsn_camera field.
+ * @param[in,out] camera  The camera to initialize.
+ */
+void dmnsn_init_camera(dmnsn_camera *camera);
+
 /**
  * Delete a camera.
  * @param[in,out] camera  The camera to delete.
diff --git a/libdimension/perspective.c b/libdimension/perspective.c
index 5b4b3b5..10b7c18 100644
--- a/libdimension/perspective.c
+++ b/libdimension/perspective.c
@@ -1,5 +1,5 @@
 /*************************************************************************
- * Copyright (C) 2010-2011 Tavian Barnes <tavianator@tavianator.com>     *
+ * Copyright (C) 2010-2014 Tavian Barnes <tavianator@tavianator.com>     *
  *                                                                       *
  * This file is part of The Dimension Library.                           *
  *                                                                       *
@@ -42,6 +42,6 @@ dmnsn_camera *
 dmnsn_new_perspective_camera(void)
 {
   dmnsn_camera *camera = dmnsn_new_camera();
-  camera->ray_fn  = dmnsn_perspective_camera_ray_fn;
+  camera->ray_fn = dmnsn_perspective_camera_ray_fn;
   return camera;
 }
-- 
cgit v1.2.3