IamEasy_Man

Filled With Confidence , And Never Say Give Up !

【原创】OPENGL ES显示字符串

使用OPENGL ES开发一个应用,显示字符串都那么麻烦,虽然POWERVR等基于OPENGL ES的SDK提供了APPPRINT3D这样的封装类来处理字符串显示,但鉴于开发中我用的不是POWERVR。网上还有一个封装好的类,glfonts for WINCE,把这个类放到程序中,也不知道是否自己的使用是否正确,反正没啥效果。最后发现可以通过这么一种方式实现,首先把字符串打印在dc上,然后生成位图,最后位图纹理贴图。All works are done.

    1 void  glTextShow(WCHAR *fontname, int fontsize, int style, int x, int y, const WCHAR *string)

  2 {
  3     int len, xx = 0, yy = 0, nbpoints = 0, i;
  4     GLshort *points;
  5     GLushort *indices;
  6     HFONT font;
  7     LOGFONTW    lf;    
  8     RECT rect;
  9     static HBITMAP bmp;
 10     static BYTE *img;
 11     static HDC hdc = NULL;
 12     static BITMAPINFO bi;
 13     SIZE sz;
 14     static EGLint width, height;
 15 
 16     if(!fontname || !string)
 17         return;
 18     if(!string[0])
 19         return;
 20 
 21     if(!hdc)
 22     {        
 23         hdc = CreateCompatibleDC(GetDC(hWnd));    
 24         
 25         eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &width);
 26         eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &height);
 27 
 28        
 29         ZeroMemory(&bi, sizeof(BITMAPINFO));
 30         bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
 31         bi.bmiHeader.biWidth = width;
 32         bi.bmiHeader.biHeight = height; 
 33         bi.bmiHeader.biBitCount = 8;
 34         bi.bmiHeader.biPlanes = 1;
 35         bi.bmiHeader.biCompression = BI_RGB;
 36         
 37         bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &img, NULL, 0);
 38     
 39         SelectObject(hdc, bmp);
 40         
 41         SelectObject(hdc, GetStockObject(BLACK_BRUSH));
 42 
 43         SetBkMode(hdc, TRANSPARENT);
 44         SetTextColor(hdc, RGB(255255255));            
 45     }
 46 
 47     Rectangle(hdc, 00, width, height);
 48     ZeroMemory(img, width * height);
 49 
 50     lf.lfCharSet = DEFAULT_CHARSET;
 51     lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
 52     lf.lfEscapement = 0;
 53     wcscpy(lf.lfFaceName, fontname);
 54     lf.lfHeight = -(fontsize * GetDeviceCaps(GetDC(hWnd), LOGPIXELSY) / 72);
 55     lf.lfItalic = (style & 1? TRUE : FALSE;
 56     lf.lfOrientation = 0;
 57     lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
 58     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
 59     lf.lfQuality = DEFAULT_QUALITY;
 60     lf.lfStrikeOut = FALSE;
 61     lf.lfUnderline = (style & 4? TRUE : FALSE;
 62     lf.lfWidth = 0;
 63     lf.lfWeight = (style & 2? FW_BOLD : FW_NORMAL;
 64     
 65     font = CreateFontIndirectW(&lf);
 66 
 67     SelectObject(hdc, font);
 68 
 69     len = wcslen(string);
 70 
 71     GetTextExtentPointW(hdc, string, len, &sz);
 72 
 73     rect.left = max(0, min(x, width));
 74     rect.top = max(0, min(y, height));
 75     rect.right = min(rect.left + sz.cx, width);
 76     rect.bottom = min(rect.top + sz.cy, height);
 77 
 78     DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
 79     
 80     points = (GLshort*)malloc(sz.cx * sz.cy * 2 * sizeof(short));
 81 
 82     for(yy = rect.top; yy < rect.bottom; yy++)
 83     {
 84         for(xx = rect.left; xx < rect.right; xx++)
 85         {
 86             if(img[xx + (height - yy) * width] != 0)
 87             {
 88                 points[nbpoints * 2 + 0= xx - x;
 89                 points[nbpoints * 2 + 1= (short)(rect.top + sz.cy - (yy - rect.top)) - y;
 90                 nbpoints++;
 91             }
 92         }
 93     }
 94     DeleteObject(font);
 95     
 96     indices = (GLushort*)malloc(nbpoints * sizeof(GLushort));
 97     for(i = 0; i < nbpoints; i++)
 98         indices[i] = i;
 99 
100     glMatrixMode(GL_PROJECTION);
101     glPushMatrix();
102     glLoadIdentity(); 
103 
104     glOrthox(0, _INT2FIXED(width), 
105             0, _INT2FIXED(height), 
106             0, _INT2FIXED(1));
107 
108 
109     glMatrixMode(GL_MODELVIEW);
110     glPushMatrix();
111     glLoadIdentity(); 
112 
113     glDisable(GL_DEPTH_TEST);
114     
115     glTranslatex(_INT2FIXED(x), _INT2FIXED(y), 0);    
116     
117     glEnable(GL_ALPHA_TEST);
118     glAlphaFuncx(GL_NOTEQUAL, 0);
119     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
120     glDisableClientState(GL_COLOR_ARRAY);
121     glDisableClientState(GL_NORMAL_ARRAY);
122     glEnableClientState (GL_VERTEX_ARRAY);
123     glVertexPointer(2, GL_SHORT, 0, points);
124 
125     glDrawElements(GL_POINTS,
126                         nbpoints,
127                         GL_UNSIGNED_SHORT,
128                         indices);
129     
130     glDisable(GL_ALPHA_TEST);
131 
132     glEnable(GL_DEPTH_TEST);
133 
134     glPopMatrix();
135     glMatrixMode(GL_PROJECTION);
136     glPopMatrix();
137     glMatrixMode(GL_MODELVIEW);
138 
139     free(indices);
140     free(points);
141 }

 

 

posted on 2009-12-25 22:07  IamEasy_Man  阅读(2373)  评论(0编辑  收藏  举报

导航