2009-04-16  Xan Lopez  <xlopez@igalia.com>

        Reviewed by Gustavo Noronha.

        https://bugs.webkit.org/show_bug.cgi?id=21546
        [GTK] ATK accessibility enhancements

        Based on a patch by Alp Toker.

        Implement AtkImage interface.

        * page/gtk/AccessibilityObjectWrapperAtk.cpp:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@42905 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/page/gtk/AccessibilityObjectWrapperAtk.cpp b/WebCore/page/gtk/AccessibilityObjectWrapperAtk.cpp
index 7092a78..057b948 100644
--- a/WebCore/page/gtk/AccessibilityObjectWrapperAtk.cpp
+++ b/WebCore/page/gtk/AccessibilityObjectWrapperAtk.cpp
@@ -112,6 +112,11 @@
     return core(ATK_OBJECT(component));
 }
 
+static AccessibilityObject* core(AtkImage* image)
+{
+    return core(ATK_OBJECT(image));
+}
+
 extern "C" {
 
 static const gchar* webkit_accessible_get_name(AtkObject* object)
@@ -738,6 +743,36 @@
     iface->grab_focus = webkit_accessible_component_grab_focus;
 }
 
+// Image
+
+static void webkit_accessible_image_get_image_position(AtkImage* image, gint* x, gint* y, AtkCoordType coordType)
+{
+    IntRect rect = core(image)->elementRect();
+    contentsToAtk(core(image), coordType, rect, x, y);
+}
+
+static const gchar* webkit_accessible_image_get_image_description(AtkImage* image)
+{
+    return returnString(core(image)->accessibilityDescription());
+}
+
+static void webkit_accessible_image_get_image_size(AtkImage* image, gint* width, gint* height)
+{
+    IntSize size = core(image)->size();
+
+    if (width)
+        *width = size.width();
+    if (height)
+        *height = size.height();
+}
+
+static void atk_image_interface_init(AtkImageIface* iface)
+{
+    iface->get_image_position = webkit_accessible_image_get_image_position;
+    iface->get_image_description = webkit_accessible_image_get_image_description;
+    iface->get_image_size = webkit_accessible_image_get_image_size;
+}
+
 static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
     {(GInterfaceInitFunc)atk_action_interface_init,
      (GInterfaceFinalizeFunc) NULL, NULL},
@@ -749,6 +784,8 @@
      (GInterfaceFinalizeFunc) NULL, NULL},
     {(GInterfaceInitFunc)atk_component_interface_init,
      (GInterfaceFinalizeFunc) NULL, NULL},
+    {(GInterfaceInitFunc)atk_image_interface_init,
+     (GInterfaceFinalizeFunc) NULL, NULL}
 };
 
 enum WAIType {
@@ -756,7 +793,8 @@
     WAI_STREAMABLE,
     WAI_EDITABLE_TEXT,
     WAI_TEXT,
-    WAI_COMPONENT
+    WAI_COMPONENT,
+    WAI_IMAGE
 };
 
 static GType GetAtkInterfaceTypeFromWAIType(WAIType type)
@@ -772,6 +810,8 @@
       return ATK_TYPE_TEXT;
   case WAI_COMPONENT:
       return ATK_TYPE_COMPONENT;
+  case WAI_IMAGE:
+      return ATK_TYPE_IMAGE;
   }
 
   return G_TYPE_INVALID;
@@ -804,6 +844,10 @@
             interfaceMask |= 1 << WAI_EDITABLE_TEXT;
     }
 
+    // Image
+    if (coreObject->isImage())
+        interfaceMask |= 1 << WAI_IMAGE;
+
     return interfaceMask;
 }