[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/pgtk fd61a86 030/100: improve some efficiency - simplify draws
From: |
Yuuki Harano |
Subject: |
feature/pgtk fd61a86 030/100: improve some efficiency - simplify draws |
Date: |
Tue, 24 Nov 2020 08:02:30 -0500 (EST) |
branch: feature/pgtk
commit fd61a86ea593fec0fc8967550f515596dc596601
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Jeff Walsh <fejfighter@gmail.com>
improve some efficiency - simplify draws
* src/pgtkterm.h (struct pgtk_bitmap_record):
* src/pgtkterm.c (create_background_surface_by_face):
* src/image.c (image_create_pattern_from_pixbuf)
(image_create_bitmap_from_data, image_create_bitmap_from_file):
少し効率化。
---
src/image.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
src/pgtkterm.c | 35 +++++++----------------------
src/pgtkterm.h | 1 +
3 files changed, 73 insertions(+), 33 deletions(-)
diff --git a/src/image.c b/src/image.c
index 0242b50..0b85cf8 100644
--- a/src/image.c
+++ b/src/image.c
@@ -400,6 +400,32 @@ image_reference_bitmap (struct frame *f, ptrdiff_t id)
++FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].refcount;
}
+#ifdef HAVE_PGTK
+static cairo_pattern_t *
+image_create_pattern_from_pixbuf (struct frame *f, GdkPixbuf *pixbuf)
+{
+ GdkPixbuf *pb = gdk_pixbuf_add_alpha (pixbuf, TRUE, 255, 255, 255);
+ cairo_surface_t *surface = cairo_surface_create_similar_image
(f->output_data.pgtk->cr_surface,
+
CAIRO_FORMAT_A1,
+
gdk_pixbuf_get_width (pb),
+
gdk_pixbuf_get_height (pb));
+
+ cairo_t *cr = cairo_create (surface);
+ gdk_cairo_set_source_pixbuf (cr, pb, 0, 0);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ cairo_pattern_t *pat = cairo_pattern_create_for_surface (surface);
+ cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT);
+
+ cairo_surface_destroy (surface);
+ g_object_unref (pb);
+
+ return pat;
+}
+#endif
+
/* Create a bitmap for frame F from a HEIGHT x WIDTH array of bits at BITS. */
ptrdiff_t
@@ -435,11 +461,39 @@ image_create_bitmap_from_data (struct frame *f, char
*bits,
#endif
#ifdef HAVE_PGTK
- Emacs_Pixmap bitmap = image_pix_container_create_from_bitmap_data(f, bits,
- width,
- height,
- 0xffffffff,
- 0xff000000);
+ GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
+ FALSE,
+ 8,
+ width,
+ height);
+ {
+ char *sp = bits;
+ int mask = 0x01;
+ unsigned char *buf = gdk_pixbuf_get_pixels (pixbuf);
+ int rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+ for (int y = 0; y < height; y++) {
+ unsigned char *dp = buf + rowstride * y;
+ for (int x = 0; x < width; x++) {
+ if (*sp & mask) {
+ *dp++ = 0xff;
+ *dp++ = 0xff;
+ *dp++ = 0xff;
+ } else {
+ *dp++ = 0x00;
+ *dp++ = 0x00;
+ *dp++ = 0x00;
+ }
+ if ((mask <<= 1) >= 0x100) {
+ mask = 0x01;
+ sp++;
+ }
+ }
+ if (mask != 0x01) {
+ mask = 0x01;
+ sp++;
+ }
+ }
+ }
#endif
id = image_allocate_bitmap_record (f);
@@ -450,8 +504,9 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
#endif
#ifdef HAVE_PGTK
- dpyinfo->bitmaps[id - 1].img = bitmap;
+ dpyinfo->bitmaps[id - 1].img = pixbuf;
dpyinfo->bitmaps[id - 1].depth = 1;
+ dpyinfo->bitmaps[id - 1].pattern = image_create_pattern_from_pixbuf (f,
pixbuf);
#endif
dpyinfo->bitmaps[id - 1].file = NULL;
@@ -524,6 +579,7 @@ image_create_bitmap_from_file (struct frame *f, Lisp_Object
file)
//dpyinfo->bitmaps[id - 1].depth = 1;
dpyinfo->bitmaps[id - 1].height = gdk_pixbuf_get_width (bitmap);
dpyinfo->bitmaps[id - 1].width = gdk_pixbuf_get_height (bitmap);
+ dpyinfo->bitmaps[id - 1].pattern = image_create_pattern_from_pixbuf (f,
bitmap);
return id;
#endif
@@ -600,6 +656,8 @@ free_bitmap_record (Display_Info *dpyinfo, Bitmap_Record
*bm)
#endif
#ifdef HAVE_PGTK
+ if (bm->pattern != NULL)
+ cairo_pattern_destroy (bm->pattern);
#endif
if (bm->file)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 4665a93..3e8357e 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -1024,34 +1024,15 @@ create_background_surface_by_face (struct frame *f,
struct face *face, int x, in
}
if (face->stipple != 0) {
- GdkPixbuf *pixbuf = FRAME_DISPLAY_INFO (f)->bitmaps[face->stipple - 1].img;
- GdkPixbuf *pb = gdk_pixbuf_add_alpha (pixbuf, TRUE, 255, 255, 255);
- cairo_surface_t *mask = cairo_surface_create_similar_image
(FRAME_CR_SURFACE (f),
- CAIRO_FORMAT_A1,
- width,
- height);
+ cairo_pattern_t *mask = FRAME_DISPLAY_INFO (f)->bitmaps[face->stipple -
1].pattern;
- {
- cairo_t *cr = cairo_create (mask);
- gdk_cairo_set_source_pixbuf (cr, pb, 0, 0);
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_paint (cr);
- cairo_destroy (cr);
- }
-
- {
- cairo_t *cr = cairo_create (surface);
- double r = ((face->foreground >> 16) & 0xff) / 255.0;
- double g = ((face->foreground >> 8) & 0xff) / 255.0;
- double b = ((face->foreground >> 0) & 0xff) / 255.0;
- cairo_set_source_rgb (cr, r, g, b);
- cairo_mask_surface (cr, mask, 0, 0);
- cairo_destroy (cr);
- }
-
- cairo_surface_destroy (mask);
- g_object_unref (pb);
+ cairo_t *cr = cairo_create (surface);
+ double r = ((face->foreground >> 16) & 0xff) / 255.0;
+ double g = ((face->foreground >> 8) & 0xff) / 255.0;
+ double b = ((face->foreground >> 0) & 0xff) / 255.0;
+ cairo_set_source_rgb (cr, r, g, b);
+ cairo_mask (cr, mask);
+ cairo_destroy (cr);
}
return surface;
diff --git a/src/pgtkterm.h b/src/pgtkterm.h
index 4c6ef0f..8caf31f 100644
--- a/src/pgtkterm.h
+++ b/src/pgtkterm.h
@@ -54,6 +54,7 @@ struct pgtk_bitmap_record
char *file;
int refcount;
int height, width, depth;
+ cairo_pattern_t *pattern;
};
#define RGB_TO_ULONG(r, g, b) (((r) << 16) | ((g) << 8) | (b))
- feature/pgtk d68633b 056/100: * src/pgtkterm.c (pgtk_defined_color): support gtk special colors, (continued)
- feature/pgtk d68633b 056/100: * src/pgtkterm.c (pgtk_defined_color): support gtk special colors, Yuuki Harano, 2020/11/24
- feature/pgtk 6957f94 024/100: Add PGTK support for fullscreen, Yuuki Harano, 2020/11/24
- feature/pgtk ae3bb14 029/100: implement restacking and cleanup frame z order, Yuuki Harano, 2020/11/24
- feature/pgtk 49645df 047/100: minimize gtkutil.c differences., Yuuki Harano, 2020/11/24
- feature/pgtk d2a29e8 040/100: emacsclient should use both of DISPLAY and WAYLAND_DISPLAY., Yuuki Harano, 2020/11/24
- feature/pgtk be47e34 077/100: Re-port image drawing code from X, Yuuki Harano, 2020/11/24
- feature/pgtk 0b69b73 085/100: Fix crash when child frame updates toolbar, Yuuki Harano, 2020/11/24
- feature/pgtk 1d549fa 015/100: Add support for make-frame-(in)visible, Yuuki Harano, 2020/11/24
- feature/pgtk 19da22e 018/100: Add support for handing the internal border, Yuuki Harano, 2020/11/24
- feature/pgtk e021e23 043/100: End Resize flickering by copying surface rather than just clearing, Yuuki Harano, 2020/11/24
- feature/pgtk fd61a86 030/100: improve some efficiency - simplify draws,
Yuuki Harano <=
- feature/pgtk 330a346 012/100: Migrate to Emacs_GC, Yuuki Harano, 2020/11/24
- feature/pgtk b1cc62c 037/100: Add support for Jpeglib, Yuuki Harano, 2020/11/24
- feature/pgtk fe2297c 055/100: * pgtkmenu.c (set_frame_menubar): fix empty menu., Yuuki Harano, 2020/11/24
- feature/pgtk a167e23 057/100: * src/pgtkmenu.c (set_frame_menubar): Suppress gcc warning, Yuuki Harano, 2020/11/24
- feature/pgtk 5a72a07 053/100: * pgtk-win.el: fix compile-time warnings., Yuuki Harano, 2020/11/24
- feature/pgtk bb6862d 089/100: Fix crash on drag and drop, Yuuki Harano, 2020/11/24
- feature/pgtk e405404 095/100: Fix startup failure on svg-unsupported environments, Yuuki Harano, 2020/11/24