summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2024-07-29 21:26:17 -0400
committerBenji Dial <benji@benjidial.net>2024-07-29 21:26:17 -0400
commitc34b9191f258ddc15c5b45c000cd0266aed9dead (patch)
tree88e66004d1514d6f22b4366fc415b467784fee63 /libraries
parente6c3a80b01ffb52079783cddd9be6d392d0f7039 (diff)
downloadhilbert-os-c34b9191f258ddc15c5b45c000cd0266aed9dead.tar.gz
window borders
Diffstat (limited to 'libraries')
-rw-r--r--libraries/daguerre/include/daguerre/image.hpp7
-rw-r--r--libraries/daguerre/include/daguerre/impl/fixed-font.hpp1
-rw-r--r--libraries/daguerre/include/daguerre/impl/image.hpp20
-rw-r--r--libraries/pake/include/pake/widget.hpp8
-rw-r--r--libraries/pake/include/pake/widgets/fixed-text.hpp5
-rw-r--r--libraries/pake/source/widgets/fixed-text.cpp42
6 files changed, 71 insertions, 12 deletions
diff --git a/libraries/daguerre/include/daguerre/image.hpp b/libraries/daguerre/include/daguerre/image.hpp
index a55f43b..3c9c902 100644
--- a/libraries/daguerre/include/daguerre/image.hpp
+++ b/libraries/daguerre/include/daguerre/image.hpp
@@ -110,6 +110,13 @@ namespace daguerre {
param_converter_t<color_t, font_color_t, param_t> *conversion =
&default_conversion);
+ //does not check bounds or wrap text
+ template <class font_color_t>
+ void render_text(
+ const fixed_font<font_color_t> &font, int x, int y, const char *text,
+ converter_t<color_t, font_color_t> *conversion =
+ &default_conversion);
+
};
template <class color_t>
diff --git a/libraries/daguerre/include/daguerre/impl/fixed-font.hpp b/libraries/daguerre/include/daguerre/impl/fixed-font.hpp
index 1a5f3d8..61a27fc 100644
--- a/libraries/daguerre/include/daguerre/impl/fixed-font.hpp
+++ b/libraries/daguerre/include/daguerre/impl/fixed-font.hpp
@@ -35,6 +35,7 @@ namespace daguerre {
glyphs[i] = std::move(other.glyphs[i]);
other.glyph_width = 0;
other.glyph_height = 0;
+ return *this;
}
template <class color_t>
diff --git a/libraries/daguerre/include/daguerre/impl/image.hpp b/libraries/daguerre/include/daguerre/impl/image.hpp
index 6cf2ca9..c91cc7d 100644
--- a/libraries/daguerre/include/daguerre/impl/image.hpp
+++ b/libraries/daguerre/include/daguerre/impl/image.hpp
@@ -107,7 +107,7 @@ namespace daguerre {
void image<color_t>::fill(
const color_t &color, int start_x, int start_y, int width, int height) {
for (int y = start_y; y < start_y + height; ++y)
- for (int x = 0; x < start_x + width; ++x)
+ for (int x = start_x; x < start_x + width; ++x)
buffer[y * buffer_pitch + x] = color;
}
@@ -170,7 +170,7 @@ namespace daguerre {
void image<color_t>::convert_from(
const image<other_color_t> &other, int to_x, int to_y,
converter_t<color_t, other_color_t> *conversion) {
- convert_from(other, to_x, to_y, 0, 0, other.width, other.y, conversion);
+ convert_from(other, to_x, to_y, 0, 0, other.width, other.height, conversion);
}
template <class color_t>
@@ -214,6 +214,22 @@ namespace daguerre {
}
template <class color_t>
+ template <class font_color_t>
+ void image<color_t>::render_text(
+ const fixed_font<font_color_t> &font, int x, int y, const char *text,
+ converter_t<color_t, font_color_t> *conversion) {
+
+ while (*text) {
+ int ch = *text;
+ if (ch >= 0 && ch < 128)
+ convert_from(font.glyphs[ch], x, y, conversion);
+ ++text;
+ x += font.glyph_width;
+ }
+
+ }
+
+ template <class color_t>
void swap(image<color_t> &a, image<color_t> &b) {
std::swap(a.delete_buffer_on_destruct, b.delete_buffer_on_destruct);
std::swap(a.width, b.width);
diff --git a/libraries/pake/include/pake/widget.hpp b/libraries/pake/include/pake/widget.hpp
index dad5651..466fb80 100644
--- a/libraries/pake/include/pake/widget.hpp
+++ b/libraries/pake/include/pake/widget.hpp
@@ -4,6 +4,14 @@
namespace pake {
+ enum class halign {
+ left, center, right
+ };
+
+ enum class valign {
+ top, center, bottom
+ };
+
class widget {
public:
diff --git a/libraries/pake/include/pake/widgets/fixed-text.hpp b/libraries/pake/include/pake/widgets/fixed-text.hpp
index c6dafab..dc2e277 100644
--- a/libraries/pake/include/pake/widgets/fixed-text.hpp
+++ b/libraries/pake/include/pake/widgets/fixed-text.hpp
@@ -12,6 +12,8 @@ namespace pake::widgets {
std::string text;
int width, height;
+ halign ha;
+ valign va;
public:
//TODO: look up font in some kind of catalogue
@@ -19,7 +21,8 @@ namespace pake::widgets {
std::string &&text,
const daguerre::fixed_font<bool> *font,
daguerre::hilbert_color bg,
- daguerre::hilbert_color fg);
+ daguerre::hilbert_color fg,
+ halign ha, valign va);
virtual void render(
dirtiable_image &onto, int x_off, int y_off, bool force) override;
diff --git a/libraries/pake/source/widgets/fixed-text.cpp b/libraries/pake/source/widgets/fixed-text.cpp
index 9ae55dc..c3a9a10 100644
--- a/libraries/pake/source/widgets/fixed-text.cpp
+++ b/libraries/pake/source/widgets/fixed-text.cpp
@@ -12,24 +12,48 @@ namespace pake::widgets {
std::string &&text,
const daguerre::fixed_font<bool> *font,
daguerre::hilbert_color bg,
- daguerre::hilbert_color fg)
- : font(font), bg(bg), fg(fg), text(std::move(text)) {}
+ daguerre::hilbert_color fg,
+ halign ha, valign va)
+ : font(font), bg(bg), fg(fg),
+ text(std::move(text)), ha(ha), va(va) {}
void fixed_text::render(
dirtiable_image &onto, int x_off, int y_off, bool force) {
if (force) {
- onto.image.fill( bg, x_off, y_off, width, height);
- onto.dirty.fill(true, x_off, y_off, width, height);
- //TODO: have options for alignment
+
//TODO: check overflow
+
+ onto.dirty.fill(true, x_off, y_off, width, height);
+
+ onto.image.fill( bg, x_off, y_off, width, height);
+
+ switch (ha) {
+ case halign::left:
+ break;
+ case halign::center:
+ x_off = width / 2 - text.size() * font->glyph_width / 2;
+ break;
+ case halign::right:
+ x_off = width - text.size() * font->glyph_width;
+ break;
+ }
+
+ switch (va) {
+ case valign::top:
+ break;
+ case valign::center:
+ y_off = height / 2 - font->glyph_height / 2;
+ break;
+ case valign::bottom:
+ y_off = height - font->glyph_width;
+ break;
+ }
+
onto.image.render_text(
*font, fg, x_off, y_off,
text.data(), draw_if_true);
- onto.dirty.fill(
- true, x_off, y_off,
- font->glyph_width * text.size(),
- font->glyph_height);
+
}
}