📄 gdkdrawable-fb2.c
字号:
{ 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 + -