Blitz3D does the exact same thing (I converted your code and checked). It's because of the bilinear filtering, which smoothes out every pixel with adjacent pixel values.
Unlike Blitz3D you can turn it off though. You just need to edit TMesh.Update, specifically this part:
Change GL_LINEAR in the bottom two lines to GL_NEAREST. This will remove the bleeding but make your textures more blocky.
Unlike Blitz3D you can turn it off though. You just need to edit TMesh.Update, specifically this part:
' mipmapping texture flag If tex_flags&8<>0 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR) Else glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR) EndIf
Change GL_LINEAR in the bottom two lines to GL_NEAREST. This will remove the bleeding but make your textures more blocky.