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

📄 gdkdrawable-fb2.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 3 页
字号:
	{	  cur->width -= private->llim_x - cur->x;	  cur->x = private->llim_x;	}            if (cur->x + cur->width > private->lim_x)	{	  cur->width = private->lim_x - cur->x;	}      if (cur->width <= 0)	cur->width = 0;    }  gdk_region_spans_intersect_foreach (real_clip_region,				      spans,				      nspans,				      sorted,				      gdk_fb_fill_span_helper,				      &info);  gdk_region_destroy (real_clip_region);  if (handle_cursor)    gdk_fb_cursor_unhide ();}voidgdk_fb_drawing_context_init (GdkFBDrawingContext *dc,			     GdkDrawable *drawable,			     GdkGC *gc,			     gboolean draw_bg,			     gboolean do_clipping){  GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);  dc->mem = private->mem;  dc->rowstride = private->rowstride;  dc->handle_cursor = FALSE;  dc->bgpm = NULL;  dc->bg_relto = private->wrapper;  dc->draw_bg = draw_bg;  GDK_CHECK_IMPL (drawable);  if (GDK_IS_WINDOW (private->wrapper))    {      dc->bgpm = GDK_WINDOW_P (private->wrapper)->bg_pixmap;      if (dc->bgpm == GDK_PARENT_RELATIVE_BG)	{	  for (; dc->bgpm == GDK_PARENT_RELATIVE_BG && dc->bg_relto; dc->bg_relto = (GdkWindow *)GDK_WINDOW_P (dc->bg_relto)->parent)	    dc->bgpm = GDK_WINDOW_P (dc->bg_relto)->bg_pixmap;	}      if (dc->bgpm == GDK_NO_BG)	dc->bgpm = NULL;    }  dc->clipxoff = - private->abs_x;  dc->clipyoff = - private->abs_y;  dc->real_clip_region = gdk_fb_clip_region (drawable, gc, do_clipping, TRUE, TRUE);  if (gc)    {      dc->clipxoff -= GDK_GC_FBDATA (gc)->values.clip_x_origin;      dc->clipyoff -= GDK_GC_FBDATA (gc)->values.clip_y_origin;      if (GDK_GC_FBDATA (gc)->values.clip_mask)	{	  dc->clipmem = GDK_DRAWABLE_IMPL_FBDATA (GDK_GC_FBDATA (gc)->values.clip_mask)->mem;	  dc->clip_rowstride = GDK_DRAWABLE_IMPL_FBDATA (GDK_GC_FBDATA (gc)->values.clip_mask)->rowstride;	}    }  if (do_clipping &&      private->mem == GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->mem &&      gdk_fb_cursor_region_need_hide (dc->real_clip_region))    {      dc->handle_cursor = TRUE;      gdk_fb_cursor_hide ();    }}voidgdk_fb_drawing_context_finalize (GdkFBDrawingContext *dc){  gdk_region_destroy (dc->real_clip_region);  if (dc->handle_cursor)    gdk_fb_cursor_unhide ();}voidgdk_fb_draw_drawable_2 (GdkDrawable *drawable,			GdkGC       *gc,			GdkPixmap   *src,			gint         xsrc,			gint         ysrc,			gint         xdest,			gint         ydest,			gint         width,			gint         height,			gboolean     draw_bg,			gboolean     do_clipping){  GdkFBDrawingContext *dc, dc_data;  dc = &dc_data;  GDK_CHECK_IMPL (src);  GDK_CHECK_IMPL (drawable);    gdk_fb_drawing_context_init (dc, drawable, gc, draw_bg, do_clipping);  gdk_fb_draw_drawable_3 (drawable, gc, src, dc, xsrc, ysrc, xdest, ydest, width, height);  gdk_fb_drawing_context_finalize (dc);}voidgdk_fb_draw_drawable_3 (GdkDrawable *drawable,			GdkGC       *gc,			GdkPixmap   *src,			GdkFBDrawingContext *dc,			gint         xsrc,			gint         ysrc,			gint         xdest,			gint         ydest,			gint         width,			gint         height){  GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);  GdkDrawableFBData *src_private = GDK_DRAWABLE_FBDATA (src);  GdkRectangle rect;  int src_x_off, src_y_off;  GdkRegion *tmpreg, *real_clip_region;  int i;  int draw_direction = 1;  gdk_fb_draw_drawable_func *draw_func = NULL;  GdkGCFBData *gc_private;  g_assert (gc);  GDK_CHECK_IMPL (src);  GDK_CHECK_IMPL (drawable);  if (GDK_IS_WINDOW (private->wrapper))    {      if (!GDK_WINDOW_IS_MAPPED (private->wrapper))	return;      if (GDK_WINDOW_P (private->wrapper)->input_only)	g_error ("Drawing on the evil input-only!");    }  gc_private = GDK_GC_FBDATA (gc);    if (drawable == src)    {      GdkRegionBox srcb, destb;      srcb.x1 = xsrc;      srcb.y1 = ysrc;      srcb.x2 = xsrc + width;      srcb.y2 = ysrc + height;      destb.x1 = xdest;      destb.y1 = ydest;      destb.x2 = xdest + width;      destb.y2 = ydest + height;      if (EXTENTCHECK (&srcb, &destb) && ((ydest > ysrc) || ((ydest == ysrc) && (xdest > xsrc))))	draw_direction = -1;    }  switch (src_private->depth)    {    case 1:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_1];      break;    case 8:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_8];      break;    case 16:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_16];      break;    case 24:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_24];      break;    case 32:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_32];      break;    case 77:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_7_AA_GRAYVAL];      break;    case 78:      draw_func = gc_private->draw_drawable[GDK_FB_SRC_BPP_8_AA_GRAYVAL];      break;    default:      g_assert_not_reached ();      break;    }    /* Do some magic to avoid creating extra regions unnecessarily */  tmpreg = dc->real_clip_region;  rect.x = xdest + private->abs_x;  rect.y = ydest + private->abs_y;  rect.width = width;  rect.height = height;  real_clip_region = gdk_region_rectangle (&rect);  gdk_region_intersect (real_clip_region, tmpreg);  rect.x = xdest + private->abs_x;  rect.y = ydest + private->abs_y;  rect.width = MAX (src_private->width - xsrc, 0);  rect.height = MAX (src_private->height - ysrc, 0);  if (!rect.width || !rect.height)    goto out;  tmpreg = gdk_region_rectangle (&rect);  gdk_region_intersect (real_clip_region, tmpreg);  gdk_region_destroy (tmpreg);  src_x_off = (src_private->abs_x + xsrc) - (private->abs_x + xdest);  src_y_off = (src_private->abs_y + ysrc) - (private->abs_y + ydest);  for (i = (draw_direction>0)?0:real_clip_region->numRects-1; i >= 0 && i < real_clip_region->numRects; i+=draw_direction)    {      GdkRegionBox *cur = &real_clip_region->rects[i];      (*draw_func) (drawable,		    gc,		    src,		    dc,		    cur->y1,		    cur->y2,		    cur->x1,		    cur->x2,		    src_x_off,		    src_y_off,		    draw_direction);    } out:  gdk_region_destroy (real_clip_region);}voidgdk_fb_draw_drawable (GdkDrawable *drawable,		      GdkGC       *gc,		      GdkPixmap   *src,		      gint         xsrc,		      gint         ysrc,		      gint         xdest,		      gint         ydest,		      gint         width,		      gint         height){  GdkPixmap   *src_impl;  if (GDK_IS_DRAWABLE_IMPL_FBDATA (src))    src_impl = src;  else    src_impl = GDK_DRAWABLE_IMPL (src);  GDK_CHECK_IMPL (drawable);    gdk_fb_draw_drawable_2 (drawable, gc, src_impl , xsrc, ysrc, xdest, ydest, width, height, TRUE, TRUE);}#ifdef EMULATE_GDKFONTstatic voidgdk_fb_draw_text(GdkDrawable    *drawable,		 GdkFont        *font,		 GdkGC          *gc,		 gint            x,		 gint            y,		 const gchar    *text,		 gint            text_length){  GdkFontPrivateFB *private;  guchar *utf8, *utf8_end;  PangoGlyphString *glyphs = pango_glyph_string_new ();  PangoEngineShape *shaper, *last_shaper;  PangoAnalysis analysis;  guchar *p, *start;  gint x_offset;  int i;    g_return_if_fail (font != NULL);  g_return_if_fail (text != NULL);  private = (GdkFontPrivateFB*) font;  utf8 = alloca (text_length*2);  /* Convert latin-1 to utf8 */  p = utf8;  for (i = 0; i < text_length; i++)    {      if (text[i]==0)	*p++ = 1; /* Hack to handle embedded nulls */      else	{	  if(((guchar)text[i])<128)	    *p++ = text[i];	  else	    {	      *p++ = ((((guchar)text[i])>>6) & 0x3f) | 0xC0;	      *p++ = (((guchar)text[i]) & 0x3f) | 0x80;	    }	}    }  utf8_end = p;  last_shaper = NULL;  shaper = NULL;  x_offset = 0;  p = start = utf8;  while (p < utf8_end)    {      gunichar wc = g_utf8_get_char (p);      p = g_utf8_next_char (p);      shaper = pango_font_find_shaper (private->pango_font, pango_language_from_string ("fr"), wc);      if (shaper != last_shaper)	{	  analysis.shape_engine = shaper;	  analysis.lang_engine = NULL;	  analysis.font = private->pango_font;	  analysis.level = 0;	  	  pango_shape (start, p - start, &analysis, glyphs);	  gdk_fb_draw_glyphs (drawable, gc, private->pango_font,			      x + PANGO_PIXELS (x_offset), y,			      glyphs);	  	  for (i = 0; i < glyphs->num_glyphs; i++)	    x_offset += glyphs->glyphs[i].geometry.width;	  	  start = p;	}      last_shaper = shaper;    }  if (p > start)    {      analysis.shape_engine = shaper;      analysis.lang_engine = NULL;      analysis.font = private->pango_font;      analysis.level = 0;            pango_shape (start, p - start, &analysis, glyphs);            gdk_fb_draw_glyphs (drawable, gc, private->pango_font,			  x + PANGO_PIXELS (x_offset), y,			  glyphs);    }    pango_glyph_string_free (glyphs);        return;}#elsestatic voidgdk_fb_draw_text(GdkDrawable    *drawable,		 GdkFont        *font,		 GdkGC          *gc,		 gint            x,		 gint            y,		 const gchar    *text,		 gint            text_length){  g_warning ("gdk_fb_draw_text NYI");}#endifstatic voidgdk_fb_draw_text_wc (GdkDrawable    *drawable,		     GdkFont	     *font,		     GdkGC	     *gc,		     gint	      x,		     gint	      y,		     const GdkWChar *text,		     gint	      text_length){  g_warning ("gdk_fb_draw_text_wc NYI");}voidgdk_fb_draw_rectangle (GdkDrawable    *drawable,		       GdkGC          *gc,		       gboolean        filled,		       gint            x,		       gint            y,		       gint            width,		       gint            height){  GdkDrawableFBData *private;    private = GDK_DRAWABLE_FBDATA (drawable);    if (filled)    {      gboolean handle_cursor = FALSE;      GdkRectangle tmprect;      GdkRegion *tmpreg;      GdkRegion *real_clip_region;      GdkColor color;      int i;            if (GDK_GC_FBDATA (gc)->values_mask & GDK_GC_FOREGROUND)	color = GDK_GC_FBDATA (gc)->values.foreground;      else if (GDK_IS_WINDOW (private->wrapper))	color = GDK_WINDOW_P (private->wrapper)->bg_color;      else	gdk_color_black (private->colormap, &color);            real_clip_region = gdk_fb_clip_region (drawable, gc, TRUE, GDK_GC_FBDATA (gc)->values.function != GDK_INVERT, TRUE);            if (private->mem == GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->mem &&	  gdk_fb_cursor_region_need_hide (real_clip_region))	{	  handle_cursor = TRUE;	  gdk_fb_cursor_hide ();	}            x += private->abs_x;      y += private->abs_y;        if (x <  private->llim_x)	{	  width -= private->llim_x - x;	  x = private->llim_x;	}      if (x + width >  private->lim_x)	width =  private->lim_x - x;            if (y <  private->llim_y)	{	  height -= private->llim_y - y;	  y = private->llim_y;	}      if (y + height >  private->lim_y)	height =  private->lim_y - y;      tmprect.x = x;      tmprect.y = y;      tmprect.width = width;      tmprect.height = height;      tmpreg = gdk_region_rectangle (&tmprect);            gdk_region_intersect (tmpreg, real_clip_region);            for (i = 0; i < tmpreg->numRects; i++)	{	  GdkRectangle r;	  r.x = tmpreg->rects[i].x1;	  r.y = tmpreg->rects[i].y1;	  r.width = tmpreg->rects[i].x2 - tmpreg->rects[i].x1;	  r.height = tmpreg->rects[i].y2 - tmpreg->rects[i].y1;	  if ((r.width > 0) && (r.height > 0))	    (GDK_GC_FBDATA (gc)->fill_rectangle) (drawable, gc, &r, &color);	}            gdk_region_destroy (tmpreg);            gdk_region_destroy (real_clip_region);      if (handle_cursor)	gdk_fb_cursor_unhide ();    }  else    {      GdkPoint pts[5];            pts[0].x = pts[4].x = x;      pts[0].y = pts[4].y = y;      pts[1].x = x + width;      pts[1].y = y;      pts[2].x = x + width;      pts[2].y = y + height;      pts[3].x = x;      pts[3].y = y + height;      gdk_fb_draw_lines (drawable, gc, pts, 5);    }}static voidgdk_fb_draw_points (GdkDrawable    *drawable,		    GdkGC          *gc,		    GdkPoint       *points,		    gint            npoints){  GdkSpan *spans = g_alloca (npoints * sizeof(GdkSpan));  int i;  for (i = 0; i < npoints; i++)    {      spans[i].x = points[i].x;      spans[i].y = points[i].y;      spans[i].width = 1;    }  gdk_fb_fill_spans (drawable, gc, spans, npoints, FALSE);}static voidgdk_fb_draw_arc (GdkDrawable    *drawable,		 GdkGC          *gc,		 gboolean        filled,		 gint            x,		 gint            y,		 gint            width,		 gint            height,		 gint            angle1,		 gint            angle2){  miArc arc;  arc.x = x;  arc.y = y;  arc.width = width;  arc.height = height;  arc.angle1 = angle1;  arc.angle2 = angle2;  if (filled)    miPolyFillArc (drawable, gc, 1, &arc);  else    miPolyArc (drawable, gc, 1, &arc);}static voidgdk_fb_draw_polygon (GdkDrawable    *drawable,		     GdkGC          *gc,		     gboolean        filled,		     GdkPoint       *points,		     gint            npoints){  if (filled)    miFillPolygon (drawable, gc, 0, 0, npoints, points);  else    {      gint tmp_npoints;      gboolean free_points = FALSE;      GdkPoint *tmp_points;      if (points[0].x != points[npoints-1].x || points[0].y != points[npoints-1].y)	{	  tmp_npoints = npoints + 1;	  tmp_points = g_new (GdkPoint, tmp_npoints);	  free_points = TRUE;	  memcpy (tmp_points, points, sizeof(GdkPoint) * npoints);	  tmp_points[npoints].x = points[0].x;	  tmp_points[npoints].y = points[0].y;

⌨️ 快捷键说明

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