in modules/awt/src/main/native/fontlib/shared/T1Glyph.cpp [42:347]
void T1Glyph::parseValueToOutline(EncodedValue *value, std::stack<ffloat> *stack, Outline *out, ffloat *curX, ffloat *curY, ffloat relativeSize){
ffloat x1, y1, x2, y2, x3, y3;
ufchar curChar;
for (ufshort count = 0; count < value->length; count ++) {
curChar = value->text[count];
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("\nchar = %u, ", curChar);
#endif
if (curChar > 31) {
if (curChar > 31 && curChar < 247) { // -107 to 107
stack->push((ffloat) (curChar - 139));
} else if (curChar > 246 && curChar < 251) { // 108 to 1131
stack->push((ffloat) ((curChar - 247) * 256 + 108 + (ufchar)(value->text[++count])));
} else if (curChar > 250 && curChar < 255) { // -1131 to -108
stack->push((ffloat) ((curChar - 251) * (-256) - 108 - (ufchar)(value->text[++count])));
} else if (curChar == 255) { // fint
stack->push((ffloat) ((curChar << 24) + (ufchar)((value->text[++count]) << 16) +
(ufchar)((value->text[++count]) << 8) + (ufchar)(value->text[++count])));
}
} else {
switch (curChar) {
case CH_STR_VMOVETO: {// vmoveto
*curY += stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("moveTo( %f, %f), ",*curX, *curY);
#endif
out->moveTo(*curX, *curY);
break;
}
case CH_STR_RLINETO : {// rlineto
*curY += (ffloat) stack->top() * relativeSize;
stack->pop();
*curX += (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("lineTo( %f, %f), ",*curX, *curY);
#endif
out->lineTo(*curX, *curY);
break;
}
case CH_STR_HLINETO : {// hlineto
*curX += (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("lineTo( %f, %f), ",*curX, *curY);
#endif
out->lineTo(*curX, *curY);
break;
}
case CH_STR_VLINETO : {// vlineto
*curY += (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("lineTo( %f, %f), ",*curX, *curY);
#endif
out->lineTo(*curX, *curY);
break;
}
case CH_STR_RRCURVETO : {// rrcurveto equivalent to dx1 dy1 (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) (dy1+dy2+dy3) rcurveto.
y3 = (ffloat) stack->top() * relativeSize;
stack->pop();
x3 = (ffloat) stack->top() * relativeSize;
stack->pop();
y2 = (ffloat) stack->top() * relativeSize;
stack->pop();
x2 = (ffloat) stack->top() * relativeSize;
stack->pop();
y1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 += *curX;
y1 += *curY;
x2 += x1;
y2 += y1;
x3 += x2;
y3 += y2;
*curX = x3;
*curY = y3;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3);
#endif
out->curveTo(x1, y1, x2, y2, x3, y3);
break;
}
//case CH_STR_ENDCHAR :
case CH_STR_CLOSEPATH : {// closePath
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("closePath");
#endif
out->closePath();
break;
}
case CH_STR_CALLSUBR : {// callsubr
x1 = (ffloat) stack->top();
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("call subr = %f, ", x1);
#endif
parseValueToOutline((*_subrsMap)[(const ufshort)x1], stack, out, curX, curY, relativeSize);
break;
}
case CH_STR_HSBW : {// hsbw
y1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 = (ffloat) stack->top() * relativeSize;
stack->pop();
_advanceX = y1;
_advanceY = 0;
_glyphBB[0] = x1;
_glyphBB[2] = y1;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("hsbw = %f,%f ; ", x1, y1);
#endif
*curX = x1;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("moveTo( %f, %f), ",*curX, *curY);
#endif
out->moveTo(*curX, *curY);
break;
}
case CH_STR_RMOVETO : {// rmoveto
*curY += (ffloat) stack->top() * relativeSize;
stack->pop();
*curX += (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("moveTo( %f, %f), ",*curX, *curY);
#endif
out->moveTo(*curX, *curY);
break;
}
case CH_STR_HMOVETO : {// hmoveto
*curX += (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("moveTo( %f, %f), ",*curX, *curY);
#endif
out->moveTo(*curX, *curY);
break;
}
case CH_STR_VHCURVETO : {// vhcurveto
y3 = 0;
x3 = (ffloat) stack->top() * relativeSize;
stack->pop();
y2 = (ffloat) stack->top() * relativeSize;
stack->pop();
x2 = (ffloat) stack->top() * relativeSize;
stack->pop();
y1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 = 0;
x1 += *curX;
y1 += *curY;
x2 += x1;
y2 += y1;
x3 += x2;
y3 += y2;
*curX = x3;
*curY = y3;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3);
#endif
out->curveTo(x1, y1, x2, y2, x3, y3);
break;
}
case CH_STR_HVCURVETO : {// hvcurveto
y3 = (ffloat) stack->top() * relativeSize;
stack->pop();
x3 = 0;
y2 = (ffloat) stack->top() * relativeSize;
stack->pop();
x2 = (ffloat) stack->top() * relativeSize;
stack->pop();
y1 = 0;
x1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 += *curX;
y1 += *curY;
x2 += x1;
y2 += y1;
x3 += x2;
y3 += y2;
*curX = x3;
*curY = y3;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3);
#endif
out->curveTo(x1, y1, x2, y2, x3, y3);
break;
}
case CH_STR_ESCAPE : {// escape command
curChar = value->text[++count];
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("escape command = %u, ", curChar);
#endif
if (curChar == CH_STR_ESCAPE_SEAC) {//seak
x3 = (ffloat) stack->top();
stack->pop();
y2 = (ffloat) stack->top();
stack->pop();
x2 = (ffloat) stack->top() * relativeSize;
stack->pop();
y1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 = (ffloat) stack->top() * relativeSize;
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("seak = %f,%f,%f,%f,%f ; ", x1, y1, x2, y2, x3);
#endif
ufshort aX = (ufshort) _advanceX;
ufshort aY = (ufshort) _advanceY;
ffloat tempGlyphBB[4];
memcpy(tempGlyphBB, _glyphBB, 4 * sizeof(ffloat));
parseValueToOutline((*_charStringMap)[STANDARD_ENCODING[(ufshort)y2]], stack, out, curX, curY, relativeSize);
*curY = x2;
*curX = y1;
out->moveTo(*curX, *curY);
parseValueToOutline((*_charStringMap)[STANDARD_ENCODING[(ufshort)x3]], stack, out, curX, curY, relativeSize);
_advanceX = aX;
_advanceY = aY;
memcpy(_glyphBB, tempGlyphBB, 4 * sizeof(ffloat));
break;
} else if (curChar == CH_STR_ESCAPE_SBW) { //sbw
y2 = (ffloat) stack->top() * relativeSize;
stack->pop();
x2 = (ffloat) stack->top() * relativeSize;
stack->pop();
y1 = (ffloat) stack->top() * relativeSize;
stack->pop();
x1 = (ffloat) stack->top() * relativeSize;
stack->pop();
_advanceX = x1;
_advanceY = y1;
_glyphBB[0] = x1;
_glyphBB[1] = y1;
_glyphBB[2] = x2;
_glyphBB[3] = y2;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("sbw = %f,%f,%f,%f ; ", x1, y1, x2, y2);
#endif
*curX = x2;
*curY = y2;
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("moveTo( %f, %f), ",*curX, *curY);
#endif
out->moveTo(*curX, *curY);
break;
} else if (curChar == CH_STR_ESCAPE_DIV) {//div
y1 = (ffloat) stack->top();
stack->pop();
x1 = (ffloat) stack->top();
stack->pop();
#ifdef GLYPH_OUTLINE_CREATE_DEBUG
printf("div (%f/%f) ", x1, y1);
#endif
stack->push(x1 / y1);
break;
} else {
}
}
}
}
}
}