void T1Glyph::parseValueToOutline()

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 {
					}
				}
			}
		}
	}
}