Projects
home:Aloysius:branches:Extra
iscan
hain01commits2dip-obj.patch
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File hain01commits2dip-obj.patch of Package iscan
--- a/backend/dip-obj.c +++ b/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); + } } }
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.