diff --git a/src/osgText/Glyph.cpp b/src/osgText/Glyph.cpp index 58f25aca4..4b0658a36 100644 --- a/src/osgText/Glyph.cpp +++ b/src/osgText/Glyph.cpp @@ -175,6 +175,11 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) if ((upper+glyph->getTexturePositionY())>=dest_rows) upper = dest_rows-glyph->getTexturePositionY()-1; + bool use_SDF_for_Outline = true; + + float outer_outline_distance = float(search_distance); + float inner_outline_distance = float(outer_outline_distance)/2.0f; + for(int dr=lower; dr<=upper; ++dr) { for(int dc=left; dc<=right; ++dc) @@ -184,11 +189,17 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) unsigned char center_value = 0; if (dr>=0 && dr=0 && dc0 && center_value<255) { + inner_max_value = 255; + outer_max_value = 255; + if (center_value_f>=0.5f) { min_distance = center_value_f-0.5f; @@ -204,7 +215,7 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) { for(int radius=1; radiusinner_max_value && local_distance<=inner_outline_distance) inner_max_value = local_value; + if (local_value>outer_max_value && local_distance<=outer_outline_distance) outer_max_value = local_value; } } { // top + int dx = span; + int dy = radius; + + int c = dc+dx; + int r = dr+dy; + + unsigned char local_value = 0; + if (r>=0 && r=0 && cabs(dy)) ? D/float(abs(dx)) : D/float(abs(dy)); + + float local_distance = sqrtf(float(radius*radius)+float(span*span)); + if (center_value==0) local_distance += (0.5f-local_value_f)*local_multiplier; + else local_distance += (local_value_f - 0.5f)*local_multiplier; + + if (local_distanceinner_max_value && local_distance<=inner_outline_distance) inner_max_value = local_value; + if (local_value>outer_max_value && local_distance<=outer_outline_distance) outer_max_value = local_value; + } + } + + { + // right int dx = radius; int dy = span; @@ -249,42 +291,21 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) float local_multiplier = (abs(dx)>abs(dy)) ? D/float(abs(dx)) : D/float(abs(dy)); float local_distance = sqrtf(float(radius*radius)+float(span*span)); + if (center_value==0) local_distance += (0.5f-local_value_f)*local_multiplier; else local_distance += (local_value_f - 0.5f)*local_multiplier; if (local_distance=0 && r=0 && cabs(dy)) ? D/float(abs(dx)) : D/float(abs(dy)); - - float local_distance = sqrtf(float(radius*radius)+float(span*span)); - if (center_value==0) local_distance += (0.5f-local_value_f)*local_multiplier; - else local_distance += (local_value_f - 0.5f)*local_multiplier; - - if (local_distanceinner_max_value && local_distance<=inner_outline_distance) inner_max_value = local_value; + if (local_value>outer_max_value && local_distance<=outer_outline_distance) outer_max_value = local_value; } } { // bottom - int dx = -radius; - int dy = -span; + int dx = span; + int dy = -radius; int c = dc+dx; int r = dr+dy; @@ -303,6 +324,9 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) else local_distance += (local_value_f - 0.5f)*local_multiplier; if (local_distanceinner_max_value && local_distance<=inner_outline_distance) inner_max_value = local_value; + if (local_value>outer_max_value && local_distance<=outer_outline_distance) outer_max_value = local_value; } } } @@ -329,16 +353,24 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) // compute the alpha value of outline, one texel thick unsigned char outline = 0; - if (center_value<255) + + if (use_SDF_for_Outline) { - float inner_outline = outline_distance-1.0f; - if (min_distancecenter_value) + { + outline -= center_value; + } } - if (outline>center_value) + else { - outline -= center_value; + outline = inner_max_value-center_value; } *(dest_ptr++) = outline; @@ -348,16 +380,23 @@ void GlyphTexture::copyGlyphImage(Glyph* glyph) // compute the alpha value of outline, one texel thick outline = 0; - if (center_value<255) + if (use_SDF_for_Outline) { - float inner_outline = outline_distance-1.0f; - if (min_distancecenter_value) + { + outline -= center_value; + } } - if (outline>center_value) + else { - outline -= center_value; + outline = outer_max_value-center_value; } *(dest_ptr++) = outline;