Font* openfont(Display *d, char *name) { Font *fnt; int fd, i, n; char *buf; Dir *dir; fd = open(name, OREAD); if(fd < 0) return 0; dir = dirfstat(fd); if(dir == nil){ Err0: close(fd); return 0; } n = dir->length; free(dir); buf = malloc(n+1); if(buf == 0) goto Err0; buf[n] = 0; i = read(fd, buf, n); close(fd); if(i != n){ free(buf); return 0; } fnt = buildfont(d, buf, name); free(buf); return fnt; }
Font* openfont(Display *d, char *name) { Font *fnt; char *buf; if((buf = readfile(name)) == nil) return nil; fnt = buildfont(d, buf, name); free(buf); return fnt; }
/* stuff to be initialized for change between fullscreen/windowed */ int initgl() { glShadeModel(GL_SMOOTH); /* select shade model: smooth */ glClearColor(0,0,0,.5); /* black background: r,g,b,alpha */ glClearDepth(1); /* depth buffer setup */ glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); /* unfortunately, need to do this for each resize */ if(!loadgltexture("21font.bmp",&texture[0])) return 0; if(!loadgltexture("21image.bmp",&texture[1])) return 0; buildfont(); return 1; }
void start() { buildfont(); font::s.fixedfunction = true; }
int geninitdraw(char *devdir, void(*error)(Display*, char*), char *fontname, char *label, char *windir, int ref) { int fd, n; Subfont *df; char buf[128]; display = initdisplay(devdir, windir, error); if(display == nil) return -1; /* * Set up default font */ df = getdefont(display); display->defaultsubfont = df; if(df == nil){ fprint(2, "imageinit: can't open default subfont: %r\n"); Error: closedisplay(display); display = nil; return -1; } if(fontname == nil){ fd = open("/env/font", OREAD); if(fd >= 0){ n = read(fd, buf, sizeof(buf)); if(n>0 && n<sizeof buf-1){ buf[n] = 0; fontname = buf; } close(fd); } } /* * Build fonts with caches==depth of screen, for speed. * If conversion were faster, we'd use 0 and save memory. */ if(fontname == nil){ snprint(buf, sizeof buf, "%d %d\n0 %d\t%s\n", df->height, df->ascent, df->n-1, deffontname); //BUG: Need something better for this installsubfont("*default*", df); font = buildfont(display, buf, deffontname); if(font == nil){ fprint(2, "imageinit: can't open default font: %r\n"); goto Error; } }else{ font = openfont(display, fontname); /* BUG: grey fonts */ if(font == nil){ fprint(2, "imageinit: can't open font %s: %r\n", fontname); goto Error; } } display->defaultfont = font; /* * Write label; ignore errors (we might not be running under rio) */ if(label){ snprint(buf, sizeof buf, "%s/label", display->windir); fd = open(buf, OREAD); if(fd >= 0){ read(fd, display->oldlabel, (sizeof display->oldlabel)-1); close(fd); fd = create(buf, OWRITE, 0666); if(fd >= 0){ write(fd, label, strlen(label)); close(fd); } } } snprint(buf, sizeof buf, "%s/winname", display->windir); if(gengetwindow(display, buf, &screen, &_screen, ref) < 0) goto Error; atexit(drawshutdown); return 1; }
int display(SDL_Window *window, int advance) { static int first = 1; static double start = 0., elapsed = 0., mpixels = 0.; static unsigned long frames = 0; static char temps[256]; GLfloat xaspect, yaspect; if (first) { buildfont(); GLfloat id4[] = { 1., 1., 1., 1. }; GLfloat light0_amb[] = { 0.3f, 0.3f, 0.3f, 1.0f }; GLfloat light0_dif[] = { 0.8f, 0.8f, 0.8f, 1.0f }; GLfloat light0_pos[] = { 1., 1., 1., 0. }; spherelist = glGenLists(1); if (!(spherequad = gluNewQuadric())) _throw("Could not allocate GLU quadric object"); glNewList(spherelist, GL_COMPILE); gluSphere(spherequad, 1.3, slices, stacks); glEndList(); if (!locolor) { if (useci) { glMaterialf(GL_FRONT, GL_SHININESS, 50.); } else { glMaterialfv(GL_FRONT, GL_AMBIENT, id4); glMaterialfv(GL_FRONT, GL_DIFFUSE, id4); glMaterialfv(GL_FRONT, GL_SPECULAR, id4); glMaterialf(GL_FRONT, GL_SHININESS, 50.); glLightfv(GL_LIGHT0, GL_AMBIENT, light0_amb); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_dif); glLightfv(GL_LIGHT0, GL_SPECULAR, id4); } glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 180.); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } if (locolor) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); SDL_snprintf(temps, 255, "Measuring performance ..."); first = 0; } if (advance) { z -= 0.5; if (z < -29.) { if (useci) { colorscheme = (colorscheme + 1) % NSCHEMES; _catch(setcolorscheme(window, ncolors, colorscheme)); } z = -3.5; } outer_angle += 0.1f; if (outer_angle > 360.0f) outer_angle -= 360.0f; middle_angle -= 0.37f; if (middle_angle < -360.0f) middle_angle += 360.0f; inner_angle += 0.63f; if (inner_angle > 360.0f) inner_angle -= 360.0f; lonesphere_color += 0.005f; if (lonesphere_color > 1.0f) lonesphere_color -= 1.0f; } if (usestereo) { renderspheres(GL_BACK_LEFT); renderspheres(GL_BACK_RIGHT); } else { renderspheres(GL_BACK); } glDrawBuffer(GL_BACK); glPushAttrib(GL_CURRENT_BIT); glPushAttrib(GL_LIST_BIT); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_LIGHTING); if (useci) glIndexf(254.); else glColor3f(1., 1., 1.); xaspect = (GLfloat)width / (GLfloat)(min(width, height)); yaspect = (GLfloat)height / (GLfloat)(min(width, height)); glRasterPos3f(-0.95f * xaspect, -0.95f * yaspect, -1.5f); glListBase(fontlistbase); glCallLists((GLsizei)strlen(temps), GL_UNSIGNED_BYTE, temps); glPopAttrib(); glPopAttrib(); glPopAttrib(); SDL_GL_SwapWindow(window); if (start > 0.) { elapsed += rrtime() - start; frames++; totalframes++; mpixels += (double)width * (double)height / 1000000.; if (elapsed > benchtime || (maxframes && totalframes > maxframes)) { SDL_snprintf(temps, 255, "%f frames/sec - %f Mpixels/sec", (double)frames / elapsed, mpixels / elapsed); printf("%s\n", temps); elapsed = mpixels = 0.; frames = 0; } } if (maxframes && totalframes > maxframes) goto bailout; start = rrtime(); return 0; bailout: if (spherequad) { gluDeleteQuadric(spherequad); spherequad = NULL; } return -1; }
Font* openfont1(Display *d, char *name) { Font *fnt; int fd, i, n, scale; char *buf, *nambuf, *fname, *freename; nambuf = 0; freename = nil; scale = parsefontscale(name, &fname); fd = open(fname, OREAD); if(fd < 0 && strncmp(fname, "/lib/font/bit/", 14) == 0){ nambuf = smprint("#9/font/%s", fname+14); if(nambuf == nil) return 0; nambuf = unsharp(nambuf); if(nambuf == nil) return 0; if((fd = open(nambuf, OREAD)) < 0){ free(nambuf); return 0; } fname = nambuf; if(scale > 1) { name = smprint("%d*%s", scale, fname); freename = name; } else { name = fname; } } if(fd >= 0) n = _drawflength(fd); if(fd < 0 && strncmp(fname, "/mnt/font/", 10) == 0) { fd = _fontpipe(fname+10); n = 8192; } if(fd < 0) return 0; buf = malloc(n+1); if(buf == 0){ close(fd); free(nambuf); return 0; } i = readn(fd, buf, n); close(fd); if(i <= 0){ free(buf); free(nambuf); return 0; } buf[i] = 0; fnt = buildfont(d, buf, name); free(buf); free(nambuf); free(freename); if(scale != 1) { fnt->scale = scale; fnt->height *= scale; fnt->ascent *= scale; fnt->width *= scale; } return fnt; }