- Timestamp:
- Jun 24, 2006, 3:12:14 AM (19 years ago)
- Location:
- trunk/src/lib/graphics/text_engine
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/graphics/text_engine/font.cc
r8763 r8764 31 31 32 32 Font::Font() 33 : data(Font::defaultFontData)33 : data(Font::defaultFontData) 34 34 { 35 35 this->init(); … … 43 43 */ 44 44 Font::Font(const std::string& fontFile, unsigned int renderSize) 45 : data(Font::defaultFontData)45 : data(Font::defaultFontData) 46 46 { 47 47 this->init(); … … 57 57 */ 58 58 Font::Font(const std::string& imageFile) 59 : data(Font::defaultFontData)59 : data(Font::defaultFontData) 60 60 { 61 61 this->init(); … … 82 82 */ 83 83 Font::Font(char** xpmArray) 84 : data(Font::defaultFontData)84 : data(Font::defaultFontData) 85 85 { 86 86 this->init(); … … 133 133 if (Font::defaultFontData.get() == NULL) 134 134 { 135 135 Font::initDefaultFont(); 136 136 this->data = Font::defaultFontData; 137 137 } … … 161 161 { 162 162 this->data = FontDataPointer (new FontData()); 163 164 this->setName(fontFile); 165 this->data->fontTTF = TTF_OpenFont(fontFile.c_str(), renderSize); 166 this->data->renderSize = renderSize; 167 168 if(this->data->fontTTF != NULL) 169 { 170 this->setStyle("c"); 171 if (this->createFastTexture()) 172 return true; 173 else 174 { 175 this->data = Font::defaultFontData; 176 return false; 177 } 178 } 179 else 180 { 181 PRINTF(1)("TTF_OpenFont: %s\n", TTF_GetError()); 163 bool retVal = this->data->loadFontFromTTF(fontFile, renderSize); 164 if (!retVal) 182 165 this->data = Font::defaultFontData; 183 return false; 184 }185 166 167 this->setTexture(this->data->texData); 168 return retVal; 186 169 } 187 170 … … 192 175 bool Font::loadFontFromSDL_Surface(SDL_Surface* surface) 193 176 { 194 if(surface == NULL)195 return false;196 197 177 this->data = FontDataPointer (new FontData()); 198 // loading to a texture. 199 200 bool hasAlpha; 201 SDL_Surface* newSurf = Texture::prepareSurface(surface, hasAlpha); 202 if (newSurf != NULL) 203 { 204 this->data->texData->setSurface(newSurf); 205 this->data->texData->setAlpha(hasAlpha); 206 this->setTexture(Texture::loadTexToGL(newSurf)); 207 } 208 else 209 { 178 bool retVal = this->data->loadFontFromSDL_Surface(surface); 179 if (!retVal) 210 180 this->data = Font::defaultFontData; 211 return false; 212 } 213 214 // initializing the Glyphs. 215 if (this->data->glyphArray == NULL) 216 { 217 float cx,cy; 218 Glyph* tmpGlyph; 219 this->data->glyphArray = new Glyph*[FONT_HIGHEST_KNOWN_CHAR]; 220 for (int i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++) 221 { 222 tmpGlyph = this->data->glyphArray[i] = new Glyph; 223 cx=(float)(i%16)/16.0f; // X Position Of Current Character 224 cy=(float)(i/16)/16.0f; // Y Position Of Current Character 225 226 tmpGlyph->texCoord[0] = cx; 227 tmpGlyph->texCoord[1] = cx+0.0625f; 228 tmpGlyph->texCoord[2] = cy; 229 tmpGlyph->texCoord[3] = cy+0.0625f; 230 tmpGlyph->minX = 0.0f; 231 tmpGlyph->maxX = 1.0f; 232 tmpGlyph->minY = 0.0f; 233 tmpGlyph->maxY = 1.0f; 234 tmpGlyph->width = 1.0f; 235 tmpGlyph->advance = 1.0f; 236 tmpGlyph->bearingX = 0.0f; 237 tmpGlyph->bearingY = 0.0f; 238 tmpGlyph->height = 1.0f; 239 } 240 } 241 return true; 181 182 this->setTexture(this->data->texData); 183 return retVal; 242 184 } 243 185 … … 250 192 void Font::setStyle(const std::string& renderStyle) 251 193 { 252 this->data->renderStyle = TTF_STYLE_NORMAL; 253 254 for (unsigned int i = 0; i < renderStyle.size(); i++) 255 { 256 if (renderStyle[i] == 'b') 257 this->data->renderStyle |= TTF_STYLE_BOLD; 258 else if (renderStyle[i] == 'i') 259 this->data->renderStyle |= TTF_STYLE_ITALIC; 260 else if (renderStyle[i] == 'u') 261 this->data->renderStyle |= TTF_STYLE_UNDERLINE; 262 } 263 if (likely(this->data->fontTTF != NULL)) 264 TTF_SetFontStyle(this->data->fontTTF, this->data->renderStyle); 265 // else 266 // PRINTF(2)("Font was not initialized, please do so before setting the Font-Style.\n"); 267 } 194 this->data->setStyle(renderStyle); 195 } 196 197 198 void Font::setTexture(const TextureDataPointer& texDataPointer) 199 { 200 this->setDiffuseMap(texDataPointer); 201 } 202 268 203 269 204 /** … … 327 262 328 263 329 /**330 * @returns the maximum height of the Font, if the font was initialized, 0 otherwise331 */332 int Font::getMaxHeight() const333 {334 if (likely (this->data->fontTTF != NULL))335 return TTF_FontHeight(this->data->fontTTF);336 else337 return 1;338 }339 340 /**341 * @returns the maximum ascent of the Font, if the font was initialized, 0 otherwise342 *343 * the ascent is the pixels of the font above the baseline344 */345 int Font::getMaxAscent() const346 {347 if (likely(this->data->fontTTF != NULL))348 return TTF_FontAscent(this->data->fontTTF);349 else350 return 0;351 }352 353 /**354 * @returns the maximum descent of the Font, if the font was initialized, 0 otherwise355 *356 * the descent is the pixels of the font below the baseline357 */358 int Font::getMaxDescent() const359 {360 if (likely(this->data->fontTTF != NULL))361 return TTF_FontDescent(this->data->fontTTF);362 else363 return 0;364 }365 366 /**367 * @param glyph: The Glyph to set the Parameters to.368 * @param character: The character to get info about.369 * @returns a Glyph struct of a character. This Glyph is a pointer,370 * and MUST be deleted by the user..371 *372 * This only works for horizontal fonts. see373 * http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html374 * for more info about vertical Fonts375 */376 bool Font::getGlyphMetrics(Glyph* glyph, Uint16 character)377 {378 glyph->character = character;379 if (likely (this->data->fontTTF!= NULL))380 {381 int miX, maX, miY, maY, adv;382 if (TTF_GlyphMetrics(this->data->fontTTF, glyph->character,383 &miX, &maX,384 &miY, &maY,385 &adv) == -1)386 return false;387 glyph->minX = (float)miX / (float)this->data->renderSize;388 glyph->maxX = (float)maX / (float)this->data->renderSize;389 glyph->minY = (float)miY / (float)this->data->renderSize;390 glyph->maxY = (float)maY / (float)this->data->renderSize;391 glyph->advance = (float)adv / (float)this->data->renderSize;392 393 // Calculate the Rest.394 glyph->height = glyph->maxY - glyph->minY;395 glyph->width = glyph->maxX - glyph->minX;396 glyph->bearingX = (glyph->advance - glyph->width) / 2;397 glyph->bearingY = glyph->maxY;398 399 //printf("%c:: %d %d %d %d %d\n", character, miX, maX, miY, maY, adv);400 401 return true;402 }403 return false;404 }405 406 /**407 * @brief creates a Fast-Texture of this Font408 */409 bool Font::createFastTexture()410 {411 /* interesting GLYPHS:412 * 32: space413 * 33-47: Special Characters.414 * 48-57: 0-9415 * 58-63: some more special chars (minor)416 * 65-90: A-Z417 * 97-122: a-z418 */419 int numberOfGlyphs = 91;420 421 this->initGlyphs(32, numberOfGlyphs);422 // this->data->glyphArray[32]->width = .5f; //!< @todo find out the real size of a Space423 424 int rectSize = this->findOptimalFastTextureSize();425 426 // setting default values. (maybe not needed afterwards)427 SDL_Color tmpColor; tmpColor.r = tmpColor.g = tmpColor.b = 0;428 // Surface definition.429 SDL_Rect tmpRect; // this represents a Rectangle for blitting.430 SDL_Surface* tmpSurf = SDL_CreateRGBSurface(SDL_HWSURFACE,431 rectSize, rectSize,432 32,433 #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */434 0x000000FF,435 0x0000FF00,436 0x00FF0000,437 0xFF000000438 #else439 0xFF000000,440 0x00FF0000,441 0x0000FF00,442 0x000000FF443 #endif444 );445 tmpRect.x = 0; tmpRect.y = 0; tmpRect.w = tmpSurf->w; tmpRect.h = tmpSurf->h;446 SDL_SetClipRect(tmpSurf, &tmpRect);447 int maxLineHeight = this->getMaxHeight();448 449 // all the interessting Glyphs450 for (int i = 0; i < 128; i++)451 {452 SDL_Surface* glyphSurf = NULL;453 Glyph* tmpGlyph;454 455 if (tmpGlyph = this->data->glyphArray[i])456 {457 if (tmpGlyph->height*this->data->renderSize > maxLineHeight)458 maxLineHeight = (int)(tmpGlyph->height*this->data->renderSize);459 460 if (tmpRect.x+tmpGlyph->advance*this->data->renderSize > tmpSurf->w)461 {462 tmpRect.x = 0;463 tmpRect.y = tmpRect.y + maxLineHeight;464 }465 if (tmpRect.y + maxLineHeight > tmpSurf->h)466 {467 PRINTF(1)("Protection, so font cannot write over the boundraries (!!this should not heappen!!)\n");468 break;469 }470 // reading in the new Glyph471 if (likely(this->data->fontTTF != NULL))472 {473 SDL_Color white = {255, 255, 255};474 glyphSurf = TTF_RenderGlyph_Blended(this->data->fontTTF, i, white);475 }476 if( glyphSurf != NULL )477 {478 SDL_SetAlpha(glyphSurf, 0, 0);479 int tmpY = tmpRect.y;480 tmpRect.y += this->getMaxAscent()-(int)((float)tmpGlyph->bearingY*this->data->renderSize);481 SDL_BlitSurface(glyphSurf, NULL, tmpSurf, &tmpRect);482 tmpRect.y = tmpY;483 484 tmpGlyph->texCoord[0] = (float)((float)tmpRect.x )/(float)tmpSurf->w;485 tmpGlyph->texCoord[1] = (float)((float)tmpRect.x + tmpGlyph->width*(float)this->data->renderSize)/(float)tmpSurf->w;486 tmpGlyph->texCoord[2] = (float)(tmpRect.y)/(float)tmpSurf->w;487 tmpGlyph->texCoord[3] = (float)((float)tmpRect.y+(float)this->getMaxHeight())/(float)tmpSurf->w;488 SDL_FreeSurface(glyphSurf);489 tmpRect.x += (int)(tmpGlyph->width * this->data->renderSize) + 1;490 }491 }492 }493 // outputting the GLYPH-table494 // char outName[1024];495 // sprintf( outName, "%s-glyphs.bmp", this->getName());496 // SDL_SaveBMP(tmpSurf, outName);497 this->data->texData->setAlpha(true);498 if (this->data->texData->setSurface(tmpSurf))499 this->setTexture(Texture::loadTexToGL(tmpSurf));500 return true;501 }502 503 /**504 * @brief the Internal implementation of setting up the Texture.505 * @param texture the Texture to load.506 * @returns true on success, false otherwise.507 */508 bool Font::setTexture(GLuint texture)509 {510 bool retVal = this->data->texData->setTexture(texture);511 this->setDiffuseMap(data->texData, 0);512 printf("this->texture %d\n", texture);513 //printf(this->getT)514 this->debug();515 return retVal;516 };517 518 /**519 * @brief stores Glyph Metrics in an Array.520 * @param from The Glyph to start from.521 * @param count The number of Glyphs to start From.522 */523 void Font::initGlyphs(Uint16 from, Uint16 count)524 {525 /* initialize the Array, and set all its entries to NULL526 * only if the Glyph-array has not been initialized527 */528 if (!this->data->glyphArray)529 {530 this->data->glyphArray = new Glyph*[FONT_HIGHEST_KNOWN_CHAR];531 for (int i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++)532 this->data->glyphArray[i] = NULL;533 }534 535 Uint16 lastGlyph = from + count;536 537 for (int i = from; i <= lastGlyph; i++)538 {539 // setting up all the Glyphs we like.540 Glyph* newGlyph = new Glyph;541 if (getGlyphMetrics(newGlyph, i))542 data->glyphArray[i] = newGlyph;543 else544 {545 delete newGlyph;546 data->glyphArray[i] = NULL;547 }548 }549 return;550 }551 552 /**553 * @returns the optimal size to use as the texture size554 *555 * @todo: this algorithm can be a lot faster, althought it does556 * not really matter within the init-context, and 128 glyphs.557 *558 * This function searches for a 2^n sizes texture-size, this is for559 * openGL-version < 1.2 compatibility ( and because it is realy easy like this :))560 */561 int Font::findOptimalFastTextureSize()562 {563 if (this->data->glyphArray == NULL)564 return 0;565 566 unsigned int i;567 unsigned int x,y; // the counters568 int maxLineHeight = this->getMaxHeight();569 unsigned int size = 32; // starting Value, we have to start somewhere 32 seems reasonable. (take any small enough 2^i number)570 bool sizeOK = false;571 Glyph* tmpGlyph;572 573 while (!sizeOK)574 {575 x = 0; y = 0;576 for (i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++)577 {578 if((tmpGlyph = this->data->glyphArray[i]) != NULL)579 {580 // getting the height of the highest Glyph in the Line.581 if (tmpGlyph->height*this->data->renderSize > maxLineHeight)582 maxLineHeight = (int)(tmpGlyph->height*this->data->renderSize);583 584 if (x + tmpGlyph->advance*this->data->renderSize > size)585 {586 x = 0;587 y = y + maxLineHeight;588 //maxLineHeight = 0;589 }590 if (y + maxLineHeight + 1 > size)591 break;592 x += (int)(tmpGlyph->advance*this->data->renderSize)+1;593 594 }595 }596 if (i >= FONT_HIGHEST_KNOWN_CHAR-1 || size > 8192)597 sizeOK = true;598 else599 size *= 2;600 }601 return size;602 }603 264 604 265 -
trunk/src/lib/graphics/text_engine/font.h
r8763 r8764 32 32 bool operator==(const Font& font) const { return this->data == font.data; }; 33 33 34 35 34 /// LOADING new Fonts 36 35 bool loadFontFromTTF(const std::string& fontFile, unsigned int renderSize); … … 44 43 inline TTF_Font* getTTF() const { return this->data->getTTF(); }; 45 44 46 int getMaxHeight() const; 47 int getMaxAscent() const; 48 int getMaxDescent() const; 45 inline int getMaxHeight() const { return data->getMaxHeight(); }; 46 inline int getMaxAscent() const { return data->getMaxAscent(); }; 47 inline int getMaxDescent() const { return data->getMaxDescent(); }; 48 49 49 50 50 void createAsciiImage(const std::string& fileName, unsigned int size) const; … … 54 54 private: 55 55 void init(); 56 void initGlyphs(Uint16 from, Uint16 count);57 bool getGlyphMetrics(Glyph* glyph, Uint16 character);58 56 static void initDefaultFont(); 59 57 60 int findOptimalFastTextureSize(); 61 bool createFastTexture(); 62 63 bool setTexture(GLuint texture); 64 58 void setTexture(const TextureDataPointer& texDataPointer); 65 59 66 60 private: -
trunk/src/lib/graphics/text_engine/font_data.cc
r8761 r8764 21 21 #include "compiler.h" 22 22 23 #include "sdlincl.h" 23 #include "texture.h" 24 24 25 25 26 /** … … 65 66 } 66 67 67 68 /** 69 * @returns the maximum height of the Font, if the font was initialized, 0 otherwise 70 */ 71 int FontData::getMaxHeight() const 72 { 73 if (likely (this->fontTTF != NULL)) 74 return TTF_FontHeight(this->fontTTF); 75 else 76 return 1; 77 } 78 79 /** 80 * @returns the maximum ascent of the Font, if the font was initialized, 0 otherwise 81 * 82 * the ascent is the pixels of the font above the baseline 83 */ 84 int FontData::getMaxAscent() const 85 { 86 if (likely(this->fontTTF != NULL)) 87 return TTF_FontAscent(this->fontTTF); 88 else 89 return 0; 90 } 91 92 /** 93 * @returns the maximum descent of the Font, if the font was initialized, 0 otherwise 94 * 95 * the descent is the pixels of the font below the baseline 96 */ 97 int FontData::getMaxDescent() const 98 { 99 if (likely(this->fontTTF != NULL)) 100 return TTF_FontDescent(this->fontTTF); 101 else 102 return 0; 103 } 104 105 106 107 /** 108 * @brief sets The Font. 109 * @param fontFile The file containing the font. 110 * @returns true if loaded, false if something went wrong, or if a font was loaded before. 111 */ 112 bool FontData::loadFontFromTTF(const std::string& fontFile, unsigned int renderSize) 113 { 114 //this->setName(fontFile); 115 this->fontTTF = TTF_OpenFont(fontFile.c_str(), renderSize); 116 this->renderSize = renderSize; 117 118 if(this->fontTTF != NULL) 119 { 120 this->setStyle("c"); 121 if (this->createFastTexture()) 122 return true; 123 else 124 { 125 return false; 126 } 127 } 128 else 129 { 130 PRINTF(1)("TTF_OpenFont: %s\n", TTF_GetError()); 131 return false; 132 } 133 134 } 135 136 137 138 /** 139 * @brief loads a font From an XPM-array. 140 * @param xpmArray the array of the XPM to load the font from. 141 */ 142 bool FontData::loadFontFromSDL_Surface(SDL_Surface* surface) 143 { 144 if(surface == NULL) 145 return false; 146 147 148 bool hasAlpha; 149 SDL_Surface* newSurf = Texture::prepareSurface(surface, hasAlpha); 150 if (newSurf != NULL) 151 { 152 this->texData->setSurface(newSurf); 153 this->texData->setAlpha(hasAlpha); 154 this->texData->setTexture(Texture::loadTexToGL(newSurf)); 155 } 156 else 157 { 158 return false; 159 } 160 161 // initializing the Glyphs. 162 if (this->glyphArray == NULL) 163 { 164 float cx,cy; 165 Glyph* tmpGlyph; 166 this->glyphArray = new Glyph*[FONT_HIGHEST_KNOWN_CHAR]; 167 for (int i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++) 168 { 169 tmpGlyph = this->glyphArray[i] = new Glyph; 170 cx=(float)(i%16)/16.0f; // X Position Of Current Character 171 cy=(float)(i/16)/16.0f; // Y Position Of Current Character 172 173 tmpGlyph->texCoord[0] = cx; 174 tmpGlyph->texCoord[1] = cx+0.0625f; 175 tmpGlyph->texCoord[2] = cy; 176 tmpGlyph->texCoord[3] = cy+0.0625f; 177 tmpGlyph->minX = 0.0f; 178 tmpGlyph->maxX = 1.0f; 179 tmpGlyph->minY = 0.0f; 180 tmpGlyph->maxY = 1.0f; 181 tmpGlyph->width = 1.0f; 182 tmpGlyph->advance = 1.0f; 183 tmpGlyph->bearingX = 0.0f; 184 tmpGlyph->bearingY = 0.0f; 185 tmpGlyph->height = 1.0f; 186 } 187 } 188 return true; 189 } 190 191 /** 192 * @brief sets a specific data->renderStyle 193 * @param data->renderStyle the Style to render: a string (char-array) containing: 194 * i: italic, b: bold, u, underline 195 */ 196 void FontData::setStyle(const std::string& renderStyle) 197 { 198 this->renderStyle = TTF_STYLE_NORMAL; 199 200 for (unsigned int i = 0; i < renderStyle.size(); i++) 201 { 202 if (renderStyle[i] == 'b') 203 this->renderStyle |= TTF_STYLE_BOLD; 204 else if (renderStyle[i] == 'i') 205 this->renderStyle |= TTF_STYLE_ITALIC; 206 else if (renderStyle[i] == 'u') 207 this->renderStyle |= TTF_STYLE_UNDERLINE; 208 } 209 if (likely(this->fontTTF != NULL)) 210 TTF_SetFontStyle(this->fontTTF, this->renderStyle); 211 // else 212 // PRINTF(2)("Font was not initialized, please do so before setting the Font-Style.\n"); 213 } 214 215 216 217 /** 218 * @param glyph: The Glyph to set the Parameters to. 219 * @param character: The character to get info about. 220 * @returns a Glyph struct of a character. This Glyph is a pointer, 221 * and MUST be deleted by the user.. 222 * 223 * This only works for horizontal fonts. see 224 * http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html 225 * for more info about vertical Fonts 226 */ 227 bool FontData::getGlyphMetrics(Glyph* glyph, Uint16 character) 228 { 229 glyph->character = character; 230 if (likely (this->fontTTF!= NULL)) 231 { 232 int miX, maX, miY, maY, adv; 233 if (TTF_GlyphMetrics(this->fontTTF, glyph->character, 234 &miX, &maX, 235 &miY, &maY, 236 &adv) == -1) 237 return false; 238 glyph->minX = (float)miX / (float)this->renderSize; 239 glyph->maxX = (float)maX / (float)this->renderSize; 240 glyph->minY = (float)miY / (float)this->renderSize; 241 glyph->maxY = (float)maY / (float)this->renderSize; 242 glyph->advance = (float)adv / (float)this->renderSize; 243 244 // Calculate the Rest. 245 glyph->height = glyph->maxY - glyph->minY; 246 glyph->width = glyph->maxX - glyph->minX; 247 glyph->bearingX = (glyph->advance - glyph->width) / 2; 248 glyph->bearingY = glyph->maxY; 249 250 //printf("%c:: %d %d %d %d %d\n", character, miX, maX, miY, maY, adv); 251 252 return true; 253 } 254 return false; 255 } 256 257 258 /** 259 * @brief creates a Fast-Texture of this Font 260 */ 261 bool FontData::createFastTexture() 262 { 263 /* interesting GLYPHS: 264 * 32: space 265 * 33-47: Special Characters. 266 * 48-57: 0-9 267 * 58-63: some more special chars (minor) 268 * 65-90: A-Z 269 * 97-122: a-z 270 */ 271 int numberOfGlyphs = 91; 272 273 this->initGlyphs(32, numberOfGlyphs); 274 // this->glyphArray[32]->width = .5f; //!< @todo find out the real size of a Space 275 276 int rectSize = this->findOptimalFastTextureSize(); 277 278 // setting default values. (maybe not needed afterwards) 279 SDL_Color tmpColor; tmpColor.r = tmpColor.g = tmpColor.b = 0; 280 // Surface definition. 281 SDL_Rect tmpRect; // this represents a Rectangle for blitting. 282 SDL_Surface* tmpSurf = SDL_CreateRGBSurface(SDL_HWSURFACE, 283 rectSize, rectSize, 284 32, 285 #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ 286 0x000000FF, 287 0x0000FF00, 288 0x00FF0000, 289 0xFF000000 290 #else 291 0xFF000000, 292 0x00FF0000, 293 0x0000FF00, 294 0x000000FF 295 #endif 296 ); 297 tmpRect.x = 0; tmpRect.y = 0; tmpRect.w = tmpSurf->w; tmpRect.h = tmpSurf->h; 298 SDL_SetClipRect(tmpSurf, &tmpRect); 299 int maxLineHeight = this->getMaxHeight(); 300 301 // all the interessting Glyphs 302 for (int i = 0; i < 128; i++) 303 { 304 SDL_Surface* glyphSurf = NULL; 305 Glyph* tmpGlyph; 306 307 if (tmpGlyph = this->glyphArray[i]) 308 { 309 if (tmpGlyph->height*this->renderSize > maxLineHeight) 310 maxLineHeight = (int)(tmpGlyph->height*this->renderSize); 311 312 if (tmpRect.x+tmpGlyph->advance*this->renderSize > tmpSurf->w) 313 { 314 tmpRect.x = 0; 315 tmpRect.y = tmpRect.y + maxLineHeight; 316 } 317 if (tmpRect.y + maxLineHeight > tmpSurf->h) 318 { 319 PRINTF(1)("Protection, so font cannot write over the boundraries (!!this should not heappen!!)\n"); 320 break; 321 } 322 // reading in the new Glyph 323 if (likely(this->fontTTF != NULL)) 324 { 325 SDL_Color white = {255, 255, 255}; 326 glyphSurf = TTF_RenderGlyph_Blended(this->fontTTF, i, white); 327 } 328 if( glyphSurf != NULL ) 329 { 330 SDL_SetAlpha(glyphSurf, 0, 0); 331 int tmpY = tmpRect.y; 332 tmpRect.y += this->getMaxAscent()-(int)((float)tmpGlyph->bearingY*this->renderSize); 333 SDL_BlitSurface(glyphSurf, NULL, tmpSurf, &tmpRect); 334 tmpRect.y = tmpY; 335 336 tmpGlyph->texCoord[0] = (float)((float)tmpRect.x )/(float)tmpSurf->w; 337 tmpGlyph->texCoord[1] = (float)((float)tmpRect.x + tmpGlyph->width*(float)this->renderSize)/(float)tmpSurf->w; 338 tmpGlyph->texCoord[2] = (float)(tmpRect.y)/(float)tmpSurf->w; 339 tmpGlyph->texCoord[3] = (float)((float)tmpRect.y+(float)this->getMaxHeight())/(float)tmpSurf->w; 340 SDL_FreeSurface(glyphSurf); 341 tmpRect.x += (int)(tmpGlyph->width * this->renderSize) + 1; 342 } 343 } 344 } 345 // outputting the GLYPH-table 346 // char outName[1024]; 347 // sprintf( outName, "%s-glyphs.bmp", this->getName()); 348 // SDL_SaveBMP(tmpSurf, outName); 349 this->texData->setAlpha(true); 350 if (this->texData->setSurface(tmpSurf)) 351 this->texData->setTexture(Texture::loadTexToGL(tmpSurf)); 352 return true; 353 } 354 355 /** 356 * @brief stores Glyph Metrics in an Array. 357 * @param from The Glyph to start from. 358 * @param count The number of Glyphs to start From. 359 */ 360 void FontData::initGlyphs(Uint16 from, Uint16 count) 361 { 362 /* initialize the Array, and set all its entries to NULL 363 * only if the Glyph-array has not been initialized 364 */ 365 if (!this->glyphArray) 366 { 367 this->glyphArray = new Glyph*[FONT_HIGHEST_KNOWN_CHAR]; 368 for (int i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++) 369 this->glyphArray[i] = NULL; 370 } 371 372 Uint16 lastGlyph = from + count; 373 374 for (int i = from; i <= lastGlyph; i++) 375 { 376 // setting up all the Glyphs we like. 377 Glyph* newGlyph = new Glyph; 378 if (getGlyphMetrics(newGlyph, i)) 379 this->glyphArray[i] = newGlyph; 380 else 381 { 382 delete newGlyph; 383 this->glyphArray[i] = NULL; 384 } 385 } 386 return; 387 } 388 389 /** 390 * @returns the optimal size to use as the texture size 391 * 392 * @todo: this algorithm can be a lot faster, althought it does 393 * not really matter within the init-context, and 128 glyphs. 394 * 395 * This function searches for a 2^n sizes texture-size, this is for 396 * openGL-version < 1.2 compatibility ( and because it is realy easy like this :)) 397 */ 398 int FontData::findOptimalFastTextureSize() 399 { 400 if (this->glyphArray == NULL) 401 return 0; 402 403 unsigned int i; 404 unsigned int x,y; // the counters 405 int maxLineHeight = this->getMaxHeight(); 406 unsigned int size = 32; // starting Value, we have to start somewhere 32 seems reasonable. (take any small enough 2^i number) 407 bool sizeOK = false; 408 Glyph* tmpGlyph; 409 410 while (!sizeOK) 411 { 412 x = 0; y = 0; 413 for (i = 0; i < FONT_HIGHEST_KNOWN_CHAR; i++) 414 { 415 if((tmpGlyph = this->glyphArray[i]) != NULL) 416 { 417 // getting the height of the highest Glyph in the Line. 418 if (tmpGlyph->height*this->renderSize > maxLineHeight) 419 maxLineHeight = (int)(tmpGlyph->height*this->renderSize); 420 421 if (x + tmpGlyph->advance*this->renderSize > size) 422 { 423 x = 0; 424 y = y + maxLineHeight; 425 //maxLineHeight = 0; 426 } 427 if (y + maxLineHeight + 1 > size) 428 break; 429 x += (int)(tmpGlyph->advance*this->renderSize)+1; 430 431 } 432 } 433 if (i >= FONT_HIGHEST_KNOWN_CHAR-1 || size > 8192) 434 sizeOK = true; 435 else 436 size *= 2; 437 } 438 return size; 439 } 440 -
trunk/src/lib/graphics/text_engine/font_data.h
r8761 r8764 55 55 56 56 57 /// LOADING new Fonts 58 bool loadFontFromTTF(const std::string& fontFile, unsigned int renderSize); 59 bool loadFontFromSDL_Surface(SDL_Surface* surface); 60 61 void setStyle(const std::string& renderStyle); 62 63 64 57 65 /** @returns a Pointer to the Array of Glyphs */ 58 66 inline Glyph** getGlyphArray() const { return this->glyphArray; }; … … 60 68 inline TTF_Font* getTTF() const { return this->fontTTF; }; 61 69 70 int getMaxHeight() const; 71 int getMaxAscent() const; 72 int getMaxDescent() const; 73 74 62 75 bool rebuild(); 76 77 78 63 79 64 80 65 81 private: 66 82 FontData(); 83 84 void initGlyphs(Uint16 from, Uint16 count); 85 bool getGlyphMetrics(Glyph* glyph, Uint16 character); 86 87 int findOptimalFastTextureSize(); 88 bool createFastTexture(); 67 89 68 90 private: -
trunk/src/lib/graphics/text_engine/text.cc
r8761 r8764 187 187 this->_font = *newFont; 188 188 189 printf("Font Texture is\n" ); 190 _font.debug(); 191 this->setupTextWidth(); 189 this->setupTextWidth(); 190 } 191 192 /** 193 * @brief set a new Font to this Text. 194 * @param font the Font to set. 195 */ 196 void Text::setFont(const Font& font) 197 { 198 this->_font = font; 192 199 } 193 200 -
trunk/src/lib/graphics/text_engine/text.h
r8761 r8764 44 44 /// SETUP 45 45 void setFont(const std::string& fontFile, unsigned int renderSize); 46 void setFont(const Font& font); 46 47 /** @param blending the blending intensity to set (between 0.0 and 1.0) */ 47 48 inline void setBlending(float blending) { this->_font.setTransparency(blending); };
Note: See TracChangeset
for help on using the changeset viewer.