diff --git a/demo/all.dem b/demo/all.dem index 7012d78d7..dae6699a0 100644 --- a/demo/all.dem +++ b/demo/all.dem @@ -546,6 +546,7 @@ load "pm3d_lighting.dem" print "********************** file polygons.dem *********************" load "polygons.dem" +load "polygon_border.dem" print "********************** file named_palettes.dem *********************" load "named_palettes.dem" diff --git a/demo/animation.dem b/demo/animation.dem index 2d951c66f..c81f16e4b 100644 --- a/demo/animation.dem +++ b/demo/animation.dem @@ -6,7 +6,7 @@ # Example of intended use: # set term webp animate delay 100 size 300,300 # set output 'world.webp' -# load 'animate2.dem' +# load 'animation.dem' # unset output unset title diff --git a/demo/polygon_border.dem b/demo/polygon_border.dem new file mode 100644 index 000000000..81f6b6e6b --- /dev/null +++ b/demo/polygon_border.dem @@ -0,0 +1,45 @@ +# Illustrate the difference, if any, between plot styles +# "with filledcurves closed" and "with polygons". + +$VERTICES << EOD + -5.9608 0.9392 + 1.7326 1.0500 + 4.7459 0.5927 + 3.6880 0.2498 + 7.3104 -0.2681 + 2.4378 -0.4646 + -0.4792 -0.1360 + -3.9092 -0.0109 + -6.7623 0.2676 + -4.8709 0.5070 + + -1.9730 1.7596 + 3.2406 1.8143 + 4.9785 1.6039 + 3.9915 1.2840 + 6.2444 0.9399 + 4.5279 0.7578 + 2.6827 0.8862 + -0.9003 0.9494 + -2.5738 1.2051 +EOD + +set style fill transparent solid 0.2 border +unset key +unset tics +unset border +set tmargin 4 + +set multiplot layout 1,2 title "Compare closure of perimeter" + +set title "with filledcurves" right +plot $VERTICES using 1:2:(column(-1)+3) with filledcurves lc var lw 4, \ + '' using 1:2:0 with labels offset .5,.5 + +set title "with polygons" right +plot $VERTICES using 1:2:(column(-1)+3) with polygons lc var lw 4, \ + '' using 1:2:0 with labels offset .5,.5 + +unset multiplot +pause -1 " to continue" +reset diff --git a/docs/gnuplot-ja.doc b/docs/gnuplot-ja.doc index a95ec326e..0ab524b93 100644 --- a/docs/gnuplot-ja.doc +++ b/docs/gnuplot-ja.doc @@ -1,5 +1,5 @@ -C RCS $Id: gnuplot-ja.doc,v 1.796 2023-09-28 18:09:02+09 shige Exp $ -C corresponding original gnuplot.doc at 2023-09-26 +C RCS $Id: gnuplot-ja.doc,v 1.805 2023-11-28 18:28:17+09 shige Exp $ +C corresponding original gnuplot.doc at 2023-11-28 C C Copyright (C) 1986 - 1993, 1998, 1999, 2000, 2001, 2004 Thomas Williams, Colin Kelley et al. C @@ -119,14 +119,14 @@ C ?introduction ? `gnuplot` は、ポータブルなコマンド入力方式のグラフユーティリティで、 - Linux, OS/2, MS Windows, macOS, VMS, その他多くのプラットホーム上で動 - 作します。ソースコードには著作権がありますが、無料で配布されています - (すなわち、それに対価を支払う必要はありません)。元は、科学者や学生が数 - 学関数やデータなどを対話的に表示できるよう作られたのですが、現在までに - 例えば Web スクリプトなど、多くの非対話型の利用もサポートするように成 - 長しています。これは、例えば Octave のようにサードパーティのアプリケー - ションの描画エンジンとしても使われています。gnuplot は、1986 よりサポ - ートと活発な開発が行われています。 + Linux, OS/2, MS Windows, macOS, その他多くのプラットホーム上で動作しま + す。ソースコードには著作権がありますが、無料で配布されています (すなわ + ち、それに対価を支払う必要はありません)。元は、科学者や学生が数学関数 + やデータなどを対話的に表示できるよう作られたのですが、現在までに例えば + Web スクリプトなど、多くの非対話型の利用もサポートするように成長してい + ます。これは、例えば Octave のようにサードパーティのアプリケーションの + 描画エンジンとしても使われています。gnuplot は、1986 よりサポートと活 + 発な開発が行われています。 gnuplot は、2 次元、または 3 次元の多くの種類のグラフを生成できます。 います: 折線グラフ、点グラフ、棒グラフ、等高線、ベクトル場描画、画像の @@ -476,13 +476,49 @@ D viridis 1 ## に保存します。これらのファイルがない場合は、gnuplot の以前のバージョ ## ンと同様、$HOME/.gnuplot と $HOME/.gnuplot_history をそれぞれ使用し ## ます。 -#b `unset warnings` は、コンソールへの警告メッセージ出力を抑制します。 +#b `unset warnings` は、stderr への警告メッセージ出力を抑制します。 +#b `warn "message"` は、ファイル名、行番号と "message" を stderr に出力 +## します。 #b コマンド "fit" に対する例外処理。fit エラーが起きた場合でも、制御を ## 常に入力の次の行に返します。エラーが起きた場合は、返ったときに ## FIT_ERROR がゼロでない値になります。これは、良くないフィッティングか ## ら復帰するスクリプトを可能にします。以下参照: `fit error_recovery`。 #end +3 多重描画モード (Multiplots) +?new multiplots + 現在は、多重描画グラフ (multiplot) の生成時に実行したコマンドを、デー + タブロック $GPVAL_LAST_MULTIPLOT に保存します。そしてこれは、新しいコ + マンド `remultiplot` で再実行できます。保存したコマンドのうち再実行に + 問題があるコマンドは、再実行はされません。再生成した多重描画グラフは、 + その間にグラフの設定 (軸の範囲や対数軸設定等) が変更されていれば、元の + ものと完全に一致するとは限りません。 + + 以下のコマンド列は、元のグラフの状態と multiplot コマンドの両方をスク + リプトファイルに保存し、後で再読み込みできるようにします。 + + save "my_multiplot.gp" + set multiplot + ... (グラフ要素を生成するいくつかのコマンドが並ぶ) ... + unset multiplot + set print "my_multiplot.gp" append + print $GPVAL_LAST_MULTIPLOT + unset print + +#start +#b 試験段階: コマンド `replot` は、直近の plot コマンドが完了済みの +## multiplot の一部分であるかどうかをチェックします。もしそうなら、単一 +## の plot コマンドを実行する代わりに `remultiplot` を実行します。 +#b 試験段階: 多重描画グラフを表示している間のマウス操作では、現在は +## replot/refresh の要求を自動的に `remultiplot` として処理します。 +## しかし、マウス座標の読み出し、拡大/視点移動の操作は、以前の gnuplot +## の版でそうだったように、最後の plot 要素に対する軸設定にのみ基づいて +## 行われます。$GPVAL_LAST_MULTIPLOT に保存されるコマンドが、各 plot 要 +## 素に対する適切なグラフ設定を再生成するには不十分である可能性があるた +## め、multiplot でのマウス操作は、あなたが望むようなものにはならないか +## もしれません。これは今後改善されるかもしれません。 +#end + 3 新しい出力形式とオプション (New terminals and terminal options) ?new terminals #start @@ -497,8 +533,8 @@ D viridis 1 ## ムか、アニメーション列を生成します。各フレームは pngcairo で生成し、 ## その後 libwebp と libwebpmux による WebPAnimEncoder API を通してエン ## コードを行います。 -#b `dumb`, `sixel`, `kitty`, `block`, 出力形式のように、文字列出力とグ -## ラフィック表示を同じウィンドウで行う出力形式では、現在はコマンド +#b `dumb`, `sixel`, `kitty`, `block` 出力形式のように、文字列出力とグラ +## フィック表示を同じウィンドウで行う出力形式では、現在はコマンド ## `pause mouse` の間はキーボード入力に反応します。その間、それらの出力 ## 形式では、マウス操作が可能な出力形式が行うのと同じ方法でキー入力を解 ## 釈します。以下参照: `pseudo-mousing`。 @@ -540,7 +576,7 @@ D viridis 1 D epi_data 1 3 その他の新しい機能 -?new features +?new other_features #start #b `時間軸の主目盛りと副目盛り用の時間単位` ## 時間軸の主目盛りと副目盛りは、minutes/hours/days/weeks/months/years @@ -549,10 +585,9 @@ D epi_data 1 #b `using` 指定内での文字列 $# は、現在の入力データ行にある全列数と評価 ## します。例えば、"plot FOO using 0:(column($# - 1))" は、各行の最後か ## ら一つ手前の列を描画します。 -#b bin (箱) 用データの和でなく平均を描画するキーワード `binvalue=avg` -#b `set colorbox bottom` は、垂直なカラーボックスをグラフの右に配置する -## 代わりに、水平なカラーボックスをグラフの下に配置します。 -#b cbtics 以外の軸には影響しない `set colorbox cbtics ` +#b bin (箱) 用の、合計でなく平均を描画するキーワード `binvalue=avg` +#b `set colorbox bottom` は、垂直なカラーボックスを右に配置する代わりに +## 水平なカラーボックスをグラフの下に配置します。 #b 交差する pm3d 曲面のレンダリングの改良 - 重なる曲面のタイルを、交差 ## 曲線に沿って 2 つの部分に分割し、一方の曲面のタイルが他方の曲面を通 ## って不正に突き出てしまうことがないようにします。 @@ -4813,15 +4848,15 @@ Ffigure_boxerrorbars 3 次元グラフでは、スタイル `boxes` は与えられた x, y 座標を中心とし、 xy 平面 (z=0) から与えられた z 座標まで伸ばした直方体の箱を書きます。 x 方向の箱の幅は、別の入力列か `set boxwidth` で指定でき、y 方向の箱の - 奥行きは、`set boxdepth` で制御できます。箱は、自動的にはくっつくよう - には引き伸ばされません。 + 奥行きは、`set boxdepth` で制御できます。箱は、2 次元グラフのように、 + 自動的にはくっつくように引き伸ばされません。 3 2 次元の boxes (2D boxes) ?style boxes 2D ?boxes 2D `plot with boxes` は、基本的に 2 列、または 3 列のデータを使用します。 - さらに入力列を追加すると、それは、可変線色や塗り潰し色の情報として使用 - します。以下参照: `rgbcolor variable`。 + さらに入力列を追加すると、それは、可変線色 (variable line color) や塗 + り潰し色の情報として使用します。以下参照: `rgbcolor variable`。 2 列: x y 3 列: x y x_width @@ -6168,12 +6203,15 @@ Ffigure_points plot DATA {using 1:2} with polygons - `plot with polygons` は、現在は `plot with filledcurves closed` として - 処理されます。各多角形には、3 列目の値を与え、キーワード `lc variable` - を指定する (その値を linetype と解釈) か、`lc rgb variable` を指定する - (その値を 24 ビット RGB 色と解釈) ことで、個別の色を割り当てることがで - きます。多角形の最初の頂点の色の値のみが使用されます。境界の線種は、も - しあれば塗り潰しスタイル (fill style) から取ります。 + `plot with polygons` は、`plot with filledcurves closed` として処理し + ますが、各多角形の境界を閉曲線として描画する場合を除きます。それは、そ + のその最初と最後の点が同じでなくてもです。境界線の線種は、塗り潰しスタ + イル (fill style) から取ります。入力データファイルには、単一の空行で区 + 切って複数の多角形を入れることも可能です。各多角形には、3 列目の値を与 + え、キーワード `lc variable` を指定する (その値を linetype と解釈) か、 + `lc rgb variable` を指定する (その値を 24 ビット RGB 色と解釈) ことで、 + 個別の色を割り当てることができます。多角形の最初の頂点の色の値のみを使 + 用します。 3 次元グラフ: @@ -6428,7 +6466,9 @@ Ffigure_xerrorbars または (x-xdelta,y) から (x+xdelta,y) までの線分が引かれますが、これら はいくつのデータ列が与えられるかによって変わります。誤差指示線の端の刻 みの印の見た目は、`set errorbars` で制御できます。 - 点と誤差指示線の間の隙間は、`set pointintervalbox` で制御します。 + 点と誤差指示線の間の隙間は、`set pointintervalbox` で制御します。誤差 + 線を断線せずに直接点記号を貫通させるには、`unset pointintervalbox` を + 使用してください。 このスタイルは基本的に、3 列か 4 列のデータが必要です: 3 列: x y xdelta @@ -6450,7 +6490,9 @@ Ffigure_xyerrorbars (x,ylow) から (x,yhigh) までと (xlow,y) から (xhigh,y) までの線分が引 かれますが、これらはいくつのデータ列が与えられるかによって変わります。 誤差指示線の端の刻みの印の見た目は、`set errorbars` で制御できます。 - 点と誤差指示線の間の隙間は、`set pointintervalbox` で制御します。 + 点と誤差指示線の間の隙間は、`set pointintervalbox` で制御します。誤差 + 線を断線せずに直接点記号を貫通させるには、`unset pointintervalbox` を + 使用してください。 これは 4 列か、6 列のデータが必要です。 4 列: x y xdelta ydelta @@ -6529,7 +6571,8 @@ Ffigure_yerrorbars (x,y+ydelta) まで、または (x,ylow) から (x,yhigh) までの線分が引かれま すが、これらはいくつのデータ列が与えられるかによって変わります。誤差指 示線の端の刻みの印の見た目は、`set errorbars` で制御できます。点と誤差 - 線との隙間は `set pointintervalbox` で制御します。 + 線との隙間は `set pointintervalbox` で制御します。誤差線を断線せずに直 + 接点記号を貫通させるには、`unset pointintervalbox` を使用してください。 2 列: [暗黙の x] y ydelta 3 列: x y ydelta @@ -6820,6 +6863,10 @@ Ffigure_zerror この例では、ARGV[1] と ARGV[2] は可能な限りの精度を持つ浮動小数値とな りますが、ARG2 は書式 "%g" による文字列として保存されるため精度が落ち ています。 + + ARGC とそれに対応する配列 ARGV[ARGC] は関数ブロック呼び出しの内部でも + 利用可能です。しかし、関数ブロック呼び出しでは、文字列変数 ARG1,... は + 作られません。 3 例 (Example) ?call example ?commands call example @@ -7572,9 +7619,11 @@ Ffigure_zerror gnuplot> plot $sinc(x) with lines title "sinc(x) as a function block" 名前付き引数の一覧は、関数ブロックの宣言時に指定する必要はありません。 - コマンドラインで指定した関数の引数は、関数ブロックの内部から、コマンド - `call` でそうするように ARGV[1] などの形でアクセスできます。これにより、 - 可変な個数の引数を操作できる関数ブロックを定義することができます。 + コマンドラインで指定した関数の引数の個数とその値は、関数ブロックの内部 + から、整数変数 ARGC とそれに対応する配列 ARGV[ARGC] でアクセスできます。 + 以下参照: `ARGV`。これにより、可変な個数の引数を操作できる関数ブロック + を定義することができます。`call` 文によるファイルの読み込みとは違い、 + 引数は文字列変数化 (例えば ARG1) はされません。 例: function $max << EOF @@ -7614,6 +7663,8 @@ Ffigure_zerror #start #b 関数ブロック内で、データブロックや関数ブロックを定義することはできま ## せん。 +#b 疑似ファイル '-' は、関数ブロック内でのデータの読み込みには使用でき +## ません。 #b 以下のコマンドは関数ブロック内で実行できません。 ## `reset`, `shell`, `!`。 #b コマンド `plot`, `replot`, `splot`, `refresh`, `stats`, `vfill`, @@ -7965,12 +8016,12 @@ Ffigure_zerror 影を描きます。 書式: - plot {} {, , } + plot {} <描画要素> {, <描画要素>, <描画要素>} - 各描画要素 (plot-element) は、定義 (definition) か関数 (function) かデ - ータ (data source) のいずれか 1 つに、オプションの属性、修正子などがつ - いたものです: - 描画要素 (plot-element): + 各描画要素は、定義 (definition) か関数 (function) かデータ (data + source) のいずれか 1 つに、オプションの属性、修正子などがついたもので + す: + 描画要素: {} | {sampling-range} | | keyentry @@ -9195,6 +9246,7 @@ Ffigure_smooth_path 4 特別なファイル名 (special-filenames) ?special-filenames ?special_filenames +?pseudofiles ?commands plot datafile special-filenames ?plot datafile special-filenames ?plot special-filenames @@ -9202,8 +9254,9 @@ Ffigure_smooth_path ?data special-filenames ?special-filenames ++ ?special-filenames + -?+ -?++ +?'-' +?'+' +?'++' 特別な意味を持つファイル名として、次のものがあります: '', '-', '+', '++' @@ -9221,9 +9274,10 @@ Ffigure_smooth_path ンプル点毎に単一の y (または z) の値しか持てません。しかし疑似ファイル '+' はそれがあたかも実際の入力ファイルであるように、`using` 指定による 1 列目の値を標本点として扱い、さらに追加の列の値を指定することも可能で - す。標本点数は `set samples` で制御できます。標本点は、デフォルトでは - `set trange` で設定した範囲全体に渡りますが、trange が設定されていなけ - れば `set xrange` の範囲全体に渡ります。 + す。標本点数は `set samples` かまたは明示的に標本間隔を範囲指定部分に + 指定することで制御できます。標本点は、`set trange` で設定されていれば + それで設定した範囲全体に渡りますが、そうでなければ `set xrange` の範囲 + 全体に渡ります。 注意: trange の使用は、以前のある版の gnuplot の仕様とは異なりますが、 これにより x 軸の範囲とは異なる標本範囲が使用できることになります。 @@ -9231,15 +9285,22 @@ Ffigure_smooth_path plot '+' using ($1):(sin($1)):(sin($1)**2) with filledcurves '+' の直前に、独立な標本範囲を指定することもできます。通常の関数描画の - と同様、独立変数に名前を割り当てることもできます。plot の最初の要素に - 与える場合、標本範囲にはそれを明示するキーワード `sample` を前置する必 - 要があります (以下も参照: `plot sampling`)。 + と同様、独立変数に名前を割り当てることもできます。 + 以下は、標本間隔 (1.5) を標本範囲内に指定した例です。標本点は、-3, 1.5, + 0, 1.5, ... 24 の位置で取ります。 - plot sample [beta=0:2*pi] '+' using (sin(beta)):(cos(beta)) with lines + plot $MYDATA, [t=-3:25:1.5] '+' using (t):(f(t)) さらに、`+` の範囲指定には、標本増分を与えることもできます。 + `plot` か `splot` コマンドのすぐ後に標本範囲を書くと, 間違って x 軸の + 範囲との解釈されてしまうかもしれません。そのあいまいさを避けるために、 + キーワード `sample` を前置するか、または標本範囲の 3 番目のフィールド + として標本間隔を与えるかすればいいでしょう。その標本間隔は空でもよく、 + その場合はデフォルトを使用します。そのようなあいまいさの例については、 + 以下参照: `plot sampling`。 - plot $MYDATA, [t=-3:25:1] '+' using (t):(f(t)) + plot sample [beta=0:2*pi] '+' using (sin(beta)):(cos(beta)) with lines + plot [beta=0:2*pi:] '+' using (sin(beta)):(cos(beta)) with lines 疑似ファイル '++' は、u 方向は `set samples` で制御される点の数、v 方 向は `set isosamples` で制御される点の数の、標準的な [u,v] 座標の格子 @@ -9278,9 +9339,9 @@ Ffigure_smooth_path plot 'ある/とても/長い/ファイル名' using 1:2, '' using 1:3, '' using 1:4 - のようなときに便利です。(もし同じ plot コマンド上で、`'-'` と `''` の - 両方を使用すると、上の例にあるように、インラインデータの 2 つの集合を - 与える必要があります。) + のようなときに便利です。もし同じ plot コマンド上で、`'-'` と `''` の両 + 方を使用すると、インラインデータの 2 つの集合を与える必要があり、一つ + 目のものを再利用することはできません。 4 パイプによる入力データ (piped-data) ?commands plot datafile piped-data @@ -9552,15 +9613,6 @@ C using ?using zticlabels ?plot using zticlabels 以下参照: `plot using xticlabels`。 -5 cbticlabels -?using cbticlabels - 試験段階の機能 (細かい部分は将来のリリースで変更の可能性あり)。 - 2 次元グラフ: "lc palette z" による変数配色では、色見本 (colorbox) の - ラベルを、グラフで使用するパレット座標に配置します。 - 3 次元グラフ: 色見本のラベルを、点の z 座標に配置します。 - z には一致しない変数配色での 3 次元色地図の場合、これは正しいラベルに - はならない可能性があることに注意してください。 - 以下も参照: `plot using xticlabels`。 4 volatile ?datafile volatile ?data volatile @@ -9696,13 +9748,16 @@ C using 4 1 次元のサンプリング (x または t 軸) (1D sampling) ?sampling 1D ?plot sampling 1D - デフォルトでは、関数や疑似ファイル "+" で生成されるデータは、描画範囲 - 全体にわたって標本 (サンプル) が取られます。この範囲は、事前にコマンド - `set xrange` で設定するか、plot コマンドか splot コマンドの最初の場所 - で大域範囲を明示的に指定するかしなければ、そのグラフのすべての要素を含 - む範囲内にデータ全体が入るよう x の範囲を自動縮尺 (autoscaling) します。 - しかし、その標本化範囲は個々の描画要素毎にさらに制限して割り当てること - もできます。 + デフォルトでは、計算対象の関数に対して、描画範囲全体にわたって標本 (サ + ンプル) を取ります。この範囲は、事前にコマンド `set xrange` で設定する + か、plot コマンドの一番最初の場所で x 軸の範囲指定をするか、またはその + グラフのすべての要素を含む範囲内にデータ全体が入るように自動縮尺 + (autoscaling) された x の範囲です。疑似ファイル "+" が生成する標本点は、 + t 軸の現在の範囲全体に渡りますが、それは x 軸の範囲と同じでも同じでな + くても構いません。 + + 個々の描画要素毎に対し、標本範囲をさらに制限して割り当てることもできま + す。 例: @@ -9717,27 +9772,35 @@ C using set autoscale x plot 'datafile', [0:200] func1(x), [200:500] func2(x) - 以下のコマンドにはあいまいさが含まれます。先頭の範囲は、多分最初の関数 - の標本化のみに向けたのだと思いますが、実際はそうではなく、すべての描画 - 要素に適用するように解釈されます: + 以下のコマンドはあいまいです。先頭の範囲 [0:10] は、多分最初の関数の標 + 本化のみに向けたのだと思いますが、実際には、グラフ全体に適用され、事前 + の xrange の定義も無視されてしまいます: + set xrange [0:50] plot [0:10] f(x), [10:20] g(x), [20:30] h(x) - 以下のコマンドは、上の例のあいまいさを除くためにキーワード `sample` を - 追加したもので、その範囲指定を plot 全体に適用しないようにしています: - plot sample [0:10] f(x), [10:20] g(x), [20:30] h(x) + 上の例のあいまいさを除くためには、キーワード `sample` を挿入することで + [0:10] が軸の範囲ではなく標本範囲であることを指示するか、または範囲指 + 定内に 2 番目のコロンに続く標本増分フィールドを追加することです。後者 + は、軸範囲としては完全な範囲指定 [min:max:increment] は解釈されないた + めに機能します。増分フィールドが空の場合は、増分はデフォルトの + (max-min) を標本点数で割った値となり、よって以下の 3 つの変種は同じ結 + 果を生じます。 + set samples 100 + plot sample [0:10] f(x), [10:20] g(x), [20:30] h(x) + plot [0:10:0.1] f(x), [10:20] g(x), [20:30] h(x) + plot [0:10:] f(x), [10:20] g(x), [20:30] h(x) 以下の例は、3 次元グラフにらせんの曲線を描く一つの方法を提示します: set xrange [-2:2]; set yrange [-2:2] - splot sample [h=1:10] '+' using (cos(h)):(sin(h)):(h) + set angle degrees + splot [phi=1:720:2] '+' using (cos(phi)):(sin(phi)):(phi) 4 2 次元のサンプリング (u と v 軸) (2D sampling) ?sampling 2D ?plot sampling 2D - 疑似ファイル '++' に対して計算する関数値や生成されたデータは、u, v 軸 - に沿って標本化 (サンプリング) を行います。これは、5.2 より前のバージョ - ンからの仕様の「変更」で、従来は x, y 軸に沿って標本化していました。以 - 下参照: `special-filenames ++`。2 次元のサンプリングは `plot`, `splot` - コマンドで使用できます。 + 計算する関数や疑似ファイル '++' に対して生成するデータは、u, v 軸に沿 + って標本化 (サンプリング) を行います。以下参照: `special-filenames ++`。 + 2 次元のサンプリングは `plot`, `splot` コマンドで使用できます。 以下は、2 次元の `plot` コマンドに対する 2 次元サンプリングの例です。 これは、描画スタイル `with vectors` で表示されるグラフを生成します。 @@ -9758,7 +9821,7 @@ C using u, v のサンプリングの範囲指定には、サンプリングデータの数とスペースを 制御する、明示的なサンプリング間隔を入れることもできます: - splot sample [u=30:70:1][v=0:50:5] '++' using 1:2:(func($1,$2)) + splot [u=30:70:1][v=0:50:5] '++' using 1:2:(func($1,$2)) 3 plot コマンドの for ループ (for loops in plot command) ?commands plot for @@ -10106,6 +10169,8 @@ C using `printerr` は `print` コマンドとほぼ同じですが、その前の `set print` コマンドの効果が続いている状態でも出力を常に stderr に送るところだけが 違います。 + その出力に現在のファイル名 (または関数ブロック名) と行番号を入れたい場 + 合は、代わりにコマンド `warn` を使用してください。 2 pwd ?commands pwd ?pwd @@ -10159,6 +10224,18 @@ C using set output 'zoom.ps' refresh +2 remultiplot +?commands remultiplot +?remultiplot + `remultiplot` は、直前の multiplot を生成した際に名前付きデータブロッ + ク $GPAL_LAST_MULTIPLOT に前に保存したコマンド列を再実行します。以下 + 参照: `new multiplots`。 + + 試験段階: 直前の plot コマンドが完了済みの multiplot の一部であれば、 + `replot` は暗黙に `remultiplot` を呼び出します。 + `set mouse multiplot` が有効であれば、視線移動/拡大などのマウス操作で + も `remultiplot` を呼び出します。 + 2 replot ?commands replot ?replot @@ -10182,14 +10259,23 @@ C using 求することになるからです。たいていの場合、代わりにコマンド `refresh` を使えます。これは、以前に読み込んだデータを使ってグラフを再描画します。 - `multiplot` モードでは、`replot` コマンドはすべての plot ではなく、直 - 前の plot 部分だけしか再実行しないことに注意してください。 - 最後に実行した `plot` (`splot`) コマンドの内容を修正する方法については 以下も参照: `command-line-editing`。 直前の描画コマンドの全体を表示させることや、それを `history` の中に コピーする方法については、以下も参照: `show plot`。 + + 以前の gnuplot の版では、multiplot 全体は再描画できず、`replot` コマン + ドはそのうち最後の plot 要素しか再生成しませんでした。gnuplot バージョ + ン 6 では、multiplot を生成するのに使用したコマンドをデータブロック + $GPVAL_LAST_MULTIPLOT に保存し、それは新しいコマンド `remultiplot` を + 使って multiplot 全体を再生成するのに再実行できます。 + + 試験段階 (詳細は今後の gnuplot の版で変更の可能性あり): + 直前に書いたグラフが multiplot の一部だった場合、`replot` コマンドは現 + 在は自動的に `remultiplot` として扱います。いくつかの注意事項がありま + す。以下参照: `new multiplots`, `remultiplot`。 + 2 reread ?commands reread ?reread @@ -10197,11 +10283,11 @@ C using 明示的な繰り返し (iteration) を支持し、このコマンドは非推奨とします。 以下参照: `iterate`。 - `reread` コマンドは、`load` コマンドで指定した `gnuplot` のコマンドフ - ァイルからの実行を、直ちにそのファイルの先頭から再び開始することを行い - ます。これは、コマンドファイルの最初から `reread` コマンドまでのコマン - ドの無限ループを本質的に実装していることになります。標準入力から対話型 - の入力の際は、`reread` コマンドは何の効力も持ちません。 + `reread` コマンドは、`load` コマンドで指定した `gnuplot` の入力ファイ + ルからの実行を、直ちにそのファイルの先頭から再開します。これは、ファイ + ルの最初から `reread` コマンドまでのコマンドの無限ループを本質的に実装 + していることになります。標準入力からの入力の際は、`reread` コマンドは + 何の効力も持ちません。 2 reset ?commands reset ?reset @@ -12783,13 +12869,24 @@ Ffigure_keyentry に指定します。通常のタイトルフォント、文字色、`at` 座標、拡張文字列処 理に対するオプションは、すべて適用します。 例: - set key outside right center title "Outcomes" + set key outside right center plot $HEATMAP matrix with image notitle, \ + keyentry "Outcomes" left, \ keyentry with boxes fc palette cb 0 title "no effect", \ keyentry with boxes fc palette cb 1 title "threshold", \ keyentry with boxes fc palette cb 3 title "typical range", \ - keyentry with labels nopoint title "as reported in [12]", \ + keyentry title "as reported in [12]", \ keyentry with boxes fc palette cb 5 title "strong effect" + + `keyentry "Outcomes" left` の行は、通常の凡例を保持するスペースに、文 + 字列を左揃えで配置します。これは、凡例の幅全体に渡ってタイトルを埋め込 + ませることを可能にします。同じ keyentry に title も与えた場合は、両方 + の文字列が同じ行に現れ、それにより 2 列の凡例のエントリの生成が可能に + なります。 + 位置合わせ用のキーワード `left/right/center` や, `boxed` などが利用で + きます。 + 例: + plot ..., keyentry "West Linn" boxed title "locations" 4 凡例の自動タイトル (key autotitle) ?commands set key autotitle ?set key autotitle @@ -13571,9 +13668,7 @@ Ffigure_multiple_keys ?mouse ?nomouse コマンド `set mouse` は、現在の対話型出力形式に対してマウス機能を有効 - にします。対話型モードでは通常デフォルトでこれは有効になっていますが、 - コマンドがファイルから読み込まれる場合はデフォルトでは無効になっていま - す。 + にします。これがデフォルトです。 マウスモードは 2 種類用意されています。2 次元モードは、`plot` コマンド と `splot` の 2 次元射影 (すなわち、z の回転角が 0, 90, 180, 270, 360 @@ -13591,11 +13686,6 @@ Ffigure_multiple_keys に対して有用でしょう。マウスボタン 3 は、z 軸の向き (azimuth) を制御し ます (以下参照: `set view azimuth`)。 - マウスは多重描画 (multiplot) モード内では無効ですが、`unset multiplot` - で多重描画が完結すれば、マウス機能は ON になります。ただし、その作用は - multiplot 内の最後の描画 (replot で描画されるようなもの) に対してのみ - です。 - 書式: set mouse {doubleclick } {nodoubleclick} {{no}zoomcoordinates} @@ -13875,7 +13965,7 @@ Ffigure_multiple_keys plot cos(2*x) unset multiplot - 以下も参照 + 以下参照: `remultiplot`, `new multiplots`。また以下も参照 ^ multiplot のデモ (multiplt.dem) ^ @@ -15365,7 +15455,8 @@ D spotlight 1 すると、点の記号を描く前に、各点の記号の後ろの箱 (実際には円) の部分 を背景色で塗りつぶすことで消します。コマンド `set pointintervalbox` は その消す領域の大きさ (半径) を制御します。指定する値はデフォルトの半径 - (= pointsize) に対する倍率です。 + (= pointsize) に対する倍率です。`unset pointintervalbox` は、点記号の + 背景の削除をやめます。 3 点サイズ (pointsize) ?commands set pointsize ?commands show pointsize @@ -19074,10 +19165,11 @@ D viridis 1 set warnings unset warnings - 致命的ではないエラーに対する警告メッセージは、通常はその警告を引き起こ - すコマンドラインをエコーした後で stderr に出力します。この警告は、コマ - ンド `unset warnings` で抑制できます。それは明示的に `set warnings` で - 有効にするまで抑制し続けます。 + 致命的ではないエラーに対する警告メッセージは、通常はファイル名、行番号、 + およびその警告を引き起こすコマンドラインをエコーした後で stderr に出力 + します。この警告は、コマンド `unset warnings` で抑制できますが、その場 + 合でも必要ならコマンド `warn "message"` で警告を生成できます。それは明 + 示的に `set warnings` で有効にするまで抑制し続けます。 2 update ?commands update ?update @@ -19138,6 +19230,15 @@ D viridis 1 ことに注意してください。 ボクセル一つを 0 にリセットするには、`voxel(x,y,z) = 0` を使用し、 すべての格子を 0 にリセットするには、`vclear` を使用してください。 +2 warn +?warn +?commands warn + 書式: + warn "message" + コマンド `warn` は、実質的に `printerr` と同じですが、指定したメッセー + ジを stderr に出力する前に、現在のファイル名か関数ブロック名、および現 + 在の行番号を追加するところが違います。 + `printerr` とは違い、`warn` の出力は `unset warnings` で抑制されます。 2 While ?while ?commands while diff --git a/docs/gnuplot.doc b/docs/gnuplot.doc index 2e4110ddb..513defc80 100644 --- a/docs/gnuplot.doc +++ b/docs/gnuplot.doc @@ -419,6 +419,40 @@ D viridis 1 ## See `fit error_recovery`. #end +3 Multiplots +?new multiplots + Commands executed during creation of a multiplot are now stored in a + datablock $GPVAL_LAST_MULTIPLOT. They can be replayed by the new command + `remultiplot`. Certain saved commands that would be problematic during replay + are not reexecuted. Note that the regenerated multiplot may not exactly + match the original if graphics settings (axis ranges, logscale, etc) + have changed in the interim. + + The following sequence of commands will save both the original graphics state + and the multiplot commands to a script file that can be reloaded later. + + save "my_multiplot.gp" + set multiplot + ... various commands to generate the component plots ... + unset multiplot + set print "my_multiplot.gp" append + print $GPVAL_LAST_MULTIPLOT + unset print + +#start +#b EXPERIMENTAL. The `replot` command will check to see if the most recent +## plot command was part of a completed multiplot. If so, it will execute +## `remultiplot` instead of reexecuting that single plot command. +#b EXPERIMENTAL. Mousing operations while a multiplot is displayed will also +## now automatically treat a replot/refresh request as `remultiplot`. +## However the mouse coordinate readout and thus zoom/pan operations are +## still based solely on the axis settings for the final component plot, +## as was the case in earlier gnuplot versions. Because the commands stored +## in $GPVAL_LAST_MULTIPLOT may not be sufficient to recreate the appropriate +## graphics settings for each component plot, mousing in a multiplot may not +## act as you would like. This may be improved in the future. +#end + 3 New terminals and terminal options ?new terminals #start @@ -475,7 +509,7 @@ D viridis 1 D epi_data 1 3 Other new features -?new features +?new other_features #start #b `Time units for setting major and minor tics.` ## Both major and minor tics along a time axis now accept tic intervals given @@ -6068,12 +6102,14 @@ Ffigure_points plot DATA {using 1:2} with polygons - `plot with polygons` is currently treated as `plot with filledcurves closed`. - Each polygon may be assigned a separate color by providing a third using - specifier and the keywords `lc variable` (value is interpreted as a linetype) - or `lc rgb variable` (value is interpreted as a 24-bit RGB color). + `plot with polygons` is treated as `plot with filledcurves closed` except that + each polygon's border is rendered as a closed curve even if its first and last + points are not the same. The border line type is taken from the fill style. + The input data file may contain multiple polygons separated by single blank + lines. Each polygon can be assigned a separate color by providing a third + using specifier and the keywords `lc variable` (value is interpreted as a + linetype) or `lc rgb variable` (value is interpreted as a 24-bit RGB color). Only the color value from the first vertex of the polygon is used. - The border line type, if any, is taken from the fill style. 3D plots: @@ -10028,6 +10064,16 @@ Ffigure_smooth_path set output 'zoom.ps' refresh +2 remultiplot +?commands remultiplot +?remultiplot + `remultiplot` replays a sequence of commands that were previously stored into + the datablock named $GPVAL_LAST_MULTIPLOT during generation of the previous + multiplot. See `new multiplots`. + + EXPERIMENTAL: `remultiplot` is invoked implicitly from `replot` if the + immediately preceeding plot command was part of a completed multiplot. + 2 replot ?commands replot ?replot @@ -10050,14 +10096,23 @@ Ffigure_smooth_path over again. In most cases you can use the `refresh` command instead, which will redraw the plot using the data previously read in. - Note that in multiplot mode, `replot` can only reproduce the most recent - component plot, not the full set. - See also `command-line-editing` for ways to edit the last `plot` (`splot`) command. See also `show plot` to show the whole current plotting command, and the possibility to copy it into the `history`. + + In previous gnuplot versions, a complete multiplot could not be redrawn. + The `replot` command reproduced only the final component plot of the full set. + In gnuplot version 6 the commands used to generate a multiplot are stored into + a datablock $GPVAL_LAST_MULTIPLOT. They can be replayed to regenerate the + entire multiplot using the new command `remultiplot`. + + EXPERIMENTAL (details may change in a subsequent gnuplot version): + If the previously drawn plot was part of a multiplot, the `replot` command + is now automatically treated as `remultiplot`. Several caveats apply. + See `new multiplots`, `remultiplot`. + 2 reread ?commands reread ?reread @@ -10065,11 +10120,11 @@ Ffigure_smooth_path This command is deprecated in favor of explicit iteration. See `iterate`. - The `reread` command causes execution from the current `gnuplot` command file, - as specified by a `load` command, to immediately start again from the beginning + The `reread` command causes execution from the current `gnuplot` input file, + as specified by a `load` command, to immediately restart from the beginning of the file. This essentially implements an endless loop of commands from the - beginning of of the command file to the `reread` command. - `reread` has no effect when reading interactively from stdin. + beginning of the file to the `reread` command. + `reread` has no effect when reading commands from stdin. 2 reset ?commands reset ?reset @@ -13434,8 +13489,7 @@ Ffigure_multiple_keys ?mouse ?nomouse The command `set mouse` enables mouse actions for the current interactive - terminal. It is usually enabled by default in interactive mode, but disabled - by default if commands are being read from a file. + terminal. It is by default. There are two mouse modes. The 2D mode works for `plot` commands and for `splot` maps (i.e. `set view` with z-rotation 0, 90, 180, 270 or 360 degrees, including @@ -13451,10 +13505,6 @@ Ffigure_multiple_keys but the data are suppressed. This is useful for large data sets. Mouse button 3 controls the azimuth of the z axis (see `set view azimuth`). - Mousing is not available inside multiplot mode. When multiplot is completed - using `unset multiplot`, then the mouse will be turned on again but acts only - on the most recent plot within the multiplot (like replot does). - Syntax: set mouse {doubleclick } {nodoubleclick} {{no}zoomcoordinates} @@ -13598,7 +13648,7 @@ Ffigure_multiple_keys ?multiplot ?nomultiplot ?layout - The command `set multiplot` places `gnuplot` in the multiplot mode, in which + The command `set multiplot` places `gnuplot` in multiplot mode, in which several plots are placed next to each other on the same page or screen window. Syntax: @@ -13730,7 +13780,7 @@ Ffigure_multiple_keys plot cos(2*x) unset multiplot - See also + See also `remultiplot`, `new multiplots`, ^ multiplot demo (multiplt.dem) ^ diff --git a/docs/term-ja.diff b/docs/term-ja.diff index be5493bc8..77f2830f8 100644 --- a/docs/term-ja.diff +++ b/docs/term-ja.diff @@ -3651,8 +3651,8 @@ diff -ru term/lua.trm.ORG term/lua.trm #ifdef HAVE_LUA +#ifndef JAPANESE_DOC #include "gnuplot-tikz.help" -+ -+ ++#else ++#include "lua/gnuplot-tikz-ja.help" #endif +#endif "" diff --git a/docs/titlepag.tex b/docs/titlepag.tex index 702d7f5de..14d14a096 100644 --- a/docs/titlepag.tex +++ b/docs/titlepag.tex @@ -125,6 +125,7 @@ % Words that may get hyphenated oddly if TeX is allowed to do so % \hyphenation{gnuplot windrose} +\uchyph=0 \begin{document} diff --git a/src/axis.c b/src/axis.c index 4fa9514df..3c7a605e4 100644 --- a/src/axis.c +++ b/src/axis.c @@ -2450,13 +2450,23 @@ parse_range(AXIS_INDEX axis) } /* Called if an in-line range is encountered while inside a zoom command */ -void +TBOOLEAN parse_skip_range() { - while (!equals(c_token++,"]")) + int start_token = c_token; + int ncolons = 0; + + while (!equals(c_token++,"]")) { + if (equals(c_token,":")) + ncolons++; if (END_OF_COMMAND) break; - return; + } + if (ncolons >= 2) { + c_token = start_token; + return FALSE; + } + return TRUE; } /* diff --git a/src/axis.h b/src/axis.h index ef71d86ca..758c70c30 100644 --- a/src/axis.h +++ b/src/axis.h @@ -477,7 +477,7 @@ TBOOLEAN bad_axis_range(struct axis *axis); void save_writeback_all_axes(void); int parse_range(AXIS_INDEX axis); -void parse_skip_range(void); +TBOOLEAN parse_skip_range(void); void check_axis_reversed(AXIS_INDEX axis); double parse_one_range_limit( double default_value ); diff --git a/src/boundary.c b/src/boundary.c index 404fe6139..ff7106436 100644 --- a/src/boundary.c +++ b/src/boundary.c @@ -837,6 +837,8 @@ boundary(struct curve_points *plots, int count) int_warn(NO_CARET, "Terminal canvas area too small to hold plot." "\n\t Check plot boundary and font sizes."); + /* mark the entire region as available for mousing */ + update_active_region(); } /*}}} */ diff --git a/src/command.c b/src/command.c index adae72e69..fe498c7e7 100644 --- a/src/command.c +++ b/src/command.c @@ -70,6 +70,7 @@ #include "gplocale.h" #include "loadpath.h" #include "misc.h" +#include "multiplot.h" #include "parse.h" #include "plot.h" #include "plot2d.h" @@ -169,6 +170,9 @@ struct udft_entry *dummy_func; char *replot_line = NULL; int plot_token = 0; /* start of 'plot' command */ +/* support for multiplot playback */ +TBOOLEAN last_plot_was_multiplot = FALSE; + /* flag to disable `replot` when some data are sent through stdin; * used by mouse/hotkey capable terminals */ @@ -381,6 +385,8 @@ os2_ipc_waitforinput(int mode) int com_line() { + int return_value = 0; + if (multiplot) { /* calls int_error() if it is not happy */ term_check_multiplot_okay(interactive); @@ -420,11 +426,13 @@ com_line() * (DFK 11/89) */ screen_ok = interactive; + return_value = do_line(); - if (do_line()) - return (1); - else - return (0); + /* If this line is part of a multiplot, save it for later replay */ + if (multiplot && !multiplot_playback) + append_multiplot_line(gp_input_line); + + return return_value; } @@ -600,6 +608,12 @@ do_string_replot(const char *s) { do_string(s); + /* EXPERIMENTAL */ + if (last_plot_was_multiplot && !multiplot && !replot_disabled) { + replay_multiplot(); + return; + } + if (volatile_data && (E_REFRESH_NOT_OK != refresh_ok)) { if (display_ipc_commands()) fprintf(stderr, "refresh\n"); @@ -1895,6 +1909,9 @@ pause_command() c_token++; + /* Ignore pause commands in certain contexts to avoid bad behavior */ + filter_multiplot_playback(); + #ifdef USE_MOUSE paused_for_mouse = 0; if (equals(c_token, "mouse")) { @@ -2480,7 +2497,13 @@ replot_command() SET_CURSOR_WAIT; if (term->flags & TERM_INIT_ON_REPLOT) term->init(); - replotrequest(); + + /* EXPERIMENTAL */ + if (last_plot_was_multiplot && !multiplot) + replay_multiplot(); + else + replotrequest(); + SET_CURSOR_ARROW; } @@ -2489,12 +2512,16 @@ replot_command() void reread_command() { +#ifdef BACKWARD_COMPATIBILITY FILE *fp = lf_top(); if (evaluate_inside_functionblock) int_error(NO_CARET, "reread command not possible in a function block"); if (fp != (FILE *) NULL) rewind(fp); c_token++; +#else + int_error(c_token, "deprecated command"); +#endif } #ifdef USE_FUNCTIONBLOCKS @@ -3816,10 +3843,13 @@ expand_1level_macros() for (c=temp_string; len && c && *c; c++, len--) { switch (*c) { case '@': /* The only tricky bit */ - if (!in_squote && !in_dquote && !in_comment && isalpha((unsigned char)c[1])) { + if (!in_squote && !in_dquote && !in_comment + && (isalpha((unsigned char)c[1]) || ALLOWED_8BITVAR(c[1]))) { /* Isolate the udv key as a null-terminated substring */ m = ++c; - while (isalnum((unsigned char )*c) || (*c=='_')) c++; + while (isalnum((unsigned char )*c) || (*c=='_') + || ALLOWED_8BITVAR(*c)) + c++; temp_char = *c; *c = '\0'; /* Look up the key and restore the original following char */ udv = get_udv_by_name(m); diff --git a/src/command.h b/src/command.h index 71f7c18ae..7e1d32b77 100644 --- a/src/command.h +++ b/src/command.h @@ -57,6 +57,7 @@ extern int plot_token; #define END_OF_COMMAND (c_token >= num_tokens || equals(c_token,";")) extern char *replot_line; +extern TBOOLEAN last_plot_was_multiplot; /* flag to disable `replot` when some data are sent through stdin; * used by mouse/hotkey capable terminals diff --git a/src/datablock.c b/src/datablock.c index 1a74315f0..3442516bf 100644 --- a/src/datablock.c +++ b/src/datablock.c @@ -65,6 +65,7 @@ #include "datafile.h" #include "eval.h" #include "misc.h" +#include "multiplot.h" #include "util.h" #ifdef USE_FUNCTIONBLOCKS @@ -137,6 +138,9 @@ new_block( enum DATA_TYPES type ) if (!equals(num_tokens-2, "<<") || !isletter(num_tokens-1)) int_error(c_token, "block definition line must end with << EODmarker"); + /* Cannot define a block inside another block */ + filter_multiplot_playback(); + /* Create or recycle a datablock with the requested name */ name = parse_datablock_name(); datablock = add_udv_by_name(name); diff --git a/src/datafile.c b/src/datafile.c index 85c015a88..078da148f 100644 --- a/src/datafile.c +++ b/src/datafile.c @@ -2391,8 +2391,7 @@ df_readascii(double v[], int max) v[output] = df_column[column - 1].datum; /* Do not return immediately on DF_MISSING or DF_UNDEFINED */ - } else if ((column <= df_no_cols) - && (use_spec[output].expected_type == CT_MUST_HAVE)) { + } else if (use_spec[output].expected_type == CT_MUST_HAVE) { /* This catches cases where the plot style cannot tolerate * silently missed points (e.g. stacked histograms) */ diff --git a/src/gadgets.c b/src/gadgets.c index fe6d6dab7..c8603bc18 100644 --- a/src/gadgets.c +++ b/src/gadgets.c @@ -62,6 +62,9 @@ BoundingBox plot_bounds; /* The bounding box for 3D plots prior to applying view transformations */ BoundingBox page_bounds; +/* The region within a multiplot belonging to the current plot */ +BoundingBox active_bounds; + /* The bounding box for the entire drawable area of current terminal */ BoundingBox canvas; @@ -1258,3 +1261,19 @@ construct_2D_mask_set( struct coordinate *points, int p_count ) polygon++; } } + +/* Calculate the region on the canvas used by the current plot. + * This can be saved to guide subsequent mousing. + */ +void +update_active_region(void) +{ + active_bounds.xleft = term->xmax * xoffset; + active_bounds.xright = term->xmax * (xoffset + xsize); + active_bounds.ybot = term->ymax * yoffset; + active_bounds.ytop = term->ymax * (yoffset + ysize); + if (debug) + fprintf(stderr, "active region: %d %d %d %d\n", + active_bounds.xleft, active_bounds.xright, + active_bounds.ybot, active_bounds.ytop); +} diff --git a/src/gadgets.h b/src/gadgets.h index 4635d087c..1f2fe9c86 100644 --- a/src/gadgets.h +++ b/src/gadgets.h @@ -453,6 +453,7 @@ typedef struct t_image { extern BoundingBox plot_bounds; /* Plot Boundary */ extern BoundingBox page_bounds; /* 3D boundary prior to view transformation */ +extern BoundingBox active_bounds; /* active mousing area within multiplot */ extern BoundingBox canvas; /* Writable area on terminal */ extern BoundingBox *clip_area; /* Current clipping box */ @@ -588,6 +589,9 @@ extern int current_x11_windowid; /* initialization (called once on program entry */ void init_gadgets(void); +/* called by each 2D or 3D plot */ +void update_active_region(void); + /* moved here from util3d: */ int draw_clip_line(int, int, int, int); void draw_clip_polygon(int , gpiPoint *); diff --git a/src/graph3d.c b/src/graph3d.c index 92909fa05..27493bb8b 100644 --- a/src/graph3d.c +++ b/src/graph3d.c @@ -589,6 +589,9 @@ boundary3d(struct surface_points *plots, int count) clip_area = NULL; else clip_area = &canvas; + + /* mark the entire region as available for mousing */ + update_active_region(); } static TBOOLEAN diff --git a/src/graphics.c b/src/graphics.c index c4d7eb3bf..60d68edfb 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -52,6 +52,7 @@ #include "watch.h" #include "util.h" #include "util3d.h" +#include "datafile.h" /* for blank_data_line */ /* Externally visible/modifiable status variables */ @@ -144,6 +145,7 @@ static void plot_sectors(struct curve_points *plot); static void plot_ellipses(struct curve_points *plot); static void do_rectangle(int dimensions, t_object *this_object, fill_style_type *fillstyle); static void do_polygon(int dimensions, t_object *this_object, int style, int facing ); +static void close_polygon(struct curve_points *plot, int first, int last); static double rgbscale(double rawvalue); @@ -1261,6 +1263,8 @@ plot_impulses(struct curve_points *plot, int yaxis_x, int xaxis_y) /* plot_lines: * Plot the curves in LINES style + * This code is also called by plot styles + * LINESPOINTS YERRORLINES XERRORLINES XYERRORLINES FILLEDCURVES POLYGONS */ static void plot_lines(struct curve_points *plot) @@ -1274,6 +1278,7 @@ plot_lines(struct curve_points *plot) double yprev = 0.0; /* user coordinates */ double zprev = 0.0; /* user coordinates */ double xnow, ynow, znow; /* user coordinates */ + int polygon_start = 0; /* first point of current polygon */ TBOOLEAN drawn; /* Clear status of watch events */ @@ -1303,6 +1308,9 @@ plot_lines(struct curve_points *plot) if (plot->plot_style != FILLEDCURVES && plot->plot_style != POLYGONS) check_for_variable_color(plot, &plot->varcolor[i]); + if (plot->plot_style == POLYGONS && i == polygon_start) + check_for_variable_color(plot, &plot->varcolor[i]); + /* Only map and plot the point if it is well-behaved (not UNDEFINED). * Note that map_x or map_y can hit NaN during eval_link_function(), * in which case the coordinate value is garbage so we set UNDEFINED. @@ -1369,6 +1377,13 @@ plot_lines(struct curve_points *plot) break; case UNDEFINED: + /* Check for blank line separating polygons */ + if ((plot->plot_style == POLYGONS) + && (!memcmp(&plot->points[i].x, &blank_data_line.x, 7*sizeof(coordval)))) { + close_polygon(plot, polygon_start, i-1); + polygon_start = i+1; + } + break; default: /* just a safety */ break; } @@ -1378,8 +1393,37 @@ plot_lines(struct curve_points *plot) yprev = ynow; zprev = znow; } + + /* The last polygon may need to be closed */ + if (plot->plot_style == POLYGONS) + close_polygon(plot, polygon_start, plot->p_count-1); } +/* A data file can hold multiple polygons separated by single blank lines. + * In order to guarantee that the polygon border is closed we check at each blank + * line whether the first and last points of the previous polygon were the same. + * If not, we need to draw a final connecting line segment. + */ +static void +close_polygon(struct curve_points *plot, int first, int last) +{ + coordval x0 = plot->points[first].x; + coordval y0 = plot->points[first].y; + coordval xN = plot->points[last].x; + coordval yN = plot->points[last].y; + + /* Try to assure a closed path for polygon boundaries */ + if (plot->points[first].type == UNDEFINED || plot->points[last].type == UNDEFINED) + return; + if (x0 == xN && y0 == yN) + return; + if (polar) + draw_polar_clip_line(xN, yN, x0, y0); + else + draw_clip_line( map_x(xN), map_y(yN), map_x(x0), map_y(y0)); +} + + /* plot_filledcurves: * {closed | {above | below} {x1 | x2 | y1 | y2 | r}[=] | xy=,} */ diff --git a/src/internal.c b/src/internal.c index fdc122177..71708a129 100644 --- a/src/internal.c +++ b/src/internal.c @@ -302,7 +302,6 @@ f_sum(union argument *arg) struct value result; /* accummulated sum */ struct value f_i; struct value save_i; /* previous value of iteration variable */ - int i; intgr_t llsum; /* integer sum */ TBOOLEAN integer_terms = TRUE; @@ -325,7 +324,7 @@ f_sum(union argument *arg) if (!udf) int_error(NO_CARET, "internal error: lost expression to be evaluated during summation"); - for (i=beg.v.int_val; i<=end.v.int_val; ++i) { + for (intgr_t i = beg.v.int_val; i <= end.v.int_val; ++i) { double x, y; /* calculate f_i = f() with user defined variable i */ diff --git a/src/misc.c b/src/misc.c index c7d6395b3..4d7858d77 100644 --- a/src/misc.c +++ b/src/misc.c @@ -38,6 +38,7 @@ #include "encoding.h" #include "graphics.h" #include "loadpath.h" +#include "multiplot.h" #include "plot.h" #include "tables.h" #include "util.h" @@ -392,6 +393,10 @@ load_file(FILE *fp, char *name, int calltype) if (do_line()) stop = TRUE; } + + /* If this line is part of a multiplot, save it for later replay */ + if (multiplot && !multiplot_playback & !evaluate_inside_functionblock) + append_multiplot_line(gp_input_line); } /* pop state */ diff --git a/src/mouse.c b/src/mouse.c index fbefcf032..5edd6d3d4 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -61,6 +61,7 @@ #include "term_api.h" #include "util3d.h" #include "hidden3d.h" +#include "multiplot.h" /* EXPERIMENTAL */ #include "plot.h" /* for interactive */ #ifdef USE_WATCHPOINTS @@ -286,6 +287,8 @@ static void event_motion(struct gp_event_t * ge); static void event_modifier(struct gp_event_t * ge); static void do_save_3dplot(struct surface_points *, int, REPLOT_TYPE); static void load_mouse_variables(double, double, TBOOLEAN, int); +static TBOOLEAN mouse_is_outside_plot(void); +static TBOOLEAN mouse_outside_active_region(void); static void do_zoom_in_around_mouse(void); static void do_zoom_out_around_mouse(void); @@ -955,6 +958,12 @@ incr_mousemode(const int amount) void UpdateStatusline() { + if (last_plot_was_multiplot && mouse_outside_active_region()) { + if (term->put_tmptext) + (term->put_tmptext) (0, "inactive region of multiplot"); + return; + } + UpdateStatuslineWithMouseSetting(&mouse_setting); } @@ -1660,7 +1669,8 @@ ChangeAzimuth(int x) } -int is_mouse_outside_plot(void) +static TBOOLEAN +mouse_is_outside_plot(void) { #define CHECK_AXIS_OUTSIDE(real, axis) \ ( axis_array[axis].min < VERYLARGE && \ @@ -1679,6 +1689,16 @@ int is_mouse_outside_plot(void) #undef CHECK_AXIS_OUTSIDE } +static TBOOLEAN +mouse_outside_active_region(void) +{ + if (mouse_x < active_bounds.xleft || mouse_x > active_bounds.xright + || mouse_y < active_bounds.ybot || mouse_y > active_bounds.ytop) + return TRUE; + + return FALSE; +} + /* Return a new upper or lower axis limit that is a linear * combination of the current limits. */ @@ -1821,7 +1841,7 @@ static void zoom_in_X(int zoom_key) { retain_offsets = TRUE; - if (is_mouse_outside_plot()) { + if (mouse_is_outside_plot()) { /* zoom in (X axis only) */ double w1 = (zoom_key=='+') ? 23./25. : 23./21.; double w2 = (zoom_key=='+') ? 2./25. : -2./21.; @@ -1865,7 +1885,7 @@ zoom_around_mouse(int zoom_key) double orig_x = real_x; TBOOLEAN adjust = FALSE; - if (is_mouse_outside_plot()) { + if (mouse_is_outside_plot()) { /* zoom in (factor of approximately 2^(.25), so four steps gives 2x larger) */ double w1 = (zoom_key=='+') ? 23./25. : 23./21.; double w2 = (zoom_key=='+') ? 2./25. : -2./21.; @@ -2076,10 +2096,12 @@ event_buttonpress(struct gp_event_t *ge) if (!setting_zoom_region) { if (3 == b && (!replot_disabled || (E_REFRESH_NOT_OK != refresh_ok)) /* Use refresh if available */ - && !(paused_for_mouse & PAUSE_BUTTON3)) { + && !(paused_for_mouse & PAUSE_BUTTON3) + && !(last_plot_was_multiplot && mouse_outside_active_region())) { /* start zoom; but ignore it when * - replot is disabled, e.g. with inline data, or * - during 'pause mouse' + * - outside the active region of a multiplot * allow zooming during 'pause mouse key' */ setting_zoom_x = mouse_x; setting_zoom_y = mouse_y; @@ -2239,11 +2261,13 @@ event_buttonrelease(struct gp_event_t *ge) } if (b == 2) { + if (last_plot_was_multiplot && mouse_outside_active_region()) + ; /* nothing to do */ + else + /* draw temporary annotation or label. For 3d plots this is * only done if the user didn't drag (scale) the plot */ - if (!is_3d_plot || !motion) { - GetAnnotateString(s0, real_x, real_y, mouse_mode, mouse_alt_string); if (mouse_setting.label) { if (modifier_mask & Mod_Ctrl) { @@ -2350,10 +2374,12 @@ event_motion(struct gp_event_t *ge) start_y = mouse_y; redraw = TRUE; } else if (button & (1 << 3)) { - /* dragging with button 3 -> change azimuth */ - ChangeAzimuth( (mouse_x - start_x) * 90.0 / term->xmax ); - start_x = mouse_x; - redraw = TRUE; + if (!(last_plot_was_multiplot && mouse_outside_active_region())) { + /* dragging with button 3 -> change azimuth */ + ChangeAzimuth( (mouse_x - start_x) * 90.0 / term->xmax ); + start_x = mouse_x; + redraw = TRUE; + } } if (!ALMOST2D) { @@ -2632,6 +2658,12 @@ exec_event(char type, int mx, int my, int par1, int par2, int winid) static void do_save_3dplot(struct surface_points *plots, int pcount, REPLOT_TYPE quick) { + + /* EXPERIMENTAL 3D mousing from inside a multiplot */ + if (last_plot_was_multiplot && refresh_ok == E_REFRESH_OK_3D) { + replay_multiplot(); + } else + if (!plots || (E_REFRESH_NOT_OK == refresh_ok)) { /* !plots might happen after the `reset' command for example * (reported by Franz Bakan). diff --git a/src/multiplot.c b/src/multiplot.c index 28427d0d9..e5b85c732 100644 --- a/src/multiplot.c +++ b/src/multiplot.c @@ -41,16 +41,26 @@ #include "multiplot.h" #include "command.h" +#include "datablock.h" #include "gadgets.h" #include "graphics.h" +#include "misc.h" #include "parse.h" #include "setshow.h" #include "util.h" +/* Support for multiplot playback */ +TBOOLEAN multiplot_playback = FALSE; /* TRUE while inside "remultiplot" playback */ +static t_value multiplot_udv = { + .type = DATABLOCK, + .v.data_array = NULL +}; +/* Local prototypes */ static void mp_layout_size_and_offset(void); static void mp_layout_margins_and_spacing(void); static void mp_layout_set_margin_or_spacing(t_position *); +static void init_multiplot_datablock(void); enum set_multiplot_id { S_MULTIPLOT_LAYOUT, @@ -199,7 +209,6 @@ multiplot_start() c_token++; /* Only a few options are possible if we are already in multiplot mode */ - /* So far we have "next". Maybe also "previous", "clear"? */ if (multiplot) { if (equals(c_token, "next")) { c_token++; @@ -408,7 +417,7 @@ multiplot_start() } /* If we reach here, then the command has been successfully parsed. - * Aug 2013: call term_start_plot() before setting multiplot so that + * Call term_start_plot() before setting multiplot so that * the wxt and qt terminals will reset the plot count to 0 before * ignoring subsequent TERM_LAYER_RESET requests. */ @@ -416,6 +425,7 @@ multiplot_start() multiplot = TRUE; multiplot_count = 0; fill_gpval_integer("GPVAL_MULTIPLOT", 1); + init_multiplot_datablock(); /* Place overall title before doing anything else */ if (mp_layout.title.text) { @@ -484,6 +494,20 @@ multiplot_end() free(mp_layout.title.text); mp_layout.title.text = NULL; } + + if (!multiplot_playback) { + /* Create or recycle a user-visible datablock for replay */ + struct udvt_entry *datablock = add_udv_by_name("$GPVAL_LAST_MULTIPLOT"); + free_value(&datablock->udv_value); + + /* Save the current "unset multiplot" command before moving the command list */ + append_to_datablock(&multiplot_udv, strdup(gp_input_line)); + + /* Move the command list to $GPVAL_LAST_MULTIPLOT */ + datablock->udv_value = multiplot_udv; + multiplot_udv.v.data_array = NULL; + } + last_plot_was_multiplot = TRUE; } /* Helper function for multiplot auto layout to issue size and offset cmds */ @@ -619,3 +643,49 @@ mp_layout_set_margin_or_spacing(t_position *margin) } } +/* Begin accummulating lines that can later be replayed by replay_multiplot(). + * The first line to be stored is a comment. + * Subsequent lines will be appended as they are read in. + */ +static void +init_multiplot_datablock() +{ + gpfree_datablock(&multiplot_udv); + multiplot_udv.type = DATABLOCK; + append_to_datablock(&multiplot_udv, strdup("# saved multiplot")); +} + +/* Append one line to the multiplot history. + * Called from two places: + * command.c:com_line() catches direct input from stdin + * misc.c:load_file() catches lines from load/call + * When the multiplot is exited via multiplot_end(), all lines will be + * copied to the user-visible datblock $GPVAL_LAST_MULTIPLOT. + */ +void +append_multiplot_line(char *line) +{ + append_to_datablock(&multiplot_udv, strdup(line)); +} + +/* This is the implementation of "remultiplot". + * The load operation is protected by a flag to prevent infinite recursion. + */ +void +replay_multiplot() +{ + c_token++; + multiplot_playback = TRUE; + load_file(NULL, strdup("$GPVAL_LAST_MULTIPLOT"), 6); + multiplot_playback = FALSE; +} + +/* reset needed if int_error() is invoked during multiplot playback */ +void +multiplot_reset_after_error() +{ + if (!multiplot_playback) + return; + multiplot_end(); + multiplot_playback = FALSE; +} diff --git a/src/multiplot.h b/src/multiplot.h index 3a298a0c9..5af6a4aa4 100644 --- a/src/multiplot.h +++ b/src/multiplot.h @@ -2,4 +2,18 @@ void multiplot_start(void); void multiplot_end(void); void multiplot_next(void); void multiplot_reset(void); +void append_multiplot_line(char *line); +void replay_multiplot(void); +void multiplot_reset_after_error(void); int multiplot_current_panel(void); + +extern TBOOLEAN multiplot_playback; /* TRUE while inside "remultiplot" playback */ + +/* Some commands (pause, reset, ...) would be problematic if executed during + * multiplot playback. Invoke this from the command that should be filtered. + */ +#define filter_multiplot_playback() \ + if (multiplot_playback) { \ + while (!END_OF_COMMAND) c_token++; \ + return; \ + } diff --git a/src/plot2d.c b/src/plot2d.c index 9cbc498ce..5532244b4 100644 --- a/src/plot2d.c +++ b/src/plot2d.c @@ -264,8 +264,10 @@ plotrequest() /* If we are called from a mouse zoom operation we should ignore */ /* any range limits because otherwise the zoom won't zoom. */ if (inside_zoom) { - while (equals(c_token,"[")) - parse_skip_range(); + if (equals(c_token,"[")) { + while (parse_skip_range() == TRUE) + ; + } } /* Axis range limits for the entire plot are optional but must be given @@ -3063,6 +3065,7 @@ eval_plots() case DOTS: case VECTOR: case FILLEDCURVES: + case POLYGONS: case LABELPOINTS: case CIRCLES: case SECTORS: @@ -4010,6 +4013,7 @@ eval_plots() m_capture(&replot_line, plot_token, c_token - 1); plot_token = -1; fill_gpval_string("GPVAL_LAST_PLOT", replot_line); + last_plot_was_multiplot = FALSE; } if (table_mode) { diff --git a/src/plot3d.c b/src/plot3d.c index fdc11df42..65c0c91be 100644 --- a/src/plot3d.c +++ b/src/plot3d.c @@ -2917,6 +2917,7 @@ eval_3dplots() m_capture(&replot_line, plot_token, c_token - 1); plot_token = -1; fill_gpval_string("GPVAL_LAST_PLOT", replot_line); + last_plot_was_multiplot = FALSE; } /* record that all went well */ plot3d_num=plot_num; diff --git a/src/set.c b/src/set.c index 3308565be..fd5c55bc8 100644 --- a/src/set.c +++ b/src/set.c @@ -1581,6 +1581,7 @@ set_dgrid3d() c_token++; +#ifdef BACKWARD_COMPATIBILITY /* Accommodate ancient deprecated syntax "set dgrid3d ,," */ if (equals(c_token,",") && equals(c_token+1,",")) { c_token += 2; @@ -1589,17 +1590,20 @@ set_dgrid3d() dgrid3d = TRUE; return; } +#endif if (might_be_numeric(c_token)) { gridx = gridy = int_expression(); if (equals(c_token, ",")) { c_token++; gridy = int_expression(); +#ifdef BACKWARD_COMPATIBILITY /* Deprecated syntax using 3 numeric parameters and no keywords */ if (equals(c_token, ",")) { c_token++; normval = int_expression(); } +#endif } } @@ -3252,9 +3256,13 @@ set_mouse() } mouse_setting.xmzoom_factor = x; mouse_setting.ymzoom_factor = y; + } else if (almost_equals(c_token, "multi$plot") + || almost_equals(c_token, "nomulti$plot")) { + /* used in 6.0, not needed in 6.1 */ + c_token++; } else { if (!END_OF_COMMAND) - int_error(c_token, "wrong option"); + int_warn(c_token++, "unrecognized option"); break; } } diff --git a/src/show.c b/src/show.c index 510b484ed..7c257ee1c 100644 --- a/src/show.c +++ b/src/show.c @@ -3322,6 +3322,8 @@ show_plot() { SHOW_ALL_NL; fprintf(stderr, "\tlast plot command was: %s\n", replot_line); + if (last_plot_was_multiplot) + fprintf(stderr, "\tlast plot was a multiplot (see $GPVAL_LAST_MULTIPLOT)\n"); } diff --git a/src/tables.c b/src/tables.c index 3a2dce561..0bb05feb2 100644 --- a/src/tables.c +++ b/src/tables.c @@ -42,6 +42,7 @@ #include "graph3d.h" /* for DGRID3D_* options */ #include "getcolor.h" #include "voxelgrid.h" +#include "multiplot.h" /* for replay_multiplot() */ /* gnuplot commands */ @@ -79,8 +80,9 @@ const struct gen_ftable command_ftbl[] = { "pwd", pwd_command }, { "q$uit", exit_command }, { "ref$resh", refresh_command }, + { "remulti$plot", replay_multiplot }, { "rep$lot", replot_command }, - { "re$read", reread_command }, + { "reread", reread_command }, { "res$et", reset_command }, { "return", return_command }, { "sa$ve", save_command }, diff --git a/src/unset.c b/src/unset.c index 93e1141d6..19ea879e8 100644 --- a/src/unset.c +++ b/src/unset.c @@ -2038,9 +2038,10 @@ reset_command() c_token++; - /* This would be asking for trouble */ + /* Ignore or refuse reset commands in certain contexts to avoid bad behavior */ if (evaluate_inside_functionblock) int_error(NO_CARET, "cannot 'reset' during function block evaluation"); + filter_multiplot_playback(); /* This is the expression evaluation stack */ reset_stack(); diff --git a/src/util.c b/src/util.c index 59c6e02ad..2fa78ee3d 100644 --- a/src/util.c +++ b/src/util.c @@ -39,6 +39,7 @@ #include "gplocale.h" #include "internal.h" /* for eval_reset_after_error */ #include "misc.h" +#include "multiplot.h" /* for multiplot_reset_after_error */ #include "plot.h" #include "pm3d.h" /* for pm3d_reset_after_error */ #include "setshow.h" /* for conv_text() */ @@ -1181,6 +1182,7 @@ common_error_exit() eval_reset_after_error(); parse_reset_after_error(); pm3d_reset_after_error(); + multiplot_reset_after_error(); set_iterator = cleanup_iteration(set_iterator); plot_iterator = cleanup_iteration(plot_iterator); scanning_range_in_progress = FALSE; diff --git a/src/wxterminal/wxt_gui.cpp b/src/wxterminal/wxt_gui.cpp index 71c4ae373..75a5520b6 100644 --- a/src/wxterminal/wxt_gui.cpp +++ b/src/wxterminal/wxt_gui.cpp @@ -893,7 +893,6 @@ void wxtFrame::OnClose( wxCloseEvent& event ) /* when the window is resized, * resize the panel to fit in the frame. * If the tool widget setting for "redraw on resize" is set, replot in new size. - * FIXME : Loses all but most recent component of a multiplot. */ void wxtFrame::OnSize( wxSizeEvent& event ) { @@ -2766,12 +2765,11 @@ void wxt_image(unsigned int M, unsigned int N, coordval * image, gpiPoint * corn */ void wxt_layer(t_termlayer layer) { - /* There are two classes of meta-information. The first class */ - /* is tied to the current state of the user interface or the */ - /* main gnuplot thread. Any action on these must be done here, */ - /* immediately. The second class relates to the sequence of */ - /* operations in the plot itself. These are buffered for later */ - /* execution in sequential order. */ + /* There are two classes of meta-information. + * The first class is tied to the current state of the user interface + * or the main gnuplot thread. Any action on these must be done here, + * immediately. + */ if (layer == TERM_LAYER_BEFORE_ZOOM) { return; } @@ -2780,6 +2778,10 @@ void wxt_layer(t_termlayer layer) return; } + /* The second class of meta-information relates to the sequence of + * operations in the plot itself. These are buffered for later + * execution in sequential order. + */ gp_command temp_command; temp_command.command = command_layer; temp_command.integer_value = layer; diff --git a/term/cairo.trm b/term/cairo.trm index 04cbee37e..596fa5a8d 100644 --- a/term/cairo.trm +++ b/term/cairo.trm @@ -799,6 +799,15 @@ void cairotrm_init() plot.polygons_saturate = FALSE; /* Empirical correction to make pdf output look more like wxt and png */ plot.dashlength /= 2; + + /* Attempt to restrict pdf feature usage to version 1.5 (2003 Acrobat 6). + * Otherwise you get whatever the cairo libraries provide as a default, + * probably version 1.7 (ISO 32000-1:2008). + */ + #if (CAIRO_VERSION_MAJOR < 2) && (CAIRO_VERSION_MINOR >= 10) + cairo_pdf_surface_restrict_to_version(surface, CAIRO_PDF_VERSION_1_5); + #endif + } else if (!strcmp(term->name,"pngcairo") || !strcmp(term->name, "kittycairo")) { surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, plot.device_xmax /*double width_in_points*/, @@ -844,6 +853,9 @@ void cairotrm_init() (cairo_write_func_t)cairostream_write, cairostream_error, plot.device_xmax /*double width_in_points*/, plot.device_ymax /*double height_in_points*/); + #if (CAIRO_VERSION_MAJOR < 2) && (CAIRO_VERSION_MINOR >= 10) + cairo_pdf_surface_restrict_to_version(surface, CAIRO_PDF_VERSION_1_5); + #endif break; case CAIROLATEX_PNG: EPSLATEX_reopen_output("png"); @@ -1562,7 +1574,7 @@ TERM_TABLE_START (kittycairo_driver) cairotrm_text_angle, cairotrm_justify_text, cairotrm_point, do_arrow, cairotrm_set_font, cairotrm_pointsize, - TERM_BINARY|TERM_CAN_DASH|TERM_ALPHA_CHANNEL|TERM_LINEWIDTH|TERM_FONTSCALE|TERM_POINTSCALE, + TERM_CAN_MULTIPLOT|TERM_BINARY|TERM_CAN_DASH|TERM_ALPHA_CHANNEL|TERM_LINEWIDTH|TERM_FONTSCALE|TERM_POINTSCALE, 0 /* suspend */, 0 /* resume */, cairotrm_fillbox, cairotrm_linewidth, #ifdef USE_MOUSE term_waitforinput, 0, 0, 0, 0, diff --git a/term/webp.trm b/term/webp.trm index b620a94ef..1e49fff55 100644 --- a/term/webp.trm +++ b/term/webp.trm @@ -60,7 +60,7 @@ /* * December 2020 * Initial implementation based on WebPAnimEncoder API in mux.h - * requires libwebp and libwepmux. The webp format supports either lossy + * requires libwebp and libwebpmux. The webp format supports either lossy * encoding (YUV + alpha color space) or lossless encoding (ARGB color space). * Individual frames are created by handing through most driver calls to the * pngcairo terminal. At the end of each frame, the call to WEBP_text converts @@ -76,8 +76,7 @@ * for animation properties delay loop * and quality * - the WebPAnimEncoder API seems to lack an mechanism for setting - * the dispose_method to WEBP_MUX_DISPOSE_BACKGROUND, which would - * be needed for proper handling of a transparent background. + * dispose_method to something that properly handles a transparent background. * This causes successive frames to generate ghost images. * The utility program webpmux can be used to fix this by post-processing * the animation file. @@ -267,6 +266,10 @@ void WEBP_text() /* Initialize the animation */ WebPAnimEncoderOptionsInit(&wp_enc_options); wp_enc_options.anim_params.loop_count = webp_params.loop; +// wp_enc_options.anim_params.bgcolor = cairo_params->rgb_bkgnd; +// if (cairo_params->transparent) +// wp_enc_options.anim_params.bgcolor &= 0x00ffffff; +// wp_enc_options.verbose = 1; wp_enc = WebPAnimEncoderNew( picture.width, picture.height, &wp_enc_options); if (!wp_enc) { @@ -285,16 +288,6 @@ void WEBP_text() /* Increase frame count */ webp_params.frame++; -#if (0) - /* This code is equivalent to that in anim_encode.c but none of this is - * exported through the WebPAnimEncoder API so I can't use it. - * How is one supposed to set the dispose method??? - */ - EncodedFrame *prev = GetFrame(wp_enc, webp_params.frame); - prev->sub_frame_.dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; - prev->key_frame_.dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; -#endif - } } diff --git a/term/x11.trm b/term/x11.trm index 630e01572..985c8e67f 100644 --- a/term/x11.trm +++ b/term/x11.trm @@ -1450,17 +1450,6 @@ X11_graphics() } #if defined(USE_MOUSE) - /* EAM Jan 2013 - multiplot is incompatible with replot_on_resize. */ - /* FIXME: This disables replot_on_resize until the next 'set term'. */ - /* A cleaner solution would be to have gnuplot_x11 itself track */ - /* whether the current window contains a multiplot, and not send */ - /* replot requests if it does. */ - if (multiplot) { - fprintf(X11_ipc, "X %d %d %d %d %d\n", - do_raise, x11_persist, dashedlines, ctrlq, no); - fflush(X11_ipc); - } - /* EAM June 2003 - Flush the set font command through the pipe */ /* to gnuplot_x11, then wait for it to return the resulting */ /* font size information (v_char and h_char). The feedback is */