Changed all the licence notices in all the files.
[pspp] / src / piechart.c
index 4e0725e6d64acd93677228c42a3975d3eb33a0cf..523809f37b596d025721883b90797f9f38e0f8a0 100644 (file)
@@ -15,11 +15,11 @@ General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
 
 
-#include <config.h>
+#include "config.h"
 #include "chart.h"
 #include <float.h>
 #include <assert.h>
@@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include <stdio.h>
 #include "str.h"
 #include "value-labels.h"
+#include "misc.h"
 
 
 /* Pie charts of course need to know Pi :) */
@@ -35,11 +36,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #endif
 
 
-#define min(A,B) ((A>B)?B:A)
-
 
 /* Draw a single slice of the pie */
-void
+static void
 draw_segment(struct chart *ch, 
             double centre_x, double centre_y, 
             double radius,
@@ -47,14 +46,18 @@ draw_segment(struct chart *ch,
             const char *colour) ;
 
 
-/* Draw a pie chart */
+
+/* Draw a piechart */
 void
-draw_piechart(struct chart *ch, const struct variable *var,
-              const struct freq_tab *frq_tab)
+piechart_plot(const char *title, const struct slice *slices, int n_slices)
 {
   int i;
+  double total_magnetude=0;
+
+  struct chart *ch;
+
+  ch = chart_create();
 
-  const int n_data = frq_tab->n_valid;
   const double left_label = ch->data_left + 
     (ch->data_right - ch->data_left)/10.0;
 
@@ -70,24 +73,17 @@ draw_piechart(struct chart *ch, const struct variable *var,
                            );
 
 
-  chart_write_title(ch, var->label ? var->label: var->name);
+  chart_write_title(ch, title);
+
+  for (i = 0 ; i < n_slices ; ++i ) 
+    total_magnetude += slices[i].magnetude;
 
-    
-  for (i = 0 ; i < n_data ; ++i ) 
+  for (i = 0 ; i < n_slices ; ++i ) 
     {
       static double angle=0.0;
-      const struct freq frq = frq_tab->valid[i];
 
       const double segment_angle = 
-       frq.c / frq_tab->valid_cases * 2 * M_PI ;
-
-      char *label = val_labs_find (var->val_labs, frq.v );
-      if ( !label ) 
-       {
-         static char l[20];
-         snprintf(l,20,"%g",frq.v.f);
-         label = l;
-       }
+       slices[i].magnetude / total_magnetude * 2 * M_PI ;
 
       const double label_x = centre_x - 
        radius * sin(angle + segment_angle/2.0);
@@ -107,7 +103,7 @@ draw_piechart(struct chart *ch, const struct variable *var,
          pl_line_r(ch->lp, label_x, label_y,
                    left_label, label_y );
          pl_moverel_r(ch->lp,0,5);
-         pl_alabel_r(ch->lp,0,0,label);
+         pl_alabel_r(ch->lp,0,0,slices[i].label);
        }
       else
        {
@@ -116,7 +112,7 @@ draw_piechart(struct chart *ch, const struct variable *var,
                    right_label, label_y
                    );
          pl_moverel_r(ch->lp,0,5);
-         pl_alabel_r(ch->lp,'r',0,label);
+         pl_alabel_r(ch->lp,'r',0,slices[i].label);
        }
 
       angle += segment_angle;
@@ -127,11 +123,10 @@ draw_piechart(struct chart *ch, const struct variable *var,
   pl_filltype_r(ch->lp,0);
   pl_fcircle_r (ch->lp, centre_x, centre_y, radius);
 
+  chart_submit(ch);
 }
 
-
-
-void
+static void
 fill_segment(struct chart *ch, 
             double x0, double y0, 
             double radius,
@@ -139,7 +134,7 @@ fill_segment(struct chart *ch,
 
 
 /* Fill a segment with the current fill colour */
-void
+static void
 fill_segment(struct chart *ch, 
             double x0, double y0, 
             double radius,
@@ -185,7 +180,7 @@ fill_segment(struct chart *ch,
 
 
 /* Draw a single slice of the pie */
-void
+static void
 draw_segment(struct chart *ch, 
             double x0, double y0, 
             double radius,
@@ -213,3 +208,4 @@ draw_segment(struct chart *ch,
 
   pl_restorestate_r(ch->lp);
 }
+