From 690c1cb5ae08f03f88ba590cad518f94089b58d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 2 Jun 2018 02:54:38 +0200 Subject: [PATCH] Implement full path support with correct line caps (rounded|flat|squared) --- latex-output/latex-output.c | 21 +++++++++++++++++---- test-data/path.gds | Bin 256 -> 372 bytes test-data/path.pdf | Bin 1437 -> 1500 bytes test-data/path.tex | 20 +++++++++++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/latex-output/latex-output.c b/latex-output/latex-output.c index 618d4ff..2b85056 100644 --- a/latex-output/latex-output.c +++ b/latex-output/latex-output.c @@ -18,6 +18,7 @@ */ #include "latex-output.h" +#include #define WRITEOUT_BUFFER(buff) fwrite((buff)->str, sizeof(char), (buff)->len, tex_file) @@ -87,8 +88,7 @@ static void generate_graphics(FILE *tex_file, GList *graphics, GList *linfo, GSt struct gds_graphics *gfx; struct gds_point *pt; GdkRGBA color; - int width; - gchar *red, *green, *blue, *opacity; + static const char *line_caps[] = {"butt", "round", "rect"}; for (temp = graphics; temp != NULL; temp = temp->next) { gfx = (struct gds_graphics *)temp->data; @@ -108,9 +108,22 @@ static void generate_graphics(FILE *tex_file, GList *graphics, GList *linfo, GSt g_string_printf(buffer, "cycle;\n"); WRITEOUT_BUFFER(buffer); } else if(gfx->gfx_type == GRAPHIC_PATH) { - g_string_printf(buffer, "\\draw[line width=%lf pt, draw={c%d}, opacity={%lf}] ", - gfx->width_absolute/1000.0, gfx->layer, gfx->layer, color.alpha); + + if (g_list_length(gfx->vertices) < 2) { + printf("Cannot write path with less than 2 points\n"); + break; + } + + if (gfx->path_render_type < 0 || gfx->path_render_type > 2) { + printf("Path type unrecognized. Setting to 'flushed'\n"); + gfx->path_render_type = 0; + } + + g_string_printf(buffer, "\\draw[line width=%lf pt, draw={c%d}, opacity={%lf}, cap=%s] ", + gfx->width_absolute/1000.0, gfx->layer, color.alpha, + line_caps[gfx->path_render_type]); WRITEOUT_BUFFER(buffer); + /* Append vertices */ for (temp_vertex = gfx->vertices; temp_vertex != NULL; temp_vertex = temp_vertex->next) { pt = (struct gds_point *)temp_vertex->data; diff --git a/test-data/path.gds b/test-data/path.gds index 7c21667ab6ad3039fdb5f3e0e0155f61fa722713..7599be9b1984add6421c84bb0ef29dc7ecd68143 100644 GIT binary patch literal 372 zcmZQzV_;&6V31*CVt)i;GcYljFfb#t83dTvf>QHRQj2s$Qj1F%7(|#^?HoJJy^k&b zVCk|$f5Ggi5C$1mJo?$#0uoCy)B^HzD%11x7+5$N7}$837#JDY_?Q?N7}yk<7?>D1 z_?a0P7~z{bGD6u}_F$i)7LfsKKYL6kwAK@OQcQAt-An{bl8vWfun|Np=37#Nt2 j|NsBrnt_3F<^TWxpZ@><{}KZO^Ys7!|6Q1@!RP}31~47P diff --git a/test-data/path.pdf b/test-data/path.pdf index 3947238196aa2abf30f5afc11fae95271d41a9e8..078a01afd2e240a696a23942cd505c14815e76f6 100644 GIT binary patch delta 931 zcmbQseTRF3GPALv@nl(6&HAI0z5SRCdD^~Pw(4KFQuye|JxBHsPR@mgI0ICdb&GwB zD5!n2B|xrqoxtLm6<>}Q?z=zPQGzj1?t_PqnUadf#0bXZm0YKND_Bm?aQ5ex*vxg9 zdq>XqFIf!L9BJv!=X+jEmf+khR8e&_ZR4~#Mlt8>=T&d|bh-WGyOhe=O5eEakEL@= zJ~uh>Qs;^TY3mbnrUo~fvP1_Py;6Kx`}CKC>E$qiGyySzbNcN3-TLn?-IHDEaob9# zM{C>MfVA@Fpp~WVcaIkQI(bwvokd($BT?)eWsy=Gcdpb#KXW8e8 zKi_8-x_4g*D&^DiEt6+HxnR$#pr__>j+VOj(tQ^FXPhH*L(DAiB=?4#%C`p!lkIIh zLa&_6nSD#D`ta6mzj(_|@3#N5e}Ck+TKWFJh3kc6wl`09V@zN-GB7eVHZqvJmQe=I zzQFjSezt=^+xy?z_mZnSu5)j>GO0C7_;$P5!A)~x1lo1yDJ?m&Aa(Ms|NAy`Z;Vm( zy}&eU?(@0lIg)E!MU;=V@P`;2G-q*SX$?5aA>jApX+FcfN2`>|@S8Qx z=X-m&IoZx6?e?ol6>NIO#n&cTen{A})8f|EYgyg_&G$`oC8LY4?KpqR{OL5EqOv&s zz>bC6xBdESJ9p*98}{`D;V*g8XSY9?81%n+$}gdh3x8G2%k%xp{d1>BrSJJt&)HY^ zRM>7j*Zbz=SDh#QRreL=?`UfO6?Y;e`tOC1Mbr13X)iCln6ZDQsJq0pr`tmcs>)98 ze0QSXBW?ScnYJ^-6Sl=DJ^!E6Jx8@W{a)*y^)JuYGZlx1m_D0Qy~1PC<_ziFth|@X zQGS(O+tN?9id}^UlY=yL>x(aso?EfQgBbfun)BrMa20lYyg&xuu(-iJ769 zv5B#ho3p8ftDS-kK_#(V`aY?7=_MHoCYF`-USzN^>iA5z9MX70AhDHWPT&k+B{%%|V D<5Q)P delta 874 zcmcb^J(qieGP9A1<>Xja&HC0!-hRx6JZ;}CkJdLXt5cCoXP3ROMnG#0LugXOmX701 zuOBZFQeF_c_()%!b)UUzi)4%D1=jOzAjlZ4o(DexPSiNAWxYV8LOV(7(ICtD`&!1npb^C7F7A~`vGi%*mg&cux9NWv2i*MVP?784+D&5zj8Em@$oJ;Xy zMQx*!Lw<&F{})-fADiX%dZtf*ipWl}%qSt>OV!^V1+8fgICagnYihCFtYs=;v%dY9 zpH#Ua_4&l>dHR1l^83y5mvE)#r4*MGP3~okWH&T2G%+_anf#Vf2F?~>`cZ$&L7?sZ zZ|!@@)f%Uzma}n2va(w&=@gt0qa$yYmK5o=aqGP$AKqKVg zahFg$)WRQPa8SZgz$tNw5{rcIkEi)8O9lGYNhI0{UDkZ^?utOltThVnzvv&D9=q$` zx8V6FYFhW?mwL|ddn{4-r@Us~yRw&W>+3}_4_WR!!rNlZv~H{Mp7<|<*L8%AR`O5d z+tw;&<#B>{>(_406;J#A9MyfRZM(kzgp451p#&aN3D!V8i?+m#uP-i)ttdG2{8o;1 ztibsLscGk;jM(LR%*EYz--^oRT=jkSF2!W+b5f;|KbPH@*&ax1Tgq zisx@VbNSRW1=}h)44_GvMO;dX{IaR;)Rz`8h!Dc=|=@TOoHYrEB@eo)SC0%xwN^ ztDe@K^KIwbbH2TuK6wF4PJn@-fs3()n}xZhfs?bdnX!?Rk*SHHp}D1jnX{3RnSq^x z4M8QbT>3t#dFdq?3Z@2=V_40-+}WRe(LX5Eqa(S)Q8R3