stuff-from-scratch/src/rendering/fonts/FontGlyph.cpp
2023-01-23 11:06:30 +00:00

98 lines
2.3 KiB
C++

#include "FontGlyph.h"
void GlyphRunOutlines::addSegment(const GlyphRunSegment& segment)
{
mFeatures[mFeatures.size() - 1].mSegments.push_back(segment);
}
void GlyphRunOutlines::startFeature(const Point& point, bool isFilled)
{
GlyphRunFeature feature;
feature.mFilled = isFilled;
GlyphRunSegment segment;
segment.mType = GlyphRunSegment::Type::POINT;
segment.mPoints.push_back(point);
feature.mSegments.push_back(segment);
mFeatures.push_back(feature);
}
std::string GlyphRunOutlines::toPostScriptPath()
{
std::string path;
for (const auto& feature : mFeatures)
{
if (feature.mSegments.empty())
{
continue;
}
auto start_point = feature.mSegments[0].mPoints[0];
path += "M" + std::to_string(start_point.getX()) + " " + std::to_string(start_point.getY()) + " ";
for (std::size_t idx = 1; idx < feature.mSegments.size(); idx++)
{
if (feature.mSegments[idx].mType == GlyphRunSegment::Type::LINE)
{
for (const auto& point : feature.mSegments[idx].mPoints)
{
path += "L" + std::to_string(point.getX()) + " " + std::to_string(point.getY()) + " ";
}
}
else if (feature.mSegments[idx].mType == GlyphRunSegment::Type::BEZIER)
{
path += "C";
for (const auto& point : feature.mSegments[idx].mPoints)
{
path += std::to_string(point.getX()) + " " + std::to_string(point.getY()) + " ";
}
}
}
path += "z ";
}
return path;
}
FontGlyph::FontGlyph(unsigned width, unsigned height, int bearingX, int bearingY, int advanceX, std::unique_ptr<Image> image)
:
mWidth(width),
mHeight(height),
mBearingX(bearingX),
mBearingY(bearingY),
mAdvanceX(advanceX),
mImage(std::move(image))
{
}
Image* FontGlyph::getImage() const
{
return mImage.get();
}
unsigned FontGlyph::getWidth() const
{
return mWidth;
}
unsigned FontGlyph::getHeight() const
{
return mHeight;
}
int FontGlyph::getBearingX() const
{
return mBearingX;
}
int FontGlyph::getBearingY() const
{
return mBearingY;
}
int FontGlyph::getAdvanceX() const
{
return mAdvanceX;
}