void stash::draw_text( size_t idx, float size, float x, float y, const char* s, float* dx ) { if( tex && idx < fonts.size() && fonts[idx].data.size() ) { short isize = (short)(size*10.0f); sth_quad q; for ( unsigned int codepoint, state = 0; *s; ++s) { if (decutf8(&state, &codepoint, *(unsigned char*)s)) continue; if (nverts+6 >= VERT_COUNT) flush_draw(); if (!get_quad(&fonts[idx], codepoint, isize, &x, &y, &q)) continue; float *v = &verts[nverts*4]; v = setv(v, q.x0, q.y0, q.s0, q.t0); v = setv(v, q.x1, q.y0, q.s1, q.t0); v = setv(v, q.x1, q.y1, q.s1, q.t1); v = setv(v, q.x0, q.y0, q.s0, q.t0); v = setv(v, q.x1, q.y1, q.s1, q.t1); v = setv(v, q.x0, q.y1, q.s0, q.t1); nverts += 6; } if (dx) *dx = x; } }
void stash::dim_text( size_t idx, float size, const char* s, float* minx, float* miny, float* maxx, float* maxy ) { if( tex && idx < fonts.size() && fonts[idx].data.size() ) { short isize = (short)(size*10.0f); float x = 0, y = 0; sth_quad q; *minx = *maxx = x; *miny = *maxy = y; for (unsigned int codepoint, state = 0; *s; ++s) { if (decutf8(&state, &codepoint, *(unsigned char*)s)) continue; if (!get_quad(&fonts[idx], codepoint, isize, &x, &y, &q)) continue; if (q.x0 < *minx) *minx = q.x0; if (q.x1 > *maxx) *maxx = q.x1; if (q.y1 < *miny) *miny = q.y1; if (q.y0 > *maxy) *maxy = q.y0; } } }
void database::get(char* plat_fileName, char* db_fileName) { printf("\treading platform file: %s\n", plat_fileName); macros->read_from(plat_fileName, missing_ok); FILE* f = fopen(db_fileName, "r"); if (!f && missing_ok) return; if (!f) perror(db_fileName), Plat.fatal(); printf("\treading database: %s\n", db_fileName); int lineNo = 0; while (!feof(f)) { # define LEN 1024 char line[LEN]; // read line into line[] int i, c; for ( i = 0, c = fgetc(f); i < LEN-1 && c != EOF && (char)c != '\n' && (char)c != '\r'; ++i, c = fgetc(f) ) line[i] = (char)c; line[i] = '\0'; lineNo++; // check for comment if ( strncmp( line, Plat.commentPrefix(), strlen(Plat.commentPrefix())) == 0) continue; static char token1[BUFSIZ]; static char token2[BUFSIZ]; static char token3[BUFSIZ]; static char token4[BUFSIZ]; static bool cannot_recurse = 0; if (cannot_recurse) Plat.fatal("cannot_recurse"); cannot_recurse = true; token1[0] = token2[0] = token3[0] = token4[0] = '\0'; int n = sscanf(line, " %s %s %s %s", token1, token2, token3, token4); if (n < 0) n = sscanf(line, " %s %s %s", token1, token2, token3); // added this line because of next one if (n < 0) n = sscanf(line, " %s %s", token1, token2); // added this line for MW 4 if (n <= 0) { // empty line? char *c; for (c = line; *c && isspace(*c); c++) {} if (*c == '\0') n = 0; // flag empty line, error else if (n == 0) n = -1; // flag error } if ( n == 0 ) { // empty line } else if (n == 2) get_pair(token1, token2, plat_fileName, db_fileName, line, lineNo - 1); else if (n == 4) get_quad(token1, token2, token3, token4, plat_fileName, db_fileName, line, lineNo - 1); else { char err[BUFSIZ]; sprintf(err, "invalid line: \"%s\"\nerror position: line %ld\n", line, (long)lineNo); Plat.fatal(err); } cannot_recurse = false; } }