|
@@ -76,97 +76,97 @@ static void ReadHeightmapPNGImageData(by
|
|
|
|
|
|
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) {
|
|
|
*pixel = gray_palette[row_pointers[y][x_offset]];
|
|
|
} else if (info_ptr->channels == 3) {
|
|
|
*pixel = RGBToGrayscale(row_pointers[y][x_offset + 0],
|
|
|
row_pointers[y][x_offset + 1], row_pointers[y][x_offset + 2]);
|
|
|
} else {
|
|
|
*pixel = row_pointers[y][x_offset];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Reads the heightmap and/or size of the heightmap from a PNG file.
|
|
|
* If map == NULL only the size of the PNG is read, otherwise a map
|
|
|
* with grayscale pixels is allocated and assigned to *map.
|
|
|
*/
|
|
|
static bool ReadHeightmapPNG(char *filename, uint *x, uint *y, byte **map)
|
|
|
{
|
|
|
FILE *fp;
|
|
|
png_structp png_ptr = NULL;
|
|
|
png_infop info_ptr = NULL;
|
|
|
|
|
|
fp = fopen(filename, "rb");
|
|
|
if (fp == NULL) {
|
|
|
ShowErrorMessage(STR_PNGMAP_ERR_FILE_NOT_FOUND, STR_PNGMAP_ERROR, 0, 0);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
|
|
if (png_ptr == NULL) {
|
|
|
ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_PNGMAP_ERROR, 0, 0);
|
|
|
fclose(fp);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
info_ptr = png_create_info_struct(png_ptr);
|
|
|
if (info_ptr == NULL || setjmp(png_jmpbuf(png_ptr))) {
|
|
|
ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_PNGMAP_ERROR, 0, 0);
|
|
|
fclose(fp);
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
png_init_io(png_ptr, fp);
|
|
|
|
|
|
/* Allocate memory and read image, without alpha or 16-bit samples
|
|
|
* (result is either 8-bit indexed/grayscale or 24-bit RGB) */
|
|
|
* (result is either 8-bit indexed/grayscale or 24-bit RGB) */
|
|
|
png_set_packing(png_ptr);
|
|
|
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_PACKING | PNG_TRANSFORM_STRIP_ALPHA | PNG_TRANSFORM_STRIP_16, NULL);
|
|
|
|
|
|
/* Maps of wrong color-depth are not used.
|
|
|
* (this should have been taken care of by stripping alpha and 16-bit samples on load) */
|
|
|
if ((info_ptr->channels != 1) && (info_ptr->channels != 3) && (info_ptr->bit_depth != 8)) {
|
|
|
ShowErrorMessage(STR_PNGMAP_ERR_IMAGE_TYPE, STR_PNGMAP_ERROR, 0, 0);
|
|
|
fclose(fp);
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (map != NULL) {
|
|
|
*map = malloc(info_ptr->width * info_ptr->height * sizeof(byte));
|
|
|
|
|
|
if (*map == NULL) {
|
|
|
ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_PNGMAP_ERROR, 0, 0);
|
|
|
fclose(fp);
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
ReadHeightmapPNGImageData(*map, png_ptr, info_ptr);
|
|
|
}
|
|
|
|
|
|
*x = info_ptr->width;
|
|
|
*y = info_ptr->height;
|
|
|
|
|
|
fclose(fp);
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
#endif /* WITH_PNG */
|
|
|
|
|
|
|
|
|
/**
|
|
|
* The BMP Heightmap loader.
|
|
|
*/
|
|
|
static void ReadHeightmapBMPImageData(byte *map, BmpInfo *info, BmpData *data)
|
|
|
{
|
|
|
uint x, y;
|
|
|
byte gray_palette[256];
|
|
|
|
|
|
if (data->palette != NULL) {
|
|
|
uint i;
|
|
|
bool all_gray = true;
|
|
|
|