Skip to content

Instantly share code, notes, and snippets.

@Markismus
Last active March 24, 2024 22:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Markismus/14e286a86fde3b6904980536e8ab9986 to your computer and use it in GitHub Desktop.
Save Markismus/14e286a86fde3b6904980536e8ab9986 to your computer and use it in GitHub Desktop.
--- backend/dip-obj.c
+++ backend/dip-obj.c
@@ -556,43 +556,72 @@
}
/*! \todo Add support for 16 bit color values (#816).
+ Added the commits of https://github.com/hean01/iscan/commit/147edc66ceddb34b5e0c8745a08ce6c96e7e02b5 and https://github.com/hean01/iscan/commit/575468d83bb70d928f5893c4c4b4ce7faa15e3d5 to support 16bit color.
*/
void
dip_apply_color_profile (const void *self, const buffer *buf,
const double profile[9])
{
SANE_Int i;
- SANE_Byte *r_buf, *g_buf, *b_buf;
double red, grn, blu;
- SANE_Byte *data;
SANE_Int size;
require (dip == self && buf && profile);
- require (8 == buf->ctx.depth);
+ require (buf->ctx.depth == 8 || buf->ctx.depth == 16);
if (SANE_FRAME_RGB != buf->ctx.format)
return;
- data = buf->ptr;
- size = buf->end - buf->ptr;
+ if (buf->ctx.depth == 8)
+ {
+ SANE_Byte *r_buf, *g_buf, *b_buf;
+ SANE_Byte *data;
- for (i = 0; i < size / 3; i++)
+ data = buf->ptr;
+ size = buf->end - buf->ptr;
+
+ for (i = 0; i < size / 3; i++)
+ {
+ r_buf = data;
+ g_buf = data + 1;
+ b_buf = data + 2;
+
+ red =
+ profile[0] * (*r_buf) + profile[1] * (*g_buf) + profile[2] * (*b_buf);
+ grn =
+ profile[3] * (*r_buf) + profile[4] * (*g_buf) + profile[5] * (*b_buf);
+ blu =
+ profile[6] * (*r_buf) + profile[7] * (*g_buf) + profile[8] * (*b_buf);
+
+ *data++ = clamp (red, 0, 255);
+ *data++ = clamp (grn, 0, 255);
+ *data++ = clamp (blu, 0, 255);
+ }
+ }
+ else if (buf->ctx.depth == 16)
{
- r_buf = data;
- g_buf = data + 1;
- b_buf = data + 2;
-
- red =
- profile[0] * (*r_buf) + profile[1] * (*g_buf) + profile[2] * (*b_buf);
- grn =
- profile[3] * (*r_buf) + profile[4] * (*g_buf) + profile[5] * (*b_buf);
- blu =
- profile[6] * (*r_buf) + profile[7] * (*g_buf) + profile[8] * (*b_buf);
-
- *data++ = clamp (red, 0, 255);
- *data++ = clamp (grn, 0, 255);
- *data++ = clamp (blu, 0, 255);
+ uint16_t *r_buf, *g_buf, *b_buf;
+ uint16_t *data;
+
+ data = (uint16_t *)buf->ptr;
+ while(data < buf->end)
+ {
+ r_buf = data;
+ g_buf = data + 1;
+ b_buf = data + 2;
+
+ red =
+ profile[0] * (*r_buf) + profile[1] * (*g_buf) + profile[2] * (*b_buf);
+ grn =
+ profile[3] * (*r_buf) + profile[4] * (*g_buf) + profile[5] * (*b_buf);
+ blu =
+ profile[6] * (*r_buf) + profile[7] * (*g_buf) + profile[8] * (*b_buf);
+
+ *data++ = clamp (red, 0, 65535);
+ *data++ = clamp (grn, 0, 65535);
+ *data++ = clamp (blu, 0, 65535);
+ }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment