Beispiel #1
0
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;
}
Beispiel #2
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
}