summaryrefslogtreecommitdiff
path: root/src/testpattern/testpattern.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testpattern/testpattern.c')
-rw-r--r--src/testpattern/testpattern.c175
1 files changed, 166 insertions, 9 deletions
diff --git a/src/testpattern/testpattern.c b/src/testpattern/testpattern.c
index db7fe2f..29c30b1 100644
--- a/src/testpattern/testpattern.c
+++ b/src/testpattern/testpattern.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testpattern.c,v 1.44 2006/04/18 12:30:57 rlk Exp $"
+ * "$Id: testpattern.c,v 1.44.8.2 2007/12/31 03:37:27 rlk Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -40,6 +40,7 @@
#include <string.h>
#include "testpattern.h"
#include <gutenprint/gutenprint-intl.h>
+#include <errno.h>
extern int yyparse(void);
@@ -87,6 +88,7 @@ int global_invert_data = 0;
int global_use_raw_cmyk;
int global_did_something;
int global_suppress_output = 0;
+char *global_output = NULL;
static testpattern_t *static_testpatterns;
@@ -171,6 +173,8 @@ static void
writefunc(void *file, const char *buf, size_t bytes)
{
FILE *prn = (FILE *)file;
+ if (! file)
+ return;
if (!global_suppress_output || (file == stderr))
{
fwrite(buf, 1, bytes, prn);
@@ -232,6 +236,8 @@ do_print(void)
int count;
int i;
char tmp[32];
+ FILE *output = stdout;
+ int write_to_process = 0;
initialize_global_parameters();
global_vars = stp_vars_create();
@@ -264,10 +270,42 @@ do_print(void)
}
return 2;
}
+ if (global_output)
+ {
+ if (strcmp(global_output, "-") == 0)
+ output = stdout;
+ else if (strcmp(global_output, "") == 0)
+ output = NULL;
+ else if (global_output[0] == '|')
+ {
+ write_to_process = 1;
+ output = popen(global_output+1, "w");
+ if (! output)
+ {
+ fprintf(stderr, "popen '%s' failed: %s\n", global_output, strerror(errno));
+ output = NULL;
+ }
+ free(global_output);
+ global_output = NULL;
+ }
+ else
+ {
+ output = fopen(global_output, "wb");
+ if (! output)
+ {
+ fprintf(stderr, "Create %s failed: %s\n", global_output, strerror(errno));
+ output = NULL;
+ }
+ free(global_output);
+ global_output = NULL;
+ }
+ }
+ else
+ output = stdout;
stp_set_printer_defaults(v, the_printer);
stp_set_outfunc(v, writefunc);
stp_set_errfunc(v, writefunc);
- stp_set_outdata(v, stdout);
+ stp_set_outdata(v, output);
stp_set_errdata(v, stderr);
stp_set_string_parameter(v, "InputImageType", global_image_type);
sprintf(tmp, "%d", global_bit_depth);
@@ -286,12 +324,29 @@ do_print(void)
for (i = 0; i < count; i++)
{
const stp_parameter_t *p = stp_parameter_list_param(params, i);
- const char *val = stp_get_string_parameter(global_vars, p->name);
- if (p->p_type == STP_PARAMETER_TYPE_STRING_LIST && val && strlen(val) > 0)
- stp_set_string_parameter(v, p->name, val);
- stp_set_page_width(v, stp_get_page_width(global_vars));
- stp_set_page_height(v, stp_get_page_height(global_vars));
+ if (p->p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ const char *val = stp_get_string_parameter(global_vars, p->name);
+ if (val && strlen(val) > 0)
+ {
+ stp_set_string_parameter(v, p->name, val);
+ }
+ }
+ else if (p->p_type == STP_PARAMETER_TYPE_INT &&
+ stp_check_int_parameter(global_vars, p->name, STP_PARAMETER_ACTIVE))
+ {
+ int val = stp_get_int_parameter(global_vars, p->name);
+ stp_set_int_parameter(v, p->name, val);
+ }
+ else if (p->p_type == STP_PARAMETER_TYPE_DOUBLE &&
+ stp_check_float_parameter(global_vars, p->name, STP_PARAMETER_ACTIVE))
+ {
+ double val = stp_get_float_parameter(global_vars, p->name);
+ stp_set_float_parameter(v, p->name, val);
+ }
}
+ stp_set_page_width(v, stp_get_page_width(global_vars));
+ stp_set_page_height(v, stp_get_page_height(global_vars));
stp_parameter_list_destroy(params);
stp_get_imageable_area(v, &left, &right, &bottom, &top);
@@ -328,6 +383,13 @@ do_print(void)
stp_vars_destroy(v);
stp_free(static_testpatterns);
static_testpatterns = NULL;
+ if (output && output != stdout)
+ {
+ if (write_to_process)
+ (void) pclose(output);
+ else
+ (void) fclose(output);
+ }
return 0;
}
@@ -384,6 +446,8 @@ fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
int i; \
T *s_data = (T *) data; \
unsigned black_val = global_ink_limit * ((1 << bits) - 1); \
+ unsigned blocks = (len / scount) * scount; \
+ unsigned extra = len - blocks; \
if (strcmp(global_image_type, "Raw") == 0) \
{ \
for (i = 0; i < (len / scount) * scount; i++) \
@@ -402,6 +466,28 @@ fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
} \
s_data += global_channel_depth; \
} \
+ memset(s_data, 0xff, sizeof(T) * extra * \
+ global_channel_depth); \
+ } \
+ else if (strcmp(global_image_type, "RGB") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 3); \
+ s_data += 3; \
+ } \
+ memset(s_data, 0xff, sizeof(T) * extra * 3); \
+ } \
+ else if (strcmp(global_image_type, "CMY") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ s_data[0] = black_val; \
+ s_data[1] = black_val; \
+ s_data[2] = black_val; \
+ s_data += 3; \
+ } \
+ memset(s_data, 0, sizeof(T) * extra * 3); \
} \
else if (strcmp(global_image_type, "CMYK") == 0) \
{ \
@@ -411,6 +497,7 @@ fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
s_data[3] = black_val; \
s_data += 4; \
} \
+ memset(s_data, 0, sizeof(T) * extra * 4); \
} \
else if (strcmp(global_image_type, "KCMY") == 0) \
{ \
@@ -420,6 +507,7 @@ fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
s_data[0] = black_val; \
s_data += 4; \
} \
+ memset(s_data, 0, sizeof(T) * extra * 4); \
} \
else if (strcmp(global_image_type, "Grayscale") == 0) \
{ \
@@ -429,6 +517,16 @@ fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
s_data[0] = black_val; \
s_data += 1; \
} \
+ memset(s_data, 0, sizeof(T) * extra); \
+ } \
+ else if (strcmp(global_image_type, "Whitescale") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 1); \
+ s_data += 1; \
+ } \
+ memset(s_data, 0xff, sizeof(T) * extra); \
} \
}
@@ -455,9 +553,64 @@ fill_black(unsigned char *data, size_t len, size_t scount, size_t bytes)
static void \
fill_white_##bits(unsigned char *data, size_t len, size_t scount) \
{ \
+ int i; \
T *s_data = (T *) data; \
- memset(s_data, 0, sizeof(T) * global_channel_depth * \
- ((len / scount) * scount)); \
+ if (strcmp(global_image_type, "Raw") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * global_channel_depth); \
+ s_data += global_channel_depth; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "RGB") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0xff, sizeof(T) * 3); \
+ s_data += 3; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "CMY") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 3); \
+ s_data += 3; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "CMYK") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 4); \
+ s_data += 4; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "KCMY") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 4); \
+ s_data += 4; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "Grayscale") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 1); \
+ s_data += 1; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "Whitescale") == 0) \
+ { \
+ for (i = 0; i < len; i++) \
+ { \
+ memset(s_data, 0xff, sizeof(T) * 1); \
+ s_data += 1; \
+ } \
+ } \
}
FILL_WHITE_FUNCTION(unsigned short, 16)
@@ -844,6 +997,10 @@ Image_get_row(stp_image_t *image, unsigned char *data,
previous_band = band;
fprintf(stderr, ".");
}
+ else
+ fill_pattern(&(static_testpatterns[band]), data,
+ global_printer_width, global_steps, depth,
+ global_bit_depth / 8);
}
return STP_IMAGE_STATUS_OK;
}