-#include "imio.h"
-#include "datatypes.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-
+#include "imager.h"
/*
2d bitmask with test and set operations
struct i_bitmap*
btm_new(int xsize,int ysize) {
int i;
+ int bytes;
struct i_bitmap *btm;
- btm=(struct i_bitmap*)mymalloc(sizeof(struct i_bitmap));
- btm->data=(char*)mymalloc((xsize*ysize+8)/8);
+ btm=(struct i_bitmap*)mymalloc(sizeof(struct i_bitmap)); /* checked 4jul05 tonyc */
+ bytes = (xsize*ysize+8)/8;
+ if (bytes * 8 / ysize < xsize-1) { /* this is kind of rough */
+ fprintf(stderr, "Integer overflow allocating bitmap %d x %d", xsize, ysize);
+ exit(3);
+ }
+ btm->data=(char*)mymalloc(bytes); /* checked 4jul05 tonyc */
btm->xsize=xsize;
btm->ysize=ysize;
for(i=0;i<(xsize*ysize+8)/8;i++) btm->data[i]=0; /* Is this always needed */
struct llink *
llink_new(struct llink* p,int size) {
struct llink *l;
- l = mymalloc(sizeof(struct llink));
+ l = mymalloc(sizeof(struct llink)); /* checked 4jul05 tonyc */
l->n = NULL;
l->p = p;
l->fill = 0;
- l->data = mymalloc(size);
+ l->data = mymalloc(size); /* checked 4jul05 tonyc - depends on caller to llist_push */
return l;
}
struct llist *
llist_new(int multip, int ssize) {
struct llist *l;
- l = mymalloc(sizeof(struct llist));
+ l = mymalloc(sizeof(struct llist)); /* checked 4jul05 tonyc */
l->h = NULL;
l->t = NULL;
l->multip = multip;
}
/* fprintf(stderr,"0x%08X\n",l->t); */
if (llist_llink_push(l,l->t,data)) {
- m_fatal(3, "out of memory\n");
+ i_fatal(3, "out of memory\n");
}
}
void
llist_dump(struct llist *l) {
- int k,j;
+ int j;
int i=0;
struct llink *lnk;
lnk=l->h;
while(lnk != NULL) {
for(j=0;j<lnk->fill;j++) {
/* memcpy(&k,(char*)(lnk->data)+l->ssize*j,sizeof(void*));*/
- memcpy(&k,(char*)(lnk->data)+l->ssize*j,sizeof(void*));
- printf("%d - %X\n",i,k);
+ /*memcpy(&k,(char*)(lnk->data)+l->ssize*j,sizeof(void*));*/
+ printf("%d - %p\n",i,*(void **)((char *)(lnk->data)+l->ssize*j));
i++;
}
lnk=lnk->n;
int i;
struct octt *t;
- t=(struct octt*)mymalloc(sizeof(struct octt));
+ t=(struct octt*)mymalloc(sizeof(struct octt)); /* checked 4jul05 tonyc */
for(i=0;i<8;i++) t->t[i]=NULL;
t->cnt=0;
return t;
octt_add(struct octt *ct,unsigned char r,unsigned char g,unsigned char b) {
struct octt *c;
int i,cm;
- int ci,idx[8];
+ int ci;
int rc;
rc=0;
c=ct;
/* printf("[r,g,b]=[%d,%d,%d]\n",r,g,b); */
- ct->cnt++;
for(i=7;i>-1;i--) {
cm=1<<i;
ci=((!!(r&cm))<<2)+((!!(g&cm))<<1)+!!(b&cm);
/* printf("idx[%d]=%d\n",i,ci); */
- if (c->t[ci] == NULL) { c->t[ci]=octt_new(); rc=1; }
+ if (c->t[ci] == NULL) {
+ c->t[ci]=octt_new();
+ rc=1;
+ }
c=c->t[ci];
- c->cnt++;
- idx[i]=ci;
}
+ c->cnt++; /* New. The only thing really needed (I think) */
return rc;
}
octt_dump(struct octt *ct) {
int i;
/* printf("node [0x%08X] -> (%d)\n",ct,ct->cnt); */
- for(i=0;i<8;i++) if (ct->t[i] != NULL) printf("[ %d ] -> 0x%08X\n",i,(unsigned int)ct->t[i]);
- for(i=0;i<8;i++) if (ct->t[i] != NULL) octt_dump(ct->t[i]);
+ for(i=0;i<8;i++)
+ if (ct->t[i] != NULL)
+ printf("[ %d ] -> %p\n", i, (void *)ct->t[i]);
+ for(i=0;i<8;i++)
+ if (ct->t[i] != NULL)
+ octt_dump(ct->t[i]);
}
/* note that all calls of octt_count are operating on the same overflow
if (!c) (*tot)++;
if ( (*tot) > (*overflow) ) *overflow=0;
}
+
+/* This whole function is new */
+/* walk through the tree and for each colour, store its seen count in the
+ space pointed by *col_usage_it_adr */
+void
+octt_histo(struct octt *ct, unsigned int **col_usage_it_adr) {
+ int i,c;
+ c = 0;
+ for(i = 0; i < 8; i++)
+ if (ct->t[i] != NULL) {
+ octt_histo(ct->t[i], col_usage_it_adr);
+ c++;
+ }
+ if (!c) {
+ *(*col_usage_it_adr)++ = ct->cnt;
+ }
+}
+
+