パレット付き PNG ファイルを作る方法

StarRuby は読み込み専用で動的に作ることが出来ないらしい....
キャラクタROMのデータをパレット付きに変換するというのはあまりないみたい実例みたいで、それを満たすようなライブラリはなかった。

というわけで libpng を使った C プログラムを書く。(struct png_work はお察し下さい)

void png_save(struct png_work *s, const char *filename)
{
	FILE *fp = fopen(filename, "wb");
	png_struct *png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	png_info *info = png_create_info_struct(png);

	png_init_io(png, fp);

	png_set_compression_level(png, Z_BEST_COMPRESSION);
	png_set_IHDR(
		png, info, s->width, s->height,
		s->bpp, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
		PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT
	);

	png_set_tRNS(png, info, &s->transport_color, 1, NULL);
	png_set_PLTE(png, info, s->palette, 1 << s->bpp);

	png_write_info(png, info);
	png_set_packing(png);
	png_write_image(png, s->image);
	png_write_end(png, info);
	png_destroy_write_struct(&png, &info);
	fclose(fp);
	
}

s->image はライン毎のポインタ配列であること、そのポインタの中は bpp が 4 なら 0 から 0xf のデータを入れればいいぐらい。png_byte *nanka とかかればわかるものの、png_bytep nanka とかいてポインタ配列に渡すと訳がわからなくなった。慣れというか、自分の経験値が足りない気がした。