From: <hba...@us...> - 2009-08-18 03:24:59
|
Revision: 10273 http://plplot.svn.sourceforge.net/plplot/?rev=10273&view=rev Author: hbabcock Date: 2009-08-18 03:24:51 +0000 (Tue, 18 Aug 2009) Log Message: ----------- Changed the cairo drive to use 'span' and 'rise' instead of 'sub' and 'sup' so that it will correctly handle multiple level super and subscripts. Modified Paths: -------------- trunk/drivers/cairo.c Modified: trunk/drivers/cairo.c =================================================================== --- trunk/drivers/cairo.c 2009-08-17 19:07:32 UTC (rev 10272) +++ trunk/drivers/cairo.c 2009-08-18 03:24:51 UTC (rev 10273) @@ -211,6 +211,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); /* Graphics */ @@ -569,17 +570,17 @@ break; case PLTEXT_SUPERSCRIPT: if(aStream->upDown < 0){ - strncat(aStream->pangoMarkupString, "</sub>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); + strncat(aStream->pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); } else { - strncat(aStream->pangoMarkupString, "<sup>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); + strncat(aStream->pangoMarkupString, rise_span_tag(aStream->upDown, 1), MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); } aStream->upDown++; break; case PLTEXT_SUBSCRIPT: if(aStream->upDown > 0){ - strncat(aStream->pangoMarkupString, "</sup>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); + strncat(aStream->pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); } else { - strncat(aStream->pangoMarkupString, "<sub>", MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); + strncat(aStream->pangoMarkupString, rise_span_tag(aStream->upDown, -1), MAX_MARKUP_LEN-1-strlen(aStream->pangoMarkupString)); } aStream->upDown--; break; @@ -851,17 +852,17 @@ else { if(ucs4[i] == (PLUNICODE)'u'){ /* Superscript */ if(upDown < 0){ - strncat(pangoMarkupString, "</sub>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); } else { - strncat(pangoMarkupString, "<sup>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, rise_span_tag(upDown, 1), MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); } upDown++; } if(ucs4[i] == (PLUNICODE)'d'){ /* Subscript */ if(upDown > 0){ - strncat(pangoMarkupString, "</sup>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); } else { - strncat(pangoMarkupString, "<sub>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, rise_span_tag(upDown, -1), MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); } upDown--; } @@ -915,13 +916,13 @@ /* Move to the right sub/super-script level */ if(upDown > 0){ while(upDown > 0){ - strncat(pangoMarkupString, "<sup>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, rise_span_tag(upDown, 1), MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); upDown--; } } if(upDown < 0){ while(upDown < 0){ - strncat(pangoMarkupString, "<sub>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, rise_span_tag(upDown, -1), MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); upDown++; } } @@ -937,13 +938,13 @@ { if(upDown > 0){ while(upDown > 0){ - strncat(pangoMarkupString, "</sup>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); upDown--; } } if(upDown < 0){ while(upDown < 0){ - strncat(pangoMarkupString, "</sub>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); + strncat(pangoMarkupString, "</span>", MAX_MARKUP_LEN-1-strlen(pangoMarkupString)); upDown++; } } @@ -952,6 +953,35 @@ } /*--------------------------------------------------------------------- + rise_span_tag + + Create a rise span tag w/ appropriate font size & baseline offset + ---------------------------------------------------------------------*/ + +#define STEPSIZE 7500.0 + +char *rise_span_tag(int level, int direction) +{ + int i; + float multiplier = 1.0; + float rise = STEPSIZE; + static char tag[100]; + + for(i=0;i<abs(level);i++){ + multiplier = multiplier * 0.9; + rise += STEPSIZE * multiplier; + } + if(direction>0){ + sprintf(tag, "<span rise=\"%d\" size=\"smaller\">", (int)rise); + } + else{ + sprintf(tag, "<span rise=\"%d\" size=\"smaller\">", (int)-rise); + } + + return(tag); +} + +/*--------------------------------------------------------------------- write_to_stream() Writes data to a open file stream. This function is passed to the This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |