15 #include "msdevstudio/MSconfig.h"
28 #include <qapplication.h>
35 #include <qdatetime.h>
37 #if QT_VERSION < 0x040000
38 #include <qpointarray.h>
40 #include <QtGui/QPolygon>
41 #include <QtCore/QTextStream>
47 using namespace hippodraw;
58 m_font_default (
"helvetica" )
77 m_font_default (
"helvetica" )
101 if ( display == 0 )
return;
138 #if QT_VERSION < 0x040000
141 transformAndFill ( QPolygon & array,
143 const std::vector< double > & x,
144 const std::vector< double > & y,
145 int (
QtViewImp::* xfunc) (
double )
const,
146 int (
QtViewImp::* yfunc) (
double )
const )
148 unsigned int size = x.size();
149 assert ( size == y.size() );
151 for (
unsigned int i = 0; i <
size; i++ ) {
152 int ix = (this->*xfunc) ( x[i] );
153 int iy = (this->*yfunc) ( y[i] );
155 array.setPoint ( i , ix, iy );
165 const std::vector< double > & y,
169 unsigned int size = x.size();
170 assert ( size == y.size() );
172 #if QT_VERSION < 0x040000
175 QPolygon array ( size );
190 const std::vector < double > & y,
195 unsigned int size = x.size();
196 assert ( size == y.size() );
198 #if QT_VERSION < 0x040000
201 QPolygon array ( size );
213 const std::vector<double> & y,
216 const Color & color )
220 int i_sym_size = (int)(sym_size/2);
226 QColor qcolor ( rgb[0], rgb[1], rgb[2] );
230 #if QT_VERSION < 0x040000
233 QPolygon triangleArray ( 3 );
236 for (
unsigned int i = 0; i < x.size(); i++)
238 int originX =
toViewX ( x[i] );
239 int originY =
toViewY ( y[i] );
249 (
toViewY (y[i]) - (i_sym_size) ),
266 triangleArray.setPoint ( 0, (
toViewX (x[i]) ),
267 (
toViewY (y[i]) + (i_sym_size) ) );
269 triangleArray.setPoint ( 1, (
toViewX (x[i]) + (i_sym_size) ),
270 (
toViewY (y[i]) - (i_sym_size) ) );
273 triangleArray.setPoint ( 2, (
toViewX (x[i]) - (i_sym_size) ),
274 (
toViewY (y[i]) - (i_sym_size) ) );
282 triangleArray.setPoint ( 0, (
toViewX (x[i]) ),
283 (
toViewY (y[i]) + (i_sym_size) ) );
285 triangleArray.setPoint ( 1, (
toViewX (x[i]) + (i_sym_size) ),
286 (
toViewY (y[i]) - (i_sym_size) ) );
289 triangleArray.setPoint ( 2, (
toViewX (x[i]) - (i_sym_size) ),
290 (
toViewY (y[i]) - (i_sym_size) ) );
302 (
toViewY (y[i]) - (i_sym_size) ),
303 ( i_sym_size*2 + 1 ),
304 ( i_sym_size*2 + 1 ) );
314 (
toViewY (y[i]) - (i_sym_size) ),
315 ( i_sym_size*2 + 1 ),
316 ( i_sym_size*2 + 1 ),
323 m_painter -> drawLine ( originX - i_sym_size, originY,
324 originX + i_sym_size, originY );
325 m_painter -> drawLine ( originX, originY - i_sym_size,
326 originX, originY + i_sym_size );
330 m_painter -> drawLine ( originX - i_sym_size, originY - i_sym_size,
331 originX + i_sym_size, originY + i_sym_size );
332 m_painter -> drawLine ( originX + i_sym_size, originY - i_sym_size,
333 originX - i_sym_size, originY + i_sym_size );
351 const std::vector< double > &,
368 const std::vector< double > & y,
369 const std::vector< Color > & colors,
373 assert ( x.size() == colors.size() );
376 int i_sym_size = (int)(sym_size/2);
378 if ( i_sym_size == 0 &&
383 #if QT_VERSION < 0x040000
386 QPolygon triangleArray ( 3 );
389 for (
unsigned int i = 0; i < x.size(); i++)
394 const Color & c = colors[i];
402 (
toViewY (y[i]) - (i_sym_size) ),
410 m_painter -> drawRect ( o_x -i_sym_size, o_y - i_sym_size,
411 2 * i_sym_size, 2 * i_sym_size );
417 triangleArray.setPoint ( 0, (
toViewX (x[i]) ),
418 (
toViewY (y[i]) + (i_sym_size) ) );
420 triangleArray.setPoint ( 1, (
toViewX (x[i]) + (i_sym_size) ),
421 (
toViewY (y[i]) - (i_sym_size) ) );
424 triangleArray.setPoint ( 2, (
toViewX (x[i]) - (i_sym_size) ),
425 (
toViewY (y[i]) - (i_sym_size) ) );
436 triangleArray.setPoint ( 0, (
toViewX (x[i]) ),
437 (
toViewY (y[i]) + (i_sym_size) ) );
439 triangleArray.setPoint ( 1, (
toViewX (x[i]) + (i_sym_size) ),
440 (
toViewY (y[i]) - (i_sym_size) ) );
443 triangleArray.setPoint ( 2, (
toViewX (x[i]) - (i_sym_size) ),
444 (
toViewY (y[i]) - (i_sym_size) ) );
456 (
toViewY (y[i]) - (i_sym_size) ),
468 (
toViewY (y[i]) - (i_sym_size) ),
477 m_painter -> drawLine ( o_x - i_sym_size, o_y,
478 o_x + i_sym_size, o_y );
479 m_painter -> drawLine ( o_x, o_y - i_sym_size,
480 o_x, o_y + i_sym_size );
484 m_painter -> drawLine ( o_x - i_sym_size, o_y - i_sym_size,
485 o_x + i_sym_size, o_y + i_sym_size );
486 m_painter -> drawLine ( o_x + i_sym_size, o_y - i_sym_size,
487 o_x - i_sym_size, o_y + i_sym_size );
508 QColor qcolor ( rgb[0], rgb[1], rgb[2] );
510 unsigned int isize = static_cast <
unsigned int > (
size );
513 return QPen ( qcolor, isize, pen_style );
519 const std::vector < double > & y,
526 unsigned int size = x.size();
527 assert ( size == y.size() );
533 QColor qcolor ( rgb[0], rgb[1], rgb[2] );
539 QColor qcolor2 ( rgb2[0], rgb2[1], rgb2[2] );
541 #if QT_VERSION < 0x040000
544 QPolygon array ( size );
560 const std::vector< double > & y,
579 const std::vector< double > & y,
590 unsigned int xsize = x.size();
591 assert ( xsize == y.size() );
593 #if QT_VERSION < 0x040000
596 QPolygon array ( xsize );
610 const std::vector< double > & y,
612 const std::vector < Color > & colors,
615 unsigned int ssize = x.size();
616 assert ( ssize == y.size() );
617 assert ( ssize == colors.size() );
619 for (
unsigned int i = 0; i < ssize; i+=2 ) {
622 const Color & color = colors[i];
624 QPen pen ( qcolor, static_cast < int > (size) );
626 pen.setStyle ( pen_style );
646 const std::vector< double > & y,
656 pen.setStyle ( pen_style );
668 const std::vector< double > & y,
679 unsigned int xsize = x.size();
680 assert ( xsize == y.size() );
682 #if QT_VERSION < 0x040000
685 QPolygon array ( xsize );
699 float xx,
float yy,
float fontsize,
700 float angle,
char xp,
char yp,
bool resize,
703 assert ( fontsize > 0 );
704 int i_x =
static_cast< int > ( xx );
705 int i_y =
static_cast< int > ( yy );
706 int i_font = static_cast <
int > ( fontsize );
708 if ( fontsize > 0 ) {
722 QRect new_rect1 = metrics1.boundingRect ( qstring );
723 int h1 = new_rect1.
height ();
724 if ( fontsize > 0 ) {
725 while ( h1 >= fontsize ){
729 if ( i_font < 1 )
break;
735 int h2 = new_rect2.
height ();
741 if ( resize ==
true ) {
750 #if QT_VERSION < 0x040000
751 int lines = qstring.contains (
"\n" );
753 int lines = qstring.count();
757 #if QT_VERSION < 0x040000
764 maxw = std::max ( maxw, sr.
width () );
766 int w = new_rect.
width ();
767 int h = new_rect.
height ();
772 int delta_y = i_y - static_cast <
int > ( rect.
getY () );
778 int delta_x = i_x - static_cast <
int > ( rect.
getX () );
791 int i_w = static_cast <
int > ( rect.
getWidth () );
792 int i_h = static_cast <
int > ( rect.
getHeight () );
796 Qt::AlignLeft | Qt::AlignTop,
811 dx = i_x - text_rect.width () / 2;
815 dx = i_x - text_rect.width ();
828 dy = i_y - text_rect.height () / 2;
832 dy = i_y - text_rect.height ();
838 text_rect.moveBy ( dx, dy );
839 text_rect.setWidth ( text_rect.width() + 2 );
840 text_rect.setHeight ( text_rect.height() + 2 );
861 dx = 0 - text_rect.width () / 2;
865 dx = 0 - text_rect.width ();
878 dy = 0 - text_rect.height () / 2;
882 dy = 0 - text_rect.height ();
888 text_rect.moveBy ( dx, dy );
889 text_rect.setWidth ( text_rect.width() + 2 );
890 text_rect.setHeight ( text_rect.height() + 2 );
908 float fontsize,
float angle,
909 char xp,
char yp,
bool resize )
912 drawText ( s, xx, yy, fontsize, angle, xp, yp, resize, 0, & black );
919 float fontsize,
float angle,
920 char xp,
char yp,
bool resize,
925 color =
new Color ();
931 const QtFont * qtfont = dynamic_cast <
const QtFont * > ( font );
932 const QFont & qfont = qtfont -> font();
933 QFont & qf = const_cast <
QFont & > ( qfont );
936 (xx + rect.
getX()), (yy + rect.
getY () ),
938 xp, yp, resize, qf, qcolor );
942 (xx + rect.
getX()), (yy + rect.
getY () ),
951 int red,
int green,
int blue )
955 if (x1<x2) std::swap(x1,x2);
957 if (x2<x1) std::swap(x1,x2);
960 if (y2<y1) std::swap(y1,y2);
963 int w =
toViewX ( x2 ) - x + 1;
965 int h =
toViewY ( y1 ) - y + 1;
967 const QColor color ( red, green, blue );
975 int red,
int green,
int blue )
982 QColor color ( red, green, blue );
1019 QString fn ( (
"temp_latex/"+filename).c_str() );
1020 switch ( position ){
1022 if (pixmap.
load(fn)) {
1024 double x=rect.
getX();
1025 double y=rect.
getY();
1030 static_cast<int>(y),
1031 static_cast<int>(w),
1032 static_cast<int>(h) );
1038 if (pixmap.
load(fn)) {
1042 double y=rect.
getY();
1043 double h=pixmap.
height()*0.8;
1044 double w=pixmap.
width()*0.8;
1053 double ratio = mr.
getWidth() * 0.8 / w ;
1060 static_cast<int>(y),
1061 static_cast<int>(w),
1062 static_cast<int>(h) );
1068 if (pixmap.
load(fn)) {
1072 double y=rect.
getY();
1073 double h=pixmap.
height();
1074 double w=pixmap.
width();
1083 double ratio = mr.
getWidth() * 0.8 / w ;
1092 static_cast<int>(y),
1093 static_cast<int>(w),
1094 static_cast<int>(h) );
1100 if (pixmap.
load(fn)) {
1103 pixmap = pixmap.
xForm(m);
1107 double x=rect.
getX();
1109 double h=pixmap.
height();
1110 double w=pixmap.
width();
1119 double ratio = mr.
getHeight() * 0.8 / h ;
1126 static_cast<int>(y),
1127 static_cast<int>(w),
1128 static_cast<int>(h) );
1134 if ( pixmap.
load ( fn ) ) {
1139 double h=pixmap.
height()*0.7;
1140 double w=pixmap.
width()*0.7;
1149 double ratio = mr.
getWidth() * 0.8 / w ;
1157 static_cast<int>(y),
1158 static_cast<int>(w),
1159 static_cast<int>(h) );
1176 std::map< const std::string, std::string>::iterator it =
m_eq_png.find(eq);
1186 QString tex_filename =
"image"+current_time+
".tex";
1187 QString png_filename =
"image"+current_time+
".png";
1188 QString ps_filename =
"image"+current_time+
".ps";
1189 QString dvi_filename =
"image"+current_time+
".dvi";
1190 QString tmp_filename =
"image"+current_time+
".tmp";
1191 QString aux_filename =
"image"+current_time+
".aux";
1192 QString log_filename =
"image"+current_time+
".log";
1195 QString command1 =
"latex -interaction=nonstopmode "+tex_filename+
" > "+tmp_filename;
1196 QString command2 =
"dvips -q -o "+ps_filename+
" "+dvi_filename;
1197 QString command3 =
"gs < /dev/null -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=ppmraw -sOutputFile=- -r150 -q -dNOPAUSE "+ps_filename+
" | pnmcrop -white | pnmmargin -white 10 | pnmtopng -interlace - >"+png_filename;
1198 QString command4 =
"rm "+tex_filename+
" "+ps_filename+
" "+dvi_filename+
" "+tmp_filename+
" "+aux_filename+
" "+log_filename;
1201 QFile file(tex_filename);
1202 if (file.
open(IO_WriteOnly) ) {
1205 stream <<
"\\documentclass{article}\n";
1206 stream <<
"\\pagestyle{empty}\n";
1207 stream <<
"\\usepackage{xspace,amssymb,amsfonts,amsmath}\n";
1208 stream <<
"\\usepackage{mathptmx}\n";
1209 stream <<
"\\usepackage{color}\n";
1210 stream <<
"\\begin{document}\n";
1211 stream <<
"\\begin{displaymath}\n";
1212 stream << eq.c_str() <<
"\n";
1213 stream <<
"\\end{displaymath}\n";
1214 stream <<
"\\end{document}\n";
1217 system(command1.
latin1());
1218 system(command2.
latin1());
1219 system(command3.
latin1());
1220 system(command4.
latin1());
1222 std::string png_fn = png_filename.latin1();