SDL 画图,画点,SDL_Color转化Uint32代码

来源:互联网 发布:淘宝打折工具哪个好 编辑:程序博客网 时间:2024/06/06 13:45
/** * Name : SDLColorToColor * * Change from an "SDL_Color" to an Uint32 * sdl_color input SDL_Color Color * return Uint32 Color */Uint32 SDLColorToColor(SDL_Color* sdl_color){return  SDL_MapRGB(screen->format, sdl_color->r, sdl_color->g, sdl_color->b);}/* * Return the pixel value at (x, y) 获取像素 * NOTE: The surface must be locked before calling this! */Uint32 get_pixel(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;    case 2:        return *(Uint16 *)p;    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;    case 4:        return *(Uint32 *)p;    default:        return 0;       /* shouldn't happen, but avoids warnings */    }}/* * Set the pixel at (x, y) to the given value 设置像素 * NOTE: The surface must be locked before calling this! */void put_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel){    switch (surface->format->BytesPerPixel)  {    case 1: // Assuming 8-bpp    {      Uint8 *bufp;      bufp = (Uint8 *)surface->pixels + y*surface->pitch + x;      *bufp = pixel;    }    break;    case 2: // Probably 15-bpp or 16-bpp    {      Uint16 *bufp;      bufp = (Uint16 *)surface->pixels + y*surface->pitch/2 + x;      *bufp = pixel;    }    break;    case 3: // Slow 24-bpp mode, usually not used    {      Uint8 *bufp;      bufp = (Uint8 *)surface->pixels + y*surface->pitch + x * 3;      if(SDL_BYTEORDER == SDL_LIL_ENDIAN)      {        bufp[0] = pixel;        bufp[1] = pixel >> 8;        bufp[2] = pixel >> 16;      } else {        bufp[2] = pixel;        bufp[1] = pixel >> 8;        bufp[0] = pixel >> 16;      }    }    break;    case 4: // Probably 32-bpp    {      Uint32 *bufp;      bufp = (Uint32 *)surface->pixels + y*surface->pitch/4 + x;      *bufp = pixel;    }    break;  }}/** * dda_line 画像素 *  * screen 屏幕指针 * x     点X * y     点Y * R     颜色R * G     颜色G * B     颜色B */void put_pixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B){Uint32 color = SDL_MapRGB(screen->format, R, G, B);    switch (screen->format->BytesPerPixel)  {    case 1: // Assuming 8-bpp    {      Uint8 *bufp;      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;      *bufp = color;    }    break;    case 2: // Probably 15-bpp or 16-bpp    {      Uint16 *bufp;      bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;      *bufp = color;    }    break;    case 3: // Slow 24-bpp mode, usually not used    {      Uint8 *bufp;      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;      if(SDL_BYTEORDER == SDL_LIL_ENDIAN)      {        bufp[0] = color;        bufp[1] = color >> 8;        bufp[2] = color >> 16;      } else {        bufp[2] = color;        bufp[1] = color >> 8;        bufp[0] = color >> 16;      }    }    break;    case 4: // Probably 32-bpp    {      Uint32 *bufp;      bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;      *bufp = color;    }    break;  }}/** * draw point 画点 */void draw_point(SDL_Surface *screen,POINT p,Uint32 color){int x,y;//x = p.x-m_FaceInfo.headArea.left-1;//y = p.y-m_FaceInfo.headArea.top-1;x = p.x;y = p.y;    if ( SDL_MUSTLOCK(screen) ) {        if ( SDL_LockSurface(screen) < 0 ) {            fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());            return;        }    }put_pixel(screen, x, y, color);    if ( SDL_MUSTLOCK(screen) ) {        SDL_UnlockSurface(screen);    }    /* Update just the part of the display that we've changed */    SDL_UpdateRect(screen, x,y, 1, 1);    return;}/** * draw bresenham line 画bresenham线 */void bresenham_line(SDL_Surface *screen,POINT start, POINT end, Uint32 c){int x1, y1, x2, y2;int dx,dy,x,y,p,const1,const2,inc,tmp;x1 = start.x-m_FaceInfo.headArea.left-1;y1 = start.y-m_FaceInfo.headArea.top-1;x2 = end.x-m_FaceInfo.headArea.left-1;y2 = end.y-m_FaceInfo.headArea.top-1;dx = x2-x1;dy = y2-y1;if(dx*dy >= 0)inc = 1;elseinc = -1;if(abs(dx)>abs(dy)){if(dx<0){tmp = x1;x1 = x2;x2 = tmp;tmp = y1;y1 = y2;y2 = tmp;dx = -dx;dy = -dy;}p = 2*dy-dx;const1 = 2*dy;const2 = 2*(dy-dx);x = x1;y = y1;put_pixel(screen,x,y,c);while(x<x2){x++;if(p<0)p += const1;else{y += inc;p += const2;}put_pixel(screen,x,y,c);}}else{if(dy<0){tmp = x1;x1 = x2;x2 = tmp;tmp = y1;y1 = y2;y2 = tmp;dx = -dx;dy = -dy;}p = 2*dy-dx;const1 = 2*dy;const2 = 2*(dy-dx);x = x1;y = y1;put_pixel(screen,x,y,c);while(y<y2){y++;if(p<0)p += const1;else{x+=inc;p+=const2;}put_pixel(screen,x,y,c);}}}/** * draw line 画bresenham线 */void bresenham_line(SDL_Surface *screen,int x1,int y1,int x2, int y2, Uint32 c){int dx,dy,x,y,p,const1,const2,inc,tmp;dx = x2-x1;dy = y2-y1;if(dx*dy >= 0)inc = 1;elseinc = -1;if(abs(dx)>abs(dy)){if(dx<0){tmp = x1;x1 = x2;x2 = tmp;tmp = y1;y1 = y2;y2 = tmp;dx = -dx;dy = -dy;}p = 2*dy-dx;const1 = 2*dy;const2 = 2*(dy-dx);x = x1;y = y1;put_pixel(screen,x,y,c);while(x<x2){x++;if(p<0)p += const1;else{y += inc;p += const2;}put_pixel(screen,x,y,c);}}else{if(dy<0){tmp = x1;x1 = x2;x2 = tmp;tmp = y1;y1 = y2;y2 = tmp;dx = -dx;dy = -dy;}p = 2*dy-dx;const1 = 2*dy;const2 = 2*(dy-dx);x = x1;y = y1;put_pixel(screen,x,y,c);while(y<y2){y++;if(p<0)p += const1;else{x+=inc;p+=const2;}put_pixel(screen,x,y,c);}}}/** * dda_line 画线 *  * screen 屏幕指针 * start  开始点 * end    结束点 * c      颜色 */void dda_line(SDL_Surface *screen,POINT start, POINT end, Uint32 c){int xa, ya, xb, yb;float delta_x,delta_y,x,y;int dx,dy,steps,k;//xa = start.x-m_FaceInfo.headArea.left-1;//ya = start.y-m_FaceInfo.headArea.top-1;//xb = end.x-m_FaceInfo.headArea.left-1;//yb = end.y-m_FaceInfo.headArea.top-1;xa = start.x;ya = start.y;xb = end.x;yb = end.y;dx = xb-xa;dy = yb-ya; if(abs(dx)>abs(dy))steps = abs(dx);elsesteps = abs(dy); delta_x = (float)dx/(float)steps;delta_y = (float)dy/(float)steps;x = (float)xa;y = (float)ya;put_pixel(screen,x,y,c);for(k = 0;k<steps;k++){x+=delta_x;y+=delta_y;put_pixel(screen,x,y,c);}return ;}/** * dda_line 画线 *  * screen 屏幕指针 * xa     开始点X * ya     开始点Y * xb     结束点X * yb     结束点Y * c      颜色 */void dda_line(SDL_Surface *screen,int xa,int ya,int xb,int yb,Uint32 c){float delta_x,delta_y,x,y;int dx,dy,steps,k;dx = xb-xa;dy = yb-ya; if(abs(dx)>abs(dy))steps = abs(dx);elsesteps = abs(dy); delta_x = (float)dx/(float)steps;delta_y = (float)dy/(float)steps;x = xa;y = ya;put_pixel(screen,x,y,c);for(k = 0;k<steps;k++){x+=delta_x;y+=delta_y;put_pixel(screen,x,y,c);}return ;}/** * dda_line 画像素 *  * screen 屏幕指针 * x     点X * y     点Y */void DrawPixel(SDL_Surface *screen, int x, int y, Uint32 color){    switch (screen->format->BytesPerPixel)  {    case 1: // Assuming 8-bpp    {      Uint8 *bufp;      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;      *bufp = color;    }    break;    case 2: // Probably 15-bpp or 16-bpp    {      Uint16 *bufp;      bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;      *bufp = color;    }    break;    case 3: // Slow 24-bpp mode, usually not used    {      Uint8 *bufp;      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;      if(SDL_BYTEORDER == SDL_LIL_ENDIAN)      {        bufp[0] = color;        bufp[1] = color >> 8;        bufp[2] = color >> 16;      } else {        bufp[2] = color;        bufp[1] = color >> 8;        bufp[0] = color >> 16;      }    }    break;    case 4: // Probably 32-bpp    {      Uint32 *bufp;      bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;      *bufp = color;    }    break;  }}/** * 画圆调用子方法 *  */void plot_circle_points(SDL_Surface *screen,int xc,int yc,int x,int y,Uint32 c){put_pixel(screen,xc+x,yc+y,c);put_pixel(screen,xc-x,yc+y,c);put_pixel(screen,xc+x,yc-y,c);put_pixel(screen,xc-x,yc-y,c);put_pixel(screen,xc+y,yc+x,c);put_pixel(screen,xc-y,yc+x,c);put_pixel(screen,xc+y,yc-x,c);put_pixel(screen,xc-y,yc-x,c);}/** * 画圆 * * screen 屏 * cp     圆中心点 * radius 半径 * c      颜色 */void bresenham_circle(SDL_Surface *screen,POINT cp,int radius,Uint32 c){int xc, yc;int x,y,p;//xc = cp.x - m_FaceInfo.headArea.left-1;//yc = cp.y - m_FaceInfo.headArea.top-1;xc = cp.x;yc = cp.y;x = 0;y = radius;p = 3-2*radius;while(x<y){plot_circle_points(screen,xc,yc,x,y,c);if(p<0)p=p+4*x+6;else{p=p+4*(x-y)+10;y-=1;}x+=1;}if(x == y)plot_circle_points(screen,xc,yc,x,y,c);}

原创粉丝点击