📄 gdkrender-fb.c
字号:
r = dst[gdk_display->red_byte]; tmp = (fg_r - r) * (gint)grayval; r = r + ((tmp + (tmp >> 8) + 0x80) >> 8); dst[gdk_display->red_byte] = r; g = dst[gdk_display->green_byte]; tmp = (fg_g - g) * (gint)grayval; g = g + ((tmp + (tmp >> 8) + 0x80) >> 8); dst[gdk_display->green_byte] = g; b = dst[gdk_display->blue_byte]; tmp = (fg_b - b) * (gint)grayval; b = b + ((tmp + (tmp >> 8) + 0x80) >> 8); dst[gdk_display->blue_byte] = b; } } }}/************************************* * gc->fill_rectangle() implementations *************************************/voidgdk_fb_fill_rectangle_generic (GdkDrawable *drawable, GdkGC *gc, GdkRectangle *rect, GdkColor *color){ GdkDrawableFBData *private; GdkSpan *spans; int i; if (!_gdk_fb_is_active_vt) return; private = GDK_DRAWABLE_FBDATA (drawable); spans = g_new (GdkSpan, rect->height); for (i = 0; i < rect->height; i++) { spans[i].x = rect->x - private->abs_x; spans[i].y = rect->y+i - private->abs_y; spans[i].width = rect->width; } gdk_fb_fill_spans (drawable, gc, spans, rect->height, TRUE); g_free (spans);}voidgdk_fb_fill_rectangle_simple_16 (GdkDrawable *drawable, GdkGC *gc, GdkRectangle *rect, GdkColor *color){ GdkGCFBData *gc_private; GdkDrawableFBData *private; guchar *ptr; guint rowstride; int n; gboolean extra; int i; guint32 pixel; gint height; if (!_gdk_fb_is_active_vt) return; private = GDK_DRAWABLE_FBDATA (drawable); gc_private = GDK_GC_FBDATA (gc); rowstride = private->rowstride - rect->width*2; ptr = (guchar *)private->mem + rect->y * private->rowstride + rect->x*2; extra = rect->width&1; n = rect->width>>1; pixel = (color->pixel << 16) | color->pixel; height = rect->height; while (height>0) { i = n; while (i>0) { *(guint32 *)ptr = pixel; ptr += 4; i--; } if (extra) { *(guint16 *)ptr = color->pixel; ptr += 2; } ptr += rowstride; height--; }}voidgdk_fb_fill_rectangle_simple_32 (GdkDrawable *drawable, GdkGC *gc, GdkRectangle *rect, GdkColor *color){ GdkGCFBData *gc_private; GdkDrawableFBData *private; guchar *ptr; guint rowstride; int n; int i; guint32 pixel; gint height; if (!_gdk_fb_is_active_vt) return; private = GDK_DRAWABLE_FBDATA (drawable); gc_private = GDK_GC_FBDATA (gc); rowstride = private->rowstride - rect->width*4; ptr = (guchar *)private->mem + rect->y * private->rowstride + rect->x*4; n = rect->width; pixel = color->pixel; height = rect->height; while (height>0) { i = n; while (i>0) { *(guint32 *)ptr = pixel; ptr += 4; i--; } ptr += rowstride; height--; }}/************************************* * GC state calculation *************************************/void_gdk_fb_gc_calc_state (GdkGC *gc, GdkGCValuesMask changed){ GdkGCFBData *gc_private; int i; gc_private = GDK_GC_FBDATA (gc); gc_private->fill_span = gdk_fb_fill_span_generic; gc_private->fill_rectangle = gdk_fb_fill_rectangle_generic; for (i = 0; i < GDK_NUM_FB_SRCBPP; i++) gc_private->draw_drawable[i] = gdk_fb_draw_drawable_generic; if (changed & _GDK_FB_GC_DEPTH) switch (gc_private->depth) { case 1: gc_private->set_pixel = gdk_fb_set_pixel_1; gc_private->get_color = gdk_fb_get_color_1; break; case 8: gc_private->set_pixel = gdk_fb_set_pixel_8; gc_private->get_color = gdk_fb_get_color_8; break; case 16: gc_private->set_pixel = gdk_fb_set_pixel_16; gc_private->get_color = gdk_fb_get_color_16; break; case 24: gc_private->set_pixel = gdk_fb_set_pixel_24; gc_private->get_color = gdk_fb_get_color_24; break; case 32: gc_private->set_pixel = gdk_fb_set_pixel_32; gc_private->get_color = gdk_fb_get_color_32; break; default: g_assert_not_reached (); break; } if (!gc_private->values.clip_mask) { switch (gc_private->depth) { case 8: gc_private->draw_drawable[GDK_FB_SRC_BPP_8] = gdk_fb_draw_drawable_memmove; break; case 16: gc_private->draw_drawable[GDK_FB_SRC_BPP_16] = gdk_fb_draw_drawable_memmove; break; case 24: gc_private->draw_drawable[GDK_FB_SRC_BPP_8_AA_GRAYVAL] = gdk_fb_draw_drawable_aa_24; gc_private->draw_drawable[GDK_FB_SRC_BPP_24] = gdk_fb_draw_drawable_memmove; break; case 32: gc_private->draw_drawable[GDK_FB_SRC_BPP_32] = gdk_fb_draw_drawable_memmove; break; } } if (!gc_private->values.clip_mask && !gc_private->values.tile && !gc_private->values.stipple && gc_private->values.function == GDK_COPY) { switch (gc_private->depth) { case 1: gc_private->fill_span = gdk_fb_fill_span_simple_1; break; case 8: gc_private->fill_span = gdk_fb_fill_span_simple_8; break; case 16: gc_private->fill_span = gdk_fb_fill_span_simple_16; gc_private->fill_rectangle = gdk_fb_fill_rectangle_simple_16; break; case 24: gc_private->fill_span = gdk_fb_fill_span_simple_24; break; case 32: gc_private->fill_span = gdk_fb_fill_span_simple_32; gc_private->fill_rectangle = gdk_fb_fill_rectangle_simple_32; break; default: g_assert_not_reached (); break; } }}#ifdef ENABLE_SHADOW_FBstatic voidgdk_shadow_fb_copy_rect_0 (gint x, gint y, gint width, gint height){ guchar *dst, *src; gint depth; if (!_gdk_fb_is_active_vt) return; depth = gdk_display->modeinfo.bits_per_pixel / 8; dst = gdk_display->fb_mmap + x * depth + gdk_display->sinfo.line_length * y; src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y; width = width*depth; while (height>0) { memcpy (dst, src, width); dst += gdk_display->sinfo.line_length; src += gdk_display->fb_stride; height--; }}static voidgdk_shadow_fb_copy_rect_90 (gint x, gint y, gint width, gint height){ guchar *dst, *src, *pdst; gint depth; gint w; gint i; if (!_gdk_fb_is_active_vt) return; depth = gdk_display->modeinfo.bits_per_pixel / 8; src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y; dst = gdk_display->fb_mmap + y * depth + gdk_display->sinfo.line_length * (gdk_display->fb_width - x - 1); while (height>0) { w = width; pdst = dst; while (w>0) { for (i = 0; i < depth; i++) *pdst++ = *src++; pdst -= gdk_display->sinfo.line_length + depth; w--; } dst += depth; src += gdk_display->fb_stride - width * depth; height--; }}static voidgdk_shadow_fb_copy_rect_180 (gint x, gint y, gint width, gint height){ guchar *dst, *src, *pdst; gint depth; gint w; gint i; if (!_gdk_fb_is_active_vt) return; depth = gdk_display->modeinfo.bits_per_pixel / 8; src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y; dst = gdk_display->fb_mmap + (gdk_display->fb_width - x - 1) * depth + gdk_display->sinfo.line_length * (gdk_display->fb_height - y - 1) ; while (height>0) { w = width; pdst = dst; while (w>0) { for (i = 0; i < depth; i++) *pdst++ = *src++; pdst -= 2 * depth; w--; } dst -= gdk_display->sinfo.line_length; src += gdk_display->fb_stride - width * depth; height--; }}static voidgdk_shadow_fb_copy_rect_270 (gint x, gint y, gint width, gint height){ guchar *dst, *src, *pdst; gint depth; gint w; gint i; if (!_gdk_fb_is_active_vt) return; depth = gdk_display->modeinfo.bits_per_pixel / 8; src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y; dst = gdk_display->fb_mmap + (gdk_display->fb_height - y - 1) * depth + gdk_display->sinfo.line_length * x; while (height>0) { w = width; pdst = dst; while (w>0) { for (i = 0; i < depth; i++) *pdst++ = *src++; pdst += gdk_display->sinfo.line_length - depth; w--; } dst -= depth; src += gdk_display->fb_stride - width * depth; height--; }}static void (*shadow_copy_rect[4]) (gint x, gint y, gint width, gint height);volatile gint refresh_queued = 0;volatile gint refresh_x1, refresh_y1;volatile gint refresh_x2, refresh_y2;static voidgdk_shadow_fb_refresh (int signum){ gint minx, miny, maxx, maxy; if (!refresh_queued) { struct itimerval timeout; /* Stop the timer */ timeout.it_value.tv_sec = 0; timeout.it_value.tv_usec = 0; timeout.it_interval.tv_sec = 0; timeout.it_interval.tv_usec = 0; setitimer (ITIMER_REAL, &timeout, NULL); return; } minx = refresh_x1; miny = refresh_y1; maxx = refresh_x2; maxy = refresh_y2; refresh_queued = 0; /* clip x */ if (minx < 0) { minx = 0; maxx = MAX (maxx, 0); } if (maxx >= gdk_display->fb_width) { maxx = gdk_display->fb_width-1; minx = MIN (minx, maxx); } /* clip y */ if (miny < 0) { miny = 0; maxy = MAX (maxy, 0); } if (maxy >= gdk_display->fb_height) { maxy = gdk_display->fb_height-1; miny = MIN (miny, maxy); } (*shadow_copy_rect[_gdk_fb_screen_angle]) (minx, miny, maxx - minx + 1, maxy - miny + 1);}voidgdk_shadow_fb_stop_updates (void){ struct itimerval timeout; refresh_queued = 0; /* Stop the timer */ timeout.it_value.tv_sec = 0; timeout.it_value.tv_usec = 0; timeout.it_interval.tv_sec = 0; timeout.it_interval.tv_usec = 0; setitimer (ITIMER_REAL, &timeout, NULL); refresh_queued = 0;}voidgdk_shadow_fb_init (void){ struct sigaction action; action.sa_handler = gdk_shadow_fb_refresh; sigemptyset (&action.sa_mask); action.sa_flags = 0; sigaction (SIGALRM, &action, NULL); shadow_copy_rect[GDK_FB_0_DEGREES] = gdk_shadow_fb_copy_rect_0; shadow_copy_rect[GDK_FB_90_DEGREES] = gdk_shadow_fb_copy_rect_90; shadow_copy_rect[GDK_FB_180_DEGREES] = gdk_shadow_fb_copy_rect_180; shadow_copy_rect[GDK_FB_270_DEGREES] = gdk_shadow_fb_copy_rect_270;}/* maxx and maxy are included */voidgdk_shadow_fb_update (gint minx, gint miny, gint maxx, gint maxy){ struct itimerval timeout; if (gdk_display->manager_blocked) return; g_assert (minx <= maxx); g_assert (miny <= maxy); if (refresh_queued) { refresh_x1 = MIN (refresh_x1, minx); refresh_y1 = MIN (refresh_y1, miny); refresh_x2 = MAX (refresh_x2, maxx); refresh_y2 = MAX (refresh_y2, maxy); refresh_queued = 1; } else { refresh_x1 = minx; refresh_y1 = miny; refresh_x2 = maxx; refresh_y2 = maxy; refresh_queued = 1; getitimer (ITIMER_REAL, &timeout); if (timeout.it_value.tv_usec == 0) { timeout.it_value.tv_sec = 0; timeout.it_value.tv_usec = 20000; /* 20 ms => 50 fps */ timeout.it_interval.tv_sec = 0; timeout.it_interval.tv_usec = 20000; /* 20 ms => 50 fps */ setitimer (ITIMER_REAL, &timeout, NULL); } } }#elsevoidgdk_shadow_fb_stop_updates (void){}voidgdk_shadow_fb_update (gint minx, gint miny, gint maxx, gint maxy){}voidgdk_shadow_fb_init (void){}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -