JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkTextLayout_setText
  (JNIEnv *env, jobject self, jstring text)
{
  struct textlayout *tl;
  gchar *str = NULL;
  gint len = 0;

  gdk_threads_enter ();
  g_assert(self != NULL);
  g_assert(text != NULL);

  tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self);
  g_assert(tl != NULL);
  g_assert(tl->pango_layout != NULL);
  
  len = (*env)->GetStringUTFLength (env, text);
  str = (gchar *)(*env)->GetStringUTFChars (env, text, NULL);
  g_assert (str != NULL);

  pango_layout_set_text (tl->pango_layout, text, len);

  (*env)->ReleaseStringUTFChars (env, text, str);
  gdk_threads_leave ();  
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkTextLayout_indexToPos
  (JNIEnv *env, jobject self, jint idx, jdoubleArray javaPos)
{
  struct textlayout *tl;
  PangoRectangle pangoPos;
  jdouble *nativePos;

  gdk_threads_enter ();
  g_assert(self != NULL);
  g_assert(javaPos != NULL);

  tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self);
  g_assert(tl != NULL);
  g_assert(tl->pango_layout != NULL);
  
  g_assert((*env)->GetArrayLength (env, javaPos) == 4);

  nativePos = (*env)->GetDoubleArrayElements (env, javaPos, NULL);    

  pango_layout_index_to_pos (tl->pango_layout, idx, &pangoPos);

  nativePos[0] = (jdouble) pangoPos.x;
  nativePos[1] = (jdouble) pangoPos.y;
  nativePos[2] = (jdouble) pangoPos.width;
  nativePos[3] = (jdouble) pangoPos.height;

  (*env)->ReleaseDoubleArrayElements (env, javaPos, nativePos, 0);
  gdk_threads_leave ();  
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkTextLayout_getExtents
  (JNIEnv *env, jobject self, jdoubleArray javaInkExtents, jdoubleArray javaLogExtents)
{
  struct textlayout *tl;
  PangoRectangle pangoInkExtents, pangoLogExtents;
  jdouble *nativeInkExtents, *nativeLogExtents;

  gdk_threads_enter ();

  g_assert(self != NULL);
  g_assert(javaInkExtents != NULL);
  g_assert(javaLogExtents != NULL);

  tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self);
  g_assert(tl != NULL);
  g_assert(tl->pango_layout != NULL);
  
  g_assert((*env)->GetArrayLength (env, javaInkExtents) == 4);
  g_assert((*env)->GetArrayLength (env, javaLogExtents) == 4);

  nativeInkExtents = (*env)->GetDoubleArrayElements (env, javaInkExtents, NULL);    
  nativeLogExtents = (*env)->GetDoubleArrayElements (env, javaLogExtents, NULL);  

  pango_layout_get_extents (tl->pango_layout, 
			    &pangoInkExtents, &pangoLogExtents);

  nativeInkExtents[0] = (jdouble) pangoInkExtents.x;
  nativeInkExtents[1] = (jdouble) pangoInkExtents.y;
  nativeInkExtents[2] = (jdouble) pangoInkExtents.width;
  nativeInkExtents[3] = (jdouble) pangoInkExtents.height;

  nativeLogExtents[0] = (jdouble) pangoLogExtents.x;
  nativeLogExtents[1] = (jdouble) pangoLogExtents.y;
  nativeLogExtents[2] = (jdouble) pangoLogExtents.width;
  nativeLogExtents[3] = (jdouble) pangoLogExtents.height;

  (*env)->ReleaseDoubleArrayElements (env, javaInkExtents, nativeInkExtents, 0);
  (*env)->ReleaseDoubleArrayElements (env, javaLogExtents, nativeLogExtents, 0);

  gdk_threads_leave ();    
}