| Jeroen Demeyer on Wed, 11 Jan 2017 18:37:50 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| [PATCH] Move plotting frontend to libpari |
Dear pari devs,This patch moves the plotting frontend to libpari and adds initial support for multiple plotting engines. This allows ploth() (in theory at least) to work in the PARI library without gp.
This replaces 0001-Move-rectdraw0-to-a-method-PARI_plot.draw.patch and depends on 0002-Simplify-handling-of-graphic-option-and-check-validi.patch
Cheers, Jeroen.
>From a240498026feeadfa5d5b1d5abbe6aade5c79bd6 Mon Sep 17 00:00:00 2001
From: Jeroen Demeyer <jdemeyer@cage.ugent.be>
Date: Mon, 9 Jan 2017 15:55:05 +0100
Subject: [PATCH 2/4] Move plotting frontend to libpari; initial support for
multiple plotting engines
---
config/Makefile.SH | 17 +++++++------
config/paricfg.h.SH | 24 +++++++++++++++++
src/functions/graphic/plotbox | 1 -
src/functions/graphic/plotclip | 1 -
src/functions/graphic/plotcolor | 1 -
src/functions/graphic/plotcopy | 1 -
src/functions/graphic/plotcursor | 1 -
src/functions/graphic/plotdraw | 1 -
src/functions/graphic/ploth | 2 +-
src/functions/graphic/plothraw | 1 -
src/functions/graphic/plothsizes | 1 -
src/functions/graphic/plotinit | 1 -
src/functions/graphic/plotkill | 1 -
src/functions/graphic/plotlines | 1 -
src/functions/graphic/plotlinetype | 1 -
src/functions/graphic/plotmove | 1 -
src/functions/graphic/plotpoints | 1 -
src/functions/graphic/plotpointsize | 1 -
src/functions/graphic/plotpointtype | 1 -
src/functions/graphic/plotrbox | 1 -
src/functions/graphic/plotrecth | 2 +-
src/functions/graphic/plotrecthraw | 1 -
src/functions/graphic/plotrline | 1 -
src/functions/graphic/plotrmove | 1 -
src/functions/graphic/plotrpoint | 1 -
src/functions/graphic/plotscale | 1 -
src/functions/graphic/plotstring | 1 -
src/functions/graphic/psdraw | 1 -
src/functions/graphic/psploth | 1 -
src/functions/graphic/psplothraw | 1 -
src/gp/gp.c | 21 +++++++++++++++
src/gp/gp.h | 10 ++++++++
src/graph/plotQt.c | 17 ++++---------
src/graph/plotQt4.c | 17 ++++---------
src/graph/plotWin32.c | 11 +++++---
src/graph/plotX.c | 15 ++++++-----
src/graph/plotfltk.c | 14 ++++------
src/graph/plotnull.c | 28 --------------------
src/graph/plotport.c | 26 +++++++++++++++++--
src/graph/plotps.c | 12 +++++----
src/graph/rect.h | 51 ++++---------------------------------
src/headers/paridecl.h | 48 +++++++++++++++++++++++++++++++++-
42 files changed, 179 insertions(+), 162 deletions(-)
delete mode 100644 src/graph/plotnull.c
diff --git a/config/Makefile.SH b/config/Makefile.SH
index ddebdac..a28f9b9 100644
--- a/config/Makefile.SH
+++ b/config/Makefile.SH
@@ -72,26 +72,32 @@ postconfig=:
plotrunpath=
case "$which_graphic_lib" in
none)
- graph=plotnull;;
+ graph="";;
ps)
+ enable_plot_ps=yes
graph=plotps;;
Qt)
+ enable_plot_qt=yes
PLOTCFLAGS='-D__FANCY_WIN__ -I$(QTDIR)/include'
PLOTLIBS="-L\$(QTDIR)/lib $QTLIB"
graph=plotQt;;
Qt4)
+ enable_plot_qt4=yes
PLOTCFLAGS='-D__FANCY_WIN__ -I$(QTDIR)/include'
PLOTLIBS="-L\$(QTDIR)/lib $QTLIB"
graph=plotQt4;;
fltk)
+ enable_plot_fltk=yes
PLOTCFLAGS=
PLOTLIBS="$FLTK_LIBS"
postconfig='fltk-config --post '
graph=plotfltk;;
win32)
+ enable_plot_win32=yes
PLOTLIBS="-lgdi32"
graph=plotWin32;;
*X11*)
+ enable_plot_x=yes
PLOTCFLAGS="$PLOTCFLAGS $X11_INC"
PLOTLIBS="$PLOTLIBS $X11_LIBS"
plotrunpath=$X11
@@ -100,8 +106,7 @@ win32)
echo >&2 "### Unrecognized graphic library '$which_graphic_lib'."
exit 1;;
esac
-graph="plotport $graph"
-libgraph="plottty"
+libgraph="plotport plottty"
KERNOBJS=
for f in $kernel; do
@@ -736,10 +741,6 @@ for dir in basemath modules language gp graph systems mt; do
depend="./paricfg.h"
cflags="$cflags \$(DLCFLAGS)"
;;
- plotport)
- cflags="$cflags -I$src/graph"
- depend="$RECT_H"
- ;;
plotQt)
cflags="$cflags \$(PLOTCFLAGS)"
depend="$RECT_H"
@@ -755,7 +756,7 @@ for dir in basemath modules language gp graph systems mt; do
depend="$RECT_H"
compile="\$(CXX)"
;;
- plottty)
+ plotport|plottty)
depend="$RECT_H"
cflags="$cflags \$(DLCFLAGS)"
;;
diff --git a/config/paricfg.h.SH b/config/paricfg.h.SH
index 6fb22fa..c0c9e04 100644
--- a/config/paricfg.h.SH
+++ b/config/paricfg.h.SH
@@ -188,4 +188,28 @@ case $enable_tls in
yes) echo '#define ENABLE_TLS' >> $file;;
esac
+case $enable_plot_ps in
+yes) echo '#define ENABLE_PLOT_PS' >> $file;;
+esac
+
+case $enable_plot_qt in
+yes) echo '#define ENABLE_PLOT_QT' >> $file;;
+esac
+
+case $enable_plot_qt4 in
+yes) echo '#define ENABLE_PLOT_QT4' >> $file;;
+esac
+
+case $enable_plot_fltk in
+yes) echo '#define ENABLE_PLOT_FLTK' >> $file;;
+esac
+
+case $enable_plot_win32 in
+yes) echo '#define ENABLE_PLOT_WIN32' >> $file;;
+esac
+
+case $enable_plot_x in
+yes) echo '#define ENABLE_PLOT_X' >> $file;;
+esac
+
echo '#endif' >> $file
diff --git a/src/functions/graphic/plotbox b/src/functions/graphic/plotbox
index 23622f3..f697015 100644
--- a/src/functions/graphic/plotbox
+++ b/src/functions/graphic/plotbox
@@ -1,5 +1,4 @@
Function: plotbox
-Class: highlevel
Section: graphic
C-Name: rectbox
Prototype: vLGG
diff --git a/src/functions/graphic/plotclip b/src/functions/graphic/plotclip
index 367f25f..f0943e2 100644
--- a/src/functions/graphic/plotclip
+++ b/src/functions/graphic/plotclip
@@ -1,5 +1,4 @@
Function: plotclip
-Class: highlevel
Section: graphic
C-Name: rectclip
Prototype: vL
diff --git a/src/functions/graphic/plotcolor b/src/functions/graphic/plotcolor
index 3754445..2350170 100644
--- a/src/functions/graphic/plotcolor
+++ b/src/functions/graphic/plotcolor
@@ -1,5 +1,4 @@
Function: plotcolor
-Class: highlevel
Section: graphic
C-Name: rectcolor
Prototype: vLL
diff --git a/src/functions/graphic/plotcopy b/src/functions/graphic/plotcopy
index 2f32c64..2796f61 100644
--- a/src/functions/graphic/plotcopy
+++ b/src/functions/graphic/plotcopy
@@ -1,5 +1,4 @@
Function: plotcopy
-Class: highlevel
Section: graphic
C-Name: rectcopy_gen
Prototype: vLLGGD0,L,
diff --git a/src/functions/graphic/plotcursor b/src/functions/graphic/plotcursor
index b685729..153527b 100644
--- a/src/functions/graphic/plotcursor
+++ b/src/functions/graphic/plotcursor
@@ -1,5 +1,4 @@
Function: plotcursor
-Class: highlevel
Section: graphic
C-Name: rectcursor
Prototype: L
diff --git a/src/functions/graphic/plotdraw b/src/functions/graphic/plotdraw
index 0026d33..ced478c 100644
--- a/src/functions/graphic/plotdraw
+++ b/src/functions/graphic/plotdraw
@@ -1,5 +1,4 @@
Function: plotdraw
-Class: highlevel
Section: graphic
C-Name: rectdraw_flag
Prototype: vGD0,L,
diff --git a/src/functions/graphic/ploth b/src/functions/graphic/ploth
index 63d4eca..28d2bca 100644
--- a/src/functions/graphic/ploth
+++ b/src/functions/graphic/ploth
@@ -1,5 +1,4 @@
Function: ploth
-Class: highlevel
Section: graphic
C-Name: ploth
Prototype: V=GGEpD0,M,D0,L,\nParametric|1; Recursive|2; no_Rescale|4; no_X_axis|8; no_Y_axis|16; no_Frame|32; no_Lines|64; Points_too|128; Splines|256; no_X_ticks|512; no_Y_ticks|1024; Same_ticks|2048; Complex|4096
@@ -112,3 +111,4 @@ Doc: high precision plot of the function $y=f(x)$ represented by the expression
ploth(X=0,2*Pi,[(1+I)*X,exp(I*X)], "Complex")
@eprog\noindent will draw respectively a circle and a circle cut by the line
$y=x$.
+ %\syn{NO}
diff --git a/src/functions/graphic/plothraw b/src/functions/graphic/plothraw
index 03ceccd..79fed03 100644
--- a/src/functions/graphic/plothraw
+++ b/src/functions/graphic/plothraw
@@ -1,5 +1,4 @@
Function: plothraw
-Class: highlevel
Section: graphic
C-Name: plothraw
Prototype: GGD0,L,
diff --git a/src/functions/graphic/plothsizes b/src/functions/graphic/plothsizes
index 8d96047..cc247d8 100644
--- a/src/functions/graphic/plothsizes
+++ b/src/functions/graphic/plothsizes
@@ -1,5 +1,4 @@
Function: plothsizes
-Class: highlevel
Section: graphic
C-Name: plothsizes_flag
Prototype: D0,L,
diff --git a/src/functions/graphic/plotinit b/src/functions/graphic/plotinit
index 0c6c709..4d66be6 100644
--- a/src/functions/graphic/plotinit
+++ b/src/functions/graphic/plotinit
@@ -1,5 +1,4 @@
Function: plotinit
-Class: highlevel
Section: graphic
C-Name: initrect_gen
Prototype: vLDGDGD0,L,
diff --git a/src/functions/graphic/plotkill b/src/functions/graphic/plotkill
index 182b53b..77699bd 100644
--- a/src/functions/graphic/plotkill
+++ b/src/functions/graphic/plotkill
@@ -1,5 +1,4 @@
Function: plotkill
-Class: highlevel
Section: graphic
C-Name: killrect
Prototype: vL
diff --git a/src/functions/graphic/plotlines b/src/functions/graphic/plotlines
index 903b50c..d1ed9f6 100644
--- a/src/functions/graphic/plotlines
+++ b/src/functions/graphic/plotlines
@@ -1,5 +1,4 @@
Function: plotlines
-Class: highlevel
Section: graphic
C-Name: rectlines
Prototype: vLGGD0,L,
diff --git a/src/functions/graphic/plotlinetype b/src/functions/graphic/plotlinetype
index 7f96cba..bc23419 100644
--- a/src/functions/graphic/plotlinetype
+++ b/src/functions/graphic/plotlinetype
@@ -1,5 +1,4 @@
Function: plotlinetype
-Class: highlevel
Section: graphic
C-Name: rectlinetype
Prototype: vLL
diff --git a/src/functions/graphic/plotmove b/src/functions/graphic/plotmove
index 6bdd6a6..a689794 100644
--- a/src/functions/graphic/plotmove
+++ b/src/functions/graphic/plotmove
@@ -1,5 +1,4 @@
Function: plotmove
-Class: highlevel
Section: graphic
C-Name: rectmove
Prototype: vLGG
diff --git a/src/functions/graphic/plotpoints b/src/functions/graphic/plotpoints
index cc6f01d..14e7ee2 100644
--- a/src/functions/graphic/plotpoints
+++ b/src/functions/graphic/plotpoints
@@ -1,5 +1,4 @@
Function: plotpoints
-Class: highlevel
Section: graphic
C-Name: rectpoints
Prototype: vLGG
diff --git a/src/functions/graphic/plotpointsize b/src/functions/graphic/plotpointsize
index d8ae632..1cc8a2e 100644
--- a/src/functions/graphic/plotpointsize
+++ b/src/functions/graphic/plotpointsize
@@ -1,5 +1,4 @@
Function: plotpointsize
-Class: highlevel
Section: graphic
C-Name: rectpointsize
Prototype: vLG
diff --git a/src/functions/graphic/plotpointtype b/src/functions/graphic/plotpointtype
index e0b4c39..1dc06de 100644
--- a/src/functions/graphic/plotpointtype
+++ b/src/functions/graphic/plotpointtype
@@ -1,5 +1,4 @@
Function: plotpointtype
-Class: highlevel
Section: graphic
C-Name: rectpointtype
Prototype: vLL
diff --git a/src/functions/graphic/plotrbox b/src/functions/graphic/plotrbox
index 503695e..b55d149 100644
--- a/src/functions/graphic/plotrbox
+++ b/src/functions/graphic/plotrbox
@@ -1,5 +1,4 @@
Function: plotrbox
-Class: highlevel
Section: graphic
C-Name: rectrbox
Prototype: vLGG
diff --git a/src/functions/graphic/plotrecth b/src/functions/graphic/plotrecth
index dcb1528..7f6c66d 100644
--- a/src/functions/graphic/plotrecth
+++ b/src/functions/graphic/plotrecth
@@ -1,5 +1,4 @@
Function: plotrecth
-Class: highlevel
Section: graphic
C-Name: rectploth
Prototype: LV=GGEpD0,M,D0,L,\nParametric|1; Recursive|2; no_Rescale|4; no_X_axis|8; no_Y_axis|16; no_Frame|32; no_Lines|64; Points_too|128; Splines|256; no_X_ticks|512; no_Y_ticks|1024; Same_ticks|2048; Complex|4096
@@ -8,3 +7,4 @@ Help: plotrecth(w,X=a,b,expr,{flag=0},{n=0}):
ploth(w,X=a,b,expr,flag,n). Returns a vector for the bounding box.
Doc: writes to rectwindow $w$ the curve output of
\kbd{ploth}$(w,X=a,b,\var{expr},\fl,n)$. Returns a vector for the bounding box.
+ %\syn{NO}
diff --git a/src/functions/graphic/plotrecthraw b/src/functions/graphic/plotrecthraw
index 305456c..cef2f48 100644
--- a/src/functions/graphic/plotrecthraw
+++ b/src/functions/graphic/plotrecthraw
@@ -1,5 +1,4 @@
Function: plotrecthraw
-Class: highlevel
Section: graphic
C-Name: rectplothraw
Prototype: LGD0,L,
diff --git a/src/functions/graphic/plotrline b/src/functions/graphic/plotrline
index 0720718..86d5b77 100644
--- a/src/functions/graphic/plotrline
+++ b/src/functions/graphic/plotrline
@@ -1,5 +1,4 @@
Function: plotrline
-Class: highlevel
Section: graphic
C-Name: rectrline
Prototype: vLGG
diff --git a/src/functions/graphic/plotrmove b/src/functions/graphic/plotrmove
index b83c493..6d4afbc 100644
--- a/src/functions/graphic/plotrmove
+++ b/src/functions/graphic/plotrmove
@@ -1,5 +1,4 @@
Function: plotrmove
-Class: highlevel
Section: graphic
C-Name: rectrmove
Prototype: vLGG
diff --git a/src/functions/graphic/plotrpoint b/src/functions/graphic/plotrpoint
index 37648ff..707335a 100644
--- a/src/functions/graphic/plotrpoint
+++ b/src/functions/graphic/plotrpoint
@@ -1,5 +1,4 @@
Function: plotrpoint
-Class: highlevel
Section: graphic
C-Name: rectrpoint
Prototype: vLGG
diff --git a/src/functions/graphic/plotscale b/src/functions/graphic/plotscale
index 3c81e3d..a8524c9 100644
--- a/src/functions/graphic/plotscale
+++ b/src/functions/graphic/plotscale
@@ -1,5 +1,4 @@
Function: plotscale
-Class: highlevel
Section: graphic
C-Name: rectscale
Prototype: vLGGGG
diff --git a/src/functions/graphic/plotstring b/src/functions/graphic/plotstring
index 54792dd..ca79084 100644
--- a/src/functions/graphic/plotstring
+++ b/src/functions/graphic/plotstring
@@ -1,5 +1,4 @@
Function: plotstring
-Class: highlevel
Section: graphic
C-Name: rectstring3
Prototype: vLsD0,L,
diff --git a/src/functions/graphic/psdraw b/src/functions/graphic/psdraw
index 5d3f937..d2757db 100644
--- a/src/functions/graphic/psdraw
+++ b/src/functions/graphic/psdraw
@@ -1,5 +1,4 @@
Function: psdraw
-Class: highlevel
Section: graphic
C-Name: postdraw_flag
Prototype: vGD0,L,
diff --git a/src/functions/graphic/psploth b/src/functions/graphic/psploth
index 0911e26..f6c1ffe 100644
--- a/src/functions/graphic/psploth
+++ b/src/functions/graphic/psploth
@@ -1,5 +1,4 @@
Function: psploth
-Class: highlevel
Section: graphic
C-Name: postploth
Prototype: V=GGEpD0,L,D0,L,
diff --git a/src/functions/graphic/psplothraw b/src/functions/graphic/psplothraw
index e9b153d..4d99fe7 100644
--- a/src/functions/graphic/psplothraw
+++ b/src/functions/graphic/psplothraw
@@ -1,5 +1,4 @@
Function: psplothraw
-Class: highlevel
Section: graphic
C-Name: postplothraw
Prototype: GGD0,L,
diff --git a/src/gp/gp.c b/src/gp/gp.c
index deaeec7..af85a70 100644
--- a/src/gp/gp.c
+++ b/src/gp/gp.c
@@ -540,6 +540,26 @@ cyg_environment(int argc, char ** argv)
}
#endif
+/* It's OK if none of the ENABLE_ macros are defined. This will give
+ * an error whenever ploth() is called. */
+static void
+set_pari_plot_engine()
+{
+#if defined(ENABLE_PLOT_X)
+ PARI_get_plot_X();
+#elif defined(ENABLE_PLOT_FLTK)
+ PARI_get_plot_fltk();
+#elif defined(ENABLE_PLOT_QT4)
+ PARI_get_plot_Qt4();
+#elif defined(ENABLE_PLOT_QT)
+ PARI_get_plot_Qt();
+#elif defined(ENABLE_PLOT_WIN32)
+ PARI_get_plot_Win32();
+#elif defined(ENABLE_PLOT_PS)
+ PARI_get_plot_ps();
+#endif
+}
+
int
main(int argc, char **argv)
{
@@ -576,6 +596,7 @@ main(int argc, char **argv)
pari_add_module(functions_gp);
pari_add_module(functions_highlevel);
+ set_pari_plot_engine();
init_graph();
cb_pari_quit = gp_quit;
cb_pari_whatnow = whatnow;
diff --git a/src/gp/gp.h b/src/gp/gp.h
index d89fdc9..6ee391f 100644
--- a/src/gp/gp.h
+++ b/src/gp/gp.h
@@ -33,4 +33,14 @@ extern void (*cb_gp_output)(GEN z);
extern void (*cb_pari_end_output)(void);
extern entree functions_highlevel[], functions_gp[];
+
+/* Architecture-dependent plot files (src/graph/plotX.c ...).
+ * Note that not all these might be compiled! */
+void PARI_get_plot_X(void);
+void PARI_get_plot_fltk(void);
+void PARI_get_plot_Qt4(void);
+void PARI_get_plot_Qt(void);
+void PARI_get_plot_Win32(void);
+void PARI_get_plot_ps(void);
+
ENDEXTERN
diff --git a/src/graph/plotQt.c b/src/graph/plotQt.c
index 9aa3a81..d8adebf 100644
--- a/src/graph/plotQt.c
+++ b/src/graph/plotQt.c
@@ -566,20 +566,13 @@ void PlotWindow::save( int id) {
#endif // __FANCY_WIN__
-
-//
-// Implementation of the two architecture-dependent functions
-// (from rect.h) requested by pari's plotting routines
-//
-
-
-void
-rectdraw0(long *w, long *x, long *y, long lw)
+/* Interface to PARI's plotting functions */
+static void
+draw(long *w, long *x, long *y, long lw)
{
if (pari_daemon()) return; // parent process returns
pari_close();
- PARI_get_plot();
// launch Qt window
int argc = 1; char *argv[] = { "gp", "-qws"}; // set argc = 2 for cross
@@ -606,10 +599,9 @@ rectdraw0(long *w, long *x, long *y, long lw)
}
void
-PARI_get_plot(void)
+PARI_get_plot_Qt(void)
/* This function initialises the structure rect.h: pari_plot */
{
- if (pari_plot.init) return; // pari_plot is already set
#ifdef __QPE__
pari_plot.width = 240; // width and
pari_plot.height = 320; // height of plot window
@@ -621,5 +613,6 @@ PARI_get_plot(void)
pari_plot.vunit = 3; //
pari_plot.fwidth = 6; // font width
pari_plot.fheight = 9; // and height
+ pari_plot.draw = &draw;
pari_plot.init = 1; // flag: pari_plot is set now!
}
diff --git a/src/graph/plotQt4.c b/src/graph/plotQt4.c
index 1ef7c40..13c8905 100644
--- a/src/graph/plotQt4.c
+++ b/src/graph/plotQt4.c
@@ -553,20 +553,13 @@ void PlotWindow::save( int id)
#endif // __FANCY_WIN__
-
-//
-// Implementation of the two architecture-dependent functions
-// (from rect.h) requested by pari's plotting routines
-//
-
-
-void
-rectdraw0(long *w, long *x, long *y, long lw)
+/* Interface to PARI's plotting functions */
+static void
+draw(long *w, long *x, long *y, long lw)
{
if (pari_daemon()) return; // parent process returns
pari_close();
- PARI_get_plot();
// launch Qt window
int argc = 1; // set argc = 2 for cross
@@ -593,10 +586,9 @@ rectdraw0(long *w, long *x, long *y, long lw)
}
void
-PARI_get_plot(void)
+PARI_get_plot_Qt4(void)
/* This function initialises the structure rect.h: pari_plot */
{
- if (pari_plot.init) return; // pari_plot is already set
#ifdef __QPE__
pari_plot.width = 240; // width and
pari_plot.height = 320; // height of plot window
@@ -608,5 +600,6 @@ PARI_get_plot(void)
pari_plot.vunit = 3; //
pari_plot.fwidth = 6; // font width
pari_plot.fheight = 9; // and height
+ pari_plot.draw = &draw;
pari_plot.init = 1; // flag: pari_plot is set now!
}
diff --git a/src/graph/plotWin32.c b/src/graph/plotWin32.c
index 8af4d66..6ca8b9b 100644
--- a/src/graph/plotWin32.c
+++ b/src/graph/plotWin32.c
@@ -68,7 +68,10 @@ static void DrawString(void *data, long x, long y, char *text, long numtext)
TextOut((HDC)data, x, y, text, numtext);
}
-void rectdraw0(long *w, long *x, long *y, long lw)
+
+/* Interface to PARI's plotting functions */
+static void
+draw(long *w, long *x, long *y, long lw)
{
char tmppath[MAX_PATH], fname[MAX_PATH];
struct plot_eng plotWin32;
@@ -102,13 +105,11 @@ void rectdraw0(long *w, long *x, long *y, long lw)
}
void
-PARI_get_plot(void)
+PARI_get_plot_Win32(void)
{
HDC hdc;
TEXTMETRIC tm;
- if (pari_plot.init) return; /* pari_plot is already set */
- pari_plot.init = 1;
pari_plot.width = GetSystemMetrics(SM_CXSCREEN)/2;
pari_plot.height = GetSystemMetrics(SM_CYSCREEN)/2;
pari_plot.hunit = pari_plot.width/100;
@@ -121,4 +122,6 @@ PARI_get_plot(void)
pari_plot.fwidth = tm.tmAveCharWidth;
pari_plot.fheight = tm.tmHeight;
+ pari_plot.draw = &draw;
+ pari_plot.init = 1;
}
diff --git a/src/graph/plotX.c b/src/graph/plotX.c
index 13bf839..b0b6e4e 100644
--- a/src/graph/plotX.c
+++ b/src/graph/plotX.c
@@ -154,8 +154,10 @@ PARI_ColorSetUp(Display *display, GEN colors)
}
}
-void
-rectdraw0(long *w, long *x, long *y, long lw)
+
+/* Interface to PARI's plotting functions */
+static void
+draw(long *w, long *x, long *y, long lw)
{
long oldwidth,oldheight;
struct plot_eng plotX;
@@ -173,7 +175,6 @@ rectdraw0(long *w, long *x, long *y, long lw)
if (pari_daemon()) return; /* parent process returns */
- PARI_get_plot();
pari_close();
display = XOpenDisplay(NULL);
@@ -279,13 +280,12 @@ EXIT:
}
void
-PARI_get_plot(void)
+PARI_get_plot_X(void)
{
Display *display;
int screen;
- if (pari_plot.init) return;
- if (!(display = XOpenDisplay(NULL))) pari_err(e_MISC, "no X server");
+ if (!(display = XOpenDisplay(NULL))) {pari_warn(warner, "no X server"); return;}
screen = DefaultScreen(display);
pari_plot.width = DisplayWidth(display, screen) - 40;
pari_plot.height = DisplayHeight(display, screen) - 60;
@@ -293,6 +293,7 @@ PARI_get_plot(void)
pari_plot.fwidth = 9;
pari_plot.hunit = 5;
pari_plot.vunit = 5;
- pari_plot.init = 1;
+ pari_plot.draw = &draw;
+ pari_plot.init = 1;
XCloseDisplay(display);
}
diff --git a/src/graph/plotfltk.c b/src/graph/plotfltk.c
index 3879728..92abcbd 100644
--- a/src/graph/plotfltk.c
+++ b/src/graph/plotfltk.c
@@ -189,20 +189,16 @@ int Plotter::handle(int event)
}
}
-//
-// Implementation of the two architecture-dependent functions
-// (from rect.h) requested by pari's plotting routines
-//
-void
-rectdraw0(long *w, long *x, long *y, long lw)
+/* Interface to PARI's plotting functions */
+static void
+fltk_draw(long *w, long *x, long *y, long lw)
{
Plotter *win;
if (pari_daemon()) return; // parent process returns
pari_close();
- PARI_get_plot();
Fl::visual(FL_DOUBLE|FL_INDEX);
win = new Plotter( w, x, y, lw);
@@ -215,15 +211,15 @@ rectdraw0(long *w, long *x, long *y, long lw)
}
void
-PARI_get_plot(void)
+PARI_get_plot_fltk(void)
/* This function initialises the structure rect.h: pari_plot */
{
- if (pari_plot.init) return; // pari_plot is already set
pari_plot.width = 400; // width and
pari_plot.height = 300; // height of plot window
pari_plot.hunit = 3; //
pari_plot.vunit = 3; //
pari_plot.fwidth = 6; // font width
pari_plot.fheight = 9; // and height
+ pari_plot.draw = &fltk_draw;
pari_plot.init = 1; // flag: pari_plot is set now!
}
diff --git a/src/graph/plotnull.c b/src/graph/plotnull.c
deleted file mode 100644
index fdf26e3..0000000
--- a/src/graph/plotnull.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 2000 The PARI group.
-
-This file is part of the PARI/GP package.
-
-PARI/GP is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation. It is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY WHATSOEVER.
-
-Check the License for details. You should have received a copy of it, along
-with the package; see the file 'COPYING'. If not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
-
-#include "pari.h"
-#include "rect.h"
-
-void
-rectdraw0(long *w, long *x, long *y, long lw)
-{
- (void)w;
- (void)x;
- (void)y;
- (void)lw;
-}
-
-void
-PARI_get_plot(void)
-{ pari_err(e_MISC,"high resolution graphics disabled"); }
diff --git a/src/graph/plotport.c b/src/graph/plotport.c
index c6de38f..fda8303 100644
--- a/src/graph/plotport.c
+++ b/src/graph/plotport.c
@@ -30,6 +30,8 @@ PariRect *rectgraph[18]; /*NUMRECT*/
/* no need for THREAD: gp-specific */
static long current_color[18]; /*NUMRECT*/
+static int init_graph_done = 0;
+
PARI_plot pari_plot, pari_psplot;
PARI_plot *pari_plot_engine = &pari_plot;
long rectpoint_itype = 0, rectline_itype = 0;
@@ -48,15 +50,25 @@ READ_EXPR(GEN code, GEN x) {
set_lex(-1, x); return closure_evalgen(code);
}
+
/********************************************************************/
/** **/
/** RECTPLOT FUNCTIONS **/
/** **/
/********************************************************************/
void
+PARI_get_plot(void)
+{
+ if (!pari_plot.init)
+ pari_err(e_MISC, "high resolution graphics disabled");
+ init_graph();
+}
+
+void
init_graph(void)
{
long n;
+ if (init_graph_done) return;
for (n=0; n<NUMRECT; n++)
{
PariRect *e = (PariRect*) pari_malloc(sizeof(PariRect));
@@ -65,12 +77,14 @@ init_graph(void)
current_color[n] = DEFAULT_COLOR;
rectgraph[n] = e;
}
+ init_graph_done = 1;
}
void
free_graph(void)
{
int i;
+ if (!init_graph_done) return;
for (i=0; i<NUMRECT; i++)
{
PariRect *e = rectgraph[i];
@@ -84,6 +98,7 @@ free_graph(void)
}
if (GP_DATA->colormap) pari_free(GP_DATA->colormap);
if (GP_DATA->graphcolors) pari_free(GP_DATA->graphcolors);
+ init_graph_done = 0;
}
static PariRect *
@@ -1565,7 +1580,7 @@ rectplothrawin(long grect, dblPointList *data, long flags)
if (W)
{
if (W == &pari_plot)
- rectdraw0(w,wx,wy,2);
+ W->draw(w,wx,wy,2);
else
postdraw0(w,wx,wy,2, 0);
killrect(w[1]);
@@ -1704,6 +1719,7 @@ PARI_get_psplot(void)
pari_psplot.fwidth = 6;
pari_psplot.hunit = 5;
pari_psplot.vunit = 5;
+ pari_psplot.draw = NULL; /* Currently unused for ps plotting */
}
static void
@@ -1736,7 +1752,13 @@ gendraw(GEN list, long ps, long flag)
ne = itos(win); check_rect(ne);
w[i] = ne;
}
- if (ps) postdraw0(w,x,y,n,flag); else rectdraw0(w,x,y,n);
+ if (ps)
+ postdraw0(w,x,y,n,flag);
+ else
+ {
+ PARI_get_plot();
+ pari_plot.draw(w,x,y,n);
+ }
pari_free(x); pari_free(y); pari_free(w);
}
diff --git a/src/graph/plotps.c b/src/graph/plotps.c
index dcdecc1..bee35bf 100644
--- a/src/graph/plotps.c
+++ b/src/graph/plotps.c
@@ -19,8 +19,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
#include "paripriv.h"
#include "rect.h"
-void
-rectdraw0(long *w, long *x, long *y, long lw)
+
+/* Interface to PARI's plotting functions */
+static void
+draw(long *w, long *x, long *y, long lw)
{
struct plot_eng plot;
FILE *file;
@@ -44,14 +46,14 @@ rectdraw0(long *w, long *x, long *y, long lw)
}
void
-PARI_get_plot(void)
+PARI_get_plot_ps(void)
{
- if (pari_plot.init) return;
pari_plot.width = 400;
pari_plot.height = 300;
pari_plot.fheight = 9;
pari_plot.fwidth = 6;
pari_plot.hunit = 3;
pari_plot.vunit = 3;
- pari_plot.init = 1;
+ pari_plot.draw = &draw;
+ pari_plot.init = 1;
}
diff --git a/src/graph/rect.h b/src/graph/rect.h
index b8a3476..acc78a1 100644
--- a/src/graph/rect.h
+++ b/src/graph/rect.h
@@ -23,6 +23,7 @@ typedef struct PARI_plot {
long fheight;
long init;
char name[PLOT_NAME_LEN+1];
+ void (*draw)(long *w, long *x, long *y, long lw);
} PARI_plot;
extern PARI_plot pari_plot, pari_psplot;
@@ -233,54 +234,12 @@ extern long rectline_itype;
/* plotport.c */
typedef long (*col_counter)[ROt_MAX];
-void color_to_rgb(GEN c, int *r, int *g, int *b);
-void initrect(long ne, long x, long y);
-void initrect_gen(long ne, GEN x, GEN y, long flag);
-void killrect(long ne);
void plot_count(long *w, long lw, col_counter rcolcnt);
-GEN ploth(GEN a, GEN b, GEN code, long prec, long flag, long numpoints);
-GEN ploth2(GEN a, GEN b, GEN code, long prec);
-GEN plothmult(GEN a, GEN b, GEN code, long prec);
-GEN plothraw(GEN listx, GEN listy, long flag);
-GEN plothsizes(void);
-GEN plothsizes_flag(long flag);
-void postdraw(GEN list);
-void postdraw_flag(GEN list, long flag);
-GEN postploth(GEN a,GEN b,GEN code,long prec,long flag,long numpoints);
-GEN postploth2(GEN a,GEN b,GEN code,long prec,long numpoints);
-GEN postplothraw(GEN listx, GEN listy, long flag);
-void psplot_init(struct plot_eng *S, FILE *f, double xscale, double yscale, long fontsize);
void Printx(dblPointList *f);
-void rectbox(long ne, GEN gx2, GEN gy2);
-void rectcolor(long ne, long color);
-void rectcopy(long source, long dest, long xoff, long yoff);
-void rectcopy_gen(long source, long dest, GEN xoff, GEN yoff, long flag);
-GEN rectcursor(long ne);
-void rectdraw(GEN list);
-void rectdraw_flag(GEN list, long flag);
-void rectline(long ne, GEN gx2, GEN gy2);
-void rectlines(long ne, GEN listx, GEN listy, long flag);
-void rectlinetype(long ne, long t);
-void rectmove(long ne, GEN x, GEN y);
-GEN rectploth(long drawrect,GEN a, GEN b, GEN code, long prec, ulong flags, long testpoints);
-GEN rectplothraw(long drawrect, GEN data, long flags);
-void rectpoint(long ne, GEN x, GEN y);
-void rectpoints(long ne, GEN listx, GEN listy);
-void rectpointtype(long ne, long t);
-void rectpointsize(long ne, GEN size);
-void rectrbox(long ne, GEN gx2, GEN gy2);
-void rectrline(long ne, GEN gx2, GEN gy2);
-void rectrmove(long ne, GEN x, GEN y);
-void rectrpoint(long ne, GEN x, GEN y);
-void rectscale(long ne, GEN x1, GEN x2, GEN y1, GEN y2);
-void rectstring(long ne, char *x);
-void rectstring3(long ne, char *x, long dir);
-void rectclip(long rect);
-
-void gen_rectdraw0(struct plot_eng *eng, long *w, long *x, long *y, long lw, double xs, double ys);
-
-/* architecture-dependent plot file (plotX.c ...) */
+void psplot_init(struct plot_eng *S, FILE *f, double xscale, double yscale, long fontsize);
+
+void gen_rectdraw0(struct plot_eng *eng, long *w, long *x, long *y, long lw, double xs, double ys);
+
void PARI_get_plot(void);
-void rectdraw0(long *w, long *x, long *y, long lw);
ENDEXTERN
diff --git a/src/headers/paridecl.h b/src/headers/paridecl.h
index aaa8977..5ff5fab 100644
--- a/src/headers/paridecl.h
+++ b/src/headers/paridecl.h
@@ -4043,6 +4043,53 @@ GEN polmodular(long L, long inv, GEN x, long yvar, long compute_derivs);
GEN polmodular_ZM(long L, long inv);
GEN polmodular_ZXX(long L, long inv, long xvar, long yvar);
+/* plotport.c */
+
+void color_to_rgb(GEN c, int *r, int *g, int *b);
+void initrect(long ne, long x, long y);
+void initrect_gen(long ne, GEN x, GEN y, long flag);
+void killrect(long ne);
+GEN ploth(GEN a, GEN b, GEN code, long prec, long flag, long numpoints);
+GEN ploth2(GEN a, GEN b, GEN code, long prec);
+GEN plothmult(GEN a, GEN b, GEN code, long prec);
+GEN plothraw(GEN listx, GEN listy, long flag);
+GEN plothsizes(void);
+GEN plothsizes_flag(long flag);
+void postdraw(GEN list);
+void postdraw_flag(GEN list, long flag);
+GEN postploth(GEN a,GEN b,GEN code,long prec,long flag,long numpoints);
+GEN postploth2(GEN a,GEN b,GEN code,long prec,long numpoints);
+GEN postplothraw(GEN listx, GEN listy, long flag);
+void rectbox(long ne, GEN gx2, GEN gy2);
+void rectcolor(long ne, long color);
+void rectcopy(long source, long dest, long xoff, long yoff);
+void rectcopy_gen(long source, long dest, GEN xoff, GEN yoff, long flag);
+GEN rectcursor(long ne);
+void rectdraw(GEN list);
+void rectdraw_flag(GEN list, long flag);
+void rectline(long ne, GEN gx2, GEN gy2);
+void rectlines(long ne, GEN listx, GEN listy, long flag);
+void rectlinetype(long ne, long t);
+void rectmove(long ne, GEN x, GEN y);
+GEN rectploth(long drawrect,GEN a, GEN b, GEN code, long prec, ulong flags, long testpoints);
+GEN rectplothraw(long drawrect, GEN data, long flags);
+void rectpoint(long ne, GEN x, GEN y);
+void rectpoints(long ne, GEN listx, GEN listy);
+void rectpointtype(long ne, long t);
+void rectpointsize(long ne, GEN size);
+void rectrbox(long ne, GEN gx2, GEN gy2);
+void rectrline(long ne, GEN gx2, GEN gy2);
+void rectrmove(long ne, GEN x, GEN y);
+void rectrpoint(long ne, GEN x, GEN y);
+void rectscale(long ne, GEN x1, GEN x2, GEN y1, GEN y2);
+void rectstring(long ne, char *x);
+void rectstring3(long ne, char *x, long dir);
+void rectclip(long rect);
+
+/* plottty.c */
+
+void pariplot(GEN a, GEN b, GEN code, GEN ysmlu, GEN ybigu, long prec);
+
/* prime.c */
long BPSW_isprime(GEN x);
@@ -4150,7 +4197,6 @@ GEN derivfunk(void *E, GEN (*eval)(void *, GEN, long), GEN x, GEN ind0, long
int forvec_init(forvec_t *T, GEN x, long flag);
GEN forvec_next(forvec_t *T);
GEN limitnum(void *E, GEN (*f)(void *,GEN,long), long muli, GEN alpha, long prec);
-void pariplot(GEN a, GEN b, GEN code, GEN ysmlu, GEN ybigu, long prec);
GEN polzag(long n, long m);
GEN prodeuler(void *E, GEN (*eval)(void *, GEN), GEN ga, GEN gb, long prec);
GEN prodinf(void *E, GEN (*eval)(void *, GEN), GEN a, long prec);
--
2.7.3