/* read_win_bminfoheader:
 *  Reads information from a BMP file header.
 */
static int read_win_bminfoheader(ALLEGRO_FILE *f, BMPINFOHEADER *infoheader)
{
   WINBMPINFOHEADER win_infoheader;

   win_infoheader.biWidth = al_fread32le(f);
   win_infoheader.biHeight = al_fread32le(f);
   win_infoheader.biPlanes = al_fread16le(f);
   win_infoheader.biBitCount = al_fread16le(f);
   win_infoheader.biCompression = al_fread32le(f);
   win_infoheader.biSizeImage = al_fread32le(f);
   win_infoheader.biXPelsPerMeter = al_fread32le(f);
   win_infoheader.biYPelsPerMeter = al_fread32le(f);
   win_infoheader.biClrUsed = al_fread32le(f);
   win_infoheader.biClrImportant = al_fread32le(f);

   infoheader->biWidth = win_infoheader.biWidth;
   infoheader->biHeight = win_infoheader.biHeight;
   infoheader->biBitCount = win_infoheader.biBitCount;
   infoheader->biCompression = win_infoheader.biCompression;
   infoheader->biClrUsed = win_infoheader.biClrUsed;

   if (al_feof(f) || al_ferror(f)) {
      ALLEGRO_ERROR("Failed to read file header\n");
      return -1;
   }

   return 0;
}
Пример #2
0
T3F_TILEMAP * t3f_load_tilemap_f(ALLEGRO_FILE * fp)
{
	int i, j, k, w, h;
	T3F_TILEMAP * tmp;
	char header[16];

	al_fread(fp, header, 16);
	if(strcmp(header, "T3F_TILEMAP"))
	{
		return NULL;
	}
	tmp = malloc(sizeof(T3F_TILEMAP));
	if(!tmp)
	{
		return NULL;
	}
	switch(header[15])
	{
		case 0:
		{
			tmp->layers = al_fread16le(fp);
			for(i = 0; i < tmp->layers; i++)
			{
				tmp->layer[i] = malloc(sizeof(T3F_TILEMAP_LAYER));
				w = al_fread16le(fp);
				h = al_fread16le(fp);
				tmp->layer[i] = t3f_create_tilemap_layer(w, h);
				for(j = 0; j < tmp->layer[i]->height; j++)
				{
					for(k = 0; k < tmp->layer[i]->width; k++)
					{
						tmp->layer[i]->data[j][k] = al_fread16le(fp);
					}
				}
				tmp->layer[i]->x = t3f_fread_float(fp);
				tmp->layer[i]->y = t3f_fread_float(fp);
				tmp->layer[i]->z = t3f_fread_float(fp);
				tmp->layer[i]->scale = t3f_fread_float(fp);
				tmp->layer[i]->speed_x = t3f_fread_float(fp);
				tmp->layer[i]->speed_y = t3f_fread_float(fp);
				tmp->layer[i]->flags = al_fread32le(fp);
			}
			tmp->flags = al_fread32le(fp);
			break;
		}
	}
	return tmp;
}
/* read_bmfileheader:
 *  Reads a BMP file header and check that it has the BMP magic number.
 */
static int read_bmfileheader(ALLEGRO_FILE *f, BMPFILEHEADER *fileheader)
{
   fileheader->bfType = al_fread16le(f);
   fileheader->bfSize = al_fread32le(f);
   fileheader->bfReserved1 = al_fread16le(f);
   fileheader->bfReserved2 = al_fread16le(f);
   fileheader->bfOffBits = al_fread32le(f);

   if (fileheader->bfType != 19778) {
      ALLEGRO_ERROR("Not BMP format\n");
      return -1;
   }

   if (al_feof(f) || al_ferror(f)) {
      ALLEGRO_ERROR("Failed to read file header\n");
      return -1;
   }

   return 0;
}
/* read_os2_bminfoheader:
 *  Reads information from an OS/2 format BMP file header.
 */
static int read_os2_bminfoheader(ALLEGRO_FILE *f, BMPINFOHEADER *infoheader)
{
   OS2BMPINFOHEADER os2_infoheader;

   os2_infoheader.biWidth = al_fread16le(f);
   os2_infoheader.biHeight = al_fread16le(f);
   os2_infoheader.biPlanes = al_fread16le(f);
   os2_infoheader.biBitCount = al_fread16le(f);

   infoheader->biWidth = os2_infoheader.biWidth;
   infoheader->biHeight = os2_infoheader.biHeight;
   infoheader->biBitCount = os2_infoheader.biBitCount;
   infoheader->biCompression = BIT_RGB;
   infoheader->biClrUsed = 0; /* default */

   if (al_feof(f) || al_ferror(f)) {
      ALLEGRO_ERROR("Failed to read file header\n");
      return -1;
   }

   return 0;
}
Пример #5
0
T3F_ANIMATION * t3f_load_animation_f(ALLEGRO_FILE * fp, const char * fn)
{
	T3F_ANIMATION * ap;
	int i;
	char header[12]	= {0};
	int ver;
	int fpos = 0;
	ALLEGRO_STATE old_state;
	ALLEGRO_BITMAP * bp;

	al_fread(fp, header, 12);
	ver = check_header(header);
	if(ver < 0)
	{
		return NULL;
	}

	ap = t3f_create_animation();
	if(ap)
	{
		switch(ver)
		{
			case 0:
			{
				ap->bitmaps->count = al_fread16le(fp);
				for(i = 0; i < ap->bitmaps->count; i++)
				{
					ap->bitmaps->bitmap[i] = t3f_load_resource_f((void **)(&ap->bitmaps->bitmap[i]), T3F_RESOURCE_TYPE_BITMAP, fp, fn, 1, 0);
				}
				ap->frames = al_fread16le(fp);
				for(i = 0; i < ap->frames; i++)
				{
					ap->frame[i] = al_malloc(sizeof(T3F_ANIMATION_FRAME));
					if(!ap->frame[i])
					{
						return NULL;
					}
					ap->frame[i]->bitmap = al_fread16le(fp);
					ap->frame[i]->x = t3f_fread_float(fp);
					ap->frame[i]->y = t3f_fread_float(fp);
					ap->frame[i]->z = t3f_fread_float(fp);
					ap->frame[i]->width = t3f_fread_float(fp);
					ap->frame[i]->height = t3f_fread_float(fp);
					ap->frame[i]->angle = t3f_fread_float(fp);
					ap->frame[i]->ticks = al_fread32le(fp);
					ap->frame[i]->flags = al_fread32le(fp);
				}
				ap->flags = al_fread32le(fp);
				break;
			}
			case 1:
			{
				ap->bitmaps->count = al_fread16le(fp);
				for(i = 0; i < ap->bitmaps->count; i++)
				{
					fpos = al_ftell(fp);
					ap->bitmaps->bitmap[i] = t3f_load_resource_f((void **)(&ap->bitmaps->bitmap[i]), T3F_RESOURCE_TYPE_BITMAP, fp, fn, 0, 0);
					if(!ap->bitmaps->bitmap[i])
					{
						al_fseek(fp, fpos, ALLEGRO_SEEK_SET);
						al_store_state(&old_state, ALLEGRO_STATE_NEW_BITMAP_PARAMETERS);
						al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
						bp = t3f_load_bitmap_f(fp);
						al_restore_state(&old_state);
						if(bp)
						{
							ap->bitmaps->bitmap[i] = t3f_squeeze_bitmap(bp, NULL, NULL);
							al_destroy_bitmap(bp);
						}
					}
					else if(al_get_bitmap_flags(ap->bitmaps->bitmap[i]) & ALLEGRO_MEMORY_BITMAP)
					{
						bp = t3f_squeeze_bitmap(ap->bitmaps->bitmap[i], NULL, NULL);
						al_destroy_bitmap(ap->bitmaps->bitmap[i]);
						ap->bitmaps->bitmap[i] = bp;
					}
					if(!ap->bitmaps->bitmap[i])
					{
						return NULL;
					}
				}
				ap->frames = al_fread16le(fp);
				for(i = 0; i < ap->frames; i++)
				{
					ap->frame[i] = al_malloc(sizeof(T3F_ANIMATION_FRAME));
					if(!ap->frame[i])
					{
						return NULL;
					}
					ap->frame[i]->bitmap = al_fread16le(fp);
					ap->frame[i]->x = t3f_fread_float(fp);
					ap->frame[i]->y = t3f_fread_float(fp);
					ap->frame[i]->z = t3f_fread_float(fp);
					ap->frame[i]->width = t3f_fread_float(fp);
					ap->frame[i]->height = t3f_fread_float(fp);
					ap->frame[i]->angle = t3f_fread_float(fp);
					ap->frame[i]->ticks = al_fread32le(fp);
					ap->frame[i]->flags = al_fread32le(fp);
				}
				ap->flags = al_fread32le(fp);
				break;
			}
		}
	}
	t3f_animation_build_frame_list(ap);
	return ap;
}
Пример #6
0
T3F_TILESET * t3f_load_tileset_f(ALLEGRO_FILE * fp, const char * fn)
{
	int i, j;
	T3F_TILESET * tsp;
	char header[16];

	tsp = t3f_create_tileset(0, 0);
	if(!tsp)
	{
		return NULL;
	}
	al_fread(fp, header, 16);
	if(strcmp(header, "T3F_TILESET"))
	{
		t3f_destroy_tileset(tsp);
		return NULL;
	}
	switch(header[15])
	{
		case 0:
		{
			/* read tile data */
			tsp->tiles = al_fread16le(fp);
			for(i = 0; i < tsp->tiles; i++)
			{
				tsp->tile[i] = t3f_create_tile();
				tsp->tile[i]->ap = t3f_load_animation_f(fp, fn);
				if(!tsp->tile[i]->ap)
				{
					printf("load animation failed\n");
					return NULL;
				}
				tsp->tile[i]->flags = al_fread32le(fp);

				/* read user data */
				if(tsp->tile[i]->flags & T3F_TILE_FLAG_USER_DATA)
				{
					for(j = 0; j < T3F_TILE_MAX_DATA; j++)
					{
						tsp->tile[i]->user_data[j] = al_fread32le(fp);
					}
				}

				/* read animation frames */
				tsp->tile[i]->frame_list_total = al_fread32le(fp);
				for(j = 0; j < tsp->tile[i]->frame_list_total; j++)
				{
					tsp->tile[i]->frame_list[j] = al_fread16le(fp);
				}
			}

			/* read tileset data */
			tsp->width = al_fread32le(fp);
			tsp->height = al_fread32le(fp);
			tsp->flags = al_fread32le(fp);

			break;
		}
	}
	return tsp;
}