Ejemplo n.º 1
0
int main (int argc, char * argv[]) {
  bool restart;
  unsigned long int particles_n;

  if (argc < 2) {
    particles_n = NUMBER_OF_PARTICLES;
  } else {
    errno = 0;

    particles_n = strtoul(argv[1], NULL, 0);

    if (errno) {
      perror(__func__);
      exit(EXIT_FAILURE);
    }
  }

  n = particles_n;

  px =
    align_padded_malloc(ALIGN_BOUNDARY, n*sizeof(value), ALLOC_PADDING);
  py =
    align_padded_malloc(ALIGN_BOUNDARY, n*sizeof(value), ALLOC_PADDING);

  vx =
    align_padded_malloc(ALIGN_BOUNDARY, n*sizeof(value), ALLOC_PADDING);
  vy =
    align_padded_malloc(ALIGN_BOUNDARY, n*sizeof(value), ALLOC_PADDING);

  m  =
    align_padded_malloc(ALIGN_BOUNDARY, n*sizeof(value), ALLOC_PADDING);

  if (px == NULL || py == NULL ||
      vx == NULL || vy == NULL || m == NULL) {
    perror("main");
    exit(EXIT_FAILURE);
  }

  draw_init(SCREEN_WIDTH, SCREEN_HEIGHT, FRAME_RATE, n);
  physics_init(n);
  rng_init();

  do {
    draw_reset(n);
    physics_reset(n);
    restart = main_loop();
  } while (restart);

  rng_free();
  physics_free();
  draw_free();

  align_free(m);
  align_free(vy);
  align_free(vx);
  align_free(py);
  align_free(px);

  exit(EXIT_SUCCESS);
}
Ejemplo n.º 2
0
static void
ddb_tabstrip_destroy(GObject *object)
{
    DdbTabStrip *tabstrip;

    g_return_if_fail(object != NULL);
    g_return_if_fail(DDB_IS_TABSTRIP(object));

    tabstrip = DDB_TABSTRIP (object);
    draw_free (&tabstrip->drawctx);
}
Ejemplo n.º 3
0
static void choose_font(void)
{
    CHOOSEFONT cf;

    memset(&cf, 0, sizeof(CHOOSEFONT));
    cf.lStructSize=sizeof(CHOOSEFONT);
    cf.hwndOwner=wndMain;
    cf.Flags=CF_FIXEDPITCHONLY|CF_NOSCRIPTSEL|CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT;
    cf.lpLogFont=&df;
    if (!ChooseFont(&cf))
        return;
    save_font();
    draw_free();
    draw_init(&df);
    InvalidateRect(termwnd, 0, 1);
}
Ejemplo n.º 4
0
struct draw *draw_from_bmp (const char *file)
{
  FILE *fp;
  DWORD *pix;
  struct draw *draw;
  
  void *fdata;
  size_t size;
  int color_size;
  int i, j;
  DWORD color;
  
  BITMAPFILEHEADER *header;
  BITMAPINFOHEADER *info;
  RGBQUAD          *colors;
  
  if ((fp = fopen (file, "rb")) == NULL)
  {
    ERROR ("Couldn't open file \"%s\": %s\n", file, strerror (errno));
    
    return NULL;
  }
  
  fseek (fp, 0, SEEK_END);
  size = ftell (fp);
  fseek (fp, 0, SEEK_SET);
  
  if (size < sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER))
  {
    ERROR ("%s: broken header\n", file);
    fclose (fp);
    
    return NULL;
  }
  
  if ((fdata = mmap (NULL, size, PROT_READ, MAP_SHARED, fileno (fp), 0)) ==
    NULL)
  {
    ERROR ("%s: mmap failed: %s\n", file, strerror (errno));
    fclose (fp);
    
    return NULL;
  }
  
  header = fdata;
  info   = fdata + sizeof (BITMAPFILEHEADER);
    
  if (header->bfType != BM_MAGIC)
  {
    ERROR ("%s: not a BMP file\n", file);
    fclose (fp);
    munmap (fdata, size);
    
    return NULL;
  }
  
  if (header->bfSize > size)
  {
    ERROR ("%s: broken file\n", file);
    fclose (fp);
    munmap (fdata, size);
    
    return NULL;
  }
  
  if (header->bfOffBits >= size)
  {
    ERROR ("%s: incongruent field bfOffBits" 
           "(it says %d, size is %d bytes long)\n", 
           file, header->bfOffBits, (int) size);
    fclose (fp);
    munmap (fdata, size);
    
    return NULL;
  }
  
  if (info->biCompression != 0)
  {
    ERROR ("%s: the file is compressed\n", file);
    fclose (fp);
    munmap (fdata, size);
    
    return NULL;
  }
  
  colors = fdata + sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER);
  
  color_size = info->biBitCount >= 24 ? 0 : 
    (info->biClrUsed == 0 ? 1 << info->biBitCount : info->biClrUsed);
    
  if ((sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + 
      color_size * sizeof (RGBQUAD)) > header->bfOffBits)
  {
    ERROR ("%s: color table overlaps picture data\n", file);
    ERROR ("0x%lx > 0x%x\n", (sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + 
      color_size * sizeof (RGBQUAD)), header->bfOffBits);
    ERROR ("%d colors used\n", info->biClrUsed);
    
    fclose (fp);
    munmap (fdata, size);
    
    return NULL;
  }
  
  draw = draw_new (info->biWidth, info->biHeight);
  
  for (j = 0; j < info->biHeight; j++)
    for (i = 0; i < info->biWidth; i++)
    {
      pix = (DWORD *) (fdata + header->bfOffBits + 
        PIX_OFFSET (i, j, info->biWidth, info->biHeight, info->biBitCount));
      
      /*FIXME: check if pix is out of bounds */
      
      color = 0xffffff & *pix;
      if (color_size)
      {
        color = get_color (color, info->biBitCount,
          PIX_BIT_OFFSET (i, info->biBitCount));
          
        if (color >= color_size)
        {
          ERROR ("%s: unmapped color %x (%d colors)\n", file, color,
            color_size);
          fclose (fp);
          munmap (fdata, size);
          draw_free (draw);
          
          return NULL;  
        }
        
        color = RGB (colors[color].rgbRed,
                     colors[color].rgbGreen,
                     colors[color].rgbBlue);
      }
      
      draw_pset (draw, i, j, color);
    }
    
  fclose (fp);
  munmap (fdata, size);
  
  return draw;
}