* Unifying code for drawing on a cairo context @ 2022-04-23 9:06 Pfrommer, Julius 2022-04-23 9:18 ` Eli Zaretskii 2022-04-23 11:51 ` Po Lu 0 siblings, 2 replies; 11+ messages in thread From: Pfrommer, Julius @ 2022-04-23 9:06 UTC (permalink / raw) To: emacs-devel The X and the PGTK toolkits both support a cairo "glass". Their code for drawing on a cairo context is virtually identical. Yet the implementations have started to diverge. As an example, x_draw_horizontal_wave and pgtk_draw_horizontal_wave are virtually the same. But the X implementation takes a "GC" graphics context, whereas the PGTK implementation now takes a "color" integer argument. https://git.savannah.gnu.org/cgit/emacs.git/tree/src/xterm.c#n5155 https://git.savannah.gnu.org/cgit/emacs.git/tree/src/pgtkterm.c#n1995 Obviously maintaining duplicate code is an anti-pattern. I'd like to pull out common cairo functionality bit-by-bit into methods to be used by both the X and the PGTK toolkit. With the cairo primitives unified between X and PGTK, adding a cairo "glass" for more toolkits should also become easier as a future option (ns, haiku, w32). But I'm unsure about how this fits with ongoing development and which conventions to follow. - Would the unified cairo function be called cairo_draw_horizontal_wave, establishing a new cairo_ prefix convention? - Should such functions generally take an immediate cairo_t context as input or some "larger" struct that includes that cairo_t and can be extended in the future (e.g. with foreground and background color information). - Is it okay to create the files cairoterm.h/.c or can we expect functionality beyond "term" to be added over time as well? Regards, Julius ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-23 9:06 Unifying code for drawing on a cairo context Pfrommer, Julius @ 2022-04-23 9:18 ` Eli Zaretskii 2022-04-23 11:58 ` Po Lu 2022-04-23 11:51 ` Po Lu 1 sibling, 1 reply; 11+ messages in thread From: Eli Zaretskii @ 2022-04-23 9:18 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: emacs-devel > Date: Sat, 23 Apr 2022 11:06:16 +0200 > From: "Pfrommer, Julius" <julius.pfrommer@web.de> > > Obviously maintaining duplicate code is an anti-pattern. I'd like to > pull out common cairo functionality bit-by-bit into methods to be used > by both the X and the PGTK toolkit. > > With the cairo primitives unified between X and PGTK, adding a cairo > "glass" for more toolkits should also become easier as a future option > (ns, haiku, w32). In general, I don't think we'd object to having such Cairo-specific code in one place. However, having GUI code common to all the GUI backends in one place is more important, so if this Cairo-specific module will make that common code less so, it would be a step backward, IMO. IOW, as long as the effort to have Cairo-specific code in one place doesn't "invade" on the common code, it is welcome, I think. > - Would the unified cairo function be called cairo_draw_horizontal_wave, > establishing a new cairo_ prefix convention? Yes, why not? > - Should such functions generally take an immediate cairo_t context as > input or some "larger" struct that includes that cairo_t and can be > extended in the future (e.g. with foreground and background color > information). It could, if that leads to a clean code that is easy to understand and maintain. I'm not sure why you are asking this, or what would be the alternative. > - Is it okay to create the files cairoterm.h/.c or can we expect > functionality beyond "term" to be added over time as well? Yes. But again, as long as this doesn't make the common GUI code we already have less common. Thank you for your interest in Emacs. P.S. You don't seem to have copyright assignment on file. As I presume this work will produce substantial changes in the code, I'd encourage you to start your legal paperwork rolling at this time, so that we could accept your contributions without any limitations. If you agree, I will send you the form to start the paperwork. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-23 9:18 ` Eli Zaretskii @ 2022-04-23 11:58 ` Po Lu 2022-04-23 12:04 ` Eli Zaretskii 2022-04-29 8:01 ` Pfrommer, Julius 0 siblings, 2 replies; 11+ messages in thread From: Po Lu @ 2022-04-23 11:58 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Pfrommer, Julius, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > In general, I don't think we'd object to having such Cairo-specific > code in one place. However, having GUI code common to all the GUI > backends in one place is more important, so if this Cairo-specific > module will make that common code less so, it would be a step > backward, IMO. IOW, as long as the effort to have Cairo-specific code > in one place doesn't "invade" on the common code, it is welcome, I > think. I think that we won't be able to get the Cairo code all in one place, without a large amount of code specific to each window system, which defeats the point of such refactoring. The platforms where Cairo drawing is currently used already have subtle differences in their Cairo-related code to take care of platform-specific quirks regarding fringes, image transforms, scaling, etc. There will probably be more of these quirks in the future, as we support more and more window systems and display features (such as device scaling) that have to behave differently depending on the window system being used. Moving all the Cairo code in one place would impose a severe limitation on the ability to change the Cairo code for a single window system, at least without the preprocessor definition mess that this refactoring will hopefully avoid. Further, the amount of drawing code is quite minimal, and the currently existing duplication does not impede maintenance at all, so this is most likely a case of premature optimization. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-23 11:58 ` Po Lu @ 2022-04-23 12:04 ` Eli Zaretskii 2022-04-29 8:01 ` Pfrommer, Julius 1 sibling, 0 replies; 11+ messages in thread From: Eli Zaretskii @ 2022-04-23 12:04 UTC (permalink / raw) To: Po Lu; +Cc: emacs-devel, julius.pfrommer > From: Po Lu <luangruo@yahoo.com> > Cc: "Pfrommer, Julius" <julius.pfrommer@web.de>, emacs-devel@gnu.org > Date: Sat, 23 Apr 2022 19:58:04 +0800 > > Eli Zaretskii <eliz@gnu.org> writes: > > > In general, I don't think we'd object to having such Cairo-specific > > code in one place. However, having GUI code common to all the GUI > > backends in one place is more important, so if this Cairo-specific > > module will make that common code less so, it would be a step > > backward, IMO. IOW, as long as the effort to have Cairo-specific code > > in one place doesn't "invade" on the common code, it is welcome, I > > think. > > I think that we won't be able to get the Cairo code all in one place, > without a large amount of code specific to each window system, which > defeats the point of such refactoring. Clearly, I was writing on the assumption that this would be possible, without independently assessing whether in fact it is possible. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-23 11:58 ` Po Lu 2022-04-23 12:04 ` Eli Zaretskii @ 2022-04-29 8:01 ` Pfrommer, Julius 2022-04-29 8:33 ` Po Lu 2022-04-29 10:43 ` Eli Zaretskii 1 sibling, 2 replies; 11+ messages in thread From: Pfrommer, Julius @ 2022-04-29 8:01 UTC (permalink / raw) To: Po Lu, Eli Zaretskii; +Cc: emacs-devel > I think that we won't be able to get the Cairo code all in one place, > without a large amount of code specific to each window system, which > defeats the point of such refactoring. Not all Cairo drawing, but those parts where it makes sense. But having some level of code-sharing will decrease the "entropy" pulling the toolkits and platforms apart over time. > The platforms where Cairo drawing is currently used already have subtle > differences in their Cairo-related code to take care of > platform-specific quirks regarding fringes, image transforms, scaling, > etc. Agreed, there are differences. But every Cairo operation eventually translates to an API call on a cairo_t "glass". Some platforms already have a "scaling-factor" as part of their Cairo drawing. Most of these platform-dependent differences could be handled by a slim wrapper on top of a common drawing implementation. > Moving all the Cairo code in one place would impose > a severe limitation on the ability to change the Cairo code for a single > window system, at least without the preprocessor definition mess that > this refactoring will hopefully avoid. I would argue to the contrary. Developers typically only have access to a subset of the platforms. Developers will improve and bugfix only those platforms where they can test their changes. Having a common core for Cairo-drawing (with no #ifdef mess and assuming that Cairo behaves similarly across platforms) would reduce the duplication of the effort to fix bugs. Anyhow, instead of hypothesizing, I will try out a couple of approaches to see how/whether the overall complexity is reduced by pulling out common drawing operations on top of the cairo_t "glass". Regards, Julius ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-29 8:01 ` Pfrommer, Julius @ 2022-04-29 8:33 ` Po Lu 2022-04-29 8:35 ` Po Lu 2022-04-29 10:43 ` Eli Zaretskii 1 sibling, 1 reply; 11+ messages in thread From: Po Lu @ 2022-04-29 8:33 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: Eli Zaretskii, emacs-devel "Pfrommer, Julius" <julius.pfrommer@web.de> writes: > Not all Cairo drawing, but those parts where it makes sense. > But having some level of code-sharing will decrease the "entropy" > pulling the toolkits and platforms apart over time. There will be no benefit to this at all. We only recently introduced a second platform where Cairo drawing is used, and aside from GTK (and X Windows, where using Cairo for stuff other than fonts was apparently implemented so that we could use it for printing in the future, but nobody has shown any interest in doing that work), there are no other platfoms where Cairo drawing is required or would be beneficial. So IMNSHO this refactoring is premature, and will also likely cause problems down the road when we want to change the behavior of the Cairo code on a platform-specific basis, such as when the device scaling feature is implemented on X. > I would argue to the contrary. Developers typically only have access to > a subset of the platforms. Developers will improve and bugfix only those > platforms where they can test their changes. Having a common core for > Cairo-drawing (with no #ifdef mess and assuming that Cairo behaves > similarly across platforms) would reduce the duplication of the effort > to fix bugs. I work on both platforms where Cairo drawing is used for something other than fonts and see no "ifdef mess" you allude to in the Cairo code, and so far there hasn't been a single instance of the two instances of subtly different Cairo code causing fixing a bug to require a duplication of effort. Most of the preprocessor conditionals in the X Windows drawing code stem from the presence of both a Cairo and non-Cairo configuration, neither of which are going away. Cairo is not used at all on NS and MS Windows, so bug fixes will have to be made separately there in any case. The Haiku port will also never use Cairo for drawing anything other than text with complex shaping requirements. On the other hand, why not dedicate your time to some work on the PGTK port that will lead to an immediate improvement, such as refactoring the selection code in `pgtkselect.c' to use the low-level GDK selection API, so that drag-and-drop will work, and most of the Lisp-level selection code can be shared with X? Thanks in advance. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-29 8:33 ` Po Lu @ 2022-04-29 8:35 ` Po Lu 2022-04-29 9:07 ` Pfrommer, Julius 0 siblings, 1 reply; 11+ messages in thread From: Po Lu @ 2022-04-29 8:35 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: Eli Zaretskii, emacs-devel Po Lu <luangruo@yahoo.com> writes: > There will be no benefit to this at all. We only recently introduced > a second platform where Cairo drawing is used, and aside from GTK (and > X Windows, where using Cairo for stuff other than fonts was apparently > implemented so that we could use it for printing in the future, but > nobody has shown any interest in doing that work), there are no other > platfoms where Cairo drawing is required or would be beneficial. Not to mention that Cairo is in effect unmaintained, and using it is discouraged in new software, so I wouldn't count on it being present forever, much less design code around the assumption that we will always keep using Cairo. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-29 8:35 ` Po Lu @ 2022-04-29 9:07 ` Pfrommer, Julius 2022-04-29 9:20 ` Po Lu 0 siblings, 1 reply; 11+ messages in thread From: Pfrommer, Julius @ 2022-04-29 9:07 UTC (permalink / raw) To: Po Lu; +Cc: Eli Zaretskii, emacs-devel > Not to mention that Cairo is in effect unmaintained, and using it is > discouraged in new software, so I wouldn't count on it being present > forever, much less design code around the assumption that we will always > keep using Cairo. Cairo is not unmaintained. There were a couple hundred commits from various developers since the beginning of this year. https://github.com/freedesktop/cairo/graphs/contributors?from=2021-04-02&to=2022-04-29&type=c > There will be no benefit to this at all. We only recently introduced a > second platform where Cairo drawing is used [...] Case in point. For GTK and PGTK, developers need different setups (using X vs. using Wayland) and the similar code-paths for drawing on cairo_t started to diverge and continues to diverge. Quoting Eli: > In general, I don't think we'd object to having such Cairo-specific > code in one place. However, having GUI code common to all the GUI > backends in one place is more important, It appears that increasing the amount of code-sharing between platforms is a goal for Emacs overall. I understand that "developer freedom" to work on platforms independently is important to some. Hopefully that freedom can be retained even when the level of code-sharing across some platforms is increased. Let's not jump to premature conclusions but see how the first experiments for Cairo pan out. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-29 9:07 ` Pfrommer, Julius @ 2022-04-29 9:20 ` Po Lu 0 siblings, 0 replies; 11+ messages in thread From: Po Lu @ 2022-04-29 9:20 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: Eli Zaretskii, emacs-devel "Pfrommer, Julius" <julius.pfrommer@web.de> writes: > Cairo is not unmaintained. There were a couple hundred commits from > various developers since the beginning of this year. > > https://github.com/freedesktop/cairo/graphs/contributors?from=2021-04-02&to=2022-04-29&type=c The Cairo developers haven't been able to put out a stable release with fixes to major bugs in over 3 years, which is interfering with the development of many large programs and toolkits. Most of those commits you allude to are either deleting unbuildable code, or fixing the tests, and are useless because so far the maintainer(s) capable of making a release are all missing, so the code doesn't get to anyone. > Case in point. For GTK and PGTK, developers need different setups (using > X vs. using Wayland) and the similar code-paths for drawing on cairo_t > started to diverge and continues to diverge. And that divergence has caused no problems whatsoever. > It appears that increasing the amount of code-sharing between platforms > is a goal for Emacs overall. That makes sense in the general case, but as the platform-specific maintainer for both platforms, I disagree this is a direction we want to work towards in the Cairo code. In contrast, using the GDK selections API is a similar refactoring task that would be much more worth spending your time on, and one that I hope someone will complete soon. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-29 8:01 ` Pfrommer, Julius 2022-04-29 8:33 ` Po Lu @ 2022-04-29 10:43 ` Eli Zaretskii 1 sibling, 0 replies; 11+ messages in thread From: Eli Zaretskii @ 2022-04-29 10:43 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: luangruo, emacs-devel > Date: Fri, 29 Apr 2022 10:01:01 +0200 > From: "Pfrommer, Julius" <julius.pfrommer@web.de> > Cc: emacs-devel@gnu.org > > Anyhow, instead of hypothesizing, I will try out a couple of approaches > to see how/whether the overall complexity is reduced by pulling out > common drawing operations on top of the cairo_t "glass". Thanks in advance. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Unifying code for drawing on a cairo context 2022-04-23 9:06 Unifying code for drawing on a cairo context Pfrommer, Julius 2022-04-23 9:18 ` Eli Zaretskii @ 2022-04-23 11:51 ` Po Lu 1 sibling, 0 replies; 11+ messages in thread From: Po Lu @ 2022-04-23 11:51 UTC (permalink / raw) To: Pfrommer, Julius; +Cc: emacs-devel "Pfrommer, Julius" <julius.pfrommer@web.de> writes: > The X and the PGTK toolkits both support a cairo "glass". Their code for > drawing on a cairo context is virtually identical. Yet the > implementations have started to diverge. > > As an example, x_draw_horizontal_wave and pgtk_draw_horizontal_wave are > virtually the same. But the X implementation takes a "GC" graphics > context, whereas the PGTK implementation now takes a "color" integer > argument. > > https://git.savannah.gnu.org/cgit/emacs.git/tree/src/xterm.c#n5155 > https://git.savannah.gnu.org/cgit/emacs.git/tree/src/pgtkterm.c#n1995 > > Obviously maintaining duplicate code is an anti-pattern. I'd like to > pull out common cairo functionality bit-by-bit into methods to be used > by both the X and the PGTK toolkit. > > With the cairo primitives unified between X and PGTK, adding a cairo > "glass" for more toolkits should also become easier as a future option > (ns, haiku, w32). They take different arguments because they operate on top of different graphics APIs. Graphics contexts are an important resource in the X Windows graphics API, while GDK got rid of them in favor of specifying colors directly. On Haiku, Cairo is only used for fonts that have complex shaping requirements, and it will not be used for anything else. I don't see what benefits Cairo drawing would bring on NS or W32 either, except for apparently more flicker, which is so bad on Haiku that double buffering cannot be turned off when Cairo drawing is enabled. But at present, there is no benefit to those changes. I'm also not convinced we will be able to have "one-size-fits-all" Cairo code for the different window systems that are out there: X, PGTK and Haiku already have different methods of handling scaling, fringe bitmaps, and even images and image transforms, and the existing Cairo code in both terminals (and fringe.c, and some other place that I can't find right now) is certainly not general enough to apply to every system out there. There is nothing troublesome about maintaining the Cairo code as it is. I would rather wait for that to become an actual problem (by my judgement, or the judgement some other person who is actually working on the relevant code) before trying to put all the code together. Thanks. To answer your other questions: > But I'm unsure about how this fits with ongoing development and which > conventions to follow. > > - Would the unified cairo function be called cairo_draw_horizontal_wave, > establishing a new cairo_ prefix convention? No, it should be shorter, something like `cr_draw_horizontal_wave'. > - Should such functions generally take an immediate cairo_t context as > input or some "larger" struct that includes that cairo_t and can be > extended in the future (e.g. with foreground and background color > information). It would ideally take an Emacs_GC and a cairo context, and use the foreground color of that GC, except on the window systems where there is no concept of a GC (namely Haiku), in which case it should take the system native color type (unsigned long on Haiku.) > - Is it okay to create the files cairoterm.h/.c or can we expect > functionality beyond "term" to be added over time as well? Just call it 'crfns.c', which describes its functionality much better, since it doesn't read input or write to a terminal. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-04-29 10:43 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-04-23 9:06 Unifying code for drawing on a cairo context Pfrommer, Julius 2022-04-23 9:18 ` Eli Zaretskii 2022-04-23 11:58 ` Po Lu 2022-04-23 12:04 ` Eli Zaretskii 2022-04-29 8:01 ` Pfrommer, Julius 2022-04-29 8:33 ` Po Lu 2022-04-29 8:35 ` Po Lu 2022-04-29 9:07 ` Pfrommer, Julius 2022-04-29 9:20 ` Po Lu 2022-04-29 10:43 ` Eli Zaretskii 2022-04-23 11:51 ` Po Lu
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).