added in-line horizontal processing prototype
[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
7 xrow_t* xrow_new()
8 {
9     xrow_t*r = rfx_calloc(sizeof(xrow_t));
10     r->size = 16;
11     r->x = rfx_alloc(sizeof(r->x[0])*r->size);
12     return r;
13 }
14
15 void xrow_add(xrow_t*r, int32_t x)
16 {
17     if(r->num && r->lastx==x)
18         return;
19     r->lastx = x;
20     if(r->num >= r->size) {
21         r->size *= 2;
22         r->x = rfx_realloc(r->x, sizeof(r->x[0])*r->size);
23     }
24     r->x[r->num++]=x;
25 }
26
27 int compare_int32(const void*_i1,const void*_i2)
28 {
29     int32_t*i1 = (int32_t*)_i1;
30     int32_t*i2 = (int32_t*)_i2;
31     return *i1-*i2;
32 }
33
34 void xrow_sort(xrow_t*r)
35 {
36     if(!r->num)
37         return;
38     qsort(r->x, r->num, sizeof(r->x[0]), compare_int32);
39     int t;
40     int pos = 1;
41     int32_t lastx=r->x[0];
42     for(t=1;t<r->num;t++) {
43         if(r->x[t]!=lastx) {
44             r->x[pos++] = lastx = r->x[t];
45         }
46     }
47     r->num = pos;
48 }
49
50 char xrow_contains(xrow_t*r, int32_t x)
51 {
52     int min, max, i, l;
53     
54     for(min=0, max=r->num, i=r->num/2, l=r->num; i != l; l=i, i=(min+max)/2) {
55         if(x < r->x[i]) max=i;
56         else min=i;
57     }
58     
59     if(i >= r->num)
60         return 0;
61
62     return r->x[i] == x;
63 }
64
65 void xrow_reset(xrow_t*r)
66 {
67     r->num = 0;
68 }
69
70 void xrow_dump(xrow_t*xrow)
71 {
72     fprintf(stderr, "x: ");
73     int t;
74     for(t=0;t<xrow->num;t++) {
75         if(t)
76             fprintf(stderr, ", ");
77         fprintf(stderr, "%d", xrow->x[t]);
78     }
79     fprintf(stderr, "\n");
80 }
81
82 void xrow_destroy(xrow_t*r)
83 {
84     if(r->x) {
85         free(r->x);r->x = 0;
86     }
87     free(r);
88 }