|
commit f77affe08f85fdecd7429ee1dd2e6be7fe19a02f
Author: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Tue Jun 1 16:32:05 2021 +0200
Commit: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Wed Sep 29 12:14:55 2021 +0200
Wayland platform: set draw_buffer_needs_commit to true only once graphics have been performed
src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H | 18 +++++
src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 94 ++++++++++++++++++++++
src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 1 -
3 files changed, 112 insertions(+), 1 deletion(-)
diff --git src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
index 2bf11f8..ac079fb 100644
--- src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
+++ src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
@@ -56,6 +56,7 @@ public:
void draw(const char* s, int nBytes, int x, int y) { draw(s, nBytes, float(x), float(y)); }
void draw(const char* s, int nBytes, float x, float y);
void draw(int angle, const char *str, int n, int x, int y);
+ void rtl_draw(const char* str, int n, int x, int y);
int height();
int descent();
double width(const char *str, int n);
@@ -94,6 +95,23 @@ public:
static void buffer_release(struct wld_window *window);
static void buffer_commit(struct wld_window *window);
static void cairo_init(struct buffer *buffer, int width, int height, int stride);
+void line(int x1, int y1, int x2, int y2);
+void line(int x1, int y1, int x2, int y2, int x3, int y3);
+void xyline(int x, int y, int x1);
+void xyline(int x, int y, int x1, int y2);
+void xyline(int x, int y, int x1, int y2, int x3);
+void yxline(int x, int y, int y1);
+void yxline(int x, int y, int y1, int x2);
+void yxline(int x, int y, int y1, int x2, int y3);
+void loop(int x0, int y0, int x1, int y1, int x2, int y2);
+void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
+void rect(int x, int y, int w, int h);
+void rectf(int x, int y, int w, int h);
+void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
+void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
+void end_loop();
+void end_line();
+void end_polygon();
};
#endif // FL_WAYLAND_GRAPHICS_DRIVER_H
diff --git src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
index 60fb0f4..d4070aa 100644
--- src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
@@ -410,6 +410,7 @@ void Fl_Wayland_Graphics_Driver::draw(const char* str, int n, float x, float y)
pango_layout_set_text(pango_layout_, str, n);
pango_cairo_show_layout(cairo_, pango_layout_);
cairo_restore(cairo_);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
}
@@ -423,6 +424,12 @@ void Fl_Wayland_Graphics_Driver::draw(int rotation, const char *str, int n, int
}
+void Fl_Wayland_Graphics_Driver::rtl_draw(const char* str, int n, int x, int y) {
+ int w = (int)width(str, n);
+ draw(str, n, x - w, y);
+}
+
+
double Fl_Wayland_Graphics_Driver::width(const char* c, int n) {
if (!font_descriptor()) return -1.0;
int i = 0, w = 0, l;
@@ -675,6 +682,7 @@ void Fl_Wayland_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_patte
cairo_pattern_set_matrix(pat, &matrix);
cairo_mask(cairo_, pat);
cairo_restore(cairo_);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
}
@@ -862,3 +870,89 @@ void Fl_Wayland_Graphics_Driver::uncache_pixmap(fl_uintptr_t p) {
cairo_surface_destroy(surf);
}
}
+
+
+void Fl_Wayland_Graphics_Driver::line(int x1, int y1, int x2, int y2) {
+ Fl_Cairo_Graphics_Driver::line(x1, y1, x2, y2);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::line(int x1, int y1, int x2, int y2, int x3, int y3) {
+ Fl_Cairo_Graphics_Driver::line(x1, y1, x2, y2, x3, y3);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::xyline(int x, int y, int x1) {
+ Fl_Cairo_Graphics_Driver::xyline(x, y, x1);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
+ Fl_Cairo_Graphics_Driver::xyline(x, y, x1, y2);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
+ Fl_Cairo_Graphics_Driver::xyline(x, y, x1, y2, x3);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::yxline(int x, int y, int y1) {
+ Fl_Cairo_Graphics_Driver::yxline(x, y, y1);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
+ Fl_Cairo_Graphics_Driver::yxline(x, y, y1, x2);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
+ Fl_Cairo_Graphics_Driver::yxline(x, y, y1, x2, y3);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2) {
+ Fl_Cairo_Graphics_Driver::loop(x0, y0, x1, y1, x2, y2);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
+ Fl_Cairo_Graphics_Driver::loop(x0, y0, x1, y1, x2, y2, x3, y3);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::rectf(int x, int y, int w, int h) {
+ Fl_Cairo_Graphics_Driver::rectf(x, y, w, h);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::rect(int x, int y, int w, int h) {
+ Fl_Cairo_Graphics_Driver::rect(x, y, w, h);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2) {
+ Fl_Cairo_Graphics_Driver::polygon(x0, y0, x1, y1, x2, y2);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
+ Fl_Cairo_Graphics_Driver::polygon(x0, y0, x1, y1, x2, y2, x3, y3);
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::end_line() {
+ Fl_Cairo_Graphics_Driver::end_line();
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::end_loop(){
+ Fl_Cairo_Graphics_Driver::end_loop();
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
+
+void Fl_Wayland_Graphics_Driver::end_polygon() {
+ Fl_Cairo_Graphics_Driver::end_polygon();
+ if (fl_window) fl_window->buffer->draw_buffer_needs_commit = true;
+}
diff --git src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 8b8313f..6380897 100644
--- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -355,7 +355,6 @@ void Fl_Wayland_Window_Driver::make_current() {
if (!window->buffer) window->buffer = Fl_Wayland_Graphics_Driver::create_shm_buffer(
pWindow->w() * window->scale, pWindow->h() * window->scale, WL_SHM_FORMAT_ARGB8888, window);
((Fl_Wayland_Graphics_Driver*)fl_graphics_driver)->activate(window->buffer, window->scale);
- window->buffer->draw_buffer_needs_commit = true;
#ifdef FLTK_USE_CAIRO
// update the cairo_t context
[ Direct Link to Message ] | |