📄 gdkrender-fb.c
字号:
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 + -