FROM thTex.mp
point label definition
############################################################
vardef p_label@#(expr txt,pos,rot,mode) =
if (mode=1) or (mode=7): interim labeloffset:=(u/8) fi;
lab:=thelabel@#(txt, pos);
if mode>1: pickup PenD fi;
if mode=1:
pickup pencircle scaled (u/6);
drawdot(pos);
process_label(pos,0);
elseif mode=2: process_uplabel;
elseif mode=3: process_downlabel;
elseif mode=4: process_updownlabel;
elseif mode=5: process_circledlabel;
elseif mode=6: process_boxedlabel;
elseif mode=7: process_label(pos,rot); % station name
elseif mode=8: process_filledlabel(pos, rot);
else: process_label(pos,rot); fi;
enddef;
FROM therion.mp
low level process_ various label types
############################################################
def fonts_setup (expr t,s,m,l,h) =
write "\def\updown#1#2{\vbox{" &
"\offinterlineskip" &
"\setbox100=\hbox{#1}" &
"\setbox101=\hbox{#2}" &
"\ifnum\wd100>\wd101\hsize=\wd100\else\hsize=\wd101\fi" &
"\centerline{\box100}\vskip4pt" &
"\centerline{\box101}}}" &
"\def\thlabel{\thnormalsize}" &
"\def\thremark{\thsmallsize\si}" &
"\def\thcomment{\thsmallsize}" &
"\def\thentrance{\thsmallsize}" &
"\def\thaltitude{\thsmallsize}" &
"\def\thstationname{\thsmallsize}" &
"\def\thdate{\thsmallsize}" &
"\def\thheight{\thsmallsize}" &
"\def\thheightpos{+\ignorespaces}" &
"\def\thheightneg{-\ignorespaces}" &
"\def\thframed{\thsmallsize}" &
"\def\thwallaltitude{\thtinysize}"
to "mptexpre.tex";
write "\def\thtinysize{\size[" & decimal max(optical_zoom*t,0) & "]}" &
"\def\thsmallsize{\size[" & decimal max(optical_zoom*s,0) & "]}" &
"\def\thnormalsize{\size[" & decimal max(optical_zoom*m,0) & "]}" &
"\def\thlargesize{\size[" & decimal max(optical_zoom*l,0) & "]}" &
"\def\thhugesize{\size[" & decimal max(optical_zoom*h,0) & "]}"
to "mptexpre.tex";
write EOF to "mptexpre.tex";
enddef;
% @MACRO
% process_label --
%
% draws a label saved in lab picture variable and calls
% write_bbox macro.
def process_label (expr cent, rot) =
begingroup;
interim bboxmargin:=0.8bp;
q:=((bbox lab) smoothed 2) rotatedaround (cent, rot);
draw lab rotatedaround (cent, rot);
write_circ_bbox(q); % without corners smoothing it was enough to use
% write_bbox(q);
endgroup;
enddef;
% @MACRO
% process_uplabel --
%
% draws a label into semicircular box and writes clipping path to a file
def process_uplabel =
begingroup;
interim bboxmargin := 0.8 bp;
q:=bbox lab;
endgroup;
alef:=.8-.02*(xpart lrcorner q - xpart llcorner q);
% show alef;
q:=alef[llcorner q,ulcorner q]{up} .. {down}alef[lrcorner q, urcorner q] --
lrcorner q -- llcorner q -- cycle;
draw lab;
draw q;
q:=reverse q;
write_circ_bbox(q);
enddef;
% @MACRO
% process_downlabel --
%
% draws a label into down oriented semicircular box and writes
% clipping path to a file
def process_downlabel =
begingroup;
interim bboxmargin := 0.8 bp;
q:=bbox lab;
endgroup;
alef:=1-(.8-.02*(xpart lrcorner q - xpart llcorner q));
q:=alef[llcorner q,ulcorner q]{down} ..
{up}alef[lrcorner q, urcorner q] --
urcorner q -- ulcorner q -- cycle;
draw lab;
draw q;
write_circ_bbox(q);
enddef;
% @MACRO
% process_updownlabel --
%
% draws a label splitted into down and up oriented semicircular boxes and
% writes clipping path to a file
def process_updownlabel =
begingroup;
interim bboxmargin := 0.8 bp;
p:=bbox lab;
endgroup;
leftside:=xpart llcorner p;
rightside:=xpart lrcorner p;
draw (xpart llcorner p,.5[ypart llcorner p,ypart ulcorner p]) --
(xpart lrcorner p,.5[ypart llcorner p,ypart ulcorner p]);
alef:=1.05-.02*(xpart lrcorner p - xpart llcorner p);
% alef:=.8-.02*(rightside-leftside);
p:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} ..
{down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)]
-- alef[(rightside, ypart urcorner p), (rightside, ypart lrcorner p)]{down}
.. {up}alef[(leftside, ypart ulcorner p),(leftside, ypart llcorner p)]
-- cycle;
% p:=alef[llcorner p,ulcorner p]{up} .. {down}alef[lrcorner p, urcorner p] --
% aleff[llcorner p,ulcorner p]{down} ..
% {up}aleff[lrcorner p, urcorner p] -- cycle;
draw lab;
draw p;
p:=reverse p;
write_circ_bbox(p);
enddef;
def process_updownlabel_OLD =
p:=bbox lab;
q:=bbox Lab;
leftside:=min(xpart llcorner p, xpart ulcorner q);
rightside:=max(xpart lrcorner p, xpart urcorner q);
draw .5[(leftside, ypart llcorner p),(leftside, ypart ulcorner q)] --
.5[(rightside,ypart lrcorner p),(rightside,ypart urcorner q)];
alef:=.8-.02*(rightside-leftside);
q:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} ..
{down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)]
-- alef[(rightside, ypart urcorner q), (rightside, ypart lrcorner q)]{down}
.. {up}alef[(leftside, ypart ulcorner q),(leftside, ypart llcorner q)]
-- cycle;
draw lab;
draw Lab;
draw q;
q:=reverse q;
write_circ_bbox(q);
enddef;
% @MACRO
% process_boxedlabel --
%
% draws a label into circular box and writes
% clipping path to a file
def process_boxedlabel =
q:=bbox lab;
draw lab;
draw q;
write_bbox(q);
enddef;
% @MACRO
% process_circledlabel --
%
% draws a label into circular box and writes
% clipping path to a file
def process_circledlabel =
begingroup;
interim bboxmargin := 0.4 bp;
q:=bbox lab;
endgroup;
q:=point 0 of q .. point 1 of q .. point 2 of q .. point 3 of q .. cycle;
draw lab;
draw q;
write_circ_bbox(q);
enddef;
% @MACRO
% write_bbox --
%
% Arguments:
% path variable -- rectangular bounding box of a label;
% assumptions: path is cyclic, counterclockwise oriented, with four points,
% composed from linear segments;
% see general write_circ_bbox macro
% Results:
% one file per figure which uses labels with a clipping path in pseudo-pdf
% format
def write_bbox (expr q) =
file_name := jobname & "." & decimal(charcode) & "bbox";
for i:=4 downto 0:
s := decimal(roundone(xpart point i of q)) & " "
& decimal(roundone(ypart point i of q))
& if i=4: " m " else: " l" fi;
write s to file_name;
endfor;
last_write := charcode;
enddef;
% @MACRO
% write_circ_bbox --
%
% Arguments:
% path variable, only assumption is that path is cyclic
% and counterclockwise oriented.
% Results:
% one file per figure which uses labels with a clipping path in pseudo-pdf
% format
def write_circ_bbox expr q =
file_name := jobname & "." & decimal(charcode) & "bbox";
tmp:=length q;
s := decimal(roundone(xpart point tmp of q)) & " "
& decimal(roundone(ypart point tmp of q)) & " m";
write s to file_name;
for i:=tmp downto 1:
s := decimal(roundone(xpart precontrol i of q)) & " "
& decimal(roundone(ypart precontrol i of q)) & " "
& decimal(roundone(xpart postcontrol i-1 of q)) & " "
& decimal(roundone(ypart postcontrol i-1 of q)) & " "
& decimal(roundone(xpart point i-1 of q)) & " "
& decimal(roundone(ypart point i-1 of q)) & " c";
write s to file_name;
endfor;
last_write := charcode;
enddef;
FROM thpoint.cxx
C code for labels, including height
############################################################
...from line 242
// if not found, try to set fathers properties
default:
if (cod.id == TT_2DOBJ_CLIP) {
switch (this->type) {
case TT_POINT_TYPE_STATION_NAME:
case TT_POINT_TYPE_LABEL:
case TT_POINT_TYPE_REMARK:
case TT_POINT_TYPE_DATE:
case TT_POINT_TYPE_ALTITUDE:
case TT_POINT_TYPE_HEIGHT:
case TT_POINT_TYPE_DIMENSIONS:
case TT_POINT_TYPE_MAP_CONNECTION:
case TT_POINT_TYPE_PASSAGE_HEIGHT:
ththrow(("-clip not valid with type %s", thmatch_string(this->type,thtt_point_types)))
break;
}
}
th2ddataobject::set(cod, args, argenc, indataline);
...from line 399 Sets postprocess_label (aka process_label aka mode) = -1 ie default mode = -1 when none of the label modes are applicable
...from line 457 Sets postprocess_label values for points label, remark and station-name
...from line 574 Deals with point height variants, and near the bottom of this snippet sets postprocess_label to 7
case TT_POINT_TYPE_HEIGHT:
if ((this->tags & (TT_POINT_TAG_HEIGHT_P |
TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) != 0) {
switch (this->tags & (TT_POINT_TAG_HEIGHT_P |
TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) {
case TT_POINT_TAG_HEIGHT_P:
macroid = SYMP_HEIGHT_POSITIVE;
break;
case TT_POINT_TAG_HEIGHT_N:
macroid = SYMP_HEIGHT_NEGATIVE;
break;
case TT_POINT_TAG_HEIGHT_U:
macroid = SYMP_HEIGHT_UNSIGNED;
break;
default:
return(false);
}
omacroid = macroid;
if (this->context >= 0)
macroid = this->context;
if (!out->symset->is_assigned(macroid))
return(false);
if (out->file == NULL)
return(true);
out->symset->get_mp_macro(omacroid);
out->symset->export_mp_symbol_options(out->file, omacroid);
fprintf(out->file,"p_label%s(btex \\thheight ",thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr)));
out->layout->export_mptex_font_size(out->file, this, false);
if ((this->tags & TT_POINT_TAG_HEIGHT_P) != 0)
fprintf(out->file,"\\thheightpos ");
else if ((this->tags & TT_POINT_TAG_HEIGHT_N) != 0)
fprintf(out->file,"\\thheightneg ");
if (!thisnan(this->xsize)) {
//if (double(int(this->xsize)) != this->xsize)
// sprintf(buff,"%.1f",this->xsize);
//else
// sprintf(buff,"%.0f",this->xsize);
fprintf(out->file,"%s",utf2tex(out->layout->units.format_human_length(this->xsize)));
}
this->db->buff_enc.strcpy((this->tags & (TT_POINT_TAG_HEIGHT_PQ |
TT_POINT_TAG_HEIGHT_NQ | TT_POINT_TAG_HEIGHT_UQ)) != 0 ? "?" : "" );
fprintf(out->file,"%s etex,",utf2tex(this->db->buff_enc.get_buffer()));
postprocess_label = 7;
}
postprocess = false;
break;