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

📄 gdkrender-fb.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 3 页
字号:
static voidgdk_fb_fill_span_simple_1 (GdkDrawable *drawable,			   GdkGC       *gc,			   GdkSpan     *span,			   GdkColor    *color){  int curx;  GdkGCFBData *gc_private;  GdkDrawableFBData *private;  guchar *mem, *ptr;  guint rowstride;  gint left, right, y;  if (!_gdk_fb_is_active_vt)    return;  private = GDK_DRAWABLE_FBDATA (drawable);  gc_private = GDK_GC_FBDATA (gc);  g_assert (gc);  g_assert (!gc_private->values.clip_mask &&	    !gc_private->values.tile &&	    !gc_private->values.stipple &&	    gc_private->values.function != GDK_INVERT);  y = span->y;  left = span->x;  right = span->x + span->width;    mem = private->mem;  rowstride = private->rowstride;  {    int fromx = MIN ((left+7)&(~7), right);    int begn = fromx - left, begoff = left % 8, endn;    guchar begmask, endmask;    int body_end = right & ~7;    int body_len = (body_end - fromx)/8;        begmask = ((1 << (begn + begoff)) - 1)      & ~((1 << (begoff)) - 1);    endn = right - body_end;    endmask = (1 << endn) - 1;        ptr = mem + y*rowstride + (left >> 3);	    if (color->pixel)      *ptr |= begmask;    else      *ptr &= ~begmask;        curx = fromx;        if (curx < right)      {	ptr = mem + y*rowstride + (curx >> 3);	memset (ptr, color->pixel?0xFF:0, body_len);		if (endn)	  {	    ptr = mem + y*rowstride + (body_end >> 3);	    if (color->pixel)	      *ptr |= endmask;	    else	      *ptr &= ~endmask;	  }      }  }}static voidgdk_fb_fill_span_simple_8 (GdkDrawable *drawable,			   GdkGC       *gc,			   GdkSpan     *span,			   GdkColor    *color){  GdkGCFBData *gc_private;  GdkDrawableFBData *private;  guchar *mem, *ptr;  guint rowstride;  if (!_gdk_fb_is_active_vt)    return;  private = GDK_DRAWABLE_FBDATA (drawable);  gc_private = GDK_GC_FBDATA (gc);  g_assert (gc);  g_assert (!gc_private->values.clip_mask &&	    !gc_private->values.tile &&	    !gc_private->values.stipple &&	    gc_private->values.function != GDK_INVERT);  mem = private->mem;  rowstride = private->rowstride;  ptr = mem + span->y*rowstride + span->x;  memset (ptr, color->pixel, span->width);}static voidgdk_fb_fill_span_simple_16 (GdkDrawable *drawable,			    GdkGC       *gc,			    GdkSpan     *span,			    GdkColor    *color){  GdkGCFBData *gc_private;  GdkDrawableFBData *private;  guchar *mem;  guint rowstride;  guint16 *p16;  int n;  int i;  if (!_gdk_fb_is_active_vt)    return;  private = GDK_DRAWABLE_FBDATA (drawable);  gc_private = GDK_GC_FBDATA (gc);  g_assert (gc);  g_assert (!gc_private->values.clip_mask &&	    !gc_private->values.tile &&	    !gc_private->values.stipple &&	    gc_private->values.function != GDK_INVERT);  mem = private->mem;  rowstride = private->rowstride;  n = span->width;  p16 = (guint16 *)(mem + span->y * rowstride + span->x*2);  for (i = 0; i < n; i++)    *(p16++) = color->pixel;}static voidgdk_fb_fill_span_simple_24 (GdkDrawable *drawable,			    GdkGC       *gc,			    GdkSpan     *span,			    GdkColor    *color){  GdkGCFBData *gc_private;  GdkDrawableFBData *private;  guchar *mem, *ptr;  guint rowstride;  int n;  guchar redval, greenval, blueval;  guchar *firstline, *ptr_end;  if (!_gdk_fb_is_active_vt)    return;  private = GDK_DRAWABLE_FBDATA (drawable);  gc_private = GDK_GC_FBDATA (gc);  g_assert (gc);  g_assert (!gc_private->values.clip_mask &&	    !gc_private->values.tile &&	    !gc_private->values.stipple &&	    gc_private->values.function != GDK_INVERT);  mem = private->mem;  rowstride = private->rowstride;  redval = color->red>>8;  greenval = color->green>>8;  blueval = color->blue>>8;      n = span->width*3;      firstline = ptr = mem + span->y * rowstride + span->x*3;  ptr_end = ptr+n;  while (ptr < ptr_end)    {      ptr[gdk_display->red_byte] = redval;      ptr[gdk_display->green_byte] = greenval;      ptr[gdk_display->blue_byte] = blueval;      ptr += 3;    }}static voidgdk_fb_fill_span_simple_32 (GdkDrawable *drawable,			    GdkGC       *gc,			    GdkSpan     *span,			    GdkColor    *color){  GdkGCFBData *gc_private;  GdkDrawableFBData *private;  guchar *mem;  guint rowstride;  guint32 *p32;  int n;  int i;  if (!_gdk_fb_is_active_vt)    return;  private = GDK_DRAWABLE_FBDATA (drawable);  gc_private = GDK_GC_FBDATA (gc);  g_assert (gc);  g_assert (!gc_private->values.clip_mask &&	    !gc_private->values.tile &&	    !gc_private->values.stipple &&	    gc_private->values.function != GDK_INVERT);  mem = private->mem;  rowstride = private->rowstride;  n = span->width;  p32 = (guint32 *)(mem + span->y * rowstride + span->x*4);  for (i = 0; i < n; i++)    *(p32++) = color->pixel;}/************************************* * gc->draw_drawable() implementations *************************************/static voidgdk_fb_draw_drawable_generic (GdkDrawable *drawable,			      GdkGC       *gc,			      GdkPixmap   *src,			      GdkFBDrawingContext *dc,			      gint         start_y,			      gint         end_y,			      gint         start_x,			      gint         end_x,			      gint         src_x_off,			      gint         src_y_off,			      gint         draw_direction){  GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);  int cur_x, cur_y;  if (draw_direction < 0)    {      int tmp;      tmp = start_y;      start_y = end_y;      end_y = tmp;      start_y--;      end_y--;            tmp = start_x;      start_x = end_x;      end_x = tmp;      start_x--;      end_x--;    }  for (cur_y = start_y; cur_y != end_y; cur_y+=draw_direction)    {      for (cur_x = start_x; cur_x != end_x; cur_x+=draw_direction)	{	  GdkColor spot;	  	  if (GDK_GC_FBDATA(gc)->values.clip_mask)	    {	      int maskx = cur_x + dc->clipxoff, masky = cur_y + dc->clipyoff;	      guchar foo;	      	      foo = dc->clipmem[masky*dc->clip_rowstride + (maskx >> 3)];	      	      if (!(foo & (1 << (maskx % 8))))		continue;	    }	  	  switch (gdk_fb_drawable_get_color (src, gc, cur_x + src_x_off, cur_y + src_y_off, &spot))	    {	    case GPR_AA_GRAYVAL:	      {		GdkColor realspot, fg;		guint graylevel = spot.pixel;		gint tmp;				if (private->depth == 1)		  {		    if (spot.pixel > 192)		      spot = GDK_GC_FBDATA (gc)->values.foreground;		    else		      spot = GDK_GC_FBDATA (gc)->values.background;		    break;		  }		else		  {		    if (graylevel >= 254)		      {			spot = GDK_GC_FBDATA (gc)->values.foreground;		      }		    else if (graylevel <= 2)		      {			if (!dc->draw_bg)			  continue;						spot = GDK_GC_FBDATA (gc)->values.background;		      }		    else		      {			switch ((GDK_GC_FBDATA (gc)->get_color) (drawable, gc, cur_x, cur_y, &realspot))			  {			  case GPR_USED_BG:			    {			      int bgx, bgy;			      			      bgx = (cur_x - GDK_DRAWABLE_IMPL_FBDATA (dc->bg_relto)->abs_x) % GDK_DRAWABLE_IMPL_FBDATA (dc->bgpm)->width + private->abs_x;			      bgy = (cur_y - GDK_DRAWABLE_IMPL_FBDATA (dc->bg_relto)->abs_y) % GDK_DRAWABLE_IMPL_FBDATA (dc->bgpm)->height + private->abs_y;			      gdk_fb_drawable_get_color (dc->bgpm, gc, bgx, bgy, &realspot);			    }			    break;			  case GPR_NONE:			    break;			  default:			    g_assert_not_reached ();			    break;			  }						fg = GDK_GC_FBDATA (gc)->values.foreground;			/* Now figure out what 'spot' should actually look like */			fg.red >>= 8;			fg.green >>= 8;			fg.blue >>= 8;			realspot.red >>= 8;			realspot.green >>= 8;			realspot.blue >>= 8;							tmp = (fg.red - realspot.red) * graylevel;			spot.red = realspot.red + ((tmp + (tmp >> 8) + 0x80) >> 8);			spot.red <<= 8;						tmp = (fg.green - realspot.green) * graylevel;			spot.green = realspot.green + ((tmp + (tmp >> 8) + 0x80) >> 8);			spot.green <<= 8;						tmp = (fg.blue - realspot.blue) * graylevel;			spot.blue = realspot.blue + ((tmp + (tmp >> 8) + 0x80) >> 8);			spot.blue <<= 8;						/* Now find the pixel for this thingie */			switch (private->depth)			  {			  case 8:			    if (!gdk_colormap_alloc_color (private->colormap, &spot, FALSE, TRUE))			      {				g_error ("Can't allocate AA color!");			      }			    break;			  case 16:			    spot.pixel = (spot.red >> (16 - gdk_display->modeinfo.red.length)) << gdk_display->modeinfo.red.offset;			    spot.pixel |= (spot.green >> (16 - gdk_display->modeinfo.green.length)) << gdk_display->modeinfo.green.offset;			    spot.pixel |= (spot.blue >> (16 - gdk_display->modeinfo.blue.length)) << gdk_display->modeinfo.blue.offset;			    break;			  case 24:			  case 32:			    spot.pixel = ((spot.red & 0xFF00) >> 8  << (gdk_display->modeinfo.red.offset))			      | ((spot.green & 0xFF00) >> 8 << (gdk_display->modeinfo.green.offset))			      | ((spot.blue & 0xFF00) >> 8 << (gdk_display->modeinfo.blue.offset));			    break;			  }		      }		  }	      }	      break;	    case GPR_USED_BG:	      if (!dc->draw_bg)		continue;	      break;	    case GPR_NONE:	      break;	    default:	      g_assert_not_reached ();	      break;	    }	  	  (GDK_GC_FBDATA (gc)->set_pixel) (drawable, gc, cur_x, cur_y, spot.pixel);	}    }}voidgdk_fb_draw_drawable_memmove (GdkDrawable *drawable,			      GdkGC       *gc,			      GdkPixmap   *src,			      GdkFBDrawingContext *dc,			      gint         start_y,			      gint         end_y,			      gint         start_x,			      gint         end_x,			      gint         src_x_off,			      gint         src_y_off,			      gint         draw_direction){  GdkDrawableFBData *src_private = GDK_DRAWABLE_FBDATA (src);  guint depth = src_private->depth;  guint src_rowstride = src_private->rowstride;  guchar *srcmem = src_private->mem;  int linelen = (end_x - start_x)*(depth>>3);  gint cur_y;  if (!_gdk_fb_is_active_vt)    return;  if (draw_direction < 0)    {      int tmp;      tmp = start_y;      start_y = end_y;      end_y = tmp;      start_y--;      end_y--;    }  for(cur_y = start_y; cur_y != end_y; cur_y += draw_direction)    {      memmove (dc->mem + (cur_y * dc->rowstride) + start_x*(depth>>3),	       srcmem + ((cur_y + src_y_off)*src_rowstride) + (start_x + src_x_off)*(depth>>3),	       linelen);    }}static voidgdk_fb_draw_drawable_aa_24 (GdkDrawable *drawable,			    GdkGC       *gc,			    GdkPixmap   *src,			    GdkFBDrawingContext *dc,			    gint         start_y,			    gint         end_y,			    gint         start_x,			    gint         end_x,			    gint         src_x_off,			    gint         src_y_off,			    gint         draw_direction){  GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);  int x, y;  GdkGCFBData *gc_private;  guchar *dmem = private->mem;  guint dst_rowstride = private->rowstride;  guchar *smem = GDK_DRAWABLE_FBDATA (src)->mem;  guint src_rowstride = GDK_DRAWABLE_FBDATA (src)->rowstride;  guchar *dst;  guint grayval;  gint r, g, b, tmp;  GdkColor fg;  gint fg_r, fg_g, fg_b;    if (!_gdk_fb_is_active_vt)    return;  gc_private = GDK_GC_FBDATA (gc);  fg = GDK_GC_FBDATA (gc)->values.foreground;  fg_r = fg.red >> 8;  fg_g = fg.green >> 8;  fg_b = fg.blue >> 8;  if (draw_direction < 0)    {      int tmp;      tmp = start_y;      start_y = end_y;      end_y = tmp;      start_y--;      end_y--;            tmp = start_x;      start_x = end_x;      end_x = tmp;      start_x--;      end_x--;    }  for (y = start_y; y != end_y; y+=draw_direction)    {      for (x = start_x; x != end_x; x+=draw_direction)	{	  grayval = smem[x + src_x_off + (y + src_y_off) * src_rowstride];	  if ((grayval <= 2) && (!dc->draw_bg))	    continue;	  dst = &dmem[x*3 + y*dst_rowstride];	  	  if (grayval >= 254)	    {	      dst[gdk_display->red_byte] = fg_r;	      dst[gdk_display->green_byte] = fg_g;	      dst[gdk_display->blue_byte] = fg_b;	    }	  else if (grayval <= 2)	    {	      dst[gdk_display->red_byte] = GDK_GC_FBDATA (gc)->values.background.red >> 8;	      dst[gdk_display->green_byte] = GDK_GC_FBDATA (gc)->values.background.green >> 8;	      dst[gdk_display->blue_byte] = GDK_GC_FBDATA (gc)->values.background.blue >> 8;	    }	  else	    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -