Oszczędnie w informacje...
Dlaczego obecny_w i obecny_h porównujesz z WINDOW_SIZE a nie odpowiednio z width i height?
Co to jest SIZE?
int value = *(photo + SIZE * (obecny_h + height) + obecny_w + width);
A nie tak powinno być:
int value = *(photo + width * obecny_h + obecny_w);
?
IMO obecny_w i obecny_h powinny nazywać się x i y, wtedy wiadomo, o co chodzi.
No i robienie tego rekurencyjnie nie jest dobrym pomysłem.