📄 gnu_java_awt_peer_gtk_gtkimage.c
字号:
if (offScreen (env, source) == JNI_TRUE) gdk_pixbuf_unref (pixbuf); createRawData (env, destination, (void *)dst); gdk_threads_leave ();}/** * Draws the pixbuf at x, y, scaled to width and height and * optionally composited with a given background color. */JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkImage_drawPixelsScaled (JNIEnv *env, jobject obj, jobject gc_obj, jint bg_red, jint bg_green, jint bg_blue, jint x, jint y, jint width, jint height, jboolean composite){ GdkPixbuf* dst; struct graphics *g; guint32 bgColor; gdk_threads_enter (); if (width <= 0 || height <= 0) { gdk_threads_leave (); return; } bgColor = ((bg_red & 0xFF) << 16) | ((bg_green & 0xFF) << 8) | (bg_blue & 0xFF); g = (struct graphics *) NSA_GET_G_PTR (env, gc_obj); if (!g || !GDK_IS_DRAWABLE (g->drawable)) { gdk_threads_leave (); return; } if (offScreen (env, obj) == JNI_FALSE) { GdkPixbuf* pixbuf = (GdkPixbuf *)getData (env, obj); /* Scale and composite the image */ if (composite == JNI_TRUE) dst = gdk_pixbuf_composite_color_simple (pixbuf, width, height, GDK_INTERP_BILINEAR, 255, width, bgColor, bgColor); else dst = gdk_pixbuf_scale_simple(pixbuf, width, height, GDK_INTERP_BILINEAR); gdk_draw_pixbuf (g->drawable, g->gc, dst, 0, 0, x + g->x_offset, y + g->y_offset, width, height, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref (dst); } else { /* Get a pixmap */ GdkPixmap* pixmap = (GdkPixmap *)getData (env, obj); gdk_draw_drawable (g->drawable, g->gc, pixmap, 0, 0, /* src x,y */ x + g->x_offset, y + g->y_offset, width, height); } gdk_threads_leave ();}/** * Draws the pixbuf at x, y, scaled to width and height and * optionally composited and/or flipped with a given background color. */JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_drawPixelsScaledFlipped (JNIEnv *env, jobject obj, jobject gc_obj, jint bg_red, jint bg_green, jint bg_blue, #if GTK_MINOR_VERSION > 4 jboolean flipx, jboolean flipy,#else jboolean flipx __attribute__((unused)), jboolean flipy __attribute__((unused)),#endif jint srcx, jint srcy, jint srcwidth, jint srcheight, jint dstx, jint dsty, jint dstwidth, jint dstheight, jboolean composite){ GdkPixbuf *pixbuf; GdkPixbuf *tmp, *dst; struct graphics *g; guint32 bgColor; gdk_threads_enter (); if (srcwidth <= 0 || srcheight <= 0 || dstwidth <= 0 || dstheight <= 0) { gdk_threads_leave (); return; } bgColor = ((bg_red & 0xFF) << 16) | ((bg_green & 0xFF) << 8) | (bg_blue & 0xFF); g = (struct graphics *) NSA_GET_G_PTR (env, gc_obj); if (!g || !GDK_IS_DRAWABLE (g->drawable)) { gdk_threads_leave (); return; } if (offScreen (env, obj) == JNI_FALSE) { pixbuf = (GdkPixbuf *)getData (env, obj); /* Get the source area */ tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, srcwidth, srcheight); gdk_pixbuf_copy_area (pixbuf, srcx, srcy, srcwidth, srcheight, tmp, 0, 0); /* dst x , dst y */ } else { /* Get a pixbuf from the pixmap */ GdkDrawable *pixmap = (GdkDrawable *)getData(env, obj); tmp = gdk_pixbuf_get_from_drawable (NULL, pixmap, gdk_drawable_get_colormap( pixmap ), srcx, srcy, 0, 0, /* dst x , dst y */ srcwidth, srcheight); } /* FIXME: This #if should be discarded once I feel comfortable about GTK 2.6 dependence */#if GTK_MINOR_VERSION > 4 /* Flip it if necessary. */ if (flipx == JNI_TRUE) { GdkPixbuf *tmp2 = gdk_pixbuf_flip (tmp, TRUE); gdk_pixbuf_unref (tmp); tmp = tmp2; } if (flipy == JNI_TRUE) { GdkPixbuf *tmp2 = gdk_pixbuf_flip (tmp, FALSE); gdk_pixbuf_unref (tmp); tmp = tmp2; }#endif /* Scale and composite the image */ if (composite == JNI_TRUE) dst = gdk_pixbuf_composite_color_simple (tmp, dstwidth, dstheight, GDK_INTERP_BILINEAR, 255, dstwidth, bgColor, bgColor); else dst = gdk_pixbuf_scale_simple(tmp, dstwidth, dstheight, GDK_INTERP_BILINEAR); gdk_pixbuf_unref (tmp); gdk_draw_pixbuf (g->drawable, g->gc, dst, 0, 0, dstx + g->x_offset, dsty + g->y_offset, dstwidth, dstheight, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref (dst); gdk_threads_leave ();}/** * Used by GtkFramePeer */GdkPixbuf *cp_gtk_image_get_pixbuf (JNIEnv *env, jobject obj){ int width, height; GdkPixbuf *pixbuf; GdkPixmap* pixmap; jclass cls; jfieldID field; if (offScreen (env, obj) == JNI_FALSE) return (GdkPixbuf *)getData (env, obj); cls = (*env)->GetObjectClass (env, obj); field = (*env)->GetFieldID (env, cls, "width", "I"); g_assert (field != 0); width = (*env)->GetIntField (env, obj, field); field = (*env)->GetFieldID (env, cls, "height", "I"); g_assert (field != 0); height = (*env)->GetIntField (env, obj, field); /* Get a pixmap */ pixmap = (GdkPixmap *)getData (env, obj); pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, gdk_drawable_get_colormap( pixmap ), 0, 0, /* src x , src y */ 0, 0, /* dst x , dst y */ width, height); return pixbuf;}/** * Used by GdkGraphics */GdkPixmap *cp_gtk_image_get_pixmap (JNIEnv *env, jobject obj){ if (offScreen (env, obj) == JNI_FALSE) return NULL; return (GdkPixmap *)getData (env, obj);}jboolean cp_gtk_image_is_offscreen (JNIEnv *env, jobject obj){ return offScreen(env, obj);}/** * Maps java.awt.Image scaling hints to the native GDK ones. */static GdkInterpType mapHints(jint hints){ switch ( hints ) { /* For FAST, we use the nearest-neighbor. Fastest and lowest quality. */ case SCALE_FAST: case SCALE_REPLICATE: return GDK_INTERP_NEAREST; /* Hyperbolic for smooth. Slowest too. */ case SCALE_SMOOTH: return GDK_INTERP_HYPER; /* the inbetweenish method */ case SCALE_AREA_AVERAGING: return GDK_INTERP_TILES; /* default to bilinear */ } return GDK_INTERP_BILINEAR;}/* Sets the width and height fields of a GtkImage object. */static void setWidthHeight (JNIEnv * env, jobject obj, int width, int height){ jclass cls; jfieldID field; cls = (*env)->GetObjectClass (env, obj); g_assert (cls != 0); field = (*env)->GetFieldID (env, cls, "width", "I"); g_assert (field != 0); (*env)->SetIntField (env, obj, field, (jint)width); field = (*env)->GetFieldID (env, cls, "height", "I"); g_assert (field != 0); (*env)->SetIntField (env, obj, field, (jint)height);}/* Returns the value of the offScreen field. */static jboolean offScreen (JNIEnv *env, jobject obj){ jclass cls; jfieldID field; cls = (*env)->GetObjectClass (env, obj); field = (*env)->GetFieldID (env, cls, "offScreen", "Z"); g_assert (field != 0); return (*env)->GetBooleanField (env, obj, field);}/* Store and get the pixbuf pointer */static voidcreateRawData (JNIEnv * env, jobject obj, void *ptr){ jclass cls; jobject data; jfieldID data_fid; cls = (*env)->GetObjectClass (env, obj); data_fid = (*env)->GetFieldID (env, cls, "pixmap", "Lgnu/classpath/Pointer;"); g_assert (data_fid != 0); data = JCL_NewRawDataObject (env, ptr); (*env)->SetObjectField (env, obj, data_fid, data);}static void *getData (JNIEnv * env, jobject obj){ jclass cls; jfieldID data_fid; jobject data; cls = (*env)->GetObjectClass (env, obj); data_fid = (*env)->GetFieldID (env, cls, "pixmap", "Lgnu/classpath/Pointer;"); g_assert (data_fid != 0); data = (*env)->GetObjectField (env, obj, data_fid); return JCL_GetRawData (env, data);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -