diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-03-09 08:46:49 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-03-09 08:46:49 +0100 |
| commit | f97fbffa7b927829236e792df8ef6416c6aeed4f (patch) | |
| tree | 7e51bc5453f91f9f3304ea77a1a766862e8d717d /src/drivers/Wayland | |
| parent | e3f67b8e56e6a45cb1c9bd9724627ea8d5769ddb (diff) | |
Move all font stuff to Fl_Cairo_Graphics_Driver from Fl_Wayland_Graphics_Driver.
Diffstat (limited to 'src/drivers/Wayland')
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H | 10 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 159 |
2 files changed, 1 insertions, 168 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H index 8023c6c94..5458cc9a3 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H @@ -73,26 +73,16 @@ struct wld_window; class FL_EXPORT Fl_Wayland_Graphics_Driver : public Fl_Cairo_Graphics_Driver { private: struct fl_wld_buffer *buffer_; - PangoLayout *dummy_pango_layout_; // used to measure text width before showing a window public: Fl_Wayland_Graphics_Driver(); - ~Fl_Wayland_Graphics_Driver(); static const uint32_t wld_format; void activate(struct fl_wld_buffer *buffer, float scale); - void font(Fl_Font fnum, Fl_Fontsize s); - Fl_Font font() { return Fl_Graphics_Driver::font(); } void clip_region(Fl_Region r); Fl_Region XRectangleRegion(int x, int y, int w, int h); void add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H); void XDestroyRegion(Fl_Region r); void set_color(Fl_Color i, unsigned c); - Fl_Font set_fonts(const char* pattern_name); - const char *font_name(int num); - void font_name(int num, const char *name); - const char* get_font_name(Fl_Font fnum, int* ap); - int get_font_sizes(Fl_Font fnum, int*& sizep); void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen osrc, int srcx, int srcy); - static void init_built_in_fonts(); static struct fl_wld_buffer *create_shm_buffer(int width, int height); static void buffer_release(struct wld_window *window); static void buffer_commit(struct wld_window *window); diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx index 6f57c6cec..2e50f2e2b 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx @@ -148,8 +148,7 @@ const uint32_t Fl_Wayland_Graphics_Driver::wld_format = WL_SHM_FORMAT_ARGB8888; Fl_Wayland_Graphics_Driver::Fl_Wayland_Graphics_Driver () : Fl_Cairo_Graphics_Driver() { - dummy_pango_layout_ = NULL; - linestyle_ = 0; + buffer_ = NULL; } @@ -160,11 +159,6 @@ Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver() } -Fl_Wayland_Graphics_Driver::~Fl_Wayland_Graphics_Driver() { - if (pango_layout_) g_object_unref(pango_layout_); -} - - void Fl_Wayland_Graphics_Driver::activate(struct fl_wld_buffer *buffer, float scale) { if (dummy_pango_layout_) { cairo_surface_t *surf = cairo_get_target(cairo_); @@ -190,157 +184,6 @@ void Fl_Wayland_Graphics_Driver::activate(struct fl_wld_buffer *buffer, float sc } -static Fl_Fontdesc built_in_table[] = { // Pango font names - {"Sans"}, - {"Sans Bold"}, - {"Sans Italic"}, - {"Sans Bold Italic"}, - {"Monospace"}, - {"Monospace Bold"}, - {"Monospace Italic"}, - {"Monospace Bold Italic"}, - {"Serif"}, - {"Serif Bold"}, - {"Serif Italic"}, - {"Serif Bold Italic"}, - {"Standard Symbols PS"}, // FL_SYMBOL - {"Monospace"}, // FL_SCREEN - {"Monospace Bold"}, // FL_SCREEN_BOLD - {"D050000L"}, // FL_ZAPF_DINGBATS -}; - -FL_EXPORT Fl_Fontdesc *fl_fonts = built_in_table; - -void Fl_Wayland_Graphics_Driver::init_built_in_fonts() { - static int i = 0; - if (!i) { - while (i < FL_FREE_FONT) { - i++; - Fl::set_font((Fl_Font)i-1, built_in_table[i-1].name); - } - } -} - - -void Fl_Wayland_Graphics_Driver::font(Fl_Font fnum, Fl_Fontsize s) { - if (!font_descriptor()) fl_open_display(); - if (!pango_layout_) { - cairo_surface_t *surf = cairo_image_surface_create(Fl_Cairo_Graphics_Driver::cairo_format, 100, 100); - cairo_ = cairo_create(surf); - dummy_pango_layout_ = pango_cairo_create_layout(cairo_); - pango_layout_ = dummy_pango_layout_; - } - Fl_Cairo_Graphics_Driver::font(fnum, s); -} - - -static int font_name_process(const char *name, char &face) { - int l = strlen(name); - face = ' '; - if (!memcmp(name + l - 8, " Regular", 8)) l -= 8; - else if (!memcmp(name + l - 6, " Plain", 6)) l -= 6; - else if (!memcmp(name + l - 12, " Bold Italic", 12)) {l -= 12; face='P';} - else if (!memcmp(name + l - 7, " Italic", 7)) {l -= 7; face='I';} - else if (!memcmp(name + l - 5, " Bold", 5)) {l -= 5; face='B';} - return l; -} - -typedef int (*sort_f_type)(const void *aa, const void *bb); - - -static int font_sort(Fl_Fontdesc *fa, Fl_Fontdesc *fb) { - char face_a, face_b; - int la = font_name_process(fa->name, face_a); - int lb = font_name_process(fb->name, face_b); - int c = strncasecmp(fa->name, fb->name, la >= lb ? lb : la); - return (c == 0 ? face_a - face_b : c); -} - - -Fl_Font Fl_Wayland_Graphics_Driver::set_fonts(const char* pattern_name) -{ - fl_open_display(); - int n_families, count = 0; - PangoFontFamily **families; - static PangoFontMap *pfmap_ = pango_cairo_font_map_get_default(); // 1.10 - Fl_Wayland_Graphics_Driver::init_built_in_fonts(); - pango_font_map_list_families(pfmap_, &families, &n_families); - for (int fam = 0; fam < n_families; fam++) { - PangoFontFace **faces; - int n_faces; - const char *fam_name = pango_font_family_get_name (families[fam]); - int l = strlen(fam_name); - pango_font_family_list_faces(families[fam], &faces, &n_faces); - for (int j = 0; j < n_faces; j++) { - const char *p = pango_font_face_get_face_name(faces[j]); - // build the font's FLTK name - l += strlen(p) + 2; - char *q = new char[l]; - sprintf(q, "%s %s", fam_name, p); - Fl::set_font((Fl_Font)(count++ + FL_FREE_FONT), q); - } - /*g_*/free(faces); // glib source code shows that g_free is equivalent to free - } - /*g_*/free(families); - // Sort the list into alphabetic order - qsort(fl_fonts + FL_FREE_FONT, count, sizeof(Fl_Fontdesc), (sort_f_type)font_sort); - return FL_FREE_FONT + count; -} - - -const char *Fl_Wayland_Graphics_Driver::font_name(int num) { - return fl_fonts[num].name; -} - - -void Fl_Wayland_Graphics_Driver::font_name(int num, const char *name) { - Fl_Fontdesc *s = fl_fonts + num; - if (s->name) { - if (!strcmp(s->name, name)) {s->name = name; return;} - for (Fl_Font_Descriptor* f = s->first; f;) { - Fl_Font_Descriptor* n = f->next; delete f; f = n; - } - s->first = 0; - } - s->name = name; - s->fontname[0] = 0; - s->first = 0; -} - -#define ENDOFBUFFER sizeof(fl_fonts->fontname)-1 - -// turn a stored font name into a pretty name: -const char* Fl_Wayland_Graphics_Driver::get_font_name(Fl_Font fnum, int* ap) { - Fl_Fontdesc *f = fl_fonts + fnum; - if (!f->fontname[0]) { - strcpy(f->fontname, f->name); // to check - const char* thisFont = f->name; - if (!thisFont || !*thisFont) {if (ap) *ap = 0; return "";} - int type = 0; - if (strstr(f->name, "Bold")) type |= FL_BOLD; - if (strstr(f->name, "Italic") || strstr(f->name, "Oblique")) type |= FL_ITALIC; - f->fontname[ENDOFBUFFER] = (char)type; - } - if (ap) *ap = f->fontname[ENDOFBUFFER]; - return f->fontname; -} - - -int Fl_Wayland_Graphics_Driver::get_font_sizes(Fl_Font fnum, int*& sizep) { - static int array[128]; - if (!fl_fonts) fl_fonts = calc_fl_fonts(); - Fl_Fontdesc *s = fl_fonts+fnum; - if (!s->name) s = fl_fonts; // empty slot in table, use entry 0 - int cnt = 0; - - array[0] = 0; - sizep = array; - cnt = 1; - - return cnt; -} - - void Fl_Wayland_Graphics_Driver::clip_region(Fl_Region r) { if (cairo_) { cairo_reset_clip(cairo_); |
