Dont like this bit:

[pascal] if(FWidth mod FPatternWidth <> 0) then
raise Exception.Create('PatternWidth doesnt match the width.');

if(FHeight mod FPatternHeight <> 0) then
raise Exception.Create('PatternHeight doesnt match the height.');
[/pascal]

Because I often use sub images that do not tile exactly.

Busy trying to understand what you did - Will try and adapt the other methods.

Comments were started but then I ran out of time

Tile image will be better to actually adapt the drawing to draw multiple quads with the same texture. But It should work as is - these are the only ones I didn;t test.