const GrVertexBuffer* GrGpu::getUnitSquareVertexBuffer() const { if (NULL == fUnitSquareVertexBuffer) { static const GrPoint DATA[] = { { 0, 0 }, { GR_Scalar1, 0 }, { GR_Scalar1, GR_Scalar1 }, { 0, GR_Scalar1 } #if 0 GrPoint(0, 0), GrPoint(GR_Scalar1,0), GrPoint(GR_Scalar1,GR_Scalar1), GrPoint(0, GR_Scalar1) #endif }; static const size_t SIZE = sizeof(DATA); GrGpu* me = const_cast<GrGpu*>(this); fUnitSquareVertexBuffer = me->createVertexBuffer(SIZE, false); if (NULL != fUnitSquareVertexBuffer) { if (!fUnitSquareVertexBuffer->updateData(DATA, SIZE)) { fUnitSquareVertexBuffer->unref(); fUnitSquareVertexBuffer = NULL; GrCrash("Can't get vertices into buffer!"); } } } return fUnitSquareVertexBuffer; }
static uint32_t generate_cubic_points(const GrPoint& p0, const GrPoint& p1, const GrPoint& p2, const GrPoint& p3, GrScalar tolSqd, GrPoint** points, uint32_t pointsLeft) { if (pointsLeft < 2 || (p1.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd && p2.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd)) { (*points)[0] = p3; *points += 1; return 1; } GrPoint q[] = { GrPoint(GrScalarAve(p0.fX, p1.fX), GrScalarAve(p0.fY, p1.fY)), GrPoint(GrScalarAve(p1.fX, p2.fX), GrScalarAve(p1.fY, p2.fY)), GrPoint(GrScalarAve(p2.fX, p3.fX), GrScalarAve(p2.fY, p3.fY)) }; GrPoint r[] = { GrPoint(GrScalarAve(q[0].fX, q[1].fX), GrScalarAve(q[0].fY, q[1].fY)), GrPoint(GrScalarAve(q[1].fX, q[2].fX), GrScalarAve(q[1].fY, q[2].fY)) }; GrPoint s(GrScalarAve(r[0].fX, r[1].fX), GrScalarAve(r[0].fY, r[1].fY)); pointsLeft >>= 1; uint32_t a = generate_cubic_points(p0, q[0], r[0], s, tolSqd, points, pointsLeft); uint32_t b = generate_cubic_points(s, r[1], q[2], p3, tolSqd, points, pointsLeft); return a + b; }
static void poddraw_draw_box( GR_COLOR color, int x, int y ) { GrSetGCForeground( poddraw_gc, color ); GrPoint( poddraw_wid, poddraw_gc, x, y ); GrPoint( poddraw_wid, poddraw_gc, x+1, y+1 ); GrPoint( poddraw_wid, poddraw_gc, x+1, y ); GrPoint( poddraw_wid, poddraw_gc, x, y+1 ); }
// calculate the current mandelbrot set static void calculate_mandel() { const GR_COLOR * the_palette = GRAY_palette; const int sx = screen_width; const int sy = screen_height; const int iter = iterations-1; const double xmin=xMin; const double ymin=yMin; const double xmax=xMax; const double ymax=yMax; const double xs=(xmax-xmin)/sx; const double ys=(ymax-ymin)/sy; register long x0,y0,p,q,xn,tot; register int i=0,x=0,y=0; const int depth = current_depth; if( screen_info.bpp == 16 ) the_palette = color_palette; rendering=1; show_cursor=0; active_renderer++; // start main loop for (y=0;y<sy;y++) { for (x=0;x<sx;x++) { p=fixpt(xmin+x*xs); q=fixpt(ymin+y*ys); xn=0; x0=0; y0=0; i=0; while ((mul(xn,xn)+mul(y0,y0))<fixpt(4) && ++i<iter) { xn=mul((x0+y0),(x0-y0)) +p; y0=mul(fixpt(2),mul(x0,y0)) +q; x0=xn; } tot+=i; GrSetGCForeground(mandel_gc, the_palette[i%8]); GrPoint(level[depth].mandel_buffer, mandel_gc,x,y); } // for every line only: // check if we had an event check_event(); // check if we need to quit if (!rendering) return; // update the screen draw_mandel(); } // end main loop active_renderer--; }
int XDrawLines(Display * dpy, Drawable d, GC gc, XPoint * points, int npoints, int mode) // FIXME: mode ignored { GR_POINT beg, end; if (npoints < 1) return 1; if (npoints == 1) { GrPoint(d, gc->gid, points->x, points->y); return 1; } /* must copy since X points are shorts, Nano-X are MWCOORDs (int) */ beg.x = points->x; beg.y = points->y; ++points; while (--npoints > 0) { end.x = points->x; end.y = points->y; ++points; GrLine(d, gc->gid, beg.x, beg.y, end.x, end.y); beg = end; } return 1; }
static void GrPointWrapper(void *r) { nxPointReq *req = r; GrPoint(req->drawid, req->gcid, req->x, req->y); }
static uint32_t generate_quadratic_points(const GrPoint& p0, const GrPoint& p1, const GrPoint& p2, GrScalar tolSqd, GrPoint** points, uint32_t pointsLeft) { if (pointsLeft < 2 || (p1.distanceToLineSegmentBetweenSqd(p0, p2)) < tolSqd) { (*points)[0] = p2; *points += 1; return 1; } GrPoint q[] = { GrPoint(GrScalarAve(p0.fX, p1.fX), GrScalarAve(p0.fY, p1.fY)), GrPoint(GrScalarAve(p1.fX, p2.fX), GrScalarAve(p1.fY, p2.fY)), }; GrPoint r(GrScalarAve(q[0].fX, q[1].fX), GrScalarAve(q[0].fY, q[1].fY)); pointsLeft >>= 1; uint32_t a = generate_quadratic_points(p0, q[0], r, tolSqd, points, pointsLeft); uint32_t b = generate_quadratic_points(r, q[1], p2, tolSqd, points, pointsLeft); return a + b; }
void periodic_tinyfont_draw_char(GR_WINDOW_ID wid, GR_GC_ID gc, GR_COORD x, GR_COORD y, char ch) { int i,j; int r; long int bmp = periodic_tinyfont_bitmaps[ch-' ']; for (i=7; i>=0; i--) { r = bmp & 15; bmp /= 16; for (j=3; j>=0; j--) { if (r & 1) { GrPoint(wid, gc, x+j, y+i); } r /= 2; } } }
void saver2_animate(nstate *state) { GR_COORD x, y; GR_COLOR c; int pixels = SAVER2_PIXELS_PER_FRAME; s2state *s = state->priv; while(pixels--) { if(!(s->pixels--)) { s->pixels = SAVER2_MAXPIXELS; GrClearWindow(state->main_window, 0); } get_random_point_on_screen(state, &x, &y, &c); GrSetGCForeground(state->main_gc, c); GrPoint(state->main_window, state->main_gc, x, y); } }
/* * Here when the mouse has a motion event. */ void do_motion(GR_EVENT_MOUSE *mp) { if (mp->wid == w4) { if (lineok) { GrLine(w4, gc4, xorxpos, xorypos, linexpos, lineypos); xorxpos = mp->x; xorypos = mp->y; GrLine(w4, gc4, xorxpos, xorypos, linexpos, lineypos); } return; } if (mp->wid == w3) { GrPoint(w3, gc3, mp->x, mp->y); return; } }
int main() { #ifdef TEST_FOR_X Display *display; Window window; GC gc; XGCValues gcValues; Colormap colormap; Pixmap src_pixmap; unsigned long fgColor, bgColor; int screenNum; XPoint points[NUM_POINTS]; #else GR_WINDOW_ID window; GR_WINDOW_ID src_pixmap; unsigned char* src_pixmap_buf[320*240*2]; GR_GC_ID gc; GR_POINT points[NUM_POINTS]; #endif int c, c1, count=4500; int x, y, x1, y1, x2, y2; #ifdef TEST_FOR_X if(!(display=XOpenDisplay(""))) { printf("Cannot connect to X.\n"); } screenNum = DefaultScreen(display); colormap = DefaultColormap(display, screenNum); bgColor = BlackPixel(display, screenNum); fgColor = WhitePixel(display, screenNum); window = XCreateSimpleWindow(display, RootWindow(display, screenNum), 0, 0 , 639, 479, 0, fgColor, bgColor); src_pixmap = XCreatePixmap(display, window, 320, 240, 16); XMapRaised(display, window); gcValues.background = bgColor; gcValues.foreground = fgColor; gcValues.line_width = 1; gcValues.line_style = LineSolid; gcValues.fill_style = FillSolid; gcValues.fill_rule = WindingRule; gcValues.arc_mode = ArcPieSlice; gc = XCreateGC(display, window, GCForeground | GCBackground | GCLineWidth | GCLineStyle | GCFillStyle, &gcValues); #else GrOpen(); window = GrNewWindow(GR_ROOT_WINDOW_ID, 0, 0, 639, 479, 0, BLACK, BLUE); src_pixmap = GrNewPixmap(640, 480, src_pixmap_buf); GrMapWindow(window); gc = GrNewGC(); GrSetGCForeground(gc, WHITE); GrSetGCBackground(gc, BLACK); GrSetGCMode(gc, GR_MODE_COPY); #endif // Horizontal Line //////////////////////////////////////////////// printf("Horizontal Line(XDrawLine)\n"); start_timer(); for(c=0; c<count*20; c++) { y1=random()%480; #ifdef TEST_FOR_X XDrawLine(display, window, gc, 0, y1, 639, y1); XFlush(display); #else GrLine(window, gc, 0, y1, 639, y1); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // Vertical Line ///////////////////////////////////////////////// printf("Vertical Line(XDrawLine)\n"); start_timer(); for(c=0; c<count*19; c++) { x1=random()%640; #ifdef TEST_FOR_X XDrawLine(display, window, gc, x1, 0, x1, 479); XFlush(display); #else GrLine(window, gc, x1, 0, x1, 479); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // General Line ///////////////////////////////////////////////// printf("General Line(XDrawLine)\n"); start_timer(); for(c=0; c<count*22; c++) { x1 = random()%640; x2 = random()%640; y1 = random()%480; y2 = random()%480; #ifdef TEST_FOR_X XDrawLine(display, window, gc, x1, y1, x2, y2); XFlush(display); #else GrLine(window, gc, x1, y1, x2, y2); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // Point ////////////////////////////////////////////////// printf("XPoint\n"); start_timer(); for(c=0; c<count*25; c++) { x1 = random()%640; y1 = random()%480; #ifdef TEST_FOR_X XDrawPoint(display, window, gc, x1, y1); XFlush(display); #else GrPoint(window, gc, x1, y1); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // Rectangle ////////////////////////////////////////////////// printf("XRectangle\n"); start_timer(); for(c=0; c<count*20; c++) { x1=random()%639; y1=random()%479; x2=random()%(639-x1)+1; y2=random()%(479-y1)+1; #ifdef TEST_FOR_X XDrawRectangle(display, window, gc, x1, y1, x2, y2); XFlush(display); #else GrRect(window, gc, x1, y1, x2, y2); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // FillRectangle ////////////////////////////////////////////////// printf("XFillRectangle\n"); start_timer(); for(c=0; c<count*18; c++) { x1=random()%639; y1=random()%479; x2=random()%(639-x1)+1; y2=random()%(479-y1)+1; #ifdef TEST_FOR_X XFillRectangle(display, window, gc, x1, y1, x2, y2); XFlush(display); #else GrFillRect(window, gc, x1, y1, x2, y2); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // FillPolygon ////////////////////////////////////////////////// printf("XFillPolygon\n"); start_timer(); for(c=0; c<count; c++) { for(c1=0; c1<NUM_POINTS; c1++) { points[c1].x = random()%640; points[c1].y = random()%480; } #ifdef TEST_FOR_X XFillPolygon(display, window, gc, points, NUM_POINTS, 0, 0); XFlush(display); #else GrFillPoly(window, gc, NUM_POINTS, points); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XClearWindow(display, window); #else GrClearWindow(window, GR_TRUE); #endif // CopyArea ///////////////////////////////////////////////// printf("XCopyArea\n"); start_timer(); for(c=0; c<count*5; c++) { x1=random()%320; y1=random()%240; x2=random()%319+1; y2=random()%239+1; #ifdef TEST_FOR_X XCopyArea(display, src_pixmap, window, gc, 0, 0, x2, y2, x1, y1); XFlush(display); #else GrCopyArea(window, gc, x1, y1, x2 ,y2, src_pixmap, 0, 0, 0); GrFlush(); #endif } end_timer(); #ifdef TEST_FOR_X XDestroyWindow(display, window); #else GrClose(); #endif }