This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository gmt.
commit 1d7c24c24e7397759d44f2e0c41d8260c2ebeafd Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Thu Mar 23 22:46:29 2017 +0100 Imported Upstream version 5.3.3+dfsg --- cmake/ConfigDefault.cmake | 6 +- doc/rst/source/GMT_Docs.rst | 2 +- doc/rst/source/grdimage.rst | 4 +- doc/rst/source/pslegend.rst | 1 + doc/rst/source/pswiggle.rst | 2 +- doc/rst/source/xyz2grd.rst | 13 +++- doc/scripts/GMT_legend.ps | 79 +++++++++++----------- src/gmt.c | 8 ++- src/gmt_agc_io.c | 14 ++-- src/gmt_api.c | 4 +- src/gmt_customio.c | 17 ++--- src/gmt_init.c | 4 +- src/gmt_internals.h | 4 +- src/gmt_io.c | 36 ++++++---- src/gmt_memory.c | 4 +- src/gmt_nc.c | 160 ++++++++++++++++++++++++-------------------- src/gmt_plot.c | 39 ++++++++--- src/gmt_plot.h | 3 +- src/gmt_prototypes.h | 6 +- src/gmt_support.c | 23 ++++--- src/gmt_vector.c | 15 ++--- src/gmtlogo.c | 6 +- src/grdimage.c | 6 +- src/grdmask.c | 4 +- src/grdview.c | 4 +- src/postscriptlight.c | 51 +++++++++++++- src/potential/talwani3d.c | 80 +++++++++++----------- src/psclip.c | 4 +- src/pscoast.c | 5 +- src/psimage.c | 6 +- src/pslegend.c | 15 +++-- src/psrose.c | 4 +- src/psscale.c | 4 +- src/pssolar.c | 3 +- src/psxy.c | 18 +++-- src/psxyz.c | 6 +- src/sphdistance.c | 4 +- src/spotter/backtracker.c | 12 +++- 38 files changed, 406 insertions(+), 270 deletions(-) diff --git a/cmake/ConfigDefault.cmake b/cmake/ConfigDefault.cmake index d438732..32b9c84 100644 --- a/cmake/ConfigDefault.cmake +++ b/cmake/ConfigDefault.cmake @@ -1,5 +1,5 @@ # -# $Id: ConfigDefault.cmake 17595 2017-02-24 00:53:29Z jluis $ +# $Id: ConfigDefault.cmake 17744 2017-03-22 18:50:05Z jluis $ # # Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe # See LICENSE.TXT file for copying and redistribution conditions. @@ -42,13 +42,13 @@ set (GMT_VERSION_YEAR "2017") # The GMT package version. set (GMT_PACKAGE_VERSION_MAJOR 5) set (GMT_PACKAGE_VERSION_MINOR 3) -set (GMT_PACKAGE_VERSION_PATCH 2) +set (GMT_PACKAGE_VERSION_PATCH 3) # The subversion revision of the GMT source code. # This is manually set when making GMT *public* releases. # However, when making internal releases or just an ordinary developer build, leave it # empty; if it is empty, the revision number is automatically populated for you on build. -set (GMT_SOURCE_CODE_CONTROL_VERSION_STRING "17593") +set (GMT_SOURCE_CODE_CONTROL_VERSION_STRING "17743") # The GMT package version. set (GMT_PACKAGE_VERSION "${GMT_PACKAGE_VERSION_MAJOR}.${GMT_PACKAGE_VERSION_MINOR}.${GMT_PACKAGE_VERSION_PATCH}") diff --git a/doc/rst/source/GMT_Docs.rst b/doc/rst/source/GMT_Docs.rst index 2fc0bfe..a14a7f2 100644 --- a/doc/rst/source/GMT_Docs.rst +++ b/doc/rst/source/GMT_Docs.rst @@ -5467,7 +5467,7 @@ that is stored in the HDF "format". We need to run the GDAL program **gdalinfo** on the file because we first must extract the necessary metadata from the file: - :: +.. code-block:: none gdalinfo A20030012003365.L3m_YR_NSST_9 Driver: HDF4/Hierarchical Data Format Release 4 diff --git a/doc/rst/source/grdimage.rst b/doc/rst/source/grdimage.rst index e66a769..8ac21b1 100644 --- a/doc/rst/source/grdimage.rst +++ b/doc/rst/source/grdimage.rst @@ -14,7 +14,9 @@ Synopsis .. include:: common_SYN_OPTs.rst_ **grdimage** *grd_z* \| *grd_r grd_g grd_b* -[ |-A|\ *out_img*\ [**=**\ *driver*] ] [ |-C|\ *cpt* ] +[ |-A|\ *out_img*\ [**=**\ *driver*] ] +[ |SYN_OPT-B| ] +[ |-C|\ *cpt* ] [ |-D|\ [**r**\ ] ] [ |-E|\ [\ **i**\ \|\ *dpi*] ] |-J|\ *parameters* [ |-G|\ [**f**\ \|\ **b**]\ *color* ] [ |-I|\ [*intensfile*\ \|\ *intensity*] ] diff --git a/doc/rst/source/pslegend.rst b/doc/rst/source/pslegend.rst index 13c1fd9..0da1fcb 100644 --- a/doc/rst/source/pslegend.rst +++ b/doc/rst/source/pslegend.rst @@ -15,6 +15,7 @@ Synopsis **pslegend** [ *specfile* ] |-D|\ *refpoint* ] +[ |SYN_OPT-B| ] [ |-C|\ *dx*/*dy* ] [ |-F|\ *box* ] [ |-J|\ *parameters* ] diff --git a/doc/rst/source/pswiggle.rst b/doc/rst/source/pswiggle.rst index d37e16a..0d34719 100644 --- a/doc/rst/source/pswiggle.rst +++ b/doc/rst/source/pswiggle.rst @@ -14,7 +14,7 @@ Synopsis .. include:: common_SYN_OPTs.rst_ **pswiggle** [ *table* ] |-J|\ *parameters* |SYN_OPT-Rz| |-Z|\ *scale*\ [*units] -[ |-A|\ [*azimuth*] ] +[ |-A|\ [\ *azimuth*\ ] ] [ |SYN_OPT-B| ] [ |-C|\ *center* ] [ |-G|\ [**+**\ \|\ **-**\ \|\ **=**]\ *fill* ] diff --git a/doc/rst/source/xyz2grd.rst b/doc/rst/source/xyz2grd.rst index 3e42c47..c593449 100644 --- a/doc/rst/source/xyz2grd.rst +++ b/doc/rst/source/xyz2grd.rst @@ -40,7 +40,9 @@ with data. Such unconstrained nodes are set to a value specified by the user [Default is NaN]. Nodes with more than one value will be set to the mean value. As an option (using **-Z**), a 1-column z-table may be read assuming all nodes are present (z-tables can be in organized in a number -of formats, see **-Z** below.) +of formats, see **-Z** below.) Note: **xyz2grd** does not grid the data, +it simply reformats existing data to a grid structure. For gridding, +see **surface**, **greenspline**, **nearneighbor**, or **triangulate**. Required Arguments ------------------ @@ -220,4 +222,11 @@ See Also :doc:`gmt`, :doc:`grd2xyz`, :doc:`grdedit`, -:doc:`grdconvert` +:doc:`grdconvert`, +:doc:`greenspline`, +:doc:`nearneighbor`, +:doc:`surface`, +:doc:`triangulate` + + + diff --git a/doc/scripts/GMT_legend.ps b/doc/scripts/GMT_legend.ps index 2c84467..920e56d 100644 --- a/doc/scripts/GMT_legend.ps +++ b/doc/scripts/GMT_legend.ps @@ -1,11 +1,11 @@ %!PS-Adobe-3.0 %%BoundingBox: 0 0 612 792 -%%HiResBoundingBox: 0 0 612 792 -%%Title: GMT v5.2.0_r14414 [64-bit] Document from pslegend +%%HiResBoundingBox: 0 0 612 792 +%%Title: GMT v5.3.3_r17717 [64-bit] Document from pslegend %%Creator: GMT5 %%For: pwessel %%DocumentNeededResources: font Helvetica -%%CreationDate: Sat Jun 27 22:36:24 2015 +%%CreationDate: Sat Mar 18 14:37:45 2017 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Orientation: Portrait @@ -272,7 +272,6 @@ end PSL_heights psl_k PSL_height put } for } def -%%%%%%%%%%%%%%%%%%% CURVED BASELINE TEXT PLACEMENT FUNCTIONS /PSL_curved_path_labels { /psl_bits exch def /PSL_placetext psl_bits 2 and 2 eq def @@ -523,7 +522,6 @@ end {PSL_xp 0 get PSL_yp 0 get M 1 1 j { /ii exch def PSL_xp ii get PSL_yp ii get L} for } def -%%%%%%%%%%%%%%%%%%% DRAW BASELINE TEXT SEGMENT LINES /PSL_draw_path_lines { /PSL_n_paths1 PSL_n_paths 1 sub def @@ -549,7 +547,6 @@ end } for U } def -%%%%%%%%%%%%%%%%%%% STRAIGHT BASELINE TEXT PLACEMENT FUNCTIONS /PSL_straight_path_labels { /psl_bits exch def @@ -666,12 +663,35 @@ O0 1200 1200 TM % PostScript produced by: -%%GMT: pslegend -Dx0/0/5.6i/BL -C0.05i -L1.2 -F+p+gsnow1 -B0 table.txt -P --FONT_ANNOT_PRIMARY=12p --FONT_LABEL=12p -%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84 +%@GMT: pslegend -Dx0/0 -C0.05i -L1.2 -F+p+gsnow1 -B0 table.txt -P --FONT_ANNOT_PRIMARY=12p --FONT_LABEL=12p +%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy %%BeginObject PSL_Layer_1 0 setlinecap 0 setlinejoin 3.32551 setmiterlimit +25 W +2 setlinecap +N 0 4320 M 0 -4320 D S +/PSL_A0_y 0 def +/PSL_A1_y 0 def +/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def +6720 0 T +N 0 4320 M 0 -4320 D S +/PSL_A0_y 0 def +/PSL_A1_y 0 def +/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def +-6720 0 T +N 0 0 M 6720 0 D S +/PSL_A0_y 0 def +/PSL_A1_y 0 def +/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def +0 4320 T +N 0 0 M 6720 0 D S +/PSL_A0_y 0 def +/PSL_A1_y 0 def +/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def +0 -4320 T +0 setlinecap {1 0.98 0.98 C} FS 4320 6720 3360 2160 Sr 17 W @@ -733,8 +753,8 @@ O0 0 0 TM % PostScript produced by: -%%GMT: psxy -R0/5.6/0/3.6 -Jx1i -O -K -N -S @GMTAPI@-000002 -%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84 +%@GMT: psxy -R0/5.6/0/3.6 -Jx1i -O -K -N -S @GMTAPI@-000002 +%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy %%BeginObject PSL_Layer_2 0 setlinecap 0 setlinejoin @@ -768,17 +788,17 @@ O0 0 0 TM % PostScript produced by: -%%GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -F+f+j @GMTAPI@-000001 -%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84 +%@GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -F+f+j @GMTAPI@-000001 +%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy %%BeginObject PSL_Layer_3 0 setlinecap 0 setlinejoin 3.32551 setmiterlimit -3360 3885 M PSL_font_encode 4 get 0 eq {ISOLatin1+_Encoding /Times-Roman /Times-Roman PSL_reencode PSL_font_encode 4 1 put} if -400 F4 +PSL_font_encode 4 get 0 eq {ISOLatin1+_Encoding /Times-Roman /Times-Roman PSL_reencode PSL_font_encode 4 1 put} if +3360 3885 M 400 F4 (Eight Largest Cities in North America) bc Z -1142 3470 M PSL_font_encode 0 get 0 eq {ISOLatin1+_Encoding /Helvetica /Helvetica PSL_reencode PSL_font_encode 0 1 put} if -200 F0 +PSL_font_encode 0 get 0 eq {ISOLatin1+_Encoding /Helvetica /Helvetica PSL_reencode PSL_font_encode 0 1 put} if +1142 3470 M 200 F0 (City Name) bc Z 2419 3470 M (Country) bc Z 3629 3470 M (Population) bc Z @@ -842,8 +862,8 @@ O0 0 0 TM % PostScript produced by: -%%GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -M -F+f+a+j @GMTAPI@-000003 -%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84 +%@GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -M -F+f+a+j @GMTAPI@-000003 +%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 +xy %%BeginObject PSL_Layer_4 0 setlinecap 0 setlinejoin @@ -1144,29 +1164,6 @@ PSL_x0 PSL_y0 T 0 0 M 1 PSL_textjustifier U %%EndObject -25 W -2 setlinecap -N 0 4320 M 0 -4320 D S -/PSL_A0_y 0 def -/PSL_A1_y 0 def -/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def -6720 0 T -N 0 4320 M 0 -4320 D S -/PSL_A0_y 0 def -/PSL_A1_y 0 def -/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def --6720 0 T -N 0 0 M 6720 0 D S -/PSL_A0_y 0 def -/PSL_A1_y 0 def -/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def -0 4320 T -N 0 0 M 6720 0 D S -/PSL_A0_y 0 def -/PSL_A1_y 0 def -/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def -0 -4320 T -0 setlinecap %%EndObject %%PageTrailer U diff --git a/src/gmt.c b/src/gmt.c index ae88c6c..808df6c 100644 --- a/src/gmt.c +++ b/src/gmt.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt.c 17644 2017-03-12 02:09:29Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -30,6 +30,12 @@ #include "gmt_dev.h" #if !(defined(WIN32) || defined(NO_SIGHANDLER)) +#if __APPLE__ + /* Apple Xcode expects _Nullable to be defined but it is not if gcc */ +#ifndef _Nullable +# define _Nullable +# endif +# endif # include <signal.h> # include "common_sighandler.h" #endif diff --git a/src/gmt_agc_io.c b/src/gmt_agc_io.c index b0e01e2..4c470ee 100644 --- a/src/gmt_agc_io.c +++ b/src/gmt_agc_io.c @@ -1,4 +1,4 @@ -/* $Id: gmt_agc_io.c 17449 2017-01-16 21:27:04Z pwessel $ +/* $Id: gmt_agc_io.c 17647 2017-03-12 04:14:13Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -253,13 +253,13 @@ int gmt_agc_read_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, floa int first_col, last_col, j, col; /* First and last column to deal with */ int first_row, last_row, j_gmt, colend; /* First and last row to deal with */ unsigned int width_in; /* Number of items in one row of the subregion */ - unsigned int width_out; /* Width of row as return (may include padding) */ + /* width_out is width of row as return (may include padding) */ unsigned int height_in; /* Number of columns in subregion */ unsigned int i; /* Misc. counters */ unsigned int *k = NULL; /* Array with indices */ unsigned int block, n_blocks, n_blocks_x, n_blocks_y; /* Misc. counters */ unsigned int datablockcol, datablockrow, rowstart, rowend, colstart, row; - uint64_t ij, imag_offset; + uint64_t ij, imag_offset, width_out; float z[ZBLOCKWIDTH][ZBLOCKHEIGHT]; FILE *fp = NULL; /* File pointer to data or pipe */ @@ -307,7 +307,7 @@ int gmt_agc_read_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, floa colend = MIN (colstart + ZBLOCKWIDTH, header->n_columns); for (j = 0, col = colstart; col < colend; j++, col++) { if (col < first_col || col > last_col) continue; - ij = imag_offset + (((j_gmt - first_row) + pad[YHI]) * width_out + col - first_col) + pad[XLO]; + ij = imag_offset + ((uint64_t)(((j_gmt - first_row) + pad[YHI])) * width_out + col - first_col) + pad[XLO]; grid[ij] = (z[j][i] == 0.0) ? GMT->session.f_NaN : z[j][i]; /* AGC uses exact zero as NaN flag */ if (gmt_M_is_fnan (grid[ij])) { header->has_NaNs = GMT_GRID_HAS_NANS; @@ -345,14 +345,14 @@ int gmt_agc_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, flo int first_col, last_col, col, colend = 0; /* First and last column to deal with */ int j_gmt, i, j, first_row, last_row; /* First and last row to deal with */ - unsigned int width_in; /* Number of items in one row of the subregion */ + /* width_in is number of items in one row of the subregion */ unsigned int width_out; /* Width of row as return (may include padding) */ unsigned int height_out; /* Number of columns in subregion */ unsigned int i2, j2; /* Misc. counters */ unsigned int *k = NULL; /* Array with indices */ unsigned int block, n_blocks, n_blocks_x, n_blocks_y; /* Misc. counters */ unsigned int row, rowstart, rowend, colstart, datablockcol, datablockrow; - uint64_t kk, ij, imag_offset; + uint64_t kk, ij, imag_offset, width_in; float prez[PREHEADSIZE], postz[POSTHEADSIZE]; float outz[ZBLOCKWIDTH][ZBLOCKHEIGHT]; FILE *fp = NULL; /* File pointer to data or pipe */ @@ -416,7 +416,7 @@ int gmt_agc_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, flo colend = MIN (colstart + ZBLOCKWIDTH, header->n_columns); for (j = 0, col = colstart; col < colend; j++, col++) { if (col < first_col || col > last_col) continue; - ij = imag_offset + ((j_gmt - first_row) + pad[YHI]) * width_in + (col - first_col) + pad[XLO]; + ij = imag_offset + ((uint64_t)((j_gmt - first_row) + pad[YHI])) * width_in + (col - first_col) + pad[XLO]; outz[j][i] = grid[ij]; } } diff --git a/src/gmt_api.c b/src/gmt_api.c index 29d5a38..596d407 100644 --- a/src/gmt_api.c +++ b/src/gmt_api.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_api.c 17580 2017-02-23 06:35:24Z pwessel $ + * $Id: gmt_api.c 17680 2017-03-14 19:09:34Z jluis $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -6626,7 +6626,7 @@ void *GMT_Read_Data (void *V_API, unsigned int family, unsigned int method, unsi return_null (API, API->error); } if ((item = gmtapi_validate_id (API, family, in_ID, GMT_IN, GMTAPI_MODULE_INPUT)) == GMT_NOTSET) - return_null (API, GMT_NOTSET); /* Some internal error... */ + return_null (API, API->error); /* Some internal error... */ API->object[item]->selected = true; } gmtlib_free_list (API->GMT, filelist, n_files); /* Free the file list */ diff --git a/src/gmt_customio.c b/src/gmt_customio.c index 4548ecf..96f7dab 100644 --- a/src/gmt_customio.c +++ b/src/gmt_customio.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_customio.c 17543 2017-02-09 14:14:29Z jluis $ + * $Id: gmt_customio.c 17670 2017-03-14 15:58:06Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -1965,7 +1965,7 @@ int gmt_gdal_read_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, flo } int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, float *grid, double wesn[], unsigned int *pad, unsigned int complex_mode) { - uint64_t node = 0, ij, imag_offset; + uint64_t node = 0, ij, imag_offset, imsize; int first_col, last_col; /* First and last column to deal with */ int first_row, last_row; /* First and last row to deal with */ unsigned int width_out; /* Width of row as return (may include padding) */ @@ -2015,11 +2015,12 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl /* Lazy implementation of nodata value update as it doesn't check and apply on a eventual sub-region on output only */ if (!isnan (header->nan_value)) { - for (ij = 0; ij < (uint64_t)header->mx * header->my; ij++) + for (ij = 0; ij < header->size; ij++) if (isnan (grid[ij])) grid[ij] = header->nan_value; } + imsize = gmt_M_get_nm (GMT, width_out, height_out); if (!type[0] || gmt_strlcmp(type, "float32")) { /* We have to shift the grid pointer in order to use the GDALRasterIO ability to extract a subregion. */ /* See: osgeo-org.1560.n6.nabble.com/gdal-dev-writing-a-subregion-with-GDALRasterIO-td4960500.html */ @@ -2033,7 +2034,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl return (GMT_NOERROR); } else if (gmt_strlcmp(type,"u8") || gmt_strlcmp(type,"u08")) { - zu8 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned char); + zu8 = gmt_M_memory(GMT, NULL, imsize, unsigned char); for (row = first_row; row < height_out; row++) for (col = first_col, ij = gmt_M_ijp (header, row, 0)+imag_offset; col < width_out; col++, ij++) zu8[node++] = (unsigned char)grid[ij]; @@ -2042,7 +2043,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl to_GDALW->type = strdup("uint8"); } else if (gmt_strlcmp(type,"i16")) { - zi16 = gmt_M_memory(GMT, NULL, width_out * height_out, short int); + zi16 = gmt_M_memory(GMT, NULL, imsize, short int); for (row = first_row; row < height_out; row++) for (col = first_col, ij = gmt_M_ijp (header, row, 0)+imag_offset; col < width_out; col++, ij++) zi16[node++] = (short int)grid[ij]; @@ -2051,7 +2052,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl to_GDALW->type = strdup("int16"); } else if (gmt_strlcmp(type,"u16")) { - zu16 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned short int); + zu16 = gmt_M_memory(GMT, NULL, imsize, unsigned short int); for (row = first_row; row < height_out; row++) for (col = first_col, ij = gmt_M_ijp (header, row, 0)+imag_offset; col < width_out; col++, ij++) zu16[node++] = (unsigned short int)grid[ij]; @@ -2060,7 +2061,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl to_GDALW->type = strdup("uint16"); } else if (gmt_strlcmp(type,"i32")) { - zi32 = gmt_M_memory(GMT, NULL, width_out * height_out, int); + zi32 = gmt_M_memory(GMT, NULL, imsize, int); for (row = first_row; row < height_out; row++) for (col = first_col, ij = gmt_M_ijp (header, row, 0)+imag_offset; col < width_out; col++, ij++) zi32[node++] = (int)grid[ij]; @@ -2069,7 +2070,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, fl to_GDALW->type = strdup("int32"); } else if (gmt_strlcmp(type,"u32")) { - zu32 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned int); + zu32 = gmt_M_memory(GMT, NULL, imsize, unsigned int); for (row = first_row; row < height_out; row++) for (col = first_col, ij = gmt_M_ijp (header, row, 0)+imag_offset; col < width_out; col++, ij++) zu32[node++] = (unsigned int)grid[ij]; diff --git a/src/gmt_init.c b/src/gmt_init.c index 4ca12aa..26600f0 100644 --- a/src/gmt_init.c +++ b/src/gmt_init.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_init.c 17543 2017-02-09 14:14:29Z jluis $ + * $Id: gmt_init.c 17731 2017-03-20 19:48:52Z jluis $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -6071,7 +6071,7 @@ void gmt_mapscale_syntax (struct GMT_CTRL *GMT, char option, char *string) { gmt_message (GMT, "\t-%c %s\n", option, string); gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3); gmt_message (GMT, "\t Use +c<slat> (with central longitude) or +c<slon>/<slat> to specify scale origin.\n"); - gmt_message (GMT, "\t Set scale length with +w<length> and append a unit from %s [km]. Use -%cf to draw a \"fancy\" scale [Default is plain].\n", GMT_LEN_UNITS2_DISPLAY, option); + gmt_message (GMT, "\t Set scale length with +w<length> and append a unit from %s [km].\n", GMT_LEN_UNITS2_DISPLAY); gmt_message (GMT, "\t Several modifiers are optional:\n"); gmt_message (GMT, "\t Add +f to draw a \"fancy\" scale [Default is plain].\n"); gmt_message (GMT, "\t By default, the scale label equals the distance unit name and is placed on top [+at]. Use the +l<label>\n"); diff --git a/src/gmt_internals.h b/src/gmt_internals.h index 078f7fd..2be5170 100644 --- a/src/gmt_internals.h +++ b/src/gmt_internals.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_internals.h 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt_internals.h 17736 2017-03-20 22:54:42Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -251,7 +251,7 @@ int gmtlib_read_image_info (struct GMT_CTRL *GMT, char *file, struct GMT_IMAGE * #define gmt_M_axis_is_geo(C,axis) (C->current.io.col_type[GMT_IN][axis] & GMT_IS_GEO) #define gmt_M_is_perspective(C) (C->current.proj.projection == GMT_ORTHO || C->current.proj.projection == GMT_GENPER) -#define gmt_M_pole_is_point(C) ((C->current.proj.projection == GMT_OBLIQUE_MERC || C->current.proj.projection == GMT_OBLIQUE_MERC_POLE) || (C->current.proj.projection >= GMT_LAMBERT && C->current.proj.projection <= GMT_VANGRINTEN)) +#define gmt_M_pole_is_point(C) ((C->current.proj.projection == GMT_OBLIQUE_MERC || C->current.proj.projection == GMT_OBLIQUE_MERC_POLE) || (C->current.proj.projection >= GMT_LAMBERT && C->current.proj.projection <= GMT_VANGRINTEN && C->current.proj.projection != GMT_POLAR)) #define gmt_M_is_grdmapproject(C) (!strncmp (C->init.module_name, "grdproject", 10U) || !strncmp (C->init.module_name, "mapproject", 10U)) #endif /* _GMT_INTERNALS_H */ diff --git a/src/gmt_io.c b/src/gmt_io.c index 686fe5c..4582b0d 100644 --- a/src/gmt_io.c +++ b/src/gmt_io.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_io.c 17588 2017-02-23 23:35:14Z pwessel $ + * $Id: gmt_io.c 17742 2017-03-22 02:45:40Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -2629,7 +2629,7 @@ GMT_LOCAL int gmtio_prep_ogr_output (struct GMT_CTRL *GMT, struct GMT_DATASET *D } gmtio_alloc_ogr_seg (GMT, T->segment[seg], T->ogr->n_aspatial); /* Copy over any feature-specific values */ T->segment[seg]->ogr->pol_mode = GMT_IS_PERIMETER; - gmt_set_seg_minmax (GMT, T->ogr->geometry, T->segment[seg]); /* Make sure min/max are set per polygon */ + gmt_set_seg_minmax (GMT, T->ogr->geometry, 0, T->segment[seg]); /* Make sure min/max are set per polygon */ } /* OK, they are all polygons. Determine any polygon holes: if a point is fully inside another polygon (not on the edge) */ @@ -3111,16 +3111,21 @@ GMT_LOCAL void *gmtio_ascii_input (struct GMT_CTRL *GMT, FILE *fp, uint64_t *n, /* If OGR input the also read next 1-2 records to pick up metadata */ if (GMT->current.io.ogr == GMT_OGR_TRUE) { int c; - p = gmt_fgets (GMT, line, GMT_BUFSIZ, fp); - gmtio_ogr_parser (GMT, line); /* Parsed a GMT/OGR record */ - gmtio_build_text_from_ogr (GMT, NULL, GMT->current.io.segment_header); /* Fill in the buffer for -D, -G, Z etc */ - if (strstr (line, "@H")) strcat (GMT->current.io.segment_header, " -Ph"); /* Sometimes a @P or @H record instead */ - /* May also have a second comment record with just @P or @ H so check for this case */ if ((c = fgetc (fp)) == '#') { /* Possibly, this record starts with a comment character # */ line[0] = c; /* Since we ate the # already we place it here manually */ p = gmt_fgets (GMT, &line[1], GMT_BUFSIZ-1, fp); /* Start at position 1 since # placed already and required for gmtio_ogr_parser to work */ - gmtio_ogr_parser (GMT, line); /* Parse a possible GMT/OGR record (just returns if no OGR data there) */ - if (strstr (line, "@H")) strcat (GMT->current.io.segment_header, " -Ph"); /* Add the hole designation to the polygon option */ + gmtio_ogr_parser (GMT, line); /* Parsed a GMT/OGR record */ + gmtio_build_text_from_ogr (GMT, NULL, GMT->current.io.segment_header); /* Fill in the buffer for -D, -G, Z etc */ + if (strstr (line, "@H")) strcat (GMT->current.io.segment_header, " -Ph"); /* Sometimes a @P or @H record instead */ + /* May also have a second comment record with just @P or @ H so check for this case */ + if ((c = fgetc (fp)) == '#') { /* Possibly, this record starts with a comment character # */ + line[0] = c; /* Since we ate the # already we place it here manually */ + p = gmt_fgets (GMT, &line[1], GMT_BUFSIZ-1, fp); /* Start at position 1 since # placed already and required for gmtio_ogr_parser to work */ + gmtio_ogr_parser (GMT, line); /* Parse a possible GMT/OGR record (just returns if no OGR data there) */ + if (strstr (line, "@H")) strcat (GMT->current.io.segment_header, " -Ph"); /* Add the hole designation to the polygon option */ + } + else /* Not a comment record; put that character back on the stream and move on */ + ungetc (c, fp); } else /* Not a comment record; put that character back on the stream and move on */ ungetc (c, fp); @@ -4577,6 +4582,7 @@ void * gmtio_ascii_textinput (struct GMT_CTRL *GMT, FILE *fp, uint64_t *n, int * *status = 0; return (NULL); } + /* Here we are done with any header records implied by -h */ if (!p) { /* Ran out of records */ GMT->current.io.status = GMT_IO_EOF; *n = 0ULL; @@ -6186,15 +6192,17 @@ struct GMT_TEXTTABLE * gmtlib_read_texttable (struct GMT_CTRL *GMT, void *source } /*! . */ -void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, struct GMT_DATASEGMENT *S) { - /* Determine the min/max values for each column in the segment */ +void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, unsigned int n_cols, struct GMT_DATASEGMENT *S) { + /* Determine the min/max values for each column in the segment. + * If n_cols > 0 then we only update the first n_cols */ uint64_t row, col; /* In case the creation of the segment did not allocate min/max do it now */ if (!S->min) S->min = gmt_M_memory (GMT, NULL, S->n_columns, double); if (!S->max) S->max = gmt_M_memory (GMT, NULL, S->n_columns, double); if (S->n_rows == 0) return; /* Nothing more we can do */ - for (col = 0; col < S->n_columns; col++) { + if (n_cols == 0) n_cols = S->n_columns; /* Set number of columns to work on */ + for (col = 0; col < n_cols; col++) { if (GMT->current.io.col_type[GMT_IN][col] == GMT_IS_LON) /* Requires separate quandrant assessment */ gmtlib_get_lon_minmax (GMT, S->data[col], S->n_rows, &(S->min[col]), &(S->max[col])); else { /* Simple Cartesian-like arrangement */ @@ -6226,7 +6234,7 @@ void gmt_set_tbl_minmax (struct GMT_CTRL *GMT, unsigned int geometry, struct GMT T->n_records = 0; for (seg = 0; seg < T->n_segments; seg++) { S = T->segment[seg]; - gmt_set_seg_minmax (GMT, geometry, S); + gmt_set_seg_minmax (GMT, geometry, 0, S); if (S->n_rows == 0) continue; for (col = 0; col < T->n_columns; col++) { if (S->min[col] < T->min[col]) T->min[col] = S->min[col]; @@ -7118,7 +7126,7 @@ struct GMT_DATATABLE * gmtlib_read_table (struct GMT_CTRL *GMT, void *source, un } else { /* OK to populate segment and increment counters */ gmtlib_assign_segment (GMT, T->segment[seg], row, T->segment[seg]->n_columns); /* Allocate and place arrays into segment */ - gmt_set_seg_minmax (GMT, *geometry, T->segment[seg]); /* Set min/max */ + gmt_set_seg_minmax (GMT, *geometry, 0, T->segment[seg]); /* Set min/max */ T->n_records += row; /* Total number of records so far */ T->segment[seg]->id = seg; /* Internal segment number */ } diff --git a/src/gmt_memory.c b/src/gmt_memory.c index 4eced8e..3a64124 100644 --- a/src/gmt_memory.c +++ b/src/gmt_memory.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_memory.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt_memory.c 17620 2017-03-05 23:41:05Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -463,7 +463,7 @@ void gmt_prep_tmp_arrays (struct GMT_CTRL *GMT, size_t row, size_t n_cols) { /* Here we must allocate more rows, this is expected to happen rarely given the large initial allocation */ - while (row >= GMT->hidden.mem_rows) GMT->hidden.mem_rows <<= 1; /* Double up until enough */ + while (row >= GMT->hidden.mem_rows) GMT->hidden.mem_rows = (size_t)lrint (1.5 * GMT->hidden.mem_rows); /* Increase by 50% */ for (col = 0; col < GMT->hidden.mem_cols; col++) /* Add more memory via realloc */ GMT->hidden.mem_coord[col] = gmt_M_memory (GMT, GMT->hidden.mem_coord[col], GMT->hidden.mem_rows, double); diff --git a/src/gmt_nc.c b/src/gmt_nc.c index 2325cc3..31ee580 100644 --- a/src/gmt_nc.c +++ b/src/gmt_nc.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_nc.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt_nc.c 17653 2017-03-13 04:21:20Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -123,8 +123,9 @@ static inline int io_nc_varm_float (int ncid, int varid, const size_t *startp, /* Get number of chunked rows that fit into cache (32MiB) */ GMT_LOCAL int gmtnc_n_chunked_rows_in_cache (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, unsigned width, unsigned height, size_t *n_contiguous_chunk_rows, size_t *chunksize) { - nc_type z_type; /* type of z variable */ - size_t z_size; /* size of z variable */ + nc_type z_type; /* type of z variable */ + size_t z_size; /* size of z variable */ + size_t z_bytes; /* Number of bytes */ unsigned yx_dim[2] = {header->xy_dim[1], header->xy_dim[0]}; /* because xy_dim not row major */ int err, storage_in; @@ -137,7 +138,8 @@ GMT_LOCAL int gmtnc_n_chunked_rows_in_cache (struct GMT_CTRL *GMT, struct GMT_GR chunksize[yx_dim[1]] = width; /* all columns */ } - if (height * width * z_size > NC_CACHE_SIZE) { + z_bytes = ((size_t)height) * ((size_t)width) * ((size_t)z_size); + if (z_bytes > NC_CACHE_SIZE) { /* memory needed for subset exceeds the cache size */ unsigned int level; size_t chunks_per_row = (size_t) ceil ((double)width / chunksize[yx_dim[1]]); @@ -196,7 +198,7 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *he if (n_contiguous_chunk_rows) { /* read/write grid in chunks to keep memory footprint low */ - unsigned remainder; + size_t remainder; #ifdef NC4_DEBUG unsigned row_num = 0; GMT_Report (GMT->parent, GMT_MSG_NORMAL, "stride: %u width: %u\n", @@ -205,11 +207,11 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *he /* adjust row count, so that it ends on the bottom of a chunk */ count[yx_dim[0]] = chunksize[yx_dim[0]] * n_contiguous_chunk_rows; - remainder = (unsigned int)(start[yx_dim[0]] % chunksize[yx_dim[0]]); + remainder = start[yx_dim[0]] % chunksize[yx_dim[0]]; count[yx_dim[0]] -= remainder; count[yx_dim[1]] = width; - while ( start[yx_dim[0]] + count[yx_dim[0]] <= height && status == NC_NOERR) { + while ( (start[yx_dim[0]] + count[yx_dim[0]]) <= height && status == NC_NOERR) { #ifdef NC4_DEBUG GMT_Report (GMT->parent, GMT_MSG_NORMAL, "chunked row #%u start-y:%" PRIuS " height:%" PRIuS "\n", ++row_num, start[yx_dim[0]], count[yx_dim[0]]); @@ -221,7 +223,7 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *he status = io_nc_vara_float (header->ncid, header->z_id, start, count, grid, io_mode); /* advance grid location and set new origin */ - grid += count[yx_dim[0]] * (stride == 0 ? width : stride); + grid += count[yx_dim[0]] * ((size_t)(stride == 0 ? width : stride)); start[yx_dim[0]] += count[yx_dim[0]]; if (remainder) { /* reset count to full chunk height */ @@ -339,7 +341,7 @@ GMT_LOCAL void gmtnc_set_optimal_chunksize (struct GMT_CTRL *GMT, struct GMT_GRI /* here, chunk size is either k_netcdf_io_chunked_auto or the chunk size is * larger than grid size */ - if ( (header->n_rows * header->n_columns) < min_chunk_pixels ) { + if ( header->nm < min_chunk_pixels ) { /* the grid dimension is too small for chunking to make sense. switch to * classic model */ GMT->current.setting.io_nc4_chunksize[0] = k_netcdf_io_classic; @@ -531,14 +533,14 @@ GMT_LOCAL int gmtnc_grd_info (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *head char *pch; gmt_M_err_trap (nc_inq_attlen (ncid, gm_id, "spatial_ref", &len)); /* Get attrib length */ gmt_M_str_free (header->ProjRefWKT); /* Make sure we didn't have a previously allocated one */ - pch = gmt_M_memory(GMT, NULL, len+1, char); /* and allocate the needed space */ + pch = gmt_M_memory (GMT, NULL, len+1, char); /* and allocate the needed space */ gmt_M_err_trap (nc_get_att_text (ncid, gm_id, "spatial_ref", pch)); - header->ProjRefWKT = strdup(pch); /* Turn it into a strdup allocation to be compatible with other instances elsewhere */ + header->ProjRefWKT = strdup (pch); /* Turn it into a strdup allocation to be compatible with other instances elsewhere */ gmt_M_free (GMT, pch); } /* Create enough memory to store the x- and y-coordinate values */ - xy = gmt_M_memory (GMT, NULL, MAX(header->n_columns,header->n_rows), double); + xy = gmt_M_memory (GMT, NULL, MAX (header->n_columns, header->n_rows), double); /* Get information about x variable */ gmtnc_get_units (GMT, ncid, ids[header->xy_dim[0]], header->x_units); @@ -793,34 +795,36 @@ L100: /* Shift columns in a grid to the right (n_shift < 0) or to the left (n_shift < 0) */ GMT_LOCAL void gmtnc_right_shift_grid (void *gridp, const unsigned n_cols, const unsigned n_rows, int n_shift, size_t cell_size) { char *tmp, *grid = (char*)gridp; - unsigned row, n_shift_abs = abs(n_shift); + size_t row, n_shift_abs = abs (n_shift), nm; assert (n_shift_abs != 0 && n_cols > n_shift_abs && n_cols > 0 && n_rows > 0); tmp = malloc (n_shift_abs * cell_size); if (n_shift > 0) { /* right shift */ - for (row = 0; row < n_rows; ++row) { + for (row = 0; row < (size_t)n_rows; ++row) { + nm = row * ((size_t)n_cols); /* copy last n_shift_abs cols into tmp buffer */ - memcpy (tmp, grid + (row * n_cols + n_cols - n_shift_abs) * cell_size, n_shift_abs * cell_size); + memcpy (tmp, grid + (nm + n_cols - n_shift_abs) * cell_size, n_shift_abs * cell_size); /* right shift row */ - memmove (grid + (row * n_cols + n_shift_abs) * cell_size, - grid + row * n_cols * cell_size, + memmove (grid + (nm + n_shift_abs) * cell_size, + grid + nm * cell_size, (n_cols - n_shift_abs) * cell_size); /* prepend tmp buffer */ - memcpy (grid + row * n_cols * cell_size, tmp, n_shift_abs * cell_size); + memcpy (grid + nm * cell_size, tmp, n_shift_abs * cell_size); } } else { /* n_shift_abs < 0 */ for (row = 0; row < n_rows; ++row) { + nm = row * ((size_t)n_cols); /* copy first n_shift_abs cols into tmp buffer */ - memcpy (tmp, grid + row * n_cols * cell_size, n_shift_abs * cell_size); + memcpy (tmp, grid + nm * cell_size, n_shift_abs * cell_size); /* left shift row */ - memmove (grid + row * n_cols * cell_size, - grid + (row * n_cols + n_shift_abs) * cell_size, + memmove (grid + nm * cell_size, + grid + (nm + n_shift_abs) * cell_size, (n_cols - n_shift_abs) * cell_size); /* append tmp buffer */ - memcpy (grid + (row * n_cols + n_cols - n_shift_abs) * cell_size, tmp, n_shift_abs * cell_size); + memcpy (grid + (nm + n_cols - n_shift_abs) * cell_size, tmp, n_shift_abs * cell_size); } } gmt_M_str_free (tmp); @@ -831,62 +835,67 @@ GMT_LOCAL void gmtnc_right_shift_grid (void *gridp, const unsigned n_cols, const GMT_LOCAL void gmtnc_padding_copy (void *gridp, const unsigned n_cols, const unsigned n_rows, const unsigned *n_pad, size_t cell_size, bool periodic_cols) { /* n_cols and n_rows are dimensions of the padded grid */ char *grid = (char*)gridp; - unsigned row, cell; + size_t row, cell, nm, nm2; assert (n_cols > n_pad[XLO] + n_pad[XHI] && n_rows > n_pad[YLO] + n_pad[YHI] && n_pad[XLO] + n_pad[XHI] + n_pad[YLO] + n_pad[YHI] > 0 && cell_size > 0); if (periodic_cols) { /* A periodic grid wraps around */ - for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) { + for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < (size_t)n_rows; ++row) { + nm = row * ((size_t)n_cols); /* Iterate over rows that contain data */ - for (cell = 0; cell < n_pad[XLO]; ++cell) { + for (cell = 0; cell < (size_t)n_pad[XLO]; ++cell) { /* Copy end of this row into first n_pad[XLO] columns: * X X 0 1 2 3 4 5 X X -> 4 5 0 1 2 3 4 5 X X */ - memcpy (grid + (row * n_cols + cell) * cell_size, - grid + (row * n_cols + n_cols + cell - n_pad[XLO] - n_pad[XHI]) * cell_size, + memcpy (grid + (nm + cell) * cell_size, + grid + (nm + (size_t)n_cols + cell - (size_t)n_pad[XLO] - (size_t)n_pad[XHI]) * cell_size, cell_size); } - for (cell = 0; cell < n_pad[XHI]; ++cell) { + for (cell = 0; cell < (size_t)n_pad[XHI]; ++cell) { /* Copy start of this row into last n_pad[XHI] columns: * 4 5 0 1 2 3 4 5 X X -> 4 5 0 1 2 3 4 5 0 1 */ - memcpy (grid + (row * n_cols + n_cols - cell - 1) * cell_size, - grid + (row * n_cols + n_pad[XLO] + n_pad[XHI] - cell - 1) * cell_size, + memcpy (grid + (nm + (size_t)n_cols - cell - 1) * cell_size, + grid + (nm + (size_t)n_pad[XLO] + (size_t)n_pad[XHI] - cell - 1) * cell_size, cell_size); } } } else { /* !periodic_cols */ - for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) { + for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < (size_t)n_rows; ++row) { + nm = row * ((size_t)n_cols); /* Iterate over rows that contain data */ - for (cell = 0; cell < n_pad[XLO]; ++cell) { + for (cell = 0; cell < (size_t)n_pad[XLO]; ++cell) { /* Duplicate first n_pad[XLO] columns in this row: * 4 5 0 1 2 3 4 5 X X -> 0 0 0 1 2 3 4 5 X X */ - memcpy (grid + (row * n_cols + cell) * cell_size, - grid + (row * n_cols + n_pad[XLO]) * cell_size, + memcpy (grid + (nm + cell) * cell_size, + grid + (nm + (size_t)n_pad[XLO]) * cell_size, cell_size); } - for (cell = 0; cell < n_pad[XHI]; ++cell) { + for (cell = 0; cell < (size_t)n_pad[XHI]; ++cell) { /* Duplicate last n_pad[XHI] columns in this row: * 0 0 0 1 2 3 4 5 X X -> 0 0 0 1 2 3 4 5 5 5 */ - memcpy (grid + (row * n_cols + n_cols - cell - 1) * cell_size, - grid + (row * n_cols + n_cols - n_pad[XHI] - 1) * cell_size, + memcpy (grid + (nm + (size_t)n_cols - cell - 1) * cell_size, + grid + (nm + (size_t)n_cols - (size_t)n_pad[XHI] - 1) * cell_size, cell_size); } } } - for (cell = 0; cell < n_pad[YHI]; ++cell) { + for (cell = 0; cell < (size_t)n_pad[YHI]; ++cell) { + nm = cell * ((size_t)n_cols); /* Duplicate n_pad[YHI] rows in the beginning */ - memcpy(grid + cell * n_cols * cell_size, - grid + n_pad[YHI] * n_cols * cell_size, - n_cols * cell_size); + memcpy(grid + nm * cell_size, + grid + ((size_t)n_pad[YHI]) * ((size_t)n_cols) * cell_size, + ((size_t)n_cols) * cell_size); } - for (cell = 0; cell < n_pad[YLO]; ++cell) { + nm2 = ((size_t)(n_rows - n_pad[YLO] - 1)) * ((size_t)n_cols); + for (cell = 0; cell < (size_t)n_pad[YLO]; ++cell) { + nm = ((size_t)(n_rows - cell - 1)) * ((size_t)n_cols); /* Duplicate last n_pad[YLO] rows */ - memcpy(grid + (n_rows - cell - 1) * n_cols * cell_size, - grid + (n_rows - n_pad[YLO] - 1) * n_cols * cell_size, - n_cols * cell_size); + memcpy(grid + nm * cell_size, + grid + nm2 * cell_size, + ((size_t)n_cols) * cell_size); } } @@ -894,22 +903,23 @@ GMT_LOCAL void gmtnc_padding_copy (void *gridp, const unsigned n_cols, const uns GMT_LOCAL void gmtnc_padding_zero (void *gridp, const unsigned n_cols, const unsigned n_rows, const unsigned *n_pad, size_t cell_size) { /* n_cols and n_rows are dimensions of the padded grid */ char *grid = (char*)gridp; - unsigned row; + size_t row, nm; assert (n_cols > n_pad[XLO] + n_pad[XHI] && n_rows > n_pad[YLO] + n_pad[YHI] && n_pad[XLO] + n_pad[XHI] + n_pad[YLO] + n_pad[YHI] > 0 && cell_size > 0); /* Iterate over rows that contain data */ - for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) { + for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < (size_t)n_rows; ++row) { + nm = row * ((size_t)n_cols); /* Zero n cells at beginning of row */ - memset (grid + row * n_cols * cell_size, 0, n_pad[XLO] * cell_size); + memset (grid + nm * cell_size, 0, ((size_t)n_pad[XLO]) * cell_size); /* Zero n cells at end of row */ - memset (grid + (row * n_cols + n_cols - n_pad[XHI]) * cell_size, 0, n_pad[XHI] * cell_size); + memset (grid + (nm + (size_t)n_cols - (size_t)n_pad[XHI]) * cell_size, 0, ((size_t)n_pad[XHI]) * cell_size); } /* Zero n_pad[YHI] rows in the beginning */ - memset(grid, 0, n_pad[YHI] * n_cols * cell_size); + memset (grid, 0, ((size_t)n_pad[YHI]) * ((size_t)n_cols) * cell_size); /* Zero last n_pad[YLO] rows */ - memset(grid + (n_rows-n_pad[YLO]) * n_cols * cell_size, 0, n_pad[YLO] * n_cols * cell_size); + memset(grid + ((size_t)(n_rows-n_pad[YLO])) * ((size_t)n_cols) * cell_size, 0, ((size_t)n_pad[YLO]) * ((size_t)n_cols) * cell_size); } /* Fill mode for grid padding */ @@ -928,10 +938,10 @@ GMT_LOCAL void gmtnc_pad_grid (void *gridp, const unsigned n_cols, const unsigne * * Note: when grid is complex, we pass 2x n_rows */ char *grid = (char*)gridp; - unsigned new_row; - unsigned old_row = n_rows-1; - unsigned n_new_cols = n_cols + n_pad[XLO] + n_pad[XHI]; - unsigned n_new_rows = n_rows + n_pad[YLO] + n_pad[YHI]; + size_t new_row; + size_t old_row = n_rows-1; + size_t n_new_cols = n_cols + n_pad[XLO] + n_pad[XHI]; + size_t n_new_rows = n_rows + n_pad[YLO] + n_pad[YHI]; #ifdef NC4_DEBUG fprintf (stderr, "pad grid w:%u e:%u s:%u n:%u\n", @@ -947,12 +957,12 @@ GMT_LOCAL void gmtnc_pad_grid (void *gridp, const unsigned n_cols, const unsigne /* When padding W, E, and N (not necessary when padding S only). */ for (new_row = n_new_rows - n_pad[YLO] - 1; new_row + 1 > n_pad[YHI]; --new_row, --old_row) { /* Copy original row to new row, bottom upwards */ - void *from = grid + old_row * n_cols * cell_size; - void *to = grid + (new_row * n_new_cols + n_pad[XLO]) * cell_size; + void *from = grid + old_row * ((size_t)n_cols) * cell_size; + void *to = grid + (new_row * n_new_cols + ((size_t)n_pad[XLO])) * cell_size; if (n_pad[YHI] == 0) /* rows overlap! */ - memmove (to, from, n_cols * cell_size); + memmove (to, from, ((size_t)n_cols) * cell_size); else /* no overlap, memcpy is safe */ - memcpy (to, from, n_cols * cell_size); + memcpy (to, from, ((size_t)n_cols) * cell_size); } } @@ -978,8 +988,8 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const unsigned n_cols, const unsig * * Note: when grid is complex, we pass 2x n_rows */ char *grid = (char*)gridp; - unsigned n_old_cols = n_cols + n_pad[XLO] + n_pad[XHI]; - unsigned row; + size_t n_old_cols = n_cols + n_pad[XLO] + n_pad[XHI]; + size_t row; #ifdef NC4_DEBUG fprintf (stderr, "unpad grid w:%u e:%u s:%u n:%u\n", @@ -991,15 +1001,15 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const unsigned n_cols, const unsig assert (n_cols > 0 && n_rows > 0 && cell_size > 0); /* Reshape matrix */ - for (row = 0; row < n_rows; ++row) { - unsigned old_row = row + n_pad[YHI]; - void *from = grid + (old_row * n_old_cols + n_pad[XLO]) * cell_size; - void *to = grid + row * n_cols * cell_size; + for (row = 0; row < (size_t)n_rows; ++row) { + size_t old_row = row + n_pad[YHI]; + void *from = grid + (old_row * n_old_cols + ((size_t)n_pad[XLO])) * cell_size; + void *to = grid + row * ((size_t)n_cols) * cell_size; /* Copy original row to new row */ if (n_pad[YHI] == 0) /* rows overlap! */ - memmove (to, from, n_cols * cell_size); + memmove (to, from, ((size_t)n_cols) * cell_size); else /* no overlap, memcpy is safe */ - memcpy (to, from, n_cols * cell_size); + memcpy (to, from, ((size_t)n_cols) * cell_size); } } @@ -1008,11 +1018,12 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const unsigned n_cols, const unsig GMT_LOCAL void gmtnc_grid_fix_repeat_col (struct GMT_CTRL *GMT, void *gridp, const unsigned n_cols, const unsigned n_rows, size_t cell_size) { /* Note: when grid is complex, pass 2x n_rows */ char *grid = (char*)gridp; - unsigned row, n_conflicts = 0; + unsigned n_conflicts = 0; + size_t row; - for (row = 0; row < n_rows; ++row) { - char *first = grid + row * n_cols * cell_size; /* first element in row */ - char *last = grid + (row * n_cols + n_cols - 1) * cell_size; /* last element in row */ + for (row = 0; row < (size_t)n_rows; ++row) { + char *first = grid + row * ((size_t)n_cols) * cell_size; /* first element in row */ + char *last = grid + (row * (size_t)(n_cols) + ((size_t)n_cols) - 1) * cell_size; /* last element in row */ if ( memcmp(last, first, cell_size) ) { /* elements differ: replace value of last element in row with value of first */ memcpy (last, first, cell_size); @@ -1309,7 +1320,7 @@ int gmt_nc_read_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, float adj_nan_value = !isnan (header->nan_value); header->has_NaNs = GMT_GRID_NO_NANS; /* We are about to check for NaNs and if none are found we retain 1, else 2 */ for (row = 0; row < height; ++row) { - float *p_data = pgrid + row * (header->stride ? header->stride : width); + float *p_data = pgrid + ((size_t)row) * ((size_t)(header->stride ? header->stride : width)); unsigned col; for (col = 0; col < width; col ++) { if (adj_nan_value && p_data[col] == header->nan_value) { @@ -1388,10 +1399,11 @@ int gmt_nc_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, floa int status = NC_NOERR; bool adj_nan_value; /* if we need to change the fill value */ bool do_round = true; /* if we need to round to integral */ - unsigned n, width, height, *actual_col = NULL; + unsigned width, height, *actual_col = NULL; unsigned dim[2], origin[2]; /* dimension and origin {y,x} of subset to write to netcdf */ int first_col, last_col, first_row, last_row; uint64_t imag_offset; + size_t n; double limit[2]; /* minmax of z variable */ float *pgrid = NULL; @@ -1454,7 +1466,7 @@ int gmt_nc_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, floa header->z_max = -DBL_MAX; adj_nan_value = !isnan (header->nan_value); n = 0; - while (n < width * height) { + while (n < (((size_t)width) * ((size_t)height))) { if (adj_nan_value && isnan (pgrid[n])) pgrid[n] = header->nan_value; else if (!isnan (pgrid[n])) { diff --git a/src/gmt_plot.c b/src/gmt_plot.c index a933c70..c1f1a70 100644 --- a/src/gmt_plot.c +++ b/src/gmt_plot.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_plot.c 17592 2017-02-24 00:40:55Z pwessel $ + * $Id: gmt_plot.c 17670 2017-03-14 15:58:06Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -558,9 +558,13 @@ GMT_LOCAL void plot_x_grid (struct GMT_CTRL *GMT, struct PSL_CTRL *PSL, double s double x1, y1, x2, y2; for (i = 0; i < nx; i++) { - gmt_geo_to_xy (GMT, x[i], s, &x1, &y1); - gmt_geo_to_xy (GMT, x[i], n, &x2, &y2); - PSL_plotsegment (PSL, x1, y1, x2, y2); + if (gmt_M_is_geographic (GMT, GMT_IN)) + plot_map_lonline (GMT, PSL, x[i], s, n); + else { + gmt_geo_to_xy (GMT, x[i], s, &x1, &y1); + gmt_geo_to_xy (GMT, x[i], n, &x2, &y2); + PSL_plotsegment (PSL, x1, y1, x2, y2); + } } } @@ -617,9 +621,13 @@ GMT_LOCAL void plot_y_grid (struct GMT_CTRL *GMT, struct PSL_CTRL *PSL, double w double x1, y1, x2, y2; for (i = 0; i < ny; i++) { - gmt_geo_to_xy (GMT, w, y[i], &x1, &y1); - gmt_geo_to_xy (GMT, e, y[i], &x2, &y2); - PSL_plotsegment (PSL, x1, y1, x2, y2); + if (gmt_M_is_geographic (GMT, GMT_IN)) + plot_map_latline (GMT, PSL, y[i], w, e); + else { + gmt_geo_to_xy (GMT, w, y[i], &x1, &y1); + gmt_geo_to_xy (GMT, e, y[i], &x2, &y2); + PSL_plotsegment (PSL, x1, y1, x2, y2); + } } } @@ -5892,7 +5900,7 @@ void gmt_geo_wedge (struct GMT_CTRL *GMT, double xlon, double xlat, double radiu return; } S->n_rows = n_new; - gmt_set_seg_minmax (GMT, (mode == 3) ? GMT_IS_POLY : GMT_IS_LINE, S); /* Update min/max */ + gmt_set_seg_minmax (GMT, (mode == 3) ? GMT_IS_POLY : GMT_IS_LINE, 2, S); /* Update min/max of x/y only */ gmt_geo_polygons (GMT, S); @@ -6295,6 +6303,21 @@ void gmt_plane_perspective (struct GMT_CTRL *GMT, int plane, double level) { GMT->current.proj.z_project.plane = plane; } +#if 0 +void gmt_vector_v4 (struct PSL_CTRL *PSL, double x0, double y0, double x1, double y1, double tailwidth, double headlength, double headwidth, double shape, struct GMT_FILL *fill, int outline) +{ + /* Plots the GMT4 vector symbol */ + + if (fill && fill->use_pattern) { /* Setup pattern first */ + int rgb[3] = {-3, -3, -3}; + rgb[1] = (int)ps_pattern (fill->pattern_no, fill->pattern, fill->inverse, fill->dpi, outline, fill->f_rgb, fill->b_rgb); + psl_vector_v4 (PSL, x0, y0, param, rgb, outline); + } + else /* Just draw as we please */ + psl_vector_v4 (PSL, x0, y0, param, fill->rgb, outline); +} +#endif + /* All functions involved in reading, writing, duplicating GMT_POSTSCRIPT structs and their PostScript content */ /*! . */ diff --git a/src/gmt_plot.h b/src/gmt_plot.h index 357a3c5..3e70b1e 100644 --- a/src/gmt_plot.h +++ b/src/gmt_plot.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_plot.h 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt_plot.h 17670 2017-03-14 15:58:06Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -55,6 +55,7 @@ #define GMT_SYMBOL_TRIANGLE ((int)'t') #define GMT_SYMBOL_CUBE ((int)'u') #define GMT_SYMBOL_VECTOR ((int)'v') +#define GMT_SYMBOL_VECTOR_V4 999 #define GMT_SYMBOL_WEDGE ((int)'w') #define GMT_SYMBOL_CROSS ((int)'x') #define GMT_SYMBOL_YDASH ((int)'y') diff --git a/src/gmt_prototypes.h b/src/gmt_prototypes.h index 3a90aed..c669dfb 100644 --- a/src/gmt_prototypes.h +++ b/src/gmt_prototypes.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_prototypes.h 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmt_prototypes.h 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -233,7 +233,7 @@ EXTERN_MSC struct GMT_VECTOR * gmt_create_vector (struct GMT_CTRL *GMT, uint64_t EXTERN_MSC void gmt_free_vector (struct GMT_CTRL *GMT, struct GMT_VECTOR **V, bool free_vector); EXTERN_MSC int gmt_load_aspatial_string (struct GMT_CTRL *GMT, struct GMT_OGR *G, uint64_t col, char out[GMT_BUFSIZ]); EXTERN_MSC double gmt_get_aspatial_value (struct GMT_CTRL *GMT, int col, struct GMT_DATASEGMENT *S); -EXTERN_MSC void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, struct GMT_DATASEGMENT *S); +EXTERN_MSC void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, unsigned int n_cols, struct GMT_DATASEGMENT *S); EXTERN_MSC void gmt_set_seg_polar (struct GMT_CTRL *GMT, struct GMT_DATASEGMENT *S); EXTERN_MSC void gmt_skip_xy_duplicates (struct GMT_CTRL *GMT, bool mode); EXTERN_MSC void gmt_duplicate_ogr_seg (struct GMT_CTRL *GMT, struct GMT_DATASEGMENT *S_to, struct GMT_DATASEGMENT *S_from); @@ -264,7 +264,7 @@ EXTERN_MSC void gmt_init_fill (struct GMT_CTRL *GMT, struct GMT_FILL *fill, doub EXTERN_MSC int gmt_intpol (struct GMT_CTRL *GMT, double *x, double *y, uint64_t n, uint64_t m, double *u, double *v, int mode); EXTERN_MSC unsigned int gmt_inonout (struct GMT_CTRL *GMT, double x, double y, const struct GMT_DATASEGMENT *S); EXTERN_MSC void gmt_just_to_lonlat (struct GMT_CTRL *GMT, int justify, bool geo, double *x, double *y); -EXTERN_MSC struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg); +EXTERN_MSC struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg, char option); EXTERN_MSC void gmt_set_refpoint (struct GMT_CTRL *GMT, struct GMT_REFPOINT *A); EXTERN_MSC void gmt_free_refpoint (struct GMT_CTRL *GMT, struct GMT_REFPOINT **Ap); EXTERN_MSC void gmt_flip_azim_d (struct GMT_CTRL *GMT, double *azim); diff --git a/src/gmt_support.c b/src/gmt_support.c index 0e89b0a..214f85d 100644 --- a/src/gmt_support.c +++ b/src/gmt_support.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_support.c 17571 2017-02-22 17:37:42Z pwessel $ + * $Id: gmt_support.c 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -3309,11 +3309,11 @@ GMT_LOCAL int support_getscale_old (struct GMT_CTRL *GMT, char option, char *tex } ms->length = atof (txt_len); - if (gave_xy) /* Set up ancher in plot units */ + if (gave_xy) /* Set up anchor in plot units */ snprintf (string, GMT_LEN256, "x%s/%s", txt_a, txt_b); else /* Set up ancher in geographical coordinates */ snprintf (string, GMT_LEN256, "g%s/%s", txt_a, txt_b); - if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) { + if ((ms->refpoint = gmt_get_refpoint (GMT, string, option)) == NULL) { GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: Scale reference point was not accepted\n"); gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3); return (1); /* Failed basic parsing */ @@ -3522,7 +3522,7 @@ GMT_LOCAL int support_getrose_old (struct GMT_CTRL *GMT, char option, char *text snprintf (string, GMT_LEN256, "x%s/%s", txt_a, txt_b); else /* Set up ancher in geographical coordinates */ snprintf (string, GMT_LEN256, "g%s/%s", txt_a, txt_b); - if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) { + if ((ms->refpoint = gmt_get_refpoint (GMT, string, option)) == NULL) { GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: Map rose reference point was not accepted\n"); gmt_refpoint_syntax (GMT, "Td|m", NULL, GMT_ANCHOR_MAPROSE, 3); return (1); /* Failed basic parsing */ @@ -10600,7 +10600,7 @@ int gmt_getinsert (struct GMT_CTRL *GMT, char option, char *in_text, struct GMT_ unsigned int last; char *q[2] = {NULL, NULL}; size_t len; - if ((B->refpoint = gmt_get_refpoint (GMT, text)) == NULL) { + if ((B->refpoint = gmt_get_refpoint (GMT, text, option)) == NULL) { GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: Map insert reference point was not accepted\n"); gmt_refpoint_syntax (GMT, "D", NULL, GMT_ANCHOR_INSERT, 1); return (1); /* Failed basic parsing */ @@ -10732,7 +10732,7 @@ int gmt_getscale (struct GMT_CTRL *GMT, char option, char *text, struct GMT_MAP_ ms->measure = 'k'; /* Default distance unit is km */ ms->alignment = 't'; /* Default label placement is on top */ - if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) { + if ((ms->refpoint = gmt_get_refpoint (GMT, text, option)) == NULL) { GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: Scale reference point was not accepted\n"); gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3); return (1); /* Failed basic parsing */ @@ -10876,7 +10876,7 @@ int gmt_getrose (struct GMT_CTRL *GMT, char option, char *text, struct GMT_MAP_R return (-1); break; } - if ((ms->refpoint = gmt_get_refpoint (GMT, &text[1])) == NULL) { + if ((ms->refpoint = gmt_get_refpoint (GMT, &text[1], option)) == NULL) { GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: Map rose reference point was not accepted\n"); gmt_refpoint_syntax (GMT, "Td|m", NULL, GMT_ANCHOR_MAPROSE, 3); return (1); /* Failed basic parsing */ @@ -13450,7 +13450,7 @@ void gmt_free_refpoint (struct GMT_CTRL *GMT, struct GMT_REFPOINT **Ap) { } /*! . */ -struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg) { +struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg, char option) { /* Used to decipher option -D in psscale, pslegend, and psimage: * -D[g|j|n|x]<refpoint>[/<remainder] * where g means map coordinates, n means normalized coordinates, and x means plot coordinates. @@ -13458,6 +13458,7 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg) { * plot box coordinates; the <refpoint> point is the coordinate pair <x0>/<y0>. * All -D flavors except -Dx require -R -J. * Remaining arguments are returned as well via the string A->args. + * also used to parse refpoint in scales -L and -T hence the option argument. */ unsigned int n_errors = 0, k = 1; /* Assume 1st character tells us the mode */ int n, justify = 0; @@ -13513,13 +13514,13 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg) { mode = GMT_REFPOINT_JUST; else { /* Must assume the user gave map coordinates */ mode = GMT_REFPOINT_MAP; - GMT_Report (GMT->parent, GMT_MSG_VERBOSE, "Warning: Your -D option was interpreted to mean -D%c\n", kind[mode]); + GMT_Report (GMT->parent, GMT_MSG_VERBOSE, "Warning: Your -%c option was interpreted to mean -D%c\n", option, kind[mode]); } } /* Here we know or have assumed the mode and can process coordinates accordingly */ if (mode != GMT_REFPOINT_PLOT && GMT->common.J.active == false && GMT->common.R.active == false) { - GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error: Your -D%c reference point coordinates require both -R -J to be specified\n", kind[mode]); + GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error: Your -%c%c reference point coordinates require both -R -J to be specified\n", option, kind[mode]); return NULL; } @@ -13545,7 +13546,7 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg) { n_errors += gmt_verify_expectations (GMT, GMT->current.io.col_type[GMT_IN][GMT_X], gmt_scanf (GMT, txt_x, GMT->current.io.col_type[GMT_IN][GMT_X], &A->x), txt_x); n_errors += gmt_verify_expectations (GMT, GMT->current.io.col_type[GMT_IN][GMT_Y], gmt_scanf (GMT, txt_y, GMT->current.io.col_type[GMT_IN][GMT_Y], &A->y), txt_y); if (n_errors) - GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error: Could not parse geographic coordinates %s and/or %s\n", txt_x, txt_y); + GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error -%c: Could not parse geographic coordinates %s and/or %s\n", option, txt_x, txt_y); else GMT_Report (GMT->parent, GMT_MSG_DEBUG, "Anchor point specified via map coordinates: %g, %g\n", A->x, A->y); break; diff --git a/src/gmt_vector.c b/src/gmt_vector.c index 68a8e38..5cde1a9 100644 --- a/src/gmt_vector.c +++ b/src/gmt_vector.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmt_vector.c 17528 2017-02-05 08:02:49Z pwessel $ + * $Id: gmt_vector.c 17621 2017-03-06 00:01:29Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -1368,7 +1368,7 @@ uint64_t gmt_fix_up_path (struct GMT_CTRL *GMT, double **a_lon, double **a_lat, */ unsigned int k = 1; - bool meridian; + bool meridian, boostable; uint64_t i, j, n_new, n_step = 0; double a[3], b[3], x[3], *lon = NULL, *lat = NULL; double c, d, fraction, theta, minlon, maxlon; @@ -1399,22 +1399,21 @@ uint64_t gmt_fix_up_path (struct GMT_CTRL *GMT, double **a_lon, double **a_lat, * and hence the number of steps n_step will be small. This can lead to large jumps in * longitude that can later confuse us as to when we cross a periodic boundary. * We try to mitigate that by scaling up the number of steps by a boost factor that is 1 - * away from poles and from |lat| = 75 increases to 100 very close to the pole. */ - + * away from poles and from |lat| = 75 increases to 150 very close to the pole. */ + boostable = !(gmt_M_is_linear (GMT) || gmt_M_pole_is_point (GMT)); /* Only boost for projections where poles are lines */ f_lat_a = fabs (lat[0]); for (i = 1; i < n; i++) { f_lat_b = fabs (lat[i]); gmt_geo_to_cart (GMT, lat[i], lon[i], b, true); /* End point of current arc */ - boost = (MIN(f_lat_a, f_lat_b) > 75.0) ? 100.0 : 1.0; /* Enforce closer sampling close to poles */ - if (MIN(f_lat_a, f_lat_b) > 75.0) /* Enforce closer sampling close to poles */ - boost = 1.0 + 10.0 * (MAX(f_lat_a, f_lat_b) - 75.0); /* Crude way to get a boost from 1 at 80 to ~101 at the pole */ + if (boostable && MIN(f_lat_a, f_lat_b) > 75.0) /* Enforce closer sampling close to poles */ + boost = 1.0 + 10.0 * (MAX(f_lat_a, f_lat_b) - 75.0); /* Crude way to get a boost from 1 at 75 to ~151 at the pole */ else boost = 1.0; if (mode == GMT_STAIRS_Y) { /* First follow meridian, then parallel */ dlon = lon[i]-lon[i-1]; /* Beware of jumps due to sign differences */ - if (fabs (dlon) > 180.0) dlon += copysign (360.0, -dlon); /* Never more than 180 to next point */ + if (fabs (dlon) > 180.0) dlon += copysign (360.0, -dlon); /* Never more than 180 to next point */ lon_i = lon[i-1] + dlon; /* Use lon_i instead of lon[i] in the marching since this avoids any jumping */ theta = fabs (dlon) * cosd (lat[i-1]); n_step = lrint (theta / step); diff --git a/src/gmtlogo.c b/src/gmtlogo.c index bb49bb9..85a9175 100644 --- a/src/gmtlogo.c +++ b/src/gmtlogo.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: gmtlogo.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: gmtlogo.c 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -116,7 +116,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct GMTLOGO_CTRL *Ctrl, struct GMT case 'D': Ctrl->D.active = true; - if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg)) == NULL) n_errors++; /* Failed basic parsing */ + if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg, 'D')) == NULL) n_errors++; /* Failed basic parsing */ else { /* args are [+j<justify>][+o<dx>[/<dy>]] */ if (gmt_get_modifier (Ctrl->D.refpoint->args, 'j', string)) Ctrl->D.justify = gmt_just_decode (GMT, string, PSL_NO_DEF); @@ -147,7 +147,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct GMTLOGO_CTRL *Ctrl, struct GMT } } if (!Ctrl->D.active) { - Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0"); /* Default if no -D given */ + Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0", 'D'); /* Default if no -D given */ Ctrl->D.active = true; } n_errors += gmt_M_check_condition (GMT, Ctrl->D.width < 0.0, "Syntax error -D option, +w modifier: Width cannot be zero or negative!\n"); diff --git a/src/grdimage.c b/src/grdimage.c index f2addd4..82c442b 100644 --- a/src/grdimage.c +++ b/src/grdimage.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: grdimage.c 17485 2017-01-23 13:20:10Z jluis $ + * $Id: grdimage.c 17670 2017-03-14 15:58:06Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -1027,8 +1027,8 @@ int GMT_grdimage (void *V_API, int mode, void *args) { if (!(bitimage_8[kk] == 0 || bitimage_8[kk] == 255)) P->is_bw = false; if (P && P->is_bw && !Ctrl->A.active) { /* Can get away with a 1-bit image, but we must pack the original byte to 8 image bits */ - int nx8, shift, b_or_w, nx_pixels, k8; - uint64_t imsize; + int nx8, shift, b_or_w, nx_pixels; + uint64_t imsize, k8; unsigned char *bit = NULL; GMT_Report (API, GMT_MSG_VERBOSE, "Creating 1-bit B/W image\n"); diff --git a/src/grdmask.c b/src/grdmask.c index 134bad7..ce50f4b 100644 --- a/src/grdmask.c +++ b/src/grdmask.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: grdmask.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: grdmask.c 17618 2017-03-05 22:58:12Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -361,7 +361,7 @@ int GMT_grdmask (void *V_API, int mode, void *args) { Return (GMT_RUNTIME_ERROR); } S->n_rows = n_new; - gmt_set_seg_minmax (GMT, D->geometry, S); /* Update min/max */ + gmt_set_seg_minmax (GMT, D->geometry, 2, S); /* Update min/max or x/y only */ } } } diff --git a/src/grdview.c b/src/grdview.c index 985ac82..bb70acc 100644 --- a/src/grdview.c +++ b/src/grdview.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: grdview.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: grdview.c 17625 2017-03-06 04:01:24Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -563,7 +563,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct GRDVIEW_CTRL *Ctrl, struct GMT case 'S': /* Smoothing of contours */ Ctrl->S.active = true; sval = atoi (opt->arg); - n_errors += gmt_M_check_condition (GMT, sval, "Syntax error -S option: smooth value must be positive\n"); + n_errors += gmt_M_check_condition (GMT, sval <= 0, "Syntax error -S option: smooth value must be positive\n"); Ctrl->S.value = sval; break; case 'T': /* Tile plot */ diff --git a/src/postscriptlight.c b/src/postscriptlight.c index cf771a4..4023282 100644 --- a/src/postscriptlight.c +++ b/src/postscriptlight.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: postscriptlight.c 17507 2017-01-31 23:21:54Z pwessel $ + * $Id: postscriptlight.c 17670 2017-03-14 15:58:06Z pwessel $ * * Copyright (c) 2009-2017 by P. Wessel and R. Scharroo * @@ -2070,6 +2070,54 @@ static int psl_pattern_init (struct PSL_CTRL *PSL, int image_no, char *imagefile return (image_no); } +#if 0 +void psl_vector_v4 (struct PSL_CTRL *PSL, double x, double y, double param[], double rgb[], int outline) +{ + /* Old GMT4 vector symbol: + * param[0] = xtip; + * param[1] = ytip; + * param[2] = tailwidth; + * param[3] = headlength; + * param[4] = headwidth; + * param[5] = headshape; + /* Will make sure that arrow has a finite width in PS coordinates */ + + double angle, xtail, ytail, tailwidth, headlength, headwidth, headshape; + int w2, length, hw, hl, hl2, hw2, l2; + + xtail = x; ytail = y; xtip = param[0]; ytip = param[1]; + length = psl_iz (PSL, hypot (xtail-xtip, ytail-ytip)); /* Vector length in PS units */ + if (length == 0) return; /* NULL vector */ + + tailwidth = param[2]; + headlength = param[3]; + headwidth = param[4]; + headshape = param[5]; + if (outline & 8) + ps_setfill (rgb, outline - 8); + else + ps_setfill (rgb, outline); + angle = atan2 ((ytip-ytail),(xtip-xtail)) * R2D; /* Angle vector makes with horizontal, in radians */ + fprintf (PSL->internal.fp, "V %ld %ld T ", (PSL_LONG)irint (xtail * PSL->internal.scale), (PSL_LONG)irint (ytail * PSL->internal.scale)); /* Temporarily set tail point the local origin (0, 0) */ + if (angle != 0.0) fprintf (PSL->internal.fp, "%g R ", angle); /* Rotate so vector is horizontal in local coordinate system */ + w2 = (PSL_LONG)irint (0.5 * tailwidth * PSL->internal.scale); if (w2 == 0) w2 = 1; /* Half-width of vector tail */ + hw = (PSL_LONG)irint (headwidth * PSL->internal.scale); if (hw == 0) hw = 1; /* Width of vector head */ + hl = (PSL_LONG)irint (headlength * PSL->internal.scale); /* Length of vector head */ + hl2 = (PSL_LONG)irint (0.5 * headshape * headlength * PSL->internal.scale); /* Cut-in distance due to slanted back-side of arrow head */ + hw2 = hw - w2; /* Distance from tail side to head side (vertically) */ + if (outline & 8) { /* Double-headed vector */ + l2 = length - 2 * hl + 2 * hl2; /* Inside length between start of heads */ + fprintf (PSL->internal.fp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld Sv U\n", + hl2, hw2, -l2, hl2, -hw2, -hl, hw, hl, hw, -hl2, -hw2, l2, -hl2, hw2, hl, -hw); + } + else { /* Single-headed vector */ + l2 = length - hl + hl2; /* Length from tail to start of slanted head */ + fprintf (PSL->internal.fp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld SV U\n", + -l2, hl2, -hw2, -hl, hw, hl, hw, -hl2, -hw2, l2, -w2); + } +} +#endif + #define FIN_SLANT_COS 0.707106781187 /* I.e., 45 degrees slant */ #define FIN_LENGTH_SCALE 0.66666667 /* 2/3 the length of the vector */ #define FIN_HEIGHT_SCALE 0.5 /* 1/2 the width of the vector */ @@ -5419,6 +5467,7 @@ int PSL_command (struct PSL_CTRL *C, const char *format, ...) { char tmp_buffer[PSL_BUFSIZ] = {""}; size_t len = vsnprintf (tmp_buffer, PSL_BUFSIZ, format, args); psl_prepare_buffer (C, len); + C->internal.buffer[C->internal.n] = '\0'; /* Play safe before the strcat of next line. Otherwise trash in the middle may occur */ strncat (&(C->internal.buffer[C->internal.n]), tmp_buffer, len); C->internal.n += len; } diff --git a/src/potential/talwani3d.c b/src/potential/talwani3d.c index 5beeba6..fea0e9f 100644 --- a/src/potential/talwani3d.c +++ b/src/potential/talwani3d.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: talwani3d.c 17580 2017-02-23 06:35:24Z pwessel $ + * $Id: talwani3d.c 17603 2017-03-04 01:03:56Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -51,8 +51,8 @@ #define GMT_PROG_OPTIONS "-VRfhior" GMT_ADD_x_OPT -#define TOL 1.0e-7 -#define DEG_TO_KM 111.319490793 /* For flat-Earth scaling of degrees to km */ +#define TOL 1.0e-7 /* Gotta leave a bit slack for these calculations */ +#define DEG_TO_KM 111.319490793 /* For flat-Earth scaling of degrees to km on WGS-84 Equator */ #define GAMMA 6.673 /* Gravitational constant for distances in km and mass in kg/m^3 */ #define G0 9.81 /* Normal gravity */ @@ -238,7 +238,7 @@ GMT_LOCAL int usage (struct GMTAPI_CTRL *API, int level) { if (level == GMT_MODULE_PURPOSE) return (GMT_NOERROR); GMT_Message (API, GMT_TIME_NONE, "usage: talwani3d <modelfile> [-A] [-D<rho>] [-Ff|n|v] [-G<outfile>] [%s]\n", GMT_I_OPT); GMT_Message (API, GMT_TIME_NONE, "\t[-M[hz]] [-N<trktable>] [%s] [-Z<level>] [%s] \n", GMT_Rgeo_OPT, GMT_V_OPT, GMT_f_OPT); - GMT_Message (API, GMT_TIME_NONE,"\t[%s]\n\t[%s] [%s] [%s]%s\n\n", GMT_h_OPT, GMT_i_OPT, GMT_o_OPT, GMT_r_OPT, GMT_x_OPT); + GMT_Message (API, GMT_TIME_NONE, "\t[-fg] [%s]\n\t[%s] [%s] [%s]%s\n\n", GMT_h_OPT, GMT_i_OPT, GMT_o_OPT, GMT_r_OPT, GMT_x_OPT); if (level == GMT_SYNOPSIS) return (GMT_MODULE_SYNOPSIS); @@ -749,15 +749,44 @@ int GMT_talwani3d (void *V_API, int mode, void *args) { Return (API->error); } - /* Set up cake slice array and pointers */ + if (Ctrl->Z.mode == 1) { /* Got grid with observation levels which also sets output locations; it could also set -fg so do this first */ + if ((G = GMT_Read_Data (API, GMT_IS_GRID, GMT_IS_FILE, GMT_IS_SURFACE, GMT_GRID_ALL, NULL, Ctrl->Z.file, NULL)) == NULL) + Return (API->error); + } + else if (GMT->common.R.active) { /* Gave -R -I [-r] and possibly -fg indirectly via geographic coordinates in -R */ + if ((G = GMT_Create_Data (API, GMT_IS_GRID, GMT_IS_SURFACE, GMT_GRID_ALL, NULL, NULL, Ctrl->I.inc, + GMT_GRID_DEFAULT_REG, GMT_NOTSET, NULL)) == NULL) + Return (API->error); + } + else { /* Got a dataset with output locations via -N */ + gmt_disable_i_opt (GMT); /* Do not want any -i to affect the reading from the -N file */ + if ((D = GMT_Read_Data (API, GMT_IS_DATASET, GMT_IS_FILE, GMT_IS_POINT, GMT_READ_NORMAL, NULL, Ctrl->N.file, NULL)) == NULL) + Return (API->error); + if (D->n_columns < 2) { + GMT_Report (API, GMT_MSG_NORMAL, "Input file %s has %d column(s) but at least 2 are needed\n", Ctrl->N.file, (int)D->n_columns); + Return (GMT_DIM_TOO_SMALL); + } + gmt_reenable_i_opt (GMT); /* Recover settings provided by user (if -i was used at all) */ + } - n_alloc1 = GMT_CHUNK; - cake = gmt_M_memory (GMT, NULL, n_alloc1, struct CAKE); + flat_earth = gmt_M_is_geographic (GMT, GMT_IN); /* If true then input is in degrees and we must convert to km later on */ + + if (flat_earth && Ctrl->M.active[TALWANI3D_HOR]) { + GMT_Report (API, GMT_MSG_NORMAL, "Error -M: Cannot specify both geographic coordinates (degrees) AND -Mh\n"); + Return (GMT_RUNTIME_ERROR); + } + + if (Ctrl->A.active) Ctrl->Z.level = -Ctrl->Z.level; /* Read polygon information from multiple segment file */ GMT_Report (API, GMT_MSG_VERBOSE, "All x/y-values are assumed to be given in %s\n", uname[Ctrl->M.active[TALWANI3D_HOR]]); GMT_Report (API, GMT_MSG_VERBOSE, "All z-values are assumed to be given in %s\n", uname[Ctrl->M.active[TALWANI3D_VER]]); + /* Set up cake slice array and pointers */ + + n_alloc1 = GMT_CHUNK; + cake = gmt_M_memory (GMT, NULL, n_alloc1, struct CAKE); + /* Read the sliced model */ do { /* Keep returning records until we reach EOF */ if ((in = GMT_Get_Record (API, GMT_READ_DATA, NULL)) == NULL) { /* Read next record, get NULL if special case */ @@ -865,6 +894,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) { gmt_M_free (GMT, cake); Return (GMT_RUNTIME_ERROR); } + /* Finish allocation and sort on layers */ cake = gmt_M_memory (GMT, cake, ndepths, struct CAKE); @@ -872,40 +902,10 @@ int GMT_talwani3d (void *V_API, int mode, void *args) { if (n_duplicate) GMT_Report (API, GMT_MSG_VERBOSE, "Ignored %u duplicate vertices\n", n_duplicate); - if (Ctrl->Z.mode == 1) { /* Got grid with observation levels which also sets output locations */ - if ((G = GMT_Read_Data (API, GMT_IS_GRID, GMT_IS_FILE, GMT_IS_SURFACE, GMT_GRID_ALL, NULL, Ctrl->Z.file, NULL)) == NULL) { - gmt_M_free (GMT, cake); - Return (API->error); - } - } - else if (GMT->common.R.active) { /* Gave -R -I [-r] */ - if ((G = GMT_Create_Data (API, GMT_IS_GRID, GMT_IS_SURFACE, GMT_GRID_ALL, NULL, NULL, Ctrl->I.inc, - GMT_GRID_DEFAULT_REG, GMT_NOTSET, NULL)) == NULL) { - gmt_M_free (GMT, cake); - Return (API->error); - } - } - else { /* Got a dataset with output locations via -N */ - gmt_disable_i_opt (GMT); /* Do not want any -i to affect the reading from -C,-F,-L files */ - if ((D = GMT_Read_Data (API, GMT_IS_DATASET, GMT_IS_FILE, GMT_IS_POINT, GMT_READ_NORMAL, NULL, Ctrl->N.file, NULL)) == NULL) { - gmt_M_free (GMT, cake); - Return (API->error); - } - if (D->n_columns < 2) { - GMT_Report (API, GMT_MSG_NORMAL, "Input file %s has %d column(s) but at least 2 are needed\n", Ctrl->N.file, (int)D->n_columns); - Return (GMT_DIM_TOO_SMALL); - } - gmt_reenable_i_opt (GMT); /* Recover settings provided by user (if -i was used at all) */ - } - - flat_earth = gmt_M_is_geographic (GMT, GMT_IN); - - if (Ctrl->A.active) Ctrl->Z.level = -Ctrl->Z.level; - /* Now we can write (if -V) to the screen the user's polygon model characteristics. */ GMT_Report (API, GMT_MSG_VERBOSE, "# of depths: %d\n", ndepths); - if (gmt_M_is_verbose (GMT, GMT_MSG_LONG_VERBOSE)) { + if (gmt_M_is_verbose (GMT, GMT_MSG_LONG_VERBOSE)) { /* Give a listing of layers found */ for (k = 0; k < ndepths; k++) { for (sl = cake[k].first_slice; sl; sl = sl->next) GMT_Report (API, GMT_MSG_LONG_VERBOSE, "Depth: %lg Rho: %lg N-vertx: %4d\n", @@ -919,7 +919,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) { for (k = 0; k < ndepths; k++) depths[k] = cake[k].depth; /* Used by the parabolic integrator */ if (Ctrl->N.active) { /* Single loop over specified output locations */ unsigned int wmode = GMT_ADD_DEFAULT; - double scl = (!(flat_earth || Ctrl->M.active[TALWANI3D_HOR])) ? METERS_IN_A_MILE : 1.0; /* Perhaps convert to km */ + double scl = (!(flat_earth || Ctrl->M.active[TALWANI3D_HOR])) ? (1.0 / METERS_IN_A_KM) : 1.0; /* Perhaps convert to km */ double out[4]; /* Must register Ctrl->G.file first since we are going to writing rec-by-rec */ if (Ctrl->G.active) { @@ -959,7 +959,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) { * with OpenMP due to race condiations that would mess up the output order */ for (row = 0; row < (int64_t)S->n_rows; row++) { /* Calculate attraction at all output locations for this segment */ z_level = (S->n_columns == 3 && !Ctrl->Z.active) ? S->data[GMT_Z][row] : Ctrl->Z.level; /* Default observation z level unless provided in input file */ - GMT->hidden.mem_coord[GMT_X][row] = get_one_output3D (S->data[GMT_X][row]/ scl, S->data[GMT_Y][row]/ scl, z_level, cake, depths, ndepths, Ctrl->F.mode, flat_earth); + GMT->hidden.mem_coord[GMT_X][row] = get_one_output3D (S->data[GMT_X][row] * scl, S->data[GMT_Y][row] * scl, z_level, cake, depths, ndepths, Ctrl->F.mode, flat_earth); } /* This loop is not under OpenMP */ out[GMT_Z] = Ctrl->Z.level; /* Default observation z level unless provided in input file */ diff --git a/src/psclip.c b/src/psclip.c index 3e93465..e856a49 100644 --- a/src/psclip.c +++ b/src/psclip.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psclip.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: psclip.c 17618 2017-03-05 22:58:12Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -283,7 +283,7 @@ int GMT_psclip (void *V_API, int mode, void *args) { Return (GMT_RUNTIME_ERROR); } S->n_rows = n_new; - gmt_set_seg_minmax (GMT, D->geometry, S); /* Update min/max */ + gmt_set_seg_minmax (GMT, D->geometry, 2, S); /* Update min/max of x/y only */ GMT_Report (API, GMT_MSG_DEBUG, "Resample polygon, now has %d points\n", S->n_rows); } diff --git a/src/pscoast.c b/src/pscoast.c index 5aa4432..e2fe2eb 100644 --- a/src/pscoast.c +++ b/src/pscoast.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: pscoast.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: pscoast.c 17630 2017-03-07 20:45:58Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -497,6 +497,9 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSCOAST_CTRL *Ctrl, struct GMT } } + /* If no -E modes were selected then we default to dump provided -M was given */ + if (Ctrl->E.info.mode == 0 && Ctrl->M.active) Ctrl->E.info.mode = GMT_DCW_DUMP; + if (gmt_DCW_list (GMT, Ctrl->E.info.mode)) return 1; if (Ctrl->C.active && !(Ctrl->G.active || Ctrl->S.active || Ctrl->W.active)) { /* Just lakes, fix -A */ diff --git a/src/psimage.c b/src/psimage.c index 4f02bf9..6de810e 100644 --- a/src/psimage.c +++ b/src/psimage.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psimage.c 17460 2017-01-22 22:55:48Z pwessel $ + * $Id: psimage.c 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -163,7 +163,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSIMAGE_CTRL *Ctrl, struct GMT case 'D': Ctrl->D.active = true; p = (string[0]) ? string : opt->arg; /* If -C was used the string is set */ - if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, p)) == NULL) { /* Failed basic parsing */ + if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, p, 'D')) == NULL) { /* Failed basic parsing */ GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error -D: Basic parsing of reference point in %s failed\n", opt->arg); p_fail = true; n_errors++; @@ -283,7 +283,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSIMAGE_CTRL *Ctrl, struct GMT if (Ctrl->G.b_rgb[0] == -2) { Ctrl->G.b_rgb[0] = Ctrl->G.b_rgb[1] = Ctrl->G.b_rgb[2] = 1.0; } if (!Ctrl->D.active) { /* Old syntax without reference point implies -Dx0/0 */ - Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0"); /* Default if no -D given */ + Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0", 'D'); /* Default if no -D given */ Ctrl->D.active = true; } /* Check that the options selected are mutually consistent */ diff --git a/src/pslegend.c b/src/pslegend.c index 98f9585..4f91a80 100644 --- a/src/pslegend.c +++ b/src/pslegend.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: pslegend.c 17449 2017-01-16 21:27:04Z pwessel $ + * $Id: pslegend.c 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -135,7 +135,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSLEGEND_CTRL *Ctrl, struct GM case 'D': /* Sets position and size of legend */ Ctrl->D.active = true; if (strstr (opt->arg, "+w")) { /* New syntax: */ - if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg)) == NULL) { + if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg, 'D')) == NULL) { n_errors++; /* Failed basic parsing */ break; } @@ -323,7 +323,8 @@ int GMT_pslegend (void *V_API, int mode, void *args) { /* High-level function that implements the pslegend task */ unsigned int tbl, pos; int i, justify = 0, n = 0, n_columns = 1, n_col, col, error = 0, column_number = 0, id, n_scan, status = 0; - bool flush_paragraph = false, v_line_draw_now = false, gave_label, gave_mapscale_options, did_old = false, drawn = false; + bool flush_paragraph = false, v_line_draw_now = false, gave_label, gave_mapscale_options, did_old = false; + bool drawn = false, b_cpt = false; uint64_t seg, row, n_fronts = 0, n_quoted_lines = 0; size_t n_char = 0; char txt_a[GMT_LEN256] = {""}, txt_b[GMT_LEN256] = {""}, txt_c[GMT_LEN256] = {""}, txt_d[GMT_LEN256] = {""}; @@ -435,6 +436,7 @@ int GMT_pslegend (void *V_API, int mode, void *args) { if ((c = strchr (bar_height, '+')) != NULL) c[0] = 0; /* Chop off any modifiers so we can compute the height */ height += gmt_M_to_inch (GMT, bar_height) + GMT->current.setting.map_tick_length[0] + GMT->current.setting.map_annot_offset[0] + FONT_HEIGHT_PRIMARY * GMT->current.setting.font_annot[GMT_PRIMARY].size / PSL_POINTS_PER_INCH; column_number = 0; + if (strstr (&line[2], "-B")) b_cpt = true; /* Passed -B options with the bar presecription */ break; case 'A': /* Color change, no height implication */ @@ -608,6 +610,12 @@ int GMT_pslegend (void *V_API, int mode, void *args) { if ((PSL = gmt_plotinit (GMT, options)) == NULL) Return (GMT_RUNTIME_ERROR); gmt_plane_perspective (GMT, GMT->current.proj.z_project.view_plane, GMT->current.proj.z_level); + gmt_plotcanvas (GMT); /* Fill canvas if requested */ + gmt_map_basemap (GMT); /* Plot basemap if requested */ + + if (GMT->current.map.frame.draw && b_cpt) /* Two conflicting -B settings, reset main -B since we just finished the frame */ + gmt_M_memset (&(GMT->current.map.frame), 1, struct GMT_PLOT_FRAME); + /* Must reset any -X -Y to 0 so they are not used further in the GMT_modules we call below */ gmt_M_memset (GMT->current.setting.map_origin, 2, double); @@ -1407,7 +1415,6 @@ int GMT_pslegend (void *V_API, int mode, void *args) { PSL_setorigin (PSL, -x_orig, -y_orig, 0.0, PSL_INV); /* Reset */ Ctrl->D.refpoint->x = x_orig; Ctrl->D.refpoint->y = y_orig; - gmt_map_basemap (GMT); gmt_plotend (GMT); for (id = 0; id < N_DAT; id++) { diff --git a/src/psrose.c b/src/psrose.c index 88cc3d9..2afacc2 100644 --- a/src/psrose.c +++ b/src/psrose.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psrose.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: psrose.c 17716 2017-03-18 22:13:17Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -652,6 +652,8 @@ int GMT_psrose (void *V_API, int mode, void *args) { diameter = 2.0 * Ctrl->S.scale; PSL_setorigin (PSL, x_origin, y_origin, 0.0, PSL_FWD); gmt_plane_perspective (GMT, GMT->current.proj.z_project.view_plane, GMT->current.proj.z_level); + gmt_plotcanvas (GMT); /* Fill canvas if requested */ + if (!Ctrl->S.normalize) Ctrl->S.scale /= max_radius; if (do_fill) { /* Until psrose uses a polar projection we must bypass the basemap fill and do it ourself here */ diff --git a/src/psscale.c b/src/psscale.c index 8215c9a..1f9b7db 100644 --- a/src/psscale.c +++ b/src/psscale.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psscale.c 17582 2017-02-23 21:04:54Z pwessel $ + * $Id: psscale.c 17733 2017-03-20 20:03:03Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -252,7 +252,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSSCALE_CTRL *Ctrl, struct GMT break; case 'D': Ctrl->D.active = true; - if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg)) == NULL) + if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, opt->arg, 'D')) == NULL) n_errors++; /* Failed basic parsing */ else if (strstr (Ctrl->D.refpoint->args, "+w")) { /* New syntax: */ /* Args are +w<length>/<width>[+e[b|f][<length>]][+h][+j<justify>][+ma|c|l|u][+n[<txt>]][+o<dx>[/<dy>]] */ diff --git a/src/pssolar.c b/src/pssolar.c index d303e60..9de2217 100644 --- a/src/pssolar.c +++ b/src/pssolar.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: pssolar.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: pssolar.c 17716 2017-03-18 22:13:17Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -541,6 +541,7 @@ int GMT_pssolar (void *V_API, int mode, void *args) { } if ((PSL = gmt_plotinit (GMT, options)) == NULL) Return (GMT_RUNTIME_ERROR); gmt_plane_perspective (GMT, GMT->current.proj.z_project.view_plane, GMT->current.proj.z_level); + gmt_plotcanvas (GMT); /* Fill canvas if requested */ if (Ctrl->N.active) gmt_map_clip_on (GMT, GMT->session.no_rgb, 1); /* Must clip map */ for (n = 0; n < 4; n++) { /* Loop over the number of requested terminators */ diff --git a/src/psxy.c b/src/psxy.c index 3374c48..7cddc25 100644 --- a/src/psxy.c +++ b/src/psxy.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psxy.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: psxy.c 17739 2017-03-21 06:25:59Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -726,7 +726,8 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSXY_CTRL *Ctrl, struct GMT_OP n_errors += gmt_M_check_condition (GMT, Ctrl->S.active && gmt_parse_symbol_option (GMT, Ctrl->S.arg, S, 0, true), "Syntax error -S option\n"); n_errors += gmt_M_check_condition (GMT, Ctrl->E.active && (S->symbol == GMT_SYMBOL_VECTOR || S->symbol == GMT_SYMBOL_GEOVECTOR || S->symbol == GMT_SYMBOL_MARC \ - || S->symbol == GMT_SYMBOL_ELLIPSE || S->symbol == GMT_SYMBOL_FRONT || S->symbol == GMT_SYMBOL_QUOTED_LINE || S->symbol == GMT_SYMBOL_DECORATED_LINE || S->symbol == GMT_SYMBOL_ROTRECT), "Syntax error -E option: Incompatible with -Se, -Sf, -Sj, -Sm|M, -Sq, -Sv|V, -S=\n"); + || S->symbol == GMT_SYMBOL_ELLIPSE || S->symbol == GMT_SYMBOL_FRONT || S->symbol == GMT_SYMBOL_QUOTED_LINE || S->symbol == GMT_SYMBOL_DECORATED_LINE \ + || S->symbol == GMT_SYMBOL_ROTRECT), "Syntax error -E option: Incompatible with -Se, -Sf, -Sj, -Sm|M, -Sq, -Sv|V, -S=\n"); n_errors += gmt_M_check_condition (GMT, !GMT->common.R.active, "Syntax error: Must specify -R option\n"); n_errors += gmt_M_check_condition (GMT, !GMT->common.J.active, "Syntax error: Must specify a map projection with the -J option\n"); n_errors += gmt_M_check_condition (GMT, GMT->common.b.active[GMT_IN] && S->symbol == GMT_SYMBOL_NOT_SET, "Syntax error: Binary input data cannot have symbol information\n"); @@ -929,7 +930,7 @@ int GMT_psxy (void *V_API, int mode, void *args) { GMT->current.io.col_type[GMT_IN][pos2y] = GMT_IS_FLOAT; /* Just the users dy component, not length */ if (S.symbol == GMT_SYMBOL_VECTOR || S.symbol == GMT_SYMBOL_GEOVECTOR || S.symbol == GMT_SYMBOL_MARC ) { /* One of the vector symbols */ geovector = (S.symbol == GMT_SYMBOL_GEOVECTOR); - if ((S.v.status & GMT_VEC_FILL) == 0) Ctrl->G.active = false; /* Want no fill so override -G*/ + if ((S.v.status & GMT_VEC_FILL) == 0) Ctrl->G.active = false; /* Want no fill so override -G */ if (S.v.status & GMT_VEC_FILL) S.v.fill = current_fill; /* Override -G<fill> (if set) with specified head fill */ } bcol = (S.read_size) ? ex2 : ex1; @@ -1034,7 +1035,9 @@ int GMT_psxy (void *V_API, int mode, void *args) { /* First establish the symbol type given at the end of the record */ gmt_chop (text_rec); /* Get rid of \n \r */ - i = (unsigned int)strlen (text_rec) - 1; + i = (unsigned int)strlen (text_rec); + if (i == 0) continue; /* A blank line snuck through */ + i--; while (text_rec[i] && !strchr (" \t", (int)text_rec[i])) i--; if (S.read_symbol_cmd == 1) gmt_parse_symbol_option (GMT, &text_rec[i+1], &S, 0, false); for (j = n_cols_start; j < 6; j++) GMT->current.io.col_type[GMT_IN][j] = GMT_IS_DIMENSION; /* Since these may have units appended */ @@ -1352,7 +1355,8 @@ int GMT_psxy (void *V_API, int mode, void *args) { x_2 -= dx; y_2 -= dy; } } - if (S.v.parsed_v4 && gmt_M_compat_check (GMT, 4)) { /* Got v_width directly from V4 syntax so no messing with it here if under compatibility */ + if (S.v.parsed_v4) { /* Got v_width directly from V4 syntax so no messing with it here if under compatibility */ + /* Now plot the old GMT V4 vector instead */ /* But have to improvise as far as outline|fill goes... */ if (outline_active) S.v.status |= PSL_VEC_OUTLINE; /* Choosing to draw head outline */ if (fill_active) S.v.status |= PSL_VEC_FILL; /* Choosing to fill head */ @@ -1521,7 +1525,7 @@ int GMT_psxy (void *V_API, int mode, void *args) { Return (GMT_RUNTIME_ERROR); } L->n_rows = n_new; - gmt_set_seg_minmax (GMT, D->geometry, L); /* Update min/max */ + gmt_set_seg_minmax (GMT, D->geometry, 2, L); /* Update min/max of x/y only */ resampled = true; /* To avoid doing it twice */ } if (gmt_trim_line (GMT, &L->data[GMT_X], &L->data[GMT_Y], &L->n_rows, ¤t_pen)) continue; /* Trimmed away completely */ @@ -1602,7 +1606,7 @@ int GMT_psxy (void *V_API, int mode, void *args) { Return (GMT_RUNTIME_ERROR); } L->n_rows = n_new; - gmt_set_seg_minmax (GMT, D->geometry, L); /* Update min/max */ + gmt_set_seg_minmax (GMT, D->geometry, 2, L); /* Update min/max of x/y only */ } if (polygon) { /* Want a closed polygon (with or without fill and with or without outline) */ diff --git a/src/psxyz.c b/src/psxyz.c index fe49ea4..8d27251 100644 --- a/src/psxyz.c +++ b/src/psxyz.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: psxyz.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: psxyz.c 17739 2017-03-21 06:25:59Z pwessel $ * * Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -767,7 +767,9 @@ int GMT_psxyz (void *V_API, int mode, void *args) { text_rec = (char *)record; /* First establish the symbol type given at the end of the record */ gmt_chop (text_rec); /* Get rid of \n \r */ - i = strlen (text_rec) - 1; + i = (unsigned int)strlen (text_rec); + if (i == 0) continue; /* A blank line snuck through */ + i--; while (text_rec[i] && !strchr (" \t", (int)text_rec[i])) i--; gmt_parse_symbol_option (GMT, &text_rec[i+1], &S, 1, false); for (j = n_cols_start; j < 7; j++) GMT->current.io.col_type[GMT_IN][j] = GMT_IS_DIMENSION; /* Since these may have units appended */ diff --git a/src/sphdistance.c b/src/sphdistance.c index 8486c15..9c7094e 100644 --- a/src/sphdistance.c +++ b/src/sphdistance.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: sphdistance.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: sphdistance.c 17618 2017-03-05 22:58:12Z pwessel $ * * Copyright (c) 2008-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe * See LICENSE.TXT file for copying and redistribution conditions. @@ -92,7 +92,7 @@ GMT_LOCAL void prepare_polygon (struct GMT_CTRL *GMT, struct GMT_DATASEGMENT *P) uint64_t row; double lon_sum = 0.0, lat_sum = 0.0, dlon; - gmt_set_seg_minmax (GMT, GMT_IS_POLY, P); /* Set the domain of the segment */ + gmt_set_seg_minmax (GMT, GMT_IS_POLY, 0, P); /* Set the domain of the segment */ /* Then loop over points to accumulate sums */ diff --git a/src/spotter/backtracker.c b/src/spotter/backtracker.c index a19bfc7..8f9fb08 100644 --- a/src/spotter/backtracker.c +++ b/src/spotter/backtracker.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------- - * $Id: backtracker.c 17560 2017-02-17 22:05:42Z pwessel $ + * $Id: backtracker.c 17641 2017-03-12 01:32:05Z pwessel $ * * Copyright (c) 1999-2017 by P. Wessel * @@ -376,6 +376,7 @@ int GMT_backtracker (void *V_API, int mode, void *args) { int n_fields, error; /* Misc. signed counters */ int spotter_way = 0; /* Either SPOTTER_FWD or SPOTTER_BACK */ bool make_path = false; /* true means create continuous path, false works on discrete points */ + bool E_first = true; double *c = NULL; /* Array of track chunks returned by libeuler routines */ @@ -454,6 +455,7 @@ int GMT_backtracker (void *V_API, int mode, void *args) { n_out = (Ctrl->S.active) ? 4 : 3; /* Append smt id number as 4th column when individual files are requested */ if (Ctrl->W.active) n_out = 5 + !(Ctrl->W.mode == 0); geometry = (make_path) ? GMT_IS_LINE : GMT_IS_POINT; + gmt_M_memset (out, 10, double); /* Specify input and output expected columns */ if ((error = gmt_set_cols (GMT, GMT_IN, n_expected_fields)) != GMT_NOERROR) { @@ -503,12 +505,18 @@ int GMT_backtracker (void *V_API, int mode, void *args) { /* Data record to process */ if (Ctrl->E.rot.single) { /* Simple reconstruction, then exit */ + if (E_first) { + if ((error = gmt_set_cols (GMT, GMT_OUT, n_fields)) != GMT_NOERROR) { + Return (error); + } + E_first = false; + } in[GMT_Y] = gmt_lat_swap (GMT, in[GMT_Y], GMT_LATSWAP_G2O); /* Convert to geocentric */ gmt_geo_to_cart (GMT, in[GMT_Y], in[GMT_X], x, true); /* Get x-vector */ gmt_matrix_vect_mult (GMT, 3U, R, x, y); /* Rotate the x-vector */ gmt_cart_to_geo (GMT, &out[GMT_Y], &out[GMT_X], y, true); /* Recover lon lat representation; true to get degrees */ out[GMT_Y] = gmt_lat_swap (GMT, out[GMT_Y], GMT_LATSWAP_O2G); /* Convert back to geodetic */ - gmt_M_memcpy (&out[GMT_Z], &in[GMT_Z], n_fields - 2, double); + if (n_fields > 2) gmt_M_memcpy (&out[GMT_Z], &in[GMT_Z], n_fields - 2, double); GMT_Put_Record (API, GMT_WRITE_DATA, out); continue; } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/gmt.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel