diff options
Diffstat (limited to 'src/pgm_image.cpp')
-rw-r--r-- | src/pgm_image.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/pgm_image.cpp b/src/pgm_image.cpp new file mode 100644 index 0000000..a88455c --- /dev/null +++ b/src/pgm_image.cpp @@ -0,0 +1,70 @@ +/* + * 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 <cstring> +#include <charconv> +#include <fstream> +#include <string> + +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; +} |