int drawrun(CGContextRef context, struct BMAP_Run run, const void *buf) { int i; int x; int offset; x = run.startx; offset = 0; while (x < run.endx) { int len; if (sizeof(struct BMAP_Run) + (offset + 2)/2 > run.datalen) { return -1; } len = readnibble(buf, offset++); if (len >= 0 && len <= 7) { /* this is a sequence of different tiles */ len += 1; if (sizeof(struct BMAP_Run) + (offset + len + 1)/2 > run.datalen) { return -1; } for (i = 0; i < len; i++) { /* draw terrain */ setterraincolor(context, readnibble(buf, offset++)); CGContextFillRect(context, CGRectMake(x++, run.y, 1, 1)); } } else if (len >= 8 && len <= 15) { /* this is a sequence of like tiles */ len -= 6; if (sizeof(struct BMAP_Run) + (offset + 2)/2 > run.datalen) { return -1; } /* draw terrain */ setterraincolor(context, readnibble(buf, offset++)); CGContextFillRect(context, CGRectMake(x, run.y, len, 1)); x += len; } else { return -1; } } if (sizeof(struct BMAP_Run) + (offset + 1)/2 != run.datalen) { return -1; } return 0; }
uint64_t poscorners(uint8_t* a){ uint8_t pos[cornercount]; memcpy(pos,a,cornercount); sort(pos,pos+cornercount); uint32_t x=binpos(pos,cornercount); #if symred==1 __builtin_prefetch(srposcorn+x,0,0); symcorners(a,readnibble(cornsymred[x/2],x%2)); #endif uint32_t bmp=0; uint8_t perm[cornercount]={0}; for(uint8_t i=0;i<cornercount;i++) bmp+=(1<<a[i]); for(uint8_t i=0;i<cornercount;i++){ uint32_t mask=bmp&((1<<a[i])-1); //create a mask including only x<a[i] for(uint8_t j=0;j<24;j+=8) //and reduce a[i] appropiatly perm[i]+=BitsSetTable256[(mask>>j)%256]; } #if symred==1 return 46371*permpos(perm,8)+srposcorn[x]; #elif cornercount==8 return 735471*permpos(perm,8)+x; #else return 134596*permpos(perm,6)+x; #endif }