`
yarin
  • 浏览: 176342 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

OPENGL ES显示字符串(Windows Mobile)

阅读更多

当然国外有POWERVR提供基于OPENGL ES的SDK封装的APPPRINT3D类来处理字符串显示和GLFONT for windows ce等。

但是我们这里只整理了一个函数:

void  glTextShow(WCHAR *fontname, int fontsize, int style, int x, int y, const WCHAR *string)
{
      int len, xx = 0, yy = 0, nbpoints = 0, i;
      GLshort *points;
      GLushort *indices;
      HFONT font;
      LOGFONTW    lf;    
      RECT rect;
      static HBITMAP bmp;
      static BYTE *img;
      static HDC hdc = NULL;
      static BITMAPINFO bi;
      SIZE sz;
      static EGLint width, height;
  
      if(!fontname || !string)
          return;
      if(!string[0])
          return;
  
      if(!hdc)
      {        
          hdc = CreateCompatibleDC(GetDC(hWnd));    
          
          eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &width);
          eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &height);
  
         
          ZeroMemory(&bi, sizeof(BITMAPINFO));
          bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
          bi.bmiHeader.biWidth = width;
          bi.bmiHeader.biHeight = height; 
          bi.bmiHeader.biBitCount = 8;
          bi.bmiHeader.biPlanes = 1;
          bi.bmiHeader.biCompression = BI_RGB;
          
          bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &img, NULL, 0);
      
          SelectObject(hdc, bmp);
          
          SelectObject(hdc, GetStockObject(BLACK_BRUSH));
  
          SetBkMode(hdc, TRANSPARENT);
          SetTextColor(hdc, RGB(255, 255, 255));            
      }
  
      Rectangle(hdc, 0, 0, width, height);
      ZeroMemory(img, width * height);
  
      lf.lfCharSet = DEFAULT_CHARSET;
      lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
      lf.lfEscapement = 0;
      wcscpy(lf.lfFaceName, fontname);
      lf.lfHeight = -(fontsize * GetDeviceCaps(GetDC(hWnd), LOGPIXELSY) / 72);
      lf.lfItalic = (style & 1) ? TRUE : FALSE;
      lf.lfOrientation = 0;
      lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
      lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
      lf.lfQuality = DEFAULT_QUALITY;
      lf.lfStrikeOut = FALSE;
      lf.lfUnderline = (style & 4) ? TRUE : FALSE;
      lf.lfWidth = 0;
      lf.lfWeight = (style & 2) ? FW_BOLD : FW_NORMAL;
      
      font = CreateFontIndirectW(&lf);
  
      SelectObject(hdc, font);
  
      len = wcslen(string);
  
      GetTextExtentPointW(hdc, string, len, &sz);
  
      rect.left = max(0, min(x, width));
      rect.top = max(0, min(y, height));
      rect.right = min(rect.left + sz.cx, width);
      rect.bottom = min(rect.top + sz.cy, height);
  
      DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
      
      points = (GLshort*)malloc(sz.cx * sz.cy * 2 * sizeof(short));
  
      for(yy = rect.top; yy < rect.bottom; yy++)
      {
          for(xx = rect.left; xx < rect.right; xx++)
          {
              if(img[xx + (height - yy) * width] != 0)
              {
                  points[nbpoints * 2 + 0] = xx - x;
                  points[nbpoints * 2 + 1] = (short)(rect.top + sz.cy - (yy - rect.top)) - y;
                  nbpoints++;
              }
          }
      }
      DeleteObject(font);
      
      indices = (GLushort*)malloc(nbpoints * sizeof(GLushort));
      for(i = 0; i < nbpoints; i++)
          indices[i] = i;
  
      glMatrixMode(GL_PROJECTION);
      glPushMatrix();
      glLoadIdentity(); 
  
      glOrthox(0, _INT2FIXED(width), 
              0, _INT2FIXED(height), 
              0, _INT2FIXED(1));
  
  
      glMatrixMode(GL_MODELVIEW);
      glPushMatrix();
      glLoadIdentity(); 
  
      glDisable(GL_DEPTH_TEST);
      
      glTranslatex(_INT2FIXED(x), _INT2FIXED(y), 0);    
      
      glEnable(GL_ALPHA_TEST);
      glAlphaFuncx(GL_NOTEQUAL, 0);
      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
      glDisableClientState(GL_COLOR_ARRAY);
      glDisableClientState(GL_NORMAL_ARRAY);
      glEnableClientState (GL_VERTEX_ARRAY);
      glVertexPointer(2, GL_SHORT, 0, points);
  
      glDrawElements(GL_POINTS,
                          nbpoints,
                          GL_UNSIGNED_SHORT,
                          indices);
      
      glDisable(GL_ALPHA_TEST);
  
      glEnable(GL_DEPTH_TEST);
  
      glPopMatrix();
      glMatrixMode(GL_PROJECTION);
      glPopMatrix();
      glMatrixMode(GL_MODELVIEW);
  
      free(indices);
      free(points);
}

谢谢支持! 

分享到:
评论

相关推荐

    OpenGL ES显示字符串2(Windows Mobile)

    NULL 博文链接:https://yarin.iteye.com/blog/626025

    基于opengl es 的显示gif的例子

    本示例将探讨如何在OpenGL ES环境中实现GIF动图的显示。 首先,了解GIF格式至关重要。GIF是一种支持动画的图像格式,通过一系列连续的静态图像构成动态效果。它包含一个图像头部、全局颜色表、逻辑屏幕描述符、图像...

    2017-10-27 在以前的代码中加入了opengl ES2.0显示点云的功能,代码毫无保留的分享给大家

    这篇文章将深入探讨如何在旧代码基础上添加OpenGL ES2.0以实现点云显示功能,同时也会涉及与之相关的技术——QT、OpenCV。首先,OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个子集,专为嵌入式设备如智能...

    Android平台使用OpenGLES2.0显示YUV数据

    本教程主要探讨如何在Android系统上,利用OpenGLES2.0图形库来处理和显示从Camera获取的YUV原始数据。YUV是一种常见的颜色空间,广泛应用于视频编码和解码,因为它对带宽的要求相对较低,特别适合移动设备。 首先,...

    使用OpenGL ES对YUV图片进行显示

    在Android应用中,如果你想使用OpenGL ES显示YUV格式的图片,你需要遵循以下步骤: 1. **数据提取**:首先,你需要从YUV数据中提取出Y、U、V三个分量。Y分量代表亮度,U和V代表色度,它们通常以4:2:0的采样率存储,...

    OpenGlEs显示纹理例子程序

    在这个“OpenGlEs显示纹理例子程序”中,我们将探讨如何在Android平台上利用OpenGL ES来显示图像纹理,特别关注BMP格式的图像。 首先,理解OpenGL ES的基础是关键。它是一个状态机,通过一系列的函数调用来改变渲染...

    OpenGL ES 显示RGB数据

    自己做过精简,适合做动画,视频播放,纹理加载方式可以根据自己的需求改动。

    opengl es win32模拟器(63位也适用)

    通常,Windows系统原生支持的是OpenGL而非OpenGL ES,因此对于需要在Windows平台上测试或开发针对OpenGL ES的应用程序的开发者来说,这样的模拟器是必不可少的工具。这个模拟器适用于64位系统,意味着即使在64位环境...

    OPENGL ES 3.0编程指南

    它通常与OpenGL ES不直接交互,但在构建例如3D地理信息系统或可视化应用时,可能会利用Elasticsearch来检索和组织数据,然后通过OpenGL ES进行呈现。 总的来说,OpenGL ES 3.0编程指南涵盖了移动和嵌入式设备图形...

    Windows下基于OpenGLES依据给定的窗口句柄渲染YUV序列,内附实例可以直接运行。

    本项目专注于在Windows操作系统上,通过OpenGLES来处理和显示YUV视频序列,提供了一个可以直接运行的实例——vx_Render_Test。下面将详细阐述相关知识点。 1. **OpenGLES(OpenGL for Embedded Systems)** OpenGL...

    OpenGL与OpenGLES在开发过程中的异同.pdf

    ### OpenGL与OpenGLES在开发过程中的异同 #### 一、引言 OpenGL与OpenGLES都是由Khronos Group维护的跨平台图形应用程序接口(API)。它们为开发人员提供了绘制高质量2D和3D图形的能力。OpenGL主要用于桌面操作系统...

    opengl生成一个字符串数组的相似度灰度图,相似度使用Levenshtein计算,vc6以上环境_wordpic.zip

    它可能在文本相似度分析、数据挖掘、自然语言处理等需要高亮显示字符串相似性的场合有所应用。比如在文本编辑器、代码比对工具、拼写检查器中,相似度灰度图可以直观地帮助用户识别和修改相似但不相同的字符串。 ...

    Mali_OpenGL_ES_Emulator-v3.0.1.g72cc2-Windows-64bit.zip

    Arm Mali OpenGL ES Emulator v3.0.1.g72cc2-Windows-64bit.zip是一款专为64位Windows系统设计的高性能图形处理工具,主要用于模拟Arm Mali系列GPU的OpenGL ES 3.0环境。这款软件的核心目标是为开发者提供一个可靠的...

    OPENGL ES 3.0编程指南.pdf

    OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和嵌入式系统上的图形处理标准。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高...

    Qt+openglEs2加载3D模型,平移、旋转、拾取模型

    Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt...

    Windows&Linux;_opengles2.tar.gz

    _opengles2.tar.gz"压缩包包含了跨平台的OpenGL ES 2.0代码,意味着你可以在这两个操作系统上编译和运行它。 在Windows和Linux系统中编译OpenGL ES 2.0代码,你需要一些关键的开发工具和库。在Windows环境下,你...

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    这个特定的项目旨在通过JNI调用来结合这两个强大的库——OpenGL ES用于图形渲染,OpenCV用于图像处理,从而在Android设备上显示一幅图片。 OpenGL ES是OpenGL的嵌入式版本,主要用于移动设备和嵌入式系统。它是...

    OPENGL ES 入门教程

    Vincent Mobile 3D Rendering Library 是一个免费的 OpenGL ES 工具,可以用于商业或者是非商业的项目。它与 windows 处理函数保持一致,使得可以方便快捷地建立程序。 Hybrid's "Rasteroid" Implementation 是一...

    WinCE mobile openGL ES

    在WinCE(Windows Embedded Compact)平台上支持OpenGL ES,意味着可以为这些移动设备提供更强大的图形功能和更丰富的用户体验。 WinCE Mobile OpenGL ES的实现通常涉及到以下几个关键知识点: 1. **API接口**:...

    Mali_OpenGL_ES_Emulator-v3.0.2.zip.rar

    总的来说,Mali_OpenGL_ES_Emulator是一款强大的开发工具,能够帮助开发者在Windows平台上模拟Mali GPU,以实现高效、准确的OpenGL ES应用测试和调试。通过熟练掌握这款模拟器的使用,开发者可以提高软件质量,减少...

Global site tag (gtag.js) - Google Analytics