SVG spec (http://www.w3.org/TR/SVG11/filters.html#feDisplacementMap) states that pixel values must be alpha-demultiplied before processing this filter operation.
The following code does it, but when we DON'T do it, output is more similar to output from Batik.

            if (map->mode == NR_PIXBLOCK_MODE_R8G8B8A8P){
                alpha = (unsigned int) map_data[4*((x-x0) + width*(y-y0)) + 3];
                if (alpha==0){
                    coordx = x-x0;
                    coordy = y-y0;
                } else {
                    coordx = x-x0 + scale * ( ((double)NR_DEMUL_111( (unsigned int)map_data[4*((x-x0) + width*(y-y0)) + Xchannel], alpha))/255 - 0.5 );
                    coordy = y-y0 + scale * ( ((double)NR_DEMUL_111( (unsigned int)map_data[4*((x-x0) + width*(y-y0)) + Ychannel], alpha))/255 - 0.5 );
                }
            }


Batik output:
 http://bighead.poli.usp.br/~juca/code/inkscape/batik-fed02.png
Inkscape output without demultiplication:
 http://bighead.poli.usp.br/~juca/code/inkscape/displacement-map-test.png
 
There is also this other bug that can be seen in the above screenshot: the lower and the right portions are not rendered, I dont know why.

JucaBlues