generate.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "fonted.h"
  2. CHAR_DESC vChars[256];
  3. bool PlaceSymbols(int nWidth, int nHeight, CSymbolRange *pRanges, int nRangeCount)
  4. {
  5. int i, j;
  6. int x=1, y=1;
  7. for(i=0; i<nRangeCount; i++)
  8. {
  9. for(j=pRanges[i].First; j<=pRanges[i].Last; j++ )
  10. {
  11. if(y+vChars[j].h+1 >= nHeight) return false;
  12. if(x+vChars[j].w+1 >= nWidth)
  13. {
  14. x=1;
  15. y+=vChars[j].h+1;
  16. if(y+vChars[j].h+1 >= nHeight) return false;
  17. }
  18. vChars[j].x = x;
  19. vChars[j].y = y;
  20. x+=vChars[j].w+1;
  21. }
  22. }
  23. return true;
  24. }
  25. HTEXTURE FontGenerate(char *szFontName,
  26.   int nSize,
  27.   int nPaddingTop, int nPaddingBtm, int nPaddingLft, int nPaddingRgt,
  28.   bool bBold,
  29.   bool bItalic,
  30.   bool bAntialias,
  31.   CSymbolRange *pRanges,
  32.   int nRangeCount)
  33. {
  34. int i,j;
  35. int nWidth, nHeight;
  36. HDC hBMDC;
  37. HBITMAP hBM;
  38. BITMAPINFO bmi;
  39. HFONT hFont;
  40. ABCFLOAT abc;
  41. TEXTMETRIC tTextMetrics;
  42. HTEXTURE tex;
  43. DWORD *pPixels, *pTexData, dwPixel;
  44. // create font
  45. hFont = CreateFont(-nSize, 0, 0, 0, (bBold) ? FW_BOLD : FW_NORMAL,
  46. bItalic, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  47. (bAntialias) ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY,
  48. DEFAULT_PITCH | FF_DONTCARE, szFontName);
  49. if(!hFont) return 0;
  50. // create and setup compatible DC
  51. hBMDC = CreateCompatibleDC(0);
  52. SetTextColor(hBMDC, RGB(255,255,255));
  53. SetBkColor(hBMDC, RGB(0,0,0));
  54. SetBkMode(hBMDC, TRANSPARENT);
  55. SetMapMode(hBMDC, MM_TEXT);
  56.     SetTextAlign(hBMDC, TA_TOP);
  57. SelectObject(hBMDC, hFont);
  58. // calculate symbols metrics
  59. GetTextMetrics(hBMDC, &tTextMetrics);
  60. for (i = 0; i < nRangeCount; i++ )
  61. {
  62. for (j = pRanges[i].First; j <= pRanges[i].Last; j++ )
  63. {
  64. GetCharABCWidthsFloat(hBMDC, j, j, &abc);
  65. // reserve pixels for antialiasing
  66. vChars[j].a = int(abc.abcfA)-1;
  67. vChars[j].c = int(abc.abcfC)-1;
  68. vChars[j].w = int(abc.abcfB)+2 + nPaddingLft+nPaddingRgt;
  69. vChars[j].h = tTextMetrics.tmHeight + nPaddingTop+nPaddingBtm;
  70. }
  71. }
  72. // calculate symbols placement
  73. nWidth=32; nHeight=32;
  74. for(;;)
  75. {
  76. if(PlaceSymbols(nWidth, nHeight, pRanges, nRangeCount)) break;
  77. if(nWidth<=nHeight) nWidth<<=1;
  78. else nHeight<<=1;
  79. if(nWidth > MAX_TEXTURE_SIZE || nHeight > MAX_TEXTURE_SIZE)
  80. {
  81. DeleteObject(hFont);
  82. DeleteDC(hBMDC);
  83. return 0;
  84. }
  85. }
  86. // create DC bitmap
  87. memset(&bmi, 0, sizeof(BITMAPINFO));
  88. bmi.bmiHeader.biWidth = nWidth;
  89. bmi.bmiHeader.biHeight = -nHeight;
  90. bmi.bmiHeader.biBitCount = 32;
  91. bmi.bmiHeader.biCompression = BI_RGB;
  92. bmi.bmiHeader.biPlanes = 1;
  93. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  94. hBM = CreateDIBSection(hBMDC, &bmi, DIB_RGB_COLORS, (void**)&pPixels, 0, 0);
  95. if(!hBM)
  96. {
  97. DeleteObject(hFont);
  98. DeleteDC(hBMDC);
  99. return 0;
  100. }
  101. SelectObject(hBMDC, hBM);
  102. // draw symbols onto DC bitmap
  103. for (i = 0; i < nRangeCount; i++ )
  104. {
  105. for (j = pRanges[i].First; j <= pRanges[i].Last; j++ )
  106. {
  107. char c = (char)j;
  108. TextOut(hBMDC, vChars[j].x-vChars[j].a+nPaddingLft, vChars[j].y+nPaddingTop, &c, 1);
  109. }
  110. }
  111. GdiFlush();
  112. /*
  113. Graphics    graphics(hdc);
  114. FontFamily  fontFamily(L"Times New Roman");
  115. Font        font(&fontFamily, 32, FontStyleRegular, UnitPixel);
  116. SolidBrush  solidBrush(Color(255, 0, 0, 255));
  117. WCHAR       string1[] = L"SingleBitPerPixel";
  118. WCHAR       string2[] = L"AntiAlias";
  119. graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
  120. graphics.DrawString(string1, -1, &font, PointF(10.0f, 10.0f), &solidBrush);
  121. graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
  122. graphics.DrawString(string2, -1, &font, PointF(10.0f, 60.0f), &solidBrush);
  123. */
  124. // transfer DC bitmap onto HGE texture with alpha channel
  125. tex=hge->Texture_Create(nWidth, nHeight);
  126. pTexData=hge->Texture_Lock(tex, false);
  127. for (i=0; i<nHeight; i++)
  128. {
  129. for (j=0; j<nWidth; j++)
  130. {
  131. dwPixel = pPixels[i*nWidth+j];
  132. dwPixel = 0xFFFFFF | ((dwPixel & 0xFF) << 24);
  133. pTexData[i*nWidth+j] = dwPixel;
  134. }
  135. }
  136. hge->Texture_Unlock(tex);
  137. // clean up
  138. DeleteObject(hBM);
  139. DeleteObject(hFont);
  140. DeleteDC(hBMDC);
  141. return tex;
  142. }