关于SDL绘图
指定渲染区域:
http://sdl2.dxkite.cn/SDL2Teach/v3/08_set_viewport.html
//将要显示的区域
SDL_Rect poprect= {100,100,400,200};
//将其加入设置
Window::setViewport(&poprect);
SDL_SetRenderDrawColor(m_render, 0xff, 0xff,0, 0xff);
SDL_RenderFillRect(m_render,nullptr);
绘制像素点:
https://blog.csdn.net/subfate/article/details/8031994
static void SDL_PixelNolock(SDL_Surface* surface, int x, int y, Uint32 color)
{
int bpp = surface->format->BytesPerPixel;
Uint8* p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch (bpp)
{
case 4:
*(Uint32 *)p = color;
break;
case 1:
*p = color;
break;
case 2:
*(Uint16 *)p = color;
break;
case 3:
if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
{
p[0] = (color >> 16) & 0xff;
p[1] = (color >> 8) & 0xff;
p[2] = color & 0xff;
}
else
{
p[0] = color & 0xff;
p[1] = (color >> 8) & 0xff;
p[2] = (color >> 16) & 0xff;
}
break;
}
}
static void SDL_PixelColor(SDL_Surface* surface, int x, int y, Uint32 color)
{
if (SDL_MUSTLOCK(surface))
{
if (SDL_LockSurface(surface) < 0)
{
return;
}
}
SDL_PixelNolock(surface, x, y, color);
if (SDL_MUSTLOCK(surface))
{
SDL_UnlockSurface(surface);
}
}
void SDL_Pixel(SDL_Surface* surface, int x, int y, Uint32 color)
{
SDL_PixelColor(surface, x, y, color);
}
图片旋转与翻转绘制
https://jingyan.baidu.com/article/ed15cb1bb70a431be36981d4.html
表面缩放与获取点颜色 设置点颜色
https://www.cnblogs.com/klobohyz/archive/2012/07/13/2589854.html
Uint32 ReadPixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
return *p;
break;
case 2:
return *(Uint16 *)p;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
break;
case 4:
return *(Uint32 *)p;
break;
default:
return 0; /* shouldn't happen, but avoids warnings */
}
}
void DrawPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
SDL_Surface* SDL_ScaleSurface(SDL_Surface *Surface, Uint16 Width, Uint16 Height)
{
SDL_Surface *_ret = SDL_CreateRGBSurface(Surface->flags, Width, Height, Surface->format->BitsPerPixel,
Surface->format->Rmask, Surface->format->Gmask, Surface->format->Bmask, Surface->format->Amask);
double _stretch_factor_x = (static_cast<double>(Width) / static_cast<double>(Surface->w)),
_stretch_factor_y = (static_cast<double>(Height) / static_cast<double>(Surface->h));
for(Sint32 y = 0; y < Surface->h; y++) //Run across all Y pixels.
for(Sint32 x = 0; x < Surface->w; x++) //Run across all X pixels.
for(Sint32 o_y = 0; o_y < _stretch_factor_y; ++o_y) //Draw _stretch_factor_y pixels for each Y pixel.
for(Sint32 o_x = 0; o_x < _stretch_factor_x; ++o_x) //Draw _stretch_factor_x pixels for each X pixel.
DrawPixel(_ret, static_cast<Sint32>(_stretch_factor_x * x) + o_x,
static_cast<Sint32>(_stretch_factor_y * y) + o_y, ReadPixel(Surface, x, y));
return _ret;
}