Guest User

Untitled

a guest
Jun 21st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. bool Font::Init( std::string fontname, int fontsize, int fontweight, int charsetstart, int charsetend )
  2. {
  3. //:: Initialize stuff
  4. HDC fntdc = CreateCompatibleDC( GetDC( 0 ) );
  5. HFONT fntobj = CreateFont( -fontsize, 0, 0, 0, fontweight,
  6. FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  7. ANTIALIASED_QUALITY, DEFAULT_PITCH, fontname.c_str( ) );
  8. SelectObject( fntdc, fntobj );
  9.  
  10. TEXTMETRIC metrics;
  11. GetTextMetrics( fntdc, &metrics );
  12. mCharHeight = metrics.tmHeight;
  13.  
  14. int mCharSizeX = metrics.tmMaxCharWidth;
  15. int mCharSizeY = metrics.tmHeight;
  16.  
  17. // Get all char widths.
  18. for( int i = 0; i < 256; i++ )
  19. {
  20. if( i == '\t' ) {
  21. GetCharWidth32( fntdc, ' ', ' ', &mChars[i].width );
  22. mChars[i].x = mChars[i].y = 0;
  23. mChars[i].width *= 4;
  24. mChars[i].flags = 2;
  25. } else if( i == '\n' ) {
  26. mChars[i].x = mChars[i].y = 0;
  27. mChars[i].width = 0;
  28. mChars[i].flags = 2;
  29. } else if (i == ' ') {
  30. mChars[i].x = mChars[i].y = 0;
  31. GetCharWidth32( fntdc, i, i, &mChars[i].width );
  32. mChars[i].flags = 2;
  33. } else if( (i >= charsetstart && i <= charsetend) || i == '?' ) {
  34. GetCharWidth32( fntdc, i, i, &mChars[i].width );
  35. mChars[i].flags = 1;
  36. } else {
  37. mChars[i].x = mChars[i].y = 0;
  38. mChars[i].width = 0;
  39. mChars[i].flags = 0;
  40. }
  41. }
  42.  
  43. int mTexWidth = 0;
  44. int mTexHeight = 0;
  45.  
  46. for (int size = 64; size <= 2048; size *= 2) {
  47. bool fit = true;
  48. for (int i = charsetstart, ix = 0, iy = mCharSizeY; i <= charsetend; i++) {
  49. ix += mChars[i].width;
  50. if (ix > size) {
  51. ix = mChars[i].width;
  52. iy += mCharSizeY;
  53. }
  54. if (iy > size) {
  55. fit = false;
  56. break;
  57. }
  58. }
  59. if (fit) break;
  60. }
  61.  
  62. mTexWidth = mTexHeight = size;
  63.  
  64. HBITMAP fntbmp = CreateCompatibleBitmap( GetDC( 0 ), mTexWidth, mTexHeight );
  65. SelectObject( fntdc, fntbmp );
  66. BitBlt( fntdc, 0, 0, mTexWidth, mTexHeight, 0, 0, 0, WHITENESS );
  67.  
  68. for (int i = charsetstart, ix = 0, iy = 0; i <= charsetend; i++) {
  69. {
  70. if( ix + mChars[i] > mTexWidth ) {
  71. ix = 0;
  72. iy += mCharSizeY;
  73. }
  74.  
  75. mChars[i].x = ix;
  76. mChars[i].y = iy;
  77. ix += mChars[i].width;
  78.  
  79. RECT rect;
  80. rect.left = mChars[i].x; rect.right = rect.left + mCharSizeX;
  81. rect.top = mChars[i].y; rect.bottom = rect.top + mCharSizeY;
  82. DrawText( fntdc, (char*)&i, 1, &rect, DT_LEFT | DT_NOPREFIX );
  83. }
  84.  
  85. unsigned int picount = mTexWidth * mTexHeight;
  86. unsigned int* data = new unsigned int[ picount ];
  87. int rval = GetBitmapBits( fntbmp, picount * 4, data );
  88.  
  89. //:: Create real texture!
  90. mTex = new Halia::Texture( mTexWidth, mTexHeight, Halia::TextureFormat::A8L8 );
  91. unsigned short* texbuf = (unsigned short*)mTex->GetBuffer( );
  92. for( unsigned int i = 0; i < picount; i++ )
  93. *texbuf++ = ~( data[i] << 8 ) | 0x00FF;
  94. delete data;
  95.  
  96. //:: Clean shit up!
  97. DeleteObject( fntobj );
  98. DeleteObject( fntbmp );
  99. DeleteObject( fntdc );
  100.  
  101. return true;
  102. };
  103.  
  104. void Font::DrawString( int x, int y, std::string text ) const
  105. {
  106. int ix = x;
  107. int iy = y;
  108.  
  109. for( std::string::iterator i = text.begin( ); i != text.end( ); i++ )
  110. {
  111. char& c = *i;
  112. if (c == '\n') {
  113. ix = x;
  114. iy += mCharHeight;
  115. } else if( mChars[c].flags == 2 ) {
  116. ix += mChars[ c ].width;
  117. } else {
  118. if( mChars[c].flags == 0 ) {
  119. c = '?';
  120. HRS->DrawSprite(
  121. ix,
  122. iy,
  123. mChars[ c ].width,
  124. mCharHeight,
  125. mChars[ c ].x,
  126. mChars[ c ].y,
  127. mChars[ c ].width,
  128. mCharHeight,
  129. mTex,
  130. 0xFFFF0000
  131. );
  132.  
  133. ix += mChars[ c ].width;
  134. }
  135. }
  136. };
Add Comment
Please, Sign In to add comment