7987ac15a0439cb306e63cae70eae37869ece7aa
[swftools.git] / lib / gfxpoly / xrow.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <memory.h>
4 #include "../mem.h"
5 #include "xrow.h"
6 #include "poly.h"
7
8 xrow_t* xrow_new()
9 {
10     xrow_t*r = rfx_calloc(sizeof(xrow_t));
11     r->size = 16;
12     r->x = rfx_alloc(sizeof(r->x[0])*r->size);
13     return r;
14 }
15
16 void xrow_add(xrow_t*r, int32_t x)
17 {
18     if(r->num && r->lastx==x)
19         return;
20     r->lastx = x;
21     if(r->num >= r->size) {
22         r->size *= 2;
23         r->x = rfx_realloc(r->x, sizeof(r->x[0])*r->size);
24     }
25     r->x[r->num++]=x;
26 }
27
28 int compare_int32(const void*_i1,const void*_i2)
29 {
30     int32_t*i1 = (int32_t*)_i1;
31     int32_t*i2 = (int32_t*)_i2;
32     return *i1-*i2;
33 }
34
35 void xrow_sort(xrow_t*r)
36 {
37     if(!r->num)
38         return;
39     qsort(r->x, r->num, sizeof(r->x[0]), compare_int32);
40     int t;
41     int pos = 1;
42     int32_t lastx=r->x[0];
43     for(t=1;t<r->num;t++) {
44         if(r->x[t]!=lastx) {
45             r->x[pos++] = lastx = r->x[t];
46         }
47     }
48     r->num = pos;
49 }
50
51 int xrow_find(xrow_t*r, int32_t x)
52 {
53     int min, max, i, l;
54
55     for(min=0, max=r->num, i=r->num/2, l=r->num; i != l; l=i, i=(min+max)/2) {
56         if(x < r->x[i]) max=i;
57         else min=i;
58     }
59
60 #ifdef CHECKS
61     int t;
62     for(t=0;t<r->num;t++) {
63         if(x < r->x[t]) 
64             break;
65     }
66     assert(max == t);
67 #endif
68
69     return max;
70 }
71
72 char xrow_contains(xrow_t*r, int32_t x)
73 {
74     int pos = xrow_find(r,x) - 1;
75     return (pos>=0 && r->x[pos]==x);
76 }
77
78 void xrow_reset(xrow_t*r)
79 {
80     r->num = 0;
81 }
82
83 void xrow_dump(xrow_t*xrow, double gridsize)
84 {
85     fprintf(stderr, "x: ");
86     int t;
87     for(t=0;t<xrow->num;t++) {
88         if(t)
89             fprintf(stderr, ", ");
90         fprintf(stderr, "%.2f", xrow->x[t] * gridsize);
91     }
92     fprintf(stderr, "\n");
93 }
94
95 void xrow_destroy(xrow_t*r)
96 {
97     if(r->x) {
98         free(r->x);r->x = 0;
99     }
100     free(r);
101 }