SDL2.0--绘制文字
2016-07-08 11:01
197 查看
使用SDL2_ttf绘制文字
- 先下载sdl2_ttf的库,关于如何使用这个库的很多,我只是在说绘制的流程,及那一点的小思想 - 绘制过程:渲染视频------------>渲染文字 - 注意:SDL2_ttf不是多线程安全
//由于我播放的是多路相机的视频,涉及到多线程,但SDL2_ttf引擎不支持多线程安全,所以采取了互斥量控制, //使sdl播放线程串行化 int status = 0; CMutex g_sdl_mutex; void sdl::play(unsigned char*buffer,int buffSize,int&_frameWidth,int&_frameHeight) { //如果其他线程在播放,就等待,确保线程串行化 while (status == 1) Sleep(10); if (buffSize == 0) return; g_sdl_mutex.Lock(); status = 1; //myMutex.Lock(); if (this->isNotFirst== false) { //自适应图像分辨率 sdlTexture = SDL_CreateTexture(sdlRenderer,SDL_PIXELFORMAT_IYUV,SDL_TEXTUREACCESS_STREAMING,_frameWidth,_frameHeight); isNotFirst = true; } //获取窗口大小,自适应 CWnd *myPic=CWnd::FromHandle((HWND)win); CRect myPicRect; myPic->GetClientRect(&myPicRect); sdlrect.x=0; sdlrect.y=0; sdlrect.w=myPicRect.Width(); sdlrect.h=myPicRect.Height(); //更新视屏缓冲到SDL SDL_UpdateTexture( sdlTexture, NULL,buffer, _frameWidth); //SDL_SetVideoMode() //<-------------第一步渲染视频-----------------------------> SDL_RenderCopyEx(sdlRenderer,sdlTexture,NULL,&sdlrect,0,NULL,SDL_FLIP_NONE); //绘制文字回调 if(sdl_draw_text!=NULL) { if (ttf_err != -1) { sdl_draw_text(&sdl_text); SDL_Color color = { 255,0,0 }; color.r=sdl_text.color.r; color.b=sdl_text.color.b; color.g=sdl_text.color.g; //<------------------绘制文字部分------------------------------------> TTF_Font* font = TTF_OpenFont("simhei.ttf", sdl_text.wordSize); if (font == NULL) { AfxMessageBox(_T("获取字体失败")); font = NULL; } if (font != NULL) { //TTF_Init(); //我的工程使用的是UNICODE SDL_Surface*textSurf=TTF_RenderUNICODE_Solid(font,(Uint16*)cstringToUnicode(sdl_text.text),color); SDL_Surface*dst=SDL_GetWindowSurface(screen); SDL_Texture*pTexture=SDL_CreateTextureFromSurface(sdlRenderer,textSurf); SDL_FreeSurface(textSurf); //往渲染器上copy字体 //<-----------------第二步:渲染文字即可-----------------------------> SDL_RenderCopyEx(sdlRenderer,pTexture,NULL,&sdlrect,0,NULL,SDL_FLIP_NONE); SDL_DestroyTexture(pTexture); TTF_CloseFont(font); } } } if(sdl_draw_poly!=NULL) { for(int i=0;i<sdl_polygons->polyNum;++i) { DrawPoly(sdlRenderer,sdl_polygons->sdl_poly[i]); } } //显示 SDL_RenderPresent( sdlRenderer ); //清理渲染器 //SDL_RenderClear( sdlRenderer ); //myMutex.Unlock(); //获取帧 if (sdl_get_frame != NULL) { if (sdl_frame->buffSize < buffSize) { AfxMessageBox(_T("帧缓冲过小!")); return; } //获取到帧数据 memset(sdl_frame->buff, 0, sdl_frame->buffSize); memcpy(sdl_frame->buff, buffer, buffSize); sdl_frame->frameHeight = _frameHeight; sdl_frame->frameWidth = _frameWidth; //对帧数据做一些处理,回调 sdl_get_frame(sdl_frame); } status = 0; g_sdl_mutex.Unlock(); }
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Lesson 9 View port
- Lesson 8 几何渲染
- Lessong 7 纹理加载和渲染
- Lesson 6 SDL扩展库的使用和加载其他格式的图片
- Lesson 4 按键
- Lesson 3 事件驱动编程
- lesson 2 在窗口上显示图像
- 使用SDL2.0进行YUV显示
- SDL2缩放窗口in MFC
- SDL2 for windows with MinGW32
- C++ SDL学习之路 3rd —— 没法关闭SDL窗口?用事件列表!
- C++ SDL学习之路 2nd —— 扩展 —— SDL中的双缓冲
- C++ SDL教程翻译 Lesson 03 Event Driven Programming
- C++ SDL学习之路 2nd —— 第一个显示图片的SDL程序
- C++ SDL教程翻译 Lesson 02 Getting an Image on the Screen
- C++ SDL教程翻译 Lesson 01 Hello SDL
- 最简SDL显示视频实例
- 解决linux(ubuntu12.04) ffmpeg编译后ffplay没有生成的问题
- FFmpeg3.3.2+SDL2实现流媒体音频播放