Model* ModelInitPNG(const char* path) { Model* model = calloc(1, sizeof(Model)); glEnable(GL_TEXTURE_2D); GLuint t_id; glGenTextures(1, &t_id); FILE* file = fopen(path, "rb"); int size = fseek(file, 0, SEEK_END); fseek(file, 0, SEEK_SET); glBindTexture(GL_TEXTURE_2D, t_id); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); unsigned long w, h; unsigned char c, b; unsigned char* data = PNGReader(file, size, &w, &h, &c, &b); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); free(data); Vector3D* vec = calloc(4, sizeof(Vector3D)); vec[1].x = (float)w; vec[2].y = (float)h; vec[3].x = (float)w; vec[3].y = (float)h; Vector2D* tex = calloc(4, sizeof(Vector2D)); tex[1].x = 1.0; tex[2].y = 1.0; tex[3].x = 1.0; tex[3].y = 1.0; ModelInitWithVertex(model, 4, vec, NULL, tex, 0, NULL, t_id); return model; }
TEST_F(PNGReaderTest, ReadFile) { static constexpr unsigned int VALID_WIDTH = 2; static constexpr unsigned int VALID_HEIGHT = 2; static constexpr Color VALID_COLORS[VALID_HEIGHT][VALID_WIDTH] = {{Color::red(), Color::yellow()}, {Color::green(), Color::blue()}}; ScopedTempDir temp_dir; const std::string valid_path = temp_dir.path() / "valid.png"; write_to_file(valid_path, png_data()); Image image = PNGReader().read_file(valid_path); ASSERT_EQ(VALID_WIDTH, image.width()); ASSERT_EQ(VALID_HEIGHT, image.height()); for (unsigned int y = 0; y < VALID_HEIGHT; y++) { for (unsigned int x = 0; x < VALID_WIDTH; x++) { Color valid_color = VALID_COLORS[y][x]; Color color = image.read_pixel(x, y); EXPECT_NEAR(valid_color.r(), color.r(), 1e-100); EXPECT_NEAR(valid_color.g(), color.g(), 1e-100); EXPECT_NEAR(valid_color.b(), color.b(), 1e-100); } } const std::string corrupt_path = temp_dir.path() / "corrupt.png"; write_to_file(corrupt_path, corrupt_png_data()); EXPECT_THROW(PNGReader().read_file(corrupt_path), PNGReader::Exception); const std::string short_path = temp_dir.path() / "short.png"; write_to_file(short_path, short_png_data()); EXPECT_THROW(PNGReader().read_file(short_path), PNGReader::Exception); EXPECT_THROW(PNGReader().read_file(temp_dir.path() / "does_not_exist.png"), PNGReader::Exception); }