⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdkrender-fb.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 3 页
字号:
	      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 + -