diff options
-rw-r--r-- | contrib/opvp/README.txt | 18 | ||||
-rwxr-xr-x | contrib/opvp/build_opv_harness.sh | 4 | ||||
-rw-r--r-- | contrib/opvp/gdevopvp.c | 1879 | ||||
-rw-r--r-- | contrib/opvp/opvp.h | 9 | ||||
-rw-r--r-- | contrib/opvp/opvp_0_2_0.h | 4 | ||||
-rw-r--r-- | contrib/opvp/opvpharness.c | 947 |
6 files changed, 2070 insertions, 791 deletions
diff --git a/contrib/opvp/README.txt b/contrib/opvp/README.txt new file mode 100644 index 000000000..fd2250e3f --- /dev/null +++ b/contrib/opvp/README.txt @@ -0,0 +1,18 @@ +In an effort to remove globals in devices +that ship with Ghostscript, the opvp device was updated +to place it's global values into the device structure. + +As part of that commit, a harness was added to enable +testing of the opvp device client API to test for any +issues. To build the harness use ./build_opv_harness.sh +This will create a debug version of the shared object +libopv.so. The command line +gs -sDEVICE=opvp -sDriver=./contrib/opvp/libopv.so -o output.txt -f ./examples/tiger.eps +can then be used. + +This command should create a file called +opvp_command_dump.txt that contains the calls and +the parameters made to the client API. Note that the +harness itself has to rely upon globals. To do otherwise +would require a to change the client API, which we +do not own.
\ No newline at end of file diff --git a/contrib/opvp/build_opv_harness.sh b/contrib/opvp/build_opv_harness.sh new file mode 100755 index 000000000..8d10f0522 --- /dev/null +++ b/contrib/opvp/build_opv_harness.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +gcc -Werror -Wall -c -fpic -g opvpharness.c +gcc -shared -o libopv.so opvpharness.o
\ No newline at end of file diff --git a/contrib/opvp/gdevopvp.c b/contrib/opvp/gdevopvp.c index aab8a6384..e29425460 100644 --- a/contrib/opvp/gdevopvp.c +++ b/contrib/opvp/gdevopvp.c @@ -115,14 +115,62 @@ typedef struct { #define MAX_PATH_POINTS 1000 -/* driver */ -typedef struct gx_device_opvp_s { +/* To remove the existing globals from this device, + we place the current globals into a structure + and place them at the same offset location + for the opvp and oprp devices, allowing easy + access regardless of the device type. */ + +typedef struct opXp_globals_s { + bool vector; + bool inkjet; + bool zoomAuto; + bool zooming; + bool beginPage; + float margins[4]; + float zoom[2]; + float shift[2]; + opvp_int_t outputFD; + opvp_int_t nApiEntry; + opvp_dc_t printerContext; + opvp_cspace_t colorSpace; + opvp_cspace_t savedColorSpace; + char* vectorDriver; + char* printerModel; + void* handle; + opvp_brush_t* vectorFillColor; + opvp_int_t* ErrorNo; + opvp_api_procs_t* apiEntry; + OPVP_api_procs* apiEntry_0_2; + char* jobInfo; + char* docInfo; + opvp_dc_t(*OpenPrinter)(opvp_int_t, const opvp_char_t*, + const opvp_int_t[2], opvp_api_procs_t**); + int (*OpenPrinter_0_2)(int, char*, int*, + OPVP_api_procs**); + int (*GetLastError)(gx_device*); +} opXp_globals; + +typedef struct base_opvp_s { gx_device_vector_common; +} base_opvp; + +typedef struct base_oprp_s { + gx_device_common; + gx_prn_device_common; +} base_oprp; + +typedef struct gx_device_opvp_s { + gx_device_vector_common; + char padding[1 + (sizeof(base_oprp) > sizeof(base_opvp) ? sizeof(base_oprp) - sizeof(base_opvp) : 0)]; + opXp_globals globals; } gx_device_opvp; -typedef struct gx_device_oprp_s { +typedef struct gx_device_oprp_s { gx_device_common; gx_prn_device_common; + char padding[1 + (sizeof(base_opvp) > sizeof(base_oprp) ? sizeof(base_opvp) - sizeof(base_oprp) : 0)]; + opXp_globals globals; } gx_device_oprp; /* point (internal) */ @@ -135,15 +183,16 @@ typedef struct { /* Utilities */ static int opvp_startpage(gx_device *); -static int opvp_endpage(void); +static int opvp_endpage(gx_device*); static char *opvp_alloc_string(char **, const char *); static char *opvp_cat_string(char **, const char *); static char *opvp_adjust_num_string(char *); -static char **opvp_gen_dynamic_lib_name(void); +static char **opvp_gen_dynamic_lib_name(gx_device*); static char *opvp_to_utf8(char *); -#define opvp_check_in_page(pdev) \ - ((beginPage) || (inkjet) ? 0 \ - : (*vdev_proc(pdev, beginpage))((gx_device_vector*)pdev)) +#define opvp_check_in_page(opdev) \ + ((((gx_device_opvp*)(opdev))->globals.beginPage) || \ + (((gx_device_opvp*)(opdev))->globals.inkjet) ? 0 \ + : (*vdev_proc(opdev, beginpage))((gx_device_vector*)opdev)) static int opvp_get_papertable_index(gx_device *); static char *opvp_get_sizestring(float, float); /* not used static const char *opvp_get_papersize_region(gx_device *);*/ @@ -160,8 +209,8 @@ static int opvp_draw_image(gx_device_opvp *, int, int, int, int, int, int, int, const byte *); /* load/unload vector driver */ -static int opvp_load_vector_driver(void); -static int opvp_unload_vector_driver(void); +static int opvp_load_vector_driver(gx_device*); +static int opvp_unload_vector_driver(gx_device*); static int prepare_open(gx_device *); /* driver procs */ @@ -177,10 +226,10 @@ static int opvp_copy_mono(gx_device *, const byte *, int, int, gx_color_index, gx_color_index); static int opvp_copy_color(gx_device *, const byte *, int, int, gx_bitmap_id, int, int, int, int); -static int _get_params(gs_param_list *); +static int _get_params(gx_device*, gs_param_list *); static int opvp_get_params(gx_device *, gs_param_list *); static int oprp_get_params(gx_device *, gs_param_list *); -static int _put_params(gs_param_list *); +static int _put_params(gx_device*, gs_param_list *); static int opvp_put_params(gx_device *, gs_param_list *); static int oprp_put_params(gx_device *, gs_param_list *); static int opvp_fill_path(gx_device *, const gs_gstate *, gx_path *, @@ -295,6 +344,53 @@ gs_public_st_suffix_add0_final( NULL, /* *jobInfo */\ NULL /* *docInfo */ + +static int +GetLastError_1_0(gx_device* dev) +{ + gx_device_opvp* pdev = (gx_device_opvp*)dev; + + return *(pdev->globals.ErrorNo); +} + +/* Initialize the globals */ +static void +InitGlobals(gx_device* dev) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + opdev->globals.vector = true; + opdev->globals.inkjet = false; + opdev->globals.zoomAuto = false; + opdev->globals.zooming = false; + opdev->globals.beginPage = false; + opdev->globals.margins[0] = 0; + opdev->globals.margins[1] = 0; + opdev->globals.margins[2] = 0; + opdev->globals.margins[3] = 0; + opdev->globals.zoom[0] = 1; + opdev->globals.zoom[1] = 1; + opdev->globals.shift[0] = 0; + opdev->globals.shift[1] = 0; + opdev->globals.outputFD = -1; + opdev->globals.nApiEntry = 0; + opdev->globals.printerContext = -1; + opdev->globals.colorSpace = OPVP_CSPACE_STANDARDRGB; + opdev->globals.savedColorSpace = OPVP_CSPACE_STANDARDRGB; + opdev->globals.vectorDriver = NULL; + opdev->globals.printerModel = NULL; + opdev->globals.handle = NULL; + opdev->globals.vectorFillColor = NULL; + opdev->globals.ErrorNo = NULL; + opdev->globals.apiEntry = NULL; + opdev->globals.apiEntry_0_2 = NULL; + opdev->globals.jobInfo = NULL; + opdev->globals.docInfo = NULL; + opdev->globals.OpenPrinter = NULL; + opdev->globals.OpenPrinter_0_2 = NULL; + opdev->globals.GetLastError = GetLastError_1_0; +} + /* device procs */ static void opvp_initialize_device_procs(gx_device *dev) @@ -326,6 +422,9 @@ opvp_initialize_device_procs(gx_device *dev) * by the system to the default. For compatibility we do the same. */ set_dev_proc(dev, encode_color, NULL); set_dev_proc(dev, decode_color, NULL); + + /* And the device globals */ + InitGlobals(dev); } /* vector procs */ @@ -396,6 +495,9 @@ oprp_initialize_device_procs(gx_device *dev) * by the system to the default. For compatibility we do the same. */ set_dev_proc(dev, encode_color, NULL); set_dev_proc(dev, decode_color, NULL); + + /* And the device globals */ + InitGlobals(dev); } const gx_device_oprp gs_oprp_device = @@ -414,43 +516,6 @@ const gx_device_oprp gs_oprp_device = ) }; -/* driver mode */ -static bool vector = true; -static bool inkjet = false; -static char *vectorDriver = NULL; -static char *printerModel = NULL; -static void *handle = NULL; -static opvp_dc_t (*OpenPrinter)(opvp_int_t,const opvp_char_t*, - const opvp_int_t[2], - opvp_api_procs_t**) = NULL; -static int (*OpenPrinter_0_2)(int,char*,int*, - OPVP_api_procs**) = NULL; -static opvp_int_t *ErrorNo = NULL; -static opvp_int_t outputFD = -1; -static opvp_int_t nApiEntry = 0; -static opvp_api_procs_t *apiEntry = NULL; -static OPVP_api_procs *apiEntry_0_2 = NULL; -static opvp_dc_t printerContext = -1; -static char *jobInfo = NULL; -static char *docInfo = NULL; -static opvp_cspace_t colorSpace = OPVP_CSPACE_STANDARDRGB; -static opvp_cspace_t savedColorSpace; -static opvp_brush_t *vectorFillColor = NULL; -static float margins[4] = {0, 0, 0, 0}; -static float zoom[2] = {1, 1}; -static float shift[2] = {0, 0}; -static bool zoomAuto = false; -static bool zooming = false; -static bool beginPage = false; - -static int -GetLastError_1_0(void) -{ - return *ErrorNo; -} - -static int (*GetLastError)(void) = GetLastError_1_0; - /* Wrapper functions that keep compatible with 0.2 */ /* color space mapping 0.2 to 1.0 */ @@ -498,9 +563,11 @@ static int colorDepth_0_2[] = { /* translate error code */ static int -GetLastError_0_2(void) +GetLastError_0_2(gx_device* dev) { - switch(*ErrorNo) { + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + switch(*(opdev->globals.ErrorNo)) { case OPVP_FATALERROR_0_2: return OPVP_FATALERROR; break; @@ -528,48 +595,51 @@ GetLastError_0_2(void) } static opvp_result_t -StartPageWrapper(opvp_dc_t printerContext, const opvp_char_t *pageInfo) +StartPageWrapper(gx_device *dev, opvp_dc_t printerContext, const opvp_char_t *pageInfo) { int r; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if ((r = apiEntry_0_2->StartPage(printerContext, + if ((r = opdev->globals.apiEntry_0_2->StartPage(printerContext, /* discard const */(char *)pageInfo)) != OPVP_OK) { /* error */ return r; } /* initialize ROP */ - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext, + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext, OPVP_0_2_ROP_P); } return OPVP_OK; } static opvp_result_t -InitGSWrapper(opvp_dc_t printerContext) +InitGSWrapper(gx_device *dev, opvp_dc_t printerContext) { int r; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if ((r = apiEntry_0_2->InitGS(printerContext)) != OPVP_OK) { + if ((r = opdev->globals.apiEntry_0_2->InitGS(printerContext)) != OPVP_OK) { /* error */ return r; } /* initialize ROP */ - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext, + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext, OPVP_0_2_ROP_P); } return OPVP_OK; } static opvp_result_t -QueryColorSpaceWrapper( opvp_dc_t printerContext, opvp_int_t *pnum, +QueryColorSpaceWrapper(gx_device *dev, opvp_dc_t printerContext, opvp_int_t *pnum, opvp_cspace_t *pcspace) { int r; int i; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if ((r = apiEntry_0_2->QueryColorSpace(printerContext, + if ((r = opdev->globals.apiEntry_0_2->QueryColorSpace(printerContext, (OPVP_ColorSpace *)pcspace,pnum)) != OPVP_OK) { /* error */ return r; @@ -589,51 +659,54 @@ QueryColorSpaceWrapper( opvp_dc_t printerContext, opvp_int_t *pnum, } static opvp_result_t -SetColorSpaceWrapper(opvp_dc_t printerContext, opvp_cspace_t cspace) +SetColorSpaceWrapper(gx_device *dev, opvp_dc_t printerContext, opvp_cspace_t cspace) { + gx_device_opvp *opdev = (gx_device_opvp*)dev; + if (cspace == OPVP_CSPACE_DEVICEKRGB) { /* 0.2 doesn't have OPVP_CSPACE_DEVICEKRGB */ - *ErrorNo = OPVP_NOTSUPPORTED_0_2; + *(opdev->globals.ErrorNo) = OPVP_NOTSUPPORTED_0_2; return -1; } if ((int)cspace >= sizeof(cspace_1_0_to_0_2)/sizeof(OPVP_ColorSpace)) { /* unknown color space */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } - return apiEntry_0_2->SetColorSpace(printerContext, + return opdev->globals.apiEntry_0_2->SetColorSpace(printerContext, cspace_1_0_to_0_2[cspace]); } +/* Not used static opvp_result_t -GetColorSpaceWrapper(opvp_dc_t printerContext, opvp_cspace_t *pcspace) +GetColorSpaceWrapper(gx_device *dev, opvp_dc_t printerContext, opvp_cspace_t *pcspace) { int r; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if ((r = apiEntry_0_2->GetColorSpace(printerContext, + if ((r = opdev->globals.apiEntry_0_2->GetColorSpace(printerContext, (OPVP_ColorSpace *)pcspace)) != OPVP_OK) { - /* error */ return r; } if (*pcspace >= sizeof(cspace_0_2_to_1_0)/sizeof(opvp_cspace_t)) { - /* unknown color space */ - /* set DEVICERGB instead */ *pcspace = OPVP_CSPACE_DEVICERGB; } else { *pcspace = cspace_0_2_to_1_0[*pcspace]; } return r; } +*/ static opvp_result_t -SetStrokeColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) +SetStrokeColorWrapper(gx_device *dev, opvp_dc_t printerContext, const opvp_brush_t *brush) { OPVP_Brush brush_0_2; + gx_device_opvp *opdev = (gx_device_opvp*)dev; if (brush == NULL) { - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } if (brush->colorSpace == OPVP_CSPACE_DEVICEKRGB) { @@ -643,7 +716,7 @@ SetStrokeColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) if ((int)brush->colorSpace >= sizeof(cspace_1_0_to_0_2)/sizeof(OPVP_ColorSpace)) { /* unknown color space */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } brush_0_2.colorSpace = cspace_1_0_to_0_2[brush->colorSpace]; @@ -651,16 +724,17 @@ SetStrokeColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) brush_0_2.yorg = brush->yorg; brush_0_2.pbrush = (OPVP_BrushData *)brush->pbrush; memcpy(brush_0_2.color,brush->color,sizeof(brush_0_2.color)); - return apiEntry_0_2->SetStrokeColor(printerContext,&brush_0_2); + return opdev->globals.apiEntry_0_2->SetStrokeColor(printerContext, &brush_0_2); } static opvp_result_t -SetFillColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) +SetFillColorWrapper(gx_device *dev, opvp_dc_t printerContext, const opvp_brush_t *brush) { OPVP_Brush brush_0_2; + gx_device_opvp *opdev = (gx_device_opvp*)dev; if (brush == NULL) { - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } if (brush->colorSpace == OPVP_CSPACE_DEVICEKRGB) { @@ -670,7 +744,7 @@ SetFillColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) if ((int)brush->colorSpace >= sizeof(cspace_1_0_to_0_2)/sizeof(OPVP_ColorSpace)) { /* unknown color space */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } brush_0_2.colorSpace = cspace_1_0_to_0_2[brush->colorSpace]; @@ -678,27 +752,28 @@ SetFillColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) brush_0_2.yorg = brush->yorg; brush_0_2.pbrush = (OPVP_BrushData *)brush->pbrush; memcpy(brush_0_2.color,brush->color,sizeof(brush_0_2.color)); - return apiEntry_0_2->SetFillColor(printerContext,&brush_0_2); + return opdev->globals.apiEntry_0_2->SetFillColor(printerContext, &brush_0_2); } static opvp_result_t -SetBgColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) +SetBgColorWrapper(gx_device *dev, opvp_dc_t printerContext, const opvp_brush_t *brush) { OPVP_Brush brush_0_2; + gx_device_opvp *opdev = (gx_device_opvp*)dev; if (brush == NULL) { - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } if (brush->colorSpace == OPVP_CSPACE_DEVICEKRGB) { /* 0.2 doesn't have OPVP_CSPACE_DEVICEKRGB */ - *ErrorNo = OPVP_NOTSUPPORTED_0_2; + *(opdev->globals.ErrorNo) = OPVP_NOTSUPPORTED_0_2; return -1; } if ((int)brush->colorSpace >= sizeof(cspace_1_0_to_0_2)/sizeof(OPVP_ColorSpace)) { /* unknown color space */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } brush_0_2.colorSpace = cspace_1_0_to_0_2[brush->colorSpace]; @@ -706,11 +781,12 @@ SetBgColorWrapper(opvp_dc_t printerContext, const opvp_brush_t *brush) brush_0_2.yorg = brush->yorg; brush_0_2.pbrush = (OPVP_BrushData *)brush->pbrush; memcpy(brush_0_2.color,brush->color,sizeof(brush_0_2.color)); - return apiEntry_0_2->SetBgColor(printerContext,&brush_0_2); + return opdev->globals.apiEntry_0_2->SetBgColor(printerContext, &brush_0_2); } static opvp_result_t DrawImageWrapper( + gx_device *dev, opvp_dc_t printerContext, opvp_int_t sourceWidth, opvp_int_t sourceHeight, @@ -725,30 +801,31 @@ DrawImageWrapper( OPVP_ImageFormat iformat_0_2; OPVP_PaintMode paintmode_0_2 = OPVP_paintModeTransparent; int depth; + gx_device_opvp *opdev = (gx_device_opvp*)dev; if (imageFormat == OPVP_IFORMAT_MASK) { - if (apiEntry_0_2->GetPaintMode != NULL) { - apiEntry_0_2->GetPaintMode(printerContext, + if (opdev->globals.apiEntry_0_2->GetPaintMode != NULL) { + opdev->globals.apiEntry_0_2->GetPaintMode(printerContext, &paintmode_0_2); } if (paintmode_0_2 != OPVP_paintModeTransparent) { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext, + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext, OPVP_0_2_ROP_S); } } else { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext, + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext, OPVP_0_2_ROP_OR); } } depth = 1; } else { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); } - depth = colorDepth_0_2[colorSpace]; + depth = colorDepth_0_2[opdev->globals.colorSpace]; } OPVP_I2FIX(0,rect.p0.x); @@ -757,17 +834,17 @@ DrawImageWrapper( OPVP_I2FIX(destinationHeight,rect.p1.y); if (imageFormat >= sizeof(iformat_1_0_to_0_2)/sizeof(OPVP_ImageFormat)) { /* illegal image format */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } iformat_0_2 = iformat_1_0_to_0_2[imageFormat]; - r = apiEntry_0_2->DrawImage(printerContext,sourceWidth,sourceHeight, + r = opdev->globals.apiEntry_0_2->DrawImage(printerContext,sourceWidth,sourceHeight, depth,iformat_0_2,rect, sourcePitch*sourceHeight, /* remove const */ (void *)imagedata); - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_P); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_P); } return r; @@ -775,6 +852,7 @@ DrawImageWrapper( static opvp_result_t StartDrawImageWrapper( + gx_device *dev, opvp_dc_t printerContext, opvp_int_t sourceWidth, opvp_int_t sourceHeight, @@ -788,28 +866,29 @@ StartDrawImageWrapper( OPVP_ImageFormat iformat_0_2; OPVP_PaintMode paintmode_0_2 = OPVP_paintModeTransparent; int depth; + gx_device_opvp *opdev = (gx_device_opvp*)dev; if (imageFormat == OPVP_IFORMAT_MASK) { - if (apiEntry_0_2->GetPaintMode != NULL) { - apiEntry_0_2->GetPaintMode(printerContext, + if (opdev->globals.apiEntry_0_2->GetPaintMode != NULL) { + opdev->globals.apiEntry_0_2->GetPaintMode(printerContext, &paintmode_0_2); } if (paintmode_0_2 != OPVP_paintModeTransparent) { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); } } else { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_OR); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_OR); } } depth = 1; } else { - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_S); } - depth = colorDepth_0_2[colorSpace]; + depth = colorDepth_0_2[opdev->globals.colorSpace]; } OPVP_I2FIX(0,rect.p0.x); @@ -818,310 +897,518 @@ StartDrawImageWrapper( OPVP_I2FIX(destinationHeight,rect.p1.y); if (imageFormat >= sizeof(iformat_1_0_to_0_2)/sizeof(OPVP_ImageFormat)) { /* illegal image format */ - *ErrorNo = OPVP_PARAMERROR_0_2; + *(opdev->globals.ErrorNo) = OPVP_PARAMERROR_0_2; return -1; } iformat_0_2 = iformat_1_0_to_0_2[imageFormat]; - r = apiEntry_0_2->StartDrawImage(printerContext, - sourceWidth,sourceHeight, - depth,iformat_0_2,rect); + r = opdev->globals.apiEntry_0_2->StartDrawImage(printerContext, + sourceWidth, sourceHeight, + depth, iformat_0_2, rect); return r; } static opvp_result_t -EndDrawImageWrapper(opvp_dc_t printerContext) +EndDrawImageWrapper(gx_device *dev, opvp_dc_t printerContext) { int r; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - r = apiEntry_0_2->EndDrawImage(printerContext); + r = opdev->globals.apiEntry_0_2->EndDrawImage(printerContext); /* make sure rop is pattern copy */ - if (apiEntry_0_2->SetROP != NULL) { - apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_P); + if (opdev->globals.apiEntry_0_2->SetROP != NULL) { + opdev->globals.apiEntry_0_2->SetROP(printerContext,OPVP_0_2_ROP_P); } return r; } +/* Not used static opvp_result_t QueryDeviceCapabilityWrapper( + gx_device *dev, opvp_dc_t printerContext, opvp_queryinfoflags_t queryflag, opvp_int_t *buflen, opvp_char_t *infoBuf) { - return apiEntry_0_2->QueryDeviceCapability(printerContext,queryflag, + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + return opdev->globals.apiEntry_0_2->QueryDeviceCapability(printerContext,queryflag, *buflen,(char *)infoBuf); } static opvp_result_t QueryDeviceInfoWrapper( + gx_device *dev, opvp_dc_t printerContext, opvp_queryinfoflags_t queryflag, opvp_int_t *buflen, opvp_char_t *infoBuf) { + gx_device_opvp *opdev = (gx_device_opvp*)dev; + if (queryflag & OPVP_QF_MEDIACOPY) { - *ErrorNo = OPVP_NOTSUPPORTED; + *(opdev->globals.ErrorNo) = OPVP_NOTSUPPORTED; return -1; } if (queryflag & OPVP_QF_PRINTREGION) { queryflag &= ~OPVP_QF_PRINTREGION; queryflag |= 0x0020000; } - return apiEntry_0_2->QueryDeviceInfo(printerContext,queryflag, - *buflen,(char *)infoBuf); + return opdev->globals.apiEntry_0_2->QueryDeviceInfo(printerContext, queryflag, + *buflen, (char *)infoBuf); } +*/ static opvp_result_t -SetLineDashWrapper(opvp_dc_t printerContext, opvp_int_t num, +SetLineDashWrapper(gx_device *dev, opvp_dc_t printerContext, opvp_int_t num, const opvp_fix_t *pdash) { - return apiEntry_0_2->SetLineDash(printerContext, - /* remove const */ (OPVP_Fix *)pdash,num); + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + return opdev->globals.apiEntry_0_2->SetLineDash(printerContext, num, + /* remove const */ (OPVP_Fix *)pdash); } +/* Not used static opvp_result_t -GetLineDashWrapper(opvp_dc_t printerContext, opvp_int_t *pnum, +GetLineDashWrapper(gx_device* dev, opvp_dc_t printerContext, opvp_int_t *pnum, opvp_fix_t *pdash) { - return apiEntry_0_2->GetLineDash(printerContext, + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + return opdev->globals.apiEntry_0_2->GetLineDash(printerContext, pdash,pnum); } +*/ static opvp_dc_t OpenPrinterWrapper( + gx_device *dev, opvp_int_t outputFD, const opvp_char_t *printerModel, const opvp_int_t apiVersion[2], opvp_api_procs_t **apiProcs) { + gx_device_opvp *opdev = (gx_device_opvp*)dev; + opvp_dc_t dc = -1; - if (OpenPrinter != NULL) { - dc = (*OpenPrinter)(outputFD,printerModel,apiVersion,apiProcs); + if (opdev->globals.OpenPrinter != NULL) { + dc = (*(opdev->globals.OpenPrinter))(outputFD, printerModel, apiVersion, apiProcs); } else { /* try version 0.2 */ - if (OpenPrinter_0_2 != NULL) { + if (opdev->globals.OpenPrinter_0_2 != NULL) { static opvp_api_procs_t tEntry; - int nApiEntry; + int nApiEntry; /* Alias with prior global. Kept as is */ - dc = (*OpenPrinter_0_2)(outputFD, + dc = (*(opdev->globals.OpenPrinter_0_2))(outputFD, /* remove const */ (char *)printerModel, - &nApiEntry,&apiEntry_0_2); + &nApiEntry, + &(opdev->globals.apiEntry_0_2)); /* setting functions */ tEntry.opvpClosePrinter - = apiEntry_0_2->ClosePrinter; + = opdev->globals.apiEntry_0_2->ClosePrinter; tEntry.opvpStartJob = (opvp_result_t (*)(opvp_int_t, const opvp_char_t*)) - apiEntry_0_2->StartJob; - tEntry.opvpEndJob = apiEntry_0_2->EndJob; + opdev->globals.apiEntry_0_2->StartJob; + tEntry.opvpEndJob = opdev->globals.apiEntry_0_2->EndJob; tEntry.opvpAbortJob = NULL; tEntry.opvpStartDoc = (opvp_result_t (*)(opvp_dc_t, const opvp_char_t*)) - apiEntry_0_2->StartDoc; - tEntry.opvpEndDoc = apiEntry_0_2->EndDoc; - if (apiEntry_0_2->StartPage != NULL) { - tEntry.opvpStartPage = StartPageWrapper; - } else { - tEntry.opvpStartPage = NULL; - } - tEntry.opvpEndPage = apiEntry_0_2->EndPage; - - if (apiEntry_0_2->QueryDeviceCapability != NULL) { - tEntry.opvpQueryDeviceCapability - = QueryDeviceCapabilityWrapper; - } else { - tEntry.opvpQueryDeviceCapability = NULL; - } - - if (apiEntry_0_2->QueryDeviceInfo != NULL) { - tEntry.opvpQueryDeviceInfo = QueryDeviceInfoWrapper; - } else { - tEntry.opvpQueryDeviceInfo = NULL; - } - - tEntry.opvpResetCTM = apiEntry_0_2->ResetCTM; + opdev->globals.apiEntry_0_2->StartDoc; + tEntry.opvpEndDoc = opdev->globals.apiEntry_0_2->EndDoc; + tEntry.opvpStartPage = NULL; + tEntry.opvpEndPage = opdev->globals.apiEntry_0_2->EndPage; + tEntry.opvpQueryDeviceCapability = NULL; + tEntry.opvpQueryDeviceInfo = NULL; + tEntry.opvpResetCTM = opdev->globals.apiEntry_0_2->ResetCTM; tEntry.opvpSetCTM = (opvp_result_t (*)(opvp_dc_t, const opvp_ctm_t*)) - apiEntry_0_2->SetCTM; + opdev->globals.apiEntry_0_2->SetCTM; tEntry.opvpGetCTM = (opvp_result_t (*)(opvp_dc_t,opvp_ctm_t*)) - apiEntry_0_2->GetCTM; - if (apiEntry_0_2->InitGS != NULL) { - tEntry.opvpInitGS = InitGSWrapper; - } else { - tEntry.opvpInitGS = NULL; - } - tEntry.opvpSaveGS = apiEntry_0_2->SaveGS; - tEntry.opvpRestoreGS = apiEntry_0_2->RestoreGS; - if (apiEntry_0_2->QueryColorSpace != NULL) { - tEntry.opvpQueryColorSpace = QueryColorSpaceWrapper; - } else { - tEntry.opvpQueryColorSpace = NULL; - } - if (apiEntry_0_2->SetColorSpace != NULL) { - tEntry.opvpSetColorSpace = SetColorSpaceWrapper; - } else { - tEntry.opvpSetColorSpace = NULL; - } - if (apiEntry_0_2->GetColorSpace != NULL) { - tEntry.opvpGetColorSpace = GetColorSpaceWrapper; - } else { - tEntry.opvpGetColorSpace = NULL; - } + opdev->globals.apiEntry_0_2->GetCTM; + tEntry.opvpInitGS = NULL; + tEntry.opvpSaveGS = opdev->globals.apiEntry_0_2->SaveGS; + tEntry.opvpRestoreGS = opdev->globals.apiEntry_0_2->RestoreGS; + tEntry.opvpQueryColorSpace = NULL; + tEntry.opvpSetColorSpace = NULL; + tEntry.opvpGetColorSpace = NULL; + tEntry.opvpSetFillMode = (opvp_result_t (*)(opvp_dc_t,opvp_fillmode_t)) - apiEntry_0_2->SetFillMode; + opdev->globals.apiEntry_0_2->SetFillMode; tEntry.opvpGetFillMode = (opvp_result_t (*)(opvp_dc_t,opvp_fillmode_t*)) - apiEntry_0_2->GetFillMode; - tEntry.opvpSetAlphaConstant = apiEntry_0_2->SetAlphaConstant; - tEntry.opvpGetAlphaConstant = apiEntry_0_2->GetAlphaConstant; - tEntry.opvpSetLineWidth = apiEntry_0_2->SetLineWidth; - tEntry.opvpGetLineWidth = apiEntry_0_2->GetLineWidth; - if (apiEntry_0_2->SetLineDash != NULL) { - tEntry.opvpSetLineDash = SetLineDashWrapper; - } else { - tEntry.opvpSetLineDash = NULL; - } - if (apiEntry_0_2->GetLineDash != NULL) { - tEntry.opvpGetLineDash = GetLineDashWrapper; - } else { - tEntry.opvpGetLineDash = NULL; - } + opdev->globals.apiEntry_0_2->GetFillMode; + tEntry.opvpSetAlphaConstant = opdev->globals.apiEntry_0_2->SetAlphaConstant; + tEntry.opvpGetAlphaConstant = opdev->globals.apiEntry_0_2->GetAlphaConstant; + tEntry.opvpSetLineWidth = opdev->globals.apiEntry_0_2->SetLineWidth; + tEntry.opvpGetLineWidth = opdev->globals.apiEntry_0_2->GetLineWidth; + tEntry.opvpSetLineDash = NULL; + tEntry.opvpGetLineDash = NULL; + tEntry.opvpSetLineDashOffset - = apiEntry_0_2->SetLineDashOffset; + = opdev->globals.apiEntry_0_2->SetLineDashOffset; tEntry.opvpGetLineDashOffset - = apiEntry_0_2->GetLineDashOffset; + = opdev->globals.apiEntry_0_2->GetLineDashOffset; tEntry.opvpSetLineStyle = (opvp_result_t (*)(opvp_dc_t,opvp_linestyle_t)) - apiEntry_0_2->SetLineStyle; + opdev->globals.apiEntry_0_2->SetLineStyle; tEntry.opvpGetLineStyle = (opvp_result_t (*)(opvp_dc_t,opvp_linestyle_t*)) - apiEntry_0_2->GetLineStyle; + opdev->globals.apiEntry_0_2->GetLineStyle; tEntry.opvpSetLineCap = (opvp_result_t (*)(opvp_dc_t,opvp_linecap_t)) - apiEntry_0_2->SetLineCap; + opdev->globals.apiEntry_0_2->SetLineCap; tEntry.opvpGetLineCap = (opvp_result_t (*)(opvp_dc_t,opvp_linecap_t*)) - apiEntry_0_2->GetLineCap; + opdev->globals.apiEntry_0_2->GetLineCap; tEntry.opvpSetLineJoin = (opvp_result_t (*)(opvp_dc_t,opvp_linejoin_t)) - apiEntry_0_2->SetLineJoin; + opdev->globals.apiEntry_0_2->SetLineJoin; tEntry.opvpGetLineJoin = (opvp_result_t (*)(opvp_dc_t,opvp_linejoin_t*)) - apiEntry_0_2->GetLineJoin; - tEntry.opvpSetMiterLimit = apiEntry_0_2->SetMiterLimit; - tEntry.opvpGetMiterLimit = apiEntry_0_2->GetMiterLimit; + opdev->globals.apiEntry_0_2->GetLineJoin; + tEntry.opvpSetMiterLimit = opdev->globals.apiEntry_0_2->SetMiterLimit; + tEntry.opvpGetMiterLimit = opdev->globals.apiEntry_0_2->GetMiterLimit; tEntry.opvpSetPaintMode = (opvp_result_t (*)(opvp_dc_t,opvp_paintmode_t)) - apiEntry_0_2->SetPaintMode; + opdev->globals.apiEntry_0_2->SetPaintMode; tEntry.opvpGetPaintMode = (opvp_result_t (*)(opvp_dc_t,opvp_paintmode_t*)) - apiEntry_0_2->GetPaintMode; - if (apiEntry_0_2->SetStrokeColor != NULL) { - tEntry.opvpSetStrokeColor = SetStrokeColorWrapper; - } else { - tEntry.opvpSetStrokeColor = NULL; - } - if (apiEntry_0_2->SetFillColor != NULL) { - tEntry.opvpSetFillColor = SetFillColorWrapper; - } else { - tEntry.opvpSetFillColor = NULL; - } - if (apiEntry_0_2->SetBgColor != NULL) { - tEntry.opvpSetBgColor = SetBgColorWrapper; - } else { - tEntry.opvpSetBgColor = NULL; - } - tEntry.opvpNewPath = apiEntry_0_2->NewPath; - tEntry.opvpEndPath = apiEntry_0_2->EndPath; - tEntry.opvpStrokePath = apiEntry_0_2->StrokePath; - tEntry.opvpFillPath = apiEntry_0_2->FillPath; - tEntry.opvpStrokeFillPath = apiEntry_0_2->StrokeFillPath; + opdev->globals.apiEntry_0_2->GetPaintMode; + tEntry.opvpSetStrokeColor = NULL; + tEntry.opvpSetFillColor = NULL; + tEntry.opvpSetBgColor = NULL; + tEntry.opvpNewPath = opdev->globals.apiEntry_0_2->NewPath; + tEntry.opvpEndPath = opdev->globals.apiEntry_0_2->EndPath; + tEntry.opvpStrokePath = opdev->globals.apiEntry_0_2->StrokePath; + tEntry.opvpFillPath = opdev->globals.apiEntry_0_2->FillPath; + tEntry.opvpStrokeFillPath = opdev->globals.apiEntry_0_2->StrokeFillPath; tEntry.opvpSetClipPath = (opvp_result_t (*)(opvp_dc_t,opvp_cliprule_t)) - apiEntry_0_2->SetClipPath; - tEntry.opvpResetClipPath = apiEntry_0_2->ResetClipPath; - tEntry.opvpSetCurrentPoint = apiEntry_0_2->SetCurrentPoint; + opdev->globals.apiEntry_0_2->SetClipPath; + tEntry.opvpResetClipPath = opdev->globals.apiEntry_0_2->ResetClipPath; + tEntry.opvpSetCurrentPoint = opdev->globals.apiEntry_0_2->SetCurrentPoint; tEntry.opvpLinePath = (opvp_result_t (*)(opvp_dc_t, opvp_pathmode_t,opvp_int_t, const opvp_point_t*)) - apiEntry_0_2->LinePath; + opdev->globals.apiEntry_0_2->LinePath; tEntry.opvpPolygonPath = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_int_t*, const opvp_point_t*)) - apiEntry_0_2->PolygonPath; + opdev->globals.apiEntry_0_2->PolygonPath; tEntry.opvpRectanglePath = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_rectangle_t*)) - apiEntry_0_2->RectanglePath; + opdev->globals.apiEntry_0_2->RectanglePath; tEntry.opvpRoundRectanglePath = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_roundrectangle_t*)) - apiEntry_0_2->RoundRectanglePath; + opdev->globals.apiEntry_0_2->RoundRectanglePath; tEntry.opvpBezierPath = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_point_t*)) - apiEntry_0_2->BezierPath; + opdev->globals.apiEntry_0_2->BezierPath; tEntry.opvpArcPath = (opvp_result_t (*)(opvp_dc_t,opvp_arcmode_t, opvp_arcdir_t,opvp_fix_t,opvp_fix_t,opvp_fix_t, opvp_fix_t,opvp_fix_t,opvp_fix_t,opvp_fix_t, - opvp_fix_t))apiEntry_0_2->ArcPath; - if (apiEntry_0_2->DrawImage != NULL) { - tEntry.opvpDrawImage = DrawImageWrapper; - } else { - tEntry.opvpDrawImage = NULL; - } - if (apiEntry_0_2->StartDrawImage != NULL) { - tEntry.opvpStartDrawImage = StartDrawImageWrapper; - } else { - tEntry.opvpStartDrawImage = NULL; - } + opvp_fix_t))opdev->globals.apiEntry_0_2->ArcPath; + tEntry.opvpDrawImage = NULL; + tEntry.opvpStartDrawImage = NULL; tEntry.opvpTransferDrawImage = (opvp_result_t (*)(opvp_dc_t,opvp_int_t,const void*)) - apiEntry_0_2->TransferDrawImage; - if (apiEntry_0_2->EndDrawImage != NULL) { - tEntry.opvpEndDrawImage = EndDrawImageWrapper; - } else { - tEntry.opvpEndDrawImage = NULL; - } - tEntry.opvpStartScanline = apiEntry_0_2->StartScanline; + opdev->globals.apiEntry_0_2->TransferDrawImage; + tEntry.opvpEndDrawImage = NULL; + tEntry.opvpStartScanline = opdev->globals.apiEntry_0_2->StartScanline; tEntry.opvpScanline = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_int_t*)) - apiEntry_0_2->Scanline; - tEntry.opvpEndScanline = apiEntry_0_2->EndScanline; - tEntry.opvpStartRaster = apiEntry_0_2->StartRaster; + opdev->globals.apiEntry_0_2->Scanline; + tEntry.opvpEndScanline = opdev->globals.apiEntry_0_2->EndScanline; + tEntry.opvpStartRaster = opdev->globals.apiEntry_0_2->StartRaster; tEntry.opvpTransferRasterData = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const opvp_byte_t*)) - apiEntry_0_2->TransferRasterData; - tEntry.opvpSkipRaster = apiEntry_0_2->SkipRaster; - tEntry.opvpEndRaster = apiEntry_0_2->EndRaster; - tEntry.opvpStartStream = apiEntry_0_2->StartStream; + opdev->globals.apiEntry_0_2->TransferRasterData; + tEntry.opvpSkipRaster = opdev->globals.apiEntry_0_2->SkipRaster; + tEntry.opvpEndRaster = opdev->globals.apiEntry_0_2->EndRaster; + tEntry.opvpStartStream = opdev->globals.apiEntry_0_2->StartStream; tEntry.opvpTransferStreamData = (opvp_result_t (*)(opvp_dc_t,opvp_int_t, const void *)) - apiEntry_0_2->TransferStreamData; - tEntry.opvpEndStream = apiEntry_0_2->EndStream; + opdev->globals.apiEntry_0_2->TransferStreamData; + tEntry.opvpEndStream = opdev->globals.apiEntry_0_2->EndStream; *apiProcs = &tEntry; - GetLastError = GetLastError_0_2; + opdev->globals.GetLastError = GetLastError_0_2; } } return dc; } +/* Set of methods to separate the 0.2 and 1.0 calls AND deal with the prior use of globals */ +static opvp_result_t +gsopvpStartPage(gx_device* dev, opvp_dc_t printerContext, const opvp_char_t* pageInfo) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->StartPage) { + return StartPageWrapper(dev, printerContext, pageInfo); + } else if (opdev->globals.apiEntry->opvpStartPage) { + return opdev->globals.apiEntry->opvpStartPage(printerContext, pageInfo); + } else + return OPVP_FATALERROR; +} + +/* Not used +static opvp_result_t +gsopvpQueryDeviceCapability( + gx_device* dev, + opvp_dc_t printerContext, + opvp_queryinfoflags_t queryflag, + opvp_int_t* buflen, + opvp_char_t* infoBuf) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->QueryDeviceCapability) { + return QueryDeviceCapabilityWrapper(dev, printerContext, queryflag, buflen, infoBuf); + } else if (opdev->globals.apiEntry->opvpQueryDeviceCapability) { + return opdev->globals.apiEntry->opvpQueryDeviceCapability(printerContext, queryflag, buflen, infoBuf); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpQueryDeviceInfo( + gx_device* dev, + opvp_dc_t printerContext, + opvp_queryinfoflags_t queryflag, + opvp_int_t* buflen, + opvp_char_t* infoBuf) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->QueryDeviceCapability) { + return QueryDeviceInfoWrapper(dev, printerContext, queryflag, buflen, infoBuf); + } else if (opdev->globals.apiEntry->opvpQueryDeviceCapability) { + return opdev->globals.apiEntry->opvpQueryDeviceInfo(printerContext, queryflag, buflen, infoBuf); + } else + return OPVP_FATALERROR; +} +*/ + +static opvp_result_t +gsopvpInitGS(gx_device* dev, opvp_dc_t printerContext) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->InitGS) { + return InitGSWrapper(dev, printerContext); + } else if (opdev->globals.apiEntry->opvpInitGS) { + return opdev->globals.apiEntry->opvpInitGS(printerContext); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpQueryColorSpace(gx_device* dev, opvp_dc_t printerContext, opvp_int_t* pnum, + opvp_cspace_t* pcspace) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->QueryColorSpace) { + return QueryColorSpaceWrapper(dev, printerContext, pnum, pcspace); + } else if (opdev->globals.apiEntry->opvpQueryColorSpace) { + return opdev->globals.apiEntry->opvpQueryColorSpace(printerContext, pnum, pcspace); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpSetColorSpace(gx_device* dev, opvp_dc_t printerContext, opvp_cspace_t cspace) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->SetColorSpace) { + return SetColorSpaceWrapper(dev, printerContext, cspace); + } else if (opdev->globals.apiEntry->opvpQueryColorSpace) { + return opdev->globals.apiEntry->opvpSetColorSpace(printerContext, cspace); + } else + return OPVP_FATALERROR; +} + +/* Not used +static opvp_result_t +gsopvpGetColorSpace(gx_device* dev, opvp_dc_t printerContext, opvp_cspace_t* pcspace) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->GetColorSpace) { + return GetColorSpaceWrapper(dev, printerContext, pcspace); + } else if (opdev->globals.apiEntry->opvpGetColorSpace) { + return opdev->globals.apiEntry->opvpGetColorSpace(printerContext, pcspace); + } else + return OPVP_FATALERROR; +} +*/ + +static opvp_result_t +gsopvpSetLineDash(gx_device* dev, opvp_dc_t printerContext, opvp_int_t num, + const opvp_fix_t* pdash) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->SetLineDash) { + return SetLineDashWrapper(dev, printerContext, num, pdash); + } else if (opdev->globals.apiEntry->opvpSetLineDash) { + return opdev->globals.apiEntry->opvpSetLineDash(printerContext, num, pdash); + } else + return OPVP_FATALERROR; +} + +/* Not used +static opvp_result_t +gsopvpGetLineDash(gx_device* dev, opvp_dc_t printerContext, opvp_int_t* pnum, + opvp_fix_t* pdash) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->GetLineDash) { + return GetLineDashWrapper(dev, printerContext, pnum, pdash); + } else if (opdev->globals.apiEntry->opvpGetLineDash) { + return opdev->globals.apiEntry->opvpGetLineDash(printerContext, pnum, pdash); + } else + return OPVP_FATALERROR; +} +*/ + +static opvp_result_t +gsopvpSetStrokeColor(gx_device* dev, opvp_dc_t printerContext, const opvp_brush_t* brush) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->SetStrokeColor) { + return SetStrokeColorWrapper(dev, printerContext, brush); + } else if (opdev->globals.apiEntry->opvpSetStrokeColor) { + return opdev->globals.apiEntry->opvpSetStrokeColor(printerContext, brush); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpSetFillColor(gx_device* dev, opvp_dc_t printerContext, const opvp_brush_t* brush) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->SetFillColor) { + return SetFillColorWrapper(dev, printerContext, brush); + } else if (opdev->globals.apiEntry->opvpSetFillColor) { + return opdev->globals.apiEntry->opvpSetFillColor(printerContext, brush); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpSetBgColor(gx_device* dev, opvp_dc_t printerContext, const opvp_brush_t* brush) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->SetBgColor) { + return SetBgColorWrapper(dev, printerContext, brush); + } else if (opdev->globals.apiEntry->opvpSetBgColor) { + return opdev->globals.apiEntry->opvpSetBgColor(printerContext, brush); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpDrawImage( + gx_device* dev, + opvp_dc_t printerContext, + opvp_int_t sourceWidth, + opvp_int_t sourceHeight, + opvp_int_t sourcePitch, + opvp_imageformat_t imageFormat, + opvp_int_t destinationWidth, + opvp_int_t destinationHeight, + const void* imagedata) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->DrawImage) { + return DrawImageWrapper(dev, printerContext, sourceWidth, sourceHeight, + sourcePitch, imageFormat, destinationWidth, destinationHeight, imagedata); + } else if (opdev->globals.apiEntry->opvpDrawImage) { + return opdev->globals.apiEntry->opvpDrawImage(printerContext, sourceWidth, sourceHeight, + sourcePitch, imageFormat, destinationWidth, destinationHeight, imagedata); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpStartDrawImage( + gx_device* dev, + opvp_dc_t printerContext, + opvp_int_t sourceWidth, + opvp_int_t sourceHeight, + opvp_int_t sourcePitch, + opvp_imageformat_t imageFormat, + opvp_int_t destinationWidth, + opvp_int_t destinationHeight) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->StartDrawImage) { + return StartDrawImageWrapper(dev, printerContext, sourceWidth, sourceHeight, + sourcePitch, imageFormat, destinationWidth, destinationHeight); + } else if (opdev->globals.apiEntry->opvpStartDrawImage) { + return opdev->globals.apiEntry->opvpStartDrawImage(printerContext, sourceWidth, sourceHeight, + sourcePitch, imageFormat, destinationWidth, destinationHeight); + } else + return OPVP_FATALERROR; +} + +static opvp_result_t +gsopvpEndDrawImage(gx_device* dev, opvp_dc_t printerContext) +{ + gx_device_opvp* opdev = (gx_device_opvp*)dev; + + if (opdev->globals.apiEntry_0_2 != NULL && + opdev->globals.apiEntry_0_2->EndDrawImage) { + return EndDrawImageWrapper(dev, printerContext); + } else if (opdev->globals.apiEntry->opvpEndDrawImage) { + return opdev->globals.apiEntry->opvpEndDrawImage(printerContext); + } else + return OPVP_FATALERROR; +} + /* for image */ static const gx_image_enum_procs_t opvp_image_enum_procs = @@ -1169,27 +1456,28 @@ typedef struct bbox_image_enum_s { /* initialize Graphic State */ /* No defaults in OPVP 1.0 */ static int -InitGS(void) +InitGS(gx_device* dev) { - if (apiEntry->opvpInitGS != NULL) { - if (apiEntry->opvpInitGS(printerContext) != OPVP_OK) { - return -1; - } + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + if (gsopvpInitGS(dev, opdev->globals.printerContext) != OPVP_OK) { + return -1; } - if (apiEntry->opvpSetColorSpace != NULL) { - if (apiEntry->opvpSetColorSpace(printerContext,colorSpace) - != OPVP_OK) { + + if (opdev->globals.apiEntry->opvpSetColorSpace != NULL) { + if (opdev->globals.apiEntry->opvpSetColorSpace(opdev->globals.printerContext, + opdev->globals.colorSpace) != OPVP_OK){ return -1; } } - if (apiEntry->opvpSetPaintMode != NULL) { - if (apiEntry->opvpSetPaintMode(printerContext, + if (opdev->globals.apiEntry->opvpSetPaintMode != NULL) { + if (opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_TRANSPARENT) != OPVP_OK) { return -1; } } - if (apiEntry->opvpSetAlphaConstant != NULL) { - if (apiEntry->opvpSetAlphaConstant(printerContext,1.0) + if (opdev->globals.apiEntry->opvpSetAlphaConstant != NULL) { + if (opdev->globals.apiEntry->opvpSetAlphaConstant(opdev->globals.printerContext,1.0) != OPVP_OK) { return -1; } @@ -1205,20 +1493,20 @@ opvp_startpage(gx_device *dev) int ecode = 0; opvp_result_t r = -1; static char *page_info = NULL; + gx_device_opvp *opdev = (gx_device_opvp*)dev; /* page info */ page_info = opvp_alloc_string(&page_info, OPVP_INFO_PREFIX); page_info = opvp_cat_string(&page_info, opvp_gen_page_info(dev)); /* call StartPage */ - if (printerContext != -1) { - if (apiEntry->opvpStartPage) - r = apiEntry->opvpStartPage(printerContext, - (opvp_char_t *)opvp_to_utf8(page_info)); + if (opdev->globals.printerContext != -1) { + r = gsopvpStartPage(dev, opdev->globals.printerContext, + (opvp_char_t*)opvp_to_utf8(page_info)); if (r != OPVP_OK) { ecode = -1; } else { - ecode = InitGS(); + ecode = InitGS(dev); } } @@ -1226,15 +1514,16 @@ opvp_startpage(gx_device *dev) } static int -opvp_endpage(void) +opvp_endpage(gx_device* dev) { int ecode = 0; opvp_result_t r = -1; + gx_device_opvp *opdev = (gx_device_opvp*)dev; /* call EndPage */ - if (printerContext != -1) { - if (apiEntry->opvpEndPage) - r = apiEntry->opvpEndPage(printerContext); + if (opdev->globals.printerContext != -1) { + if (opdev->globals.apiEntry->opvpEndPage) + r = opdev->globals.apiEntry->opvpEndPage(opdev->globals.printerContext); if (r != OPVP_OK) { ecode = -1; } @@ -1306,32 +1595,33 @@ opvp_adjust_num_string(char *num_string) } static char ** -opvp_gen_dynamic_lib_name(void) +opvp_gen_dynamic_lib_name(gx_device* dev) { static char *buff[5] = {NULL,NULL,NULL,NULL,NULL}; char tbuff[OPVP_BUFF_SIZE]; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if (!vectorDriver) { + if (!(opdev->globals.vectorDriver)) { return NULL; } memset((void*)tbuff, 0, OPVP_BUFF_SIZE); - strncpy(tbuff, vectorDriver, OPVP_BUFF_SIZE - 1); + strncpy(tbuff, opdev->globals.vectorDriver, OPVP_BUFF_SIZE - 1); opvp_alloc_string(&(buff[0]), tbuff); memset((void*)tbuff, 0, OPVP_BUFF_SIZE); - strncpy(tbuff, vectorDriver, OPVP_BUFF_SIZE - 4); + strncpy(tbuff, opdev->globals.vectorDriver, OPVP_BUFF_SIZE - 4); strcat(tbuff, ".so"); opvp_alloc_string(&(buff[1]), tbuff); memset((void*)tbuff, 0, OPVP_BUFF_SIZE); - strncpy(tbuff, vectorDriver, OPVP_BUFF_SIZE - 5); + strncpy(tbuff, opdev->globals.vectorDriver, OPVP_BUFF_SIZE - 5); strcat(tbuff, ".dll"); opvp_alloc_string(&(buff[2]), tbuff); memset((void*)tbuff, 0, OPVP_BUFF_SIZE); strcpy(tbuff, "lib"); - strncat(tbuff, vectorDriver, OPVP_BUFF_SIZE - 7); + strncat(tbuff, opdev->globals.vectorDriver, OPVP_BUFF_SIZE - 7); strcat(tbuff, ".so"); opvp_alloc_string(&(buff[3]), tbuff); @@ -1389,7 +1679,7 @@ opvp_to_utf8(char *string) } static float -opvp_fabsf(float f) +opvp_fabsf(gx_device* dev, float f) { return (float)fabs((double)f); } @@ -1431,7 +1721,7 @@ opvp_get_papertable_index(gx_device *pdev) paper = i; match = true; break; - } else if ((f = opvp_fabsf(height - paper_h)) < TOLERANCE) { + } else if ((f = opvp_fabsf(pdev, height - paper_h)) < TOLERANCE) { if (f < h_delta) { h_delta = f; candidate = i; @@ -1444,14 +1734,14 @@ opvp_get_papertable_index(gx_device *pdev) } else if (prev != paper_w) { prev = paper_w; if (paper_w < width) { - if ((f = opvp_fabsf(width - paper_w)) < TOLERANCE) { + if ((f = opvp_fabsf(pdev, width - paper_w)) < TOLERANCE) { if (f < sw_delta) { sw_delta = f; smaller = i; } } } else { - if ((f = opvp_fabsf(width - paper_w)) < TOLERANCE) { + if ((f = opvp_fabsf(pdev, width - paper_w)) < TOLERANCE) { if (f < lw_delta) { lw_delta = f; larger = i; @@ -1470,7 +1760,7 @@ opvp_get_papertable_index(gx_device *pdev) sh_delta = 0; s_candi = i; break; - } else if ((f = opvp_fabsf(height - paper_h)) < TOLERANCE) { + } else if ((f = opvp_fabsf(pdev, height - paper_h)) < TOLERANCE) { if (f < sh_delta) { sh_delta = f; s_candi = i; @@ -1486,7 +1776,7 @@ opvp_get_papertable_index(gx_device *pdev) lh_delta = 0; l_candi = i; break; - } else if ((f = opvp_fabsf(height - paper_h)) < TOLERANCE) { + } else if ((f = opvp_fabsf(pdev, height - paper_h)) < TOLERANCE) { if (f < lh_delta) { lh_delta = f; l_candi = i; @@ -1562,8 +1852,8 @@ opvp_get_mediasize(gx_device *pdev) (strcmp(region, "oe" ) == 0)) { unit = "in"; } else { - width *= MMPI; - height *= MMPI; + width *= (float) MMPI; + height *= (float) MMPI; unit = "mm"; } } else { @@ -1593,9 +1883,10 @@ opvp_gen_page_info(gx_device *dev) int num_copies = 1; bool landscape; char tbuff[OPVP_BUFF_SIZE]; + gx_device_opvp *opdev = (gx_device_opvp*)dev; /* copies */ - if (!inkjet) { + if (!(opdev->globals.inkjet)) { if (dev->IgnoreNumCopies) { num_copies = 1; } else if (dev->NumCopies_set > 0) { @@ -1644,14 +1935,13 @@ opvp_set_brush_color(gx_device_opvp *pdev, gx_color_index color, ecode = -1; } else { #if ENABLE_SIMPLE_MODE - brush->colorSpace = colorSpace; + brush->colorSpace = pdev->globals.colorSpace; #else opvp_result_t r = -1; /* call GetColorSpace */ - if (apiEntry->opvpGetColorSpace) { - r = apiEntry->opvpGetColorSpace(printerContext, - &(brush->colorSpace)); - } + + r = gsopvpGetColorSpace((gx_device*)pdev, printerContext, + &(brush->colorSpace)); if (r != OPVP_OK) { brush->colorSpace = OPVP_CSPACE_DEVICEKRGB; } @@ -1669,7 +1959,7 @@ opvp_set_brush_color(gx_device_opvp *pdev, gx_color_index color, static int opvp_draw_image( - gx_device_opvp *pdev, + gx_device_opvp *opdev, int depth, int sw, int sh, @@ -1684,35 +1974,36 @@ opvp_draw_image( int count; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* image size */ count = raster * sh; /* call DrawImage */ - if (apiEntry->opvpDrawImage) { - r = apiEntry->opvpDrawImage(printerContext, - sw,sh, - raster, - mask ? OPVP_IFORMAT_MASK : OPVP_IFORMAT_RAW, - dw,dh, - /* discard 'const' qualifier */ - (void *)data); - } + r = gsopvpDrawImage((gx_device*) opdev, + opdev->globals.printerContext, + sw,sh, + raster, + mask ? OPVP_IFORMAT_MASK : OPVP_IFORMAT_RAW, + dw,dh, + /* discard 'const' qualifier */ + (void *)data); + if (r != OPVP_OK) { /* call StartDrawImage */ - if (apiEntry->opvpStartDrawImage) { - r = apiEntry->opvpStartDrawImage(printerContext, - sw,sh, - raster, - mask ? OPVP_IFORMAT_MASK : OPVP_IFORMAT_RAW, - dw,dh); - } + r = gsopvpStartDrawImage((gx_device*)opdev, + opdev->globals.printerContext, + sw,sh, + raster, + mask ? OPVP_IFORMAT_MASK : OPVP_IFORMAT_RAW, + dw,dh); + if (r == OPVP_OK) { /* call TansferDrawImage */ - if (apiEntry->opvpTransferDrawImage) { - r = apiEntry->opvpTransferDrawImage( - printerContext, + if (opdev->globals.apiEntry->opvpTransferDrawImage) { + r = opdev->globals.apiEntry->opvpTransferDrawImage( + opdev->globals.printerContext, count, /* discard 'const' qualifier */ (void *)data); @@ -1720,9 +2011,8 @@ opvp_draw_image( if (r != OPVP_OK) ecode = -1; /* call EndDrawImage */ - if (apiEntry->opvpEndDrawImage) { - apiEntry->opvpEndDrawImage(printerContext); - } + gsopvpEndDrawImage((gx_device*)opdev, opdev->globals.printerContext); + } else { ecode = 0; /* continue... */ } @@ -1737,48 +2027,49 @@ opvp_draw_image( * load vector-driver */ static int -opvp_load_vector_driver(void) +opvp_load_vector_driver(gx_device* dev) { char **list = NULL; int i; void *h; + gx_device_opvp *opdev = (gx_device_opvp*)dev; - if (handle) { - opvp_unload_vector_driver(); + if (opdev->globals.handle) { + opvp_unload_vector_driver(dev); } - if (vectorDriver) { - list = opvp_gen_dynamic_lib_name(); + if (opdev->globals.vectorDriver) { + list = opvp_gen_dynamic_lib_name(dev); } if (list) { i = 0; while (list[i]) { if ((h = dlopen(list[i],RTLD_NOW))) { - OpenPrinter = dlsym(h,"opvpOpenPrinter"); - ErrorNo = dlsym(h,"opvpErrorNo"); - if (OpenPrinter && ErrorNo) { - handle = h; + opdev->globals.OpenPrinter = dlsym(h,"opvpOpenPrinter"); + opdev->globals.ErrorNo = dlsym(h,"opvpErrorNo"); + if (opdev->globals.OpenPrinter && opdev->globals.ErrorNo) { + opdev->globals.handle = h; break; } - OpenPrinter = NULL; - ErrorNo = NULL; + opdev->globals.OpenPrinter = NULL; + opdev->globals.ErrorNo = NULL; /* try version 0.2 driver */ - OpenPrinter_0_2 = dlsym(h,"OpenPrinter"); - ErrorNo = dlsym(h,"errorno"); - if (OpenPrinter_0_2 && ErrorNo) { - handle = h; + opdev->globals.OpenPrinter_0_2 = dlsym(h,"OpenPrinter"); + opdev->globals.ErrorNo = dlsym(h,"errorno"); + if (opdev->globals.OpenPrinter_0_2 && opdev->globals.ErrorNo) { + opdev->globals.handle = h; break; } - OpenPrinter_0_2 = NULL; - ErrorNo = NULL; + opdev->globals.OpenPrinter_0_2 = NULL; + opdev->globals.ErrorNo = NULL; dlclose(h); } i++; } } - if (handle) { + if (opdev->globals.handle) { return 0; } else { return -1; @@ -1789,13 +2080,15 @@ opvp_load_vector_driver(void) * unload vector-driver */ static int -opvp_unload_vector_driver(void) +opvp_unload_vector_driver(gx_device* dev) { - if (handle) { - dlclose(handle); - handle = NULL; - OpenPrinter = NULL; - ErrorNo = NULL; + gx_device_opvp *opdev = (gx_device_opvp*)dev; + + if (opdev->globals.handle) { + dlclose(opdev->globals.handle); + opdev->globals.handle = NULL; + opdev->globals.OpenPrinter = NULL; + opdev->globals.ErrorNo = NULL; } return 0; } @@ -1812,6 +2105,7 @@ prepare_open(gx_device *dev) int dumFD = -1; opvp_dc_t dumContext = -1; opvp_cspace_t cspace = OPVP_CSPACE_STANDARDRGB; + gx_device_opvp *opdev = (gx_device_opvp*) dev; /* open dummy device */ code = open("/dev/null", O_RDWR); @@ -1820,19 +2114,19 @@ prepare_open(gx_device *dev) /* load vector driver */ if (!ecode) { - if ((code = opvp_load_vector_driver())) { + if ((code = opvp_load_vector_driver(dev))) { ecode = code; } } /* prepare array of function pointer for PDAPI */ if (!ecode) { - if (!apiEntry) { - if (!(apiEntry = calloc(sizeof(opvp_api_procs_t), 1))) { + if (!(opdev->globals.apiEntry)) { + if (!(opdev->globals.apiEntry = calloc(sizeof(opvp_api_procs_t), 1))) { ecode = -1; } } else { - memset(apiEntry, 0, sizeof(opvp_api_procs_t)); + memset(opdev->globals.apiEntry, 0, sizeof(opvp_api_procs_t)); } } @@ -1844,8 +2138,8 @@ prepare_open(gx_device *dev) /* require version 1.0 */ apiVersion[0] = 1; apiVersion[1] = 0; - dc = OpenPrinterWrapper(dumFD, (opvp_char_t *)printerModel, - apiVersion,&api_entry); + dc = OpenPrinterWrapper(dev, dumFD, (opvp_char_t *)(opdev->globals.printerModel), + apiVersion, &api_entry); if (dc == -1) { ecode = -1; } else { @@ -1855,33 +2149,33 @@ prepare_open(gx_device *dev) /* set apiEntry */ if (!ecode) { - nApiEntry = sizeof(opvp_api_procs_t)/sizeof(void *); - memcpy(apiEntry, api_entry, nApiEntry*sizeof(void *)); + opdev->globals.nApiEntry = sizeof(opvp_api_procs_t)/sizeof(void *); + memcpy(opdev->globals.apiEntry, api_entry, opdev->globals.nApiEntry*sizeof(void *)); } else { - if (apiEntry) free(apiEntry); - apiEntry = NULL; + if (opdev->globals.apiEntry) free(opdev->globals.apiEntry); + opdev->globals.apiEntry = NULL; } /* check vector fucntion */ - if (apiEntry) { - if (!inkjet) { - if (!(apiEntry->opvpNewPath) || - !(apiEntry->opvpEndPath) || - !(apiEntry->opvpStrokePath) || - !(apiEntry->opvpSetCurrentPoint) || - !(apiEntry->opvpLinePath) || - !(apiEntry->opvpBezierPath)) { + if (opdev->globals.apiEntry) { + if (!(opdev->globals.inkjet)) { + if (!(opdev->globals.apiEntry->opvpNewPath) || + !(opdev->globals.apiEntry->opvpEndPath) || + !(opdev->globals.apiEntry->opvpStrokePath) || + !(opdev->globals.apiEntry->opvpSetCurrentPoint) || + !(opdev->globals.apiEntry->opvpLinePath) || + !(opdev->globals.apiEntry->opvpBezierPath)) { /* NOT avail vector drawing mode */ - vector = false; + opdev->globals.vector = false; } } /* call GetColorSpace */ - if (apiEntry->opvpGetColorSpace) { - (void)apiEntry->opvpGetColorSpace(dumContext, &cspace); + if (opdev->globals.apiEntry->opvpGetColorSpace) { + (void)(opdev->globals.apiEntry->opvpGetColorSpace)(dumContext, &cspace); } if (cspace == OPVP_CSPACE_BW) { /* mono-color */ - colorSpace = cspace; + opdev->globals.colorSpace = cspace; dev->color_info.num_components = 1; dev->color_info.depth = 1; dev->color_info.max_gray = 0; @@ -1890,7 +2184,7 @@ prepare_open(gx_device *dev) dev->color_info.dither_colors = 1; } else if (cspace == OPVP_CSPACE_DEVICEGRAY) { /* gray-scale */ - colorSpace = cspace; + opdev->globals.colorSpace = cspace; dev->color_info.num_components = 1; dev->color_info.depth = 8; dev->color_info.max_gray = 255; @@ -1899,7 +2193,7 @@ prepare_open(gx_device *dev) dev->color_info.dither_colors = 256; } else { /* rgb color */ - colorSpace = OPVP_CSPACE_STANDARDRGB; + opdev->globals.colorSpace = OPVP_CSPACE_STANDARDRGB; dev->color_info.num_components = 3; dev->color_info.depth = 24; dev->color_info.max_gray = 255; @@ -1915,8 +2209,8 @@ prepare_open(gx_device *dev) /* call Closerinter as dummy */ if (dumContext != -1) { /* call ClosePrinter */ - if (apiEntry->opvpClosePrinter) { - apiEntry->opvpClosePrinter(dumContext); + if (opdev->globals.apiEntry->opvpClosePrinter) { + opdev->globals.apiEntry->opvpClosePrinter(dumContext); } dumContext = -1; } @@ -1928,7 +2222,7 @@ prepare_open(gx_device *dev) } /* un-load vector driver */ - opvp_unload_vector_driver(); + opvp_unload_vector_driver(dev); return ecode; } @@ -1963,51 +2257,52 @@ opvp_open(gx_device *dev) } /* set margins */ - if (zoomAuto) { - margin_width = (margins[0] + margins[2]) + if (pdev->globals.zoomAuto) { + margin_width = (pdev->globals.margins[0] + pdev->globals.margins[2]) * dev->HWResolution[0]; - margin_height = (margins[1] + margins[3]) + margin_height = (pdev->globals.margins[1] + pdev->globals.margins[3]) * dev->HWResolution[1]; - zoom[0] = (dev->width - margin_width) / dev->width; - zoom[1] = (dev->height - margin_height) / dev->height; - if (zoom[0] < zoom[1]) { - zoom[1] = zoom[0]; + pdev->globals.zoom[0] = (dev->width - margin_width) / dev->width; + pdev->globals.zoom[1] = (dev->height - margin_height) / dev->height; + if (pdev->globals.zoom[0] < pdev->globals.zoom[1]) { + pdev->globals.zoom[1] = pdev->globals.zoom[0]; } else { - zoom[0] = zoom[1]; + pdev->globals.zoom[0] = pdev->globals.zoom[1]; } } - if (inkjet) { - if ((margins[0] != 0) || - (margins[1] != 0) || (margins[3] != 0)) { - shift[0] = margins[0] * dev->HWResolution[0]; - shift[1] = (margins[1] + margins[3]) + if (pdev->globals.inkjet) { + if ((pdev->globals.margins[0] != 0) || + (pdev->globals.margins[1] != 0) || (pdev->globals.margins[3] != 0)) { + pdev->globals.shift[0] = pdev->globals.margins[0] * dev->HWResolution[0]; + pdev->globals.shift[1] = (pdev->globals.margins[1] + pdev->globals.margins[3]) * dev->HWResolution[1]; - zooming = true; + pdev->globals.zooming = true; } - dev->width -= margins[2] * dev->HWResolution[0]; - dev->height -= margins[1] * dev->HWResolution[1]; + dev->width -= (int) (pdev->globals.margins[2] * dev->HWResolution[0]); + dev->height -= (int) (pdev->globals.margins[1] * dev->HWResolution[1]); } else { - if ((margins[0] != 0) || (margins[1] != 0)) { - shift[0] = margins[0] * dev->HWResolution[0]; - shift[1] = margins[3] * dev->HWResolution[1]; - zooming = true; + if ((pdev->globals.margins[0] != 0) || (pdev->globals.margins[1] != 0)) { + pdev->globals.shift[0] = pdev->globals.margins[0] * dev->HWResolution[0]; + pdev->globals.shift[1] = pdev->globals.margins[3] * dev->HWResolution[1]; + pdev->globals.zooming = true; } adj_margins[0] = 0; adj_margins[3] = 0; - adj_margins[1] = dev->height * zoom[1] / dev->HWResolution[1] + adj_margins[1] = dev->height * pdev->globals.zoom[1] / dev->HWResolution[1] - (dev->MediaSize[1] / PS_DPI - - (margins[1] + margins[3])); + - (pdev->globals.margins[1] + pdev->globals.margins[3])); if (adj_margins[1] < 0) adj_margins[0] = 0; - adj_margins[2] = dev->width * zoom[0] / dev->HWResolution[0] + adj_margins[2] = dev->width * pdev->globals.zoom[0] / dev->HWResolution[0] - (dev->MediaSize[0] / PS_DPI - - (margins[0] + margins[2])); + - (pdev->globals.margins[0] + pdev->globals.margins[2])); if (adj_margins[2] < 0) adj_margins[2] = 0; gx_device_set_margins(dev, adj_margins, true); } - if ((zoom[0] != 1) || (zoom[1] != 1)) zooming = true; + if ((pdev->globals.zoom[0] != 1) || (pdev->globals.zoom[1] != 1)) + pdev->globals.zooming = true; /* open file for output device */ - if (!inkjet) { + if (!(pdev->globals.inkjet)) { pdev->v_memory = gs_memory_stable(pdev->memory); /* open output stream */ code = gdev_vector_open_file_options((gx_device_vector*)dev, @@ -2029,7 +2324,7 @@ opvp_open(gx_device *dev) pdev->bbox_device->memory = gs_memory_stable(dev->memory); } } - outputFD = fileno(gp_get_file(pdev->file)); + pdev->globals.outputFD = fileno(gp_get_file(pdev->file)); } else { /* open printer device */ code = gdev_prn_open(dev); @@ -2046,13 +2341,13 @@ opvp_open(gx_device *dev) if (code < 0) { return code; } - outputFD = fileno(gp_get_file(rdev->file)); + pdev->globals.outputFD = fileno(gp_get_file(rdev->file)); } - if (outputFD < 0) - return outputFD; + if (pdev->globals.outputFD < 0) + return pdev->globals.outputFD; /* RE-load vector driver */ - if ((code = opvp_load_vector_driver())) { + if ((code = opvp_load_vector_driver(dev))) { return code; } @@ -2060,44 +2355,48 @@ opvp_open(gx_device *dev) /* require version 1.0 */ apiVersion[0] = 1; apiVersion[1] = 0; - dc = OpenPrinterWrapper(outputFD,(opvp_char_t *)printerModel, + dc = OpenPrinterWrapper(dev, pdev->globals.outputFD, (opvp_char_t *)pdev->globals.printerModel, apiVersion,&api_entry); - if (!apiEntry) { - if (!(apiEntry = calloc(sizeof(opvp_api_procs_t), 1))) { + if (!(pdev->globals.apiEntry)) { + if (!(pdev->globals.apiEntry = calloc(sizeof(opvp_api_procs_t), 1))) { ecode = -1; } } else { - memset(apiEntry, 0, sizeof(opvp_api_procs_t)); + memset(pdev->globals.apiEntry, 0, sizeof(opvp_api_procs_t)); } if (dc == -1) { ecode = -1; - if (apiEntry) free(apiEntry); - apiEntry = NULL; - opvp_unload_vector_driver(); - if (inkjet) gdev_prn_close(dev); + if (pdev->globals.apiEntry) + free(pdev->globals.apiEntry); + pdev->globals.apiEntry = NULL; + opvp_unload_vector_driver(dev); + if (pdev->globals.inkjet) + gdev_prn_close(dev); else gdev_vector_close_file((gx_device_vector *)pdev); return ecode; } - printerContext = dc; - nApiEntry = sizeof(opvp_api_procs_t)/sizeof(void *); - memcpy(apiEntry, api_entry, nApiEntry*sizeof(void *)); + pdev->globals.printerContext = dc; + pdev->globals.nApiEntry = sizeof(opvp_api_procs_t)/sizeof(void *); + memcpy(pdev->globals.apiEntry, api_entry, pdev->globals.nApiEntry*sizeof(void *)); /* initialize */ - if ((!ecode) && (!inkjet)) { + if ((!ecode) && (!(pdev->globals.inkjet))) { pdev->vec_procs = &opvp_vector_procs; - if (vector) gdev_vector_init((gx_device_vector *)pdev); + if (pdev->globals.vector) + gdev_vector_init((gx_device_vector *)pdev); } - if (apiEntry->opvpQueryColorSpace) { + if (pdev->globals.apiEntry->opvpQueryColorSpace || + pdev->globals.apiEntry_0_2->QueryColorSpace) { int n = sizeof(cspace_available); int nn = n; opvp_cspace_t *p = malloc(n*sizeof(opvp_cspace_t)); - if ((r = apiEntry->opvpQueryColorSpace(printerContext,&nn,p)) + if ((r = gsopvpQueryColorSpace(dev, pdev->globals.printerContext,&nn,p)) == OPVP_PARAMERROR && nn > n) { /* realloc buffer and retry */ p = realloc(p,nn*sizeof(opvp_cspace_t)); - r = apiEntry->opvpQueryColorSpace(printerContext,&nn,p); + r = gsopvpQueryColorSpace(dev, pdev->globals.printerContext,&nn,p); } if (r == OPVP_OK) { int i; @@ -2113,12 +2412,12 @@ opvp_open(gx_device *dev) /* start job */ if (!ecode) { /* job info */ - if (jobInfo) { - if (strlen(jobInfo) > 0) { - job_info = opvp_alloc_string(&job_info,jobInfo); + if (pdev->globals.jobInfo) { + if (strlen(pdev->globals.jobInfo) > 0) { + job_info = opvp_alloc_string(&job_info, pdev->globals.jobInfo); } } - tmp_info = opvp_alloc_string(&tmp_info,opvp_gen_job_info(dev)); + tmp_info = opvp_alloc_string(&tmp_info, opvp_gen_job_info(dev)); if (tmp_info) { if (strlen(tmp_info) > 0) { if (job_info) { @@ -2132,8 +2431,8 @@ opvp_open(gx_device *dev) } /* call StartJob */ - if (apiEntry->opvpStartJob) { - r = apiEntry->opvpStartJob(printerContext, + if (pdev->globals.apiEntry->opvpStartJob) { + r = pdev->globals.apiEntry->opvpStartJob(pdev->globals.printerContext, (opvp_char_t *)opvp_to_utf8(job_info)); } if (r != OPVP_OK) { @@ -2144,9 +2443,9 @@ opvp_open(gx_device *dev) /* start doc */ if (!ecode) { /* doc info */ - if (docInfo) { - if (strlen(docInfo) > 0) { - doc_info = opvp_alloc_string(&doc_info,docInfo); + if (pdev->globals.docInfo) { + if (strlen(pdev->globals.docInfo) > 0) { + doc_info = opvp_alloc_string(&doc_info, pdev->globals.docInfo); } } tmp_info = opvp_alloc_string(&tmp_info, opvp_gen_doc_info(dev)); @@ -2163,8 +2462,8 @@ opvp_open(gx_device *dev) } /* call StartDoc */ - if (apiEntry->opvpStartDoc) { - r = apiEntry->opvpStartDoc(printerContext, + if (pdev->globals.apiEntry->opvpStartDoc) { + r = pdev->globals.apiEntry->opvpStartDoc(pdev->globals.printerContext, (opvp_char_t *)opvp_to_utf8(doc_info)); } if (r != OPVP_OK) { @@ -2185,9 +2484,11 @@ opvp_open(gx_device *dev) static int oprp_open(gx_device *dev) { + gx_device_opvp *opdev = (gx_device_opvp*) dev; + /* set inkjet mode */ - vector = false; - inkjet = true; + opdev->globals.vector = false; + opdev->globals.inkjet = true; /* matrix */ dev->procs.get_initial_matrix = opvp_get_initial_matrix; @@ -2200,24 +2501,24 @@ oprp_open(gx_device *dev) static void opvp_get_initial_matrix(gx_device *dev, gs_matrix *pmat) { - gx_device_opvp *pdev = (gx_device_opvp *)dev; + gx_device_opvp * opdev = (gx_device_opvp *)dev; opvp_ctm_t omat; gx_default_get_initial_matrix(dev,pmat); - if (zooming) { + if (opdev->globals.zooming) { /* gs matrix */ - pmat->xx *= zoom[0]; - pmat->xy *= zoom[1]; - pmat->yx *= zoom[0]; - pmat->yy *= zoom[1]; - pmat->tx = pmat->tx * zoom[0] + shift[0]; - pmat->ty = pmat->ty * zoom[1] + shift[1]; + pmat->xx *= opdev->globals.zoom[0]; + pmat->xy *= opdev->globals.zoom[1]; + pmat->yx *= opdev->globals.zoom[0]; + pmat->yy *= opdev->globals.zoom[1]; + pmat->tx = pmat->tx * opdev->globals.zoom[0] + opdev->globals.shift[0]; + pmat->ty = pmat->ty * opdev->globals.zoom[1] + opdev->globals.shift[1]; } - if (pdev->is_open) { + if (opdev->is_open) { /* call ResetCTM */ - if (apiEntry->opvpResetCTM) { - apiEntry->opvpResetCTM(printerContext); + if (opdev->globals.apiEntry->opvpResetCTM) { + opdev->globals.apiEntry->opvpResetCTM(opdev->globals.printerContext); } else { /* call SetCTM */ omat.a = 1; @@ -2226,8 +2527,8 @@ opvp_get_initial_matrix(gx_device *dev, gs_matrix *pmat) omat.d = 1; omat.e = 0; omat.f = 0; - if (apiEntry->opvpSetCTM) { - apiEntry->opvpSetCTM(printerContext, &omat); + if (opdev->globals.apiEntry->opvpSetCTM) { + opdev->globals.apiEntry->opvpSetCTM(opdev->globals.printerContext, &omat); } } } @@ -2241,30 +2542,32 @@ opvp_get_initial_matrix(gx_device *dev, gs_matrix *pmat) static int opvp_output_page(gx_device *dev, int num_copies, int flush) { - gx_device_opvp *pdev = (gx_device_opvp *)dev; + gx_device_opvp *opdev = (gx_device_opvp *)dev; int ecode = 0; int code = -1; - if (inkjet) return gdev_prn_output_page(dev, num_copies, flush); + if (opdev->globals.inkjet) + return gdev_prn_output_page(dev, num_copies, flush); #ifdef OPVP_IGNORE_BLANK_PAGE if (pdev->in_page) { #else /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; #endif /* end page */ - code = opvp_endpage(); + code = opvp_endpage(dev); if (code) ecode = code; - pdev->in_page = false; - beginPage = false; + opdev->in_page = false; + opdev->globals.beginPage = false; #ifdef OPVP_IGNORE_BLANK_PAGE } #endif - if (vector) { - gdev_vector_reset((gx_device_vector *)pdev); + if (opdev->globals.vector) { + gdev_vector_reset((gx_device_vector *)dev); } code = gx_finish_output_page(dev, num_copies, flush); @@ -2291,6 +2594,7 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) int rasterWidth; bool start_page = false; bool start_raster = false; + gx_device_opvp *opdev = (gx_device_opvp*)pdev; #if ENABLE_SKIP_RASTER int i; byte check; @@ -2319,8 +2623,8 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) /* call StartRaster */ if (!ecode) { - if (apiEntry->opvpStartRaster) { - r = apiEntry->opvpStartRaster(printerContext,rasterWidth); + if (opdev->globals.apiEntry->opvpStartRaster) { + r = opdev->globals.apiEntry->opvpStartRaster(opdev->globals.printerContext,rasterWidth); } if (r != OPVP_OK) { ecode = r; @@ -2341,7 +2645,7 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) } #if ENABLE_SKIP_RASTER /* check support SkipRaster */ - if (apiEntry->opvpSkipRaster) { + if (opdev->globals.apiEntry->opvpSkipRaster) { /* check all white */ if (pdev->color_info.depth > 8) { for (check = 0xff, i = 0; i < raster_size; i++) @@ -2351,7 +2655,7 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) } /* if all white call SkipRaster */ if (check == 0xff) { - r = apiEntry->opvpSkipRaster(printerContext, 1); + r = opdev->globals.apiEntry->opvpSkipRaster(opdev->globals.printerContext, 1); if (r == OPVP_OK) continue; } } else { @@ -2361,27 +2665,29 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) } /* if all zero call SkipRaster */ if (check) { - r = apiEntry->opvpSkipRaster(printerContext, 1); - if (r == OPVP_OK) continue; + r = opdev->globals.apiEntry->opvpSkipRaster(opdev->globals.printerContext, 1); + if (r == OPVP_OK) + continue; } } } #endif /* call TransferRasterData */ if (!ecode) { - if (apiEntry->opvpTransferRasterData) { - r = apiEntry->opvpTransferRasterData(printerContext, + if (opdev->globals.apiEntry->opvpTransferRasterData) { + r = opdev->globals.apiEntry->opvpTransferRasterData(opdev->globals.printerContext, raster_size, data); } - if (r != OPVP_OK) ecode = r; + if (r != OPVP_OK) + ecode = r; } } /* call EndRaster */ if (start_raster) { - if (apiEntry->opvpEndRaster) { - r = apiEntry->opvpEndRaster(printerContext); + if (opdev->globals.apiEntry->opvpEndRaster) { + r = opdev->globals.apiEntry->opvpEndRaster(opdev->globals.printerContext); } if (r != OPVP_OK) ecode = r; start_raster = false; @@ -2389,7 +2695,7 @@ oprp_print_page(gx_device_printer *pdev, gp_file *prn_stream) /* end page */ if (start_page) { - code = opvp_endpage(); + code = opvp_endpage((gx_device*) pdev); if (code) ecode = code; start_page = false; } @@ -2413,37 +2719,38 @@ opvp_close(gx_device *dev) int ecode = 0; /* finalize */ - if (printerContext != -1) { + if (pdev->globals.printerContext != -1) { /* call EndDoc */ - if (apiEntry->opvpEndDoc) { - apiEntry->opvpEndDoc(printerContext); + if (pdev->globals.apiEntry->opvpEndDoc) { + pdev->globals.apiEntry->opvpEndDoc(pdev->globals.printerContext); } /* call EndJob */ - if (apiEntry->opvpEndJob) { - apiEntry->opvpEndJob(printerContext); + if (pdev->globals.apiEntry->opvpEndJob) { + pdev->globals.apiEntry->opvpEndJob(pdev->globals.printerContext); } /* call ClosePrinter */ - if (apiEntry->opvpClosePrinter) { - apiEntry->opvpClosePrinter(printerContext); + if (pdev->globals.apiEntry->opvpClosePrinter) { + pdev->globals.apiEntry->opvpClosePrinter(pdev->globals.printerContext); } - printerContext = -1; + pdev->globals.printerContext = -1; } /* unload vector driver */ - if (apiEntry) free(apiEntry); - apiEntry = NULL; - opvp_unload_vector_driver(); + if (pdev->globals.apiEntry) + free(pdev->globals.apiEntry); + pdev->globals.apiEntry = NULL; + opvp_unload_vector_driver(dev); - if (inkjet) { + if (pdev->globals.inkjet) { /* close printer */ gdev_prn_close(dev); } else { /* close output stream */ gdev_vector_close_file((gx_device_vector *)pdev); } - outputFD = -1; + pdev->globals.outputFD = -1; return ecode; } @@ -2457,6 +2764,7 @@ opvp_map_rgb_color(gx_device *dev, { opvp_cspace_t cs; uint c, m, y, k; + gx_device_opvp *opdev = (gx_device_opvp*)dev; #if !(ENABLE_SIMPLE_MODE) gx_device_opvp *pdev; @@ -2469,16 +2777,15 @@ opvp_map_rgb_color(gx_device *dev, b = prgb[2]; #if ENABLE_SIMPLE_MODE - cs = colorSpace; + cs = opdev->globals.colorSpace; #else pdev = (gx_device_opvp *)dev; r = -1; cs = OPVP_CSPACE_STANDARDRGB; if (pdev->is_open) { /* call GetColorSpace */ - if (apiEntry->opvpGetColorSpace) { - r = apiEntry->opvpGetColorSpace(printerContext, &cs); - } + + r = gsopvpGetColorSpace(dev, opdev->globals.printerContext, &cs); if (r != OPVP_OK) { if (pdev->color_info.depth > 32) { cs = OPVP_CSPACE_STANDARDRGB64; @@ -2557,15 +2864,14 @@ opvp_map_color_rgb(gx_device *dev, gx_color_index color, #endif opvp_cspace_t cs = OPVP_CSPACE_STANDARDRGB; uint c, m, y, k; + gx_device_opvp *opdev = (gx_device_opvp*)dev; #if ENABLE_SIMPLE_MODE - cs = colorSpace; + cs = opdev->globals.colorSpace; #else /* call GetColorSpace */ if (pdev->is_open) { - if (apiEntry->opvpGetColorSpace) { - r = apiEntry->opvpGetColorSpace(printerContext, &cs); - } + r = gsopvpGetColorSpace(dev, opdev->globals.printerContext, &cs); if (r != OPVP_OK) { if (pdev->color_info.depth > 32) { cs = OPVP_CSPACE_STANDARDRGB64; @@ -2637,44 +2943,44 @@ opvp_fill_rectangle( int h, gx_color_index color) { - gx_device_opvp *pdev = (gx_device_opvp *)dev; + gx_device_opvp *opdev = (gx_device_opvp *)dev; byte data[8] = {0xC0, 0, 0, 0, 0xC0, 0, 0, 0}; int code = -1; int ecode = 0; opvp_brush_t brush; opvp_point_t point; - if (vector) { - return gdev_vector_fill_rectangle( dev, x, y, w, h, color); + if (opdev->globals.vector) { + return gdev_vector_fill_rectangle(dev, x, y, w, h, color); } /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; #if !(ENABLE_SIMPLE_MODE) /* call SaveGS */ - if (apiEntry->opvpSaveGS) { - apiEntry->opvpSaveGS(printerContext); + if (pdev->globals.apiEntry->opvpSaveGS) { + pdev->globals.apiEntry->opvpSaveGS(printerContext); } #endif /* one-color */ - opvp_set_brush_color(pdev, color, &brush); + opvp_set_brush_color(opdev, color, &brush); /* call SetFillColor */ - if (apiEntry->opvpSetFillColor) { - apiEntry->opvpSetFillColor(printerContext, &brush); - } + gsopvpSetFillColor(dev, opdev->globals.printerContext, &brush); + /* call SetCurrentPoint */ OPVP_I2FIX(x, point.x); OPVP_I2FIX(y, point.y); - if (apiEntry->opvpSetCurrentPoint) { - apiEntry->opvpSetCurrentPoint(printerContext,point.x, point.y); + if (opdev->globals.apiEntry->opvpSetCurrentPoint) { + opdev->globals.apiEntry->opvpSetCurrentPoint(opdev->globals.printerContext,point.x, point.y); } /* draw image */ - code = opvp_draw_image(pdev, + code = opvp_draw_image(opdev, 1, 2, 2, w, h, @@ -2686,17 +2992,15 @@ opvp_fill_rectangle( } /* restore fill color */ - if (vectorFillColor) { + if (opdev->globals.vectorFillColor) { /* call SetFillColor */ - if (apiEntry->opvpSetFillColor) { - apiEntry->opvpSetFillColor(printerContext,vectorFillColor); - } + gsopvpSetFillColor(dev, opdev->globals.printerContext,opdev->globals.vectorFillColor); } #if !(ENABLE_SIMPLE_MODE) /* call RestoreGS */ - if (apiEntry->opvpRestoreGS) { - apiEntry->opvpRestoreGS(printerContext); + if (pdev->globals.apiEntry->opvpRestoreGS) { + pdev->globals.opdev->globals.apiEntry->opvpRestoreGS(printerContext); } #endif @@ -2720,7 +3024,7 @@ opvp_copy_mono( gx_color_index zero, gx_color_index one) { - gx_device_opvp *pdev = (gx_device_opvp *)dev; + gx_device_opvp *opdev = (gx_device_opvp *)dev; int code = -1; int ecode = 0; opvp_brush_t brush; @@ -2738,7 +3042,8 @@ opvp_copy_mono( bool reverse = false; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* data offset */ if (data_x) { @@ -2775,8 +3080,8 @@ opvp_copy_mono( #if !(ENABLE_SIMPLE_MODE) /* call SaveGS */ - if (apiEntry->opvpSaveGS) { - apiEntry->opvpSaveGS(printerContext); + if (opdev->globals.apiEntry->opvpSaveGS) { + opdev->globals.apiEntry->opvpSaveGS(printerContext); } #endif if (one == gx_no_color_index) { @@ -2791,25 +3096,22 @@ opvp_copy_mono( if (zero != gx_no_color_index) { /* not mask */ /* Set PaintMode */ - if (apiEntry->opvpSetPaintMode) { - apiEntry->opvpSetPaintMode(printerContext,OPVP_PAINTMODE_OPAQUE); + if (opdev->globals.apiEntry->opvpSetPaintMode) { + opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_OPAQUE); } /* zero-color */ - opvp_set_brush_color(pdev, zero, &brush); + opvp_set_brush_color(opdev, zero, &brush); /* call SetBgColor */ - if (apiEntry->opvpSetBgColor) { - apiEntry->opvpSetBgColor(printerContext, &brush); - } + gsopvpSetBgColor(dev, opdev->globals.printerContext, &brush); + } /* one-color */ - opvp_set_brush_color(pdev, one, &brush); + opvp_set_brush_color(opdev, one, &brush); /* call SetFillColor */ - if (apiEntry->opvpSetFillColor) { - apiEntry->opvpSetFillColor(printerContext, &brush); - } + gsopvpSetFillColor(dev, opdev->globals.printerContext, &brush); if (reverse) { /* 0/1 reverse image */ @@ -2828,12 +3130,12 @@ opvp_copy_mono( /* call SetCurrentPoint */ OPVP_I2FIX(x, point.x); OPVP_I2FIX(y, point.y); - if (apiEntry->opvpSetCurrentPoint) { - apiEntry->opvpSetCurrentPoint(printerContext,point.x, point.y); + if (opdev->globals.apiEntry->opvpSetCurrentPoint) { + opdev->globals.apiEntry->opvpSetCurrentPoint(opdev->globals.printerContext,point.x, point.y); } /* draw image */ - code = opvp_draw_image(pdev, + code = opvp_draw_image(opdev, 1, w, h, w, h, @@ -2846,23 +3148,21 @@ opvp_copy_mono( if (zero != gx_no_color_index) { /* restore PaintMode */ - if (apiEntry->opvpSetPaintMode) { - apiEntry->opvpSetPaintMode(printerContext, + if (opdev->globals.apiEntry->opvpSetPaintMode) { + opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_TRANSPARENT); } } /* restore fill color */ - if (vectorFillColor) { + if (opdev->globals.vectorFillColor) { /* call SetFillColor */ - if (apiEntry->opvpSetFillColor) { - apiEntry->opvpSetFillColor(printerContext,vectorFillColor); - } + gsopvpSetFillColor(dev, opdev->globals.printerContext,opdev->globals.vectorFillColor); } #if !(ENABLE_SIMPLE_MODE) /* call RestoreGS */ - if (apiEntry->opvpRestoreGS) { - apiEntry->opvpRestoreGS(printerContext); + if (opdev->globals.apiEntry->opvpRestoreGS) { + opdev->globals.apiEntry->opvpRestoreGS(opdev->globals.printerContext); } #endif @@ -2889,7 +3189,7 @@ opvp_copy_color( int w, int h) { - gx_device_opvp *pdev = (gx_device_opvp *)dev; + gx_device_opvp *opdev = (gx_device_opvp *)dev; int code = -1; int ecode = 0; opvp_point_t point; @@ -2904,11 +3204,12 @@ opvp_copy_color( int adj_raster = raster; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* data offset */ if (data_x) { - depth = pdev->color_info.depth; + depth = opdev->color_info.depth; pixel = (depth + 7) >> 3; byte_length = pixel * w; adj_raster = ((byte_length + 3) >> 2) << 2; @@ -2928,21 +3229,21 @@ opvp_copy_color( #if !(ENABLE_SIMPLE_MODE) /* call SaveGS */ - if (apiEntry->opvpSaveGS) { - apiEntry->opvpSaveGS(printerContext); + if (opdev->globals.apiEntry->opvpSaveGS) { + opdev->globals.apiEntry->opvpSaveGS(opdev->globals.printerContext); } #endif /* call SetCurrentPoint */ OPVP_I2FIX(x, point.x); OPVP_I2FIX(y, point.y); - if (apiEntry->opvpSetCurrentPoint) { - apiEntry->opvpSetCurrentPoint(printerContext, point.x, point.y); + if (opdev->globals.apiEntry->opvpSetCurrentPoint) { + opdev->globals.apiEntry->opvpSetCurrentPoint(opdev->globals.printerContext, point.x, point.y); } /* draw image */ - code = opvp_draw_image(pdev, - pdev->color_info.depth, + code = opvp_draw_image(opdev, + opdev->color_info.depth, w, h, w, h, adj_raster, @@ -2954,8 +3255,8 @@ opvp_copy_color( #if !(ENABLE_SIMPLE_MODE) /* call RestoreGS */ - if (apiEntry->opvpRestoreGS) { - apiEntry->opvpRestoreGS(printerContext); + if (opdev->globals.apiEntry->opvpRestoreGS) { + opdev->globals.apiEntry->opvpRestoreGS(opdev->globals.printerContext); } #endif @@ -2971,7 +3272,7 @@ opvp_copy_color( * get params */ static int -_get_params(gs_param_list *plist) +_get_params(gx_device* dev, gs_param_list *plist) { int code; int ecode = 0; @@ -2987,37 +3288,38 @@ _get_params(gs_param_list *plist) gs_param_string mbps; gs_param_string zmps; char buff[OPVP_BUFF_SIZE]; + gx_device_opvp* opdev = (gx_device_opvp*)dev; /* get params */ /* vector driver name */ pname = "Driver"; - vdps.data = (byte *)vectorDriver; - vdps.size = (vectorDriver ? strlen(vectorDriver) + 1 : 0); + vdps.data = (byte *)opdev->globals.vectorDriver; + vdps.size = (opdev->globals.vectorDriver ? strlen(opdev->globals.vectorDriver) + 1 : 0); vdps.persistent = false; code = param_write_string(plist, pname, &vdps); if (code) ecode = code; /* printer model name */ pname = "Model"; - pmps.data = (byte *)printerModel; - pmps.size = (printerModel ? strlen(printerModel) + 1 : 0); + pmps.data = (byte *)opdev->globals.printerModel; + pmps.size = (opdev->globals.printerModel ? strlen(opdev->globals.printerModel) + 1 : 0); pmps.persistent = false; code = param_write_string(plist, pname, &pmps); if (code) ecode = code; /* job info */ pname = "JobInfo"; - jips.data = (byte *)jobInfo; - jips.size = (jobInfo ? strlen(jobInfo) + 1 : 0); + jips.data = (byte *)opdev->globals.jobInfo; + jips.size = (opdev->globals.jobInfo ? strlen(opdev->globals.jobInfo) + 1 : 0); jips.persistent = false; code = param_write_string(plist, pname, &jips); if (code) ecode = code; /* doc info */ pname = "DocInfo"; - dips.data = (byte *)docInfo; - dips.size = (docInfo ? strlen(docInfo) + 1 : 0); + dips.data = (byte *)opdev->globals.docInfo; + dips.size = (opdev->globals.docInfo ? strlen(opdev->globals.docInfo) + 1 : 0); dips.persistent = false; code = param_write_string(plist, pname, &dips); if (code) ecode = code; @@ -3054,28 +3356,28 @@ _get_params(gs_param_list *plist) /* margins */ memset((void*)buff, 0, OPVP_BUFF_SIZE); pname = "MarginLeft"; - snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",margins[0]); + snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",opdev->globals.margins[0]); mlps.data = (byte *)buff; mlps.size = strlen(buff) + 1; mlps.persistent = false; code = param_write_string(plist, pname, &mlps); if (code) ecode = code; pname = "MarginTop"; - snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",margins[3]); + snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",opdev->globals.margins[3]); mtps.data = (byte *)buff; mtps.size = strlen(buff) + 1; mtps.persistent = false; code = param_write_string(plist, pname, &mtps); if (code) ecode = code; pname = "MarginRight"; - snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",margins[2]); + snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",opdev->globals.margins[2]); mrps.data = (byte *)buff; mrps.size = strlen(buff) + 1; mrps.persistent = false; code = param_write_string(plist, pname, &mrps); if (code) ecode = code; pname = "MarginBottom"; - snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",margins[1]); + snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",opdev->globals.margins[1]); mbps.data = (byte *)buff; mbps.size = strlen(buff) + 1; mbps.persistent = false; @@ -3084,7 +3386,7 @@ _get_params(gs_param_list *plist) /* zoom */ pname = "Zoom"; - snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",zoom[0]); + snprintf(buff, OPVP_BUFF_SIZE - 1, "%f",opdev->globals.zoom[0]); zmps.data = (byte *)buff; zmps.size = strlen(buff) + 1; zmps.persistent = false; @@ -3107,7 +3409,7 @@ opvp_get_params(gx_device *dev, gs_param_list *plist) if (code) return code; /* get params */ - return _get_params(plist); + return _get_params(dev, plist); } /* @@ -3123,14 +3425,14 @@ oprp_get_params(gx_device *dev, gs_param_list *plist) if (code) return code; /* get params */ - return _get_params(plist); + return _get_params(dev, plist); } /* * put params */ static int -_put_params(gs_param_list *plist) +_put_params(gx_device *dev, gs_param_list *plist) { int code; int ecode = 0; @@ -3146,6 +3448,7 @@ _put_params(gs_param_list *plist) gs_param_string mrps; gs_param_string mbps; gs_param_string zmps; + gx_device_opvp *opdev = (gx_device_opvp*)dev; /* vector driver name */ pname = "Driver"; @@ -3155,10 +3458,10 @@ _put_params(gs_param_list *plist) buff = realloc(buff, vdps.size + 1); memcpy(buff, vdps.data, vdps.size); buff[vdps.size] = 0; - opvp_alloc_string(&vectorDriver, buff); + opvp_alloc_string(&(opdev->globals.vectorDriver), buff); break; case 1: - /* opvp_alloc_string(&vectorDriver, NULL);*/ + /* opvp_alloc_string(&(opdev->globals.vectorDriver), NULL);*/ break; default: ecode = code; @@ -3173,10 +3476,10 @@ _put_params(gs_param_list *plist) buff = realloc(buff, pmps.size + 1); memcpy(buff, pmps.data, pmps.size); buff[pmps.size] = 0; - opvp_alloc_string(&printerModel, buff); + opvp_alloc_string(&(opdev->globals.printerModel), buff); break; case 1: - /*opvp_alloc_string(&printerModel, NULL);*/ + /*opvp_alloc_string(&(opdev->globals.printerModel), NULL);*/ break; default: ecode = code; @@ -3191,10 +3494,10 @@ _put_params(gs_param_list *plist) buff = realloc(buff, jips.size + 1); memcpy(buff, jips.data, jips.size); buff[jips.size] = 0; - opvp_alloc_string(&jobInfo, buff); + opvp_alloc_string(&(opdev->globals.jobInfo), buff); break; case 1: - /*opvp_alloc_string(&jobInfo, NULL);*/ + /*opvp_alloc_string(&(opdev->globals.jobInfo), NULL);*/ break; default: ecode = code; @@ -3209,10 +3512,10 @@ _put_params(gs_param_list *plist) buff = realloc(buff, dips.size + 1); memcpy(buff, dips.data, dips.size); buff[dips.size] = 0; - opvp_alloc_string(&docInfo, buff); + opvp_alloc_string(&(opdev->globals.docInfo), buff); break; case 1: - /*opvp_alloc_string(&docInfo, NULL);*/ + /*opvp_alloc_string(&(opdev->globals.docInfo), NULL);*/ break; default: ecode = code; @@ -3258,7 +3561,7 @@ _put_params(gs_param_list *plist) buff = realloc(buff, mlps.size + 1); memcpy(buff, mlps.data, mlps.size); buff[mlps.size] = 0; - margins[0] = atof(buff); + opdev->globals.margins[0] = atof(buff); break; case 1: break; @@ -3273,7 +3576,7 @@ _put_params(gs_param_list *plist) buff = realloc(buff, mtps.size + 1); memcpy(buff, mtps.data, mtps.size); buff[mtps.size] = 0; - margins[3] = atof(buff); + opdev->globals.margins[3] = atof(buff); break; case 1: break; @@ -3288,7 +3591,7 @@ _put_params(gs_param_list *plist) buff = realloc(buff, mrps.size + 1); memcpy(buff, mrps.data, mrps.size); buff[mrps.size] = 0; - margins[2] = atof(buff); + opdev->globals.margins[2] = atof(buff); break; case 1: break; @@ -3303,7 +3606,7 @@ _put_params(gs_param_list *plist) buff = realloc(buff, mbps.size + 1); memcpy(buff, mbps.data, mbps.size); buff[mbps.size] = 0; - margins[1] = atof(buff); + opdev->globals.margins[1] = atof(buff); break; case 1: break; @@ -3321,15 +3624,15 @@ _put_params(gs_param_list *plist) memcpy(buff, zmps.data, zmps.size); buff[zmps.size] = 0; if (strncasecmp(buff, "Auto", 4)) { - zoom[0] = atof(buff); - if (zoom[0] > 0) { - zoom[1] = zoom[0]; + opdev->globals.zoom[0] = atof(buff); + if (opdev->globals.zoom[0] > 0) { + opdev->globals.zoom[1] = opdev->globals.zoom[0]; } else { - zoom[0] = zoom[1] = 1; + opdev->globals.zoom[0] = opdev->globals.zoom[1] = 1; } } else { - zoom[0] = zoom[1] = 1; - zoomAuto = true; + opdev->globals.zoom[0] = opdev->globals.zoom[1] = 1; + opdev->globals.zoomAuto = true; } break; case 1: @@ -3353,7 +3656,7 @@ opvp_put_params(gx_device *dev, gs_param_list *plist) int code; /* put params */ - code = _put_params(plist); + code = _put_params(dev, plist); if (code) return code; /* put default params */ @@ -3369,7 +3672,7 @@ oprp_put_params(gx_device *dev, gs_param_list *plist) int code; /* put params */ - code = _put_params(plist); + code = _put_params(dev, plist); if (code) return code; /* put default params */ @@ -3446,13 +3749,14 @@ opvp_fill_path( { bool draw_image = false; gs_fixed_rect inner, outer; + gx_device_opvp *opdev = (gx_device_opvp*)dev; /* check if paths are too complex */ if (!checkPath(ppath) || !checkCPath(pxpath)) { return gx_default_fill_path(dev, pgs, ppath, params, pdevc, pxpath); } /* check clippath support */ - if (!(apiEntry->opvpSetClipPath)) { + if (!(opdev->globals.apiEntry->opvpSetClipPath)) { /* get clipping box area */ gx_cpath_inner_box(pxpath,&inner); gx_cpath_outer_box(pxpath,&outer); @@ -3464,7 +3768,7 @@ opvp_fill_path( } } - if (!vector || draw_image) { + if (!(opdev->globals.vector) || draw_image) { return gx_default_fill_path(dev, pgs, ppath, params, pdevc, pxpath); } @@ -3485,6 +3789,7 @@ opvp_stroke_path( { bool draw_image = false; gs_fixed_rect inner, outer; + gx_device_opvp *opdev = (gx_device_opvp *) dev; /* check if paths are too complex */ if (!checkPath(ppath) || !checkCPath(pxpath)) { @@ -3492,7 +3797,7 @@ opvp_stroke_path( params, pdcolor, pxpath); } /* check clippath support */ - if (!(apiEntry->opvpSetClipPath)) { + if (!(opdev->globals.apiEntry->opvpSetClipPath)) { /* get clipping box area */ gx_cpath_inner_box(pxpath,&inner); gx_cpath_outer_box(pxpath,&outer); @@ -3504,7 +3809,7 @@ opvp_stroke_path( } } - if (!vector || draw_image) { + if (!(opdev->globals.vector) || draw_image) { return gx_default_stroke_path(dev, pgs, ppath, params, pdcolor, pxpath); } @@ -3532,7 +3837,9 @@ opvp_fill_mask( gs_logical_operation_t lop, const gx_clip_path *pcpath) { - if (vector) { + gx_device_opvp *opdev = (gx_device_opvp*) dev; + + if (opdev->globals.vector) { int code; code = gdev_vector_update_fill_color((gx_device_vector *)dev, NULL, pdcolor); if (code < 0) return code; @@ -3576,6 +3883,7 @@ opvp_begin_typed_image( int p; float mag[2] = {1, 1}; const gs_color_space *pcs; + gx_device_opvp *opdev = (gx_device_opvp *)dev; /* check if paths are too complex */ if (pic->type->index != 1 || !checkCPath(pcpath)) @@ -3759,7 +4067,7 @@ opvp_begin_typed_image( * 3 planes 24 bits color image * (8 bits per plane) */ - if (apiEntry->opvpStartDrawImage) { + if (opdev->globals.apiEntry->opvpStartDrawImage) { draw_image = true; } } @@ -3770,54 +4078,51 @@ opvp_begin_typed_image( *pinfo = (gx_image_enum_common_t *)vinfo; if (!ecode) { + opvp_cspace_t ncspace; + if (!pim->ImageMask) { /* call SetPaintMode */ - if (apiEntry->opvpSetPaintMode) { - apiEntry->opvpSetPaintMode(printerContext, + if (opdev->globals.apiEntry->opvpSetPaintMode) { + opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_OPAQUE); change_paint_mode = true; } /* set color space */ - if (apiEntry->opvpSetColorSpace != NULL) { - opvp_cspace_t ncspace; - - savedColorSpace = colorSpace; - switch (bits_per_pixel) { - case 1: - ncspace = OPVP_CSPACE_DEVICEGRAY; - bits_per_pixel = 8; - if (!cspace_available[ncspace]) { - ncspace = OPVP_CSPACE_STANDARDRGB; - bits_per_pixel = 24; - } - break; - case 8: - ncspace = OPVP_CSPACE_DEVICEGRAY; - if (!cspace_available[ncspace]) { - ncspace = OPVP_CSPACE_STANDARDRGB; - bits_per_pixel = 24; - } - break; - case 24: - ncspace = OPVP_CSPACE_DEVICERGB; - if (!cspace_available[ncspace]) { - ncspace = OPVP_CSPACE_STANDARDRGB; - } - break; - default: + opdev->globals.savedColorSpace = opdev->globals.colorSpace; + switch (bits_per_pixel) { + case 1: + ncspace = OPVP_CSPACE_DEVICEGRAY; + bits_per_pixel = 8; + if (!cspace_available[ncspace]) { + ncspace = OPVP_CSPACE_STANDARDRGB; + bits_per_pixel = 24; + } + break; + case 8: + ncspace = OPVP_CSPACE_DEVICEGRAY; + if (!cspace_available[ncspace]) { + ncspace = OPVP_CSPACE_STANDARDRGB; + bits_per_pixel = 24; + } + break; + case 24: + ncspace = OPVP_CSPACE_DEVICERGB; + if (!cspace_available[ncspace]) { + ncspace = OPVP_CSPACE_STANDARDRGB; + } + break; + default: + r = -1; + goto fallthrough; + break; + } + if (ncspace != opdev->globals.colorSpace) { + if (gsopvpSetColorSpace(dev, opdev->globals.printerContext, ncspace) != OPVP_OK) { r = -1; goto fallthrough; - break; - } - if (ncspace != colorSpace) { - if (apiEntry->opvpSetColorSpace(printerContext,ncspace) - != OPVP_OK) { - r = -1; - goto fallthrough; - } - colorSpace = ncspace; - change_cspace = true; } + opdev->globals.colorSpace = ncspace; + change_cspace = true; } } } @@ -3834,8 +4139,8 @@ opvp_begin_typed_image( ctm.d = mtx.yy; ctm.e = mtx.tx; ctm.f = mtx.ty; - if (apiEntry->opvpSetCTM) { - r = apiEntry->opvpSetCTM(printerContext, &ctm); + if (opdev->globals.apiEntry->opvpSetCTM) { + r = opdev->globals.apiEntry->opvpSetCTM(opdev->globals.printerContext, &ctm); } else r = -1; if (r != OPVP_OK) ecode = r; @@ -3843,38 +4148,33 @@ opvp_begin_typed_image( } if (!ecode) { int dw,dh; + opvp_int_t adj_raster; /* image size */ if (mag[0] != 1) { - dw = floor(vinfo->width * mag[0]+0.5); + dw = (int) floor(vinfo->width * mag[0]+0.5); } else { dw = vinfo->width; } if (mag[1] != 1) { - dh = floor(vinfo->height * mag[1]+0.5); + dh = (int) floor(vinfo->height * mag[1]+0.5); } else { dh = vinfo->height; } /* call StartDrawImage */ - if (apiEntry->opvpStartDrawImage) { - opvp_int_t adj_raster; - - adj_raster = bits_per_pixel*vinfo->width; - adj_raster = ((adj_raster+31) >> 5) << 2; - r = apiEntry->opvpStartDrawImage( - printerContext, - vinfo->width, - vinfo->height, - adj_raster, - pim->ImageMask ? - OPVP_IFORMAT_MASK: - OPVP_IFORMAT_RAW, - dw,dh); - if(r != OPVP_OK) { - if (apiEntry->opvpEndDrawImage) { - apiEntry->opvpEndDrawImage(printerContext); - } - } + adj_raster = bits_per_pixel*vinfo->width; + adj_raster = ((adj_raster+31) >> 5) << 2; + r = gsopvpStartDrawImage(dev, + opdev->globals.printerContext, + vinfo->width, + vinfo->height, + adj_raster, + pim->ImageMask ? + OPVP_IFORMAT_MASK: + OPVP_IFORMAT_RAW, + dw,dh); + if(r != OPVP_OK) { + gsopvpEndDrawImage(dev, opdev->globals.printerContext); } /* bugfix for 32bit CMYK image print error */ @@ -3882,23 +4182,20 @@ fallthrough: if(r != OPVP_OK) { if (change_paint_mode) { /* restore paint mode */ - if (apiEntry->opvpSetPaintMode) { - apiEntry->opvpSetPaintMode(printerContext, + if (opdev->globals.apiEntry->opvpSetPaintMode) { + opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_TRANSPARENT); } change_paint_mode = false; } if (change_cspace) { /* restore color space */ - colorSpace = savedColorSpace; - if (apiEntry->opvpSetColorSpace) { - apiEntry->opvpSetColorSpace(printerContext, - colorSpace); - } + opdev->globals.colorSpace = opdev->globals.savedColorSpace; + gsopvpSetColorSpace(dev, opdev->globals.printerContext, opdev->globals.colorSpace); change_cspace = false; } - if(apiEntry->opvpResetCTM) { - apiEntry->opvpResetCTM(printerContext); /* reset CTM */ + if(opdev->globals.apiEntry->opvpResetCTM) { + opdev->globals.apiEntry->opvpResetCTM(opdev->globals.printerContext); /* reset CTM */ } goto fallback; } @@ -3944,6 +4241,7 @@ opvp_image_plane_data( bbox_image_enum *pbe; gx_image_enum *tinfo; const gs_gstate *pgs; + gx_device_opvp *opdev = (gx_device_opvp*)(info->dev); vinfo = (gdev_vector_image_enum_t *)info; @@ -4039,7 +4337,7 @@ opvp_image_plane_data( if(color_index == gs_color_space_index_Indexed) { if (base_color_index == gs_color_space_index_DeviceGray || base_color_index == gs_color_space_index_CIEA) { - if (colorSpace == OPVP_CSPACE_DEVICEGRAY) { + if (opdev->globals.colorSpace == OPVP_CSPACE_DEVICEGRAY) { /* Convert indexed gray color -> Gray */ if (bits_per_pixel == 8) { /* 8bit image */ dst_bytes = data_bytes; @@ -4195,8 +4493,8 @@ opvp_image_plane_data( /* Convert Gray */ if(color_index == gs_color_space_index_DeviceGray || color_index == gs_color_space_index_CIEA) { - if (colorSpace == OPVP_CSPACE_STANDARDRGB - || colorSpace == OPVP_CSPACE_DEVICERGB) { + if (opdev->globals.colorSpace == OPVP_CSPACE_STANDARDRGB + || opdev->globals.colorSpace == OPVP_CSPACE_DEVICERGB) { /* convert to RGB */ if (bits_per_pixel == 8) { /* 8bit image */ dst_bytes = data_bytes * 3; @@ -4208,7 +4506,7 @@ opvp_image_plane_data( src_ptr = buf + raster_length * i; dst_ptr = tmp_buf + dst_length * i; for (j = 0; j < data_bytes; j++) { - unsigned char d = floor( + unsigned char d = (unsigned char) floor( imageDecode[0]*255 + src_ptr[j]* (imageDecode[1]-imageDecode[0])+0.5); @@ -4236,7 +4534,7 @@ opvp_image_plane_data( for (j = 0; j < vinfo->width; j++) { int o = ((src_ptr[j/8] & (1 << (7 - (j & 7)))) != 0); - unsigned char d = floor( + unsigned char d = (unsigned char) floor( imageDecode[0]*255 + o* (imageDecode[1]-imageDecode[0])*255+0.5); dst_ptr[j*3] = d; /* R */ @@ -4252,7 +4550,7 @@ opvp_image_plane_data( vinfo->bits_per_pixel = 24; } } - } else if (colorSpace == OPVP_CSPACE_DEVICEGRAY) { + } else if (opdev->globals.colorSpace == OPVP_CSPACE_DEVICEGRAY) { if (bits_per_pixel == 1) { /* 1bit image */ dst_bytes = vinfo->width; dst_length = ((dst_bytes + 3) >> 2) << 2; @@ -4265,7 +4563,7 @@ opvp_image_plane_data( for (j = 0; j < vinfo->width; j++) { int o = ((src_ptr[j/8] & (1 << (7 - (j & 7)))) != 0); - unsigned char d = floor( + unsigned char d = (unsigned char) floor( imageDecode[0]*255 + o* (imageDecode[1]-imageDecode[0])*255+0.5); dst_ptr[j] = d; /* R */ @@ -4301,8 +4599,8 @@ opvp_image_plane_data( } /* call TansferDrawImage */ - if (apiEntry->opvpTransferDrawImage) { - apiEntry->opvpTransferDrawImage(printerContext, + if (opdev->globals.apiEntry->opvpTransferDrawImage) { + opdev->globals.apiEntry->opvpTransferDrawImage(opdev->globals.printerContext, raster_length * height, (void *)buf); } } @@ -4327,21 +4625,20 @@ opvp_image_end_image(gx_image_enum_common_t *info, bool draw_last) gx_device_vector *vdev = (gx_device_vector *)dev; gdev_vector_image_enum_t *vinfo; opvp_ctm_t ctm; + gx_device_opvp *opdev = (gx_device_opvp*)dev; vinfo = (gdev_vector_image_enum_t *)info; if (begin_image) { /* call EndDrawImage */ - if (apiEntry->opvpEndDrawImage) { - apiEntry->opvpEndDrawImage(printerContext); - } + gsopvpEndDrawImage(dev, opdev->globals.printerContext); begin_image = false; if (FastImageMode != FastImageNoCTM) { /* call ResetCTM */ - if (apiEntry->opvpResetCTM) { - apiEntry->opvpResetCTM(printerContext); + if (opdev->globals.apiEntry->opvpResetCTM) { + opdev->globals.apiEntry->opvpResetCTM(opdev->globals.printerContext); } else { /* call SetCTM */ ctm.a = 1; @@ -4350,25 +4647,24 @@ opvp_image_end_image(gx_image_enum_common_t *info, bool draw_last) ctm.d = 1; ctm.e = 0; ctm.f = 0; - if (apiEntry->opvpSetCTM) { - apiEntry->opvpSetCTM(printerContext, &ctm); + if (opdev->globals.apiEntry->opvpSetCTM) { + opdev->globals.apiEntry->opvpSetCTM(opdev->globals.printerContext, &ctm); } } } if (change_paint_mode) { /* restore paint mode */ - if (apiEntry->opvpSetPaintMode) { - apiEntry->opvpSetPaintMode(printerContext, + if (opdev->globals.apiEntry->opvpSetPaintMode) { + opdev->globals.apiEntry->opvpSetPaintMode(opdev->globals.printerContext, OPVP_PAINTMODE_TRANSPARENT); } change_paint_mode = false; } if (change_cspace) { /* restore color space */ - colorSpace = savedColorSpace; - if (apiEntry->opvpSetColorSpace) { - apiEntry->opvpSetColorSpace(printerContext, - colorSpace); + opdev->globals.colorSpace = opdev->globals.savedColorSpace; + if (gsopvpSetColorSpace(dev, opdev->globals.printerContext, opdev->globals.colorSpace) != OPVP_OK) { + return -1; } change_cspace = false; } @@ -4384,20 +4680,20 @@ opvp_image_end_image(gx_image_enum_common_t *info, bool draw_last) static int opvp_beginpage(gx_device_vector *vdev) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; int code = -1; int ecode = 0; #ifdef OPVP_IGNORE_BLANK_PAGE - if (pdev->in_page) return 0; + if (opdev->in_page) return 0; #endif /* start page */ - code = opvp_startpage((gx_device *)pdev); + code = opvp_startpage((gx_device *)opdev); if (code) { ecode = code; } else { - pdev->in_page = true; /* added '05.12.07 */ - beginPage = true; + opdev->in_page = true; /* added '05.12.07 */ + opdev->globals.beginPage = true; } return ecode; @@ -4409,18 +4705,19 @@ opvp_beginpage(gx_device_vector *vdev) static int opvp_setlinewidth(gx_device_vector *vdev, double width) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_fix_t w; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* call SetLineWidth */ OPVP_F2FIX(width, w); - if (apiEntry->opvpSetLineWidth) { - r = apiEntry->opvpSetLineWidth(printerContext, w); + if (opdev->globals.apiEntry->opvpSetLineWidth) { + r = opdev->globals.apiEntry->opvpSetLineWidth(opdev->globals.printerContext, w); } if (r != OPVP_OK) { ecode = -1; @@ -4435,13 +4732,14 @@ opvp_setlinewidth(gx_device_vector *vdev, double width) static int opvp_setlinecap(gx_device_vector *vdev, gs_line_cap cap) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_linecap_t linecap; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; switch (cap) { case gs_cap_butt: @@ -4460,8 +4758,8 @@ opvp_setlinecap(gx_device_vector *vdev, gs_line_cap cap) } /* call SetLineCap */ - if (apiEntry->opvpSetLineCap) { - r = apiEntry->opvpSetLineCap(printerContext, linecap); + if (opdev->globals.apiEntry->opvpSetLineCap) { + r = opdev->globals.apiEntry->opvpSetLineCap(opdev->globals.printerContext, linecap); } if (r != OPVP_OK) { ecode = -1; @@ -4476,13 +4774,14 @@ opvp_setlinecap(gx_device_vector *vdev, gs_line_cap cap) static int opvp_setlinejoin(gx_device_vector *vdev, gs_line_join join) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_linejoin_t linejoin; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; switch (join) { case gs_join_miter: @@ -4502,8 +4801,8 @@ opvp_setlinejoin(gx_device_vector *vdev, gs_line_join join) } /* call SetLineJoin */ - if (apiEntry->opvpSetLineJoin) { - r = apiEntry->opvpSetLineJoin(printerContext, linejoin); + if (opdev->globals.apiEntry->opvpSetLineJoin) { + r = opdev->globals.apiEntry->opvpSetLineJoin(opdev->globals.printerContext, linejoin); } if (r != OPVP_OK) { ecode = -1; @@ -4518,18 +4817,19 @@ opvp_setlinejoin(gx_device_vector *vdev, gs_line_join join) static int opvp_setmiterlimit(gx_device_vector *vdev, double limit) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_fix_t l; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* call SetMiterLimit */ OPVP_F2FIX(limit, l); - if (apiEntry->opvpSetMiterLimit) { - r = apiEntry->opvpSetMiterLimit(printerContext, l); + if (opdev->globals.apiEntry->opvpSetMiterLimit) { + r = opdev->globals.apiEntry->opvpSetMiterLimit(opdev->globals.printerContext, l); } if (r != OPVP_OK) { ecode = -1; @@ -4548,7 +4848,7 @@ opvp_setdash( uint count, double offset) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_fix_t *p = NULL; @@ -4556,7 +4856,8 @@ opvp_setdash( int i; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* pattern */ if (count) { @@ -4572,9 +4873,7 @@ opvp_setdash( /* call SetLineDash */ if (!ecode) { - if (apiEntry->opvpSetLineDash) { - r = apiEntry->opvpSetLineDash(printerContext, count,p); - } + r = gsopvpSetLineDash((gx_device*) vdev, opdev->globals.printerContext, count,p); if (r != OPVP_OK) { ecode = -1; } @@ -4583,8 +4882,8 @@ opvp_setdash( /* call SetLineDashOffset */ if (!ecode) { OPVP_F2FIX(offset, o); - if (apiEntry->opvpSetLineDashOffset) { - r = apiEntry->opvpSetLineDashOffset(printerContext, o); + if (opdev->globals.apiEntry->opvpSetLineDashOffset) { + r = opdev->globals.apiEntry->opvpSetLineDashOffset(opdev->globals.printerContext, o); } if (r != OPVP_OK) { ecode = -1; @@ -4593,8 +4892,8 @@ opvp_setdash( /* call SetLineStyle */ if (!ecode) { - if (apiEntry->opvpSetLineStyle) { - r = apiEntry->opvpSetLineStyle(printerContext, + if (opdev->globals.apiEntry->opvpSetLineStyle) { + r = opdev->globals.apiEntry->opvpSetLineStyle(opdev->globals.printerContext, (count ? OPVP_LINESTYLE_DASH : OPVP_LINESTYLE_SOLID)); @@ -4615,11 +4914,12 @@ opvp_setdash( static int opvp_setflat(gx_device_vector *vdev, double flatness) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; int ecode = 0; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* what to do ? */ @@ -4656,26 +4956,26 @@ opvp_setfillcolor( const gs_gstate *pgs, /* added for gs 8.15 */ const gx_drawing_color *pdc) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; gx_color_index color; static opvp_brush_t brush; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; if (!gx_dc_is_pure(pdc)) return_error(gs_error_rangecheck); /* color */ - if (!vectorFillColor) vectorFillColor = &brush; + if (!opdev->globals.vectorFillColor) + opdev->globals.vectorFillColor = &brush; color = gx_dc_pure_color(pdc); - opvp_set_brush_color(pdev, color, vectorFillColor); + opvp_set_brush_color(opdev, color, opdev->globals.vectorFillColor); /* call SetFillColor */ - if (apiEntry->opvpSetFillColor) { - r = apiEntry->opvpSetFillColor(printerContext, vectorFillColor); - } + r = gsopvpSetFillColor((gx_device*) vdev, opdev->globals.printerContext, opdev->globals.vectorFillColor); if (r != OPVP_OK) { ecode = -1; } @@ -4692,25 +4992,24 @@ opvp_setstrokecolor( const gs_gstate *pgs, /* added for gs 8.15 */ const gx_drawing_color *pdc) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; gx_color_index color; opvp_brush_t brush; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; if (!gx_dc_is_pure(pdc)) return_error(gs_error_rangecheck); /* color */ color = gx_dc_pure_color(pdc); - opvp_set_brush_color(pdev, color, &brush); + opvp_set_brush_color(opdev, color, &brush); /* call SetStrokeColor */ - if (apiEntry->opvpSetStrokeColor) { - r = apiEntry->opvpSetStrokeColor(printerContext, &brush); - } + r = gsopvpSetStrokeColor((gx_device*) vdev, opdev->globals.printerContext, &brush); if (r != OPVP_OK) { ecode = -1; } @@ -4730,7 +5029,7 @@ opvp_vector_dopath( gx_path_type_t type, const gs_matrix *pmat) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int code = -1; int ecode = 0; @@ -4757,7 +5056,8 @@ opvp_vector_dopath( current.x = current.y = 0; #endif /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; if (gx_path_is_rectangle(ppath, &rect)) return (*vdev_proc(vdev, dorect))(vdev, @@ -4799,9 +5099,9 @@ opvp_vector_dopath( switch (pop) { case gs_pe_moveto: /* call SetCurrentPoint */ - if (apiEntry->opvpSetCurrentPoint) { - r = apiEntry->opvpSetCurrentPoint( - printerContext, + if (opdev->globals.apiEntry->opvpSetCurrentPoint) { + r = opdev->globals.apiEntry->opvpSetCurrentPoint( + opdev->globals.printerContext, opvp_p[npoints-1].x, opvp_p[npoints-1].y); } @@ -4809,9 +5109,9 @@ opvp_vector_dopath( break; case gs_pe_lineto: /* call LinePath */ - if (apiEntry->opvpLinePath) { - r = apiEntry->opvpLinePath( - printerContext, + if (opdev->globals.apiEntry->opvpLinePath) { + r = opdev->globals.apiEntry->opvpLinePath( + opdev->globals.printerContext, OPVP_PATHOPEN, npoints - 1, &(opvp_p[1])); @@ -4821,9 +5121,9 @@ opvp_vector_dopath( case gs_pe_curveto: /* npoints */ /* call BezierPath */ - if (apiEntry->opvpBezierPath) { - r = apiEntry->opvpBezierPath( - printerContext, + if (opdev->globals.apiEntry->opvpBezierPath) { + r = opdev->globals.apiEntry->opvpBezierPath( + opdev->globals.printerContext, npoints - 1, &(opvp_p[1]) ); @@ -4984,7 +5284,7 @@ opvp_vector_dorect( fixed y1, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int code = -1; int ecode = 0; @@ -4993,7 +5293,8 @@ opvp_vector_dorect( _fPoint p; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* begin path */ code = (*vdev_proc(vdev, beginpath))(vdev, type); @@ -5012,8 +5313,9 @@ opvp_vector_dorect( OPVP_F2FIX(p.y, rectangles[0].p1.y); /* call RectanglePath */ - if (apiEntry->opvpRectanglePath) { - r = apiEntry->opvpRectanglePath(printerContext, + if (opdev->globals.apiEntry->opvpRectanglePath) { + r = opdev->globals.apiEntry->opvpRectanglePath( + opdev->globals.printerContext, 1, rectangles); } @@ -5040,22 +5342,23 @@ opvp_vector_dorect( static int opvp_beginpath(gx_device_vector *vdev, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* check clip-path */ if (type & gx_path_type_clip) { - if (apiEntry->opvpResetClipPath) - apiEntry->opvpResetClipPath(printerContext); + if (opdev->globals.apiEntry->opvpResetClipPath) + opdev->globals.apiEntry->opvpResetClipPath(opdev->globals.printerContext); } /* call NewPath */ - if (apiEntry->opvpNewPath) { - r = apiEntry->opvpNewPath(printerContext); + if (opdev->globals.apiEntry->opvpNewPath) { + r = opdev->globals.apiEntry->opvpNewPath(opdev->globals.printerContext); } if (r != OPVP_OK) { ecode = -1; @@ -5076,19 +5379,20 @@ opvp_moveto( double y1, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_point_t p; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* call SetCurrentPoint */ OPVP_F2FIX(x1, p.x); OPVP_F2FIX(y1, p.y); - if (apiEntry->opvpSetCurrentPoint) { - r = apiEntry->opvpSetCurrentPoint(printerContext, p.x, p.y); + if (opdev->globals.apiEntry->opvpSetCurrentPoint) { + r = opdev->globals.apiEntry->opvpSetCurrentPoint(opdev->globals.printerContext, p.x, p.y); } if (r != OPVP_OK) { ecode = -1; @@ -5109,21 +5413,23 @@ opvp_lineto( double y1, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_point_t points[1]; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* point */ OPVP_F2FIX(x1, points[0].x); OPVP_F2FIX(y1, points[0].y); /* call LinePath */ - if (apiEntry->opvpLinePath) { - r = apiEntry->opvpLinePath(printerContext, OPVP_PATHOPEN, 1, points); + if (opdev->globals.apiEntry->opvpLinePath) { + r = opdev->globals.apiEntry->opvpLinePath( + opdev->globals.printerContext, OPVP_PATHOPEN, 1, points); } if (r != OPVP_OK) { ecode = -1; @@ -5148,13 +5454,14 @@ opvp_curveto( double y3, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_point_t points[4]; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* points */ OPVP_F2FIX(x0, points[0].x); @@ -5167,8 +5474,9 @@ opvp_curveto( OPVP_F2FIX(y3, points[3].y); /* call BezierPath */ - if (apiEntry->opvpBezierPath) { - r = apiEntry->opvpBezierPath(printerContext, + if (opdev->globals.apiEntry->opvpBezierPath) { + r = opdev->globals.apiEntry->opvpBezierPath( + opdev->globals.printerContext, 3, &(points[1]) ); @@ -5192,21 +5500,23 @@ opvp_closepath( double y_start, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; opvp_point_t points[1]; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* point */ OPVP_F2FIX(x_start, points[0].x); OPVP_F2FIX(y_start, points[0].y); /* call LinePath */ - if (apiEntry->opvpLinePath) { - r = apiEntry->opvpLinePath(printerContext, OPVP_PATHCLOSE, 1, points); + if (opdev->globals.apiEntry->opvpLinePath) { + r = opdev->globals.apiEntry->opvpLinePath( + opdev->globals.printerContext, OPVP_PATHCLOSE, 1, points); } if (r != OPVP_OK) { ecode = -1; @@ -5221,16 +5531,17 @@ opvp_closepath( static int opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) { - gx_device_opvp *pdev = (gx_device_opvp *)vdev; + gx_device_opvp *opdev = (gx_device_opvp *)vdev; opvp_result_t r = -1; int ecode = 0; /* check page-in */ - if (opvp_check_in_page(pdev)) return -1; + if (opvp_check_in_page(opdev)) + return -1; /* call EndPath */ - if (apiEntry->opvpEndPath) { - r = apiEntry->opvpEndPath(printerContext); + if (opdev->globals.apiEntry->opvpEndPath) { + r = opdev->globals.apiEntry->opvpEndPath(opdev->globals.printerContext); } if (r != OPVP_OK) { ecode = -1; @@ -5240,9 +5551,9 @@ opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) /* fill mode */ if (type & gx_path_type_even_odd) { /* call SetFillMode */ - if (apiEntry->opvpSetFillMode) { - r = apiEntry->opvpSetFillMode( - printerContext, + if (opdev->globals.apiEntry->opvpSetFillMode) { + r = opdev->globals.apiEntry->opvpSetFillMode( + opdev->globals.printerContext, OPVP_FILLMODE_EVENODD ); } @@ -5251,9 +5562,9 @@ opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) } } else { /* call SetFillMode */ - if (apiEntry->opvpSetFillMode) { - r = apiEntry->opvpSetFillMode( - printerContext, + if (opdev->globals.apiEntry->opvpSetFillMode) { + r = opdev->globals.apiEntry->opvpSetFillMode( + opdev->globals.printerContext, OPVP_FILLMODE_WINDING ); } @@ -5264,16 +5575,16 @@ opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) if (type & gx_path_type_stroke) { /* call StrokeFillPath */ - if (apiEntry->opvpStrokeFillPath) { - r = apiEntry->opvpStrokeFillPath(printerContext); + if (opdev->globals.apiEntry->opvpStrokeFillPath) { + r = opdev->globals.apiEntry->opvpStrokeFillPath(opdev->globals.printerContext); } if (r != OPVP_OK) { ecode = -1; } } else { /* call FillPath */ - if (apiEntry->opvpFillPath) { - r = apiEntry->opvpFillPath(printerContext); + if (opdev->globals.apiEntry->opvpFillPath) { + r = opdev->globals.apiEntry->opvpFillPath(opdev->globals.printerContext); } if (r != OPVP_OK) { ecode = -1; @@ -5281,9 +5592,9 @@ opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) } } else if (type & gx_path_type_clip) { /* call SetClipPath */ - if (apiEntry->opvpSetClipPath) { - r = apiEntry->opvpSetClipPath( - printerContext, + if (opdev->globals.apiEntry->opvpSetClipPath) { + r = opdev->globals.apiEntry->opvpSetClipPath( + opdev->globals.printerContext, (type & gx_path_type_even_odd ? OPVP_CLIPRULE_EVENODD : OPVP_CLIPRULE_WINDING)); @@ -5293,8 +5604,8 @@ opvp_endpath(gx_device_vector *vdev, gx_path_type_t type) } } else if (type & gx_path_type_stroke) { /* call StrokePath */ - if (apiEntry->opvpStrokePath) { - r = apiEntry->opvpStrokePath(printerContext); + if (opdev->globals.apiEntry->opvpStrokePath) { + r = opdev->globals.apiEntry->opvpStrokePath(opdev->globals.printerContext); } if (r != OPVP_OK) { ecode = -1; diff --git a/contrib/opvp/opvp.h b/contrib/opvp/opvp.h index 426e8cf74..db09046d6 100644 --- a/contrib/opvp/opvp.h +++ b/contrib/opvp/opvp.h @@ -160,7 +160,7 @@ typedef struct _opvp_brushdata { #elif defined(__HP_cc) opvp_byte_t data[1]; #else - opvp_byte_t data[]; + opvp_byte_t data[1]; #endif } opvp_brushdata_t; @@ -222,8 +222,8 @@ typedef struct _opvp_api_procs { opvp_result_t (*opvpEndDoc)(opvp_dc_t); opvp_result_t (*opvpStartPage)(opvp_dc_t,const opvp_char_t*); opvp_result_t (*opvpEndPage)(opvp_dc_t); - opvp_result_t (*opvpQueryDeviceCapability)(opvp_dc_t,opvp_flag_t,opvp_int_t*,opvp_byte_t*); - opvp_result_t (*opvpQueryDeviceInfo)(opvp_dc_t,opvp_flag_t,opvp_int_t*,opvp_char_t*); + opvp_result_t (*opvpQueryDeviceCapability)(opvp_dc_t, opvp_queryinfoflags_t,opvp_int_t*,opvp_byte_t*); + opvp_result_t (*opvpQueryDeviceInfo)(opvp_dc_t, opvp_queryinfoflags_t,opvp_int_t*,opvp_char_t*); opvp_result_t (*opvpResetCTM)(opvp_dc_t); opvp_result_t (*opvpSetCTM)(opvp_dc_t,const opvp_ctm_t*); opvp_result_t (*opvpGetCTM)(opvp_dc_t,opvp_ctm_t*); @@ -287,8 +287,7 @@ typedef struct _opvp_api_procs { } opvp_api_procs_t; /* Function prototype */ -opvp_dc_t opvpOpenPrinter( - opvp_int_t outputFD, +extern opvp_dc_t opvpOpenPrinter(opvp_int_t outputFD, const opvp_char_t *printerModel, const opvp_int_t apiVersion[2], opvp_api_procs_t **apiProcs); diff --git a/contrib/opvp/opvp_0_2_0.h b/contrib/opvp/opvp_0_2_0.h index 6030971a3..8518b7e86 100644 --- a/contrib/opvp/opvp_0_2_0.h +++ b/contrib/opvp/opvp_0_2_0.h @@ -210,7 +210,7 @@ typedef struct _OPVP_CTM { typedef struct _OPVP_api_procs { int (*OpenPrinter)(int,char *,int *,struct _OPVP_api_procs **); int (*ClosePrinter)(int); - int (*StartJob)(int,char *); + int (*StartJob)(int, char *); int (*EndJob)(int); int (*StartDoc)(int,char *); int (*EndDoc)(int); @@ -238,7 +238,7 @@ typedef struct _OPVP_api_procs { int (*GetAlphaConstant)(int,float *); int (*SetLineWidth)(int,OPVP_Fix); int (*GetLineWidth)(int,OPVP_Fix *); - int (*SetLineDash)(int,OPVP_Fix *,int); + int (*SetLineDash)(int, int, OPVP_Fix *); int (*GetLineDash)(int,OPVP_Fix *,int *); int (*SetLineDashOffset)(int,OPVP_Fix); int (*GetLineDashOffset)(int,OPVP_Fix *); diff --git a/contrib/opvp/opvpharness.c b/contrib/opvp/opvpharness.c new file mode 100644 index 000000000..95919f41e --- /dev/null +++ b/contrib/opvp/opvpharness.c @@ -0,0 +1,947 @@ +/* Test harness for checking results after + removal of globals in opvp device. Note, + 0.2 API not tested. Assumption is OpenPrinter + is the first method called and ClosePrinter + will be the final method called. If not, + there will be problems. */ + +#include "opvp.h" +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +/* Yes globals, but here we don't care */ +FILE *pFile = NULL; + +/* Graphic state members of API that are set and get. */ +typedef struct opvp_gstate_s { + opvp_ctm_t ctm; + opvp_cspace_t colorspace; + opvp_fillmode_t fill_mode; + opvp_float_t alpha; + opvp_fix_t line_width; + opvp_int_t line_dash_n; + opvp_fix_t *line_dash_array; + opvp_fix_t dash_offset; + opvp_linestyle_t line_style; + opvp_linecap_t line_cap; + opvp_linejoin_t line_join; + opvp_fix_t miter_limit; + opvp_paintmode_t paintmode; +} opvp_gstate_t; + +opvp_gstate_t opv_gstate; + +static opvp_result_t +opvpClosePrinter(opvp_dc_t printerContext) +{ + fputs("opvpClosePrinter\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fclose(pFile); + + if (opv_gstate.line_dash_array != NULL) + free(opv_gstate.line_dash_array); + + return 0; +} + +static opvp_result_t +opvpStartJob(opvp_dc_t printerContext, const opvp_char_t *job_info) +{ + fputs("opvpStartJob\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tjob_info = %s\n", job_info); + return 0; +} + +static opvp_result_t +opvpEndJob(opvp_dc_t printerContext) +{ + fputs("opvpEndJob\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpAbortJob(opvp_dc_t printerContext) +{ + fputs("opvpAbortJob\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStartDoc(opvp_dc_t printerContext, const opvp_char_t *docinfo) +{ + fputs("opvpStartDoc\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tjob_info = %s\n", docinfo); + return 0; +} + +static opvp_result_t +opvpEndDoc(opvp_dc_t printerContext) +{ + fputs("opvpEndDoc\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStartPage(opvp_dc_t printerContext, const opvp_char_t *pageinfo) +{ + fputs("opvpStartPage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tjob_info = %s\n", pageinfo); + return 0; +} + +static opvp_result_t +opvpEndPage(opvp_dc_t printerContext) +{ + fputs("opvpEndPage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* Not used */ +static opvp_result_t +opvpQueryDeviceCapability(opvp_dc_t printerContext, opvp_flag_t flag, opvp_int_t *a, opvp_byte_t *b) +{ + fputs("opvpQueryDeviceCapability\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* Not used */ +static opvp_result_t +opvpQueryDeviceInfo(opvp_dc_t printerContext, opvp_flag_t flag, opvp_int_t *a, opvp_char_t *b) +{ + fputs("opvpQueryDeviceInfo\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpResetCTM(opvp_dc_t printerContext) +{ + fputs("opvpResetCTM\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + opv_gstate.ctm.a = 1.0; + opv_gstate.ctm.b = 0.0; + opv_gstate.ctm.c = 0.0; + opv_gstate.ctm.d = 1.0; + opv_gstate.ctm.e = 0.0; + opv_gstate.ctm.f = 0.0; + return 0; +} + +static opvp_result_t +opvpSetCTM(opvp_dc_t printerContext, const opvp_ctm_t *pctm) +{ + fputs("opvpSetCTM\n", pFile); + opv_gstate.ctm = *pctm; + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tctm.a = %f\n", pctm->a); + fprintf(pFile, "\tctm.b = %f\n", pctm->b); + fprintf(pFile, "\tctm.c = %f\n", pctm->c); + fprintf(pFile, "\tctm.d = %f\n", pctm->d); + fprintf(pFile, "\tctm.e = %f\n", pctm->e); + fprintf(pFile, "\tctm.f = %f\n", pctm->f); + return 0; +} + +static opvp_result_t +opvpGetCTM(opvp_dc_t printerContext, opvp_ctm_t *pctm) +{ + fputs("opvpGetCTM\n", pFile); + *pctm = opv_gstate.ctm; + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpInitGS(opvp_dc_t printerContext) +{ + fputs("opvpInitGS\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpSaveGS(opvp_dc_t printerContext) +{ + fputs("opvpSaveGS\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpRestoreGS(opvp_dc_t printerContext) +{ + fputs("opvpRestoreGS\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpQueryColorSpace(opvp_dc_t printerContext, opvp_int_t *n, opvp_cspace_t *colorspace) +{ + fputs("opvpQueryColorSpace\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *n = 0; + *colorspace = opv_gstate.colorspace; + return 0; +} + +static opvp_result_t +opvpSetColorSpace(opvp_dc_t printerContext, opvp_cspace_t colorspace) +{ + fputs("opvpSetColorSpace\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tcolorspace = %d\n", colorspace); + opv_gstate.colorspace = colorspace; + return 0; +} + +static opvp_result_t +opvpGetColorSpace(opvp_dc_t printerContext, opvp_cspace_t *colorspace) +{ + fputs("opvpGetColorSpace\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *colorspace = opv_gstate.colorspace; + return 0; +} + +static opvp_result_t +opvpSetFillMode(opvp_dc_t printerContext, opvp_fillmode_t fillmode) +{ + fputs("opvpSetFillMode\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tfillmode = %d\n", fillmode); + opv_gstate.fill_mode = fillmode; + return 0; +} + +static opvp_result_t +opvpGetFillMode(opvp_dc_t printerContext, opvp_fillmode_t *fillmode) +{ + fputs("opvpGetFillMode\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *fillmode = opv_gstate.fill_mode; + return 0; +} + +static opvp_result_t +opvpSetAlphaConstant(opvp_dc_t printerContext, opvp_float_t alpha) +{ + fputs("opvpSetAlphaConstant\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\talpha = %f\n", alpha); + opv_gstate.alpha = alpha; + return 0; +} + +static opvp_result_t +opvpGetAlphaConstant(opvp_dc_t printerContext, opvp_float_t *alpha) +{ + fputs("opvpGetAlphaConstant\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *alpha = opv_gstate.alpha; + return 0; +} + +static opvp_result_t +opvpSetLineWidth(opvp_dc_t printerContext, opvp_fix_t width) +{ + fputs("opvpSetLineWidth\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\twidth = %d\n", width); + opv_gstate.line_width = width; + return 0; +} + +static opvp_result_t +opvpGetLineWidth(opvp_dc_t printerContext, opvp_fix_t *width) +{ + fputs("opvpGetLineWidth\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *width = opv_gstate.line_width; + return 0; +} + +static opvp_result_t +opvpSetLineDash(opvp_dc_t printerContext, opvp_int_t n, const opvp_fix_t *dash) +{ + int k; + + fputs("opvpSetLineDash\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tn = %d\n", n); + opv_gstate.line_dash_n = n; + + if (opv_gstate.line_dash_array != NULL) + free(opv_gstate.line_dash_array); + + opv_gstate.line_dash_array = (opvp_fix_t*) malloc(n * sizeof(opvp_fix_t)); + if (opv_gstate.line_dash_array == NULL) { + fprintf(pFile,"\t Error in dash array allocation. Exiting."); + fclose(pFile); + exit(-1); + } + + for (k = 0; k < n; k++) { + opv_gstate.line_dash_array[k] = dash[k]; + fprintf(pFile, "\tdash[%d] = %d\n", k, dash[k]); + } + return 0; +} + +static opvp_result_t +opvpGetLineDash(opvp_dc_t printerContext, opvp_int_t *n, opvp_fix_t *dash) +{ + fputs("opvpGetLineDash\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + + *n = opv_gstate.line_dash_n; + dash = opv_gstate.line_dash_array; + + return 0; +} + +static opvp_result_t +opvpSetLineDashOffset(opvp_dc_t printerContext, opvp_fix_t offset) +{ + fputs("opvpSetLineDashOffset\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\toffset = %d\n", offset); + opv_gstate.dash_offset = offset; + return 0; +} + +static opvp_result_t +opvpGetLineDashOffset(opvp_dc_t printerContext, opvp_fix_t *offset) +{ + fputs("opvpGetLineDashOffset\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *offset = opv_gstate.dash_offset; + return 0; +} + +static opvp_result_t +opvpSetLineStyle(opvp_dc_t printerContext, opvp_linestyle_t style) +{ + fputs("opvpSetLineStyle\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tstyle = %d\n", style); + opv_gstate.line_style = style; + return 0; +} + +static opvp_result_t +opvpGetLineStyle(opvp_dc_t printerContext, opvp_linestyle_t *style) +{ + fputs("opvpGetLineStyle\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *style = opv_gstate.line_style; + return 0; +} + +static opvp_result_t +opvpSetLineCap(opvp_dc_t printerContext, opvp_linecap_t cap) +{ + fputs("opvpSetLineCap\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tcap = %d\n", cap); + opv_gstate.line_cap = cap; + return 0; +} + +static opvp_result_t +opvpGetLineCap(opvp_dc_t printerContext, opvp_linecap_t *cap) +{ + fputs("opvpGetLineCap\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *cap = opv_gstate.line_cap; + return 0; +} + +static opvp_result_t +opvpSetLineJoin(opvp_dc_t printerContext, opvp_linejoin_t join) +{ + fputs("opvpSetLineJoin\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tjoin = %d\n", join); + opv_gstate.line_join = join; + return 0; +} + +static opvp_result_t +opvpGetLineJoin(opvp_dc_t printerContext, opvp_linejoin_t *join) +{ + fputs("opvpGetLineJoin\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *join = opv_gstate.line_join; + return 0; +} + +static opvp_result_t +opvpSetMiterLimit(opvp_dc_t printerContext, opvp_fix_t miter) +{ + fputs("opvpSetMiterLimit\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tmiter = %d\n", miter); + opv_gstate.miter_limit = miter; + return 0; +} + +static opvp_result_t +opvpGetMiterLimit(opvp_dc_t printerContext, opvp_fix_t *miter) +{ + fputs("opvpGetMiterLimit\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *miter = opv_gstate.miter_limit; + return 0; +} + +static opvp_result_t +opvpSetPaintMode(opvp_dc_t printerContext, opvp_paintmode_t paintmode) +{ + fputs("opvpSetPaintMode\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tpaintmode = %d\n", paintmode); + opv_gstate.paintmode = paintmode; + return 0; +} + +static opvp_result_t +opvpGetPaintMode(opvp_dc_t printerContext, opvp_paintmode_t *paintmode) +{ + fputs("opvpGetPaintMode\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + *paintmode = opv_gstate.paintmode; + return 0; +} + +static opvp_result_t +opvpSetStrokeColor(opvp_dc_t printerContext, const opvp_brush_t *strokecolor) +{ + int k; + + fputs("opvpSetStrokeColor\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + if (strokecolor == NULL) { + fprintf(pFile, "\tstrokecolor is NULL\n"); + } else { + fprintf(pFile, "\tstrokecolor.colorSpace = %d\n", strokecolor->colorSpace); + + for (k = 0; k < 4; k++) { + fprintf(pFile, "\tstrokecolor.color[%d] = %d\n", k, strokecolor->color[k]); + } + + fprintf(pFile, "\tstrokecolor.xorg = %d\n", strokecolor->xorg); + fprintf(pFile, "\tstrokecolor.yorg = %d\n", strokecolor->yorg); + + if (strokecolor->pbrush == NULL) { + fprintf(pFile, "\tstrokecolor.pbrush is NULL\n"); + } else { + fprintf(pFile, "\tstrokecolor.pbrush.type = %d\n", strokecolor->pbrush->type); + fprintf(pFile, "\tstrokecolor.pbrush.width = %d\n", strokecolor->pbrush->width); + fprintf(pFile, "\tstrokecolor.pbrush.height = %d\n", strokecolor->pbrush->height); + fprintf(pFile, "\tstrokecolor.pbrush.pitch = %d\n", strokecolor->pbrush->pitch); + } + } + return 0; +} + +static opvp_result_t +opvpSetFillColor(opvp_dc_t printerContext, const opvp_brush_t *fillcolor) +{ + int k; + + fputs("opvpSetFillColor\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + if (fillcolor == NULL) { + fprintf(pFile, "\tfillcolor is NULL\n"); + } else { + fprintf(pFile, "\tfillcolor.colorSpace = %d\n", fillcolor->colorSpace); + + for (k = 0; k < 4; k++) { + fprintf(pFile, "\tfillcolor.color[%d] = %d\n", k, fillcolor->color[k]); + } + + fprintf(pFile, "\tfillcolor.xorg = %d\n", fillcolor->xorg); + fprintf(pFile, "\tfillcolor.yorg = %d\n", fillcolor->yorg); + + if (fillcolor->pbrush == NULL) { + fprintf(pFile, "\tfillcolor.pbrush is NULL\n"); + } else { + fprintf(pFile, "\tfillcolor.pbrush.type = %d\n", fillcolor->pbrush->type); + fprintf(pFile, "\tfillcolor.pbrush.width = %d\n", fillcolor->pbrush->width); + fprintf(pFile, "\tfillcolor.pbrush.height = %d\n", fillcolor->pbrush->height); + fprintf(pFile, "\tfillcolor.pbrush.pitch = %d\n", fillcolor->pbrush->pitch); + } + } + return 0; +} + +static opvp_result_t +opvpSetBgColor(opvp_dc_t printerContext, const opvp_brush_t *bgcolor) +{ + int k; + + fputs("opvpSetBgColor\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + if (bgcolor == NULL) { + fprintf(pFile, "\tfillcbgcolorolor is NULL\n"); + } else { + fprintf(pFile, "\tbgcolor.colorSpace = %d\n", bgcolor->colorSpace); + + for (k = 0; k < 4; k++) { + fprintf(pFile, "\tbgcolor.color[%d] = %d\n", k, bgcolor->color[k]); + } + + fprintf(pFile, "\tbgcolor.xorg = %d\n", bgcolor->xorg); + fprintf(pFile, "\tbgcolor.yorg = %d\n", bgcolor->yorg); + + if (bgcolor->pbrush == NULL) { + fprintf(pFile, "\tbgcolor.pbrush is NULL\n"); + } else { + fprintf(pFile, "\tbgcolor.pbrush.type = %d\n", bgcolor->pbrush->type); + fprintf(pFile, "\tbgcolor.pbrush.width = %d\n", bgcolor->pbrush->width); + fprintf(pFile, "\tbgcolor.pbrush.height = %d\n", bgcolor->pbrush->height); + fprintf(pFile, "\tbgcolor.pbrush.pitch = %d\n", bgcolor->pbrush->pitch); + } + } + return 0; +} + +static opvp_result_t +opvpNewPath(opvp_dc_t printerContext) +{ + fputs("opvpNewPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpEndPath(opvp_dc_t printerContext) +{ + fputs("opvpEndPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStrokePath(opvp_dc_t printerContext) +{ + fputs("opvpStrokePath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpFillPath(opvp_dc_t printerContext) +{ + fputs("opvpFillPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStrokeFillPath(opvp_dc_t printerContext) +{ + fputs("opvpStrokeFillPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpSetClipPath(opvp_dc_t printerContext, opvp_cliprule_t cliprule) +{ + fputs("opvpSetClipPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tcliprule = %d\n", cliprule); + return 0; +} + +static opvp_result_t +opvpResetClipPath(opvp_dc_t printerContext) +{ + fputs("opvpResetClipPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpSetCurrentPoint(opvp_dc_t printerContext, opvp_fix_t pointx, opvp_fix_t pointy) +{ + fputs("opvpSetCurrentPoint\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tpointx = %d\n", pointx); + fprintf(pFile, "\tpointy = %d\n", pointy); + return 0; +} + +static opvp_result_t +opvpLinePath(opvp_dc_t printerContext, opvp_pathmode_t pathmode, opvp_int_t npoints, const opvp_point_t *points) +{ + int k; + + fputs("opvpLinePath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tpathmode = %d\n", pathmode); + fprintf(pFile, "\tnpoints = %d\n", npoints); + + for (k = 0; k < npoints; k++) { + fprintf(pFile, "\tpoints[%d].x = %d\n", k, points[k].x); + fprintf(pFile, "\tpoints[%d].y = %d\n", k, points[k].y); + } + return 0; +} + +/* Not used */ +static opvp_result_t +opvpPolygonPath(opvp_dc_t printerContext, opvp_int_t n, const opvp_int_t *m, const opvp_point_t *p) +{ + fputs("opvpPolygonPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpRectanglePath(opvp_dc_t printerContext, opvp_int_t n, const opvp_rectangle_t *rects) +{ + int k; + + fputs("opvpRectanglePath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tn = %d\n", n); + + for (k = 0; k < n; k++) { + fprintf(pFile, "\trects[%d].p0.x = %d\n", k, rects[k].p0.x); + fprintf(pFile, "\trects[%d].p0.y = %d\n", k, rects[k].p0.y); + fprintf(pFile, "\trects[%d].p1.x = %d\n", k, rects[k].p1.x); + fprintf(pFile, "\trects[%d].p1.y = %d\n", k, rects[k].p1.y); + } + return 0; +} + +static opvp_result_t +opvpRoundRectanglePath(opvp_dc_t printerContext, opvp_int_t n, const opvp_roundrectangle_t *rects) +{ + int k; + + fputs("opvpRoundRectanglePath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tn = %d\n", n); + + for (k = 0; k < n; k++) { + fprintf(pFile, "\trects[%d].p0.x = %d\n", k, rects[k].p0.x); + fprintf(pFile, "\trects[%d].p0.y = %d\n", k, rects[k].p0.y); + fprintf(pFile, "\trects[%d].p1.x = %d\n", k, rects[k].p1.x); + fprintf(pFile, "\trects[%d].p1.y = %d\n", k, rects[k].p1.y); + fprintf(pFile, "\trects[%d].xellipse = %d\n", k, rects[k].xellipse); + fprintf(pFile, "\trects[%d].yellipse = %d\n", k, rects[k].yellipse); + } + return 0; +} + +static opvp_result_t +opvpBezierPath(opvp_dc_t printerContext, opvp_int_t n, const opvp_point_t *points) +{ + int k; + + fputs("opvpBezierPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tn = %d\n", n); + + for (k = 0; k < n; k++) { + fprintf(pFile, "\tpoints[%d].x = %d\n", k, points[k].x); + fprintf(pFile, "\trects[%d].y = %d\n", k, points[k].y); + + } + return 0; +} + +/* Not used */ +static opvp_result_t +opvpArcPath(opvp_dc_t printerContext, opvp_arcmode_t mode, opvp_arcdir_t dir, + opvp_fix_t a, opvp_fix_t b, opvp_fix_t c, opvp_fix_t d, opvp_fix_t e, opvp_fix_t f, + opvp_fix_t g, opvp_fix_t h) +{ + fputs("opvpArcPath\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpDrawImage(opvp_dc_t printerContext, opvp_int_t sw, opvp_int_t sh, opvp_int_t raster, + opvp_imageformat_t format, opvp_int_t dw, opvp_int_t dh, const void *data) +{ + int k; + unsigned char *data_char = (unsigned char*) data; + + fputs("opvpDrawImage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tsw = %d\n", sw); + fprintf(pFile, "\tsh = %d\n", sh); + fprintf(pFile, "\traster = %d\n", raster); + fprintf(pFile, "\tformat = %d\n", format); + fprintf(pFile, "\tdw = %d\n", dw); + fprintf(pFile, "\tdh = %d\n", dh); + + /* No idea how big data is here... Try sw, as byte? */ + for (k = 0; k < sw; k++) { + fprintf(pFile, "\tdata[%d] = %d\n", k, data_char[k]); + } + + return 0; +} + +static opvp_result_t +opvpStartDrawImage(opvp_dc_t printerContext, opvp_int_t sw, opvp_int_t sh, opvp_int_t raster, + opvp_imageformat_t format, opvp_int_t dw, opvp_int_t dh) +{ + fputs("opvpStartDrawImage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tsw = %d\n", sw); + fprintf(pFile, "\tsh = %d\n", sh); + fprintf(pFile, "\traster = %d\n", raster); + fprintf(pFile, "\tformat = %d\n", format); + fprintf(pFile, "\tdw = %d\n", dw); + fprintf(pFile, "\tdh = %d\n", dh); + return 0; +} + +static opvp_result_t +opvpTransferDrawImage(opvp_dc_t printerContext, opvp_int_t count, const void *data) +{ + int k; + unsigned char *data_char = (unsigned char*) data; + + fputs("opvpTransferDrawImage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\tcount = %d\n", count); + + for (k = 0; k < count; k++) { + fprintf(pFile, "\tdata[%d] = %d\n", k, data_char[k]); + } + return 0; +} + +static opvp_result_t +opvpEndDrawImage(opvp_dc_t printerContext) +{ + fputs("opvpEndDrawImage\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* not used */ +static opvp_result_t +opvpStartScanline(opvp_dc_t printerContext, opvp_int_t a) +{ + fputs("opvpStartScanline\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* not used */ +static opvp_result_t +opvpScanline(opvp_dc_t printerContext, opvp_int_t a, const opvp_int_t *b) +{ + fputs("opvpScanline\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* not used */ +static opvp_result_t +opvpEndScanline(opvp_dc_t printerContext) +{ + fputs("opvpEndScanline\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStartRaster(opvp_dc_t printerContext, opvp_int_t width) +{ + fputs("opvpStartRaster\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\twidth = %d\n", width); + return 0; +} + +static opvp_result_t +opvpTransferRasterData(opvp_dc_t printerContext, opvp_int_t raster_size, const opvp_byte_t *data) +{ + int k; + + fputs("opvpTransferRasterData\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\traster_size = %d\n", raster_size); + + for (k = 0; k < raster_size; k++) { + fprintf(pFile, "\tdata[%d] = %d\n", k, data[k]); + } + return 0; +} + +static opvp_result_t +opvpSkipRaster(opvp_dc_t printerContext, opvp_int_t a) +{ + fputs("opvpSkipRaster\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + fprintf(pFile, "\ta = %d\n", a); + return 0; +} + +static opvp_result_t +opvpEndRaster(opvp_dc_t printerContext) +{ + fputs("opvpEndRaster\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpStartStream(opvp_dc_t printerContext) +{ + fputs("opvpStartStream\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +/* Not used */ +static opvp_result_t +opvpTransferStreamData(opvp_dc_t printerContext, opvp_int_t a, const void *b) +{ + fputs("opvpTransferStreamData\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +static opvp_result_t +opvpEndStream(opvp_dc_t printerContext) +{ + fputs("opvpEndStream\n", pFile); + fprintf(pFile, "\tContext = %d\n", printerContext); + return 0; +} + +opvp_int_t opvpErrorNo; + +opvp_dc_t +opvpOpenPrinter(opvp_int_t outputFD, const opvp_char_t *printerModel, const opvp_int_t apiVersion[2], + opvp_api_procs_t **apiProcs) +{ + static opvp_api_procs_t procs; + opvp_fix_t fixed_value; + + procs.opvpEndStream = opvpEndStream; + procs.opvpClosePrinter = opvpClosePrinter; + procs.opvpStartJob = opvpStartJob; + procs.opvpEndJob = opvpEndJob; + procs.opvpAbortJob = opvpAbortJob; + procs.opvpStartDoc = opvpStartDoc; + procs.opvpEndDoc = opvpEndDoc; + procs.opvpStartPage = opvpStartPage; + procs.opvpEndPage = opvpEndPage; + procs.opvpQueryDeviceCapability = opvpQueryDeviceCapability; + procs.opvpQueryDeviceInfo = opvpQueryDeviceInfo; + procs.opvpResetCTM = opvpResetCTM; + procs.opvpSetCTM = opvpSetCTM; + procs.opvpGetCTM = opvpGetCTM; + procs.opvpInitGS = opvpInitGS; + procs.opvpSaveGS = opvpSaveGS; + procs.opvpRestoreGS = opvpRestoreGS; + procs.opvpQueryColorSpace = opvpQueryColorSpace; + procs.opvpSetColorSpace = opvpSetColorSpace; + procs.opvpGetColorSpace = opvpGetColorSpace; + procs.opvpSetFillMode = opvpSetFillMode; + procs.opvpGetFillMode = opvpGetFillMode; + procs.opvpSetAlphaConstant = opvpSetAlphaConstant; + procs.opvpGetAlphaConstant = opvpGetAlphaConstant; + procs.opvpSetLineWidth = opvpSetLineWidth; + procs.opvpGetLineWidth = opvpGetLineWidth; + procs.opvpSetLineDash = opvpSetLineDash; + procs.opvpSetLineDash = opvpSetLineDash; + procs.opvpGetLineDash = opvpGetLineDash; + procs.opvpSetLineDashOffset = opvpSetLineDashOffset; + procs.opvpGetLineDashOffset = opvpGetLineDashOffset; + procs.opvpSetLineStyle = opvpSetLineStyle; + procs.opvpGetLineStyle = opvpGetLineStyle; + procs.opvpSetLineCap = opvpSetLineCap; + procs.opvpGetLineCap = opvpGetLineCap; + procs.opvpSetLineJoin = opvpSetLineJoin; + procs.opvpGetLineJoin = opvpGetLineJoin; + procs.opvpSetMiterLimit = opvpSetMiterLimit; + procs.opvpGetMiterLimit = opvpGetMiterLimit; + procs.opvpSetPaintMode = opvpSetPaintMode; + procs.opvpGetPaintMode = opvpGetPaintMode; + procs.opvpSetStrokeColor = opvpSetStrokeColor; + procs.opvpSetFillColor = opvpSetFillColor; + procs.opvpSetBgColor = opvpSetBgColor; + procs.opvpNewPath = opvpNewPath; + procs.opvpEndPath = opvpEndPath; + procs.opvpStrokePath = opvpStrokePath; + procs.opvpFillPath = opvpFillPath; + procs.opvpStrokeFillPath = opvpStrokeFillPath; + procs.opvpSetClipPath = opvpSetClipPath; + procs.opvpResetClipPath = opvpResetClipPath; + procs.opvpSetCurrentPoint = opvpSetCurrentPoint; + procs.opvpLinePath = opvpLinePath; + procs.opvpPolygonPath = opvpPolygonPath; + procs.opvpRectanglePath = opvpRectanglePath; + procs.opvpRoundRectanglePath = opvpRoundRectanglePath; + procs.opvpBezierPath = opvpBezierPath; + procs.opvpArcPath = opvpArcPath; + procs.opvpDrawImage = opvpDrawImage; + procs.opvpStartDrawImage = opvpStartDrawImage; + procs.opvpTransferDrawImage = opvpTransferDrawImage; + procs.opvpEndDrawImage = opvpEndDrawImage; + procs.opvpStartScanline = opvpStartScanline; + procs.opvpScanline = opvpScanline; + procs.opvpEndScanline = opvpEndScanline; + procs.opvpStartRaster = opvpStartRaster; + procs.opvpTransferRasterData = opvpTransferRasterData; + procs.opvpSkipRaster = opvpSkipRaster; + procs.opvpEndRaster = opvpEndRaster; + procs.opvpStartStream = opvpStartStream; + procs.opvpTransferStreamData = opvpTransferStreamData; + procs.opvpEndStream = opvpEndStream; + + *apiProcs = &procs; + + OPVP_F2FIX(1.0, fixed_value); + + opv_gstate.ctm.a = 1.0; + opv_gstate.ctm.b = 0.0; + opv_gstate.ctm.c = 0.0; + opv_gstate.ctm.d = 1.0; + opv_gstate.ctm.e = 0.0; + opv_gstate.ctm.f = 0.0; + opv_gstate.colorspace = OPVP_CSPACE_DEVICERGB; + opv_gstate.fill_mode = OPVP_FILLMODE_EVENODD; + opv_gstate.alpha = 1.0; + opv_gstate.line_width = fixed_value; + opv_gstate.line_dash_n = 0; + opv_gstate.line_dash_array = NULL; + opv_gstate.dash_offset = fixed_value; + opv_gstate.line_style = OPVP_LINESTYLE_SOLID; + opv_gstate.line_cap = OPVP_LINECAP_BUTT; + opv_gstate.line_join = OPVP_LINEJOIN_MITER; + opv_gstate.miter_limit = fixed_value; + opv_gstate.paintmode = OPVP_PAINTMODE_OPAQUE; + opv_gstate.colorspace = OPVP_CSPACE_DEVICERGB; + + pFile = fopen("opvp_command_dump.txt","w"); + if (pFile != NULL) + { + fputs("opvpOpenPrinter\n", pFile); + return 0; + } + return -1; +} |