fixed units of gfxpoly_intersection_area()
[swftools.git] / lib / gfxpoly / xrow.c
blob7987ac15a0439cb306e63cae70eae37869ece7aa
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <memory.h>
4 #include "../mem.h"
5 #include "xrow.h"
6 #include "poly.h"
8 xrow_t* xrow_new()
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;
16 void xrow_add(xrow_t*r, int32_t x)
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);
25 r->x[r->num++]=x;
28 int compare_int32(const void*_i1,const void*_i2)
30 int32_t*i1 = (int32_t*)_i1;
31 int32_t*i2 = (int32_t*)_i2;
32 return *i1-*i2;
35 void xrow_sort(xrow_t*r)
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];
48 r->num = pos;
51 int xrow_find(xrow_t*r, int32_t x)
53 int min, max, i, l;
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;
60 #ifdef CHECKS
61 int t;
62 for(t=0;t<r->num;t++) {
63 if(x < r->x[t])
64 break;
66 assert(max == t);
67 #endif
69 return max;
72 char xrow_contains(xrow_t*r, int32_t x)
74 int pos = xrow_find(r,x) - 1;
75 return (pos>=0 && r->x[pos]==x);
78 void xrow_reset(xrow_t*r)
80 r->num = 0;
83 void xrow_dump(xrow_t*xrow, double gridsize)
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);
92 fprintf(stderr, "\n");
95 void xrow_destroy(xrow_t*r)
97 if(r->x) {
98 free(r->x);r->x = 0;
100 free(r);