From: <and...@us...> - 2008-09-04 19:06:02
|
Revision: 8748 http://plplot.svn.sourceforge.net/plplot/?rev=8748&view=rev Author: andrewross Date: 2008-09-04 19:06:12 +0000 (Thu, 04 Sep 2008) Log Message: ----------- ANR for Hezekiah Carty. Fix two errors with comments in cairo driver. These are ifdef'd out unless the extcairo driver is enabled - hence no-one has spotted this before. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-09-03 19:59:31 UTC (rev 8747) +++ trunk/drivers/cairo.c 2008-09-04 19:06:12 UTC (rev 8748) @@ -1713,7 +1713,7 @@ plD_bop_extcairo() Set up for the next page. - ---------------------------------------------------------------------- + ----------------------------------------------------------------------*/ void plD_bop_extcairo(PLStream *pls) { @@ -1759,7 +1759,7 @@ /* Set graphics aliasing */ cairo_set_antialias(aStream->cairoContext, aStream->graphics_anti_aliasing); - /* Invert the surface so that the graphs are drawn right side up. + /* Invert the surface so that the graphs are drawn right side up. */ rotate_cairo_surface(pls, 1.0, 0.0, 0.0, -1.0, 0.0, pls->ylength); /* Should adjust plot size to fit in the given cairo context? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-26 00:07:35
|
Revision: 8827 http://plplot.svn.sourceforge.net/plplot/?rev=8827&view=rev Author: airwin Date: 2008-09-26 00:07:23 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Implement familying for the svgcairo device. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-09-25 22:42:37 UTC (rev 8826) +++ trunk/drivers/cairo.c 2008-09-26 00:07:23 UTC (rev 8827) @@ -786,6 +786,43 @@ /*--------------------------------------------------------------------- --------------------------------------------------------------------- + That which is common to all familying Cairo Drivers + + --------------------------------------------------------------------- + ---------------------------------------------------------------------*/ +#if defined(PLD_pngcairo) || defined(PLD_svgcairo) + +void plD_bop_famcairo (PLStream *); +/*---------------------------------------------------------------------- + plD_bop_famcairo() + + Familying Devices: Set up for the next page. + ----------------------------------------------------------------------*/ + +void plD_bop_famcairo(PLStream *pls) +{ + PLCairo *aStream; + + aStream = (PLCairo *)pls->dev; + + /* Plot familying stuff. Not really understood, just copying gd.c */ + plGetFam(pls); + pls->famadv = 1; + pls->page++; + + /* Fill in the window with the background color. */ + cairo_rectangle(aStream->cairoContext, 0.0, 0.0, pls->xlength, pls->ylength); + cairo_set_source_rgb(aStream->cairoContext, + (double)pls->cmap0[0].r/255.0, + (double)pls->cmap0[0].g/255.0, + (double)pls->cmap0[0].b/255.0); + cairo_fill(aStream->cairoContext); +} + +#endif +/*--------------------------------------------------------------------- + --------------------------------------------------------------------- + That which is specific to the xcairo driver. --------------------------------------------------------------------- @@ -1292,7 +1329,7 @@ pdt->pl_line = (plD_line_fp) plD_line_cairo; pdt->pl_polyline = (plD_polyline_fp) plD_polyline_cairo; pdt->pl_eop = (plD_eop_fp) plD_eop_cairo; - pdt->pl_bop = (plD_bop_fp) plD_bop_cairo; + pdt->pl_bop = (plD_bop_fp) plD_bop_famcairo; pdt->pl_tidy = (plD_tidy_fp) plD_tidy_cairo; pdt->pl_state = (plD_state_fp) plD_state_cairo; pdt->pl_esc = (plD_esc_fp) plD_esc_cairo; @@ -1308,19 +1345,37 @@ { PLCairo *aStream; - /* Setup the PLStream and the font lookup table */ - aStream = stream_and_font_setup(pls, 0); + /* Setup the PLStream and the font lookup table and allocate a cairo + stream structure. + + NOTE: The check below is necessary since, in family mode, this function + will be called multiple times. While you might think that it is + sufficient to update what *should* be the only pointer to the contents + of pls->dev, i.e. the pointer pls->dev itself, it appears that + something else somewhere else is also pointing to pls->dev. If you + change what pls->dev points to then you will get a "bus error", from + which I infer the existence of said bad stale pointer. + */ + if(pls->dev == NULL){ + aStream = stream_and_font_setup(pls, 0); + } else { + stream_and_font_setup(pls, 0); + aStream = pls->dev; + } + /* Initialize family file info */ + plFamInit(pls); + /* Prompt for a file name if not already set. */ plOpenFile(pls); + /* Save the pointer to the structure in the PLplot stream */ + pls->dev = aStream; + /* Create an cairo surface & context for SVG file. */ aStream->cairoSurface = cairo_svg_surface_create_for_stream((cairo_write_func_t)write_to_stream, pls->OutFile, (double)pls->xlength, (double)pls->ylength); aStream->cairoContext = cairo_create(aStream->cairoSurface); - /* Save the pointer to the structure in the PLplot stream */ - pls->dev = aStream; - /* Invert the surface so that the graphs are drawn right side up. */ rotate_cairo_surface(pls, 1.0, 0.0, 0.0, -1.0, 0.0, pls->ylength); @@ -1343,7 +1398,6 @@ PLDLLEXPORT void plD_dispatch_init_pngcairo (PLDispatchTable *pdt); void plD_init_pngcairo (PLStream *); -void plD_bop_pngcairo (PLStream *); void plD_eop_pngcairo (PLStream *); /*--------------------------------------------------------------------- @@ -1365,7 +1419,7 @@ pdt->pl_line = (plD_line_fp) plD_line_cairo; pdt->pl_polyline = (plD_polyline_fp) plD_polyline_cairo; pdt->pl_eop = (plD_eop_fp) plD_eop_pngcairo; - pdt->pl_bop = (plD_bop_fp) plD_bop_pngcairo; + pdt->pl_bop = (plD_bop_fp) plD_bop_famcairo; pdt->pl_tidy = (plD_tidy_fp) plD_tidy_cairo; pdt->pl_state = (plD_state_fp) plD_state_cairo; pdt->pl_esc = (plD_esc_fp) plD_esc_cairo; @@ -1419,32 +1473,6 @@ cairo_set_antialias(aStream->cairoContext, aStream->graphics_anti_aliasing); } -/*---------------------------------------------------------------------- - plD_bop_pngcairo() - - PNG: Set up for the next page. - ----------------------------------------------------------------------*/ - -void plD_bop_pngcairo(PLStream *pls) -{ - PLCairo *aStream; - - aStream = (PLCairo *)pls->dev; - - /* Plot familying stuff. Not really understood, just copying gd.c */ - plGetFam(pls); - pls->famadv = 1; - pls->page++; - - /* Fill in the window with the background color. */ - cairo_rectangle(aStream->cairoContext, 0.0, 0.0, pls->xlength, pls->ylength); - cairo_set_source_rgb(aStream->cairoContext, - (double)pls->cmap0[0].r/255.0, - (double)pls->cmap0[0].g/255.0, - (double)pls->cmap0[0].b/255.0); - cairo_fill(aStream->cairoContext); -} - /*--------------------------------------------------------------------- plD_eop_pngcairo() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-30 22:02:07
|
Revision: 8841 http://plplot.svn.sourceforge.net/plplot/?rev=8841&view=rev Author: airwin Date: 2008-09-30 22:01:47 +0000 (Tue, 30 Sep 2008) Log Message: ----------- Redo scaling code to be consistent in spirit with that used for gd.c and svg.c by setting the downscale factor so internal coordinates will always be PIXELS_X x PIXELS_Y = 32768x24576 regardless of the size of the external dimensions. The advantage of this technique is you cannot overflow the internal coordinates (stored in a short). That was possible for the old cairo scaling technique (which simply multiplied external coordinates by 10 to derive internal coordinates) for large external geometry. Also, the old technique potentially gave low internal resolution and line hiding problems for small external geometry. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-09-30 20:44:11 UTC (rev 8840) +++ trunk/drivers/cairo.c 2008-09-30 22:01:47 UTC (rev 8841) @@ -63,7 +63,6 @@ ---------------------------------------------------------------------*/ #define DPI 72 -#define DOWNSCALE 0.1 #define PLCAIRO_DEFAULT_X 720 #define PLCAIRO_DEFAULT_Y 540 @@ -74,7 +73,7 @@ static int text_anti_aliasing; static int graphics_anti_aliasing; static int external_drawable; - +static PLFLT downscale = 0.; static DrvOpt cairo_options[] = {{"text_clipping", DRV_INT, &text_clipping, "Use text clipping (text_clipping=0|1)"}, {"text_anti_aliasing", DRV_INT, &text_anti_aliasing, "Set desired text anti-aliasing (text_anti_aliasing=0|1|2|3). The numbers are in the same order as the cairo_antialias_t enumeration documented at http://cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t)"}, {"graphics_anti_aliasing", DRV_INT, &graphics_anti_aliasing, "Set desired graphics anti-aliasing (graphics_anti_aliasing=0|1|2|3). The numbers are in the same order as the cairo_antialias_t enumeration documented at http://cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t"}, @@ -253,8 +252,8 @@ set_current_context(pls); - cairo_move_to(aStream->cairoContext, DOWNSCALE * (double) x1a, DOWNSCALE * (double) y1a); - cairo_line_to(aStream->cairoContext, DOWNSCALE * (double) x2a, DOWNSCALE * (double) y2a); + cairo_move_to(aStream->cairoContext, downscale * (double) x1a, downscale * (double) y1a); + cairo_line_to(aStream->cairoContext, downscale * (double) x2a, downscale * (double) y2a); cairo_stroke(aStream->cairoContext); } @@ -405,12 +404,12 @@ /* Set up the clipping region if we are doing text clipping */ if(aStream->text_clipping){ - cairo_rectangle(aStream->cairoContext, DOWNSCALE * pls->clpxmi, DOWNSCALE * pls->clpymi, DOWNSCALE * (pls->clpxma - pls->clpxmi), DOWNSCALE * (pls->clpyma - pls->clpymi)); + cairo_rectangle(aStream->cairoContext, downscale * pls->clpxmi, downscale * pls->clpymi, downscale * (pls->clpxma - pls->clpxmi), downscale * (pls->clpyma - pls->clpymi)); cairo_clip(aStream->cairoContext); } /* Move to the string reference point */ - cairo_move_to(aStream->cairoContext, DOWNSCALE * (double) args->x, DOWNSCALE * (double) args->y); + cairo_move_to(aStream->cairoContext, downscale * (double) args->x, downscale * (double) args->y); /* Invert the coordinate system so that the text is drawn right side up */ cairoTransformMatrix = (cairo_matrix_t *) malloc (sizeof(cairo_matrix_t)); @@ -667,13 +666,19 @@ pls->dev_fill0 = 1; /* Supports hardware solid fills */ pls->plbuf_write = 1; /* Activate plot buffer */ - plP_setpxl(DPI/25.4/DOWNSCALE, DPI/25.4/DOWNSCALE); if (pls->xlength <= 0 || pls->ylength <= 0){ pls->xlength = PLCAIRO_DEFAULT_X; pls->ylength = PLCAIRO_DEFAULT_Y; } - plP_setphy((PLINT) 0, (PLINT) pls->xlength / DOWNSCALE, (PLINT) 0, (PLINT) pls->ylength / DOWNSCALE); + /* Calculate ratio of (smaller) external coordinates used for cairo + devices to (larger) internal PLplot coordinates. */ + if (pls->xlength > pls->ylength) + downscale = (PLFLT)pls->xlength/(PLFLT)PIXELS_X; + else + downscale = (PLFLT)pls->ylength/(PLFLT)PIXELS_Y; + plP_setphy((PLINT) 0, (PLINT) (pls->xlength / downscale), (PLINT) 0, (PLINT) (pls->ylength / downscale)); + plP_setpxl(DPI/25.4/downscale, DPI/25.4/downscale); /* Initialize font table with either enviroment variables or defaults. This was copied from the psttf driver. */ @@ -758,9 +763,9 @@ set_current_context(pls); - cairo_move_to(aStream->cairoContext, DOWNSCALE * (double) xa[0], DOWNSCALE * (double) ya[0]); + cairo_move_to(aStream->cairoContext, downscale * (double) xa[0], downscale * (double) ya[0]); for(i=1;i<npts;i++){ - cairo_line_to(aStream->cairoContext, DOWNSCALE * (double) xa[i], DOWNSCALE * (double) ya[i]); + cairo_line_to(aStream->cairoContext, downscale * (double) xa[i], downscale * (double) ya[i]); } } @@ -1070,8 +1075,8 @@ &x, &y, &w, &h, &b, &d); pls->xlength = w; pls->ylength = h; - plP_setphy((PLINT) 0, (PLINT) pls->xlength / DOWNSCALE, (PLINT) 0, - (PLINT) pls->ylength / DOWNSCALE); + plP_setphy((PLINT) 0, (PLINT) (pls->xlength / downscale), (PLINT) 0, + (PLINT) (pls->ylength / downscale)); /* Associate cairo with the supplied drawable */ xcairo_init_cairo(pls); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-01 06:18:05
|
Revision: 8845 http://plplot.svn.sourceforge.net/plplot/?rev=8845&view=rev Author: airwin Date: 2008-10-01 06:17:49 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Document what the surface dimension units are in each device case. Sometimes they are pixels, sometimes they are points (1/72th of an inch), and sometimes (memcairo) the maximum surface dimension is defined by the size of the buffer so the unit would be buffer pixels (as opposed to screen resolution pixels). This documentation is the first step in understanding the sizes of the cairo results for the various cairo devices. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-10-01 06:07:51 UTC (rev 8844) +++ trunk/drivers/cairo.c 2008-10-01 06:17:49 UTC (rev 8845) @@ -890,6 +890,7 @@ /* Create an cairo surface & context that are associated with the X window. */ defaultVisual = DefaultVisual(aStream->XDisplay, 0); + /* Dimension units are pixels from cairo documentation. */ aStream->cairoSurface = cairo_xlib_surface_create(aStream->XDisplay, aStream->XWindow, defaultVisual, pls->xlength, pls->ylength); aStream->cairoContext = cairo_create(aStream->cairoSurface); @@ -1213,6 +1214,7 @@ plOpenFile(pls); /* Create an cairo surface & context for PDF file. */ + /* Dimension units are pts = 1/72 inches from cairo documentation. */ aStream->cairoSurface = cairo_pdf_surface_create_for_stream((cairo_write_func_t)write_to_stream, pls->OutFile, (double)pls->xlength, (double)pls->ylength); aStream->cairoContext = cairo_create(aStream->cairoSurface); @@ -1284,6 +1286,7 @@ plOpenFile(pls); /* Create an cairo surface & context for PS file. */ + /* Dimension units are pts = 1/72 inches from cairo documentation. */ aStream->cairoSurface = cairo_ps_surface_create_for_stream((cairo_write_func_t)write_to_stream, pls->OutFile, (double)pls->ylength, (double)pls->xlength); aStream->cairoContext = cairo_create(aStream->cairoSurface); @@ -1378,6 +1381,7 @@ pls->dev = aStream; /* Create an cairo surface & context for SVG file. */ + /* Dimension units are pts = 1/72 inches from cairo documentation. */ aStream->cairoSurface = cairo_svg_surface_create_for_stream((cairo_write_func_t)write_to_stream, pls->OutFile, (double)pls->xlength, (double)pls->ylength); aStream->cairoContext = cairo_create(aStream->cairoSurface); @@ -1468,6 +1472,7 @@ pls->dev = aStream; /* Create a new cairo surface & context for PNG file. */ + /* Dimension units are pixels from cairo documentation. */ aStream->cairoSurface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, (double)pls->xlength, (double)pls->ylength); aStream->cairoContext = cairo_create(aStream->cairoSurface); @@ -1623,6 +1628,8 @@ /* Create a Cairo drawing surface from the input data */ aStream->cairoSurface = + /* Dimension units are width, height of buffer image from cairo + documentation. */ cairo_image_surface_create_for_data (aStream->cairo_format_memory, CAIRO_FORMAT_RGB24, pls->xlength, pls->ylength, stride); aStream->cairoContext = cairo_create(aStream->cairoSurface); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-25 02:19:43
|
Revision: 8964 http://plplot.svn.sourceforge.net/plplot/?rev=8964&view=rev Author: hbabcock Date: 2008-10-25 02:19:38 +0000 (Sat, 25 Oct 2008) Log Message: ----------- Applied Hez's patch to correct the static downscale variable issue. The downscale variable is now stream specific, eliminating problems with one stream changing it unexpectedly on another stream. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-10-25 01:52:22 UTC (rev 8963) +++ trunk/drivers/cairo.c 2008-10-25 02:19:38 UTC (rev 8964) @@ -73,7 +73,6 @@ static int text_anti_aliasing; static int graphics_anti_aliasing; static int external_drawable; -static PLFLT downscale = 0.; static DrvOpt cairo_options[] = {{"text_clipping", DRV_INT, &text_clipping, "Use text clipping (text_clipping=0|1)"}, {"text_anti_aliasing", DRV_INT, &text_anti_aliasing, "Set desired text anti-aliasing (text_anti_aliasing=0|1|2|3). The numbers are in the same order as the cairo_antialias_t enumeration documented at http://cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t)"}, {"graphics_anti_aliasing", DRV_INT, &graphics_anti_aliasing, "Set desired graphics anti-aliasing (graphics_anti_aliasing=0|1|2|3). The numbers are in the same order as the cairo_antialias_t enumeration documented at http://cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t"}, @@ -86,6 +85,7 @@ short text_clipping; short text_anti_aliasing; short graphics_anti_aliasing; + PLFLT downscale; #if defined(PLD_xcairo) short exit_event_loop; Display *XDisplay; @@ -252,8 +252,8 @@ set_current_context(pls); - cairo_move_to(aStream->cairoContext, downscale * (double) x1a, downscale * (double) y1a); - cairo_line_to(aStream->cairoContext, downscale * (double) x2a, downscale * (double) y2a); + cairo_move_to(aStream->cairoContext, aStream->downscale * (double) x1a, aStream->downscale * (double) y1a); + cairo_line_to(aStream->cairoContext, aStream->downscale * (double) x2a, aStream->downscale * (double) y2a); cairo_stroke(aStream->cairoContext); } @@ -404,12 +404,12 @@ /* Set up the clipping region if we are doing text clipping */ if(aStream->text_clipping){ - cairo_rectangle(aStream->cairoContext, downscale * pls->clpxmi, downscale * pls->clpymi, downscale * (pls->clpxma - pls->clpxmi), downscale * (pls->clpyma - pls->clpymi)); + cairo_rectangle(aStream->cairoContext, aStream->downscale * pls->clpxmi, aStream->downscale * pls->clpymi, aStream->downscale * (pls->clpxma - pls->clpxmi), aStream->downscale * (pls->clpyma - pls->clpymi)); cairo_clip(aStream->cairoContext); } /* Move to the string reference point */ - cairo_move_to(aStream->cairoContext, downscale * (double) args->x, downscale * (double) args->y); + cairo_move_to(aStream->cairoContext, aStream->downscale * (double) args->x, aStream->downscale * (double) args->y); /* Invert the coordinate system so that the text is drawn right side up */ cairoTransformMatrix = (cairo_matrix_t *) malloc (sizeof(cairo_matrix_t)); @@ -655,6 +655,8 @@ int i; char *a; PLCairo *aStream; + PLFLT downscale; + downscale = 0.0; /* Stream setup */ pls->termin = interactive; /* Interactive device */ @@ -699,6 +701,7 @@ #endif aStream->cairoSurface = NULL; aStream->cairoContext = NULL; + aStream->downscale = downscale; /* Set text clipping off as this makes the driver pretty slow */ aStream->text_clipping = 0; @@ -763,9 +766,9 @@ set_current_context(pls); - cairo_move_to(aStream->cairoContext, downscale * (double) xa[0], downscale * (double) ya[0]); + cairo_move_to(aStream->cairoContext, aStream->downscale * (double) xa[0], aStream->downscale * (double) ya[0]); for(i=1;i<npts;i++){ - cairo_line_to(aStream->cairoContext, downscale * (double) xa[i], downscale * (double) ya[i]); + cairo_line_to(aStream->cairoContext, aStream->downscale * (double) xa[i], aStream->downscale * (double) ya[i]); } } @@ -1076,8 +1079,8 @@ &x, &y, &w, &h, &b, &d); pls->xlength = w; pls->ylength = h; - plP_setphy((PLINT) 0, (PLINT) (pls->xlength / downscale), (PLINT) 0, - (PLINT) (pls->ylength / downscale)); + plP_setphy((PLINT) 0, (PLINT) (pls->xlength / aStream->downscale), (PLINT) 0, + (PLINT) (pls->ylength / aStream->downscale)); /* Associate cairo with the supplied drawable */ xcairo_init_cairo(pls); @@ -1791,7 +1794,7 @@ poly_line(pls, pls->dev_x, pls->dev_y, pls->dev_npts); cairo_fill(aStream->cairoContext); break; - case PLESC_HAS_TEXT: /* render rext */ + case PLESC_HAS_TEXT: /* render text */ proc_str(pls, (EscText *) ptr); break; case PLESC_DEVINIT: /* Set external context */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sm...@us...> - 2008-11-19 14:29:15
|
Revision: 8996 http://plplot.svn.sourceforge.net/plplot/?rev=8996&view=rev Author: smekal Date: 2008-11-19 14:29:04 +0000 (Wed, 19 Nov 2008) Log Message: ----------- Added a filled_polygon function which draws a filled polygon and a stroke around it with a width of 1.0. Code which deals with drawing the whole polygon (fill and stroke) with the same transparancy is added as well, but commented since it slows down the driver considerably. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-11-19 14:23:15 UTC (rev 8995) +++ trunk/drivers/cairo.c 2008-11-19 14:29:04 UTC (rev 8996) @@ -199,6 +199,7 @@ static void set_current_context(PLStream *); static void poly_line(PLStream *, short *, short *, PLINT); +static void filled_polygon(PLStream *pls, short *xa, short *ya, PLINT npts); static void rotate_cairo_surface(PLStream *, float, float, float, float, float, float); /* PLplot interface functions */ @@ -335,8 +336,7 @@ switch(op) { case PLESC_FILL: /* filled polygon */ - poly_line(pls, pls->dev_x, pls->dev_y, pls->dev_npts); - cairo_fill(aStream->cairoContext); + filled_polygon(pls, pls->dev_x, pls->dev_y, pls->dev_npts); break; case PLESC_HAS_TEXT: /* render rext */ proc_str(pls, (EscText *) ptr); @@ -773,6 +773,36 @@ } /*--------------------------------------------------------------------- + filled_polygon() + + Draws a filled polygon. + ---------------------------------------------------------------------*/ + +void filled_polygon(PLStream *pls, short *xa, short *ya, PLINT npts) +{ + int i; + PLCairo *aStream; + + aStream = (PLCairo *)pls->dev; + + cairo_move_to(aStream->cairoContext, aStream->downscale * (double) xa[0], aStream->downscale * (double) ya[0]); + for(i=1;i<npts;i++) + cairo_line_to(aStream->cairoContext, aStream->downscale * (double) xa[i], aStream->downscale * (double) ya[i]); + cairo_set_source_rgba(aStream->cairoContext, + (double)pls->curcolor.r/255.0, + (double)pls->curcolor.g/255.0, + (double)pls->curcolor.b/255.0, + (double)pls->curcolor.a); + //(double)1.0); + cairo_set_line_width(aStream->cairoContext, 0.0); + //cairo_push_group(aStream->cairoContext); + cairo_fill_preserve(aStream->cairoContext); + cairo_stroke(aStream->cairoContext); + //cairo_pop_group_to_source(aStream->cairoContext); + //cairo_paint_with_alpha(aStream->cairoContext, (double)pls->curcolor.a); +} + +/*--------------------------------------------------------------------- rotate_cairo_surface() Rotates the cairo surface to the appropriate orientation. @@ -1045,8 +1075,7 @@ switch(op) { case PLESC_FILL: /* filled polygon */ - poly_line(pls, pls->dev_x, pls->dev_y, pls->dev_npts); - cairo_fill(aStream->cairoContext); + filled_polygon(pls, pls->dev_x, pls->dev_y, pls->dev_npts); break; case PLESC_HAS_TEXT: /* render rext */ proc_str(pls, (EscText *) ptr); @@ -1791,8 +1820,7 @@ switch(op) { case PLESC_FILL: /* filled polygon */ - poly_line(pls, pls->dev_x, pls->dev_y, pls->dev_npts); - cairo_fill(aStream->cairoContext); + filled_polygon(pls, pls->dev_x, pls->dev_y, pls->dev_npts); break; case PLESC_HAS_TEXT: /* render text */ proc_str(pls, (EscText *) ptr); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sm...@us...> - 2008-11-19 14:32:21
|
Revision: 8997 http://plplot.svn.sourceforge.net/plplot/?rev=8997&view=rev Author: smekal Date: 2008-11-19 14:32:18 +0000 (Wed, 19 Nov 2008) Log Message: ----------- Set the stroke width to 1.0 in filled_polygon() - shade plots without transparency look ok with this setting. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2008-11-19 14:29:04 UTC (rev 8996) +++ trunk/drivers/cairo.c 2008-11-19 14:32:18 UTC (rev 8997) @@ -794,7 +794,7 @@ (double)pls->curcolor.b/255.0, (double)pls->curcolor.a); //(double)1.0); - cairo_set_line_width(aStream->cairoContext, 0.0); + cairo_set_line_width(aStream->cairoContext, 1.0); //cairo_push_group(aStream->cairoContext); cairo_fill_preserve(aStream->cairoContext); cairo_stroke(aStream->cairoContext); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sm...@us...> - 2009-01-13 12:58:56
|
Revision: 9297 http://plplot.svn.sourceforge.net/plplot/?rev=9297&view=rev Author: smekal Date: 2009-01-13 12:50:08 +0000 (Tue, 13 Jan 2009) Log Message: ----------- Drop the boundary stroke for partially opaque filled regions in the cairo driver similar to the change in the svg driver (Revision 9232). Revision Links: -------------- http://plplot.svn.sourceforge.net/plplot/?rev=9232&view=rev Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-01-13 10:38:23 UTC (rev 9296) +++ trunk/drivers/cairo.c 2009-01-13 12:50:08 UTC (rev 9297) @@ -793,13 +793,12 @@ (double)pls->curcolor.g/255.0, (double)pls->curcolor.b/255.0, (double)pls->curcolor.a); - //(double)1.0); cairo_set_line_width(aStream->cairoContext, 1.0); - //cairo_push_group(aStream->cairoContext); - cairo_fill_preserve(aStream->cairoContext); - cairo_stroke(aStream->cairoContext); - //cairo_pop_group_to_source(aStream->cairoContext); - //cairo_paint_with_alpha(aStream->cairoContext, (double)pls->curcolor.a); + if(pls->curcolor.a>0.99) { + cairo_fill_preserve(aStream->cairoContext); + cairo_stroke(aStream->cairoContext); + } else + cairo_fill(aStream->cairoContext); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-03-26 01:52:56
|
Revision: 9774 http://plplot.svn.sourceforge.net/plplot/?rev=9774&view=rev Author: airwin Date: 2009-03-26 01:52:28 +0000 (Thu, 26 Mar 2009) Log Message: ----------- Apparently in the old days libcairo implemented text clipping in an inefficient way, but my tests of -dev pngcairo for a reasonably modern version (1.6.4) of libcairo indicate only a 10 per cent slowdown if using text_clipping=1. Therefore, I have made text_clipping=1 the default so that text will always get clipped correctly by cairo unless the user specifically opts out with -drvopt text_clipping=0. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-03-25 02:14:26 UTC (rev 9773) +++ trunk/drivers/cairo.c 2009-03-26 01:52:28 UTC (rev 9774) @@ -708,18 +708,19 @@ aStream->cairoContext = NULL; aStream->downscale = downscale; - /* Set text clipping off as this makes the driver pretty slow */ - aStream->text_clipping = 0; - text_clipping = 0; + /* Set text clipping on by default since it makes little difference in + speed for a modern cairo stack.*/ + aStream->text_clipping = 1; + text_clipping = 1; text_anti_aliasing = 0; // use 'default' text aliasing by default graphics_anti_aliasing = 0; // use 'default' graphics aliasing by default /* Check for cairo specific options */ plParseDrvOpts(cairo_options); - /* Turn on text clipping if the user desires this */ - if(text_clipping){ - aStream->text_clipping = 1; + /* Turn off text clipping if the user desires this */ + if(!text_clipping){ + aStream->text_clipping = 0; } /* Record users desired text and graphics aliasing */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2009-04-25 03:09:15
|
Revision: 9850 http://plplot.svn.sourceforge.net/plplot/?rev=9850&view=rev Author: hbabcock Date: 2009-04-25 03:09:12 +0000 (Sat, 25 Apr 2009) Log Message: ----------- Remove some (commented out) code used during debugging. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-04-24 23:54:36 UTC (rev 9849) +++ trunk/drivers/cairo.c 2009-04-25 03:09:12 UTC (rev 9850) @@ -506,11 +506,6 @@ /* Move to the string reference point */ cairo_move_to(aStream->cairoContext, aStream->downscale * (double) args->x, aStream->downscale * (double) args->y); - /* Move to the string reference point */ - /* - cairo_move_to(aStream->cairoContext, aStream->refx, aStream->refy); - */ - /* Invert the coordinate system so that the text is drawn right side up */ cairoTransformMatrix = (cairo_matrix_t *) malloc (sizeof(cairo_matrix_t)); cairo_matrix_init(cairoTransformMatrix, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2009-05-02 03:23:15
|
Revision: 9877 http://plplot.svn.sourceforge.net/plplot/?rev=9877&view=rev Author: hbabcock Date: 2009-05-02 03:23:13 +0000 (Sat, 02 May 2009) Log Message: ----------- HPB for HMC. Change the line style for filled polygons so that render more smoothly. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-02 00:31:19 UTC (rev 9876) +++ trunk/drivers/cairo.c 2009-05-02 03:23:13 UTC (rev 9877) @@ -988,9 +988,18 @@ { int i; PLCairo *aStream; - + cairo_line_join_t old_line_join; + cairo_line_cap_t old_line_cap; + aStream = (PLCairo *)pls->dev; + /* Save the previous line drawing style */ + old_line_cap = cairo_get_line_cap(aStream->cairoContext); + old_line_join = cairo_get_line_join(aStream->cairoContext); + cairo_set_line_cap(aStream->cairoContext, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join(aStream->cairoContext, CAIRO_LINE_JOIN_BEVEL); + + /* Draw the polygons */ cairo_move_to(aStream->cairoContext, aStream->downscale * (double) xa[0], aStream->downscale * (double) ya[0]); for(i=1;i<npts;i++) cairo_line_to(aStream->cairoContext, aStream->downscale * (double) xa[i], aStream->downscale * (double) ya[i]); @@ -1005,6 +1014,10 @@ cairo_stroke(aStream->cairoContext); } else cairo_fill(aStream->cairoContext); + + /* Restore the previous line drawing style */ + cairo_set_line_cap(aStream->cairoContext, old_line_cap); + cairo_set_line_join(aStream->cairoContext, old_line_join); } /*--------------------------------------------------------------------- @@ -2051,4 +2064,3 @@ } #endif - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2009-06-17 03:54:29
|
Revision: 10053 http://plplot.svn.sourceforge.net/plplot/?rev=10053&view=rev Author: hbabcock Date: 2009-06-17 03:54:28 +0000 (Wed, 17 Jun 2009) Log Message: ----------- Correct y coordinate returned by X windows for differing origins. 0,0 in X windows is the upper left corner. 0,0 in PLplot is the bottom left corner. Thanks to Dmitri Gribenko for pointing out this bug. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-06-17 02:53:08 UTC (rev 10052) +++ trunk/drivers/cairo.c 2009-06-17 03:54:28 UTC (rev 10053) @@ -215,6 +215,7 @@ static void set_current_context(PLStream *); static void poly_line(PLStream *, short *, short *, PLINT); static void filled_polygon(PLStream *pls, short *xa, short *ya, PLINT npts); +static void arc(PLStream *, arc_struct *); static void rotate_cairo_surface(PLStream *, float, float, float, float, float, float); /* Rasterization of plotted material */ static void start_raster(PLStream*); @@ -486,6 +487,9 @@ case PLESC_END_RASTERIZE: /* End offscreen/rasterized rendering */ end_raster(pls); break; + case PLESC_ARC: /* Draw an arc, either filled or outline */ + arc(pls, (arc_struct *) ptr); + break; } } @@ -992,6 +996,7 @@ pls->alt_unicode = 1; /* Wants to handle unicode character by character */ pls->page = 0; pls->dev_fill0 = 1; /* Supports hardware solid fills */ + pls->dev_arc = 1; /* Supports driver-level arcs */ pls->plbuf_write = 1; /* Activate plot buffer */ @@ -1149,6 +1154,60 @@ } /*--------------------------------------------------------------------- + arc() + + Draws an arc, possibly filled. + ---------------------------------------------------------------------*/ + +void arc(PLStream *pls, arc_struct *arc_info) +{ + /* + TODO: + - Decide on a direction for increasing angles and make sure this Cairo + implementation matches the software/fallback implementation. + - Add clipping to viewport boundaries + */ + PLCairo *aStream; + double x, y, a, b; + double angle1, angle2; + double rotation; + + set_current_context(pls); + + aStream = (PLCairo *)pls->dev; + + /* Scale to the proper Cairo coordinates */ + x = aStream->downscale * arc_info->x; + y = aStream->downscale * arc_info->y; + a = aStream->downscale * arc_info->a; + b = aStream->downscale * arc_info->b; + + /* Degrees to radians */ + angle1 = arc_info->angle1 * M_PI / 180.0; + angle2 = arc_info->angle2 * M_PI / 180.0; + rotation = - arc_info->rotation * M_PI / 180.0; + + /* Make sure the arc is properly shaped */ + cairo_save(aStream->cairoContext); + cairo_translate(aStream->cairoContext, x, y); + cairo_rotate(aStream->cairoContext, rotation); + cairo_scale(aStream->cairoContext, a, b); + cairo_arc(aStream->cairoContext, 0.0, 0.0, 1.0, angle1, angle2); + cairo_restore(aStream->cairoContext); + cairo_set_source_rgba(aStream->cairoContext, + (double)pls->curcolor.r/255.0, + (double)pls->curcolor.g/255.0, + (double)pls->curcolor.b/255.0, + (double)pls->curcolor.a); + if (arc_info->fill) { + cairo_fill(aStream->cairoContext); + } + else { + cairo_stroke(aStream->cairoContext); + } +} + +/*--------------------------------------------------------------------- rotate_cairo_surface() Rotates the cairo surface to the appropriate orientation. @@ -1553,9 +1612,9 @@ gin->state = xButtonEvent->state; gin->button = xButtonEvent->button; gin->pX = event.xbutton.x; - gin->pY = event.xbutton.y; + gin->pY = pls->ylength - event.xbutton.y; gin->dX = (PLFLT)event.xbutton.x/((PLFLT)(pls->xlength)); - gin->dY = (PLFLT)event.xbutton.y/((PLFLT)(pls->ylength)); + gin->dY = (PLFLT)(pls->ylength - event.xbutton.y)/((PLFLT)(pls->ylength)); /* Switch back to normal cursor */ XUndefineCursor(aStream->XDisplay, aStream->XWindow); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-12-04 01:19:58
|
Revision: 10676 http://plplot.svn.sourceforge.net/plplot/?rev=10676&view=rev Author: airwin Date: 2009-12-04 01:19:51 +0000 (Fri, 04 Dec 2009) Log Message: ----------- Implement native gradient for all cairo devices. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-12-03 22:07:49 UTC (rev 10675) +++ trunk/drivers/cairo.c 2009-12-04 01:19:51 UTC (rev 10676) @@ -226,6 +226,7 @@ static void set_current_context( PLStream * ); static void poly_line( PLStream *, short *, short *, PLINT ); static void filled_polygon( PLStream *pls, short *xa, short *ya, PLINT npts ); +static void gradient( PLStream *pls, short *xa, short *ya, PLINT npts ); static void arc( PLStream *, arc_struct * ); static void rotate_cairo_surface( PLStream *, float, float, float, float, float, float ); /* Rasterization of plotted material */ @@ -478,6 +479,9 @@ case PLESC_FILL: /* filled polygon */ filled_polygon( pls, pls->dev_x, pls->dev_y, pls->dev_npts ); break; + case PLESC_GRADIENT: /* render a gradient within a polygon. */ + gradient( pls, pls->dev_x, pls->dev_y, pls->dev_npts ); + break; case PLESC_HAS_TEXT: if ( !pls->alt_unicode ) { @@ -1065,16 +1069,17 @@ downscale = 0.0; /* Stream setup */ - pls->termin = interactive; /* Interactive device */ - pls->dev_flush = 1; /* Handles flushes */ - pls->color = 1; /* Supports color */ - pls->dev_text = 1; /* Handles text */ - pls->dev_unicode = 1; /* Wants unicode text */ - pls->alt_unicode = 1; /* Wants to handle unicode character by character */ - pls->page = 0; - pls->dev_fill0 = 1; /* Supports hardware solid fills */ - pls->dev_arc = 1; /* Supports driver-level arcs */ - pls->plbuf_write = interactive; /* Activate plot buffer */ + pls->termin = interactive; /* Interactive device */ + pls->dev_flush = 1; /* Handles flushes */ + pls->color = 1; /* Supports color */ + pls->dev_text = 1; /* Handles text */ + pls->dev_unicode = 1; /* Wants unicode text */ + pls->alt_unicode = 1; /* Wants to handle unicode character by character */ + pls->page = 0; + pls->dev_fill0 = 1; /* Supports hardware solid fills */ + pls->dev_gradient = 1; /* driver renders gradient */ + pls->dev_arc = 1; /* Supports driver-level arcs */ + pls->plbuf_write = interactive; /* Activate plot buffer */ if ( pls->xlength <= 0 || pls->ylength <= 0 ) @@ -1244,6 +1249,50 @@ } /*--------------------------------------------------------------------- + * gradient() + * + * Render a gradient within a polygon. + * ---------------------------------------------------------------------*/ + +void gradient( PLStream *pls, short *xa, short *ya, PLINT npts ) +{ + int i; + PLCairo *aStream; + cairo_pattern_t *linear_gradient; + + aStream = (PLCairo *) pls->dev; + + /* These line properties make for a nicer looking polygon mesh */ + set_line_properties( aStream, CAIRO_LINE_JOIN_BEVEL, CAIRO_LINE_CAP_BUTT ); + + linear_gradient = cairo_pattern_create_linear( + aStream->downscale * pls->xgradient[0], + aStream->downscale * pls->ygradient[0], + aStream->downscale * pls->xgradient[1], + aStream->downscale * pls->ygradient[1] ); + + cairo_pattern_reference( linear_gradient ); + for ( i = 0; i < pls->ncol1; i++ ) + { + cairo_pattern_add_color_stop_rgba( linear_gradient, + (double) i / (double) ( pls->ncol1 - 1 ), + (double) pls->cmap1[i].r / 255., + (double) pls->cmap1[i].g / 255., + (double) pls->cmap1[i].b / 255., + (double) pls->cmap1[i].a ); + } + + /* Draw the polygon using the gradient. */ + + cairo_move_to( aStream->cairoContext, aStream->downscale * (double) xa[0], aStream->downscale * (double) ya[0] ); + for ( i = 1; i < npts; i++ ) + cairo_line_to( aStream->cairoContext, aStream->downscale * (double) xa[i], aStream->downscale * (double) ya[i] ); + cairo_set_source( aStream->cairoContext, linear_gradient ); + cairo_fill( aStream->cairoContext ); + cairo_pattern_destroy( linear_gradient ); +} + +/*--------------------------------------------------------------------- * set_clip() * * Set the clipping region to the plot window. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2010-03-21 20:36:39
|
Revision: 10878 http://plplot.svn.sourceforge.net/plplot/?rev=10878&view=rev Author: hbabcock Date: 2010-03-21 20:36:33 +0000 (Sun, 21 Mar 2010) Log Message: ----------- Implement interactive selection for the wincairo driver. This works the same way as for the xcairo driver, i.e. you have to press a key to record the current cursor position & exit locate mode. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2010-03-21 19:41:36 UTC (rev 10877) +++ trunk/drivers/cairo.c 2010-03-21 20:36:33 UTC (rev 10878) @@ -2705,7 +2705,7 @@ void plD_init_wincairo( PLStream * ); //void plD_bop_extcairo( PLStream * ); void plD_eop_wincairo( PLStream * ); -void plD_esc_extcairo( PLStream *, PLINT, void * ); +void plD_esc_wincairo( PLStream *, PLINT, void * ); void plD_tidy_wincairo( PLStream * ); /*--------------------------------------------------------------------- @@ -2812,6 +2812,45 @@ } /*--------------------------------------------------------------------- + * handle_locate() + * + * Handle getting the cursor location. + * ---------------------------------------------------------------------*/ + +void +handle_locate( PLStream *pls , PLGraphicsIn *gin) +{ + int located = 0; + PLCairo *aStream = (PLCairo *) pls->dev; + + while ( GetMessage( &aStream->msg, NULL, 0, 0 ) && !located) + { + TranslateMessage( &aStream->msg ); + + switch ( (int) aStream->msg.message ) + { + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + gin->state = 1; + gin->button = 1; + gin->pX = LOWORD(aStream->msg.lParam); + gin->pY = pls->ylength - HIWORD(aStream->msg.lParam); + gin->dX = (PLFLT) LOWORD(aStream->msg.lParam) / ((PLFLT) pls->xlength); + gin->dY = (PLFLT) (pls->ylength - HIWORD(aStream->msg.lParam)) / ((PLFLT) pls->ylength); + break; + case WM_CHAR: + gin->keysym = aStream->msg.wParam; + located = 1; + break; + + default: + DispatchMessage( &aStream->msg ); + break; + } + } +} + +/*--------------------------------------------------------------------- * dispatch_init_init() * * Initialize device dispatch table @@ -2833,7 +2872,7 @@ pdt->pl_eop = (plD_eop_fp) plD_eop_wincairo; pdt->pl_tidy = (plD_tidy_fp) plD_tidy_wincairo; pdt->pl_state = (plD_state_fp) plD_state_cairo; - pdt->pl_esc = (plD_esc_fp) plD_esc_cairo; + pdt->pl_esc = (plD_esc_fp) plD_esc_wincairo; } /*--------------------------------------------------------------------- @@ -2847,7 +2886,7 @@ PLCairo *aStream; /* Setup the PLStream and the font lookup table */ - aStream = stream_and_font_setup( pls, 0 ); + aStream = stream_and_font_setup( pls, 1 ); /* Save the pointer to the structure in the PLplot stream */ pls->dev = aStream; @@ -3043,6 +3082,7 @@ InvalidateRect( aStream->hwnd, NULL, TRUE ); break; case PLESC_GETC: + handle_locate(pls, (PLGraphicsIn*) ptr); break; default: plD_esc_cairo( pls, op, ptr ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-07-04 20:22:51
|
Revision: 11786 http://plplot.svn.sourceforge.net/plplot/?rev=11786&view=rev Author: airwin Date: 2011-07-04 20:22:44 +0000 (Mon, 04 Jul 2011) Log Message: ----------- Fix obvious bug in order in which superscript/subscript level is restored for open_span_tag. This fixes the cairo device driver vertical offset issues for test_superscript_subscript.py where FCI commands occur at non-zero superscript/subscript levels. However, this test case also shows an additional issue still remains for the cairo devices. If you change font in the middle of a superscript/subscript, it applies to the whole string, not just that part of the string beyond where the font change is applied. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2011-07-04 19:54:19 UTC (rev 11785) +++ trunk/drivers/cairo.c 2011-07-04 20:22:44 UTC (rev 11786) @@ -1068,6 +1068,7 @@ { unsigned char fontFamily, fontStyle, fontWeight; char openTag[TAG_LEN]; + int level; // Generate the font info for the open tag & concatenate this // onto the markup string. @@ -1085,22 +1086,14 @@ snprintf( openTag, TAG_LEN, "weight=\"%s\">", weightLookup[fontWeight] ); strncat( pangoMarkupString, openTag, MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); - // Move to the right sub/super-script level - if ( upDown > 0 ) + // Move to the right superscript/subscript level + for ( level = 0; level < upDown; level++ ) { - while ( upDown > 0 ) - { - upDown--; - strncat( pangoMarkupString, rise_span_tag( upDown, 1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); - } + strncat( pangoMarkupString, rise_span_tag( level, 1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } - if ( upDown < 0 ) + for ( level = 0; level > upDown; level-- ) { - while ( upDown < 0 ) - { - upDown++; - strncat( pangoMarkupString, rise_span_tag( upDown, -1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); - } + strncat( pangoMarkupString, rise_span_tag( level, -1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2011-07-06 17:29:00
|
Revision: 11798 http://plplot.svn.sourceforge.net/plplot/?rev=11798&view=rev Author: hbabcock Date: 2011-07-06 17:28:53 +0000 (Wed, 06 Jul 2011) Log Message: ----------- Fix offset bug in the standard unicode pathway. The problem was that aStream->fontSize is only set in the alt-unicode pathway so the local variable fontSize should be used instead for calculating the text Y offset. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2011-07-06 05:48:58 UTC (rev 11797) +++ trunk/drivers/cairo.c 2011-07-06 17:28:53 UTC (rev 11798) @@ -934,11 +934,11 @@ cairo_transform( aStream->cairoContext, cairoTransformMatrix ); free( cairoTransformMatrix ); - // printf("baseline (ps) %d %d\n", baseline, textYExtent); + // printf("baseline (ps) %d %d %f\n", baseline, textYExtent, aStream->fontSize); // Move to the text starting point cairo_rel_move_to( aStream->cairoContext, (double) ( -1.0 * args->just * (double) textXExtent ), - (double) 0.5 * aStream->fontSize - baseline / 1024.0); + (double) 0.5 * fontSize - baseline / 1024.0); // Render the text pango_cairo_show_layout( aStream->cairoContext, layout ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-07-07 20:56:36
|
Revision: 11799 http://plplot.svn.sourceforge.net/plplot/?rev=11799&view=rev Author: airwin Date: 2011-07-07 20:56:29 +0000 (Thu, 07 Jul 2011) Log Message: ----------- Use plP_script_scale to calculate superscript/subscript font scale factors and vertical offsets. The results are identical with the previous version of this code that made these calculations independently of plP_script_scale. Note plP_script_scale arguments must be stored externally, and for the alt_unicode approach this storage is necessarily in aStream to preserve the values of these arguments between plP_script_scale calls. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2011-07-06 17:28:53 UTC (rev 11798) +++ trunk/drivers/cairo.c 2011-07-07 20:56:29 UTC (rev 11799) @@ -107,6 +107,16 @@ short upDown; float fontSize; short closed; + + // These are arguments for plP_script_scale which must be retained + // in aStream for the alt_unicode approach. level has an + // identical meaning to upDown above, but it is incremented and + // decremented in plP_script_scale as well as other places in the + // code so the only safe thing to do is to treat level separately + // from upDown. + PLFLT old_sscale, sscale, old_soffset, soffset; + PLINT level; + #if defined ( PLD_xcairo ) cairo_surface_t *cairoSurface_X; cairo_t *cairoContext_X; @@ -240,7 +250,7 @@ static char *ucs4_to_pango_markup_format( PLUNICODE *, int, float ); static void open_span_tag( char *, PLUNICODE, float, int ); static void close_span_tag( char *, int ); -static char *rise_span_tag( int, int, float ); +static char *rise_span_tag( int, float, float, float ); // Graphics @@ -650,6 +660,7 @@ aStream = (PLCairo *) pls->dev; aStream->upDown = 0; + aStream->level = 0; aStream->pangoMarkupString = (char *) malloc( sizeof ( char ) * MAX_MARKUP_LEN ); // Calculate the font size (in points since DPI = 72). aStream->fontSize = pls->chrht * DPI / 25.4; @@ -715,10 +726,15 @@ if ( aStream->upDown < 0 ) { strncat( aStream->pangoMarkupString, "</span>", MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); + aStream->level++; } else { - strncat( aStream->pangoMarkupString, rise_span_tag( aStream->upDown, 1, aStream->fontSize ), MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); + plP_script_scale( TRUE, &aStream->level, + &aStream->old_sscale, &aStream->sscale, &aStream->old_soffset, &aStream->soffset ); + strncat( aStream->pangoMarkupString, + rise_span_tag( TRUE, aStream->fontSize, aStream->sscale, aStream->soffset ), + MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); } aStream->upDown++; break; @@ -726,10 +742,15 @@ if ( aStream->upDown > 0 ) { strncat( aStream->pangoMarkupString, "</span>", MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); + aStream->level--; } else { - strncat( aStream->pangoMarkupString, rise_span_tag( aStream->upDown, -1, aStream->fontSize ), MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); + plP_script_scale( FALSE, &aStream->level, + &aStream->old_sscale, &aStream->sscale, &aStream->old_soffset, &aStream->soffset ); + strncat( aStream->pangoMarkupString, + rise_span_tag( FALSE, aStream->fontSize, aStream->sscale, aStream->soffset ), + MAX_MARKUP_LEN - 1 - strlen( aStream->pangoMarkupString ) ); } aStream->upDown--; break; @@ -822,7 +843,7 @@ // printf("baseline %d %d\n", baseline, textYExtent); cairo_rel_move_to( aStream->cairoContext, (double) ( -1.0 * args->just * (double) textXExtent ), - (double) 0.5 * aStream->fontSize - baseline / 1024.0); + (double) 0.5 * aStream->fontSize - baseline / 1024.0 ); // Render the text pango_cairo_show_layout( aStream->cairoContext, layout ); @@ -937,8 +958,8 @@ // printf("baseline (ps) %d %d %f\n", baseline, textYExtent, aStream->fontSize); // Move to the text starting point cairo_rel_move_to( aStream->cairoContext, - (double) ( -1.0 * args->just * (double) textXExtent ), - (double) 0.5 * fontSize - baseline / 1024.0); + (double) ( -1.0 * args->just * (double) textXExtent ), + (double) 0.5 * fontSize - baseline / 1024.0 ); // Render the text pango_cairo_show_layout( aStream->cairoContext, layout ); @@ -968,6 +989,8 @@ PLUNICODE fci; char utf8[5]; char *pangoMarkupString; + PLFLT old_sscale, sscale, old_soffset, soffset; + PLINT level = 0.; // Will this be big enough? We might have lots of markup. pangoMarkupString = (char *) malloc( sizeof ( char ) * MAX_MARKUP_LEN ); @@ -1030,10 +1053,15 @@ if ( upDown < 0 ) { strncat( pangoMarkupString, "</span>", MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + level++; } else { - strncat( pangoMarkupString, rise_span_tag( upDown, 1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + plP_script_scale( TRUE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + strncat( pangoMarkupString, + rise_span_tag( TRUE, fontSize, sscale, soffset ), + MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } upDown++; } @@ -1042,10 +1070,15 @@ if ( upDown > 0 ) { strncat( pangoMarkupString, "</span>", MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + level--; } else { - strncat( pangoMarkupString, rise_span_tag( upDown, -1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + plP_script_scale( FALSE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + strncat( pangoMarkupString, + rise_span_tag( FALSE, fontSize, sscale, soffset ), + MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } upDown--; } @@ -1081,7 +1114,9 @@ { unsigned char fontFamily, fontStyle, fontWeight; char openTag[TAG_LEN]; - int level; + int upDown_level; + PLFLT old_sscale, sscale, old_soffset, soffset; + PLINT level = 0.; // Generate the font info for the open tag & concatenate this // onto the markup string. @@ -1101,13 +1136,21 @@ strncat( pangoMarkupString, openTag, MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); // Move to the right superscript/subscript level - for ( level = 0; level < upDown; level++ ) + for ( upDown_level = 0; upDown_level < upDown; upDown_level++ ) { - strncat( pangoMarkupString, rise_span_tag( level, 1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + plP_script_scale( TRUE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + strncat( pangoMarkupString, + rise_span_tag( TRUE, fontSize, sscale, soffset ), + MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } - for ( level = 0; level > upDown; level-- ) + for ( upDown_level = 0; upDown_level > upDown; upDown_level-- ) { - strncat( pangoMarkupString, rise_span_tag( level, -1, fontSize ), MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); + plP_script_scale( FALSE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + strncat( pangoMarkupString, + rise_span_tag( FALSE, fontSize, sscale, soffset ), + MAX_MARKUP_LEN - 1 - strlen( pangoMarkupString ) ); } } @@ -1150,23 +1193,18 @@ // rise_span_tag // // Create a rise span tag w/ appropriate font size & baseline offset +// fontSize is the baseline font size in points (1/72 of an inch), +// multiplier is a scaling factor for that font size for superscript +// or subscript, and rise is the vertical offset (in units of font +// size) for that superscript or subscript. + //-------------------------------------------------------------------------- -char *rise_span_tag( int level, int direction, float fontSize ) +char *rise_span_tag( int ifsuperscript, float fontSize, float multiplier, float rise ) { - int i; - float multiplier = 1.0; - float rise = 1.0; float offset; static char tag[100]; - for ( i = 0; i < abs( level ); i++ ) - { - multiplier = multiplier * 0.75; - rise += multiplier; - } - // Adjust multiplier to correspond to font scale for level. - multiplier = multiplier * 0.75; // http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html says // rise should be in units of 10000 em's, but empricial evidence shows // it is in units of 1024th of a point. Therefore, since FontSize @@ -1179,7 +1217,7 @@ // 0.5*(fontSize - superscript/subscript fontSize). offset = 1024. * 0.5 * fontSize * ( 1.0 - multiplier ); - if ( direction > 0 ) + if ( ifsuperscript ) { sprintf( tag, "<span rise=\"%d\" size=\"%d\">", (int) ( rise + offset ), (int) ( fontSize * 1024. * multiplier ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2011-08-16 19:38:41
|
Revision: 11886 http://plplot.svn.sourceforge.net/plplot/?rev=11886&view=rev Author: hbabcock Date: 2011-08-16 19:38:35 +0000 (Tue, 16 Aug 2011) Log Message: ----------- Remove (always false) local stream closed flag. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2011-08-16 19:19:05 UTC (rev 11885) +++ trunk/drivers/cairo.c 2011-08-16 19:38:35 UTC (rev 11886) @@ -106,7 +106,6 @@ char *pangoMarkupString; short upDown; float fontSize; - short closed; // These are arguments for plP_script_scale which must be retained // in aStream for the alt_unicode approach. level has an @@ -292,9 +291,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - // Do not use the external surface if the user says not to if ( !aStream->rasterize_image ) return; @@ -339,9 +335,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - // TODO FIXME: This should really only copy the used portion of the // offscreen pixmap. @@ -383,9 +376,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - // Some Cairo devices support delayed device setup (eg: xcairo with // external drawable and extcairo with an external context). if ( aStream->cairoContext == NULL ) @@ -435,9 +425,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - set_current_context( pls ); cairo_save( aStream->cairoContext ); @@ -464,9 +451,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - cairo_save( aStream->cairoContext ); set_line_properties( aStream, CAIRO_LINE_JOIN_BEVEL, CAIRO_LINE_CAP_BUTT ); @@ -490,9 +474,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - cairo_show_page( aStream->cairoContext ); } @@ -540,9 +521,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - switch ( op ) { case PLESC_FILL: // filled polygon @@ -1352,9 +1330,6 @@ aStream->set_background = set_background; aStream->image_buffering = image_buffering; - // set stream as not closed. - aStream->closed = 0; - return aStream; } @@ -1875,9 +1850,6 @@ plD_bop_cairo( pls ); - if ( aStream->closed ) - return; - if ( aStream->xdrawable_mode ) return; @@ -1905,9 +1877,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - // Blit the offscreen image to the X window. blit_to_x( pls, 0.0, 0.0, pls->xlength, pls->ylength ); @@ -2000,9 +1969,6 @@ aStream = (PLCairo *) pls->dev; - if ( aStream->closed ) - return; - switch ( op ) { case PLESC_FLUSH: // forced update of the window This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2012-11-23 09:58:44
|
Revision: 12279 http://plplot.svn.sourceforge.net/plplot/?rev=12279&view=rev Author: andrewross Date: 2012-11-23 09:58:38 +0000 (Fri, 23 Nov 2012) Log Message: ----------- Fix a memory leak in the cairo driver's handling of text. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2012-11-19 22:07:42 UTC (rev 12278) +++ trunk/drivers/cairo.c 2012-11-23 09:58:38 UTC (rev 12279) @@ -774,66 +774,67 @@ if ( pls->get_string_length ) { pls->string_length = (PLFLT) textXExtent * 25.4 / DPI; - return; } + else + { + // Set font aliasing + context = pango_layout_get_context( layout ); + cairoFontOptions = cairo_font_options_create(); + cairo_font_options_set_antialias( cairoFontOptions, aStream->text_anti_aliasing ); + pango_cairo_context_set_font_options( context, cairoFontOptions ); + pango_layout_context_changed( layout ); + cairo_font_options_destroy( cairoFontOptions ); - // Set font aliasing - context = pango_layout_get_context( layout ); - cairoFontOptions = cairo_font_options_create(); - cairo_font_options_set_antialias( cairoFontOptions, aStream->text_anti_aliasing ); - pango_cairo_context_set_font_options( context, cairoFontOptions ); - pango_layout_context_changed( layout ); - cairo_font_options_destroy( cairoFontOptions ); + // Save current transform matrix & clipping region + cairo_save( aStream->cairoContext ); - // Save current transform matrix & clipping region - cairo_save( aStream->cairoContext ); + // Set up the clipping region if we are doing text clipping + if ( aStream->text_clipping ) + { + set_clip( pls ); + } - // Set up the clipping region if we are doing text clipping - if ( aStream->text_clipping ) - { - set_clip( pls ); - } + // Move to the string reference point + cairo_move_to( aStream->cairoContext, aStream->downscale * (double) args->x, aStream->downscale * (double) args->y ); - // Move to the string reference point - cairo_move_to( aStream->cairoContext, aStream->downscale * (double) args->x, aStream->downscale * (double) args->y ); + // Invert the coordinate system so that the text is drawn right side up + cairoTransformMatrix = (cairo_matrix_t *) malloc( sizeof ( cairo_matrix_t ) ); + cairo_matrix_init( cairoTransformMatrix, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0 ); + cairo_transform( aStream->cairoContext, cairoTransformMatrix ); - // Invert the coordinate system so that the text is drawn right side up - cairoTransformMatrix = (cairo_matrix_t *) malloc( sizeof ( cairo_matrix_t ) ); - cairo_matrix_init( cairoTransformMatrix, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0 ); - cairo_transform( aStream->cairoContext, cairoTransformMatrix ); + // Extract rotation angle and shear from the PLplot tranformation matrix. + // Compute sines and cosines of the angles as an optimization. + plRotationShear( args->xform, &rotation, &shear, &stride ); + rotation -= pls->diorot * PI / 2.0; + cos_rot = cos( rotation ); + sin_rot = sin( rotation ); + cos_shear = cos( shear ); + sin_shear = sin( shear ); - // Extract rotation angle and shear from the PLplot tranformation matrix. - // Compute sines and cosines of the angles as an optimization. - plRotationShear( args->xform, &rotation, &shear, &stride ); - rotation -= pls->diorot * PI / 2.0; - cos_rot = cos( rotation ); - sin_rot = sin( rotation ); - cos_shear = cos( shear ); - sin_shear = sin( shear ); + // Apply the transform matrix + cairo_matrix_init( cairoTransformMatrix, + cos_rot * stride, + -sin_rot * stride, + cos_rot * sin_shear + sin_rot * cos_shear, + -sin_rot * sin_shear + cos_rot * cos_shear, + 0, 0 ); + cairo_transform( aStream->cairoContext, cairoTransformMatrix ); + free( cairoTransformMatrix ); - // Apply the transform matrix - cairo_matrix_init( cairoTransformMatrix, - cos_rot * stride, - -sin_rot * stride, - cos_rot * sin_shear + sin_rot * cos_shear, - -sin_rot * sin_shear + cos_rot * cos_shear, - 0, 0 ); - cairo_transform( aStream->cairoContext, cairoTransformMatrix ); - free( cairoTransformMatrix ); + // Move to the text starting point + // printf("baseline %d %d\n", baseline, textYExtent); + cairo_rel_move_to( aStream->cairoContext, + (double) ( -1.0 * args->just * (double) textXExtent ), + (double) 0.5 * aStream->fontSize - baseline / 1024.0 ); - // Move to the text starting point - // printf("baseline %d %d\n", baseline, textYExtent); - cairo_rel_move_to( aStream->cairoContext, - (double) ( -1.0 * args->just * (double) textXExtent ), - (double) 0.5 * aStream->fontSize - baseline / 1024.0 ); + // Render the text + pango_cairo_show_layout( aStream->cairoContext, layout ); - // Render the text - pango_cairo_show_layout( aStream->cairoContext, layout ); + // Restore the transform matrix to its state prior to the text transform. + cairo_restore( aStream->cairoContext ); + } - // Restore the transform matrix to its state prior to the text transform. - cairo_restore( aStream->cairoContext ); - - // Free the layout object and the markup string. + // Free the layout object and the markup string g_object_unref( layout ); free( aStream->pangoMarkupString ); } @@ -2335,9 +2336,9 @@ // Dimension units are pts = 1/72 inches from cairo documentation. aStream->cairoSurface = cairo_ps_surface_create_for_stream( (cairo_write_func_t) write_to_stream, pls->OutFile, (double) pls->ylength, (double) pls->xlength ); aStream->cairoContext = cairo_create( aStream->cairoSurface ); - + // Set the PS surface to be EPS. - cairo_ps_surface_set_eps ( aStream->cairoSurface , 1 ); + cairo_ps_surface_set_eps( aStream->cairoSurface, 1 ); // Save the pointer to the structure in the PLplot stream pls->dev = aStream; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2013-09-22 02:20:15
|
Revision: 12513 http://sourceforge.net/p/plplot/code/12513 Author: airwin Date: 2013-09-22 02:20:12 +0000 (Sun, 22 Sep 2013) Log Message: ----------- Style a previous commit. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2013-09-22 02:19:29 UTC (rev 12512) +++ trunk/drivers/cairo.c 2013-09-22 02:20:12 UTC (rev 12513) @@ -1922,10 +1922,10 @@ { // X Windows setup aStream->XDisplay = NULL; - if (pls->FileName != NULL) - aStream->XDisplay = XOpenDisplay( pls->FileName ); - else - aStream->XDisplay = XOpenDisplay( NULL ); + if ( pls->FileName != NULL ) + aStream->XDisplay = XOpenDisplay( pls->FileName ); + else + aStream->XDisplay = XOpenDisplay( NULL ); if ( aStream->XDisplay == NULL ) { plexit( "Failed to open X Windows display\n" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-05-05 00:04:55
|
Revision: 9898 http://plplot.svn.sourceforge.net/plplot/?rev=9898&view=rev Author: airwin Date: 2009-05-05 00:04:51 +0000 (Tue, 05 May 2009) Log Message: ----------- AWI for Hezekiah M. Carty. Add convenience functions to the Cairo driver for getting/setting line drawing styles. Set the style of line ends and joins when rendering both individual line segments and polylines. At high resolution this change gets rid of some nasty looking dents and gaps in pscairo line results (e.g., 4th page of example 16 viewed with gv at 8x magnification). Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-04 19:40:47 UTC (rev 9897) +++ trunk/drivers/cairo.c 2009-05-05 00:04:51 UTC (rev 9898) @@ -255,17 +255,41 @@ Draw a line in the current color from (x1,y1) to (x2,y2). ----------------------------------------------------------------------*/ +/*--------------------------------------------------------------------- + (get|set)_line_properties + + (Get|Set) the current Cairo line drawing properties. + ---------------------------------------------------------------------*/ +void get_line_properties(PLCairo *aStream, cairo_line_join_t *join, cairo_line_cap_t *cap) +{ + *join = cairo_get_line_join(aStream->cairoContext); + *cap = cairo_get_line_cap(aStream->cairoContext); +} + +void set_line_properties(PLCairo *aStream, cairo_line_join_t join, cairo_line_cap_t cap) +{ + cairo_set_line_join(aStream->cairoContext, join); + cairo_set_line_cap(aStream->cairoContext, cap); +} + void plD_line_cairo(PLStream *pls, short x1a, short y1a, short x2a, short y2a) { PLCairo *aStream; + cairo_line_join_t old_join; + cairo_line_cap_t old_cap; aStream = (PLCairo *)pls->dev; set_current_context(pls); + get_line_properties(aStream, &old_join, &old_cap); + set_line_properties(aStream, old_join, CAIRO_LINE_CAP_ROUND); + cairo_move_to(aStream->cairoContext, aStream->downscale * (double) x1a, aStream->downscale * (double) y1a); cairo_line_to(aStream->cairoContext, aStream->downscale * (double) x2a, aStream->downscale * (double) y2a); cairo_stroke(aStream->cairoContext); + + set_line_properties(aStream, old_join, old_cap); } /*--------------------------------------------------------------------- @@ -277,11 +301,18 @@ void plD_polyline_cairo(PLStream *pls, short *xa, short *ya, PLINT npts) { PLCairo *aStream; + cairo_line_join_t old_join; + cairo_line_cap_t old_cap; aStream = (PLCairo *)pls->dev; + get_line_properties(aStream, &old_join, &old_cap); + set_line_properties(aStream, CAIRO_LINE_JOIN_BEVEL, CAIRO_LINE_CAP_BUTT); + poly_line(pls, xa, ya, npts); cairo_stroke(aStream->cairoContext); + + set_line_properties(aStream, old_join, old_cap); } /*--------------------------------------------------------------------- @@ -994,11 +1025,11 @@ aStream = (PLCairo *)pls->dev; /* Save the previous line drawing style */ - old_line_cap = cairo_get_line_cap(aStream->cairoContext); - old_line_join = cairo_get_line_join(aStream->cairoContext); - cairo_set_line_cap(aStream->cairoContext, CAIRO_LINE_CAP_BUTT); - cairo_set_line_join(aStream->cairoContext, CAIRO_LINE_JOIN_BEVEL); + get_line_properties(aStream, &old_line_join, &old_line_cap); + /* These line properties make for a nicer looking polygon mesh */ + set_line_properties(aStream, CAIRO_LINE_JOIN_BEVEL, CAIRO_LINE_CAP_BUTT); + /* Draw the polygons */ cairo_move_to(aStream->cairoContext, aStream->downscale * (double) xa[0], aStream->downscale * (double) ya[0]); for(i=1;i<npts;i++) @@ -1016,8 +1047,7 @@ cairo_fill(aStream->cairoContext); /* Restore the previous line drawing style */ - cairo_set_line_cap(aStream->cairoContext, old_line_cap); - cairo_set_line_join(aStream->cairoContext, old_line_join); + set_line_properties(aStream, old_line_join, old_line_cap); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-05-05 17:52:37
|
Revision: 9920 http://plplot.svn.sourceforge.net/plplot/?rev=9920&view=rev Author: andrewross Date: 2009-05-05 17:52:13 +0000 (Tue, 05 May 2009) Log Message: ----------- Remove prompt to press <Return> to finish - this is a plplot standard anyway. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-05 15:17:48 UTC (rev 9919) +++ trunk/drivers/cairo.c 2009-05-05 17:52:13 UTC (rev 9920) @@ -1257,7 +1257,6 @@ XFlush(aStream->XDisplay); /* Loop, handling selected events, till the user elects to close the plot. */ - printf("Click on the plot and key <Return> to exit.\n"); event_mask = ButtonPressMask | KeyPressMask | ExposureMask; XSelectInput(aStream->XDisplay, aStream->XWindow, event_mask); while(!aStream->exit_event_loop){ @@ -1279,8 +1278,6 @@ } aStream->exit_event_loop = 0; - /* printf("Key <Return> to finish\n"); */ - /* getc(stdin); */ } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-05-06 11:18:54
|
Revision: 9932 http://plplot.svn.sourceforge.net/plplot/?rev=9932&view=rev Author: andrewross Date: 2009-05-06 11:18:25 +0000 (Wed, 06 May 2009) Log Message: ----------- ANR for HMC. Only apply cairo anti-aliasing improvements when anti-aliasing is enabled. This speeds up rendering on non-anti-alised surfaces. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-06 10:48:26 UTC (rev 9931) +++ trunk/drivers/cairo.c 2009-05-06 11:18:25 UTC (rev 9932) @@ -1021,7 +1021,8 @@ PLCairo *aStream; cairo_line_join_t old_line_join; cairo_line_cap_t old_line_cap; - + cairo_antialias_t aa_state; + aStream = (PLCairo *)pls->dev; /* Save the previous line drawing style */ @@ -1039,9 +1040,12 @@ (double)pls->curcolor.g/255.0, (double)pls->curcolor.b/255.0, (double)pls->curcolor.a); - cairo_set_line_width(aStream->cairoContext, 1.0); - if(pls->curcolor.a>0.99) { + aa_state = cairo_get_antialias(aStream->cairoContext); + /* Add an extra outline stroke to the polygon unless the plotting color is + not opaque or antialiasing is disabled. */ + if((pls->curcolor.a > 0.99) || (aa_state != CAIRO_ANTIALIAS_NONE)) { cairo_fill_preserve(aStream->cairoContext); + cairo_set_line_width(aStream->cairoContext, 1.0); cairo_stroke(aStream->cairoContext); } else cairo_fill(aStream->cairoContext); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-05-07 08:22:54
|
Revision: 9934 http://plplot.svn.sourceforge.net/plplot/?rev=9934&view=rev Author: andrewross Date: 2009-05-07 08:22:15 +0000 (Thu, 07 May 2009) Log Message: ----------- ANR for HMC. Fix "if" logic for previous cairo patch to improve non-anti-aliased shading. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-06 15:43:56 UTC (rev 9933) +++ trunk/drivers/cairo.c 2009-05-07 08:22:15 UTC (rev 9934) @@ -1043,7 +1043,7 @@ aa_state = cairo_get_antialias(aStream->cairoContext); /* Add an extra outline stroke to the polygon unless the plotting color is not opaque or antialiasing is disabled. */ - if((pls->curcolor.a > 0.99) || (aa_state != CAIRO_ANTIALIAS_NONE)) { + if((pls->curcolor.a > 0.99) && (aa_state != CAIRO_ANTIALIAS_NONE)) { cairo_fill_preserve(aStream->cairoContext); cairo_set_line_width(aStream->cairoContext, 1.0); cairo_stroke(aStream->cairoContext); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-05-09 10:06:03
|
Revision: 9946 http://plplot.svn.sourceforge.net/plplot/?rev=9946&view=rev Author: andrewross Date: 2009-05-09 10:05:54 +0000 (Sat, 09 May 2009) Log Message: ----------- ANR for HMC - patch to ensure that xcairo honours calls to plspause to disable the end of page pause. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-05-08 20:47:07 UTC (rev 9945) +++ trunk/drivers/cairo.c 2009-05-09 10:05:54 UTC (rev 9946) @@ -1260,6 +1260,10 @@ XFlush(aStream->XDisplay); + /* Only pause if nopause is unset. */ + if (pls->nopause) + aStream->exit_event_loop = 1; + /* Loop, handling selected events, till the user elects to close the plot. */ event_mask = ButtonPressMask | KeyPressMask | ExposureMask; XSelectInput(aStream->XDisplay, aStream->XWindow, event_mask); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |