FS#121 - Improve accuracy of rendering

git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1157 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
LaurentGom 2009-07-04 19:20:13 +00:00
parent e2ddadb395
commit 06525907c1
4 changed files with 12 additions and 23 deletions

View File

@ -252,13 +252,12 @@ public :
/// Convert a subrect expressed in pixels, into float /// Convert a subrect expressed in pixels, into float
/// texture coordinates /// texture coordinates
/// ///
/// \param Rect : Sub-rectangle of image to convert /// \param Rect : Sub-rectangle of image to convert
/// \param Adjust : Pass true to apply the half-texel adjustment
/// ///
/// \return Texture coordinates corresponding to the sub-rectangle /// \return Texture coordinates corresponding to the sub-rectangle
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
FloatRect GetTexCoords(const IntRect& Rect, bool Adjust = true) const; FloatRect GetTexCoords(const IntRect& Rect) const;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// Get a valid texture size according to hardware support /// Get a valid texture size according to hardware support

View File

@ -213,10 +213,6 @@ FT_Error FontLoader::CreateBitmapFont(FT_Face FontFace, unsigned int CharSize, c
FT_Glyph_To_Bitmap(&Glyph, FT_RENDER_MODE_NORMAL, 0, 1); FT_Glyph_To_Bitmap(&Glyph, FT_RENDER_MODE_NORMAL, 0, 1);
FT_BitmapGlyph BitmapGlyph = (FT_BitmapGlyph)Glyph; FT_BitmapGlyph BitmapGlyph = (FT_BitmapGlyph)Glyph;
// Should we handle other pixel modes ?
if (BitmapGlyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY)
return FT_Err_Cannot_Render_Glyph;
// Add it to the sorted table of glyphs // Add it to the sorted table of glyphs
Glyphs.insert(std::make_pair(BitmapGlyph, Charset[i])); Glyphs.insert(std::make_pair(BitmapGlyph, Charset[i]));
} }
@ -293,7 +289,7 @@ FT_Error FontLoader::CreateBitmapFont(FT_Face FontFace, unsigned int CharSize, c
for (std::size_t i = 0; i < Charset.size(); ++i) for (std::size_t i = 0; i < Charset.size(); ++i)
{ {
Uint32 CurChar = Charset[i]; Uint32 CurChar = Charset[i];
LoadedFont.myGlyphs[CurChar].TexCoords = LoadedFont.myTexture.GetTexCoords(Coords[CurChar], false); LoadedFont.myGlyphs[CurChar].TexCoords = LoadedFont.myTexture.GetTexCoords(Coords[CurChar]);
} }
// Update the character size (it may have been changed by the function) // Update the character size (it may have been changed by the function)

View File

@ -542,25 +542,15 @@ bool Image::IsSmooth() const
/// Convert a subrect expressed in pixels, into float /// Convert a subrect expressed in pixels, into float
/// texture coordinates /// texture coordinates
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
FloatRect Image::GetTexCoords(const IntRect& Rect, bool Adjust) const FloatRect Image::GetTexCoords(const IntRect& Rect) const
{ {
float Width = static_cast<float>(myTextureWidth); float Width = static_cast<float>(myTextureWidth);
float Height = static_cast<float>(myTextureHeight); float Height = static_cast<float>(myTextureHeight);
if (Adjust && myIsSmooth) return FloatRect(Rect.Left / Width,
{ Rect.Top / Height,
return FloatRect((Rect.Left + 0.5f) / Width, Rect.Right / Width,
(Rect.Top + 0.5f) / Height, Rect.Bottom / Height);
(Rect.Right - 0.5f) / Width,
(Rect.Bottom - 0.5f) / Height);
}
else
{
return FloatRect(Rect.Left / Width,
Rect.Top / Height,
Rect.Right / Width,
Rect.Bottom / Height);
}
} }

View File

@ -186,6 +186,10 @@ void Sprite::Render(RenderTarget&) const
// Check if the image is valid // Check if the image is valid
if (myImage && (myImage->GetWidth() > 0) && (myImage->GetHeight() > 0)) if (myImage && (myImage->GetWidth() > 0) && (myImage->GetHeight() > 0))
{ {
// Use the "offset trick" to get pixel-perfect rendering
// see http://www.opengl.org/resources/faq/technical/transformations.htm#tran0030
GLCheck(glTranslatef(0.375f, 0.375f, 0.f));
// Bind the texture // Bind the texture
myImage->Bind(); myImage->Bind();