Skip to content

Commit

Permalink
Merge pull request #414 from alaroy/library-16bit-grayscale
Browse files Browse the repository at this point in the history
Added library calls to support 16 bit grayscale
  • Loading branch information
jonsneyers authored May 10, 2017
2 parents fceb7ff + 995c6e9 commit d089c70
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/library/flif-interface-private_common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ struct FLIF_IMAGE
void write_row_RGB8(uint32_t row, const void* buffer, size_t buffer_size_bytes);
void write_row_GRAY8(uint32_t row, const void* buffer, size_t buffer_size_bytes);
void read_row_GRAY8(uint32_t row, void* buffer, size_t buffer_size_bytes);
void write_row_GRAY16(uint32_t row, const void* buffer, size_t buffer_size_bytes);
void read_row_GRAY16(uint32_t row, void* buffer, size_t buffer_size_bytes);
void write_row_PALETTE8(uint32_t row, const void* buffer, size_t buffer_size_bytes);
void read_row_PALETTE8(uint32_t row, void* buffer, size_t buffer_size_bytes);

Expand Down
84 changes: 84 additions & 0 deletions src/library/flif-interface_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,31 @@ void FLIF_IMAGE::write_row_GRAY8(uint32_t row, const void * buffer, size_t buffe
}
}

void FLIF_IMAGE::write_row_GRAY16(uint32_t row, const void * buffer, size_t buffer_size_bytes)
{
if (buffer_size_bytes < image.cols() * sizeof(uint16_t))
return;

const uint16_t* buffer_gray = reinterpret_cast<const uint16_t*>(buffer);

if (image.numPlanes() >= 1) {
for (size_t c = 0; c < (size_t)image.cols(); c++) {
image.set(0, row, c, buffer_gray[c]);
}
}
if (image.numPlanes() >= 3) {
for (size_t c = 0; c < (size_t)image.cols(); c++) {
image.set(1, row, c, buffer_gray[c]);
image.set(2, row, c, buffer_gray[c]);
}
}
if (image.numPlanes() >= 4) {
for (size_t c = 0; c < (size_t)image.cols(); c++) {
image.set(3, row, c, 0xFF); // fully opaque
}
}
}

void FLIF_IMAGE::write_row_PALETTE8(uint32_t row, const void * buffer, size_t buffer_size_bytes)
{
if (buffer_size_bytes < image.cols() * sizeof(uint8_t))
Expand Down Expand Up @@ -186,6 +211,18 @@ void FLIF_IMAGE::read_row_GRAY8(uint32_t row, void* buffer, size_t buffer_size_b
}
}

void FLIF_IMAGE::read_row_GRAY16(uint32_t row, void* buffer, size_t buffer_size_bytes) {
if(buffer_size_bytes < image.cols()) return;

uint16_t* buffer_gray = reinterpret_cast<uint16_t*>(buffer);
int rshift = 0;
int mult = 1;

for (size_t c = 0; c < (size_t) image.cols(); c++) {
buffer_gray[c] = ((image(0, row, c) >> rshift) * mult);
}
}

void FLIF_IMAGE::read_row_PALETTE8(uint32_t row, void* buffer, size_t buffer_size_bytes) {
if(buffer_size_bytes < image.cols()) return;

Expand Down Expand Up @@ -305,6 +342,17 @@ FLIF_DLLEXPORT FLIF_IMAGE* FLIF_API flif_create_image_GRAY(uint32_t width, uint3
return 0;
}

FLIF_DLLEXPORT FLIF_IMAGE* FLIF_API flif_create_image_GRAY16(uint32_t width, uint32_t height) {
try
{
std::unique_ptr<FLIF_IMAGE> image(new FLIF_IMAGE());
image->image.init(width, height, 0, 65535, 1);
return image.release();
}
catch(...) {}
return 0;
}

FLIF_DLLEXPORT FLIF_IMAGE* FLIF_API flif_create_image_PALETTE(uint32_t width, uint32_t height) {
try
{
Expand Down Expand Up @@ -393,6 +441,25 @@ FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_GRAY(uint32_t width, uint3
return 0;
}

FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_GRAY16(uint32_t width, uint32_t height, const void* gray, uint32_t gray_stride) {
try
{
const int number_components = 1;
if (width == 0 || height == 0 || gray_stride < width*number_components)
return 0;
std::unique_ptr<FLIF_IMAGE> image(new FLIF_IMAGE());
image->image.init(width, height, 0, 65535, number_components);
const uint16_t* buffer = static_cast<const uint16_t*>(gray);
for (uint32_t row = 0; row < height; ++row) {
image->write_row_GRAY16(row, buffer, (width * number_components * sizeof(uint16_t)));
buffer += gray_stride;
}
return image.release();
}
catch (...) {}
return 0;
}

FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_PALETTE(uint32_t width, uint32_t height, const void* gray, uint32_t gray_stride) {
try
{
Expand Down Expand Up @@ -577,13 +644,30 @@ FLIF_DLLEXPORT void FLIF_API flif_image_write_row_GRAY8(FLIF_IMAGE* image, uint3
catch(...) {}
}

FLIF_DLLEXPORT void FLIF_API flif_image_write_row_GRAY16(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes) {
try
{
image->write_row_GRAY16(row, buffer, buffer_size_bytes);
}
catch(...) {}
}

FLIF_DLLEXPORT void FLIF_API flif_image_read_row_GRAY8(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes) {
try
{
image->read_row_GRAY8(row, buffer, buffer_size_bytes);
}
catch(...) {}
}

FLIF_DLLEXPORT void FLIF_API flif_image_read_row_GRAY16(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes) {
try
{
image->read_row_GRAY16(row, buffer, buffer_size_bytes);
}
catch(...) {}
}

FLIF_DLLEXPORT void FLIF_API flif_image_write_row_PALETTE8(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes) {
try
{
Expand Down
5 changes: 5 additions & 0 deletions src/library/flif_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,14 @@ extern "C" {
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image(uint32_t width, uint32_t height); // RGBA
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image_RGB(uint32_t width, uint32_t height);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image_GRAY(uint32_t width, uint32_t height);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image_GRAY16(uint32_t width, uint32_t height);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image_PALETTE(uint32_t width, uint32_t height);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_create_image_HDR(uint32_t width, uint32_t height);

FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_RGBA(uint32_t width, uint32_t height, const void* rgba, uint32_t rgba_stride);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_RGB(uint32_t width, uint32_t height, const void* rgb, uint32_t rgb_stride);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_GRAY(uint32_t width, uint32_t height, const void* gray, uint32_t gray_stride);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_GRAY16(uint32_t width, uint32_t height, const void* gray, uint32_t gray_stride);
FLIF_DLLIMPORT FLIF_IMAGE* FLIF_API flif_import_image_PALETTE(uint32_t width, uint32_t height, const void* gray, uint32_t gray_stride);
FLIF_DLLIMPORT void FLIF_API flif_destroy_image(FLIF_IMAGE* image);

Expand All @@ -75,6 +77,9 @@ extern "C" {
FLIF_DLLIMPORT void FLIF_API flif_image_write_row_GRAY8(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes);
FLIF_DLLIMPORT void FLIF_API flif_image_read_row_GRAY8(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes);

FLIF_DLLIMPORT void FLIF_API flif_image_write_row_GRAY16(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes);
FLIF_DLLIMPORT void FLIF_API flif_image_read_row_GRAY16(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes);

FLIF_DLLIMPORT void FLIF_API flif_image_write_row_RGBA8(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes);
FLIF_DLLIMPORT void FLIF_API flif_image_read_row_RGBA8(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes);

Expand Down

0 comments on commit d089c70

Please # to comment.