35 #include <QMutexLocker>
46 #if defined ( PLD_bmpqt )
47 "bmpqt:Qt Windows bitmap driver:0:qt:66:bmpqt\n"
49 #if defined ( PLD_jpgqt )
50 "jpgqt:Qt jpg driver:0:qt:67:jpgqt\n"
52 #if defined ( PLD_pngqt )
53 "pngqt:Qt png driver:0:qt:68:pngqt\n"
55 #if defined ( PLD_ppmqt )
56 "ppmqt:Qt ppm driver:0:qt:69:ppmqt\n"
58 #if defined ( PLD_tiffqt )
59 "tiffqt:Qt tiff driver:0:qt:70:tiffqt\n"
61 #if defined ( PLD_svgqt ) && QT_VERSION >= 0x040300
62 "svgqt:Qt SVG driver:0:qt:71:svgqt\n"
64 #if defined ( PLD_qtwidget )
65 "qtwidget:Qt Widget:1:qt:72:qtwidget\n"
67 #if defined ( PLD_epsqt )
68 "epsqt:Qt EPS driver:0:qt:73:epsqt\n"
70 #if defined ( PLD_pdfqt )
71 "pdfqt:Qt PDF driver:0:qt:74:pdfqt\n"
73 #if defined ( PLD_extqt )
74 "extqt:External Qt driver:0:qt:75:extqt\n"
76 #if defined ( PLD_memqt )
77 "memqt:Memory Qt driver:0:qt:76:memqt\n"
83 {
"lines_antialiasing",
DRV_INT, &lines_aa,
"Toggles antialiasing on lines (0|1)" },
84 { NULL,
DRV_INT, NULL, NULL } };
95 argv[0] =
new char[10];
96 argv[1] =
new char[1];
101 if ( getenv(
"DISPLAY" ) == NULL )
104 new QApplication(
argc,
argv, isGUI );
143 plwarn(
"All pages after the first skipped because family file output not specified.\n" );
150 #if defined ( PLD_bmpqt ) || defined ( PLD_jpgqt ) || defined ( PLD_pngqt ) || defined ( PLD_ppmqt ) || defined ( PLD_tiffqt ) || defined ( PLD_memqt )
151 void plD_init_rasterqt(
PLStream * );
152 void plD_eop_rasterqt(
PLStream * );
153 void plD_line_rasterqt(
PLStream *,
short,
short,
short,
short );
154 void plD_polyline_rasterqt(
PLStream *,
short*,
short*,
PLINT );
155 void plD_tidy_rasterqt(
PLStream * );
160 #if defined ( PLD_bmpqt )
165 #if defined ( PLD_jpgqt )
170 #if defined ( PLD_pngqt )
175 #if defined ( PLD_ppmqt )
180 #if defined ( PLD_tiffqt )
185 #if defined ( PLD_svgqt ) && QT_VERSION >= 0x040300
190 void plD_line_svgqt(
PLStream *,
short,
short,
short,
short );
191 void plD_polyline_svgqt(
PLStream *,
short*,
short*,
PLINT );
197 #if defined ( PLD_epsqt ) || defined ( PLD_pdfqt )
198 void plD_init_epspdfqt(
PLStream * );
199 void plD_bop_epspdfqt_helper(
PLStream *,
int ifeps );
200 void plD_eop_epspdfqt(
PLStream * );
201 void plD_line_epspdfqt(
PLStream *,
short,
short,
short,
short );
202 void plD_polyline_epspdfqt(
PLStream *,
short*,
short*,
PLINT );
203 void plD_tidy_epspdfqt(
PLStream * );
207 #if defined ( PLD_epsqt )
211 #if defined ( PLD_pdfqt )
216 #if defined ( PLD_qtwidget )
218 void plD_init_qtwidget(
PLStream * );
219 void plD_eop_qtwidget(
PLStream * );
220 void plD_line_qtwidget(
PLStream *,
short,
short,
short,
short );
221 void plD_polyline_qtwidget(
PLStream *,
short*,
short*,
PLINT );
222 void plD_tidy_qtwidget(
PLStream * );
225 void plD_bop_qtwidget(
PLStream * );
228 #if defined ( PLD_extqt )
232 void plD_line_extqt(
PLStream *,
short,
short,
short,
short );
233 void plD_polyline_extqt(
PLStream *,
short*,
short*,
PLINT );
240 #if defined ( PLD_memqt )
248 #if defined ( PLD_bmpqt ) || defined ( PLD_jpgqt ) || defined ( PLD_pngqt ) || defined ( PLD_ppmqt ) || defined ( PLD_tiffqt ) || defined ( PLD_memqt )
249 void plD_init_rasterqt(
PLStream * pls )
280 if ( pls->
xdpi <= 0. )
288 pls->
dev =
new QtRasterDevice;
289 pls->
xlength = (
PLINT) ( ( (QtRasterDevice *) ( pls->
dev ) )->m_dWidth );
290 pls->
ylength = (
PLINT) ( ( (QtRasterDevice *) ( pls->
dev ) )->m_dHeight );
296 ( (QtRasterDevice *) pls->
dev )->setPLStream( pls );
299 handler.setMasterDevice( (QtRasterDevice *) ( pls->
dev ) );
308 plP_setpxl( dpi / 25.4 / ( (QtRasterDevice *) ( pls->
dev ) )->downscale, dpi / 25.4 / ( (QtRasterDevice *) ( pls->
dev ) )->downscale );
310 ( (QtRasterDevice *) ( pls->
dev ) )->setResolution( dpi );
318 void plD_eop_rasterqt(
PLStream *pls )
324 ( (QtRasterDevice *) pls->
dev )->savePlot();
325 handler.DeviceChangedPage( (QtRasterDevice *) pls->
dev );
328 void plD_line_rasterqt(
PLStream * pls,
short x1a,
short y1a,
short x2a,
short y2a )
330 QtRasterDevice* widget = (QtRasterDevice *) pls->
dev;
336 if ( widget == NULL )
340 widget->drawLine( x1a, y1a, x2a, y2a );
343 void plD_polyline_rasterqt(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
345 QtRasterDevice * widget = (QtRasterDevice *) pls->
dev;
351 if ( widget == NULL )
355 widget->drawPolyline( xa, ya, npts );
361 unsigned char *r, *g, *b;
364 QtRasterDevice * widget = (QtRasterDevice *) pls->
dev;
369 if ( widget == NULL )
385 for ( i = 0; i < pls->
dev_npts; i++ )
387 xa[i] = pls->
dev_x[i];
388 ya[i] = pls->
dev_y[i];
391 widget->drawPolygon( xa, ya, pls->
dev_npts );
400 r =
new unsigned char[pls->
ncol1];
401 g =
new unsigned char[pls->
ncol1];
402 b =
new unsigned char[pls->
ncol1];
405 for ( i = 0; i < pls->
ncol1; i++ )
410 alpha[i] = pls->
cmap1[i].
a;
414 for ( i = 0; i < pls->
dev_npts; i++ )
416 xa[i] = pls->
dev_x[i];
417 ya[i] = pls->
dev_y[i];
419 widget->drawPolygon( xa, ya, pls->
dev_npts );
433 widget->drawText( (
EscText *) ptr );
442 QtRasterDevice * widget = (QtRasterDevice *) pls->
dev;
447 if ( widget == NULL )
453 widget->setWidthF( pls->
width );
469 void plD_tidy_rasterqt(
PLStream * pls )
471 QtRasterDevice * widget = (QtRasterDevice *) pls->
dev;
473 if ( widget != NULL )
475 handler.DeviceClosed( widget );
485 #if defined ( PLD_bmpqt )
488 #ifndef ENABLE_DYNDRIVERS
515 ( (QtRasterDevice *) pls->
dev )->definePlotName( pls->
FileName,
"BMP" );
520 #if defined ( PLD_jpgqt )
523 #ifndef ENABLE_DYNDRIVERS
550 ( (QtRasterDevice *) pls->
dev )->definePlotName( pls->
FileName,
"JPG" );
555 #if defined ( PLD_pngqt )
558 #ifndef ENABLE_DYNDRIVERS
585 ( (QtRasterDevice *) pls->
dev )->definePlotName( pls->
FileName,
"PNG" );
590 #if defined ( PLD_ppmqt )
593 #ifndef ENABLE_DYNDRIVERS
620 ( (QtRasterDevice *) pls->
dev )->definePlotName( pls->
FileName,
"PPM" );
625 #if defined ( PLD_tiffqt )
628 #ifndef ENABLE_DYNDRIVERS
644 void plD_bop_tiffqt(
PLStream *pls )
655 ( (QtRasterDevice *) pls->
dev )->definePlotName( pls->
FileName,
"TIFF" );
660 #if defined ( PLD_svgqt ) && QT_VERSION >= 0x040300
663 #ifndef ENABLE_DYNDRIVERS
679 void plD_init_svgqt(
PLStream * pls )
710 pls->
dev =
new QtSVGDevice;
711 pls->
xlength = (int) ( ( (QtSVGDevice *) ( pls->
dev ) )->m_dWidth );
712 pls->
ylength = (int) ( ( (QtSVGDevice *) ( pls->
dev ) )->m_dHeight );
718 ( (QtSVGDevice *) pls->
dev )->setPLStream( pls );
721 handler.setMasterDevice( (QtSVGDevice *) ( pls->
dev ) );
749 ( (QtSVGDevice *) pls->
dev )->definePlotName( pls->
FileName );
762 ( (QtSVGDevice *) pls->
dev )->savePlot();
765 downscale = ( (QtSVGDevice *) pls->
dev )->downscale;
766 s = ( (QtSVGDevice *) pls->
dev )->size();
767 bool isMaster = ( handler.isMasterDevice( (QtSVGDevice *) pls->
dev ) );
768 delete ( (QtSVGDevice *) pls->
dev );
770 pls->
dev =
new QtSVGDevice( s.width(), s.height() );
771 ( (QtSVGDevice *) pls->
dev )->downscale = downscale;
772 ( (QtSVGDevice *) pls->
dev )->setPLStream( pls );
775 handler.setMasterDevice( (QtSVGDevice *) pls->
dev );
776 handler.DeviceChangedPage( (QtSVGDevice *) pls->
dev );
779 void plD_line_svgqt(
PLStream * pls,
short x1a,
short y1a,
short x2a,
short y2a )
781 QtSVGDevice* widget = (QtSVGDevice *) pls->
dev;
786 if ( widget == NULL )
790 widget->drawLine( x1a, y1a, x2a, y2a );
793 void plD_polyline_svgqt(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
795 QtSVGDevice * widget = (QtSVGDevice *) pls->
dev;
800 if ( widget == NULL )
804 widget->drawPolyline( xa, ya, npts );
810 unsigned char *r, *g, *b;
813 QtSVGDevice * widget = (QtSVGDevice *) pls->
dev;
818 if ( widget == NULL )
827 for ( i = 0; i < pls->
dev_npts; i++ )
829 xa[i] = pls->
dev_x[i];
830 ya[i] = pls->
dev_y[i];
833 widget->drawPolygon( xa, ya, pls->
dev_npts );
842 r =
new unsigned char[pls->
ncol1];
843 g =
new unsigned char[pls->
ncol1];
844 b =
new unsigned char[pls->
ncol1];
847 for ( i = 0; i < pls->
ncol1; i++ )
852 alpha[i] = pls->
cmap1[i].
a;
856 for ( i = 0; i < pls->
dev_npts; i++ )
858 xa[i] = pls->
dev_x[i];
859 ya[i] = pls->
dev_y[i];
861 widget->drawPolygon( xa, ya, pls->
dev_npts );
875 widget->drawText( (
EscText *) ptr );
885 QtSVGDevice * widget = (QtSVGDevice *) pls->
dev;
890 if ( widget == NULL )
896 widget->setWidthF( pls->
width );
911 void plD_tidy_svgqt(
PLStream * pls )
913 QtSVGDevice * widget = (QtSVGDevice *) pls->
dev;
915 if ( widget != NULL )
917 handler.DeviceClosed( widget );
927 #if defined ( PLD_epsqt )
930 #ifndef ENABLE_DYNDRIVERS
947 #if defined ( PLD_pdfqt )
950 #ifndef ENABLE_DYNDRIVERS
967 #if defined ( PLD_epsqt ) || defined ( PLD_pdfqt )
968 void plD_init_epspdfqt(
PLStream * pls )
1001 pls->
dev =
new QtEPSDevice;
1002 pls->
xlength = (int) ( ( (QtEPSDevice *) ( pls->
dev ) )->m_dWidth );
1003 pls->
ylength = (int) ( ( (QtEPSDevice *) ( pls->
dev ) )->m_dHeight );
1009 ( (QtEPSDevice *) pls->
dev )->setPLStream( pls );
1012 handler.setMasterDevice( (QtEPSDevice *) ( pls->
dev ) );
1029 void plD_bop_epspdfqt_helper(
PLStream *pls,
int ifeps )
1040 ( (QtEPSDevice *) pls->
dev )->definePlotName( pls->
FileName, ifeps );
1044 void plD_eop_epspdfqt(
PLStream *pls )
1052 ( (QtEPSDevice *) pls->
dev )->savePlot();
1055 downscale = ( (QtEPSDevice *) pls->
dev )->downscale;
1056 bool isMaster = handler.isMasterDevice( (QtEPSDevice *) pls->
dev );
1057 delete ( (QtEPSDevice *) pls->
dev );
1059 pls->
dev =
new QtEPSDevice;
1060 ( (QtEPSDevice *) pls->
dev )->downscale = downscale;
1063 handler.setMasterDevice( (QtEPSDevice *) pls->
dev );
1064 handler.DeviceChangedPage( (QtEPSDevice *) pls->
dev );
1067 void plD_line_epspdfqt(
PLStream * pls,
short x1a,
short y1a,
short x2a,
short y2a )
1069 QtEPSDevice* widget = (QtEPSDevice *) pls->
dev;
1074 if ( widget == NULL )
1078 widget->drawLine( x1a, y1a, x2a, y2a );
1081 void plD_polyline_epspdfqt(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
1083 QtEPSDevice * widget = (QtEPSDevice *) pls->
dev;
1088 if ( widget == NULL )
1092 widget->drawPolyline( xa, ya, npts );
1095 void plD_esc_epspdfqt(
PLStream * pls,
PLINT op,
void* ptr )
1098 unsigned char *r, *g, *b;
1101 QtEPSDevice * widget = (QtEPSDevice *) pls->
dev;
1108 if ( widget == NULL )
1117 for ( i = 0; i < pls->
dev_npts; i++ )
1119 xa[i] = pls->
dev_x[i];
1120 ya[i] = pls->
dev_y[i];
1123 widget->drawPolygon( xa, ya, pls->
dev_npts );
1132 r =
new unsigned char[pls->
ncol1];
1133 g =
new unsigned char[pls->
ncol1];
1134 b =
new unsigned char[pls->
ncol1];
1137 for ( i = 0; i < pls->
ncol1; i++ )
1142 alpha[i] = pls->
cmap1[i].
a;
1146 for ( i = 0; i < pls->
dev_npts; i++ )
1148 xa[i] = pls->
dev_x[i];
1149 ya[i] = pls->
dev_y[i];
1151 widget->drawPolygon( xa, ya, pls->
dev_npts );
1165 widget->drawText( (
EscText *) ptr );
1169 widget->drawArc( arc_info->x, arc_info->y, arc_info->a, arc_info->b, arc_info->angle1, arc_info->angle2, arc_info->rotate, arc_info->fill );
1178 QtEPSDevice * widget = (QtEPSDevice *) pls->
dev;
1183 if ( widget == NULL )
1189 widget->setWidthF( pls->
width );
1205 void plD_tidy_epspdfqt(
PLStream * pls )
1207 QtEPSDevice * widget = (QtEPSDevice *) pls->
dev;
1209 if ( widget != NULL )
1211 handler.DeviceClosed( widget );
1221 #if defined ( PLD_epsqt )
1222 void plD_bop_epsqt(
PLStream *pls )
1224 plD_bop_epspdfqt_helper( pls, 1 );
1228 #if defined ( PLD_pdfqt )
1229 void plD_bop_pdfqt(
PLStream *pls )
1231 plD_bop_epspdfqt_helper( pls, 0 );
1235 #if defined ( PLD_qtwidget )
1238 #ifndef ENABLE_DYNDRIVERS
1254 void plD_init_qtwidget(
PLStream * pls )
1265 widget =
new QtPLWidget;
1266 pls->
dev = (
void *) widget;
1267 pls->
xlength = (int) widget->m_dWidth;
1268 pls->
ylength = (
int) widget->m_dHeight;
1273 pls->
dev = (
void *) widget;
1275 widget->setPLStream( pls );
1278 handler.setMasterDevice( widget );
1280 if ( plsc->xlength > plsc->ylength )
1288 QPainter tempPainter( &temp );
1290 plP_setpxl( temp.logicalDpiX() / 25.4 / widget->downscale, temp.logicalDpiY() / 25.4 / widget->downscale );
1311 widget->setVisible(
true );
1312 widget->resize( plsc->xlength, plsc->ylength );
1313 widget->move( plsc->xoffset, plsc->yoffset );
1315 widget->setWindowTitle( pls->
plwindow );
1317 qApp->connect( &handler, SIGNAL( MasterChangedPage() ), widget, SLOT( nextPage() ) );
1318 qApp->connect( &handler, SIGNAL( MasterClosed() ), widget, SLOT( close() ) );
1321 void plD_eop_qtwidget(
PLStream *pls )
1323 QtPLWidget* widget = ( (QtPLWidget *) pls->
dev );
1324 int currentPage = widget->pageNumber;
1327 while ( currentPage == widget->pageNumber && handler.isMasterDevice( widget ) && !pls->
nopause )
1329 qApp->processEvents( QEventLoop::WaitForMoreEvents );
1333 void plD_bop_qtwidget(
PLStream *pls )
1335 QtPLWidget* widget = ( (QtPLWidget *) pls->
dev );
1339 void plD_line_qtwidget(
PLStream * pls,
short x1a,
short y1a,
short x2a,
short y2a )
1341 QtPLWidget* widget = (QtPLWidget *) pls->
dev;
1342 if ( widget == NULL )
1346 widget->drawLine( x1a, y1a, x2a, y2a );
1349 void plD_polyline_qtwidget(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
1351 QtPLWidget * widget = (QtPLWidget *) pls->
dev;
1352 if ( widget == NULL )
1356 widget->drawPolyline( xa, ya, npts );
1359 void plD_esc_qtwidget(
PLStream * pls,
PLINT op,
void* ptr )
1363 unsigned char *r, *g, *b;
1365 QtPLWidget * widget = (QtPLWidget *) pls->
dev;
1367 if ( widget == NULL )
1376 for ( i = 0; i < pls->
dev_npts; i++ )
1378 xa[i] = pls->
dev_x[i];
1379 ya[i] = pls->
dev_y[i];
1383 widget->drawPolygon( xa, ya, pls->
dev_npts );
1392 r =
new unsigned char[pls->
ncol1];
1393 g =
new unsigned char[pls->
ncol1];
1394 b =
new unsigned char[pls->
ncol1];
1397 for ( i = 0; i < pls->
ncol1; i++ )
1402 alpha[i] = pls->
cmap1[i].
a;
1406 for ( i = 0; i < pls->
dev_npts; i++ )
1408 xa[i] = pls->
dev_x[i];
1409 ya[i] = pls->
dev_y[i];
1411 widget->drawPolygon( xa, ya, pls->
dev_npts );
1423 widget->drawText( (
EscText *) ptr );
1427 widget->drawArc( arc_info->x, arc_info->y, arc_info->a, arc_info->b, arc_info->angle1, arc_info->angle2, arc_info->rotate, arc_info->fill );
1442 QtPLWidget * widget = (QtPLWidget *) pls->
dev;
1443 if ( widget == NULL )
1449 widget->setWidthF( pls->
width );
1465 void plD_tidy_qtwidget(
PLStream * pls )
1467 QtPLWidget * widget = (QtPLWidget *) pls->
dev;
1469 if ( widget != NULL )
1471 handler.DeviceClosed( widget );
1480 #if defined ( PLD_extqt )
1483 #ifndef ENABLE_DYNDRIVERS
1499 void plD_init_extqt(
PLStream * pls )
1504 if ( pls->
dev == NULL )
1506 printf(
"Error: use plsetqtdev to set up the Qt device before calling plinit()\n" );
1510 QtExtWidget* widget = (QtExtWidget *) ( pls->
dev );
1512 if ( widget->m_dWidth > widget->m_dHeight )
1520 QPainter tempPainter( &temp );
1522 plP_setpxl( temp.logicalDpiX() / 25.4 / widget->downscale, temp.logicalDpiY() / 25.4 / widget->downscale );
1550 void plD_line_extqt(
PLStream * pls,
short x1a,
short y1a,
short x2a,
short y2a )
1552 QtExtWidget * widget = NULL;
1554 widget = (QtExtWidget *) pls->
dev;
1556 widget->drawLine( x1a, y1a, x2a, y2a );
1559 void plD_polyline_extqt(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
1561 QtExtWidget * widget = NULL;
1563 widget = (QtExtWidget *) pls->
dev;
1565 widget->drawPolyline( xa, ya, npts );
1572 unsigned char *r, *g, *b;
1574 QtExtWidget * widget = NULL;
1577 widget = (QtExtWidget *) pls->
dev;
1584 for ( i = 0; i < pls->
dev_npts; i++ )
1586 xa[i] = pls->
dev_x[i];
1587 ya[i] = pls->
dev_y[i];
1590 widget->drawPolygon( xa, ya, pls->
dev_npts );
1599 r =
new unsigned char[pls->
ncol1];
1600 g =
new unsigned char[pls->
ncol1];
1601 b =
new unsigned char[pls->
ncol1];
1604 for ( i = 0; i < pls->
ncol1; i++ )
1609 alpha[i] = pls->
cmap1[i].
a;
1613 for ( i = 0; i < pls->
dev_npts; i++ )
1615 xa[i] = pls->
dev_x[i];
1616 ya[i] = pls->
dev_y[i];
1618 widget->drawPolygon( xa, ya, pls->
dev_npts );
1632 widget->drawText( (
EscText *) ptr );
1636 widget->drawArc( arc_info->
x, arc_info->
y, arc_info->
a, arc_info->
b, arc_info->
angle1, arc_info->
angle2, arc_info->
rotate, arc_info->
fill );
1645 QtExtWidget * widget = NULL;
1647 widget = (QtExtWidget *) pls->
dev;
1651 widget->setWidthF( pls->
width );
1667 void plD_tidy_extqt(
PLStream * pls )
1669 QtExtWidget * widget = NULL;
1671 widget = (QtExtWidget *) pls->
dev;
1672 if ( widget != NULL )
1674 handler.DeviceClosed( widget );
1686 void plD_bop_extqt(
PLStream *pls )
1688 QtExtWidget * widget = NULL;
1689 widget = (QtExtWidget *) pls->
dev;
1694 #if defined ( PLD_memqt )
1697 #ifndef ENABLE_DYNDRIVERS
1713 void plD_init_memqt(
PLStream * pls )
1717 unsigned char *qt_mem;
1718 unsigned char *input_mem;
1748 if ( pls->
xdpi <= 0. )
1759 input_mem = (
unsigned char *) pls->
dev;
1763 ( (QtRasterDevice *) pls->
dev )->setPLStream( pls );
1764 ( (QtRasterDevice *) pls->
dev )->memory = input_mem;
1767 handler.setMasterDevice( (QtRasterDevice *) ( pls->
dev ) );
1776 plP_setpxl( dpi / 25.4 / ( (QtRasterDevice *) ( pls->
dev ) )->downscale, dpi / 25.4 / ( (QtRasterDevice *) ( pls->
dev ) )->downscale );
1782 qt_mem = ( (QtRasterDevice *) pls->
dev )->scanLine( 0 );
1786 qt_mem[2] = input_mem[0];
1787 qt_mem[1] = input_mem[1];
1788 qt_mem[0] = input_mem[2];
1791 qt_mem[3] = input_mem[3];
1801 ( (QtRasterDevice *) ( pls->
dev ) )->setResolution( dpi );
1812 void plD_eop_memqt(
PLStream *pls )
1815 unsigned char *memory;
1816 unsigned char *qt_mem;
1818 memory = ( (QtRasterDevice *) pls->
dev )->memory;
1819 qt_mem = ( (QtRasterDevice *) pls->
dev )->scanLine( 0 );
1823 memory[0] = qt_mem[2];
1824 memory[1] = qt_mem[1];
1825 memory[2] = qt_mem[0];
1828 memory[3] = qt_mem[3];