    # File lib/rubygame/surface.rb, line 349
      def get_at( *args )
        x,y = case args.length
              when 1; args[0].to_ary.collect { |n| n.round }
              when 2; [args[0].round, args[1].round]
              else
                raise( ArgumentError,
                       "wrong number of arguments (#{args.length} for 1)" )
              end

        if( x < 0 or x >= @struct.w or y < 0 or y >= @struct.h)
          raise( IndexError, "point [%d,%d] is out of bounds for %dx%d Surface"%\
                 [x, y, @struct.w, @struct.h] )
        end

        SDL.LockSurface(@struct)

        bpp = @struct.format.BytesPerPixel
        ptr = @struct.pixels + (y * @struct.pitch + x * bpp)

        pixel =
          case bpp
          when 1
            ptr.get_uint8(0)
          when 2
            ptr.get_uint16(0)
          when 3
            if( FFI::Platform::BYTE_ORDER == FFI::Platform::BIG_ENDIAN )
              (ptr.get_uint8(0) << 16)|(ptr.get_uint8(1) << 8)|ptr.get_uint8(2)
            else
              ptr.get_uint8(0)|(ptr.get_uint8(1) << 8)|(ptr.get_uint8(2) << 16)
            end
          when 4
            ptr.get_uint32(0)
          end

        SDL.UnlockSurface(@struct)

        return SDL::GetRGBA(pixel, @struct.format)
      end