Example #1
0
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);
	}