font.cpp
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Font
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include <stdio.h>
  20. #include <stdarg.h>
  21. #include "texture.h"
  22. #include "font.h"
  23. #include "font_data.h"
  24. Font::Font() {
  25. int width = 256;
  26. int height = 256;
  27. unsigned char *data = new unsigned char[width * height];
  28. for(int i = 0, j = 0; i < width * height; i++) {
  29. if(font_data_rle[j] == font_data_rle[j + 1]) {
  30. int n = font_data_rle[j + 2];
  31. for(int k = 0; k < n + 2; k++) data[i++] = (unsigned char)font_data_rle[j];
  32. i -= 1;
  33. j += 3;
  34. } else {
  35. data[i] = (unsigned char)font_data_rle[j++];
  36. }
  37. }
  38. glGenTextures(1,&tex_id);
  39. glBindTexture(GL_TEXTURE_2D,tex_id);
  40. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  41. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  42. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  43. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  44. glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,width,height,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,data);
  45. int size = width;
  46. step = size / 16;
  47. for(int y = 0, i = 0; y < 16; y++) {
  48. for(int x = 0; x < 16; x++, i++) {
  49. unsigned char *ptr;
  50. space[i][0] = 0;
  51. for(int j = 0; j < step; j++) {
  52. ptr = data + size * y * step + x * step + j;
  53. int k;
  54. for(k = 0; k < step; k++) {
  55. if(*ptr != 0) break;
  56. ptr += size;
  57. }
  58. if(k != step) break;
  59. space[i][0]++;
  60. }
  61. space[i][1] = 0;
  62. if(space[i][0] == step) continue;
  63. for(int j = step - 1; j >= 0; j--) {
  64. ptr = data + size * y * step + x * step + j;
  65. int k;
  66. for(k = 0; k < step; k++) {
  67. if(*ptr != 0) break;
  68. ptr += size;
  69. }
  70. if(k != step) break;
  71. space[i][1]++;
  72. }
  73. space[i][1] = step - space[i][0] - space[i][1];
  74. }
  75. }
  76. delete data;
  77. list_id = glGenLists(256);
  78. for(int y = 0, i = 0; y < 16; y++) {
  79. for(int x = 0; x < 16; x++, i++) {
  80. float s = (float)x / 16.0f + (float)space[i][0] / (float)size;
  81. float t = (float)y / 16.0f;
  82. float ds = (float)space[i][1] / (float)size;
  83. float dt = 1.0 / 16.0;
  84. glNewList(list_id + i,GL_COMPILE);
  85. glBegin(GL_QUADS);
  86. glTexCoord2f(s,t);
  87. glVertex2i(0,0);
  88. glTexCoord2f(s,t + dt);
  89. glVertex2i(0,step);
  90. glTexCoord2f(s + ds,t + dt);
  91. glVertex2i(space[i][1],step);
  92. glTexCoord2f(s + ds,t);
  93. glVertex2i(space[i][1],0);
  94. glEnd();
  95. glTranslatef(space[i][1],0,0);
  96. glEndList();
  97. }
  98. }
  99. }
  100. Font::~Font() {
  101. glDeleteTextures(1,&tex_id);
  102. glDeleteLists(256,list_id);
  103. }
  104. /*
  105.  */
  106. void Font::enable(int w,int h) {
  107. width = w;
  108. height = h;
  109. glGetFloatv(GL_PROJECTION_MATRIX,projection);
  110. glGetFloatv(GL_MODELVIEW_MATRIX,modelview);
  111. glMatrixMode(GL_PROJECTION);
  112. glLoadIdentity();
  113. glOrtho(0,width,height,0,-1,1);
  114. glMatrixMode(GL_MODELVIEW);
  115. glLoadIdentity();
  116. glDisable(GL_DEPTH_TEST);
  117. glDepthMask(GL_FALSE);
  118. glEnable(GL_BLEND);
  119. glEnable(GL_TEXTURE_2D);
  120. glBindTexture(GL_TEXTURE_2D,tex_id);
  121. }
  122. void Font::disable() {
  123. glDisable(GL_TEXTURE_2D);
  124. glDisable(GL_BLEND);
  125. glDepthMask(GL_TRUE);
  126. glEnable(GL_DEPTH_TEST);
  127. glMatrixMode(GL_PROJECTION);
  128. glLoadMatrixf(projection);
  129. glMatrixMode(GL_MODELVIEW);
  130. glLoadMatrixf(modelview);
  131. }
  132. /*
  133.  */
  134. void Font::puts(float x,float y,const char *str) {
  135. for(int i = 0; i < 2; i++) {
  136. if(i == 0) glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR);
  137. else glBlendFunc(GL_ONE,GL_ONE);
  138. glPushMatrix();
  139. glTranslatef(x,y,0);
  140. char *s = (char*)str;
  141. for(int lines = 0; *s; s++) {
  142. if(*s == 'n') {
  143. lines++;
  144. glLoadIdentity();
  145. glTranslatef(x,y + step * lines,0);
  146. } else if(*s == 'r') {
  147. glLoadIdentity();
  148. glTranslatef(x,y + step * lines,0);
  149. } else if(*s == 't') {
  150. glTranslatef(step * 2,0,0);
  151. } else if(*s == ' ') {
  152. glTranslatef(step / 2,0,0);
  153. } else {
  154. glCallList(list_id + *(unsigned char*)s);
  155. }
  156. }
  157. glPopMatrix();
  158. }
  159. }
  160. /*
  161.  */
  162. void Font::printf(float x,float y,const char *format,...) {
  163. char buf[1024];
  164. va_list argptr;
  165. va_start(argptr,format);
  166. vsprintf(buf,format,argptr);
  167. va_end(argptr);
  168. puts(x,y,buf);
  169. }
  170. /*
  171.  */
  172. void Font::printfc(float x,float y,const char *format,...) {
  173. char buf[1024];
  174. va_list argptr;
  175. va_start(argptr,format);
  176. vsprintf(buf,format,argptr);
  177. va_end(argptr);
  178. char *s = buf;
  179. char *line = buf;
  180. for(int length = 0, lines = 0;; s++) {
  181. if(*s != 'n' && *s != '') {
  182. if(*s == ' ') length += step / 2;
  183. else if(*s == 't') length += step * 2;
  184. else length += space[*(unsigned char*)s][1];
  185. }
  186. else {
  187. if(*s == '') {
  188. printf(x - length / 2,y + step * lines,"%s",line);
  189. break;
  190. }
  191. *s = '';
  192. puts(x - length / 2,y + step * lines,line);
  193. line = s + 1;
  194. length = 0;
  195. lines++;
  196. }
  197. }
  198. }