📄 grx11.c
字号:
unsigned char* line_write = blit->dst_line + blit->x * 3; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read++, write += 3 ) { unsigned char p = read[0]; write[0] = p; write[1] = p; write[2] = p; } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_rgb888 = { 24, 24, 0xFF0000L, 0x00FF00U, 0x0000FF, gr_x11_convert_rgb_to_rgb888, gr_x11_convert_gray_to_rgb888 }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** BLITTING ROUTINES FOR BGR888 *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static void gr_x11_convert_rgb_to_bgr888( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x * 3; unsigned char* line_write = blit->dst_line + blit->x * 3; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read += 3, write += 3 ) { write[0] = read[2]; write[1] = read[1]; write[2] = read[0]; } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_bgr888 = { 24, 24, 0x0000FF, 0x00FF00U, 0xFF0000L, gr_x11_convert_rgb_to_bgr888, gr_x11_convert_gray_to_rgb888 /* the same for bgr888 */ }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** BLITTING ROUTINES FOR RGB8880 *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static void gr_x11_convert_rgb_to_rgb8880( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x * 3; unsigned char* line_write = blit->dst_line + blit->x * 4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read += 3, write += 4 ) { uint32 r = read[0]; uint32 g = read[1]; uint32 b = read[2]; *(uint32*)write = ( ( r << 24 ) | ( g << 16 ) | ( b << 8 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static void gr_x11_convert_gray_to_rgb8880( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x; unsigned char* line_write = blit->dst_line + blit->x*4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read ++, write += 4 ) { uint32 p = read[0]; *(uint32*)write = ( ( p << 24 ) | ( p << 16 ) | ( p << 8 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_rgb8880 = { 24, 32, 0xFF000000UL, 0x00FF0000L, 0x0000FF00U, gr_x11_convert_rgb_to_rgb8880, gr_x11_convert_gray_to_rgb8880 }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** BLITTING ROUTINES FOR RGB0888 *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static void gr_x11_convert_rgb_to_rgb0888( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x * 3; unsigned char* line_write = blit->dst_line + blit->x * 4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read += 3, write += 4 ) { uint32 r = read[0]; uint32 g = read[1]; uint32 b = read[2]; *(uint32*)write = ( ( r << 16 ) | ( g << 8 ) | ( b << 0 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static void gr_x11_convert_gray_to_rgb0888( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x; unsigned char* line_write = blit->dst_line + blit->x * 4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read ++, write += 4 ) { uint32 p = read[0]; *(uint32*)write = ( ( p << 16 ) | ( p << 8 ) | ( p << 0 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_rgb0888 = { 24, 32, 0x00FF0000L, 0x0000FF00U, 0x000000FF, gr_x11_convert_rgb_to_rgb0888, gr_x11_convert_gray_to_rgb0888 }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** BLITTING ROUTINES FOR BGR8880 *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static void gr_x11_convert_rgb_to_bgr8880( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x * 3; unsigned char* line_write = blit->dst_line + blit->x * 4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read += 3, write += 4 ) { uint32 r = read[0]; uint32 g = read[1]; uint32 b = read[2]; *(uint32*)write = ( ( r << 8 ) | ( g << 16 ) | ( b << 24 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_bgr8880 = { 24, 32, 0x0000FF00U, 0x00FF0000L, 0xFF000000UL, gr_x11_convert_rgb_to_bgr8880, gr_x11_convert_gray_to_rgb8880 /* the same for bgr8880 */ }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** BLITTING ROUTINES FOR BGR0888 *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static void gr_x11_convert_rgb_to_bgr0888( grX11Blitter* blit ) { unsigned char* line_read = blit->src_line + blit->x * 3; unsigned char* line_write = blit->dst_line + blit->x * 4; int h = blit->height; for ( ; h > 0; h-- ) { unsigned char* read = line_read; unsigned char* write = line_write; int x = blit->width; for ( ; x > 0; x--, read += 3, write += 4 ) { uint32 r = read[0]; uint32 g = read[1]; uint32 b = read[2]; *(uint32*)write = ( ( r << 0 ) | ( g << 8 ) | ( b << 16 ) ); } line_read += blit->src_pitch; line_write += blit->dst_pitch; } } static const grX11Format gr_x11_format_bgr0888 = { 24, 32, 0x000000FF, 0x0000FF00U, 0x00FF0000L, gr_x11_convert_rgb_to_bgr0888, gr_x11_convert_gray_to_rgb0888 /* the same for bgr0888 */ }; /************************************************************************/ /************************************************************************/ /***** *****/ /***** X11 DEVICE SUPPORT *****/ /***** *****/ /************************************************************************/ /************************************************************************/ static const grX11Format* gr_x11_formats[] = { &gr_x11_format_rgb565, &gr_x11_format_bgr565, &gr_x11_format_rgb555, &gr_x11_format_bgr555, &gr_x11_format_rgb888, &gr_x11_format_bgr888, &gr_x11_format_rgb0888, &gr_x11_format_bgr0888, &gr_x11_format_rgb8880, &gr_x11_format_bgr8880, NULL, }; typedef struct grX11DeviceRec_ { Display* display; Cursor idle; Cursor busy; const grX11Format* format; int scanline_pad; Visual* visual; } grX11Device; static grX11Device x11dev; static void gr_x11_device_done( void ) { if ( x11dev.display ) { XCloseDisplay( x11dev.display ); x11dev.display = NULL; } } static int gr_x11_device_init( void ) { memset( &x11dev, 0, sizeof ( x11dev ) ); XrmInitialize(); x11dev.display = XOpenDisplay( "" ); if ( !x11dev.display ) { fprintf( stderr, "cannot open X11 display\n" ); return -1; } x11dev.idle = XCreateFontCursor( x11dev.display, XC_left_ptr ); x11dev.busy = XCreateFontCursor( x11dev.display, XC_watch ); { int count; XDepth* format; XDepth* formats; XVisualInfo templ; formats = XListPixmapFormats( x11dev.display, &count );#ifdef TEST printf( "available pixmap formats\n" ); printf( "depth pixbits scanpad\n" );#endif /* TEST */ for ( format = formats; count > 0; count--, format++ ) {#ifdef TEST printf( " %3d %3d %3d\n", format->depth, format->bits_per_pixel, format->scanline_pad );#endif /* TEST */ /* note, the 32-bit modes return a depth of 24, */ /* and 32 bits per pixel */ switch ( format->depth ) { case 16: case 24: case 32: { int count2; XVisualInfo* visuals; XVisualInfo* visual; templ.screen = DefaultScreen( x11dev.display ); templ.depth = format->depth; visuals = XGetVisualInfo( x11dev.display, VisualScreenMask | VisualDepthMask, &templ, &count2 ); for ( visual = visuals; count2 > 0; count2--, visual++ ) {#ifdef TEST const char* string = "unknown"; switch ( visual->Class ) { case TrueColor: string = "TrueColor"; break; case DirectColor: string = "DirectColor"; break; case PseudoColor: string = "PseudoColor"; break; case StaticGray: string = "StaticGray"; break; case StaticColor: string = "StaticColor"; break; case GrayScale: string = "GrayScale"; break; } printf( "> RGB %04lx:%04lx:%04lx, colors %3d, bits %2d %s\n", visual->red_mask, visual->green_mask, visual->blue_mask, visual->colormap_size, visual->bits_per_rgb, string );#endif /* TEST */ /* compare to the list of supported formats */ { const grX11Format** pcur_format = gr_x11_formats; const grX11Format* cur_format; for (;;) { cur_format = *pcur_format++; if ( cur_format == NULL ) break; if ( format->depth == cur_format->x_depth && format->bits_per_pixel == cur_format->x_bits_per_pixel && visual->red_mask == cur_format->x_red_mask && visual->green_mask == cur_format->x_green_mask && visual->blue_mask == cur_format->x_blue_mask ) { x11dev.format = cur_format; x11dev.scanline_pad = format->scanline_pad; x11dev.visual = visual->visual; XFree( visuals ); XFree( formats ); return 0; } } } } /* for visuals */ XFree( visuals ); } break; default: ; } /* switch format depth */ } /* for formats */ XFree( formats ); } fprintf( stderr, "unsupported X11 display depth!\n" ); return -1; } /************************************************************************/ /************************************************************************/ /***** *****/ /***** X11 SURFACE SUPPORT *****/ /***** *****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -