void ImageDrawing::strokeGlyph(Image* image, int x, int y, TrueTypeFont::Glyph* glyph, int size, const RGBA& color, ImageDrawing::AlphaCombineMode am) { for(uint32_t j = 0; j < glyph->contours.contours.size(); j++) { Contour contour = glyph->contours.contours[j]; vector<Vector2> coords = contour.coords; coords.push_back(coords[0]); coords.push_back(coords[1]); vector<bool> onCurve = contour.onCurve; onCurve.push_back(onCurve[0]); onCurve.push_back(onCurve[1]); Vector2 c0 = coords[0]; for(uint32_t k = 1; k < coords.size()-1; k++) { Vector2 c1 = coords[k]; if (onCurve[k]) { line_slow(image, c0[0]*size+x, y-c0[1]*size, c1[0]*size+x, y-c1[1]*size, color, am); c0 = c1; } else { Vector2 c2 = coords[k+1]; if (!onCurve[k+1]) { // Reconstruct a new c2 that is on curve c2 = (c1 + c2) * 0.5; } quadraticBezierCurve(image, c0[0]*size+x, y-c0[1]*size, c1[0]*size+x, y-c1[1]*size, c2[0]*size+x, y-c2[1]*size, color, am); c0 = c2; } } } }
void main() { int x1,y1,x2,y2,color; float t1,t2; word i,start; srand(*my_clock); /* seed the number generator. */ set_mode(VGA_256_COLOR_MODE); /* set the video mode. */ start=*my_clock; /* record the starting time. */ for(i=0;i<5000;i++) /* randomly draw 5000 lines. */ { x1=rand()%SCREEN_WIDTH; y1=rand()%SCREEN_HEIGHT; x2=rand()%SCREEN_WIDTH; y2=rand()%SCREEN_HEIGHT; color=rand()%NUM_COLORS; line_slow(x1,y1,x2,y2,color); } t1=(*my_clock-start)/18.2; /* calculate how long it took. */ set_mode(VGA_256_COLOR_MODE); /* set the video mode again in order to clear the screen. */ start=*my_clock; /* record the starting time. */ for(i=0;i<5000;i++) /* randomly draw 5000 lines. */ { x1=rand()%SCREEN_WIDTH; y1=rand()%SCREEN_HEIGHT; x2=rand()%SCREEN_WIDTH; y2=rand()%SCREEN_HEIGHT; color=rand()%NUM_COLORS; line_fast(x1,y1,x2,y2,color); } t2=(*my_clock-start)/18.2; /* calculate how long it took. */ set_mode(TEXT_MODE); /* set the video mode back to text mode. */ /* output the results... */ printf("Slow line drawing took %f seconds.\n",t1); printf("Fast line drawing took %f seconds.\n",t2); if (t2 != 0) printf("Fast line drawing was %f times faster.\n",t1/t2); return; }