Skip to content

Commit cdd648f

Browse files
committed
Small improvements to rotated font rendering
1 parent 841c141 commit cdd648f

File tree

6 files changed

+27
-16
lines changed

6 files changed

+27
-16
lines changed

libraries/pico_vector/alright_fonts.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ namespace alright_fonts {
4141
}
4242
}
4343

44-
void render_character(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, pretty_poly::mat3_t transform) {
44+
template<typename mat_t>
45+
void render_character(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, mat_t transform) {
4546
if(tm.face.glyphs.count(codepoint) == 1) {
4647
glyph_t glyph = tm.face.glyphs[codepoint];
4748

@@ -51,26 +52,35 @@ namespace alright_fonts {
5152
unsigned scale = tm.size << 9;
5253

5354
std::vector<pretty_poly::contour_t<int8_t>> contours;
55+
contours.reserve(glyph.contours.size());
5456

57+
unsigned int total_points = 0;
5558
for(auto i = 0u; i < glyph.contours.size(); i++) {
56-
unsigned int count = glyph.contours[i].count;
57-
point_t<int8_t> *points = (point_t<int8_t> *)malloc(sizeof(point_t<int8_t>) * count);
59+
total_points += glyph.contours[i].count;;
60+
}
61+
62+
point_t<int8_t> *points = (point_t<int8_t> *)malloc(sizeof(point_t<int8_t>) * total_points);
63+
64+
for(auto i = 0u; i < glyph.contours.size(); i++) {
65+
const unsigned int count = glyph.contours[i].count;
5866
for(auto j = 0u; j < count; j++) {
5967
point_t<float> point(glyph.contours[i].points[j].x, glyph.contours[i].points[j].y);
6068
point *= transform;
6169
points[j] = point_t<int8_t>(point.x, point.y);
6270
}
6371
contours.emplace_back(points, count);
72+
points += count;
6473
}
6574

6675
pretty_poly::draw_polygon<int8_t>(contours, origin, scale);
6776

68-
for(auto contour : contours) {
69-
free(contour.points);
70-
}
77+
free(contours[0].points);
7178
}
7279
}
7380

81+
template void render_character<pretty_poly::mat3_t>(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, pretty_poly::mat3_t transform);
82+
template void render_character<pretty_poly::mat2_t>(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, pretty_poly::mat2_t transform);
83+
7484
/*
7585
load functions
7686
*/

libraries/pico_vector/alright_fonts.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,6 @@ namespace alright_fonts {
7070
*/
7171

7272
void render_character(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin);
73-
void render_character(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, pretty_poly::mat3_t transform);
73+
template<typename mat_t>
74+
void render_character(text_metrics_t &tm, uint16_t codepoint, pretty_poly::point_t<int> origin, mat_t transform);
7475
}

libraries/pico_vector/pico_vector.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ namespace pimoroni {
114114

115115
// Prepare a transformation matrix for character and offset rotation
116116
angle = (2 * (float)M_PI / 360.f) * angle;
117-
pretty_poly::mat3_t transform = pretty_poly::mat3_t::rotation(angle);
117+
pretty_poly::mat2_t transform = pretty_poly::mat2_t::rotation(angle);
118118

119119
// Align text from the bottom left
120120
caret.y += text_metrics.line_height;

libraries/pico_vector/pretty_poly.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ namespace pretty_poly {
252252
}
253253

254254
template<typename T>
255-
void draw_polygon(std::vector<contour_t<T>> contours, point_t<int> origin, int scale) {
255+
void draw_polygon(const std::vector<contour_t<T>>& contours, point_t<int> origin, int scale) {
256256

257257
debug("> draw polygon with %lu contours\n", contours.size());
258258

@@ -306,7 +306,7 @@ namespace pretty_poly {
306306
memset(tile.data, 0, tile_buffer_size);
307307

308308
// build the nodes for each contour
309-
for(contour_t<T> &contour : contours) {
309+
for(const contour_t<T> &contour : contours) {
310310
debug(" : build nodes for contour\n");
311311
build_nodes(contour, tile, origin, scale);
312312
}
@@ -333,7 +333,7 @@ namespace pretty_poly {
333333
}
334334
}
335335

336-
template void pretty_poly::draw_polygon<int>(std::vector<contour_t<int>> contours, point_t<int> origin, int scale);
337-
template void pretty_poly::draw_polygon<float>(std::vector<contour_t<float>> contours, point_t<int> origin, int scale);
338-
template void pretty_poly::draw_polygon<uint8_t>(std::vector<contour_t<uint8_t>> contours, point_t<int> origin, int scale);
339-
template void pretty_poly::draw_polygon<int8_t>(std::vector<contour_t<int8_t>> contours, point_t<int> origin, int scale);
336+
template void pretty_poly::draw_polygon<int>(const std::vector<contour_t<int>>& contours, point_t<int> origin, int scale);
337+
template void pretty_poly::draw_polygon<float>(const std::vector<contour_t<float>>& contours, point_t<int> origin, int scale);
338+
template void pretty_poly::draw_polygon<uint8_t>(const std::vector<contour_t<uint8_t>>& contours, point_t<int> origin, int scale);
339+
template void pretty_poly::draw_polygon<int8_t>(const std::vector<contour_t<int8_t>>& contours, point_t<int> origin, int scale);

libraries/pico_vector/pretty_poly.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,5 @@ namespace pretty_poly {
6868
void draw_polygon(T *points, unsigned count);
6969

7070
template<typename T>
71-
void draw_polygon(std::vector<contour_t<T>> contours, point_t<int> origin = point_t<int>(0, 0), int scale = 65536);
71+
void draw_polygon(const std::vector<contour_t<T>>& contours, point_t<int> origin = point_t<int>(0, 0), int scale = 65536);
7272
}

libraries/pico_vector/pretty_poly_types.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ namespace pretty_poly {
145145
//point_t<T> *begin() const { return points; };
146146
//point_t<T> *end() const { return points + count * sizeof(point_t<T>); };
147147

148-
rect_t bounds() {
148+
rect_t bounds() const {
149149
T minx = this->points[0].x, maxx = minx;
150150
T miny = this->points[0].y, maxy = miny;
151151
for(auto i = 1u; i < this->count; i++) {

0 commit comments

Comments
 (0)