void RenderText(GLfloat x, GLfloat y, const oglplus::String& text) { using namespace oglplus; glyph_spacings.resize(text.size()+1); text_glyphs.GetSpacing( PathNVListMode::AccumAdjacentPairs, text, 1.0f, 1.0f, PathNVTransformType::TranslateX, glyph_spacings ); glyph_spacings.insert(glyph_spacings.begin(), 0); dsa.ModelviewMatrix() .LoadIdentity() .Translate(x, y, 0); text_glyphs.StencilFillInstanced( text, PathNVFillMode::CountUp, 0xFF, PathNVTransformType::TranslateX, glyph_spacings ); text_glyphs.CoverFillInstanced( text, PathNVFillCoverMode::BoundingBoxOfBoundingBoxes, PathNVTransformType::TranslateX, glyph_spacings ); }
TextExample(int /*argc*/, const char** /*argv*/) : text("OpenGL") , text_path(text.size()) , glyph_indices(make_glyph_indices()) , glyph_spacings(glyph_indices.size()) { using namespace oglplus; GLfloat font_scale = 64; text_path.Glyphs( PathNVFontTarget::Standard, "Sans", PathNVFontStyle::Bold, text, PathNVMissingGlyph::Use, ~0, font_scale); text_path.GetSpacing( PathNVListMode::AccumAdjacentPairs, glyph_indices, 1.0f, 1.0f, PathNVTransformType::TranslateX, glyph_spacings); glyph_spacings.insert(glyph_spacings.begin(), 0); glyph_spacings.pop_back(); glyph_indices.pop_back(); GLfloat text_left = glyph_spacings.front(); GLfloat text_right = glyph_spacings.back(); GLfloat font_min_max[2]; text_path.GetMetricRange( PathNVMetricQuery::FontYMinBounds | PathNVMetricQuery::FontYMaxBounds, 1, 0, font_min_max); projection.Ortho( text_left - 10, text_right + 10, font_min_max[0], font_min_max[1], -1.0, +1.0); modelview.LoadIdentity(); gl.ClearColor(1.0f, 1.0f, 1.0f, 0.0f); gl.ClearStencil(0); gl.StencilMask(~0); gl.StencilFunc(CompareFunction::NotEqual, 0, 0xFF); gl.StencilOp( StencilOperation::Keep, StencilOperation::Keep, StencilOperation::Zero); gl.Enable(Capability::StencilTest); }