Exemplo n.º 1
0
    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;
        }
    }
Exemplo n.º 2
0
    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;
            }
        }
    }
Exemplo n.º 3
0
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;  
  }   
}