Fossil SCM

Update Pikchr to support zero-thickness objects.

drh 2023-08-23 15:36 trunk
Commit 8ed25a31b41326e210b8033059faa91c6c6074d177317919e1af11d529cd4877
+16 -12
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -2673,11 +2673,11 @@
26732673
{p->cur->larrow=1; p->cur->rarrow=1; }
26742674
#line 2699 "pikchr.c"
26752675
break;
26762676
case 58: /* boolproperty ::= INVIS */
26772677
#line 676 "pikchr.y"
2678
-{p->cur->sw = 0.0;}
2678
+{p->cur->sw = -0.00001;}
26792679
#line 2704 "pikchr.c"
26802680
break;
26812681
case 59: /* boolproperty ::= THICK */
26822682
#line 677 "pikchr.y"
26832683
{p->cur->sw *= 1.5;}
@@ -3635,11 +3635,11 @@
36353635
pik_bbox_add_xy(&pObj->bbox, m.x, m.y);
36363636
}
36373637
static void arcRender(Pik *p, PObj *pObj){
36383638
PPoint f, m, t;
36393639
if( pObj->nPath<2 ) return;
3640
- if( pObj->sw<=0.0 ) return;
3640
+ if( pObj->sw<0.0 ) return;
36413641
f = pObj->aPath[0];
36423642
t = pObj->aPath[1];
36433643
m = arcControlPoint(pObj->cw,f,t,1.0);
36443644
if( pObj->larrow ){
36453645
pik_draw_arrowhead(p,&m,&f,pObj);
@@ -3748,11 +3748,11 @@
37483748
static void boxRender(Pik *p, PObj *pObj){
37493749
PNum w2 = 0.5*pObj->w;
37503750
PNum h2 = 0.5*pObj->h;
37513751
PNum rad = pObj->rad;
37523752
PPoint pt = pObj->ptAt;
3753
- if( pObj->sw>0.0 ){
3753
+ if( pObj->sw>=0.0 ){
37543754
if( rad<=0.0 ){
37553755
pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
37563756
pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
37573757
pik_append_xy(p,"L", pt.x+w2,pt.y+h2);
37583758
pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -3850,11 +3850,11 @@
38503850
}
38513851
38523852
static void circleRender(Pik *p, PObj *pObj){
38533853
PNum r = pObj->rad;
38543854
PPoint pt = pObj->ptAt;
3855
- if( pObj->sw>0.0 ){
3855
+ if( pObj->sw>=0.0 ){
38563856
pik_append_x(p,"<circle cx=\"", pt.x, "\"");
38573857
pik_append_y(p," cy=\"", pt.y, "\"");
38583858
pik_append_dis(p," r=\"", r, "\" ");
38593859
pik_append_style(p,pObj,3);
38603860
pik_append(p,"\" />\n", -1);
@@ -3876,11 +3876,11 @@
38763876
static void cylinderRender(Pik *p, PObj *pObj){
38773877
PNum w2 = 0.5*pObj->w;
38783878
PNum h2 = 0.5*pObj->h;
38793879
PNum rad = pObj->rad;
38803880
PPoint pt = pObj->ptAt;
3881
- if( pObj->sw>0.0 ){
3881
+ if( pObj->sw>=0.0 ){
38823882
if( rad>h2 ){
38833883
rad = h2;
38843884
}else if( rad<0 ){
38853885
rad = 0;
38863886
}
@@ -3947,11 +3947,11 @@
39473947
return cZeroPoint;
39483948
}
39493949
static void dotRender(Pik *p, PObj *pObj){
39503950
PNum r = pObj->rad;
39513951
PPoint pt = pObj->ptAt;
3952
- if( pObj->sw>0.0 ){
3952
+ if( pObj->sw>=0.0 ){
39533953
pik_append_x(p,"<circle cx=\"", pt.x, "\"");
39543954
pik_append_y(p," cy=\"", pt.y, "\"");
39553955
pik_append_dis(p," r=\"", r, "\"");
39563956
pik_append_style(p,pObj,2);
39573957
pik_append(p,"\" />\n", -1);
@@ -4005,11 +4005,11 @@
40054005
}
40064006
static void ellipseRender(Pik *p, PObj *pObj){
40074007
PNum w = pObj->w;
40084008
PNum h = pObj->h;
40094009
PPoint pt = pObj->ptAt;
4010
- if( pObj->sw>0.0 ){
4010
+ if( pObj->sw>=0.0 ){
40114011
pik_append_x(p,"<ellipse cx=\"", pt.x, "\"");
40124012
pik_append_y(p," cy=\"", pt.y, "\"");
40134013
pik_append_dis(p," rx=\"", w/2.0, "\"");
40144014
pik_append_dis(p," ry=\"", h/2.0, "\" ");
40154015
pik_append_style(p,pObj,3);
@@ -4062,11 +4062,11 @@
40624062
PNum rad = pObj->rad;
40634063
PPoint pt = pObj->ptAt;
40644064
PNum mn = w2<h2 ? w2 : h2;
40654065
if( rad>mn ) rad = mn;
40664066
if( rad<mn*0.25 ) rad = mn*0.25;
4067
- if( pObj->sw>0.0 ){
4067
+ if( pObj->sw>=0.0 ){
40684068
pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
40694069
pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
40704070
pik_append_xy(p,"L", pt.x+w2,pt.y+(h2-rad));
40714071
pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+h2);
40724072
pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -4259,10 +4259,14 @@
42594259
** then get boxOffset() to do the offset computation.
42604260
*/
42614261
pik_size_to_fit(p, &pObj->errTok,3);
42624262
return boxOffset(p, pObj, cp);
42634263
}
4264
+static void textRender(Pik *p, PObj *pObj){
4265
+ pik_append_txt(p, pObj, 0);
4266
+}
4267
+
42644268
42654269
/* Methods for the "sublist" class */
42664270
static void sublistInit(Pik *p, PObj *pObj){
42674271
PList *pList = pObj->pSublist;
42684272
int i;
@@ -4423,11 +4427,11 @@
44234427
/* xNumProp */ 0,
44244428
/* xCheck */ 0,
44254429
/* xChop */ boxChop,
44264430
/* xOffset */ textOffset,
44274431
/* xFit */ boxFit,
4428
- /* xRender */ boxRender
4432
+ /* xRender */ textRender
44294433
},
44304434
};
44314435
static const PClass sublistClass =
44324436
{ /* name */ "[]",
44334437
/* isline */ 0,
@@ -4778,11 +4782,11 @@
47784782
}
47794783
pik_append_clr(p, "fill:", pObj->fill, ";", fillIsBg);
47804784
}else{
47814785
pik_append(p,"fill:none;",-1);
47824786
}
4783
- if( pObj->sw>0.0 && pObj->color>=0.0 ){
4787
+ if( pObj->sw>=0.0 && pObj->color>=0.0 ){
47844788
PNum sw = pObj->sw;
47854789
pik_append_dis(p, "stroke-width:", sw, ";");
47864790
if( pObj->nPath>2 && pObj->rad<=pObj->sw ){
47874791
pik_append(p, "stroke-linejoin:round;", -1);
47884792
}
@@ -7021,11 +7025,11 @@
70217025
*/
70227026
static void pik_bbox_add_elist(Pik *p, PList *pList, PNum wArrow){
70237027
int i;
70247028
for(i=0; i<pList->n; i++){
70257029
PObj *pObj = pList->a[i];
7026
- if( pObj->sw>0.0 ) pik_bbox_addbox(&p->bbox, &pObj->bbox);
7030
+ if( pObj->sw>=0.0 ) pik_bbox_addbox(&p->bbox, &pObj->bbox);
70277031
pik_append_txt(p, pObj, &p->bbox);
70287032
if( pObj->pSublist ) pik_bbox_add_elist(p, pObj->pSublist, wArrow);
70297033
70307034
70317035
/* Expand the bounding box to account for arrowheads on lines */
@@ -8138,6 +8142,6 @@
81388142
81398143
81408144
#endif /* PIKCHR_TCL */
81418145
81428146
8143
-#line 8168 "pikchr.c"
8147
+#line 8172 "pikchr.c"
81448148
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -2673,11 +2673,11 @@
2673 {p->cur->larrow=1; p->cur->rarrow=1; }
2674 #line 2699 "pikchr.c"
2675 break;
2676 case 58: /* boolproperty ::= INVIS */
2677 #line 676 "pikchr.y"
2678 {p->cur->sw = 0.0;}
2679 #line 2704 "pikchr.c"
2680 break;
2681 case 59: /* boolproperty ::= THICK */
2682 #line 677 "pikchr.y"
2683 {p->cur->sw *= 1.5;}
@@ -3635,11 +3635,11 @@
3635 pik_bbox_add_xy(&pObj->bbox, m.x, m.y);
3636 }
3637 static void arcRender(Pik *p, PObj *pObj){
3638 PPoint f, m, t;
3639 if( pObj->nPath<2 ) return;
3640 if( pObj->sw<=0.0 ) return;
3641 f = pObj->aPath[0];
3642 t = pObj->aPath[1];
3643 m = arcControlPoint(pObj->cw,f,t,1.0);
3644 if( pObj->larrow ){
3645 pik_draw_arrowhead(p,&m,&f,pObj);
@@ -3748,11 +3748,11 @@
3748 static void boxRender(Pik *p, PObj *pObj){
3749 PNum w2 = 0.5*pObj->w;
3750 PNum h2 = 0.5*pObj->h;
3751 PNum rad = pObj->rad;
3752 PPoint pt = pObj->ptAt;
3753 if( pObj->sw>0.0 ){
3754 if( rad<=0.0 ){
3755 pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
3756 pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
3757 pik_append_xy(p,"L", pt.x+w2,pt.y+h2);
3758 pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -3850,11 +3850,11 @@
3850 }
3851
3852 static void circleRender(Pik *p, PObj *pObj){
3853 PNum r = pObj->rad;
3854 PPoint pt = pObj->ptAt;
3855 if( pObj->sw>0.0 ){
3856 pik_append_x(p,"<circle cx=\"", pt.x, "\"");
3857 pik_append_y(p," cy=\"", pt.y, "\"");
3858 pik_append_dis(p," r=\"", r, "\" ");
3859 pik_append_style(p,pObj,3);
3860 pik_append(p,"\" />\n", -1);
@@ -3876,11 +3876,11 @@
3876 static void cylinderRender(Pik *p, PObj *pObj){
3877 PNum w2 = 0.5*pObj->w;
3878 PNum h2 = 0.5*pObj->h;
3879 PNum rad = pObj->rad;
3880 PPoint pt = pObj->ptAt;
3881 if( pObj->sw>0.0 ){
3882 if( rad>h2 ){
3883 rad = h2;
3884 }else if( rad<0 ){
3885 rad = 0;
3886 }
@@ -3947,11 +3947,11 @@
3947 return cZeroPoint;
3948 }
3949 static void dotRender(Pik *p, PObj *pObj){
3950 PNum r = pObj->rad;
3951 PPoint pt = pObj->ptAt;
3952 if( pObj->sw>0.0 ){
3953 pik_append_x(p,"<circle cx=\"", pt.x, "\"");
3954 pik_append_y(p," cy=\"", pt.y, "\"");
3955 pik_append_dis(p," r=\"", r, "\"");
3956 pik_append_style(p,pObj,2);
3957 pik_append(p,"\" />\n", -1);
@@ -4005,11 +4005,11 @@
4005 }
4006 static void ellipseRender(Pik *p, PObj *pObj){
4007 PNum w = pObj->w;
4008 PNum h = pObj->h;
4009 PPoint pt = pObj->ptAt;
4010 if( pObj->sw>0.0 ){
4011 pik_append_x(p,"<ellipse cx=\"", pt.x, "\"");
4012 pik_append_y(p," cy=\"", pt.y, "\"");
4013 pik_append_dis(p," rx=\"", w/2.0, "\"");
4014 pik_append_dis(p," ry=\"", h/2.0, "\" ");
4015 pik_append_style(p,pObj,3);
@@ -4062,11 +4062,11 @@
4062 PNum rad = pObj->rad;
4063 PPoint pt = pObj->ptAt;
4064 PNum mn = w2<h2 ? w2 : h2;
4065 if( rad>mn ) rad = mn;
4066 if( rad<mn*0.25 ) rad = mn*0.25;
4067 if( pObj->sw>0.0 ){
4068 pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
4069 pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
4070 pik_append_xy(p,"L", pt.x+w2,pt.y+(h2-rad));
4071 pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+h2);
4072 pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -4259,10 +4259,14 @@
4259 ** then get boxOffset() to do the offset computation.
4260 */
4261 pik_size_to_fit(p, &pObj->errTok,3);
4262 return boxOffset(p, pObj, cp);
4263 }
 
 
 
 
4264
4265 /* Methods for the "sublist" class */
4266 static void sublistInit(Pik *p, PObj *pObj){
4267 PList *pList = pObj->pSublist;
4268 int i;
@@ -4423,11 +4427,11 @@
4423 /* xNumProp */ 0,
4424 /* xCheck */ 0,
4425 /* xChop */ boxChop,
4426 /* xOffset */ textOffset,
4427 /* xFit */ boxFit,
4428 /* xRender */ boxRender
4429 },
4430 };
4431 static const PClass sublistClass =
4432 { /* name */ "[]",
4433 /* isline */ 0,
@@ -4778,11 +4782,11 @@
4778 }
4779 pik_append_clr(p, "fill:", pObj->fill, ";", fillIsBg);
4780 }else{
4781 pik_append(p,"fill:none;",-1);
4782 }
4783 if( pObj->sw>0.0 && pObj->color>=0.0 ){
4784 PNum sw = pObj->sw;
4785 pik_append_dis(p, "stroke-width:", sw, ";");
4786 if( pObj->nPath>2 && pObj->rad<=pObj->sw ){
4787 pik_append(p, "stroke-linejoin:round;", -1);
4788 }
@@ -7021,11 +7025,11 @@
7021 */
7022 static void pik_bbox_add_elist(Pik *p, PList *pList, PNum wArrow){
7023 int i;
7024 for(i=0; i<pList->n; i++){
7025 PObj *pObj = pList->a[i];
7026 if( pObj->sw>0.0 ) pik_bbox_addbox(&p->bbox, &pObj->bbox);
7027 pik_append_txt(p, pObj, &p->bbox);
7028 if( pObj->pSublist ) pik_bbox_add_elist(p, pObj->pSublist, wArrow);
7029
7030
7031 /* Expand the bounding box to account for arrowheads on lines */
@@ -8138,6 +8142,6 @@
8138
8139
8140 #endif /* PIKCHR_TCL */
8141
8142
8143 #line 8168 "pikchr.c"
8144
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -2673,11 +2673,11 @@
2673 {p->cur->larrow=1; p->cur->rarrow=1; }
2674 #line 2699 "pikchr.c"
2675 break;
2676 case 58: /* boolproperty ::= INVIS */
2677 #line 676 "pikchr.y"
2678 {p->cur->sw = -0.00001;}
2679 #line 2704 "pikchr.c"
2680 break;
2681 case 59: /* boolproperty ::= THICK */
2682 #line 677 "pikchr.y"
2683 {p->cur->sw *= 1.5;}
@@ -3635,11 +3635,11 @@
3635 pik_bbox_add_xy(&pObj->bbox, m.x, m.y);
3636 }
3637 static void arcRender(Pik *p, PObj *pObj){
3638 PPoint f, m, t;
3639 if( pObj->nPath<2 ) return;
3640 if( pObj->sw<0.0 ) return;
3641 f = pObj->aPath[0];
3642 t = pObj->aPath[1];
3643 m = arcControlPoint(pObj->cw,f,t,1.0);
3644 if( pObj->larrow ){
3645 pik_draw_arrowhead(p,&m,&f,pObj);
@@ -3748,11 +3748,11 @@
3748 static void boxRender(Pik *p, PObj *pObj){
3749 PNum w2 = 0.5*pObj->w;
3750 PNum h2 = 0.5*pObj->h;
3751 PNum rad = pObj->rad;
3752 PPoint pt = pObj->ptAt;
3753 if( pObj->sw>=0.0 ){
3754 if( rad<=0.0 ){
3755 pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
3756 pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
3757 pik_append_xy(p,"L", pt.x+w2,pt.y+h2);
3758 pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -3850,11 +3850,11 @@
3850 }
3851
3852 static void circleRender(Pik *p, PObj *pObj){
3853 PNum r = pObj->rad;
3854 PPoint pt = pObj->ptAt;
3855 if( pObj->sw>=0.0 ){
3856 pik_append_x(p,"<circle cx=\"", pt.x, "\"");
3857 pik_append_y(p," cy=\"", pt.y, "\"");
3858 pik_append_dis(p," r=\"", r, "\" ");
3859 pik_append_style(p,pObj,3);
3860 pik_append(p,"\" />\n", -1);
@@ -3876,11 +3876,11 @@
3876 static void cylinderRender(Pik *p, PObj *pObj){
3877 PNum w2 = 0.5*pObj->w;
3878 PNum h2 = 0.5*pObj->h;
3879 PNum rad = pObj->rad;
3880 PPoint pt = pObj->ptAt;
3881 if( pObj->sw>=0.0 ){
3882 if( rad>h2 ){
3883 rad = h2;
3884 }else if( rad<0 ){
3885 rad = 0;
3886 }
@@ -3947,11 +3947,11 @@
3947 return cZeroPoint;
3948 }
3949 static void dotRender(Pik *p, PObj *pObj){
3950 PNum r = pObj->rad;
3951 PPoint pt = pObj->ptAt;
3952 if( pObj->sw>=0.0 ){
3953 pik_append_x(p,"<circle cx=\"", pt.x, "\"");
3954 pik_append_y(p," cy=\"", pt.y, "\"");
3955 pik_append_dis(p," r=\"", r, "\"");
3956 pik_append_style(p,pObj,2);
3957 pik_append(p,"\" />\n", -1);
@@ -4005,11 +4005,11 @@
4005 }
4006 static void ellipseRender(Pik *p, PObj *pObj){
4007 PNum w = pObj->w;
4008 PNum h = pObj->h;
4009 PPoint pt = pObj->ptAt;
4010 if( pObj->sw>=0.0 ){
4011 pik_append_x(p,"<ellipse cx=\"", pt.x, "\"");
4012 pik_append_y(p," cy=\"", pt.y, "\"");
4013 pik_append_dis(p," rx=\"", w/2.0, "\"");
4014 pik_append_dis(p," ry=\"", h/2.0, "\" ");
4015 pik_append_style(p,pObj,3);
@@ -4062,11 +4062,11 @@
4062 PNum rad = pObj->rad;
4063 PPoint pt = pObj->ptAt;
4064 PNum mn = w2<h2 ? w2 : h2;
4065 if( rad>mn ) rad = mn;
4066 if( rad<mn*0.25 ) rad = mn*0.25;
4067 if( pObj->sw>=0.0 ){
4068 pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
4069 pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
4070 pik_append_xy(p,"L", pt.x+w2,pt.y+(h2-rad));
4071 pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+h2);
4072 pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
@@ -4259,10 +4259,14 @@
4259 ** then get boxOffset() to do the offset computation.
4260 */
4261 pik_size_to_fit(p, &pObj->errTok,3);
4262 return boxOffset(p, pObj, cp);
4263 }
4264 static void textRender(Pik *p, PObj *pObj){
4265 pik_append_txt(p, pObj, 0);
4266 }
4267
4268
4269 /* Methods for the "sublist" class */
4270 static void sublistInit(Pik *p, PObj *pObj){
4271 PList *pList = pObj->pSublist;
4272 int i;
@@ -4423,11 +4427,11 @@
4427 /* xNumProp */ 0,
4428 /* xCheck */ 0,
4429 /* xChop */ boxChop,
4430 /* xOffset */ textOffset,
4431 /* xFit */ boxFit,
4432 /* xRender */ textRender
4433 },
4434 };
4435 static const PClass sublistClass =
4436 { /* name */ "[]",
4437 /* isline */ 0,
@@ -4778,11 +4782,11 @@
4782 }
4783 pik_append_clr(p, "fill:", pObj->fill, ";", fillIsBg);
4784 }else{
4785 pik_append(p,"fill:none;",-1);
4786 }
4787 if( pObj->sw>=0.0 && pObj->color>=0.0 ){
4788 PNum sw = pObj->sw;
4789 pik_append_dis(p, "stroke-width:", sw, ";");
4790 if( pObj->nPath>2 && pObj->rad<=pObj->sw ){
4791 pik_append(p, "stroke-linejoin:round;", -1);
4792 }
@@ -7021,11 +7025,11 @@
7025 */
7026 static void pik_bbox_add_elist(Pik *p, PList *pList, PNum wArrow){
7027 int i;
7028 for(i=0; i<pList->n; i++){
7029 PObj *pObj = pList->a[i];
7030 if( pObj->sw>=0.0 ) pik_bbox_addbox(&p->bbox, &pObj->bbox);
7031 pik_append_txt(p, pObj, &p->bbox);
7032 if( pObj->pSublist ) pik_bbox_add_elist(p, pObj->pSublist, wArrow);
7033
7034
7035 /* Expand the bounding box to account for arrowheads on lines */
@@ -8138,6 +8142,6 @@
8142
8143
8144 #endif /* PIKCHR_TCL */
8145
8146
8147 #line 8172 "pikchr.c"
8148
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
cannot compute difference between binary files
11
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
0 annot compute difference between binary files
1
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
0 annot compute difference between binary files
1

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button