diff -ruN gd2-1.1.1.orig/lib/gd2/image.rb gd2-1.1.1/lib/gd2/image.rb
--- gd2-1.1.1.orig/lib/gd2/image.rb	2006-05-13 10:01:07.000000000 +0900
+++ gd2-1.1.1/lib/gd2/image.rb	2008-07-27 17:50:29.000000000 +0900
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #
 # Ruby/GD2 -- Ruby binding for gd 2 graphics library
 #
@@ -683,6 +684,101 @@
 
       obj
     end
+
+    def gifanim_begin(out, loops = nil, global_cm = nil)
+      if loops
+        loops = Integer(loops)
+      else
+        loops = -1
+      end
+
+      case global_cm
+      when true
+        global_cm = 1
+      when false
+        global_cm = 0
+      else
+        global_cm = -1
+      end
+
+      out = '' unless out
+      if out.kind_of?(IO)
+        SYM[:gdImageGifAnimBegin].call(image_ptr, out, global_cm, loops)
+      else
+        ptr, sz = SYM[:gdImageGifAnimBeginPtr].call(image_ptr, 0, global_cm, loops)
+        ptr.free = SYM[:gdFree]
+        out << ptr[0, sz[0]]
+      end
+      out
+    end
+
+    def gifanim_end(out)
+      out = '' unless out
+      if out.kind_of?(IO)
+        SYM[:gdImageGifAnimEnd].call(out)
+      else
+        ptr, sz = SYM[:gdImageGifAnimEndPtr].call(0)
+        ptr.free = SYM[:gdFree]
+        out << ptr[0, sz[0]]
+      end
+      out
+    end
+
+    GD_DISPOSAL_UNKNOWN = 0
+    GD_DISPOSAL_NONE = 1
+    GD_DISPOSAL_RESTORE_BACKGROUND = 2
+    GD_DISPOSAL_RESTORE_PREVIUS = 3
+    def gifanim_add(out, delay, disposal = nil,
+                    local_cm = false, ofs_left = 0, ofs_top = 0)
+      addim = self
+      previm = nil
+      previm_ptr = nil
+      case disposal
+      when Image
+	previm = disposal
+        previm_ptr = previm.image_ptr
+        disposal = GD_DISPOSAL_NONE
+
+        # gdImageGiAnimAdd* assumes TopOfs and LeftOfs are 0 when
+        # previous image are provided.
+        ofs_left = 0
+        ofs_top = 0
+
+        # gdImageGifAnimAdd* expects that size of previous image is
+        # equal to current image.  In GD2 2.0.36-RC1,
+        # gdImageGifAnimAdd* should arrange these two size but it
+        # don't care it.  So we do it here.
+        if width != previm.width || height != previm.height
+          addim = resize(previm.width, previm.height)
+        end
+
+      when GD_DISPOSAL_UNKNOWN, GD_DISPOSAL_NONE, 
+        GD_DISPOSAL_RESTORE_BACKGROUND, GD_DISPOSAL_RESTORE_PREVIUS
+        # NOOP
+
+      when nil
+        disposal = GD_DISPOSAL_NONE
+
+      else
+        raise ArgumentError, "invalid disposal value or preivous image: #{disposal.inspect}"
+      end
+      addim_ptr = addim.image_ptr
+
+      local_cm = local_cm ? 1 : 0
+      out = '' unless out
+      if out.kind_of?(IO)
+        SYM[:gdImageGifAnimAdd].call(addim_ptr, out, local_cm,
+                                     ofs_left, ofs_top, delay, 
+                                     disposal, previm_ptr)
+      else
+        ptr, sz = SYM[:gdImageGifAnimAddPtr].call(addim_ptr, 0, local_cm,
+                                                  ofs_left, ofs_top, delay, 
+                                                  disposal, previm_ptr)
+        ptr.free = SYM[:gdFree]
+        out << ptr[0, sz[0]]
+      end
+      out
+    end
   end
 
   #
diff -ruN gd2-1.1.1.orig/lib/gd2.rb gd2-1.1.1/lib/gd2.rb
--- gd2-1.1.1.orig/lib/gd2.rb	2006-05-13 10:00:12.000000000 +0900
+++ gd2-1.1.1/lib/gd2.rb	2008-07-25 22:06:09.000000000 +0900
@@ -82,6 +82,12 @@
     :gdImagePngPtrEx                    => 'PPiI',
     :gdImageGif                         => '0PP',
     :gdImageGifPtr                      => 'PPi',
+    :gdImageGifAnimBegin                => '0PPII',
+    :gdImageGifAnimBeginPtr             => 'PPiII',
+    :gdImageGifAnimAdd                  => '0PPIIIIIP',
+    :gdImageGifAnimAddPtr               => 'PPiIIIIIP',
+    :gdImageGifAnimEnd                  => '0P',
+    :gdImageGifAnimEndPtr               => 'Pi',
     :gdImageWBMP                        => '0PIP',
     :gdImageWBMPPtr                     => 'PPiI',
     :gdImageGd                          => '0PP',
