7 int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem;
9 struct block_index_item {
10 unsigned long blocknum;
18 struct block_index_item list[0];
22 block_get(unsigned char **p)
24 struct block *ret=(struct block *)(*p);
31 block_get_byid(struct file *file, int id, unsigned char **p_ret)
33 struct block_index *blk_idx;
37 blk_idx=(struct block_index *)(file->begin+0x1000);
38 max=(blk_idx->size-sizeof(struct block_index))/sizeof(struct block_index_item);
41 blk_idx=(struct block_index *)(file->begin+blk_idx->next*512);
44 blk_num=blk_idx->list[id].blocknum;
46 *p_ret=file->begin+blk_num*512;
47 return block_get(p_ret);
51 block_get_byindex(struct file *file, int idx, struct block_priv *blk)
53 dbg(1,"idx=%d\n", idx);
54 blk->b=block_get_byid(file, idx, &blk->p);
55 blk->block_start=(unsigned char *)(blk->b);
57 blk->end=blk->block_start+blk->b->size;
63 block_setup_tags(struct map_rect_priv *mr)
71 p=mr->file->begin+0x0c;
76 /* printf("String '%s' len %d\n", str, len); */
77 if (! strcmp(str,"FirstBatBlock")) {
78 /* printf("%ld\n", get_u32_unal(&t)); */
79 } else if (! strcmp(str,"MaxBlockSize")) {
80 /* printf("%ld\n", get_u32_unal(&t)); */
81 } else if (! strcmp(str,"FREE_BLOCK_LIST")) {
82 /* printf("%ld\n", get_u32_unal(&t)); */
83 } else if (! strcmp(str,"TotalRect")) {
84 mr->b.b_rect.lu.x=get_u32_unal(&t);
85 mr->b.b_rect.lu.y=get_u32_unal(&t);
86 mr->b.b_rect.rl.x=get_u32_unal(&t);
87 mr->b.b_rect.rl.y=get_u32_unal(&t);
88 /* printf("0x%x,0x%x-0x%x,0x%x\n", mr->b.b_rect.lu.x, mr->b.b_rect.lu.y, mr->b.b_rect.rl.x, mr->b.b_rect.rl.y); */
89 } else if (! strcmp(str,"Version")) {
90 /* printf("0x%lx\n", get_u32_unal(&t)); */
91 } else if (! strcmp(str,"Categories")) {
92 /* printf("0x%x\n", get_u16(&t)); */
93 } else if (! strcmp(str,"binaryTree")) {
94 mr->b.binarytree=get_u32_unal(&t);
95 /* printf("%d\n", mr->b.binarytree); */
96 } else if (! strcmp(str,"CategorySets")) {
97 /* printf("0x%x\n", get_u16(&t)); */
98 } else if (! strcmp(str,"Kommentar")) {
99 /* printf("%s\n", get_string(&t)); */
107 block_rect_print(struct coord_rect *r)
109 printf ("0x%x,0x%x-0x%x,0x%x (0x%x,0x%x)", r->lu.x, r->lu.y, r->rl.x, r->rl.y, r->lu.x/2+r->rl.x/2,r->lu.y/2+r->rl.y/2);
114 block_rect_same(struct coord_rect *r1, struct coord_rect *r2)
116 g_assert(r1->lu.x==r2->lu.x);
117 g_assert(r1->lu.y==r2->lu.y);
118 g_assert(r1->rl.x==r2->rl.x);
119 g_assert(r1->rl.y==r2->rl.y);
123 block_init(struct map_rect_priv *mr)
128 block_setup_tags(mr);
129 if (mr->b.binarytree) {
130 mr->b.bt.next=mr->b.binarytree;
132 mr->b.bt.block_count=0;
134 if (mr->cur_sel && !coord_rect_overlap(&mr->cur_sel->rect, &mr->b.b_rect))
136 return block_next(mr);
141 block_next_lin(struct map_rect_priv *mr)
145 block_mem+=sizeof(struct block *);
147 if (! mr->b.block_num)
148 mr->b.p=mr->file->begin+0x2000;
150 mr->b.p=mr->b.block_start+mr->b.b->blocks*512;
151 if (mr->b.p >= mr->file->end)
153 mr->b.block_start=mr->b.p;
154 mr->b.b=block_get(&mr->b.p);
155 mr->b.p_start=mr->b.p;
156 mr->b.end=mr->b.block_start+mr->b.b->size;
157 if (mr->b.b->count == -1)
159 if (!mr->cur_sel || coord_rect_overlap(&mr->cur_sel->rect, &mr->b.b->r)) {
160 block_active_count++;
161 block_active_mem+=mr->b.b->blocks*512-sizeof(struct block *);
168 block_next(struct map_rect_priv *mr)
170 int blk_num,coord,r_h,r_w;
171 struct block_bt_priv *bt=&mr->b.bt;
173 if (!mr->b.binarytree || ! mr->cur_sel)
174 return block_next_lin(mr);
177 dbg(1,"block 0x%x\n", bt->next);
180 bt->b=block_get_byid(mr->file, bt->next, &bt->p);
181 bt->end=(unsigned char *)mr->b.bt.b+mr->b.bt.b->size;
182 bt->next=bt->b->next;
184 dbg(1,"size 0x%x next 0x%x\n", bt->b->size, bt->b->next);
185 if (! mr->b.bt.block_count) {
189 block_rect_print(&mr->b.bt.b->r);
194 coord=get_u32(&mr->b.bt.p);
196 bt->p=(unsigned char *)bt->b+0xc;
200 while (mr->b.bt.p < mr->b.bt.end) {
202 blk_num=get_u32(&mr->b.bt.p);
203 coord=get_u32(&mr->b.bt.p);
205 dbg(1,"%p vs %p coord 0x%x ", mr->b.bt.end, mr->b.bt.p, coord);
206 dbg(1,"block 0x%x", blk_num);
208 r_w=bt->r_curr.rl.x-bt->r_curr.lu.x;
209 r_h=bt->r_curr.lu.y-bt->r_curr.rl.y;
213 block_rect_print(&bt->r_curr);
214 printf(" %dx%d", r_w, r_h);
220 if (coord_rect_overlap(&mr->cur_sel->rect, &bt->r_curr)) {
221 mr->b.b=block_get_byid(mr->file, blk_num, &mr->b.p);
222 mr->b.block_num=blk_num;
223 g_assert(mr->b.b != NULL);
224 mr->b.block_start=(unsigned char *)(mr->b.b);
225 mr->b.p_start=mr->b.p;
226 mr->b.end=mr->b.block_start+mr->b.b->size;
227 block_rect_same(&mr->b.b->r, &bt->r_curr);
231 bt->stack[bt->stackp]=bt->r_curr;
233 bt->r_curr.rl.x=coord;
234 bt->stack[bt->stackp].lu.x=coord+1;
236 bt->r_curr.lu.y=coord;
237 bt->stack[bt->stackp].rl.y=coord+1;
240 g_assert(bt->stackp < BT_STACK_SIZE);
244 bt->r_curr=bt->stack[bt->stackp];
253 block_active_count++;
254 block_active_mem+=mr->b.b->blocks*512;