48fe7ad40eb8bd3133969803745d0a3d4e113065
[swftools.git] / lib / gfxpoly / xrow.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "../mem.h"
4 #include "xrow.h"
5
6 xrow_t* xrow_new()
7 {
8     xrow_t*r = rfx_calloc(sizeof(xrow_t));
9     r->size = 16;
10     r->x = rfx_alloc(sizeof(r->x[0])*r->size);
11     return r;
12 }
13
14 void xrow_add(xrow_t*r, int32_t x)
15 {
16     if(r->num && r->lastx==x)
17         return;
18     r->lastx = x;
19     if(r->num >= r->size) {
20         r->size *= 2;
21         r->x = rfx_realloc(r->x, sizeof(r->x[0])*r->size);
22     }
23     r->x[r->num++]=x;
24 }
25
26 int compare_int32(const void*_i1,const void*_i2)
27 {
28     int32_t*i1 = (int32_t*)_i1;
29     int32_t*i2 = (int32_t*)_i2;
30     return *i1-*i2;
31 }
32
33 void xrow_sort(xrow_t*r)
34 {
35     if(!r->num)
36         return;
37     qsort(r->x, r->num, sizeof(r->x[0]), compare_int32);
38     int t;
39     int pos = 1;
40     int32_t lastx=r->x[0];
41     for(t=1;t<r->num;t++) {
42         if(r->x[t]!=lastx) {
43             r->x[pos++] = lastx = r->x[t];
44         }
45     }
46     r->num = pos;
47 }
48
49 void xrow_reset(xrow_t*r)
50 {
51     r->num = 0;
52 }
53
54 void xrow_dump(xrow_t*xrow)
55 {
56     fprintf(stderr, "x: ");
57     int t;
58     for(t=0;t<xrow->num;t++) {
59         if(t)
60             fprintf(stderr, ", ");
61         fprintf(stderr, "%d", xrow->x[t]);
62     }
63     fprintf(stderr, "\n");
64 }
65
66 void xrow_destroy(xrow_t*r)
67 {
68     if(r->x) {
69         free(r->x);r->x = 0;
70     }
71     free(r);
72 }