flightgear/utils/climate/asc2a.cpp

78 lines
1.7 KiB
C++
Raw Normal View History

2022-10-20 20:29:11 +08:00
#include <iostream>
#include <fstream>
#include <sstream>
#include <climits>
#include <string>
#include "texture.hxx"
#define NCOLS 4320
#define NROWS 2160
enum STR2INT_ERROR { SUCCESS, OVERFLOW, UNDERFLOW, INCONVERTIBLE };
STR2INT_ERROR str2int (int &i, char const *s, int base = 0)
{
char *end;
long l;
errno = 0;
l = strtol(s, &end, base);
if ((errno == ERANGE && l == LONG_MAX) || l > INT_MAX) {
std::cerr << "OVERFLOW" << std::endl;
return OVERFLOW;
}
if ((errno == ERANGE && l == LONG_MIN) || l < INT_MIN) {
std::cerr << "UNDERFLOW" << std::endl;
return UNDERFLOW;
}
if (*s == '\0' || end == s) {
std::cerr << "INCONVERTIBLE: " << s << std::endl;
return INCONVERTIBLE;
}
i = l;
return SUCCESS;
}
int main(int argc, char **argv)
{
if (argc < 3) {
printf("Uage: %s <infile>.asc <outfile>.rgb\n\n", argv[0]);
exit(-1);
}
const char *infile = argv[1];
const char *outfile = argv[2];
SGTexture texture(NCOLS, NROWS);
std::ifstream file(infile);
std::string str;
texture.prepare(NCOLS, NROWS);
texture.set_colors(1);
GLuint row = 0;
unsigned int line = 0;
while (std::getline(file, str))
{
GLuint col = 0;
int num = 0;
if (++line < 7) continue;
std::istringstream iss(str);
std::string token;
while (std::getline(iss, token, ' '))
{
if (str2int(num, token.c_str(), 10) == SUCCESS)
{
GLubyte val = (num == 32) ? 0 : 4*num;
texture.set_pixel(col++, NROWS-row, &val);
}
}
row++;
}
texture.write_texture(outfile);
}