/* * Copyright 2022 Frederico de Oliveira Linhares * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "pgm_image.h" #include #include #include #include SDL_bool PGMImage_constructor(PGMImage *self, const char *file_path) { self->data = nullptr; int wh_pos; std::string line; std::ifstream file(file_path); if(!file) { self->error = "Failed to open PGM file"; return SDL_FALSE; } // Read file magic. std::getline(file, line); if(line != "P5") { self->error = "PGM file contains a invalid magic"; return SDL_FALSE; } // Read file comment. std::getline(file, line); // Read file width and height. std::getline(file, line); wh_pos = line.find(" "); std::from_chars(line.data(), line.data() + wh_pos, self->width); std::from_chars( line.data() + wh_pos + 1, line.data() + line.size(), self->height); // Read file maximum value. std::getline(file, line); std::from_chars(line.data(), line.data() + line.size(), self->max_value); // Read file values. self->data_size = self->width * self->height; self->data = new char[self->data_size]; file.read(self->data, self->data_size); return SDL_TRUE; } void PGMImage_destructor(PGMImage *self) { if(self->data != nullptr) delete[] self->data; }