ok, i've found it. there was nothing wrong with the algorithm. the problem was where i was calling it from.
its a little complex but i will explain as best i can for the curiosity of others.
i originally wrote the read2CPU function to monitor the texture update in the gpu. the gpu texture update requires mapping the texture by setting the viewport to a 1:1 mapping. the viewport then has to be re-set in the display method at each frame to display the system on screen. so when i called checkDuplication from the display method, the read2CPU function was using an incorrect mapping and not returning the correct data.
ps. i'm not sure if the above method is correct, if anyone knows a more efficient method then resetting the viewport twice every frame, please let me know!