1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy. 2141cc406Sopenharmony_ci Copyright (C) 2002 Henning Meier-Geinitz <henning@meier-geinitz.de> 3141cc406Sopenharmony_ci This file is part of the SANE package. 4141cc406Sopenharmony_ci 5141cc406Sopenharmony_ci This program is free software; you can redistribute it and/or 6141cc406Sopenharmony_ci modify it under the terms of the GNU General Public License as 7141cc406Sopenharmony_ci published by the Free Software Foundation; either version 2 of the 8141cc406Sopenharmony_ci License, or (at your option) any later version. 9141cc406Sopenharmony_ci 10141cc406Sopenharmony_ci This program is distributed in the hope that it will be useful, but 11141cc406Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 12141cc406Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13141cc406Sopenharmony_ci General Public License for more details. 14141cc406Sopenharmony_ci 15141cc406Sopenharmony_ci You should have received a copy of the GNU General Public License 16141cc406Sopenharmony_ci along with this program. If not, see <https://www.gnu.org/licenses/>. 17141cc406Sopenharmony_ci 18141cc406Sopenharmony_ci As a special exception, the authors of SANE give permission for 19141cc406Sopenharmony_ci additional uses of the libraries contained in this release of SANE. 20141cc406Sopenharmony_ci 21141cc406Sopenharmony_ci The exception is that, if you link a SANE library with other files 22141cc406Sopenharmony_ci to produce an executable, this does not by itself cause the 23141cc406Sopenharmony_ci resulting executable to be covered by the GNU General Public 24141cc406Sopenharmony_ci License. Your use of that executable is in no way restricted on 25141cc406Sopenharmony_ci account of linking the SANE library code into it. 26141cc406Sopenharmony_ci 27141cc406Sopenharmony_ci This exception does not, however, invalidate any other reasons why 28141cc406Sopenharmony_ci the executable file might be covered by the GNU General Public 29141cc406Sopenharmony_ci License. 30141cc406Sopenharmony_ci 31141cc406Sopenharmony_ci If you submit changes to SANE to the maintainers to be included in 32141cc406Sopenharmony_ci a subsequent release, you agree by submitting the changes that 33141cc406Sopenharmony_ci those changes may be distributed with this exception intact. 34141cc406Sopenharmony_ci 35141cc406Sopenharmony_ci If you write modifications of your own for SANE, it is your choice 36141cc406Sopenharmony_ci whether to permit this exception to apply to your modifications. 37141cc406Sopenharmony_ci If you do not wish that, delete this exception notice. 38141cc406Sopenharmony_ci 39141cc406Sopenharmony_ci This file implements test picture functions for the test backend. 40141cc406Sopenharmony_ci*/ 41141cc406Sopenharmony_ci 42141cc406Sopenharmony_ci#define BUFFER_SIZE (64 * 1024) 43141cc406Sopenharmony_ci 44141cc406Sopenharmony_cistatic SANE_Bool little_endian (void); 45141cc406Sopenharmony_ci 46141cc406Sopenharmony_cistatic SANE_Status 47141cc406Sopenharmony_ciinit_picture_buffer (Test_Device * test_device, SANE_Byte ** buffer, 48141cc406Sopenharmony_ci size_t * buffer_size) 49141cc406Sopenharmony_ci{ 50141cc406Sopenharmony_ci SANE_Word pattern_size = 0, pattern_distance = 0; 51141cc406Sopenharmony_ci SANE_Word line_count; 52141cc406Sopenharmony_ci size_t b_size; 53141cc406Sopenharmony_ci SANE_Word lines = 0; 54141cc406Sopenharmony_ci SANE_Word bpl = test_device->bytes_per_line; 55141cc406Sopenharmony_ci SANE_Word ppl = test_device->pixels_per_line; 56141cc406Sopenharmony_ci SANE_Byte *b; 57141cc406Sopenharmony_ci SANE_Bool is_little_endian = little_endian (); 58141cc406Sopenharmony_ci 59141cc406Sopenharmony_ci if (test_device->val[opt_invert_endianess].w) 60141cc406Sopenharmony_ci is_little_endian ^= 1; 61141cc406Sopenharmony_ci 62141cc406Sopenharmony_ci DBG (2, "(child) init_picture_buffer test_device=%p, buffer=%p, " 63141cc406Sopenharmony_ci "buffer_size=%p\n",(void*)test_device,(void*)buffer,(void*)buffer_size); 64141cc406Sopenharmony_ci 65141cc406Sopenharmony_ci if (strcmp (test_device->val[opt_test_picture].s, "Solid black") == 0 66141cc406Sopenharmony_ci || strcmp (test_device->val[opt_test_picture].s, "Solid white") == 0) 67141cc406Sopenharmony_ci { 68141cc406Sopenharmony_ci SANE_Byte pattern = 0; 69141cc406Sopenharmony_ci 70141cc406Sopenharmony_ci b_size = BUFFER_SIZE; 71141cc406Sopenharmony_ci if (buffer_size) 72141cc406Sopenharmony_ci *buffer_size = b_size; 73141cc406Sopenharmony_ci 74141cc406Sopenharmony_ci b = malloc (b_size); 75141cc406Sopenharmony_ci if (!b) 76141cc406Sopenharmony_ci { 77141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 78141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 79141cc406Sopenharmony_ci } 80141cc406Sopenharmony_ci 81141cc406Sopenharmony_ci if (buffer) 82141cc406Sopenharmony_ci *buffer = b; 83141cc406Sopenharmony_ci 84141cc406Sopenharmony_ci if (strcmp (test_device->val[opt_test_picture].s, "Solid black") == 0) 85141cc406Sopenharmony_ci { 86141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing solid black test " 87141cc406Sopenharmony_ci "picture %zu bytes\n", b_size); 88141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_GRAY 89141cc406Sopenharmony_ci && test_device->params.depth == 1) 90141cc406Sopenharmony_ci pattern = 0xff; 91141cc406Sopenharmony_ci else 92141cc406Sopenharmony_ci pattern = 0x00; 93141cc406Sopenharmony_ci } 94141cc406Sopenharmony_ci else 95141cc406Sopenharmony_ci { 96141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing solid white test " 97141cc406Sopenharmony_ci "picture %zu bytes\n", b_size); 98141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_GRAY 99141cc406Sopenharmony_ci && test_device->params.depth == 1) 100141cc406Sopenharmony_ci pattern = 0x00; 101141cc406Sopenharmony_ci else 102141cc406Sopenharmony_ci pattern = 0xff; 103141cc406Sopenharmony_ci } 104141cc406Sopenharmony_ci memset (b, pattern, b_size); 105141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 106141cc406Sopenharmony_ci } 107141cc406Sopenharmony_ci 108141cc406Sopenharmony_ci /* Grid */ 109141cc406Sopenharmony_ci if (strcmp (test_device->val[opt_test_picture].s, "Grid") == 0) 110141cc406Sopenharmony_ci { 111141cc406Sopenharmony_ci double p_size = (10.0 * SANE_UNFIX (test_device->val[opt_resolution].w) 112141cc406Sopenharmony_ci / MM_PER_INCH); 113141cc406Sopenharmony_ci SANE_Word increment = 1; 114141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_RGB) 115141cc406Sopenharmony_ci increment *= 3; 116141cc406Sopenharmony_ci if (test_device->params.depth == 16) 117141cc406Sopenharmony_ci increment *= 2; 118141cc406Sopenharmony_ci 119141cc406Sopenharmony_ci lines = (SANE_Word) (2 * p_size + 0.5); 120141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 121141cc406Sopenharmony_ci if (buffer_size) 122141cc406Sopenharmony_ci *buffer_size = b_size; 123141cc406Sopenharmony_ci b = malloc (b_size); 124141cc406Sopenharmony_ci if (!b) 125141cc406Sopenharmony_ci { 126141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 127141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 128141cc406Sopenharmony_ci } 129141cc406Sopenharmony_ci if (buffer) 130141cc406Sopenharmony_ci *buffer = b; 131141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing grid test picture " 132141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d ppl, %d lines\n", b_size, bpl, ppl, lines); 133141cc406Sopenharmony_ci 134141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 135141cc406Sopenharmony_ci { 136141cc406Sopenharmony_ci SANE_Word x = 0; 137141cc406Sopenharmony_ci 138141cc406Sopenharmony_ci for (x = 0; x < bpl; x += increment) 139141cc406Sopenharmony_ci { 140141cc406Sopenharmony_ci SANE_Word x1; 141141cc406Sopenharmony_ci SANE_Byte color = 0; 142141cc406Sopenharmony_ci 143141cc406Sopenharmony_ci if (test_device->params.depth == 1) 144141cc406Sopenharmony_ci { 145141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_GRAY || 146141cc406Sopenharmony_ci (test_device->params.format >= SANE_FRAME_RED && 147141cc406Sopenharmony_ci test_device->params.format <= SANE_FRAME_BLUE)) 148141cc406Sopenharmony_ci { 149141cc406Sopenharmony_ci SANE_Byte value = 0; 150141cc406Sopenharmony_ci for (x1 = 0; x1 < 8; x1++) 151141cc406Sopenharmony_ci { 152141cc406Sopenharmony_ci SANE_Word xfull = x * 8 + (7 - x1); 153141cc406Sopenharmony_ci 154141cc406Sopenharmony_ci if (xfull < ppl) 155141cc406Sopenharmony_ci { 156141cc406Sopenharmony_ci if ((((SANE_Word) (xfull / p_size)) % 2) 157141cc406Sopenharmony_ci ^ (!(line_count > 158141cc406Sopenharmony_ci (SANE_Word) (p_size + 0.5)))) 159141cc406Sopenharmony_ci color = 0x0; 160141cc406Sopenharmony_ci else 161141cc406Sopenharmony_ci color = 0x1; 162141cc406Sopenharmony_ci } 163141cc406Sopenharmony_ci else 164141cc406Sopenharmony_ci color = (rand ()) & 0x01; 165141cc406Sopenharmony_ci value |= (SANE_Byte) (color << x1); 166141cc406Sopenharmony_ci } 167141cc406Sopenharmony_ci b[line_count * bpl + x] = value; 168141cc406Sopenharmony_ci } 169141cc406Sopenharmony_ci else /* SANE_FRAME_RGB */ 170141cc406Sopenharmony_ci { 171141cc406Sopenharmony_ci SANE_Byte value = 0; 172141cc406Sopenharmony_ci for (x1 = 0; x1 < 8; x1++) 173141cc406Sopenharmony_ci { 174141cc406Sopenharmony_ci SANE_Word xfull = x * 8 / 3 + (7 - x1); 175141cc406Sopenharmony_ci 176141cc406Sopenharmony_ci if (xfull < ppl) 177141cc406Sopenharmony_ci { 178141cc406Sopenharmony_ci if (((SANE_Word) (xfull / p_size) % 2) 179141cc406Sopenharmony_ci ^ (line_count > (SANE_Word) (p_size + 0.5))) 180141cc406Sopenharmony_ci color = 0x0; 181141cc406Sopenharmony_ci else 182141cc406Sopenharmony_ci color = 0x1; 183141cc406Sopenharmony_ci } 184141cc406Sopenharmony_ci else 185141cc406Sopenharmony_ci color = (rand ()) & 0x01; 186141cc406Sopenharmony_ci value |= (SANE_Byte) (color << x1); 187141cc406Sopenharmony_ci } 188141cc406Sopenharmony_ci for (x1 = 0; x1 < increment; x1++) 189141cc406Sopenharmony_ci b[line_count * bpl + x + x1] = value; 190141cc406Sopenharmony_ci } 191141cc406Sopenharmony_ci } 192141cc406Sopenharmony_ci else /* depth = 8, 16 */ 193141cc406Sopenharmony_ci { 194141cc406Sopenharmony_ci if (x / increment < ppl) 195141cc406Sopenharmony_ci if ((((SANE_Int) (x / increment / p_size)) % 2) 196141cc406Sopenharmony_ci ^ (line_count > (SANE_Int) (p_size + 0.5))) 197141cc406Sopenharmony_ci color = 0x00; 198141cc406Sopenharmony_ci else 199141cc406Sopenharmony_ci color = 0xff; 200141cc406Sopenharmony_ci else 201141cc406Sopenharmony_ci color = (SANE_Byte) ((rand ()) & 0xff); 202141cc406Sopenharmony_ci 203141cc406Sopenharmony_ci for (x1 = 0; x1 < increment; x1++) 204141cc406Sopenharmony_ci b[line_count * bpl + x + x1] = color; 205141cc406Sopenharmony_ci } 206141cc406Sopenharmony_ci } 207141cc406Sopenharmony_ci } 208141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 209141cc406Sopenharmony_ci } 210141cc406Sopenharmony_ci 211141cc406Sopenharmony_ci /* Color patterns */ 212141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_GRAY 213141cc406Sopenharmony_ci && test_device->params.depth == 1) 214141cc406Sopenharmony_ci { 215141cc406Sopenharmony_ci /* 1 bit black/white */ 216141cc406Sopenharmony_ci pattern_size = 16; 217141cc406Sopenharmony_ci pattern_distance = 0; 218141cc406Sopenharmony_ci lines = 2 * (pattern_size + pattern_distance); 219141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 220141cc406Sopenharmony_ci 221141cc406Sopenharmony_ci if (buffer_size) 222141cc406Sopenharmony_ci *buffer_size = b_size; 223141cc406Sopenharmony_ci b = malloc (b_size); 224141cc406Sopenharmony_ci if (!b) 225141cc406Sopenharmony_ci { 226141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 227141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 228141cc406Sopenharmony_ci } 229141cc406Sopenharmony_ci if (buffer) 230141cc406Sopenharmony_ci *buffer = b; 231141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing b/w test picture " 232141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 233141cc406Sopenharmony_ci memset (b, 255, b_size); 234141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 235141cc406Sopenharmony_ci { 236141cc406Sopenharmony_ci SANE_Word x = 0; 237141cc406Sopenharmony_ci 238141cc406Sopenharmony_ci if (line_count >= lines / 2) 239141cc406Sopenharmony_ci x += (pattern_size + pattern_distance) / 8; 240141cc406Sopenharmony_ci 241141cc406Sopenharmony_ci while (x < bpl) 242141cc406Sopenharmony_ci { 243141cc406Sopenharmony_ci SANE_Word width; 244141cc406Sopenharmony_ci 245141cc406Sopenharmony_ci width = pattern_size / 8; 246141cc406Sopenharmony_ci if (x + width >= bpl) 247141cc406Sopenharmony_ci width = bpl - x; 248141cc406Sopenharmony_ci memset (b + line_count * bpl + x, 0x00, (size_t) width); 249141cc406Sopenharmony_ci x += (pattern_size + pattern_distance) * 2 / 8; 250141cc406Sopenharmony_ci } 251141cc406Sopenharmony_ci } 252141cc406Sopenharmony_ci } 253141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_GRAY 254141cc406Sopenharmony_ci && test_device->params.depth == 8) 255141cc406Sopenharmony_ci { 256141cc406Sopenharmony_ci /* 8 bit gray */ 257141cc406Sopenharmony_ci pattern_size = 4; 258141cc406Sopenharmony_ci pattern_distance = 1; 259141cc406Sopenharmony_ci lines = 2 * (pattern_size + pattern_distance); 260141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 261141cc406Sopenharmony_ci 262141cc406Sopenharmony_ci if (buffer_size) 263141cc406Sopenharmony_ci *buffer_size = b_size; 264141cc406Sopenharmony_ci b = malloc (b_size); 265141cc406Sopenharmony_ci if (!b) 266141cc406Sopenharmony_ci { 267141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 268141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 269141cc406Sopenharmony_ci } 270141cc406Sopenharmony_ci if (buffer) 271141cc406Sopenharmony_ci *buffer = b; 272141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing 8 bit gray test picture " 273141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 274141cc406Sopenharmony_ci memset (b, 0x55, b_size); 275141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 276141cc406Sopenharmony_ci { 277141cc406Sopenharmony_ci SANE_Word x = pattern_distance; 278141cc406Sopenharmony_ci 279141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 280141cc406Sopenharmony_ci < pattern_distance) 281141cc406Sopenharmony_ci continue; 282141cc406Sopenharmony_ci 283141cc406Sopenharmony_ci while (x < bpl) 284141cc406Sopenharmony_ci { 285141cc406Sopenharmony_ci SANE_Word width; 286141cc406Sopenharmony_ci SANE_Byte color; 287141cc406Sopenharmony_ci 288141cc406Sopenharmony_ci width = pattern_size; 289141cc406Sopenharmony_ci if (x + width >= bpl) 290141cc406Sopenharmony_ci width = bpl - x; 291141cc406Sopenharmony_ci if (line_count > (pattern_size + pattern_distance)) 292141cc406Sopenharmony_ci color = 293141cc406Sopenharmony_ci (SANE_Byte) (0xff - ((x / (pattern_size + pattern_distance)) & 0xff)); 294141cc406Sopenharmony_ci else 295141cc406Sopenharmony_ci color = (SANE_Byte) ((x / (pattern_size + pattern_distance)) & 0xff); 296141cc406Sopenharmony_ci memset (b + line_count * bpl + x, color, (size_t) width); 297141cc406Sopenharmony_ci x += (pattern_size + pattern_distance); 298141cc406Sopenharmony_ci } 299141cc406Sopenharmony_ci } 300141cc406Sopenharmony_ci 301141cc406Sopenharmony_ci } 302141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_GRAY 303141cc406Sopenharmony_ci && test_device->params.depth == 16) 304141cc406Sopenharmony_ci { 305141cc406Sopenharmony_ci /* 16 bit gray */ 306141cc406Sopenharmony_ci pattern_size = 256; 307141cc406Sopenharmony_ci pattern_distance = 4; 308141cc406Sopenharmony_ci lines = 1 * (pattern_size + pattern_distance); 309141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 310141cc406Sopenharmony_ci 311141cc406Sopenharmony_ci if (buffer_size) 312141cc406Sopenharmony_ci *buffer_size = b_size; 313141cc406Sopenharmony_ci b = malloc (b_size); 314141cc406Sopenharmony_ci if (!b) 315141cc406Sopenharmony_ci { 316141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 317141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 318141cc406Sopenharmony_ci } 319141cc406Sopenharmony_ci if (buffer) 320141cc406Sopenharmony_ci *buffer = b; 321141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing 16 bit gray test picture " 322141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 323141cc406Sopenharmony_ci memset (b, 0x55, b_size); 324141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 325141cc406Sopenharmony_ci { 326141cc406Sopenharmony_ci SANE_Word x = pattern_distance * 2; 327141cc406Sopenharmony_ci 328141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 329141cc406Sopenharmony_ci < pattern_distance) 330141cc406Sopenharmony_ci continue; 331141cc406Sopenharmony_ci 332141cc406Sopenharmony_ci while (x < bpl) 333141cc406Sopenharmony_ci { 334141cc406Sopenharmony_ci SANE_Word width; 335141cc406Sopenharmony_ci SANE_Word x1; 336141cc406Sopenharmony_ci SANE_Byte pattern_lo, pattern_hi; 337141cc406Sopenharmony_ci 338141cc406Sopenharmony_ci width = pattern_size * 2; 339141cc406Sopenharmony_ci if (x + width >= bpl) 340141cc406Sopenharmony_ci width = bpl - x; 341141cc406Sopenharmony_ci pattern_lo = 342141cc406Sopenharmony_ci (SANE_Byte) (((line_count - pattern_distance) 343141cc406Sopenharmony_ci % (pattern_size + pattern_distance)) & 0xff); 344141cc406Sopenharmony_ci for (x1 = 0; x1 < width; x1 += 2) 345141cc406Sopenharmony_ci { 346141cc406Sopenharmony_ci pattern_hi = (SANE_Byte) ((x1 / 2) & 0xff); 347141cc406Sopenharmony_ci if (is_little_endian) 348141cc406Sopenharmony_ci { 349141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = pattern_lo; 350141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = pattern_hi; 351141cc406Sopenharmony_ci } 352141cc406Sopenharmony_ci else 353141cc406Sopenharmony_ci { 354141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = pattern_hi; 355141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = pattern_lo; 356141cc406Sopenharmony_ci } 357141cc406Sopenharmony_ci } 358141cc406Sopenharmony_ci x += ((pattern_size + pattern_distance) * 2); 359141cc406Sopenharmony_ci } 360141cc406Sopenharmony_ci } 361141cc406Sopenharmony_ci 362141cc406Sopenharmony_ci } 363141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_RGB 364141cc406Sopenharmony_ci && test_device->params.depth == 1) 365141cc406Sopenharmony_ci { 366141cc406Sopenharmony_ci /* 1 bit color */ 367141cc406Sopenharmony_ci pattern_size = 16; 368141cc406Sopenharmony_ci pattern_distance = 0; 369141cc406Sopenharmony_ci lines = 2 * (pattern_size + pattern_distance); 370141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 371141cc406Sopenharmony_ci 372141cc406Sopenharmony_ci if (buffer_size) 373141cc406Sopenharmony_ci *buffer_size = b_size; 374141cc406Sopenharmony_ci b = malloc (b_size); 375141cc406Sopenharmony_ci if (!b) 376141cc406Sopenharmony_ci { 377141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 378141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 379141cc406Sopenharmony_ci } 380141cc406Sopenharmony_ci if (buffer) 381141cc406Sopenharmony_ci *buffer = b; 382141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing color lineart test " 383141cc406Sopenharmony_ci "picture %zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 384141cc406Sopenharmony_ci memset (b, 0x55, b_size); 385141cc406Sopenharmony_ci 386141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 387141cc406Sopenharmony_ci { 388141cc406Sopenharmony_ci SANE_Word x = 0; 389141cc406Sopenharmony_ci SANE_Byte color = 0, color_r = 0, color_g = 0, color_b = 0; 390141cc406Sopenharmony_ci 391141cc406Sopenharmony_ci if (line_count >= lines / 2) 392141cc406Sopenharmony_ci color = 7; 393141cc406Sopenharmony_ci while (x < bpl) 394141cc406Sopenharmony_ci { 395141cc406Sopenharmony_ci SANE_Word width; 396141cc406Sopenharmony_ci SANE_Word x2 = 0; 397141cc406Sopenharmony_ci 398141cc406Sopenharmony_ci width = pattern_size / 8 * 3; 399141cc406Sopenharmony_ci if (x + width >= bpl) 400141cc406Sopenharmony_ci width = bpl - x; 401141cc406Sopenharmony_ci 402141cc406Sopenharmony_ci color_b = (color & 1) * 0xff; 403141cc406Sopenharmony_ci color_g = ((color >> 1) & 1) * 0xff; 404141cc406Sopenharmony_ci color_r = ((color >> 2) & 1) * 0xff; 405141cc406Sopenharmony_ci 406141cc406Sopenharmony_ci for (x2 = 0; x2 < width; x2 += 3) 407141cc406Sopenharmony_ci { 408141cc406Sopenharmony_ci b[line_count * bpl + x + x2 + 0] = color_r; 409141cc406Sopenharmony_ci b[line_count * bpl + x + x2 + 1] = color_g; 410141cc406Sopenharmony_ci b[line_count * bpl + x + x2 + 2] = color_b; 411141cc406Sopenharmony_ci } 412141cc406Sopenharmony_ci if (line_count < lines / 2) 413141cc406Sopenharmony_ci { 414141cc406Sopenharmony_ci ++color; 415141cc406Sopenharmony_ci if (color >= 8) 416141cc406Sopenharmony_ci color = 0; 417141cc406Sopenharmony_ci } 418141cc406Sopenharmony_ci else 419141cc406Sopenharmony_ci { 420141cc406Sopenharmony_ci if (color == 0) 421141cc406Sopenharmony_ci color = 8; 422141cc406Sopenharmony_ci --color; 423141cc406Sopenharmony_ci } 424141cc406Sopenharmony_ci x += ((pattern_size + pattern_distance) / 8 * 3); 425141cc406Sopenharmony_ci } 426141cc406Sopenharmony_ci } 427141cc406Sopenharmony_ci } 428141cc406Sopenharmony_ci else if ((test_device->params.format == SANE_FRAME_RED 429141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_GREEN 430141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_BLUE) 431141cc406Sopenharmony_ci && test_device->params.depth == 1) 432141cc406Sopenharmony_ci { 433141cc406Sopenharmony_ci /* 1 bit color three-pass */ 434141cc406Sopenharmony_ci pattern_size = 16; 435141cc406Sopenharmony_ci pattern_distance = 0; 436141cc406Sopenharmony_ci lines = 2 * (pattern_size + pattern_distance); 437141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 438141cc406Sopenharmony_ci 439141cc406Sopenharmony_ci if (buffer_size) 440141cc406Sopenharmony_ci *buffer_size = b_size; 441141cc406Sopenharmony_ci b = malloc (b_size); 442141cc406Sopenharmony_ci if (!b) 443141cc406Sopenharmony_ci { 444141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 445141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 446141cc406Sopenharmony_ci } 447141cc406Sopenharmony_ci if (buffer) 448141cc406Sopenharmony_ci *buffer = b; 449141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing color lineart three-pass " 450141cc406Sopenharmony_ci "test picture %zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 451141cc406Sopenharmony_ci memset (b, 0x55, b_size); 452141cc406Sopenharmony_ci 453141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 454141cc406Sopenharmony_ci { 455141cc406Sopenharmony_ci SANE_Word x = 0; 456141cc406Sopenharmony_ci SANE_Byte color = 0, color_r = 0, color_g = 0, color_b = 0; 457141cc406Sopenharmony_ci 458141cc406Sopenharmony_ci if (line_count >= lines / 2) 459141cc406Sopenharmony_ci color = 7; 460141cc406Sopenharmony_ci while (x < bpl) 461141cc406Sopenharmony_ci { 462141cc406Sopenharmony_ci SANE_Word width; 463141cc406Sopenharmony_ci SANE_Word x2 = 0; 464141cc406Sopenharmony_ci 465141cc406Sopenharmony_ci width = pattern_size / 8; 466141cc406Sopenharmony_ci if (x + width >= bpl) 467141cc406Sopenharmony_ci width = bpl - x; 468141cc406Sopenharmony_ci 469141cc406Sopenharmony_ci color_b = (color & 1) * 0xff; 470141cc406Sopenharmony_ci color_g = ((color >> 1) & 1) * 0xff; 471141cc406Sopenharmony_ci color_r = ((color >> 2) & 1) * 0xff; 472141cc406Sopenharmony_ci 473141cc406Sopenharmony_ci for (x2 = 0; x2 < width; x2++) 474141cc406Sopenharmony_ci { 475141cc406Sopenharmony_ci if (test_device->params.format == SANE_FRAME_RED) 476141cc406Sopenharmony_ci b[line_count * bpl + x + x2] = color_r; 477141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_GREEN) 478141cc406Sopenharmony_ci b[line_count * bpl + x + x2] = color_g; 479141cc406Sopenharmony_ci else 480141cc406Sopenharmony_ci b[line_count * bpl + x + x2] = color_b; 481141cc406Sopenharmony_ci } 482141cc406Sopenharmony_ci if (line_count < lines / 2) 483141cc406Sopenharmony_ci { 484141cc406Sopenharmony_ci ++color; 485141cc406Sopenharmony_ci if (color >= 8) 486141cc406Sopenharmony_ci color = 0; 487141cc406Sopenharmony_ci } 488141cc406Sopenharmony_ci else 489141cc406Sopenharmony_ci { 490141cc406Sopenharmony_ci if (color == 0) 491141cc406Sopenharmony_ci color = 8; 492141cc406Sopenharmony_ci --color; 493141cc406Sopenharmony_ci } 494141cc406Sopenharmony_ci x += (pattern_size + pattern_distance) / 8; 495141cc406Sopenharmony_ci } 496141cc406Sopenharmony_ci } 497141cc406Sopenharmony_ci } 498141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_RGB 499141cc406Sopenharmony_ci && test_device->params.depth == 8) 500141cc406Sopenharmony_ci { 501141cc406Sopenharmony_ci /* 8 bit color */ 502141cc406Sopenharmony_ci pattern_size = 4; 503141cc406Sopenharmony_ci pattern_distance = 1; 504141cc406Sopenharmony_ci lines = 6 * (pattern_size + pattern_distance); 505141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 506141cc406Sopenharmony_ci 507141cc406Sopenharmony_ci if (buffer_size) 508141cc406Sopenharmony_ci *buffer_size = b_size; 509141cc406Sopenharmony_ci b = malloc (b_size); 510141cc406Sopenharmony_ci if (!b) 511141cc406Sopenharmony_ci { 512141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 513141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 514141cc406Sopenharmony_ci } 515141cc406Sopenharmony_ci if (buffer) 516141cc406Sopenharmony_ci *buffer = b; 517141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing 8 bit color test picture " 518141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 519141cc406Sopenharmony_ci memset (b, 0x55, b_size); 520141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 521141cc406Sopenharmony_ci { 522141cc406Sopenharmony_ci SANE_Word x = pattern_distance * 3; 523141cc406Sopenharmony_ci 524141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 525141cc406Sopenharmony_ci < pattern_distance) 526141cc406Sopenharmony_ci continue; 527141cc406Sopenharmony_ci 528141cc406Sopenharmony_ci while (x < bpl) 529141cc406Sopenharmony_ci { 530141cc406Sopenharmony_ci SANE_Word width; 531141cc406Sopenharmony_ci SANE_Byte color = 0, color_r = 0, color_g = 0, color_b = 0; 532141cc406Sopenharmony_ci SANE_Word x1; 533141cc406Sopenharmony_ci 534141cc406Sopenharmony_ci width = pattern_size * 3; 535141cc406Sopenharmony_ci if (x + width >= bpl) 536141cc406Sopenharmony_ci width = bpl - x; 537141cc406Sopenharmony_ci 538141cc406Sopenharmony_ci if ((line_count / (pattern_size + pattern_distance)) & 1) 539141cc406Sopenharmony_ci color = 540141cc406Sopenharmony_ci (SANE_Byte) (0xff - ((x / ((pattern_size + pattern_distance) * 3)) 541141cc406Sopenharmony_ci & 0xff)); 542141cc406Sopenharmony_ci else 543141cc406Sopenharmony_ci color = (SANE_Byte) ((x / ((pattern_size + pattern_distance) * 3)) & 0xff); 544141cc406Sopenharmony_ci 545141cc406Sopenharmony_ci if (line_count / (pattern_size + pattern_distance) < 2) 546141cc406Sopenharmony_ci { 547141cc406Sopenharmony_ci color_r = color; 548141cc406Sopenharmony_ci color_g = 0; 549141cc406Sopenharmony_ci color_b = 0; 550141cc406Sopenharmony_ci } 551141cc406Sopenharmony_ci else if (line_count / (pattern_size + pattern_distance) < 4) 552141cc406Sopenharmony_ci { 553141cc406Sopenharmony_ci color_r = 0; 554141cc406Sopenharmony_ci color_g = color; 555141cc406Sopenharmony_ci color_b = 0; 556141cc406Sopenharmony_ci } 557141cc406Sopenharmony_ci else 558141cc406Sopenharmony_ci { 559141cc406Sopenharmony_ci color_r = 0; 560141cc406Sopenharmony_ci color_g = 0; 561141cc406Sopenharmony_ci color_b = color; 562141cc406Sopenharmony_ci } 563141cc406Sopenharmony_ci 564141cc406Sopenharmony_ci for (x1 = 0; x1 < width; x1 += 3) 565141cc406Sopenharmony_ci { 566141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = color_r; 567141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = color_g; 568141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 2] = color_b; 569141cc406Sopenharmony_ci } 570141cc406Sopenharmony_ci 571141cc406Sopenharmony_ci x += ((pattern_size + pattern_distance) * 3); 572141cc406Sopenharmony_ci } 573141cc406Sopenharmony_ci } 574141cc406Sopenharmony_ci 575141cc406Sopenharmony_ci } 576141cc406Sopenharmony_ci else if ((test_device->params.format == SANE_FRAME_RED 577141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_GREEN 578141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_BLUE) 579141cc406Sopenharmony_ci && test_device->params.depth == 8) 580141cc406Sopenharmony_ci { 581141cc406Sopenharmony_ci /* 8 bit color three-pass */ 582141cc406Sopenharmony_ci pattern_size = 4; 583141cc406Sopenharmony_ci pattern_distance = 1; 584141cc406Sopenharmony_ci lines = 6 * (pattern_size + pattern_distance); 585141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 586141cc406Sopenharmony_ci 587141cc406Sopenharmony_ci if (buffer_size) 588141cc406Sopenharmony_ci *buffer_size = b_size; 589141cc406Sopenharmony_ci b = malloc (b_size); 590141cc406Sopenharmony_ci if (!b) 591141cc406Sopenharmony_ci { 592141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 593141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 594141cc406Sopenharmony_ci } 595141cc406Sopenharmony_ci if (buffer) 596141cc406Sopenharmony_ci *buffer = b; 597141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing 8 bit color three-pass " 598141cc406Sopenharmony_ci "test picture %zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 599141cc406Sopenharmony_ci memset (b, 0x55, b_size); 600141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 601141cc406Sopenharmony_ci { 602141cc406Sopenharmony_ci SANE_Word x = pattern_distance; 603141cc406Sopenharmony_ci 604141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 605141cc406Sopenharmony_ci < pattern_distance) 606141cc406Sopenharmony_ci continue; 607141cc406Sopenharmony_ci 608141cc406Sopenharmony_ci while (x < bpl) 609141cc406Sopenharmony_ci { 610141cc406Sopenharmony_ci SANE_Word width; 611141cc406Sopenharmony_ci SANE_Byte color = 0; 612141cc406Sopenharmony_ci 613141cc406Sopenharmony_ci width = pattern_size; 614141cc406Sopenharmony_ci if (x + width >= bpl) 615141cc406Sopenharmony_ci width = bpl - x; 616141cc406Sopenharmony_ci 617141cc406Sopenharmony_ci if ((line_count / (pattern_size + pattern_distance)) & 1) 618141cc406Sopenharmony_ci color = (SANE_Byte) 619141cc406Sopenharmony_ci (0xff - (x / ((pattern_size + pattern_distance)) & 0xff)); 620141cc406Sopenharmony_ci else 621141cc406Sopenharmony_ci color = (SANE_Byte) ((x / (pattern_size + pattern_distance)) & 0xff); 622141cc406Sopenharmony_ci 623141cc406Sopenharmony_ci if (line_count / (pattern_size + pattern_distance) < 2) 624141cc406Sopenharmony_ci { 625141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_RED) 626141cc406Sopenharmony_ci color = 0x00; 627141cc406Sopenharmony_ci } 628141cc406Sopenharmony_ci else if (line_count / (pattern_size + pattern_distance) < 4) 629141cc406Sopenharmony_ci { 630141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_GREEN) 631141cc406Sopenharmony_ci color = 0x00; 632141cc406Sopenharmony_ci } 633141cc406Sopenharmony_ci else 634141cc406Sopenharmony_ci { 635141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_BLUE) 636141cc406Sopenharmony_ci color = 0x00; 637141cc406Sopenharmony_ci } 638141cc406Sopenharmony_ci memset (b + line_count * bpl + x, color, (size_t) width); 639141cc406Sopenharmony_ci 640141cc406Sopenharmony_ci x += (pattern_size + pattern_distance); 641141cc406Sopenharmony_ci } 642141cc406Sopenharmony_ci } 643141cc406Sopenharmony_ci } 644141cc406Sopenharmony_ci else if (test_device->params.format == SANE_FRAME_RGB 645141cc406Sopenharmony_ci && test_device->params.depth == 16) 646141cc406Sopenharmony_ci { 647141cc406Sopenharmony_ci /* 16 bit color */ 648141cc406Sopenharmony_ci pattern_size = 256; 649141cc406Sopenharmony_ci pattern_distance = 4; 650141cc406Sopenharmony_ci lines = pattern_size + pattern_distance; 651141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 652141cc406Sopenharmony_ci 653141cc406Sopenharmony_ci if (buffer_size) 654141cc406Sopenharmony_ci *buffer_size = b_size; 655141cc406Sopenharmony_ci b = malloc (b_size); 656141cc406Sopenharmony_ci if (!b) 657141cc406Sopenharmony_ci { 658141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 659141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 660141cc406Sopenharmony_ci } 661141cc406Sopenharmony_ci if (buffer) 662141cc406Sopenharmony_ci *buffer = b; 663141cc406Sopenharmony_ci DBG (3, 664141cc406Sopenharmony_ci "(child) init_picture_buffer: drawing 16 bit color test picture " 665141cc406Sopenharmony_ci "%zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 666141cc406Sopenharmony_ci memset (b, 0x55, b_size); 667141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 668141cc406Sopenharmony_ci { 669141cc406Sopenharmony_ci SANE_Word x = pattern_distance * 2 * 3; 670141cc406Sopenharmony_ci 671141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 672141cc406Sopenharmony_ci < pattern_distance) 673141cc406Sopenharmony_ci continue; 674141cc406Sopenharmony_ci 675141cc406Sopenharmony_ci while (x < bpl) 676141cc406Sopenharmony_ci { 677141cc406Sopenharmony_ci SANE_Word width; 678141cc406Sopenharmony_ci SANE_Word x1; 679141cc406Sopenharmony_ci SANE_Byte color_hi = 0, color_lo = 0; 680141cc406Sopenharmony_ci SANE_Byte color_hi_r = 0, color_lo_r = 0; 681141cc406Sopenharmony_ci SANE_Byte color_hi_g = 0, color_lo_g = 0; 682141cc406Sopenharmony_ci SANE_Byte color_hi_b = 0, color_lo_b = 0; 683141cc406Sopenharmony_ci 684141cc406Sopenharmony_ci width = pattern_size * 2 * 3; 685141cc406Sopenharmony_ci if (x + width >= bpl) 686141cc406Sopenharmony_ci width = bpl - x; 687141cc406Sopenharmony_ci 688141cc406Sopenharmony_ci 689141cc406Sopenharmony_ci for (x1 = 0; x1 < width; x1 += 6) 690141cc406Sopenharmony_ci { 691141cc406Sopenharmony_ci color_lo = (SANE_Byte) 692141cc406Sopenharmony_ci (((line_count + pattern_size) 693141cc406Sopenharmony_ci % (pattern_size + pattern_distance)) & 0xff); 694141cc406Sopenharmony_ci color_hi = (SANE_Byte) ((x1 / 6) & 0xff); 695141cc406Sopenharmony_ci if (((x / ((pattern_size + pattern_distance) * 6)) % 3) == 696141cc406Sopenharmony_ci 0) 697141cc406Sopenharmony_ci { 698141cc406Sopenharmony_ci color_lo_r = color_lo; 699141cc406Sopenharmony_ci color_hi_r = color_hi; 700141cc406Sopenharmony_ci color_lo_g = 0; 701141cc406Sopenharmony_ci color_hi_g = 0; 702141cc406Sopenharmony_ci color_lo_b = 0; 703141cc406Sopenharmony_ci color_hi_b = 0; 704141cc406Sopenharmony_ci } 705141cc406Sopenharmony_ci else if (((x / ((pattern_size + pattern_distance) * 6)) % 3) 706141cc406Sopenharmony_ci == 1) 707141cc406Sopenharmony_ci { 708141cc406Sopenharmony_ci color_lo_r = 0; 709141cc406Sopenharmony_ci color_hi_r = 0; 710141cc406Sopenharmony_ci color_lo_g = color_lo; 711141cc406Sopenharmony_ci color_hi_g = color_hi; 712141cc406Sopenharmony_ci color_lo_b = 0; 713141cc406Sopenharmony_ci color_hi_b = 0; 714141cc406Sopenharmony_ci } 715141cc406Sopenharmony_ci else 716141cc406Sopenharmony_ci { 717141cc406Sopenharmony_ci color_lo_r = 0; 718141cc406Sopenharmony_ci color_hi_r = 0; 719141cc406Sopenharmony_ci color_lo_g = 0; 720141cc406Sopenharmony_ci color_hi_g = 0; 721141cc406Sopenharmony_ci color_lo_b = color_lo; 722141cc406Sopenharmony_ci color_hi_b = color_hi; 723141cc406Sopenharmony_ci } 724141cc406Sopenharmony_ci if (is_little_endian) 725141cc406Sopenharmony_ci { 726141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = color_lo_r; 727141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = color_hi_r; 728141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 2] = color_lo_g; 729141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 3] = color_hi_g; 730141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 4] = color_lo_b; 731141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 5] = color_hi_b; 732141cc406Sopenharmony_ci } 733141cc406Sopenharmony_ci else 734141cc406Sopenharmony_ci { 735141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = color_hi_r; 736141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = color_lo_r; 737141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 2] = color_hi_g; 738141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 3] = color_lo_g; 739141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 4] = color_hi_b; 740141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 5] = color_lo_b; 741141cc406Sopenharmony_ci } 742141cc406Sopenharmony_ci } 743141cc406Sopenharmony_ci x += ((pattern_size + pattern_distance) * 2 * 3); 744141cc406Sopenharmony_ci } 745141cc406Sopenharmony_ci } 746141cc406Sopenharmony_ci 747141cc406Sopenharmony_ci } 748141cc406Sopenharmony_ci else if ((test_device->params.format == SANE_FRAME_RED 749141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_GREEN 750141cc406Sopenharmony_ci || test_device->params.format == SANE_FRAME_BLUE) 751141cc406Sopenharmony_ci && test_device->params.depth == 16) 752141cc406Sopenharmony_ci { 753141cc406Sopenharmony_ci /* 16 bit color three-pass */ 754141cc406Sopenharmony_ci pattern_size = 256; 755141cc406Sopenharmony_ci pattern_distance = 4; 756141cc406Sopenharmony_ci lines = pattern_size + pattern_distance; 757141cc406Sopenharmony_ci b_size = (size_t) lines * (size_t) bpl; 758141cc406Sopenharmony_ci 759141cc406Sopenharmony_ci if (buffer_size) 760141cc406Sopenharmony_ci *buffer_size = b_size; 761141cc406Sopenharmony_ci b = malloc (b_size); 762141cc406Sopenharmony_ci if (!b) 763141cc406Sopenharmony_ci { 764141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: couldn't malloc buffer\n"); 765141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 766141cc406Sopenharmony_ci } 767141cc406Sopenharmony_ci if (buffer) 768141cc406Sopenharmony_ci *buffer = b; 769141cc406Sopenharmony_ci DBG (3, "(child) init_picture_buffer: drawing 16 bit color three-pass " 770141cc406Sopenharmony_ci "test picture %zu bytes, %d bpl, %d lines\n", b_size, bpl, lines); 771141cc406Sopenharmony_ci memset (b, 0x55, b_size); 772141cc406Sopenharmony_ci for (line_count = 0; line_count < lines; line_count++) 773141cc406Sopenharmony_ci { 774141cc406Sopenharmony_ci SANE_Word x = pattern_distance * 2; 775141cc406Sopenharmony_ci 776141cc406Sopenharmony_ci if (line_count % (pattern_size + pattern_distance) 777141cc406Sopenharmony_ci < pattern_distance) 778141cc406Sopenharmony_ci continue; 779141cc406Sopenharmony_ci 780141cc406Sopenharmony_ci while (x < bpl) 781141cc406Sopenharmony_ci { 782141cc406Sopenharmony_ci SANE_Word width; 783141cc406Sopenharmony_ci SANE_Word x1; 784141cc406Sopenharmony_ci SANE_Byte color_hi = 0, color_lo = 0; 785141cc406Sopenharmony_ci 786141cc406Sopenharmony_ci width = pattern_size * 2; 787141cc406Sopenharmony_ci if (x + width >= bpl) 788141cc406Sopenharmony_ci width = bpl - x; 789141cc406Sopenharmony_ci 790141cc406Sopenharmony_ci 791141cc406Sopenharmony_ci for (x1 = 0; x1 < width; x1 += 2) 792141cc406Sopenharmony_ci { 793141cc406Sopenharmony_ci color_lo = (SANE_Byte) 794141cc406Sopenharmony_ci (((line_count + pattern_size) 795141cc406Sopenharmony_ci % (pattern_size + pattern_distance)) & 0xff); 796141cc406Sopenharmony_ci color_hi = (SANE_Byte) ((x1 / 2) & 0xff); 797141cc406Sopenharmony_ci if (((x / ((pattern_size + pattern_distance) * 2)) % 3) == 798141cc406Sopenharmony_ci 0) 799141cc406Sopenharmony_ci { 800141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_RED) 801141cc406Sopenharmony_ci { 802141cc406Sopenharmony_ci color_lo = 0x00; 803141cc406Sopenharmony_ci color_hi = 0x00; 804141cc406Sopenharmony_ci } 805141cc406Sopenharmony_ci } 806141cc406Sopenharmony_ci else if (((x / ((pattern_size + pattern_distance) * 2)) % 3) 807141cc406Sopenharmony_ci == 1) 808141cc406Sopenharmony_ci { 809141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_GREEN) 810141cc406Sopenharmony_ci { 811141cc406Sopenharmony_ci color_lo = 0x00; 812141cc406Sopenharmony_ci color_hi = 0x00; 813141cc406Sopenharmony_ci } 814141cc406Sopenharmony_ci } 815141cc406Sopenharmony_ci else 816141cc406Sopenharmony_ci { 817141cc406Sopenharmony_ci if (test_device->params.format != SANE_FRAME_BLUE) 818141cc406Sopenharmony_ci { 819141cc406Sopenharmony_ci color_lo = 0x00; 820141cc406Sopenharmony_ci color_hi = 0x00; 821141cc406Sopenharmony_ci } 822141cc406Sopenharmony_ci } 823141cc406Sopenharmony_ci 824141cc406Sopenharmony_ci if (is_little_endian) 825141cc406Sopenharmony_ci { 826141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = color_lo; 827141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = color_hi; 828141cc406Sopenharmony_ci } 829141cc406Sopenharmony_ci else 830141cc406Sopenharmony_ci { 831141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 0] = color_hi; 832141cc406Sopenharmony_ci b[line_count * bpl + x + x1 + 1] = color_lo; 833141cc406Sopenharmony_ci } 834141cc406Sopenharmony_ci 835141cc406Sopenharmony_ci } 836141cc406Sopenharmony_ci x += ((pattern_size + pattern_distance) * 2); 837141cc406Sopenharmony_ci } 838141cc406Sopenharmony_ci } 839141cc406Sopenharmony_ci 840141cc406Sopenharmony_ci } 841141cc406Sopenharmony_ci else /* Huh? */ 842141cc406Sopenharmony_ci { 843141cc406Sopenharmony_ci DBG (1, "(child) init_picture_buffer: unknown mode\n"); 844141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 845141cc406Sopenharmony_ci } 846141cc406Sopenharmony_ci 847141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 848141cc406Sopenharmony_ci} 849