Rendre la police truetype c++

Les caractères sont des symboles qui expliquent la signification de différents mots. Vous pouvez restituer différents caractères de texte avec les polices TrueType en utilisant C++ avec l’API Aspose.Font for C++. Il prend en charge différentes fonctionnalités de rendu de texte, notamment TrueType, Type1, OTF, EOT et d’autres polices. Voyons comment utiliser les fonctionnalités de rendu de texte avec quelques appels d’API simples. Nous aborderons le sujet sous les rubriques suivantes :

API de rendu de police C++ TrueType – Installation

Compte tenu de la popularité et de la demande de la plate-forme C++, nous avons introduit des fonctionnalités très utiles dans l’API Aspose.Font for C++. Afin de rendre les polices TrueType dans vos applications, vous devez configurer l’API en la téléchargeant depuis New Releases, ou vous pouvez l’installer via NuGet en utilisant la commande suivante :

Install-Package Aspose.Font.Cpp

Implémentation d’une interface pour dessiner un glyphe afin de rendre les polices TrueType à l’aide de C++

Tout d’abord, vous devez implémenter IGlyphOutlinePainter sous l’espace de noms Aspose.Font.Rendering. Suivez les étapes ci-dessous pour l’implémentation des méthodes et des classes :

  1. Créez une classe nommée GlyphOutlinePainter
  2. Utilisez System.Drawing.Drawing2D.GraphicsPath pour dessiner des graphiques

Vous trouverez ci-dessous l’extrait de code C++ pour l’implémentation de l’interface afin de dessiner des glyphes :

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
RenderingText::GlyphOutlinePainter::GlyphOutlinePainter(System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path)
{
    _path = path;
}

void RenderingText::GlyphOutlinePainter::MoveTo(System::SharedPtr<Aspose::Font::RenderingPath::MoveTo> moveTo)
{
    _path->CloseFigure();
    _currentPoint.set_X((float)moveTo->get_X());
    _currentPoint.set_Y((float)moveTo->get_Y());
}

void RenderingText::GlyphOutlinePainter::LineTo(System::SharedPtr<Aspose::Font::RenderingPath::LineTo> lineTo)
{
    float x = (float)lineTo->get_X();
    float y = (float)lineTo->get_Y();
    _path->AddLine(_currentPoint.get_X(), _currentPoint.get_Y(), x, y);
    _currentPoint.set_X(x);
    _currentPoint.set_Y(y);
}

void RenderingText::GlyphOutlinePainter::CurveTo(System::SharedPtr<Aspose::Font::RenderingPath::CurveTo> curveTo)
{
    float x3 = (float)curveTo->get_X3();
    float y3 = (float)curveTo->get_Y3();
    
    _path->AddBezier(_currentPoint.get_X(), _currentPoint.get_Y(), (float)curveTo->get_X1(), (float)curveTo->get_Y1(), (float)curveTo->get_X2(), (float)curveTo->get_Y2(), x3, y3);
    
    _currentPoint.set_X(x3);
    _currentPoint.set_Y(y3);
}

void RenderingText::GlyphOutlinePainter::ClosePath()
{
    _path->CloseFigure();
}

System::Object::shared_members_type Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::GetSharedMembers()
{
    auto result = System::Object::GetSharedMembers();
    
    result.Add("Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::_path", this->_path);
    result.Add("Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::_currentPoint", this->_currentPoint);
    
    return result;
}

Deuxièmement, veuillez créer une méthode avec le nom DrawText avec les étapes suivantes :

  1. Boucle sur les symboles dans la chaîne de texte
  2. Obtenir GID en tant que glyphe identifié pour chaque symbole
  3. Créez GlyphOutlinePainter et passez à l’objet GlyphOutlineRenderer
  4. Spécifiez les coordonnées du glyphe avec l’objet Matrix

De plus, après avoir suivi toutes ces étapes, créez une méthode utilitaire pour le calcul des dimensions de la police à l’image, comme expliqué dans l’extrait de code C++ suivant :

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
double RenderingText::FontWidthToImageWith(double width, int32_t fontSourceResulution, double fontSize, double dpi /* = 300*/)
{
    double resolutionCorrection = dpi / 72;
    // 72 est le dpi interne de la police
    return (width / fontSourceResulution) * fontSize * resolutionCorrection;
}

Rendu du texte avec la police TrueType à l’aide de C++

Nous avons implémenté la fonctionnalité requise pour le rendu de texte avec des polices TrueType. Appelons maintenant les méthodes en utilisant Aspose.Font pour l’API C++ comme extrait de code ci-dessous :

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String dataDir = RunExamples::GetDataDir_Data();
    
System::String fileName1 = dataDir + u"Montserrat-Bold.ttf";
//Nom du fichier de police avec chemin complet
System::SharedPtr<FontDefinition> fd1 = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName1)));
System::SharedPtr<TtfFont> ttfFont1 = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd1));
    
System::String fileName2 = dataDir + u"Lora-Bold.ttf";
//Nom du fichier de police avec chemin complet
System::SharedPtr<FontDefinition> fd2 = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName2)));
System::SharedPtr<TtfFont> ttfFont2 = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd2));
    
DrawText(u"Hello world", ttfFont1, 14, System::Drawing::Brushes::get_White(), System::Drawing::Brushes::get_Black(), dataDir + u"hello1_montserrat_out.jpg");
DrawText(u"Hello world", ttfFont2, 14, System::Drawing::Brushes::get_Yellow(), System::Drawing::Brushes::get_Red(), dataDir + u"hello2_lora_out.jpg");

Conclusion

Dans cet article, vous avez appris à rendre du texte à l’aide de polices TrueType avec C++. Vous souhaitez en savoir plus sur les fonctionnalités offertes par Aspose.Font pour l’API C++ ? Vous pouvez obtenir plus de détails en explorant les références API ou la documentation produit. Cependant, si vous rencontrez une ambiguïté ou si vous avez besoin d’aide, n’hésitez pas à nous contacter via Forums d’assistance gratuits. Nous sommes impatients de nous engager avec vous !

Voir également