9 #include "OPVPWrapper.h"
10 #include "OPVPWrapper_0_2.h"
14 OPVPWrapper::OPVPWrapper(void *opvpHandleA, opvp_int_t *opvpErrorNoA,
15 opvp_api_procs_t *procsA, opvp_dc_t printerContextA)
18 opvpHandle = opvpHandleA;
19 opvpErrorNo = opvpErrorNoA;
20 printerContext = printerContextA;
23 supportClosePrinter = (procs->opvpClosePrinter != 0);
24 supportStartJob = (procs->opvpStartJob != 0);
25 supportEndJob = (procs->opvpEndJob != 0);
26 supportAbortJob = (procs->opvpAbortJob != 0);
27 supportStartDoc = (procs->opvpStartDoc != 0);
28 supportEndDoc = (procs->opvpEndDoc != 0);
29 supportStartPage = (procs->opvpStartPage != 0);
30 supportEndPage = (procs->opvpEndPage != 0);
31 supportResetCTM = (procs->opvpResetCTM != 0);
32 supportSetCTM = (procs->opvpSetCTM != 0);
33 supportGetCTM = (procs->opvpGetCTM != 0);
34 supportInitGS = (procs->opvpInitGS != 0);
35 supportSaveGS = (procs->opvpSaveGS != 0);
36 supportRestoreGS = (procs->opvpRestoreGS != 0);
37 supportQueryColorSpace = (procs->opvpQueryColorSpace != 0);
38 supportSetColorSpace = (procs->opvpSetColorSpace != 0);
39 supportGetColorSpace = (procs->opvpGetColorSpace != 0);
40 supportSetFillMode = (procs->opvpSetFillMode != 0);
41 supportGetFillMode = (procs->opvpGetFillMode != 0);
42 supportSetAlphaConstant = (procs->opvpSetAlphaConstant != 0);
43 supportGetAlphaConstant = (procs->opvpGetAlphaConstant != 0);
44 supportSetLineWidth = (procs->opvpSetLineWidth != 0);
45 supportGetLineWidth = (procs->opvpGetLineWidth != 0);
46 supportSetLineDash = (procs->opvpSetLineDash != 0);
47 supportGetLineDash = (procs->opvpGetLineDash != 0);
48 supportSetLineDashOffset = (procs->opvpSetLineDashOffset != 0);
49 supportGetLineDashOffset = (procs->opvpGetLineDashOffset != 0);
50 supportSetLineStyle = (procs->opvpSetLineStyle != 0);
51 supportGetLineStyle = (procs->opvpGetLineStyle != 0);
52 supportSetLineCap = (procs->opvpSetLineCap != 0);
53 supportGetLineCap = (procs->opvpGetLineCap != 0);
54 supportSetLineJoin = (procs->opvpSetLineJoin != 0);
55 supportGetLineJoin = (procs->opvpGetLineJoin != 0);
56 supportSetMiterLimit = (procs->opvpSetMiterLimit != 0);
57 supportGetMiterLimit = (procs->opvpGetMiterLimit != 0);
58 supportSetPaintMode = (procs->opvpSetPaintMode != 0);
59 supportGetPaintMode = (procs->opvpGetPaintMode != 0);
60 supportSetStrokeColor = (procs->opvpSetStrokeColor != 0);
61 supportSetFillColor = (procs->opvpSetFillColor != 0);
62 supportSetBgColor = (procs->opvpSetBgColor != 0);
63 supportNewPath = (procs->opvpNewPath != 0);
64 supportEndPath = (procs->opvpEndPath != 0);
65 supportStrokePath = (procs->opvpStrokePath != 0);
66 supportFillPath = (procs->opvpFillPath != 0);
67 supportStrokeFillPath = (procs->opvpStrokeFillPath != 0);
68 supportSetClipPath = (procs->opvpSetClipPath != 0);
69 supportSetCurrentPoint = (procs->opvpSetCurrentPoint != 0);
70 supportLinePath = (procs->opvpLinePath != 0);
71 supportPolygonPath = (procs->opvpPolygonPath != 0);
72 supportRectanglePath = (procs->opvpRectanglePath != 0);
73 supportRoundRectanglePath = (procs->opvpRoundRectanglePath != 0);
74 supportBezierPath = (procs->opvpBezierPath != 0);
75 supportArcPath = (procs->opvpArcPath != 0);
76 supportDrawImage = (procs->opvpDrawImage != 0);
77 supportStartDrawImage = (procs->opvpStartDrawImage != 0);
78 supportTransferDrawImage = (procs->opvpTransferDrawImage != 0);
79 supportEndDrawImage = (procs->opvpEndDrawImage != 0);
80 supportStartScanline = (procs->opvpStartScanline != 0);
81 supportScanline = (procs->opvpScanline != 0);
82 supportEndScanline = (procs->opvpEndScanline != 0);
83 supportStartRaster = (procs->opvpStartRaster != 0);
84 supportTransferRasterData = (procs->opvpTransferRasterData != 0);
85 supportSkipRaster = (procs->opvpSkipRaster != 0);
86 supportEndRaster = (procs->opvpEndRaster != 0);
87 supportStartStream = (procs->opvpStartStream != 0);
88 supportTransferStreamData = (procs->opvpTransferStreamData != 0);
89 supportEndStream = (procs->opvpEndStream != 0);
90 supportQueryDeviceCapability = (procs->opvpQueryDeviceCapability != 0);
91 supportQueryDeviceInfo = (procs->opvpQueryDeviceInfo != 0);
92 supportResetClipPath = (procs->opvpResetClipPath != 0);
95 OPVPWrapper::~OPVPWrapper()
97 unloadDriver(opvpHandle);
101 opvp_result_t OPVPWrapper::ClosePrinter()
103 if (!supportClosePrinter) {
104 *opvpErrorNo = OPVP_NOTSUPPORTED;
107 return procs->opvpClosePrinter(printerContext);
110 opvp_result_t OPVPWrapper::StartJob(const opvp_char_t *jobInfo)
112 if (!supportStartJob) {
113 *opvpErrorNo = OPVP_NOTSUPPORTED;
116 return procs->opvpStartJob(printerContext,jobInfo);
119 opvp_result_t OPVPWrapper::EndJob()
121 if (!supportEndJob) {
122 *opvpErrorNo = OPVP_NOTSUPPORTED;
125 return procs->opvpEndJob(printerContext);
128 opvp_result_t OPVPWrapper::AbortJob()
130 if (!supportAbortJob) {
131 *opvpErrorNo = OPVP_NOTSUPPORTED;
134 return procs->opvpAbortJob(printerContext);
137 opvp_result_t OPVPWrapper::StartDoc(const opvp_char_t *docInfo)
139 if (!supportStartDoc) {
140 *opvpErrorNo = OPVP_NOTSUPPORTED;
143 return procs->opvpStartDoc(printerContext,docInfo);
146 opvp_result_t OPVPWrapper::EndDoc()
148 if (!supportEndDoc) {
149 *opvpErrorNo = OPVP_NOTSUPPORTED;
152 return procs->opvpEndDoc(printerContext);
155 opvp_result_t OPVPWrapper::StartPage(const opvp_char_t *pageInfo)
157 if (!supportStartPage) {
158 *opvpErrorNo = OPVP_NOTSUPPORTED;
161 return procs->opvpStartPage(printerContext,pageInfo);
164 opvp_result_t OPVPWrapper::EndPage()
166 if (!supportEndPage) {
167 *opvpErrorNo = OPVP_NOTSUPPORTED;
170 return procs->opvpEndPage(printerContext);
173 opvp_result_t OPVPWrapper::QueryDeviceCapability(opvp_flag_t queryflag,
174 opvp_int_t *buflen, opvp_byte_t *infoBuf)
176 if (!supportQueryDeviceCapability) {
177 *opvpErrorNo = OPVP_NOTSUPPORTED;
180 return procs->opvpQueryDeviceCapability(printerContext,queryflag,
184 opvp_result_t OPVPWrapper::QueryDeviceInfo(opvp_flag_t queryflag,
185 opvp_int_t *buflen, opvp_byte_t *infoBuf)
187 if (!supportQueryDeviceInfo) {
188 *opvpErrorNo = OPVP_NOTSUPPORTED;
191 return procs->opvpQueryDeviceInfo(printerContext,queryflag,
195 opvp_result_t OPVPWrapper::ResetCTM()
197 if (!supportResetCTM) {
198 *opvpErrorNo = OPVP_NOTSUPPORTED;
201 return procs->opvpResetCTM(printerContext);
204 opvp_result_t OPVPWrapper::SetCTM(const opvp_ctm_t *pCTM)
206 if (!supportSetCTM) {
207 *opvpErrorNo = OPVP_NOTSUPPORTED;
210 return procs->opvpSetCTM(printerContext,pCTM);
213 opvp_result_t OPVPWrapper::GetCTM(opvp_ctm_t *pCTM)
215 if (!supportGetCTM) {
216 *opvpErrorNo = OPVP_NOTSUPPORTED;
219 return procs->opvpGetCTM(printerContext,pCTM);
222 opvp_result_t OPVPWrapper::InitGS()
224 if (!supportInitGS) {
225 *opvpErrorNo = OPVP_NOTSUPPORTED;
228 return procs->opvpInitGS(printerContext);
231 opvp_result_t OPVPWrapper::SaveGS()
233 if (!supportSaveGS) {
234 *opvpErrorNo = OPVP_NOTSUPPORTED;
237 return procs->opvpSaveGS(printerContext);
240 opvp_result_t OPVPWrapper::RestoreGS()
242 if (!supportRestoreGS) {
243 *opvpErrorNo = OPVP_NOTSUPPORTED;
246 return procs->opvpRestoreGS(printerContext);
249 opvp_result_t OPVPWrapper::QueryColorSpace(opvp_int_t *pnum,
250 opvp_cspace_t *pcspace)
252 if (!supportQueryColorSpace) {
253 *opvpErrorNo = OPVP_NOTSUPPORTED;
256 return procs->opvpQueryColorSpace(printerContext,pnum,pcspace);
259 opvp_result_t OPVPWrapper::SetColorSpace(opvp_cspace_t cspace)
261 if (!supportSetColorSpace) {
262 *opvpErrorNo = OPVP_NOTSUPPORTED;
265 return procs->opvpSetColorSpace(printerContext,cspace);
268 opvp_result_t OPVPWrapper::GetColorSpace(opvp_cspace_t *pcspace)
270 if (!supportGetColorSpace) {
271 *opvpErrorNo = OPVP_NOTSUPPORTED;
274 return procs->opvpGetColorSpace(printerContext,pcspace);
277 opvp_result_t OPVPWrapper::SetFillMode(opvp_fillmode_t fillmode)
279 if (!supportSetFillMode) {
280 *opvpErrorNo = OPVP_NOTSUPPORTED;
283 return procs->opvpSetFillMode(printerContext,fillmode);
286 opvp_result_t OPVPWrapper::GetFillMode(opvp_fillmode_t *pfillmode)
288 if (!supportGetFillMode) {
289 *opvpErrorNo = OPVP_NOTSUPPORTED;
292 return procs->opvpGetFillMode(printerContext,pfillmode);
295 opvp_result_t OPVPWrapper::SetAlphaConstant(opvp_float_t alpha)
297 if (!supportSetAlphaConstant) {
298 *opvpErrorNo = OPVP_NOTSUPPORTED;
301 return procs->opvpSetAlphaConstant(printerContext,alpha);
304 opvp_result_t OPVPWrapper::GetAlphaConstant(opvp_float_t *palpha)
306 if (!supportGetAlphaConstant) {
307 *opvpErrorNo = OPVP_NOTSUPPORTED;
310 return procs->opvpGetAlphaConstant(printerContext,palpha);
313 opvp_result_t OPVPWrapper::SetLineWidth(opvp_fix_t width)
315 if (!supportSetLineWidth) {
316 *opvpErrorNo = OPVP_NOTSUPPORTED;
319 return procs->opvpSetLineWidth(printerContext,width);
322 opvp_result_t OPVPWrapper::GetLineWidth(opvp_fix_t *pwidth)
324 if (!supportGetLineWidth) {
325 *opvpErrorNo = OPVP_NOTSUPPORTED;
328 return procs->opvpGetLineWidth(printerContext,pwidth);
331 opvp_result_t OPVPWrapper::SetLineDash(opvp_int_t num,
332 const opvp_fix_t *pdash)
334 if (!supportSetLineDash) {
335 *opvpErrorNo = OPVP_NOTSUPPORTED;
338 return procs->opvpSetLineDash(printerContext,num,pdash);
341 opvp_result_t OPVPWrapper::GetLineDash(opvp_int_t *pnum, opvp_fix_t *pdash)
343 if (!supportGetLineDash) {
344 *opvpErrorNo = OPVP_NOTSUPPORTED;
347 return procs->opvpGetLineDash(printerContext,pnum,pdash);
350 opvp_result_t OPVPWrapper::SetLineDashOffset(opvp_fix_t offset)
352 if (!supportSetLineDashOffset) {
353 *opvpErrorNo = OPVP_NOTSUPPORTED;
356 return procs->opvpSetLineDashOffset(printerContext,offset);
359 opvp_result_t OPVPWrapper::GetLineDashOffset(opvp_fix_t *poffset)
361 if (!supportGetLineDashOffset) {
362 *opvpErrorNo = OPVP_NOTSUPPORTED;
365 return procs->opvpGetLineDashOffset(printerContext,poffset);
368 opvp_result_t OPVPWrapper::SetLineStyle(opvp_linestyle_t linestyle)
370 if (!supportSetLineStyle) {
371 *opvpErrorNo = OPVP_NOTSUPPORTED;
374 return procs->opvpSetLineStyle(printerContext,linestyle);
377 opvp_result_t OPVPWrapper::GetLineStyle(opvp_linestyle_t *plinestyle)
379 if (!supportGetLineStyle) {
380 *opvpErrorNo = OPVP_NOTSUPPORTED;
383 return procs->opvpGetLineStyle(printerContext,plinestyle);
386 opvp_result_t OPVPWrapper::SetLineCap(opvp_linecap_t linecap)
388 if (!supportSetLineCap) {
389 *opvpErrorNo = OPVP_NOTSUPPORTED;
392 return procs->opvpSetLineCap(printerContext,linecap);
395 opvp_result_t OPVPWrapper::GetLineCap(opvp_linecap_t *plinecap)
397 if (!supportGetLineCap) {
398 *opvpErrorNo = OPVP_NOTSUPPORTED;
401 return procs->opvpGetLineCap(printerContext,plinecap);
404 opvp_result_t OPVPWrapper::SetLineJoin(opvp_linejoin_t linejoin)
406 if (!supportSetLineJoin) {
407 *opvpErrorNo = OPVP_NOTSUPPORTED;
410 return procs->opvpSetLineJoin(printerContext,linejoin);
413 opvp_result_t OPVPWrapper::GetLineJoin(opvp_linejoin_t *plinejoin)
415 if (!supportGetLineJoin) {
416 *opvpErrorNo = OPVP_NOTSUPPORTED;
419 return procs->opvpGetLineJoin(printerContext,plinejoin);
422 opvp_result_t OPVPWrapper::SetMiterLimit(opvp_fix_t miterlimit)
424 if (!supportSetMiterLimit) {
425 *opvpErrorNo = OPVP_NOTSUPPORTED;
428 return procs->opvpSetMiterLimit(printerContext,miterlimit);
431 opvp_result_t OPVPWrapper::GetMiterLimit(opvp_fix_t *pmiterlimit)
433 if (!supportGetMiterLimit) {
434 *opvpErrorNo = OPVP_NOTSUPPORTED;
437 return procs->opvpGetMiterLimit(printerContext,pmiterlimit);
440 opvp_result_t OPVPWrapper::SetPaintMode(opvp_paintmode_t paintmode)
442 if (!supportSetPaintMode) {
443 *opvpErrorNo = OPVP_NOTSUPPORTED;
446 return procs->opvpSetPaintMode(printerContext,paintmode);
449 opvp_result_t OPVPWrapper::GetPaintMode(opvp_paintmode_t *ppaintmode)
451 if (!supportGetPaintMode) {
452 *opvpErrorNo = OPVP_NOTSUPPORTED;
455 return procs->opvpGetPaintMode(printerContext,ppaintmode);
458 opvp_result_t OPVPWrapper::SetStrokeColor(const opvp_brush_t *brush)
460 if (!supportSetStrokeColor) {
461 *opvpErrorNo = OPVP_NOTSUPPORTED;
464 return procs->opvpSetStrokeColor(printerContext,brush);
467 opvp_result_t OPVPWrapper::SetFillColor(const opvp_brush_t *brush)
469 if (!supportSetFillColor) {
470 *opvpErrorNo = OPVP_NOTSUPPORTED;
473 return procs->opvpSetFillColor(printerContext,brush);
476 opvp_result_t OPVPWrapper::SetBgColor(const opvp_brush_t *brush)
478 if (!supportSetBgColor) {
479 *opvpErrorNo = OPVP_NOTSUPPORTED;
482 return procs->opvpSetBgColor(printerContext,brush);
485 opvp_result_t OPVPWrapper::NewPath()
487 if (!supportNewPath) {
488 *opvpErrorNo = OPVP_NOTSUPPORTED;
491 return procs->opvpNewPath(printerContext);
494 opvp_result_t OPVPWrapper::EndPath()
496 if (!supportEndPath) {
497 *opvpErrorNo = OPVP_NOTSUPPORTED;
500 return procs->opvpEndPath(printerContext);
503 opvp_result_t OPVPWrapper::StrokePath()
505 if (!supportStrokePath) {
506 *opvpErrorNo = OPVP_NOTSUPPORTED;
509 return procs->opvpStrokePath(printerContext);
512 opvp_result_t OPVPWrapper::FillPath()
514 if (!supportFillPath) {
515 *opvpErrorNo = OPVP_NOTSUPPORTED;
518 return procs->opvpFillPath(printerContext);
521 opvp_result_t OPVPWrapper::StrokeFillPath()
523 if (!supportStrokeFillPath) {
524 *opvpErrorNo = OPVP_NOTSUPPORTED;
527 return procs->opvpStrokeFillPath(printerContext);
530 opvp_result_t OPVPWrapper::SetClipPath(opvp_cliprule_t clipRule)
532 if (!supportSetClipPath) {
533 *opvpErrorNo = OPVP_NOTSUPPORTED;
536 return procs->opvpSetClipPath(printerContext,clipRule);
539 opvp_result_t OPVPWrapper::SetCurrentPoint(opvp_fix_t x, opvp_fix_t y)
541 if (!supportSetCurrentPoint) {
542 *opvpErrorNo = OPVP_NOTSUPPORTED;
545 return procs->opvpSetCurrentPoint(printerContext,x,y);
548 opvp_result_t OPVPWrapper::LinePath(opvp_pathmode_t flag,
549 opvp_int_t npoints, const opvp_point_t *points)
551 if (!supportLinePath) {
552 *opvpErrorNo = OPVP_NOTSUPPORTED;
555 return procs->opvpLinePath(printerContext,flag,npoints,points);
558 opvp_result_t OPVPWrapper::PolygonPath(opvp_int_t npolygons,
559 const opvp_int_t *nvertexes, const opvp_point_t *points)
561 if (!supportPolygonPath) {
562 *opvpErrorNo = OPVP_NOTSUPPORTED;
565 return procs->opvpPolygonPath(printerContext,npolygons,nvertexes,points);
568 opvp_result_t OPVPWrapper::RectanglePath(opvp_int_t nrectangles,
569 const opvp_rectangle_t *rectangles)
571 if (!supportRectanglePath) {
572 *opvpErrorNo = OPVP_NOTSUPPORTED;
575 return procs->opvpRectanglePath(printerContext,nrectangles,rectangles);
578 opvp_result_t OPVPWrapper::RoundRectanglePath(opvp_int_t nrectangles,
579 const opvp_roundrectangle_t *rectangles)
581 if (!supportRoundRectanglePath) {
582 *opvpErrorNo = OPVP_NOTSUPPORTED;
585 return procs->opvpRoundRectanglePath(printerContext,nrectangles,rectangles);
588 opvp_result_t OPVPWrapper::BezierPath(opvp_int_t npoints,
589 const opvp_point_t *points)
591 if (!supportBezierPath) {
592 *opvpErrorNo = OPVP_NOTSUPPORTED;
595 return procs->opvpBezierPath(printerContext,npoints,points);
598 opvp_result_t OPVPWrapper::ArcPath(opvp_arcmode_t kind,
599 opvp_arcdir_t dir, opvp_fix_t bbx0,
600 opvp_fix_t bby0, opvp_fix_t bbx1, opvp_fix_t bby1, opvp_fix_t x0,
601 opvp_fix_t y0, opvp_fix_t x1, opvp_fix_t y1)
603 if (!supportArcPath) {
604 *opvpErrorNo = OPVP_NOTSUPPORTED;
607 return procs->opvpArcPath(printerContext,kind,dir,bbx0,bby0,
608 bbx1,bby1,x0,y0,x1,y1);
611 opvp_result_t OPVPWrapper::DrawImage(
612 opvp_int_t sourceWidth, opvp_int_t sourceHeight, opvp_int_t sourcePitch,
613 opvp_imageformat_t imageFormat, opvp_int_t destinationWidth,
614 opvp_int_t destinationHeight, const void *imagedata)
616 if (!supportDrawImage) {
619 if ((result = StartDrawImage(sourceWidth,sourceHeight,sourcePitch,
620 imageFormat,destinationWidth,destinationHeight)) < 0) {
623 if ((result = TransferDrawImage(sourcePitch*sourceHeight,
627 return EndDrawImage();
629 return procs->opvpDrawImage(printerContext,sourceWidth, sourceHeight,
630 sourcePitch, imageFormat, destinationWidth, destinationHeight,
634 opvp_result_t OPVPWrapper::StartDrawImage(
635 opvp_int_t sourceWidth, opvp_int_t sourceHeight, opvp_int_t sourcePitch,
636 opvp_imageformat_t imageFormat, opvp_int_t destinationWidth,
637 opvp_int_t destinationHeight)
639 if (!supportStartDrawImage) {
640 *opvpErrorNo = OPVP_NOTSUPPORTED;
643 return procs->opvpStartDrawImage(printerContext,sourceWidth,
644 sourceHeight,sourcePitch,imageFormat,
645 destinationWidth,destinationHeight);
648 opvp_result_t OPVPWrapper::TransferDrawImage(opvp_int_t count,
649 const void *imagedata)
651 if (!supportTransferDrawImage) {
652 *opvpErrorNo = OPVP_NOTSUPPORTED;
655 return procs->opvpTransferDrawImage(printerContext,count,imagedata);
658 opvp_result_t OPVPWrapper::EndDrawImage()
660 if (!supportEndDrawImage) {
661 *opvpErrorNo = OPVP_NOTSUPPORTED;
664 return procs->opvpEndDrawImage(printerContext);
667 opvp_result_t OPVPWrapper::StartScanline(opvp_int_t yposition)
669 if (!supportStartScanline) {
670 *opvpErrorNo = OPVP_NOTSUPPORTED;
673 return procs->opvpStartScanline(printerContext,yposition);
676 opvp_result_t OPVPWrapper::Scanline(opvp_int_t nscanpairs,
677 const opvp_int_t *scanpairs)
679 if (!supportScanline) {
680 *opvpErrorNo = OPVP_NOTSUPPORTED;
683 return procs->opvpScanline(printerContext,nscanpairs,scanpairs);
686 opvp_result_t OPVPWrapper::EndScanline()
688 if (!supportEndScanline) {
689 *opvpErrorNo = OPVP_NOTSUPPORTED;
692 return procs->opvpEndScanline(printerContext);
695 opvp_result_t OPVPWrapper::StartRaster(
696 opvp_int_t rasterWidth)
698 if (!supportStartRaster) {
699 *opvpErrorNo = OPVP_NOTSUPPORTED;
702 return procs->opvpStartRaster(printerContext,rasterWidth);
705 opvp_result_t OPVPWrapper::TransferRasterData(opvp_int_t count,
706 const opvp_byte_t *data)
708 if (!supportTransferRasterData) {
709 *opvpErrorNo = OPVP_NOTSUPPORTED;
712 return procs->opvpTransferRasterData(printerContext,count,
716 opvp_result_t OPVPWrapper::SkipRaster(opvp_int_t count)
718 if (!supportSkipRaster) {
719 *opvpErrorNo = OPVP_NOTSUPPORTED;
722 return procs->opvpSkipRaster(printerContext,count);
725 opvp_result_t OPVPWrapper::EndRaster()
727 if (!supportEndRaster) {
728 *opvpErrorNo = OPVP_NOTSUPPORTED;
731 return procs->opvpEndRaster(printerContext);
734 opvp_result_t OPVPWrapper::StartStream()
736 if (!supportStartStream) {
737 *opvpErrorNo = OPVP_NOTSUPPORTED;
740 return procs->opvpStartStream(printerContext);
743 opvp_result_t OPVPWrapper::TransferStreamData(opvp_int_t count,
746 if (!supportTransferStreamData) {
747 *opvpErrorNo = OPVP_NOTSUPPORTED;
750 return procs->opvpTransferStreamData(printerContext,count,data);
753 opvp_result_t OPVPWrapper::EndStream()
755 if (!supportEndStream) {
756 *opvpErrorNo = OPVP_NOTSUPPORTED;
759 return procs->opvpEndStream(printerContext);
762 opvp_result_t OPVPWrapper::ResetClipPath()
764 if (!supportResetClipPath) {
765 *opvpErrorNo = OPVP_NOTSUPPORTED;
768 return procs->opvpResetClipPath(printerContext);
771 char *OPVPWrapper::allocString(char **destin, unsigned int size)
773 if (!destin) return 0;
775 if (*destin != 0) delete[] *destin;
777 *destin = new char[size];
783 char **OPVPWrapper::genDynamicLibName(const char *name)
785 static char *buff[5] = {0,0,0,0,0};
787 allocString(&(buff[0]), strlen(name)+1);
788 strcpy(buff[0], name);
789 allocString(&(buff[1]), strlen(name)+3+1);
790 strcpy(buff[1], name);
791 strcat(buff[1], ".so");
792 allocString(&(buff[2]), strlen(name)+4+1);
793 strcpy(buff[2], name);
794 strcat(buff[2], ".dll");
795 allocString(&(buff[3]), strlen(name)+6+1);
796 strcpy(buff[3], "lib");
797 strcat(buff[3], name);
798 strcat(buff[3], ".so");
804 OPVPWrapper *OPVPWrapper::loadDriver(const char *driverName,
805 int outputFD, const char *printerModel)
811 int (*opvpOpenPrinter)(opvp_int_t outputFD,
812 const opvp_char_t * printerModel, const opvp_int_t version[2],
813 opvp_api_procs_t **apiEntry) = 0;
814 int (*opvpOpenPrinter_0_2)(int outputFD, char* printerModel,
815 int *nApiEntry, OPVP_api_procs **apiEntry) = 0;
816 opvp_api_procs_t *opvpProcs;
817 OPVP_api_procs *opvpProcs_0_2;
818 opvp_dc_t opvpContext;
819 int opvpContext_0_2 = 0;
820 opvp_int_t *opvpErrorNo = 0;
821 int *opvpErrorNo_0_2 = 0;
823 OPVPWrapper *opvp = 0;
825 list = genDynamicLibName(driverName);
830 if ((h = dlopen(list[i],RTLD_NOW))) {
831 opvpOpenPrinter = (int (*)(opvp_int_t,
832 const opvp_char_t *, const opvp_int_t[2],
833 opvp_api_procs_t **))dlsym(h,"opvpOpenPrinter");
834 opvpErrorNo = (opvp_int_t *)dlsym(h,"opvpErrorNo");
835 if (opvpOpenPrinter && opvpErrorNo) {
841 /* try version 0.2 driver */
842 opvpOpenPrinter_0_2 = (int (*)(int, char*, int *,
843 OPVP_api_procs **))dlsym(h,"OpenPrinter");
844 opvpErrorNo_0_2 = (int *)dlsym(h,"errorno");
845 if (opvpOpenPrinter_0_2 && opvpErrorNo_0_2) {
849 opvpOpenPrinter_0_2 = 0;
854 for (i = 0;list[i] != 0;i++) {
860 OPRS::error("Loading vector printer driver (%s) fail\n",driverName);
863 if (opvpOpenPrinter != 0) {
864 opvp_int_t apiVersion[2];
866 /* require version 1.0 */
869 if ((opvpContext = (*opvpOpenPrinter)(outputFD,
870 (const opvp_char_t *)printerModel,apiVersion,&opvpProcs)) < 0) {
871 OPRS::error("OpenPrinter fail\n",driverName);
872 unloadDriver(handle);
875 opvp = new OPVPWrapper(handle, opvpErrorNo, opvpProcs, opvpContext);
876 } else if (opvpOpenPrinter_0_2) {
877 if ((opvpContext_0_2 = (*opvpOpenPrinter_0_2)(outputFD,
878 (char *)printerModel,&nApiEntry,&opvpProcs_0_2)) < 0) {
879 OPRS::error("OpenPrinter fail\n",driverName);
880 unloadDriver(handle);
883 opvp = (OPVPWrapper *)new OPVPWrapper_0_2(handle, opvpErrorNo_0_2,
884 opvpProcs_0_2, opvpContext_0_2);
890 * unload vector-driver
892 int OPVPWrapper::unloadDriver(void *opvpHandleA)
894 if (opvpHandleA != 0) {
895 dlclose(opvpHandleA);
900 opvp_int_t OPVPWrapper::getErrorNo()