Fossil SCM
New pikchr.c with improved text layout for cylinders.
Commit
7c6656595789c8265942df07cc59e883f5afa581b4d6e4bb93b489e7b5526ee2
Parent
b4e50e9ace20f5a…
1 file changed
+44
-14
+44
-14
| --- src/pikchr.c | ||
| +++ src/pikchr.c | ||
| @@ -3756,11 +3756,11 @@ | ||
| 3756 | 3756 | pik_append_arc(p, rad, rad, x0, y2); |
| 3757 | 3757 | if( y2>y1 ) pik_append_xy(p, "L", x0, y1); |
| 3758 | 3758 | pik_append_arc(p, rad, rad, x1, y0); |
| 3759 | 3759 | pik_append(p,"Z\" ",-1); |
| 3760 | 3760 | } |
| 3761 | - pik_append_style(p,pObj,1); | |
| 3761 | + pik_append_style(p,pObj,3); | |
| 3762 | 3762 | pik_append(p,"\" />\n", -1); |
| 3763 | 3763 | } |
| 3764 | 3764 | pik_append_txt(p, pObj, 0); |
| 3765 | 3765 | } |
| 3766 | 3766 | |
| @@ -3818,11 +3818,11 @@ | ||
| 3818 | 3818 | PPoint pt = pObj->ptAt; |
| 3819 | 3819 | if( pObj->sw>0.0 ){ |
| 3820 | 3820 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3821 | 3821 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3822 | 3822 | pik_append_dis(p," r=\"", r, "\" "); |
| 3823 | - pik_append_style(p,pObj,1); | |
| 3823 | + pik_append_style(p,pObj,3); | |
| 3824 | 3824 | pik_append(p,"\" />\n", -1); |
| 3825 | 3825 | } |
| 3826 | 3826 | pik_append_txt(p, pObj, 0); |
| 3827 | 3827 | } |
| 3828 | 3828 | |
| @@ -3848,11 +3848,11 @@ | ||
| 3848 | 3848 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y-h2+rad); |
| 3849 | 3849 | pik_append_xy(p,"L", pt.x+w2,pt.y+h2-rad); |
| 3850 | 3850 | pik_append_arc(p,w2,rad,pt.x-w2,pt.y+h2-rad); |
| 3851 | 3851 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y+h2-rad); |
| 3852 | 3852 | pik_append(p,"\" ",-1); |
| 3853 | - pik_append_style(p,pObj,1); | |
| 3853 | + pik_append_style(p,pObj,3); | |
| 3854 | 3854 | pik_append(p,"\" />\n", -1); |
| 3855 | 3855 | } |
| 3856 | 3856 | pik_append_txt(p, pObj, 0); |
| 3857 | 3857 | } |
| 3858 | 3858 | static PPoint cylinderOffset(Pik *p, PObj *pObj, int cp){ |
| @@ -3910,11 +3910,11 @@ | ||
| 3910 | 3910 | PPoint pt = pObj->ptAt; |
| 3911 | 3911 | if( pObj->sw>0.0 ){ |
| 3912 | 3912 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3913 | 3913 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3914 | 3914 | pik_append_dis(p," r=\"", r, "\""); |
| 3915 | - pik_append_style(p,pObj,1); | |
| 3915 | + pik_append_style(p,pObj,2); | |
| 3916 | 3916 | pik_append(p,"\" />\n", -1); |
| 3917 | 3917 | } |
| 3918 | 3918 | pik_append_txt(p, pObj, 0); |
| 3919 | 3919 | } |
| 3920 | 3920 | |
| @@ -3969,11 +3969,11 @@ | ||
| 3969 | 3969 | if( pObj->sw>0.0 ){ |
| 3970 | 3970 | pik_append_x(p,"<ellipse cx=\"", pt.x, "\""); |
| 3971 | 3971 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3972 | 3972 | pik_append_dis(p," rx=\"", w/2.0, "\""); |
| 3973 | 3973 | pik_append_dis(p," ry=\"", h/2.0, "\" "); |
| 3974 | - pik_append_style(p,pObj,1); | |
| 3974 | + pik_append_style(p,pObj,3); | |
| 3975 | 3975 | pik_append(p,"\" />\n", -1); |
| 3976 | 3976 | } |
| 3977 | 3977 | pik_append_txt(p, pObj, 0); |
| 3978 | 3978 | } |
| 3979 | 3979 | |
| @@ -4081,11 +4081,11 @@ | ||
| 4081 | 4081 | pik_append(p,"Z",1); |
| 4082 | 4082 | }else{ |
| 4083 | 4083 | pObj->fill = -1.0; |
| 4084 | 4084 | } |
| 4085 | 4085 | pik_append(p,"\" ",-1); |
| 4086 | - pik_append_style(p,pObj,pObj->bClose); | |
| 4086 | + pik_append_style(p,pObj,pObj->bClose?3:0); | |
| 4087 | 4087 | pik_append(p,"\" />\n", -1); |
| 4088 | 4088 | } |
| 4089 | 4089 | pik_append_txt(p, pObj, 0); |
| 4090 | 4090 | } |
| 4091 | 4091 | |
| @@ -4181,11 +4181,11 @@ | ||
| 4181 | 4181 | pik_append(p,"Z",1); |
| 4182 | 4182 | }else{ |
| 4183 | 4183 | pObj->fill = -1.0; |
| 4184 | 4184 | } |
| 4185 | 4185 | pik_append(p,"\" ",-1); |
| 4186 | - pik_append_style(p,pObj,pObj->bClose); | |
| 4186 | + pik_append_style(p,pObj,pObj->bClose?3:0); | |
| 4187 | 4187 | pik_append(p,"\" />\n", -1); |
| 4188 | 4188 | } |
| 4189 | 4189 | static void splineRender(Pik *p, PObj *pObj){ |
| 4190 | 4190 | if( pObj->sw>0.0 ){ |
| 4191 | 4191 | int n = pObj->nPath; |
| @@ -4569,10 +4569,13 @@ | ||
| 4569 | 4569 | pik_append(p, buf, -1); |
| 4570 | 4570 | } |
| 4571 | 4571 | |
| 4572 | 4572 | /* |
| 4573 | 4573 | ** Invert the RGB color so that it is appropriate for dark mode. |
| 4574 | +** Variable x hold the initial color. The color is intended for use | |
| 4575 | +** as a background color if isBg is true, and as a foreground color | |
| 4576 | +** if isBg is false. | |
| 4574 | 4577 | */ |
| 4575 | 4578 | static int pik_color_to_dark_mode(int x, int isBg){ |
| 4576 | 4579 | int r, g, b; |
| 4577 | 4580 | int mn, mx; |
| 4578 | 4581 | x = 0xffffff - x; |
| @@ -4634,10 +4637,18 @@ | ||
| 4634 | 4637 | char buf[200]; |
| 4635 | 4638 | snprintf(buf, sizeof(buf)-1, "%s%g%s", z1, p->rScale*v, z2); |
| 4636 | 4639 | buf[sizeof(buf)-1] = 0; |
| 4637 | 4640 | pik_append(p, buf, -1); |
| 4638 | 4641 | } |
| 4642 | + | |
| 4643 | +/* Append a color specification to the output. | |
| 4644 | +** | |
| 4645 | +** In PIKCHR_DARK_MODE, the color is inverted. The "bg" flags indicates that | |
| 4646 | +** the color is intended for use as a background color if true, or as a | |
| 4647 | +** foreground color if false. The distinction only matters for color | |
| 4648 | +** inversions in PIKCHR_DARK_MODE. | |
| 4649 | +*/ | |
| 4639 | 4650 | static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){ |
| 4640 | 4651 | char buf[200]; |
| 4641 | 4652 | int x = (int)v; |
| 4642 | 4653 | int r, g, b; |
| 4643 | 4654 | if( x==0 && p->fgcolor>0 && !bg ){ |
| @@ -4668,25 +4679,39 @@ | ||
| 4668 | 4679 | pik_append(p, buf, -1); |
| 4669 | 4680 | } |
| 4670 | 4681 | |
| 4671 | 4682 | /* Append a style="..." text. But, leave the quote unterminated, in case |
| 4672 | 4683 | ** the caller wants to add some more. |
| 4684 | +** | |
| 4685 | +** eFill is non-zero to fill in the background, or 0 if no fill should | |
| 4686 | +** occur. Non-zero values of eFill determine the "bg" flag to pik_append_clr() | |
| 4687 | +** for cases when pObj->fill==pObj->color | |
| 4688 | +** | |
| 4689 | +** 1 fill is background, and color is foreground. | |
| 4690 | +** 2 fill and color are both foreground. (Used by "dot" objects) | |
| 4691 | +** 3 fill and color are both background. (Used by most other objs) | |
| 4673 | 4692 | */ |
| 4674 | -static void pik_append_style(Pik *p, PObj *pObj, int bFill){ | |
| 4693 | +static void pik_append_style(Pik *p, PObj *pObj, int eFill){ | |
| 4694 | + int clrIsBg = 0; | |
| 4675 | 4695 | pik_append(p, " style=\"", -1); |
| 4676 | - if( pObj->fill>=0 && bFill ){ | |
| 4677 | - pik_append_clr(p, "fill:", pObj->fill, ";",1); | |
| 4696 | + if( pObj->fill>=0 && eFill ){ | |
| 4697 | + int fillIsBg = 1; | |
| 4698 | + if( pObj->fill==pObj->color ){ | |
| 4699 | + if( eFill==2 ) fillIsBg = 0; | |
| 4700 | + if( eFill==3 ) clrIsBg = 1; | |
| 4701 | + } | |
| 4702 | + pik_append_clr(p, "fill:", pObj->fill, ";", fillIsBg); | |
| 4678 | 4703 | }else{ |
| 4679 | 4704 | pik_append(p,"fill:none;",-1); |
| 4680 | 4705 | } |
| 4681 | 4706 | if( pObj->sw>0.0 && pObj->color>=0.0 ){ |
| 4682 | 4707 | PNum sw = pObj->sw; |
| 4683 | 4708 | pik_append_dis(p, "stroke-width:", sw, ";"); |
| 4684 | 4709 | if( pObj->nPath>2 && pObj->rad<=pObj->sw ){ |
| 4685 | 4710 | pik_append(p, "stroke-linejoin:round;", -1); |
| 4686 | 4711 | } |
| 4687 | - pik_append_clr(p, "stroke:",pObj->color,";",0); | |
| 4712 | + pik_append_clr(p, "stroke:",pObj->color,";",clrIsBg); | |
| 4688 | 4713 | if( pObj->dotted>0.0 ){ |
| 4689 | 4714 | PNum v = pObj->dotted; |
| 4690 | 4715 | if( sw<2.1/p->rScale ) sw = 2.1/p->rScale; |
| 4691 | 4716 | pik_append_dis(p,"stroke-dasharray:",sw,""); |
| 4692 | 4717 | pik_append_dis(p,",",v,";"); |
| @@ -4802,10 +4827,11 @@ | ||
| 4802 | 4827 | PNum ha2 = 0.0; /* Height of the top row of text */ |
| 4803 | 4828 | PNum ha1 = 0.0; /* Height of the second "above" row */ |
| 4804 | 4829 | PNum hc = 0.0; /* Height of the center row */ |
| 4805 | 4830 | PNum hb1 = 0.0; /* Height of the first "below" row of text */ |
| 4806 | 4831 | PNum hb2 = 0.0; /* Height of the second "below" row */ |
| 4832 | + PNum yBase = 0.0; | |
| 4807 | 4833 | int n, i, nz; |
| 4808 | 4834 | PNum x, y, orig_y, s; |
| 4809 | 4835 | const char *z; |
| 4810 | 4836 | PToken *aTxt; |
| 4811 | 4837 | unsigned allMask = 0; |
| @@ -4815,11 +4841,15 @@ | ||
| 4815 | 4841 | aTxt = pObj->aTxt; |
| 4816 | 4842 | n = pObj->nTxt; |
| 4817 | 4843 | pik_txt_vertical_layout(pObj); |
| 4818 | 4844 | x = pObj->ptAt.x; |
| 4819 | 4845 | for(i=0; i<n; i++) allMask |= pObj->aTxt[i].eCode; |
| 4820 | - if( pObj->type->isLine ) hc = pObj->sw*1.5; | |
| 4846 | + if( pObj->type->isLine ){ | |
| 4847 | + hc = pObj->sw*1.5; | |
| 4848 | + }else if( pObj->type->xInit==cylinderInit ){ | |
| 4849 | + yBase = -0.75*pObj->rad; | |
| 4850 | + } | |
| 4821 | 4851 | if( allMask & TP_CENTER ){ |
| 4822 | 4852 | for(i=0; i<n; i++){ |
| 4823 | 4853 | if( pObj->aTxt[i].eCode & TP_CENTER ){ |
| 4824 | 4854 | s = pik_font_scale(pObj->aTxt+i); |
| 4825 | 4855 | if( hc<s*p->charHeight ) hc = s*p->charHeight; |
| @@ -4866,11 +4896,11 @@ | ||
| 4866 | 4896 | for(i=0; i<n; i++){ |
| 4867 | 4897 | PToken *t = &aTxt[i]; |
| 4868 | 4898 | PNum xtraFontScale = pik_font_scale(t); |
| 4869 | 4899 | PNum nx = 0; |
| 4870 | 4900 | orig_y = pObj->ptAt.y; |
| 4871 | - y = 0; | |
| 4901 | + y = yBase; | |
| 4872 | 4902 | if( t->eCode & TP_ABOVE2 ) y += 0.5*hc + ha1 + 0.5*ha2; |
| 4873 | 4903 | if( t->eCode & TP_ABOVE ) y += 0.5*hc + 0.5*ha1; |
| 4874 | 4904 | if( t->eCode & TP_BELOW ) y -= 0.5*hc + 0.5*hb1; |
| 4875 | 4905 | if( t->eCode & TP_BELOW2 ) y -= 0.5*hc + hb1 + 0.5*hb2; |
| 4876 | 4906 | if( t->eCode & TP_LJUST ) nx -= jw; |
| @@ -7852,6 +7882,6 @@ | ||
| 7852 | 7882 | |
| 7853 | 7883 | |
| 7854 | 7884 | #endif /* PIKCHR_TCL */ |
| 7855 | 7885 | |
| 7856 | 7886 | |
| 7857 | -#line 7882 "pikchr.c" | |
| 7887 | +#line 7912 "pikchr.c" | |
| 7858 | 7888 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -3756,11 +3756,11 @@ | |
| 3756 | pik_append_arc(p, rad, rad, x0, y2); |
| 3757 | if( y2>y1 ) pik_append_xy(p, "L", x0, y1); |
| 3758 | pik_append_arc(p, rad, rad, x1, y0); |
| 3759 | pik_append(p,"Z\" ",-1); |
| 3760 | } |
| 3761 | pik_append_style(p,pObj,1); |
| 3762 | pik_append(p,"\" />\n", -1); |
| 3763 | } |
| 3764 | pik_append_txt(p, pObj, 0); |
| 3765 | } |
| 3766 | |
| @@ -3818,11 +3818,11 @@ | |
| 3818 | PPoint pt = pObj->ptAt; |
| 3819 | if( pObj->sw>0.0 ){ |
| 3820 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3821 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3822 | pik_append_dis(p," r=\"", r, "\" "); |
| 3823 | pik_append_style(p,pObj,1); |
| 3824 | pik_append(p,"\" />\n", -1); |
| 3825 | } |
| 3826 | pik_append_txt(p, pObj, 0); |
| 3827 | } |
| 3828 | |
| @@ -3848,11 +3848,11 @@ | |
| 3848 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y-h2+rad); |
| 3849 | pik_append_xy(p,"L", pt.x+w2,pt.y+h2-rad); |
| 3850 | pik_append_arc(p,w2,rad,pt.x-w2,pt.y+h2-rad); |
| 3851 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y+h2-rad); |
| 3852 | pik_append(p,"\" ",-1); |
| 3853 | pik_append_style(p,pObj,1); |
| 3854 | pik_append(p,"\" />\n", -1); |
| 3855 | } |
| 3856 | pik_append_txt(p, pObj, 0); |
| 3857 | } |
| 3858 | static PPoint cylinderOffset(Pik *p, PObj *pObj, int cp){ |
| @@ -3910,11 +3910,11 @@ | |
| 3910 | PPoint pt = pObj->ptAt; |
| 3911 | if( pObj->sw>0.0 ){ |
| 3912 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3913 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3914 | pik_append_dis(p," r=\"", r, "\""); |
| 3915 | pik_append_style(p,pObj,1); |
| 3916 | pik_append(p,"\" />\n", -1); |
| 3917 | } |
| 3918 | pik_append_txt(p, pObj, 0); |
| 3919 | } |
| 3920 | |
| @@ -3969,11 +3969,11 @@ | |
| 3969 | if( pObj->sw>0.0 ){ |
| 3970 | pik_append_x(p,"<ellipse cx=\"", pt.x, "\""); |
| 3971 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3972 | pik_append_dis(p," rx=\"", w/2.0, "\""); |
| 3973 | pik_append_dis(p," ry=\"", h/2.0, "\" "); |
| 3974 | pik_append_style(p,pObj,1); |
| 3975 | pik_append(p,"\" />\n", -1); |
| 3976 | } |
| 3977 | pik_append_txt(p, pObj, 0); |
| 3978 | } |
| 3979 | |
| @@ -4081,11 +4081,11 @@ | |
| 4081 | pik_append(p,"Z",1); |
| 4082 | }else{ |
| 4083 | pObj->fill = -1.0; |
| 4084 | } |
| 4085 | pik_append(p,"\" ",-1); |
| 4086 | pik_append_style(p,pObj,pObj->bClose); |
| 4087 | pik_append(p,"\" />\n", -1); |
| 4088 | } |
| 4089 | pik_append_txt(p, pObj, 0); |
| 4090 | } |
| 4091 | |
| @@ -4181,11 +4181,11 @@ | |
| 4181 | pik_append(p,"Z",1); |
| 4182 | }else{ |
| 4183 | pObj->fill = -1.0; |
| 4184 | } |
| 4185 | pik_append(p,"\" ",-1); |
| 4186 | pik_append_style(p,pObj,pObj->bClose); |
| 4187 | pik_append(p,"\" />\n", -1); |
| 4188 | } |
| 4189 | static void splineRender(Pik *p, PObj *pObj){ |
| 4190 | if( pObj->sw>0.0 ){ |
| 4191 | int n = pObj->nPath; |
| @@ -4569,10 +4569,13 @@ | |
| 4569 | pik_append(p, buf, -1); |
| 4570 | } |
| 4571 | |
| 4572 | /* |
| 4573 | ** Invert the RGB color so that it is appropriate for dark mode. |
| 4574 | */ |
| 4575 | static int pik_color_to_dark_mode(int x, int isBg){ |
| 4576 | int r, g, b; |
| 4577 | int mn, mx; |
| 4578 | x = 0xffffff - x; |
| @@ -4634,10 +4637,18 @@ | |
| 4634 | char buf[200]; |
| 4635 | snprintf(buf, sizeof(buf)-1, "%s%g%s", z1, p->rScale*v, z2); |
| 4636 | buf[sizeof(buf)-1] = 0; |
| 4637 | pik_append(p, buf, -1); |
| 4638 | } |
| 4639 | static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){ |
| 4640 | char buf[200]; |
| 4641 | int x = (int)v; |
| 4642 | int r, g, b; |
| 4643 | if( x==0 && p->fgcolor>0 && !bg ){ |
| @@ -4668,25 +4679,39 @@ | |
| 4668 | pik_append(p, buf, -1); |
| 4669 | } |
| 4670 | |
| 4671 | /* Append a style="..." text. But, leave the quote unterminated, in case |
| 4672 | ** the caller wants to add some more. |
| 4673 | */ |
| 4674 | static void pik_append_style(Pik *p, PObj *pObj, int bFill){ |
| 4675 | pik_append(p, " style=\"", -1); |
| 4676 | if( pObj->fill>=0 && bFill ){ |
| 4677 | pik_append_clr(p, "fill:", pObj->fill, ";",1); |
| 4678 | }else{ |
| 4679 | pik_append(p,"fill:none;",-1); |
| 4680 | } |
| 4681 | if( pObj->sw>0.0 && pObj->color>=0.0 ){ |
| 4682 | PNum sw = pObj->sw; |
| 4683 | pik_append_dis(p, "stroke-width:", sw, ";"); |
| 4684 | if( pObj->nPath>2 && pObj->rad<=pObj->sw ){ |
| 4685 | pik_append(p, "stroke-linejoin:round;", -1); |
| 4686 | } |
| 4687 | pik_append_clr(p, "stroke:",pObj->color,";",0); |
| 4688 | if( pObj->dotted>0.0 ){ |
| 4689 | PNum v = pObj->dotted; |
| 4690 | if( sw<2.1/p->rScale ) sw = 2.1/p->rScale; |
| 4691 | pik_append_dis(p,"stroke-dasharray:",sw,""); |
| 4692 | pik_append_dis(p,",",v,";"); |
| @@ -4802,10 +4827,11 @@ | |
| 4802 | PNum ha2 = 0.0; /* Height of the top row of text */ |
| 4803 | PNum ha1 = 0.0; /* Height of the second "above" row */ |
| 4804 | PNum hc = 0.0; /* Height of the center row */ |
| 4805 | PNum hb1 = 0.0; /* Height of the first "below" row of text */ |
| 4806 | PNum hb2 = 0.0; /* Height of the second "below" row */ |
| 4807 | int n, i, nz; |
| 4808 | PNum x, y, orig_y, s; |
| 4809 | const char *z; |
| 4810 | PToken *aTxt; |
| 4811 | unsigned allMask = 0; |
| @@ -4815,11 +4841,15 @@ | |
| 4815 | aTxt = pObj->aTxt; |
| 4816 | n = pObj->nTxt; |
| 4817 | pik_txt_vertical_layout(pObj); |
| 4818 | x = pObj->ptAt.x; |
| 4819 | for(i=0; i<n; i++) allMask |= pObj->aTxt[i].eCode; |
| 4820 | if( pObj->type->isLine ) hc = pObj->sw*1.5; |
| 4821 | if( allMask & TP_CENTER ){ |
| 4822 | for(i=0; i<n; i++){ |
| 4823 | if( pObj->aTxt[i].eCode & TP_CENTER ){ |
| 4824 | s = pik_font_scale(pObj->aTxt+i); |
| 4825 | if( hc<s*p->charHeight ) hc = s*p->charHeight; |
| @@ -4866,11 +4896,11 @@ | |
| 4866 | for(i=0; i<n; i++){ |
| 4867 | PToken *t = &aTxt[i]; |
| 4868 | PNum xtraFontScale = pik_font_scale(t); |
| 4869 | PNum nx = 0; |
| 4870 | orig_y = pObj->ptAt.y; |
| 4871 | y = 0; |
| 4872 | if( t->eCode & TP_ABOVE2 ) y += 0.5*hc + ha1 + 0.5*ha2; |
| 4873 | if( t->eCode & TP_ABOVE ) y += 0.5*hc + 0.5*ha1; |
| 4874 | if( t->eCode & TP_BELOW ) y -= 0.5*hc + 0.5*hb1; |
| 4875 | if( t->eCode & TP_BELOW2 ) y -= 0.5*hc + hb1 + 0.5*hb2; |
| 4876 | if( t->eCode & TP_LJUST ) nx -= jw; |
| @@ -7852,6 +7882,6 @@ | |
| 7852 | |
| 7853 | |
| 7854 | #endif /* PIKCHR_TCL */ |
| 7855 | |
| 7856 | |
| 7857 | #line 7882 "pikchr.c" |
| 7858 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -3756,11 +3756,11 @@ | |
| 3756 | pik_append_arc(p, rad, rad, x0, y2); |
| 3757 | if( y2>y1 ) pik_append_xy(p, "L", x0, y1); |
| 3758 | pik_append_arc(p, rad, rad, x1, y0); |
| 3759 | pik_append(p,"Z\" ",-1); |
| 3760 | } |
| 3761 | pik_append_style(p,pObj,3); |
| 3762 | pik_append(p,"\" />\n", -1); |
| 3763 | } |
| 3764 | pik_append_txt(p, pObj, 0); |
| 3765 | } |
| 3766 | |
| @@ -3818,11 +3818,11 @@ | |
| 3818 | PPoint pt = pObj->ptAt; |
| 3819 | if( pObj->sw>0.0 ){ |
| 3820 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3821 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3822 | pik_append_dis(p," r=\"", r, "\" "); |
| 3823 | pik_append_style(p,pObj,3); |
| 3824 | pik_append(p,"\" />\n", -1); |
| 3825 | } |
| 3826 | pik_append_txt(p, pObj, 0); |
| 3827 | } |
| 3828 | |
| @@ -3848,11 +3848,11 @@ | |
| 3848 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y-h2+rad); |
| 3849 | pik_append_xy(p,"L", pt.x+w2,pt.y+h2-rad); |
| 3850 | pik_append_arc(p,w2,rad,pt.x-w2,pt.y+h2-rad); |
| 3851 | pik_append_arc(p,w2,rad,pt.x+w2,pt.y+h2-rad); |
| 3852 | pik_append(p,"\" ",-1); |
| 3853 | pik_append_style(p,pObj,3); |
| 3854 | pik_append(p,"\" />\n", -1); |
| 3855 | } |
| 3856 | pik_append_txt(p, pObj, 0); |
| 3857 | } |
| 3858 | static PPoint cylinderOffset(Pik *p, PObj *pObj, int cp){ |
| @@ -3910,11 +3910,11 @@ | |
| 3910 | PPoint pt = pObj->ptAt; |
| 3911 | if( pObj->sw>0.0 ){ |
| 3912 | pik_append_x(p,"<circle cx=\"", pt.x, "\""); |
| 3913 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3914 | pik_append_dis(p," r=\"", r, "\""); |
| 3915 | pik_append_style(p,pObj,2); |
| 3916 | pik_append(p,"\" />\n", -1); |
| 3917 | } |
| 3918 | pik_append_txt(p, pObj, 0); |
| 3919 | } |
| 3920 | |
| @@ -3969,11 +3969,11 @@ | |
| 3969 | if( pObj->sw>0.0 ){ |
| 3970 | pik_append_x(p,"<ellipse cx=\"", pt.x, "\""); |
| 3971 | pik_append_y(p," cy=\"", pt.y, "\""); |
| 3972 | pik_append_dis(p," rx=\"", w/2.0, "\""); |
| 3973 | pik_append_dis(p," ry=\"", h/2.0, "\" "); |
| 3974 | pik_append_style(p,pObj,3); |
| 3975 | pik_append(p,"\" />\n", -1); |
| 3976 | } |
| 3977 | pik_append_txt(p, pObj, 0); |
| 3978 | } |
| 3979 | |
| @@ -4081,11 +4081,11 @@ | |
| 4081 | pik_append(p,"Z",1); |
| 4082 | }else{ |
| 4083 | pObj->fill = -1.0; |
| 4084 | } |
| 4085 | pik_append(p,"\" ",-1); |
| 4086 | pik_append_style(p,pObj,pObj->bClose?3:0); |
| 4087 | pik_append(p,"\" />\n", -1); |
| 4088 | } |
| 4089 | pik_append_txt(p, pObj, 0); |
| 4090 | } |
| 4091 | |
| @@ -4181,11 +4181,11 @@ | |
| 4181 | pik_append(p,"Z",1); |
| 4182 | }else{ |
| 4183 | pObj->fill = -1.0; |
| 4184 | } |
| 4185 | pik_append(p,"\" ",-1); |
| 4186 | pik_append_style(p,pObj,pObj->bClose?3:0); |
| 4187 | pik_append(p,"\" />\n", -1); |
| 4188 | } |
| 4189 | static void splineRender(Pik *p, PObj *pObj){ |
| 4190 | if( pObj->sw>0.0 ){ |
| 4191 | int n = pObj->nPath; |
| @@ -4569,10 +4569,13 @@ | |
| 4569 | pik_append(p, buf, -1); |
| 4570 | } |
| 4571 | |
| 4572 | /* |
| 4573 | ** Invert the RGB color so that it is appropriate for dark mode. |
| 4574 | ** Variable x hold the initial color. The color is intended for use |
| 4575 | ** as a background color if isBg is true, and as a foreground color |
| 4576 | ** if isBg is false. |
| 4577 | */ |
| 4578 | static int pik_color_to_dark_mode(int x, int isBg){ |
| 4579 | int r, g, b; |
| 4580 | int mn, mx; |
| 4581 | x = 0xffffff - x; |
| @@ -4634,10 +4637,18 @@ | |
| 4637 | char buf[200]; |
| 4638 | snprintf(buf, sizeof(buf)-1, "%s%g%s", z1, p->rScale*v, z2); |
| 4639 | buf[sizeof(buf)-1] = 0; |
| 4640 | pik_append(p, buf, -1); |
| 4641 | } |
| 4642 | |
| 4643 | /* Append a color specification to the output. |
| 4644 | ** |
| 4645 | ** In PIKCHR_DARK_MODE, the color is inverted. The "bg" flags indicates that |
| 4646 | ** the color is intended for use as a background color if true, or as a |
| 4647 | ** foreground color if false. The distinction only matters for color |
| 4648 | ** inversions in PIKCHR_DARK_MODE. |
| 4649 | */ |
| 4650 | static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){ |
| 4651 | char buf[200]; |
| 4652 | int x = (int)v; |
| 4653 | int r, g, b; |
| 4654 | if( x==0 && p->fgcolor>0 && !bg ){ |
| @@ -4668,25 +4679,39 @@ | |
| 4679 | pik_append(p, buf, -1); |
| 4680 | } |
| 4681 | |
| 4682 | /* Append a style="..." text. But, leave the quote unterminated, in case |
| 4683 | ** the caller wants to add some more. |
| 4684 | ** |
| 4685 | ** eFill is non-zero to fill in the background, or 0 if no fill should |
| 4686 | ** occur. Non-zero values of eFill determine the "bg" flag to pik_append_clr() |
| 4687 | ** for cases when pObj->fill==pObj->color |
| 4688 | ** |
| 4689 | ** 1 fill is background, and color is foreground. |
| 4690 | ** 2 fill and color are both foreground. (Used by "dot" objects) |
| 4691 | ** 3 fill and color are both background. (Used by most other objs) |
| 4692 | */ |
| 4693 | static void pik_append_style(Pik *p, PObj *pObj, int eFill){ |
| 4694 | int clrIsBg = 0; |
| 4695 | pik_append(p, " style=\"", -1); |
| 4696 | if( pObj->fill>=0 && eFill ){ |
| 4697 | int fillIsBg = 1; |
| 4698 | if( pObj->fill==pObj->color ){ |
| 4699 | if( eFill==2 ) fillIsBg = 0; |
| 4700 | if( eFill==3 ) clrIsBg = 1; |
| 4701 | } |
| 4702 | pik_append_clr(p, "fill:", pObj->fill, ";", fillIsBg); |
| 4703 | }else{ |
| 4704 | pik_append(p,"fill:none;",-1); |
| 4705 | } |
| 4706 | if( pObj->sw>0.0 && pObj->color>=0.0 ){ |
| 4707 | PNum sw = pObj->sw; |
| 4708 | pik_append_dis(p, "stroke-width:", sw, ";"); |
| 4709 | if( pObj->nPath>2 && pObj->rad<=pObj->sw ){ |
| 4710 | pik_append(p, "stroke-linejoin:round;", -1); |
| 4711 | } |
| 4712 | pik_append_clr(p, "stroke:",pObj->color,";",clrIsBg); |
| 4713 | if( pObj->dotted>0.0 ){ |
| 4714 | PNum v = pObj->dotted; |
| 4715 | if( sw<2.1/p->rScale ) sw = 2.1/p->rScale; |
| 4716 | pik_append_dis(p,"stroke-dasharray:",sw,""); |
| 4717 | pik_append_dis(p,",",v,";"); |
| @@ -4802,10 +4827,11 @@ | |
| 4827 | PNum ha2 = 0.0; /* Height of the top row of text */ |
| 4828 | PNum ha1 = 0.0; /* Height of the second "above" row */ |
| 4829 | PNum hc = 0.0; /* Height of the center row */ |
| 4830 | PNum hb1 = 0.0; /* Height of the first "below" row of text */ |
| 4831 | PNum hb2 = 0.0; /* Height of the second "below" row */ |
| 4832 | PNum yBase = 0.0; |
| 4833 | int n, i, nz; |
| 4834 | PNum x, y, orig_y, s; |
| 4835 | const char *z; |
| 4836 | PToken *aTxt; |
| 4837 | unsigned allMask = 0; |
| @@ -4815,11 +4841,15 @@ | |
| 4841 | aTxt = pObj->aTxt; |
| 4842 | n = pObj->nTxt; |
| 4843 | pik_txt_vertical_layout(pObj); |
| 4844 | x = pObj->ptAt.x; |
| 4845 | for(i=0; i<n; i++) allMask |= pObj->aTxt[i].eCode; |
| 4846 | if( pObj->type->isLine ){ |
| 4847 | hc = pObj->sw*1.5; |
| 4848 | }else if( pObj->type->xInit==cylinderInit ){ |
| 4849 | yBase = -0.75*pObj->rad; |
| 4850 | } |
| 4851 | if( allMask & TP_CENTER ){ |
| 4852 | for(i=0; i<n; i++){ |
| 4853 | if( pObj->aTxt[i].eCode & TP_CENTER ){ |
| 4854 | s = pik_font_scale(pObj->aTxt+i); |
| 4855 | if( hc<s*p->charHeight ) hc = s*p->charHeight; |
| @@ -4866,11 +4896,11 @@ | |
| 4896 | for(i=0; i<n; i++){ |
| 4897 | PToken *t = &aTxt[i]; |
| 4898 | PNum xtraFontScale = pik_font_scale(t); |
| 4899 | PNum nx = 0; |
| 4900 | orig_y = pObj->ptAt.y; |
| 4901 | y = yBase; |
| 4902 | if( t->eCode & TP_ABOVE2 ) y += 0.5*hc + ha1 + 0.5*ha2; |
| 4903 | if( t->eCode & TP_ABOVE ) y += 0.5*hc + 0.5*ha1; |
| 4904 | if( t->eCode & TP_BELOW ) y -= 0.5*hc + 0.5*hb1; |
| 4905 | if( t->eCode & TP_BELOW2 ) y -= 0.5*hc + hb1 + 0.5*hb2; |
| 4906 | if( t->eCode & TP_LJUST ) nx -= jw; |
| @@ -7852,6 +7882,6 @@ | |
| 7882 | |
| 7883 | |
| 7884 | #endif /* PIKCHR_TCL */ |
| 7885 | |
| 7886 | |
| 7887 | #line 7912 "pikchr.c" |
| 7888 |