X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Ftest.cc;h=9261ce43ba0e0515fa4e57dd3e29fc5ce28eb7f3;hb=8e4f083438e2a6234da96f63fcceadafd5a8bd03;hp=fd9c6941be30e4aac818a3debf3f2b6706df865b;hpb=2c43d6e1068704cc4f4d6383217ed9a1a07bb67d;p=dcpomatic.git diff --git a/test/test.cc b/test/test.cc index fd9c6941b..9261ce43b 100644 --- a/test/test.cc +++ b/test/test.cc @@ -715,15 +715,13 @@ png_error_fn (png_structp, char const * message) void write_image (shared_ptr image, boost::filesystem::path file) { - int png_color_type = 0; + int png_color_type = PNG_COLOR_TYPE_RGB; int bits_per_pixel = 0; switch (image->pixel_format()) { case AV_PIX_FMT_RGB24: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 8; break; case AV_PIX_FMT_XYZ12LE: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 16; break; default: @@ -743,9 +741,40 @@ write_image (shared_ptr image, boost::filesystem::path file) png_set_IHDR (png_ptr, info_ptr, image->size().width, image->size().height, bits_per_pixel, png_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); - for (int i = 0; i < image->size().height; ++i) { - row_pointers[i] = (png_byte *) (image->data()[0] + i * image->stride()[0]); + auto const width = image->size().width; + auto const height = image->size().height; + auto const stride = image->stride()[0]; + + vector> data_to_write(height); + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + } + + switch (image->pixel_format()) { + case AV_PIX_FMT_RGB24: + for (int y = 0; y < height; ++y) { + memcpy(data_to_write[y].data(), image->data()[0] + y * stride, stride); + } + break; + case AV_PIX_FMT_XYZ12LE: + /* 16-bit pixel values must be written MSB first */ + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + uint8_t* original = image->data()[0] + y * stride; + for (int x = 0; x < width * 3; ++x) { + data_to_write[y][x * 2] = original[1]; + data_to_write[y][x * 2 + 1] = original[0]; + original += 2; + } + } + break; + default: + break; + } + + png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); + for (int y = 0; y < height; ++y) { + row_pointers[y] = reinterpret_cast(data_to_write[y].data()); } png_write_info (png_ptr, info_ptr);