+ for( unsigned int i = 0; i < chars.size(); i++) {
+ for(UTF8Iterator chr(chars[i]); !chr.done(); ++chr) {
+ int y = row * char_height;
+ int x = col * char_width;
+ if( ++col == wrap ) { col=0; row++; }
+ if( *chr == 0x0020 && glyphs[0x20].surface_idx != -1) continue;
+
+ Glyph glyph;
+ glyph.surface_idx = surface_idx;
+
+ if( glyph_width == FIXED ) {
+ glyph.rect = Rect(x, y, x + char_width, y + char_height);
+ glyph.offset = Vector(0, 0);
+ glyph.advance = char_width;
+ }
+ else {
+ int left = x;
+ while (left < x + char_width && vline_empty(surface, left, y, y + char_height, 64))
+ left += 1;
+ int right = x + char_width - 1;
+ while (right > left && vline_empty(surface, right, y, y + char_height, 64))
+ right -= 1;
+
+ if (left <= right)
+ glyph.rect = Rect(left, y, right+1, y + char_height);
+ else // glyph is completely transparent
+ glyph.rect = Rect(x, y, x + char_width, y + char_height);
+
+ glyph.offset = Vector(0, 0);
+ glyph.advance = glyph.rect.get_width() + 1; // FIXME: might be useful to make spacing configurable
+ }
+
+ glyphs[*chr] = glyph;
+ }
+ if( col>0 && col <= wrap ) {
+ col = 0;
+ row++;
+ }
+ }
+
+ if( surface != NULL ) {
+ SDL_UnlockSurface(surface);
+ SDL_FreeSurface(surface);
+ }