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

📄 gnu_java_awt_peer_gtk_gdkgraphics2d.c

📁 gcc的组建
💻 C
📖 第 1 页 / 共 4 页
字号:
  (JNIEnv *env, jobject obj, jint width, jint height){  struct graphics2d *gr = NULL;    gdk_threads_enter();  gr = (struct graphics2d *) g_malloc (sizeof (struct graphics2d));  g_assert (gr != NULL);  memset (gr, 0, sizeof(struct graphics2d));  check_for_debug (gr);    if (gr->debug) printf ("constructing offscreen drawable of size (%d,%d)\n",			 width, height);  gr->drawable = (GdkDrawable *) gdk_pixmap_new (NULL, width, height, 						 gdk_rgb_get_visual ()->depth);  g_assert (gr->drawable != NULL);  gr->width = width;  gr->height = height;  if (x_server_has_render_extension ())    init_graphics2d_as_renderable (gr);  else    init_graphics2d_as_pixbuf (gr);  if (gr->debug) printf ("constructed offscreen drawable of size (%d,%d)\n",			 width, height);  NSA_SET_G2D_PTR (env, obj, gr);  gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable  (JNIEnv *env, jobject self, jobject other, jint x, jint y){  struct graphics2d *src = NULL;  struct graphics2d *dst = NULL;  gint s_height;  gint s_width;  gint d_height;  gint d_width;  gint height;  gint width;  cairo_matrix_t matrix;  cairo_operator_t tmp_op;  gdk_threads_enter();    if (peer_is_disposed(env, self))    {      gdk_threads_leave();      return;    }  src = (struct graphics2d *)NSA_GET_G2D_PTR (env, other);  dst = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);  g_assert (src != NULL);  g_assert (dst != NULL);    if (src->debug) printf ("copying from offscreen drawable\n");  begin_drawing_operation(env, dst);   /* gdk_flush(); */  if (!GDK_IS_DRAWABLE (src->drawable) ||    !GDK_IS_DRAWABLE (dst->drawable))    {      gdk_threads_leave ();      return;    }  gdk_drawable_get_size (src->drawable, &s_width, &s_height);  gdk_drawable_get_size (dst->drawable, &d_width, &d_height);  width = min (s_width, d_width);  height = min (s_height, d_height);  cairo_get_matrix (src->cr, &matrix);  cairo_matrix_translate (&matrix, (double)-x, (double)-y);   if (src->pattern)    cairo_pattern_set_matrix (src->pattern, &matrix);   tmp_op = cairo_get_operator (dst->cr);   cairo_set_operator(dst->cr, CAIRO_OPERATOR_SOURCE);   cairo_set_source_surface (dst->cr, src->surface, 0, 0);  cairo_paint (dst->cr);  cairo_set_operator(dst->cr, tmp_op);  cairo_matrix_translate (&matrix, (double)x, (double)y);  if (src->pattern)    cairo_pattern_set_matrix (src->pattern, &matrix);  gdk_flush();  end_drawing_operation(env, dst);  if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height);  gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_initStateUnlocked  (JNIEnv *env, jobject obj, jobject peer){  struct graphics2d *gr = NULL;  GtkWidget *widget = NULL;  void *ptr = NULL;  if (peer_is_disposed(env, obj))    return;  ptr = NSA_GET_PTR (env, peer);  g_assert (ptr != NULL);  gr = (struct graphics2d *) g_malloc (sizeof (struct graphics2d));  g_assert (gr != NULL);  memset (gr, 0, sizeof(struct graphics2d));  check_for_debug (gr);  widget = GTK_WIDGET (ptr);  g_assert (widget != NULL);  grab_current_drawable (widget, &(gr->drawable), &(gr->win));  g_assert (gr->drawable != NULL);  gr->width = widget->allocation.width;  gr->height = widget->allocation.height;  if (x_server_has_render_extension ())    init_graphics2d_as_renderable (gr);  else    init_graphics2d_as_pixbuf (gr);  NSA_SET_G2D_PTR (env, obj, gr);}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2  (JNIEnv *env, jobject obj, jobject peer){  struct graphics2d *gr = NULL;  GtkWidget *widget = NULL;  void *ptr = NULL;  gdk_threads_enter();  if (peer_is_disposed(env, obj))    {      gdk_threads_leave ();      return;    }  ptr = NSA_GET_PTR (env, peer);  g_assert (ptr != NULL);  gr = (struct graphics2d *) g_malloc (sizeof (struct graphics2d));  g_assert (gr != NULL);  memset (gr, 0, sizeof(struct graphics2d));  check_for_debug (gr);  widget = GTK_WIDGET (ptr);  g_assert (widget != NULL);  grab_current_drawable (widget, &(gr->drawable), &(gr->win));  g_assert (gr->drawable != NULL);  gr->width = widget->allocation.width;  gr->height = widget->allocation.height;  if (x_server_has_render_extension ())    init_graphics2d_as_renderable (gr);  else    init_graphics2d_as_pixbuf (gr);  NSA_SET_G2D_PTR (env, obj, gr);  gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals  (JNIEnv *env, jobject obj, jobject peer){  void *ptr;  gdk_threads_enter ();  ptr = NSA_GET_PTR (env, peer);  g_signal_connect_after (G_OBJECT (ptr), "realize",                          G_CALLBACK (realize_cb), obj);  gdk_threads_leave ();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose  (JNIEnv *env, jobject obj){  struct graphics2d *gr = NULL;  gdk_threads_enter();  gr = (struct graphics2d *) NSA_DEL_G2D_PTR (env, obj);  if (gr == NULL)     {      gdk_threads_leave();      return; /* dispose has been called more than once */    }  if (gr->surface)    cairo_surface_destroy (gr->surface);  cairo_destroy (gr->cr);  if (gr->drawbuf)    g_object_unref (gr->drawbuf);   if (gr->drawable)    g_object_unref (gr->drawable);  if (gr->pattern)    cairo_pattern_destroy (gr->pattern);  if (gr->pattern_surface)    cairo_surface_destroy (gr->pattern_surface);  if (gr->pattern_pixels)    g_free (gr->pattern_pixels);  if (gr->mode == MODE_JAVA_ARRAY)    {      (*env)->DeleteGlobalRef (env, gr->jarray);      if (gr->javabuf_copy)        g_free (gr->javabuf_copy);    }  if (gr->debug) printf ("disposed of graphics2d\n");  g_free (gr);  gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient   (JNIEnv *env, jobject obj,    jdouble x1, jdouble y1,    jdouble x2, jdouble y2,   jint r1, jint g1, jint b1, jint a1,   jint r2, jint g2, jint b2, jint a2,   jboolean cyclic){  gdk_threads_enter();  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradientUnlocked    (env, obj,     x1, y1, x2, y2,     r1, g1, b1, a1,     r2, g2, b2, a2,     cyclic);  gdk_threads_leave();}  JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradientUnlocked  (JNIEnv *env, jobject obj,    jdouble x1, jdouble y1,    jdouble x2, jdouble y2,   jint r1, jint g1, jint b1, jint a1,   jint r2, jint g2, jint b2, jint a2,   jboolean cyclic){  struct graphics2d *gr = NULL;  cairo_surface_t *surf = NULL;  cairo_t *cr2 = NULL;  cairo_matrix_t mat;  gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);  g_assert (gr != NULL);  if (peer_is_disposed(env, obj))    return;  if (gr->debug)    printf ("setGradientUnlocked (%f,%f) -> (%f,%f); (%d,%d,%d,%d) -> (%d,%d,%d,%d)\n",	    x1, y1,	    x2, y2,	    r1, g1, b1, a1,	    r2, g2, b2, a2);  if (cyclic)    surf = cairo_surface_create_similar (gr->surface, CAIRO_FORMAT_ARGB32, 3, 2);  else    surf = cairo_surface_create_similar (gr->surface, CAIRO_FORMAT_ARGB32, 2, 2);        g_assert (surf != NULL);  cr2 = cairo_create (surf);    cairo_identity_matrix (cr2);  cairo_set_source_rgba (cr2, r1 / 255.0, g1 / 255.0, b1 / 255.0, a1 / 255.0);  cairo_rectangle (cr2, 0, 0, 1, 2);  cairo_fill (cr2);      cairo_set_source_rgba (cr2, r2 / 255.0, g2 / 255.0, b2 / 255.0, a2 / 255.0);  cairo_rectangle (cr2, 1, 0, 1, 2);  cairo_fill (cr2);  if (cyclic)    {      cairo_set_source_rgba (cr2, r1 / 255.0, g1 / 255.0, b1 / 255.0, a1 / 255.0);      cairo_rectangle (cr2, 2, 0, 1, 2);      cairo_fill (cr2);    }  cairo_matrix_init_identity (&mat);  /*      consider the vector [x2 - x1, y2 - y1] = [p,q]     this is a line in space starting at an 'origin' x1, y1.     it can also be thought of as a "transformed" unit vector in either the     x or y directions. we have just *drawn* our gradient as a unit vector     (well, a 2-3x unit vector) in the x dimension. so what we want to know     is which transformation turns our existing unit vector into [p,q].     which means solving for M in       [p,q] = M[1,0]     [p,q] = |a b| [1,0]             |c d|           [p,q] = [a,c], with b = d = 0.     what does this mean? it means that our gradient is 1-dimensional; as     you move through the x axis of our 2 or 3 pixel gradient from logical     x positions 0 to 1, the transformation of your x coordinate under the     matrix M causes you to accumulate both x and y values in fill     space. the y value of a gradient coordinate is ignored, since the     gradient is one dimensional. which is correct.     unfortunately we want the opposite transformation, it seems, because of     the way cairo is going to use this transformation. I'm a bit confused by     that, but it seems to work right, so we take reciprocals of values and     negate offsets. oh well.        */  {    double a = (x2 - x1 == 0.) ? 0. : ((cyclic ? 3.0 : 2.0) / (x2 - x1));    double c = (y2 - y1 == 0.) ? 0. : (1. / (y2 - y1));    double dx = (x1 == 0.) ? 0. : 1. / x1;    double dy = (y1 == 0.) ? 0. : 1. / y1;    cairo_pattern_t *p;        cairo_matrix_init (&mat,                       a, 0.,                       c, 0.,                       dx, dy);        p = cairo_pattern_create_for_surface (surf);    cairo_pattern_set_matrix (p, &mat);    cairo_pattern_set_filter (p, CAIRO_FILTER_BILINEAR);  }  /* FIXME: repeating gradients (not to mention hold gradients) don't seem to work. */  /*   cairo_surface_set_repeat (surf, cyclic ? 1 : 0); */  if (gr->pattern)    cairo_pattern_destroy (gr->pattern);    if (gr->pattern_surface)    cairo_surface_destroy (gr->pattern_surface);  if (gr->pattern_pixels)    g_free (gr->pattern_pixels);    gr->pattern_pixels = NULL;    gr->pattern_surface = surf;    gr->pattern = cairo_pattern_create_for_surface(surf);  cairo_set_source (gr->cr, gr->pattern);}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels   (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride){  gdk_threads_enter();  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixelsUnlocked    (env, obj, jarr, w, h, stride);  gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixelsUnlocked  (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride){  struct graphics2d *gr = NULL;  jint *jpixels = NULL;  if (peer_is_disposed(env, obj))    return;  gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);  g_assert (gr != NULL);  if (gr->debug)    printf ("setTexturePixelsUnlocked (%d pixels, %dx%d, stride: %d)\n",	    (*env)->GetArrayLength (env, jarr), w, h, stride);  if (gr->pattern)    cairo_pattern_destroy (gr->pattern);  if (gr->pattern_surface)    cairo_surface_destroy (gr->pattern_surface);  if (gr->pattern_pixels)    g_free (gr->pattern_pixels);  gr->pattern = NULL;  gr->pattern_surface = NULL;  gr->pattern_pixels = NULL;  gr->pattern_pixels = (char *) g_malloc (h * stride * 4);  g_assert (gr->pattern_pixels != NULL);  jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);  g_assert (jpixels != NULL);  memcpy (gr->pattern_pixels, jpixels, h * stride * 4);  (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);  gr->pattern_surface = cairo_image_surface_create_for_data ((unsigned char *)gr->pattern_pixels, 							CAIRO_FORMAT_ARGB32, 							w, h, stride * 4);  g_assert (gr->pattern_surface != NULL);  gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);  g_assert (gr->pattern != NULL);  cairo_pattern_set_extend (gr->pattern, CAIRO_EXTEND_REPEAT);  cairo_set_source (gr->cr, gr->pattern);}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels   (JNIEnv *env, jobject obj, jintArray java_pixels,    jint w, jint h, jint stride, jdoubleArray java_matrix){  struct graphics2d *gr = NULL;  jint *native_pixels = NULL;  jdouble *native_matrix = NULL;  gdk_threads_enter();  if (peer_is_disposed(env, obj))    {      gdk_threads_leave();      return;    }  gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);  g_assert (gr != NULL);  if (gr->debug)    printf ("drawPixels (%d pixels, %dx%d, stride: %d)\n",	    (*env)->GetArrayLength (env, java_pixels), w, h, stride);  native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);  native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  g_assert (native_pixels != NULL);  g_assert (native_matrix != NULL);  g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);  begin_drawing_operation (env, gr);   {   cairo_matrix_t mat;   cairo_pattern_t *p;   cairo_surface_t *surf = cairo_image_surface_create_for_data ((unsigned char *)native_pixels, 							   CAIRO_FORMAT_ARGB32, 							   w, h, stride * 4);      cairo_matrix_init_identity (&mat);   cairo_matrix_init (&mat,                       native_matrix[0], native_matrix[1],                      native_matrix[2], native_matrix[3],                      native_matrix[4], native_matrix[5]);   p = cairo_pattern_create_for_surface (surf);   cairo_pattern_set_matrix (p, &mat);   if (gr->pattern)

⌨️ 快捷键说明

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