您的位置:首页 > 其它

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息