Compare commits
124 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6d3beaf955 | |||
| 1968a18edb | |||
| cfe688f27e | |||
| d37e9f708b | |||
| fe66225189 | |||
| 46ed7540b2 | |||
| 3ad56a762f | |||
| 21a1a40555 | |||
| 849692b24b | |||
| f3bf4e4876 | |||
| 46270d3dcd | |||
| da6096faaf | |||
| 2a7b5a5156 | |||
| 233e662294 | |||
| ae41697d83 | |||
| e2fb59798e | |||
| d0fc3e166d | |||
| e4ce46e75f | |||
| e2420f62fe | |||
| 6712106c25 | |||
| 5b55138729 | |||
| 1d9c581f10 | |||
| 6bfb57db16 | |||
| f8f2f2944f | |||
| aaf17fd3d0 | |||
| 678e6fc6d6 | |||
| fcf39170e1 | |||
| 187072c3fa | |||
| e6599c6c4f | |||
| 87a8ff90d6 | |||
| 4a76abffd4 | |||
| 715449695c | |||
| d15b0afca9 | |||
| 0d6bbc035d | |||
| 9313d4b6b4 | |||
| ed412f43d1 | |||
| bfe4aea981 | |||
| 0caa28c1de | |||
| d8ba4b4114 | |||
| e7963945bb | |||
| e4a6101ae0 | |||
| 5d0a3bd4cb | |||
| 1c2238cc2a | |||
| 2d7169fd5f | |||
| 885a6b8ebc | |||
| 9d81c129fc | |||
| 38c6fe2ce4 | |||
| 7fe7b7ac7d | |||
| ae7f52d301 | |||
| 8b1fcb58e8 | |||
| cce36ae701 | |||
| 2f0a02eecb | |||
| 07167fdf22 | |||
| 5710df685b | |||
| 62f10b1b8f | |||
| d50d55228b | |||
| 288a5d4151 | |||
| 748b8497c9 | |||
| 303ff60d5e | |||
| b79eb55b34 | |||
| 0ca573142a | |||
| a1ece16143 | |||
| 2e18f1b6e3 | |||
| 6cf712591f | |||
| b32cd5d328 | |||
| 2af99bd65e | |||
| 5b0ea70d1c | |||
| d719a3d877 | |||
| b0df8910ba | |||
| 5b8bf04035 | |||
| 58e44e296f | |||
| 0334d002c0 | |||
| d731ce49ad | |||
| a93614409e | |||
| 214e2d14be | |||
| 67ee6b2740 | |||
| 07a3fb833c | |||
| 1c419f762b | |||
| 8d6c7b81e9 | |||
| fcaadf6724 | |||
| ff38d8cdc0 | |||
| 900a4e4d31 | |||
| ee63b84b6a | |||
| 2f1ff307da | |||
| a8e8e04496 | |||
| 91bcf6f0ba | |||
| a228b2de64 | |||
| cb18437908 | |||
| 23dab885cd | |||
| e7284c23da | |||
| 1e1f199b56 | |||
| efb5e793a4 | |||
| f2edf40e48 | |||
| 7cb99a0866 | |||
| 36da7c3075 | |||
| a3b69f1101 | |||
| 9f2d1ff264 | |||
| 8d603dfe99 | |||
| 3ff04976e3 | |||
| 54ff4fd45f | |||
| 0d135d90f0 | |||
| ffa9814dd0 | |||
| a2fec9134b | |||
| 8caadaf404 | |||
| 469228fcd7 | |||
| fd329e0ec5 | |||
| 7f4041ec30 | |||
| 5cb5bdc4eb | |||
| 08913deba5 | |||
| aceeef47f4 | |||
| ddda0ca1db | |||
| 00923615f4 | |||
| 63945bc408 | |||
| 076f79745b | |||
| 8e9effcc1e | |||
| 7f4522a3f1 | |||
| f98abe4400 | |||
| 2ee8f676c3 | |||
| 7216f71825 | |||
| 0bf3e4c25b | |||
| e964e176f9 | |||
| 8938b09bc9 | |||
| 3654bcfbe8 | |||
| 0dcf95b898 |
+2
-2
@@ -24,9 +24,9 @@ variables:
|
||||
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true"
|
||||
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled"
|
||||
MESON_TEST_TIMEOUT_MULTIPLIER: 3
|
||||
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v28"
|
||||
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v29"
|
||||
FLATPAK_IMAGE: "registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master"
|
||||
DOCS_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora-docs:v27"
|
||||
DOCS_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v29"
|
||||
|
||||
.only-default:
|
||||
only:
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
FROM fedora:33
|
||||
|
||||
RUN dnf -y install \
|
||||
adwaita-icon-theme \
|
||||
atk-devel \
|
||||
at-spi2-atk-devel \
|
||||
avahi-gobject-devel \
|
||||
cairo-devel \
|
||||
cairo-gobject-devel \
|
||||
ccache \
|
||||
clang \
|
||||
clang-analyzer \
|
||||
colord-devel \
|
||||
cups-devel \
|
||||
dbus-daemon \
|
||||
dbus-x11 \
|
||||
dejavu-sans-mono-fonts \
|
||||
desktop-file-utils \
|
||||
diffutils \
|
||||
elfutils-libelf-devel \
|
||||
fribidi-devel \
|
||||
gcc \
|
||||
gcc-c++ \
|
||||
gdk-pixbuf2-devel \
|
||||
gdk-pixbuf2-modules \
|
||||
gettext \
|
||||
git \
|
||||
glib2-devel \
|
||||
glib2-static \
|
||||
glibc-devel \
|
||||
glibc-headers \
|
||||
gnome-desktop-testing \
|
||||
gobject-introspection-devel \
|
||||
graphene-devel \
|
||||
gstreamer1-devel \
|
||||
gstreamer1-plugins-good \
|
||||
gstreamer1-plugins-bad-free-devel \
|
||||
gstreamer1-plugins-base-devel \
|
||||
gtk-doc \
|
||||
hicolor-icon-theme \
|
||||
iso-codes \
|
||||
itstool \
|
||||
json-glib-devel \
|
||||
lcov \
|
||||
libasan \
|
||||
libattr-devel \
|
||||
libcloudproviders-devel \
|
||||
libepoxy-devel \
|
||||
libffi-devel \
|
||||
libmount-devel \
|
||||
librsvg2 \
|
||||
libselinux-devel \
|
||||
libubsan \
|
||||
libXcomposite-devel \
|
||||
libXcursor-devel \
|
||||
libXcursor-devel \
|
||||
libXdamage-devel \
|
||||
libXfixes-devel \
|
||||
libXi-devel \
|
||||
libXinerama-devel \
|
||||
libxkbcommon-devel \
|
||||
libXrandr-devel \
|
||||
libXrender-devel \
|
||||
libXtst-devel \
|
||||
libxslt \
|
||||
mesa-dri-drivers \
|
||||
mesa-libEGL-devel \
|
||||
mesa-libGLES-devel \
|
||||
meson \
|
||||
ninja-build \
|
||||
pango-devel \
|
||||
pcre-devel \
|
||||
pcre-static \
|
||||
python3 \
|
||||
python3-jinja2 \
|
||||
python3-pip \
|
||||
python3-pygments \
|
||||
python3-wheel \
|
||||
redhat-rpm-config \
|
||||
sassc \
|
||||
systemtap-sdt-devel \
|
||||
vulkan-devel \
|
||||
wayland-devel \
|
||||
wayland-protocols-devel \
|
||||
weston \
|
||||
weston-libs \
|
||||
which \
|
||||
xorg-x11-server-Xvfb \
|
||||
&& dnf clean all
|
||||
@@ -1,18 +0,0 @@
|
||||
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v28
|
||||
|
||||
RUN dnf -y install \
|
||||
graphviz \
|
||||
python3-jinja2 \
|
||||
python3-markdown \
|
||||
python3-pygments \
|
||||
python3-toml \
|
||||
python3-typogrify
|
||||
|
||||
ARG HOST_USER_ID=5555
|
||||
ENV HOST_USER_ID ${HOST_USER_ID}
|
||||
RUN useradd -u $HOST_USER_ID -ms /bin/bash user
|
||||
|
||||
USER user
|
||||
WORKDIR /home/user
|
||||
|
||||
ENV LANG C.UTF-8
|
||||
@@ -1,4 +1,96 @@
|
||||
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v28
|
||||
FROM fedora:33
|
||||
|
||||
RUN dnf -y install \
|
||||
adwaita-icon-theme \
|
||||
atk-devel \
|
||||
at-spi2-atk-devel \
|
||||
avahi-gobject-devel \
|
||||
cairo-devel \
|
||||
cairo-gobject-devel \
|
||||
ccache \
|
||||
clang \
|
||||
clang-analyzer \
|
||||
colord-devel \
|
||||
cups-devel \
|
||||
dbus-daemon \
|
||||
dbus-x11 \
|
||||
dejavu-sans-mono-fonts \
|
||||
desktop-file-utils \
|
||||
diffutils \
|
||||
elfutils-libelf-devel \
|
||||
fribidi-devel \
|
||||
gcc \
|
||||
gcc-c++ \
|
||||
gdk-pixbuf2-devel \
|
||||
gdk-pixbuf2-modules \
|
||||
gettext \
|
||||
git \
|
||||
glib2-devel \
|
||||
glib2-static \
|
||||
glibc-devel \
|
||||
glibc-headers \
|
||||
gnome-desktop-testing \
|
||||
gobject-introspection-devel \
|
||||
graphene-devel \
|
||||
graphviz \
|
||||
gstreamer1-devel \
|
||||
gstreamer1-plugins-good \
|
||||
gstreamer1-plugins-bad-free-devel \
|
||||
gstreamer1-plugins-base-devel \
|
||||
gtk-doc \
|
||||
hicolor-icon-theme \
|
||||
iso-codes \
|
||||
itstool \
|
||||
json-glib-devel \
|
||||
lcov \
|
||||
libasan \
|
||||
libattr-devel \
|
||||
libcloudproviders-devel \
|
||||
libepoxy-devel \
|
||||
libffi-devel \
|
||||
libmount-devel \
|
||||
librsvg2 \
|
||||
libselinux-devel \
|
||||
libubsan \
|
||||
libXcomposite-devel \
|
||||
libXcursor-devel \
|
||||
libXcursor-devel \
|
||||
libXdamage-devel \
|
||||
libXfixes-devel \
|
||||
libXi-devel \
|
||||
libXinerama-devel \
|
||||
libxkbcommon-devel \
|
||||
libXrandr-devel \
|
||||
libXrender-devel \
|
||||
libXtst-devel \
|
||||
libxslt \
|
||||
mesa-dri-drivers \
|
||||
mesa-libEGL-devel \
|
||||
mesa-libGLES-devel \
|
||||
meson \
|
||||
ninja-build \
|
||||
pango-devel \
|
||||
pcre-devel \
|
||||
pcre-static \
|
||||
python3 \
|
||||
python3-jinja2 \
|
||||
python3-markdown \
|
||||
python3-pip \
|
||||
python3-pygments \
|
||||
python3-toml \
|
||||
python3-typogrify \
|
||||
python3-wheel \
|
||||
redhat-rpm-config \
|
||||
sassc \
|
||||
systemtap-sdt-devel \
|
||||
vulkan-devel \
|
||||
wayland-devel \
|
||||
wayland-protocols-devel \
|
||||
weston \
|
||||
weston-libs \
|
||||
which \
|
||||
xorg-x11-server-Xvfb \
|
||||
&& dnf clean all
|
||||
|
||||
# Enable sudo for wheel users
|
||||
RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers
|
||||
|
||||
@@ -1,79 +1,3 @@
|
||||
Overview of Changes in 4.3.0
|
||||
============================
|
||||
|
||||
* GtkVideo:
|
||||
- Detect stream metadata when using gstreamer
|
||||
|
||||
* GtkFileChooser:
|
||||
- Fix a crash
|
||||
|
||||
* GtkButton:
|
||||
- Add back visual feedback for keynav activation
|
||||
|
||||
* GtkFontChooser:
|
||||
- Fix initial font selection
|
||||
|
||||
* Text widgets:
|
||||
- Support translucent selections
|
||||
|
||||
* GtkScrolledWindow:
|
||||
- Stop using scroll cursors
|
||||
|
||||
* GtkMenuButton:
|
||||
- Make focus-on-click work
|
||||
|
||||
* GtkToggleButton:
|
||||
- Make grouped buttons mutually exclusive
|
||||
|
||||
* GtkPasswordEntry:
|
||||
- Use MADV_DONTDUMP for secure memory
|
||||
|
||||
* GtkListBox:
|
||||
- Allow repeated selection extension for MULTIPLE
|
||||
|
||||
* Themes:
|
||||
- Fix resize border sizing
|
||||
- Fix solid-csd window decorations
|
||||
|
||||
* Input:
|
||||
- Revert some Compose sequence changes (mainly around dead
|
||||
acute and apostrophe)
|
||||
- Consume all key events during preedit, to avoid unexpected
|
||||
interactions
|
||||
- Ignore more modifiers during preedit, to allow using 3rd and
|
||||
5th level choosers
|
||||
- Fix handling of cursor positions in non-ASCII preedit text
|
||||
- Fix a problem with deferred focus setting
|
||||
|
||||
* GdkClipboard:
|
||||
- Ensure strings are nul-terminated
|
||||
|
||||
* GSK:
|
||||
- Improvements to the ngl renderer
|
||||
- Fix offscreen rendering with transforms
|
||||
- Fix downscaled textures
|
||||
- Avoid huge intermediate textures
|
||||
- Make shadow rendering match across renderers
|
||||
|
||||
* Accessibility:
|
||||
- Various fixes to get Orca to speak (still a work in progress)
|
||||
|
||||
* Wayland:
|
||||
- Improve font settings fallback
|
||||
- Avoid unintentional rendering freezes with popovers
|
||||
|
||||
* X11:
|
||||
- Don't beep on untrusted displays
|
||||
- Don't crash when popovers are outside the workarea
|
||||
|
||||
* Windows:
|
||||
- Fix using GL rendering with Mesa drivers
|
||||
|
||||
* Inspector:
|
||||
- Enable the inspector by default, in all cases
|
||||
- Improve monitor information
|
||||
|
||||
|
||||
Overview of Changes in 4.2.0
|
||||
============================
|
||||
|
||||
|
||||
+2
-3
@@ -76,9 +76,6 @@
|
||||
/* Define to 1 if you have a working `mmap' system call. */
|
||||
#mesondefine HAVE_MMAP
|
||||
|
||||
/* Define to 1 if you have a working `madvise' system call. */
|
||||
#mesondefine HAVE_MADVISE
|
||||
|
||||
/* Define to 1 if you have the `posix_fallocate' function. */
|
||||
#mesondefine HAVE_POSIX_FALLOCATE
|
||||
|
||||
@@ -282,3 +279,5 @@
|
||||
|
||||
/* Define if tracker3 is available */
|
||||
#mesondefine HAVE_TRACKER3
|
||||
|
||||
#mesondefine HAVE_F16C
|
||||
|
||||
@@ -116,20 +116,25 @@ populate_emoji_text (void)
|
||||
GtkWidget *textview;
|
||||
GtkTextBuffer *buffer;
|
||||
GString *s;
|
||||
GtkTextIter iter;
|
||||
|
||||
s = g_string_sized_new (1000 * 30 * 4);
|
||||
s = g_string_sized_new (500 * 30 * 4);
|
||||
|
||||
for (int i = 0; i < 1000; i++)
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
if (i % 2)
|
||||
g_string_append (s, "x");
|
||||
g_string_append (s, "<span underline=\"single\" underline_color=\"red\">x</span>");
|
||||
for (int j = 0; j < 30; j++)
|
||||
g_string_append (s, "💓x");
|
||||
{
|
||||
g_string_append (s, "💓");
|
||||
g_string_append (s, "<span underline=\"single\" underline_color=\"red\">x</span>");
|
||||
}
|
||||
g_string_append (s, "\n");
|
||||
}
|
||||
|
||||
buffer = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_set_text (buffer, s->str, s->len);
|
||||
gtk_text_buffer_get_start_iter (buffer, &iter);
|
||||
gtk_text_buffer_insert_markup (buffer, &iter, s->str, s->len);
|
||||
|
||||
g_string_free (s, TRUE);
|
||||
|
||||
|
||||
@@ -635,6 +635,24 @@ export_image_cb (GtkWidget *button,
|
||||
gtk_widget_show (dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
clip_image_cb (GtkWidget *button,
|
||||
NodeEditorWindow *self)
|
||||
{
|
||||
GdkTexture *texture;
|
||||
GdkClipboard *clipboard;
|
||||
|
||||
texture = create_texture (self);
|
||||
if (texture == NULL)
|
||||
return;
|
||||
|
||||
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (self));
|
||||
|
||||
gdk_clipboard_set_texture (clipboard, texture);
|
||||
|
||||
g_object_unref (texture);
|
||||
}
|
||||
|
||||
static void
|
||||
testcase_name_entry_changed_cb (GtkWidget *button,
|
||||
GParamSpec *pspec,
|
||||
@@ -826,6 +844,7 @@ node_editor_window_class_init (NodeEditorWindowClass *class)
|
||||
gtk_widget_class_bind_template_callback (widget_class, open_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, save_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, export_image_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, clip_image_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, testcase_save_clicked_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, testcase_name_entry_changed_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, dark_mode_cb);
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
<object class="GtkHeaderBar" id="header">
|
||||
<child type="start">
|
||||
<object class="GtkButton">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="icon-name">document-open-symbolic</property>
|
||||
<property name="tooltip-text">Open node file</property>
|
||||
<signal name="clicked" handler="open_cb"/>
|
||||
@@ -109,6 +110,7 @@
|
||||
</child>
|
||||
<child type="start">
|
||||
<object class="GtkButton">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="icon-name">document-save-symbolic</property>
|
||||
<property name="tooltip-text">Save to node file</property>
|
||||
<signal name="clicked" handler="save_cb"/>
|
||||
@@ -116,24 +118,30 @@
|
||||
</child>
|
||||
<child type="start">
|
||||
<object class="GtkButton">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="icon-name">insert-image-symbolic</property>
|
||||
<property name="tooltip-text">Export to image</property>
|
||||
<signal name="clicked" handler="export_image_cb"/>
|
||||
</object>
|
||||
</child>
|
||||
<child type="start">
|
||||
<object class="GtkSeparator">
|
||||
<property name="orientation">vertical</property>
|
||||
<object class="GtkButton">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="icon-name">edit-copy-symbolic</property>
|
||||
<property name="tooltip-text">Copy image to clipboard</property>
|
||||
<signal name="clicked" handler="clip_image_cb"/>
|
||||
</object>
|
||||
</child>
|
||||
<child type="start">
|
||||
<object class="GtkMenuButton">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="label">Save Testcase</property>
|
||||
<property name="popover">testcase_popover</property>
|
||||
</object>
|
||||
</child>
|
||||
<child type="end">
|
||||
<object class="GtkMenuButton" id="gear_menu_button">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="menu-model">gear_menu</property>
|
||||
<property name="icon-name">open-menu-symbolic</property>
|
||||
@@ -141,6 +149,7 @@
|
||||
</child>
|
||||
<child type="end">
|
||||
<object class="GtkToggleButton" id="dark_bg_button">
|
||||
<property name="focus-on-click">0</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="has-frame">0</property>
|
||||
<property name="icon-name">display-brightness-symbolic</property>
|
||||
|
||||
@@ -50,32 +50,19 @@ change_theme_state (GSimpleAction *action,
|
||||
GtkSettings *settings = gtk_settings_get_default ();
|
||||
const char *s;
|
||||
const char *theme;
|
||||
gboolean prefer_dark = FALSE;
|
||||
|
||||
g_simple_action_set_state (action, state);
|
||||
|
||||
s = g_variant_get_string (state, NULL);
|
||||
|
||||
if (strcmp (s, "adwaita") == 0)
|
||||
{
|
||||
theme = "Adwaita";
|
||||
prefer_dark = FALSE;
|
||||
}
|
||||
else if (strcmp (s, "adwaita-dark") == 0)
|
||||
{
|
||||
theme = "Adwaita";
|
||||
prefer_dark = TRUE;
|
||||
}
|
||||
else if (strcmp (s, "highcontrast") == 0)
|
||||
{
|
||||
theme = "HighContrast";
|
||||
prefer_dark = FALSE;
|
||||
}
|
||||
else if (strcmp (s, "highcontrast-inverse") == 0)
|
||||
{
|
||||
theme = "HighContrastInverse";
|
||||
prefer_dark = FALSE;
|
||||
}
|
||||
if (strcmp (s, "default") == 0)
|
||||
theme = "Default";
|
||||
else if (strcmp (s, "dark") == 0)
|
||||
theme = "Default-dark";
|
||||
else if (strcmp (s, "hc") == 0)
|
||||
theme = "Default-hc";
|
||||
else if (strcmp (s, "hc-dark") == 0)
|
||||
theme = "Default-hc-dark";
|
||||
else if (strcmp (s, "current") == 0)
|
||||
{
|
||||
gtk_settings_reset_property (settings, "gtk-theme-name");
|
||||
@@ -87,7 +74,7 @@ change_theme_state (GSimpleAction *action,
|
||||
|
||||
g_object_set (G_OBJECT (settings),
|
||||
"gtk-theme-name", theme,
|
||||
"gtk-application-prefer-dark-theme", prefer_dark,
|
||||
"gtk-application-prefer-dark-theme", FALSE,
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -1886,6 +1873,7 @@ set_up_context_popover (GtkWidget *widget,
|
||||
gtk_widget_set_parent (popover, widget);
|
||||
gtk_popover_set_has_arrow (GTK_POPOVER (popover), FALSE);
|
||||
gesture = gtk_gesture_click_new ();
|
||||
gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), "widget-factory-context-click");
|
||||
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
|
||||
g_signal_connect (gesture, "pressed", G_CALLBACK (clicked_cb), popover);
|
||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
|
||||
|
||||
@@ -15,24 +15,24 @@
|
||||
<attribute name="target">current</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">Adwaita</attribute>
|
||||
<attribute name="label" translatable="yes">Default</attribute>
|
||||
<attribute name="action">win.theme</attribute>
|
||||
<attribute name="target">adwaita</attribute>
|
||||
<attribute name="target">default</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">Adwaita dark</attribute>
|
||||
<attribute name="label" translatable="yes">Dark</attribute>
|
||||
<attribute name="action">win.theme</attribute>
|
||||
<attribute name="target">adwaita-dark</attribute>
|
||||
<attribute name="target">dark</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">High contrast</attribute>
|
||||
<attribute name="label" translatable="yes">Highcontrast</attribute>
|
||||
<attribute name="action">win.theme</attribute>
|
||||
<attribute name="target">highcontrast</attribute>
|
||||
<attribute name="target">hc</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">High contrast inverse</attribute>
|
||||
<attribute name="label" translatable="yes">Highcontrast inverse</attribute>
|
||||
<attribute name="action">win.theme</attribute>
|
||||
<attribute name="target">highcontrast-inverse</attribute>
|
||||
<attribute name="target">hc-dark</attribute>
|
||||
</item>
|
||||
</section>
|
||||
</submenu>
|
||||
|
||||
@@ -21,9 +21,3 @@ show_index_summary = true
|
||||
|
||||
[source-location]
|
||||
base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/master/"
|
||||
|
||||
[extra]
|
||||
content_images = [
|
||||
"images/gtk-logo.svg",
|
||||
]
|
||||
urlmap_file = "urlmap.js"
|
||||
|
||||
@@ -21,9 +21,3 @@ show_index_summary = true
|
||||
|
||||
[source-location]
|
||||
base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/master/"
|
||||
|
||||
[extra]
|
||||
content_images = [
|
||||
"images/gtk-logo.svg",
|
||||
]
|
||||
urlmap_file = "urlmap.js"
|
||||
|
||||
@@ -70,21 +70,16 @@ if get_option('man-pages') and xsltproc.found()
|
||||
man_files = [
|
||||
[ 'gtk4-broadwayd', '1', ],
|
||||
[ 'gtk4-builder-tool', '1', ],
|
||||
[ 'gtk4-demo', '1', ],
|
||||
[ 'gtk4-demo-application', '1', ],
|
||||
[ 'gtk4-encode-symbolic-svg', '1', ],
|
||||
[ 'gtk4-icon-browser', '1', ],
|
||||
[ 'gtk4-launch', '1', ],
|
||||
[ 'gtk4-query-settings', '1', ],
|
||||
[ 'gtk4-update-icon-cache', '1', ],
|
||||
[ 'gtk4-widget-factory', '1', ],
|
||||
]
|
||||
|
||||
if get_option('demos')
|
||||
man_files += [
|
||||
[ 'gtk4-demo', '1', ],
|
||||
[ 'gtk4-demo-application', '1', ],
|
||||
[ 'gtk4-widget-factory', '1', ],
|
||||
[ 'gtk4-icon-browser', '1', ],
|
||||
]
|
||||
endif
|
||||
|
||||
foreach man: man_files
|
||||
man_name = man.get(0)
|
||||
man_section = man.get(1, '1')
|
||||
|
||||
@@ -3,7 +3,7 @@ toml_conf.set('version', meson.project_version())
|
||||
|
||||
gidocgen = find_program('gi-docgen', required: get_option('gtk_doc'))
|
||||
|
||||
docs_dir = gtk_datadir / 'doc'
|
||||
docs_dir = gtk_datadir / 'doc/gtk4/reference'
|
||||
|
||||
subdir('gdk')
|
||||
subdir('gsk')
|
||||
|
||||
+10
-10
@@ -554,19 +554,19 @@ gdk_clipboard_store_async (GdkClipboard *clipboard,
|
||||
|
||||
if (priv->local)
|
||||
{
|
||||
GDK_CLIPBOARD_GET_CLASS (clipboard)->store_async (clipboard,
|
||||
io_priority,
|
||||
cancellable,
|
||||
callback,
|
||||
user_data);
|
||||
return GDK_CLIPBOARD_GET_CLASS (clipboard)->store_async (clipboard,
|
||||
io_priority,
|
||||
cancellable,
|
||||
callback,
|
||||
user_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
gdk_clipboard_store_default_async (clipboard,
|
||||
io_priority,
|
||||
cancellable,
|
||||
callback,
|
||||
user_data);
|
||||
return gdk_clipboard_store_default_async (clipboard,
|
||||
io_priority,
|
||||
cancellable,
|
||||
callback,
|
||||
user_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -672,18 +672,9 @@ string_deserializer_finish (GObject *source,
|
||||
}
|
||||
else
|
||||
{
|
||||
GOutputStream *mem_stream = g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (stream));
|
||||
|
||||
/* write a terminating NULL byte */
|
||||
if (g_output_stream_write (mem_stream, "", 1, NULL, &error) < 0 ||
|
||||
!g_output_stream_close (mem_stream, NULL, &error))
|
||||
{
|
||||
gdk_content_deserializer_return_error (deserializer, error);
|
||||
return;
|
||||
}
|
||||
|
||||
g_value_take_string (gdk_content_deserializer_get_value (deserializer),
|
||||
g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (mem_stream)));
|
||||
g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (
|
||||
g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (stream)))));
|
||||
}
|
||||
gdk_content_deserializer_return_success (deserializer);
|
||||
}
|
||||
@@ -712,7 +703,7 @@ string_deserializer (GdkContentDeserializer *deserializer)
|
||||
|
||||
g_output_stream_splice_async (filter,
|
||||
gdk_content_deserializer_get_input_stream (deserializer),
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE,
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
|
||||
gdk_content_deserializer_get_priority (deserializer),
|
||||
gdk_content_deserializer_get_cancellable (deserializer),
|
||||
string_deserializer_finish,
|
||||
@@ -740,8 +731,7 @@ file_uri_deserializer_finish (GObject *source,
|
||||
}
|
||||
|
||||
/* write terminating NULL */
|
||||
if (g_output_stream_write (stream, "", 1, NULL, &error) < 0 ||
|
||||
!g_output_stream_close (stream, NULL, &error))
|
||||
if (!g_output_stream_write (stream, "", 1, NULL, &error))
|
||||
{
|
||||
gdk_content_deserializer_return_error (deserializer, error);
|
||||
return;
|
||||
@@ -781,7 +771,7 @@ file_uri_deserializer (GdkContentDeserializer *deserializer)
|
||||
|
||||
g_output_stream_splice_async (output,
|
||||
gdk_content_deserializer_get_input_stream (deserializer),
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE,
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
|
||||
gdk_content_deserializer_get_priority (deserializer),
|
||||
gdk_content_deserializer_get_cancellable (deserializer),
|
||||
file_uri_deserializer_finish,
|
||||
@@ -931,7 +921,7 @@ init (void)
|
||||
gdk_content_register_deserializer (mime,
|
||||
G_TYPE_STRING,
|
||||
string_deserializer,
|
||||
(gpointer) charset,
|
||||
mime,
|
||||
g_free);
|
||||
}
|
||||
gdk_content_register_deserializer ("text/plain",
|
||||
|
||||
@@ -461,7 +461,7 @@ gdk_content_formats_contain_mime_type (const GdkContentFormats *formats,
|
||||
* Note that @formats may not contain any #GTypes, in particular when
|
||||
* they are empty. In that case %NULL will be returned.
|
||||
*
|
||||
* Returns: (transfer none) (nullable) (array length=n_gtypes zero-terminated=1):
|
||||
* Returns: (transfer none) (nullable) (array length=n_gtypes):
|
||||
* %G_TYPE_INVALID-terminated array of types included in @formats or
|
||||
* %NULL if none.
|
||||
*/
|
||||
@@ -480,7 +480,7 @@ gdk_content_formats_get_gtypes (const GdkContentFormats *formats,
|
||||
/**
|
||||
* gdk_content_formats_get_mime_types:
|
||||
* @formats: a `GdkContentFormats`
|
||||
* @n_mime_types: (out) (optional): optional pointer to take the
|
||||
* @n_mime_types: (out) (allow-none): optional pointer to take the
|
||||
* number of mime types contained in the return value
|
||||
*
|
||||
* Gets the mime types included in @formats.
|
||||
@@ -488,7 +488,7 @@ gdk_content_formats_get_gtypes (const GdkContentFormats *formats,
|
||||
* Note that @formats may not contain any mime types, in particular
|
||||
* when they are empty. In that case %NULL will be returned.
|
||||
*
|
||||
* Returns: (transfer none) (nullable) (array length=n_mime_types zero-terminated=1): %NULL-terminated array of
|
||||
* Returns: (transfer none) (nullable): %NULL-terminated array of
|
||||
* interned strings of mime types included in @formats or %NULL
|
||||
* if none.
|
||||
*/
|
||||
|
||||
@@ -377,7 +377,7 @@ gdk_content_provider_attach_clipboard (GdkContentProvider *provider,
|
||||
g_return_if_fail (GDK_IS_CONTENT_PROVIDER (provider));
|
||||
g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
|
||||
|
||||
GDK_CONTENT_PROVIDER_GET_CLASS (provider)->attach_clipboard (provider, clipboard);
|
||||
return GDK_CONTENT_PROVIDER_GET_CLASS (provider)->attach_clipboard (provider, clipboard);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -387,5 +387,5 @@ gdk_content_provider_detach_clipboard (GdkContentProvider *provider,
|
||||
g_return_if_fail (GDK_IS_CONTENT_PROVIDER (provider));
|
||||
g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
|
||||
|
||||
GDK_CONTENT_PROVIDER_GET_CLASS (provider)->detach_clipboard (provider, clipboard);
|
||||
return GDK_CONTENT_PROVIDER_GET_CLASS (provider)->detach_clipboard (provider, clipboard);
|
||||
}
|
||||
|
||||
@@ -2443,7 +2443,6 @@ gdk_surface_ensure_motion (GdkSurface *surface)
|
||||
GdkEvent *event;
|
||||
double x, y;
|
||||
GdkModifierType state;
|
||||
GdkSurface *grab_surface;
|
||||
|
||||
if (!surface->request_motion)
|
||||
return;
|
||||
@@ -2460,12 +2459,6 @@ gdk_surface_ensure_motion (GdkSurface *surface)
|
||||
if (!gdk_surface_get_device_position (surface, device, &x, &y, &state))
|
||||
return;
|
||||
|
||||
if (gdk_device_grab_info (display, device, &grab_surface, NULL))
|
||||
{
|
||||
if (grab_surface != surface)
|
||||
return;
|
||||
}
|
||||
|
||||
event = gdk_motion_event_new (surface,
|
||||
device,
|
||||
NULL,
|
||||
|
||||
+1
-1
@@ -446,7 +446,7 @@ gdk_texture_download_area (GdkTexture *texture,
|
||||
g_assert (area->x + area->width <= texture->width);
|
||||
g_assert (area->y + area->height <= texture->height);
|
||||
|
||||
GDK_TEXTURE_GET_CLASS (texture)->download (texture, area, data, stride);
|
||||
return GDK_TEXTURE_GET_CLASS (texture)->download (texture, area, data, stride);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -364,7 +364,7 @@ gdk_toplevel_focus (GdkToplevel *toplevel,
|
||||
{
|
||||
g_return_if_fail (GDK_IS_TOPLEVEL (toplevel));
|
||||
|
||||
GDK_TOPLEVEL_GET_IFACE (toplevel)->focus (toplevel, timestamp);
|
||||
return GDK_TOPLEVEL_GET_IFACE (toplevel)->focus (toplevel, timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define HAVE_MEMFD_CREATE
|
||||
#ifdef HAVE_MEMFD_CREATE
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
@@ -848,7 +848,12 @@ gdk_wayland_device_pad_get_n_groups (GdkDevicePad *pad)
|
||||
|
||||
data = gdk_wayland_seat_find_pad (GDK_WAYLAND_SEAT (seat),
|
||||
GDK_DEVICE (pad));
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (data == NULL)
|
||||
return 0;
|
||||
#else
|
||||
g_assert (data != NULL);
|
||||
#endif
|
||||
|
||||
return g_list_length (data->mode_groups);
|
||||
}
|
||||
@@ -863,7 +868,12 @@ gdk_wayland_device_pad_get_group_n_modes (GdkDevicePad *pad,
|
||||
|
||||
data = gdk_wayland_seat_find_pad (GDK_WAYLAND_SEAT (seat),
|
||||
GDK_DEVICE (pad));
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (data == NULL)
|
||||
return 0;
|
||||
#else
|
||||
g_assert (data != NULL);
|
||||
#endif
|
||||
|
||||
group = g_list_nth_data (data->mode_groups, n_group);
|
||||
if (!group)
|
||||
@@ -909,7 +919,12 @@ gdk_wayland_device_pad_get_feature_group (GdkDevicePad *pad,
|
||||
|
||||
data = gdk_wayland_seat_find_pad (GDK_WAYLAND_SEAT (seat),
|
||||
GDK_DEVICE (pad));
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (data == NULL)
|
||||
return -1;
|
||||
#else
|
||||
g_assert (data != NULL);
|
||||
#endif
|
||||
|
||||
for (l = data->mode_groups, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
@@ -4236,7 +4251,14 @@ tablet_pad_handle_button (void *data,
|
||||
wp_tablet_pad, button, state));
|
||||
|
||||
group = tablet_pad_lookup_button_group (pad, button);
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (group == NULL)
|
||||
return;
|
||||
#else
|
||||
g_assert (group != NULL);
|
||||
#endif
|
||||
|
||||
n_group = g_list_index (pad->mode_groups, group);
|
||||
|
||||
event = gdk_pad_event_new_button (state == ZWP_TABLET_PAD_V2_BUTTON_STATE_PRESSED
|
||||
|
||||
@@ -58,6 +58,19 @@
|
||||
|
||||
#include "gdk/gdk-private.h"
|
||||
|
||||
/* Keep g_assert() defined even if we disable it globally,
|
||||
* as we use it in many places as a handy mechanism to check
|
||||
* for non-NULL
|
||||
*/
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
# undef g_assert
|
||||
# define g_assert(expr) G_STMT_START { \
|
||||
if G_LIKELY (expr) ; else \
|
||||
g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
||||
#expr); \
|
||||
} G_STMT_END
|
||||
#endif
|
||||
|
||||
/**
|
||||
* GdkWaylandDisplay:
|
||||
*
|
||||
@@ -256,23 +269,122 @@ postpone_on_globals_closure (GdkWaylandDisplay *display_wayland,
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
|
||||
static const char *
|
||||
get_format_name (uint32_t format,
|
||||
char name[10])
|
||||
get_format_name (enum wl_shm_format format)
|
||||
{
|
||||
if (format == 0)
|
||||
g_strlcpy (name, "ARGB8888", 10);
|
||||
else if (format == 1)
|
||||
g_strlcpy (name, "XRGB8888", 10);
|
||||
else
|
||||
g_snprintf (name, 10, "4cc %c%c%c%c",
|
||||
(char) (format & 0xff),
|
||||
(char) ((format >> 8) & 0xff),
|
||||
(char) ((format >> 16) & 0xff),
|
||||
(char) ((format >> 24) & 0xff));
|
||||
int i;
|
||||
#define FORMAT(s) { WL_SHM_FORMAT_ ## s, #s }
|
||||
struct { int format; const char *name; } formats[] = {
|
||||
FORMAT(ARGB8888),
|
||||
FORMAT(XRGB8888),
|
||||
FORMAT(C8),
|
||||
FORMAT(RGB332),
|
||||
FORMAT(BGR233),
|
||||
FORMAT(XRGB4444),
|
||||
FORMAT(XBGR4444),
|
||||
FORMAT(RGBX4444),
|
||||
FORMAT(BGRX4444),
|
||||
FORMAT(ARGB4444),
|
||||
FORMAT(ABGR4444),
|
||||
FORMAT(RGBA4444),
|
||||
FORMAT(BGRA4444),
|
||||
FORMAT(XRGB1555),
|
||||
FORMAT(XBGR1555),
|
||||
FORMAT(RGBX5551),
|
||||
FORMAT(BGRX5551),
|
||||
FORMAT(ARGB1555),
|
||||
FORMAT(ABGR1555),
|
||||
FORMAT(RGBA5551),
|
||||
FORMAT(BGRA5551),
|
||||
FORMAT(RGB565),
|
||||
FORMAT(BGR565),
|
||||
FORMAT(RGB888),
|
||||
FORMAT(BGR888),
|
||||
FORMAT(XBGR8888),
|
||||
FORMAT(RGBX8888),
|
||||
FORMAT(BGRX8888),
|
||||
FORMAT(ABGR8888),
|
||||
FORMAT(RGBA8888),
|
||||
FORMAT(BGRA8888),
|
||||
FORMAT(XRGB2101010),
|
||||
FORMAT(XBGR2101010),
|
||||
FORMAT(RGBX1010102),
|
||||
FORMAT(BGRX1010102),
|
||||
FORMAT(ARGB2101010),
|
||||
FORMAT(ABGR2101010),
|
||||
FORMAT(RGBA1010102),
|
||||
FORMAT(BGRA1010102),
|
||||
FORMAT(YUYV),
|
||||
FORMAT(YVYU),
|
||||
FORMAT(UYVY),
|
||||
FORMAT(VYUY),
|
||||
FORMAT(AYUV),
|
||||
FORMAT(NV12),
|
||||
FORMAT(NV21),
|
||||
FORMAT(NV16),
|
||||
FORMAT(NV61),
|
||||
FORMAT(YUV410),
|
||||
FORMAT(YVU410),
|
||||
FORMAT(YUV411),
|
||||
FORMAT(YVU411),
|
||||
FORMAT(YUV420),
|
||||
FORMAT(YVU420),
|
||||
FORMAT(YUV422),
|
||||
FORMAT(YVU422),
|
||||
FORMAT(YUV444),
|
||||
FORMAT(YVU444),
|
||||
FORMAT(R8),
|
||||
FORMAT(R16),
|
||||
FORMAT(RG88),
|
||||
FORMAT(GR88),
|
||||
FORMAT(RG1616),
|
||||
FORMAT(GR1616),
|
||||
FORMAT(XRGB16161616F),
|
||||
FORMAT(XBGR16161616F),
|
||||
FORMAT(ARGB16161616F),
|
||||
FORMAT(ABGR16161616F),
|
||||
FORMAT(XYUV8888),
|
||||
FORMAT(VUY888),
|
||||
FORMAT(VUY101010),
|
||||
FORMAT(Y210),
|
||||
FORMAT(Y212),
|
||||
FORMAT(Y216),
|
||||
FORMAT(Y410),
|
||||
FORMAT(Y412),
|
||||
FORMAT(Y416),
|
||||
FORMAT(XVYU12_16161616),
|
||||
FORMAT(XVYU16161616),
|
||||
FORMAT(Y0L0),
|
||||
FORMAT(X0L0),
|
||||
FORMAT(Y0L2),
|
||||
FORMAT(X0L2),
|
||||
FORMAT(YUV420_8BIT),
|
||||
FORMAT(YUV420_10BIT),
|
||||
FORMAT(XRGB8888_A8),
|
||||
FORMAT(XBGR8888_A8),
|
||||
FORMAT(RGBX8888_A8),
|
||||
FORMAT(BGRX8888_A8),
|
||||
FORMAT(RGB888_A8),
|
||||
FORMAT(BGR888_A8),
|
||||
FORMAT(RGB565_A8),
|
||||
FORMAT(BGR565_A8),
|
||||
FORMAT(NV24),
|
||||
FORMAT(NV42),
|
||||
FORMAT(P210),
|
||||
FORMAT(P010),
|
||||
FORMAT(P012),
|
||||
FORMAT(P016),
|
||||
|
||||
return name;
|
||||
{ 0xffffffff, NULL }
|
||||
};
|
||||
#undef FORMAT
|
||||
|
||||
for (i = 0; formats[i].name; i++)
|
||||
{
|
||||
if (formats[i].format == format)
|
||||
return formats[i].name;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void
|
||||
@@ -280,10 +392,7 @@ wl_shm_format (void *data,
|
||||
struct wl_shm *wl_shm,
|
||||
uint32_t format)
|
||||
{
|
||||
GDK_NOTE (MISC,
|
||||
char buf[10];
|
||||
g_message ("supported pixel format %s", get_format_name (format, buf));
|
||||
);
|
||||
GDK_NOTE (MISC, g_message ("supported pixel format %s", get_format_name (format)));
|
||||
}
|
||||
|
||||
static const struct wl_shm_listener wl_shm_listener = {
|
||||
|
||||
@@ -712,30 +712,20 @@ _set_pixformat_for_hdc (HDC hdc,
|
||||
int *best_idx,
|
||||
GdkWin32Display *display)
|
||||
{
|
||||
gboolean already_checked = TRUE;
|
||||
*best_idx = GetPixelFormat (hdc);
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
gboolean set_pixel_format_result = FALSE;
|
||||
|
||||
/* one is only allowed to call SetPixelFormat(), and so ChoosePixelFormat()
|
||||
* one single time per window HDC
|
||||
*/
|
||||
if (*best_idx == 0)
|
||||
{
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
gboolean set_pixel_format_result = FALSE;
|
||||
*best_idx = _get_wgl_pfd (hdc, &pfd, display);
|
||||
|
||||
GDK_NOTE (OPENGL, g_print ("requesting pixel format...\n"));
|
||||
already_checked = FALSE;
|
||||
*best_idx = _get_wgl_pfd (hdc, &pfd, display);
|
||||
if (*best_idx != 0)
|
||||
set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
|
||||
|
||||
if (*best_idx != 0)
|
||||
set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
|
||||
|
||||
/* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
|
||||
if (*best_idx == 0 || !set_pixel_format_result)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GDK_NOTE (OPENGL, g_print ("%s""requested and set pixel format: %d\n", already_checked ? "already " : "", *best_idx));
|
||||
/* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
|
||||
if (*best_idx == 0 || !set_pixel_format_result)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -45,9 +45,6 @@ get_display_name (GFile *file,
|
||||
if (name == NULL)
|
||||
{
|
||||
name = g_file_get_basename (file);
|
||||
if (name == NULL)
|
||||
name = g_file_get_uri (file);
|
||||
|
||||
if (!g_utf8_validate (name, -1, NULL))
|
||||
{
|
||||
tmp = name;
|
||||
|
||||
@@ -1795,9 +1795,6 @@ _gdk_x11_display_update_grab_info_ungrab (GdkDisplay *display,
|
||||
static void
|
||||
gdk_x11_display_beep (GdkDisplay *display)
|
||||
{
|
||||
if (!GDK_X11_DISPLAY (display)->trusted_client)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
XkbBell (GDK_DISPLAY_XDISPLAY (display), None, 0, None);
|
||||
#else
|
||||
|
||||
+17
-6
@@ -185,13 +185,24 @@ gdk_x_io_error (Display *display)
|
||||
/* This is basically modelled after the code in XLib. We need
|
||||
* an explicit error handler here, so we can disable our atexit()
|
||||
* which would otherwise cause a nice segfault.
|
||||
* We g_debug() instead of g_warning(), because g_warning()
|
||||
* could possibly be redirected to the log
|
||||
* We fprintf(stderr, instead of g_warning() because g_warning()
|
||||
* could possibly be redirected to a dialog
|
||||
*/
|
||||
g_debug ("%s: Fatal IO error %d (%s) on X server %s.\n",
|
||||
g_get_prgname (),
|
||||
errno, g_strerror (errno),
|
||||
display ? DisplayString (display) : "");
|
||||
if (errno == EPIPE)
|
||||
{
|
||||
g_message ("The application '%s' lost its connection to the display %s;\n"
|
||||
"most likely the X server was shut down or you killed/destroyed\n"
|
||||
"the application.\n",
|
||||
g_get_prgname (),
|
||||
display ? DisplayString (display) : NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("%s: Fatal IO error %d (%s) on X server %s.\n",
|
||||
g_get_prgname (),
|
||||
errno, g_strerror (errno),
|
||||
display ? DisplayString (display) : NULL);
|
||||
}
|
||||
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
@@ -1822,16 +1822,9 @@ gdk_x11_surface_layout_popup (GdkSurface *surface,
|
||||
|
||||
monitor = gdk_surface_get_layout_monitor (surface, layout,
|
||||
gdk_x11_monitor_get_workarea);
|
||||
if (monitor)
|
||||
gdk_x11_monitor_get_workarea (monitor, &bounds);
|
||||
else
|
||||
{
|
||||
monitor = gdk_surface_get_layout_monitor (surface, layout,
|
||||
gdk_monitor_get_geometry);
|
||||
gdk_monitor_get_geometry (monitor, &bounds);
|
||||
}
|
||||
gdk_x11_monitor_get_workarea (monitor, &bounds);
|
||||
|
||||
gdk_popup_layout_get_shadow_width (layout,
|
||||
gdk_popup_layout_get_shadow_width (layout,
|
||||
&impl->shadow_left,
|
||||
&impl->shadow_right,
|
||||
&impl->shadow_top,
|
||||
@@ -4549,9 +4542,6 @@ gdk_x11_surface_beep (GdkSurface *surface)
|
||||
|
||||
display = GDK_SURFACE_DISPLAY (surface);
|
||||
|
||||
if (!GDK_X11_DISPLAY (display)->trusted_client)
|
||||
return FALSE;
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
if (GDK_X11_DISPLAY (display)->use_xkb)
|
||||
{
|
||||
|
||||
@@ -45,7 +45,7 @@ xml = '''<?xml version='1.0' encoding='UTF-8'?>
|
||||
'''
|
||||
|
||||
for f in gl_source_shaders:
|
||||
xml += ' <file alias=\'glsl/{0}\'>resources/glsl/{0}</file>\n'.format(os.path.basename(f))
|
||||
xml += ' <file alias=\'gl/{0}\'>gl/resources/{0}</file>\n'.format(os.path.basename(f))
|
||||
|
||||
xml += '\n'
|
||||
|
||||
@@ -55,12 +55,12 @@ for f in ngl_source_shaders:
|
||||
xml += '\n'
|
||||
|
||||
for f in vulkan_compiled_shaders:
|
||||
xml += ' <file alias=\'vulkan/{0}\'>resources/vulkan/{0}</file>\n'.format(os.path.basename(f))
|
||||
xml += ' <file alias=\'vulkan/{0}\'>vulkan/resources/{0}</file>\n'.format(os.path.basename(f))
|
||||
|
||||
xml += '\n'
|
||||
|
||||
for f in vulkan_shaders:
|
||||
xml += ' <file alias=\'vulkan/{0}\'>resources/vulkan/{0}</file>\n'.format(os.path.basename(f))
|
||||
xml += ' <file alias=\'vulkan/{0}\'>vulkan/resources/{0}</file>\n'.format(os.path.basename(f))
|
||||
|
||||
xml += '''
|
||||
</gresource>
|
||||
|
||||
@@ -433,8 +433,6 @@ gsk_gl_driver_slice_texture (GskGLDriver *self,
|
||||
guint *out_n_slices)
|
||||
{
|
||||
const int max_texture_size = gsk_gl_driver_get_max_texture_size (self) / 4; // XXX Too much?
|
||||
const int tex_width = texture->width;
|
||||
const int tex_height = texture->height;
|
||||
const int cols = (texture->width / max_texture_size) + 1;
|
||||
const int rows = (texture->height / max_texture_size) + 1;
|
||||
int col, row;
|
||||
@@ -442,8 +440,7 @@ gsk_gl_driver_slice_texture (GskGLDriver *self,
|
||||
TextureSlice *slices;
|
||||
Texture *tex;
|
||||
|
||||
g_assert (tex_width > max_texture_size || tex_height > max_texture_size);
|
||||
|
||||
g_assert (texture->width > max_texture_size || texture->height > max_texture_size);
|
||||
|
||||
tex = gdk_texture_get_render_data (texture, self);
|
||||
|
||||
@@ -730,7 +727,12 @@ gsk_gl_driver_mark_texture_permanent (GskGLDriver *self,
|
||||
{
|
||||
Texture *t = gsk_gl_driver_get_texture (self, texture_id);
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (t == NULL)
|
||||
return;
|
||||
#else
|
||||
g_assert (t != NULL);
|
||||
#endif
|
||||
|
||||
t->permanent = TRUE;
|
||||
}
|
||||
|
||||
+23
-18
@@ -2002,7 +2002,12 @@ render_unblurred_inset_shadow_node (GskGLRenderer *self,
|
||||
const float dy = gsk_inset_shadow_node_get_dy (node);
|
||||
const float spread = gsk_inset_shadow_node_get_spread (node);
|
||||
|
||||
#if G_DISABLE_ASSERT
|
||||
if (blur_radius == 0)
|
||||
return;
|
||||
#else
|
||||
g_assert (blur_radius == 0);
|
||||
#endif
|
||||
|
||||
ops_set_program (builder, &self->programs->inset_shadow_program);
|
||||
ops_set_inset_shadow (builder, transform_rect (self, builder, gsk_inset_shadow_node_get_outline (node)),
|
||||
@@ -3313,27 +3318,27 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
|
||||
const char *resource_path;
|
||||
const char *name;
|
||||
} program_definitions[] = {
|
||||
{ "/org/gtk/libgsk/glsl/blend.glsl", "blend" },
|
||||
{ "/org/gtk/libgsk/glsl/blit.glsl", "blit" },
|
||||
{ "/org/gtk/libgsk/glsl/blur.glsl", "blur" },
|
||||
{ "/org/gtk/libgsk/glsl/border.glsl", "border" },
|
||||
{ "/org/gtk/libgsk/glsl/color_matrix.glsl", "color matrix" },
|
||||
{ "/org/gtk/libgsk/glsl/color.glsl", "color" },
|
||||
{ "/org/gtk/libgsk/glsl/coloring.glsl", "coloring" },
|
||||
{ "/org/gtk/libgsk/glsl/cross_fade.glsl", "cross fade" },
|
||||
{ "/org/gtk/libgsk/glsl/inset_shadow.glsl", "inset shadow" },
|
||||
{ "/org/gtk/libgsk/glsl/linear_gradient.glsl", "linear gradient" },
|
||||
{ "/org/gtk/libgsk/glsl/radial_gradient.glsl", "radial gradient" },
|
||||
{ "/org/gtk/libgsk/glsl/conic_gradient.glsl", "conic gradient" },
|
||||
{ "/org/gtk/libgsk/glsl/outset_shadow.glsl", "outset shadow" },
|
||||
{ "/org/gtk/libgsk/glsl/repeat.glsl", "repeat" },
|
||||
{ "/org/gtk/libgsk/glsl/unblurred_outset_shadow.glsl", "unblurred_outset shadow" },
|
||||
{ "/org/gtk/libgsk/gl/blend.glsl", "blend" },
|
||||
{ "/org/gtk/libgsk/gl/blit.glsl", "blit" },
|
||||
{ "/org/gtk/libgsk/gl/blur.glsl", "blur" },
|
||||
{ "/org/gtk/libgsk/gl/border.glsl", "border" },
|
||||
{ "/org/gtk/libgsk/gl/color_matrix.glsl", "color matrix" },
|
||||
{ "/org/gtk/libgsk/gl/color.glsl", "color" },
|
||||
{ "/org/gtk/libgsk/gl/coloring.glsl", "coloring" },
|
||||
{ "/org/gtk/libgsk/gl/cross_fade.glsl", "cross fade" },
|
||||
{ "/org/gtk/libgsk/gl/inset_shadow.glsl", "inset shadow" },
|
||||
{ "/org/gtk/libgsk/gl/linear_gradient.glsl", "linear gradient" },
|
||||
{ "/org/gtk/libgsk/gl/radial_gradient.glsl", "radial gradient" },
|
||||
{ "/org/gtk/libgsk/gl/conic_gradient.glsl", "conic gradient" },
|
||||
{ "/org/gtk/libgsk/gl/outset_shadow.glsl", "outset shadow" },
|
||||
{ "/org/gtk/libgsk/gl/repeat.glsl", "repeat" },
|
||||
{ "/org/gtk/libgsk/gl/unblurred_outset_shadow.glsl", "unblurred_outset shadow" },
|
||||
};
|
||||
|
||||
gsk_gl_shader_builder_init (&shader_builder,
|
||||
"/org/gtk/libgsk/glsl/preamble.glsl",
|
||||
"/org/gtk/libgsk/glsl/preamble.vs.glsl",
|
||||
"/org/gtk/libgsk/glsl/preamble.fs.glsl");
|
||||
"/org/gtk/libgsk/gl/preamble.glsl",
|
||||
"/org/gtk/libgsk/gl/preamble.vs.glsl",
|
||||
"/org/gtk/libgsk/gl/preamble.fs.glsl");
|
||||
|
||||
g_assert (G_N_ELEMENTS (program_definitions) == GL_N_PROGRAMS);
|
||||
|
||||
|
||||
+20
-2
@@ -19,9 +19,9 @@ rounded_rect_equal (const GskRoundedRect *r1,
|
||||
const GskRoundedRect *r2)
|
||||
{
|
||||
if (r1 == r2)
|
||||
return true;
|
||||
return true;
|
||||
|
||||
if (!r1)
|
||||
if (r1 == NULL || r2 == NULL)
|
||||
return false;
|
||||
|
||||
if (r1->bounds.origin.x != r2->bounds.origin.x ||
|
||||
@@ -626,6 +626,9 @@ ops_draw (RenderOpBuilder *builder,
|
||||
ProgramState *program_state = get_current_program_state (builder);
|
||||
OpDraw *op;
|
||||
|
||||
if (program_state == NULL)
|
||||
return NULL;
|
||||
|
||||
if (memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0)
|
||||
{
|
||||
OpMatrix *opm;
|
||||
@@ -739,7 +742,12 @@ ops_set_inset_shadow (RenderOpBuilder *self,
|
||||
ProgramState *current_program_state = get_current_program_state (self);
|
||||
OpShadow *op;
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (current_program_state == NULL)
|
||||
return;
|
||||
#else
|
||||
g_assert (current_program_state);
|
||||
#endif
|
||||
|
||||
op = ops_begin (self, OP_CHANGE_INSET_SHADOW);
|
||||
|
||||
@@ -806,7 +814,12 @@ ops_set_unblurred_outset_shadow (RenderOpBuilder *self,
|
||||
ProgramState *current_program_state = get_current_program_state (self);
|
||||
OpShadow *op;
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (current_program_state == NULL)
|
||||
return;
|
||||
#else
|
||||
g_assert (current_program_state);
|
||||
#endif
|
||||
|
||||
op = ops_begin (self, OP_CHANGE_UNBLURRED_OUTSET_SHADOW);
|
||||
|
||||
@@ -869,7 +882,12 @@ ops_set_linear_gradient (RenderOpBuilder *self,
|
||||
OpLinearGradient *op;
|
||||
const guint real_n_color_stops = MIN (GL_MAX_GRADIENT_STOPS, n_color_stops);
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (current_program_state == NULL)
|
||||
return;
|
||||
#else
|
||||
g_assert (current_program_state);
|
||||
#endif
|
||||
|
||||
op = ops_begin (self, OP_CHANGE_LINEAR_GRADIENT);
|
||||
|
||||
|
||||
+7
-7
@@ -549,14 +549,14 @@ gsk_render_node_diff (GskRenderNode *node1,
|
||||
return;
|
||||
|
||||
if (_gsk_render_node_get_node_type (node1) == _gsk_render_node_get_node_type (node2))
|
||||
GSK_RENDER_NODE_GET_CLASS (node1)->diff (node1, node2, region);
|
||||
return GSK_RENDER_NODE_GET_CLASS (node1)->diff (node1, node2, region);
|
||||
|
||||
else if (_gsk_render_node_get_node_type (node1) == GSK_CONTAINER_NODE)
|
||||
gsk_container_node_diff_with (node1, node2, region);
|
||||
else if (_gsk_render_node_get_node_type (node2) == GSK_CONTAINER_NODE)
|
||||
gsk_container_node_diff_with (node2, node1, region);
|
||||
else
|
||||
gsk_render_node_diff_impossible (node1, node2, region);
|
||||
if (_gsk_render_node_get_node_type (node1) == GSK_CONTAINER_NODE)
|
||||
return gsk_container_node_diff_with (node1, node2, region);
|
||||
if (_gsk_render_node_get_node_type (node2) == GSK_CONTAINER_NODE)
|
||||
return gsk_container_node_diff_with (node2, node1, region);
|
||||
|
||||
return gsk_render_node_diff_impossible (node1, node2, region);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+10
-12
@@ -2439,9 +2439,9 @@ render_node_print (Printer *p,
|
||||
{
|
||||
start_node (p, "cross-fade");
|
||||
|
||||
append_node_param (p, "end", gsk_cross_fade_node_get_end_child (node));
|
||||
append_float_param (p, "progress", gsk_cross_fade_node_get_progress (node), 0.5f);
|
||||
append_node_param (p, "start", gsk_cross_fade_node_get_start_child (node));
|
||||
append_node_param (p, "end", gsk_cross_fade_node_get_end_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2456,8 +2456,8 @@ render_node_print (Printer *p,
|
||||
start_node (p, "linear-gradient");
|
||||
|
||||
append_rect_param (p, "bounds", &node->bounds);
|
||||
append_point_param (p, "end", gsk_linear_gradient_node_get_end (node));
|
||||
append_point_param (p, "start", gsk_linear_gradient_node_get_start (node));
|
||||
append_point_param (p, "end", gsk_linear_gradient_node_get_end (node));
|
||||
append_stops_param (p, "stops", gsk_linear_gradient_node_get_color_stops (node, NULL),
|
||||
gsk_linear_gradient_node_get_n_color_stops (node));
|
||||
|
||||
@@ -2506,8 +2506,8 @@ render_node_print (Printer *p,
|
||||
{
|
||||
start_node (p, "opacity");
|
||||
|
||||
append_node_param (p, "child", gsk_opacity_node_get_child (node));
|
||||
append_float_param (p, "opacity", gsk_opacity_node_get_opacity (node), 0.5f);
|
||||
append_node_param (p, "child", gsk_opacity_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2535,8 +2535,8 @@ render_node_print (Printer *p,
|
||||
{
|
||||
start_node (p, "clip");
|
||||
|
||||
append_node_param (p, "child", gsk_clip_node_get_child (node));
|
||||
append_rect_param (p, "clip", gsk_clip_node_get_clip (node));
|
||||
append_node_param (p, "child", gsk_clip_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2546,8 +2546,8 @@ render_node_print (Printer *p,
|
||||
{
|
||||
start_node (p, "rounded-clip");
|
||||
|
||||
append_node_param (p, "child", gsk_rounded_clip_node_get_child (node));
|
||||
append_rounded_rect_param (p, "clip", gsk_rounded_clip_node_get_clip (node));
|
||||
append_node_param (p, "child", gsk_rounded_clip_node_get_child (node));
|
||||
|
||||
|
||||
end_node (p);
|
||||
@@ -2559,9 +2559,9 @@ render_node_print (Printer *p,
|
||||
GskTransform *transform = gsk_transform_node_get_transform (node);
|
||||
start_node (p, "transform");
|
||||
|
||||
append_node_param (p, "child", gsk_transform_node_get_child (node));
|
||||
if (gsk_transform_get_category (transform) != GSK_TRANSFORM_CATEGORY_IDENTITY)
|
||||
append_transform_param (p, "transform", transform);
|
||||
append_node_param (p, "child", gsk_transform_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2571,11 +2571,11 @@ render_node_print (Printer *p,
|
||||
{
|
||||
start_node (p, "color-matrix");
|
||||
|
||||
append_node_param (p, "child", gsk_color_matrix_node_get_child (node));
|
||||
if (!graphene_matrix_is_identity (gsk_color_matrix_node_get_color_matrix (node)))
|
||||
append_matrix_param (p, "matrix", gsk_color_matrix_node_get_color_matrix (node));
|
||||
if (!graphene_vec4_equal (gsk_color_matrix_node_get_color_offset (node), graphene_vec4_zero ()))
|
||||
append_vec4_param (p, "offset", gsk_color_matrix_node_get_color_offset (node));
|
||||
append_node_param (p, "child", gsk_color_matrix_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2649,8 +2649,6 @@ render_node_print (Printer *p,
|
||||
|
||||
start_node (p, "shadow");
|
||||
|
||||
append_node_param (p, "child", gsk_shadow_node_get_child (node));
|
||||
|
||||
_indent (p);
|
||||
g_string_append (p->str, "shadows: ");
|
||||
for (i = 0; i < n_shadows; i ++)
|
||||
@@ -2678,6 +2676,7 @@ render_node_print (Printer *p,
|
||||
|
||||
g_string_append_c (p->str, ';');
|
||||
g_string_append_c (p->str, '\n');
|
||||
append_node_param (p, "child", gsk_shadow_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2917,9 +2916,9 @@ render_node_print (Printer *p,
|
||||
|
||||
if (!graphene_rect_equal (&node->bounds, &child->bounds))
|
||||
append_rect_param (p, "bounds", &node->bounds);
|
||||
append_node_param (p, "child", gsk_repeat_node_get_child (node));
|
||||
if (!graphene_rect_equal (child_bounds, &child->bounds))
|
||||
append_rect_param (p, "child-bounds", child_bounds);
|
||||
append_node_param (p, "child", gsk_repeat_node_get_child (node));
|
||||
|
||||
end_node (p);
|
||||
}
|
||||
@@ -2932,8 +2931,6 @@ render_node_print (Printer *p,
|
||||
|
||||
start_node (p, "blend");
|
||||
|
||||
append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node));
|
||||
|
||||
if (mode != GSK_BLEND_MODE_DEFAULT)
|
||||
{
|
||||
_indent (p);
|
||||
@@ -2946,6 +2943,7 @@ render_node_print (Printer *p,
|
||||
}
|
||||
}
|
||||
}
|
||||
append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node));
|
||||
append_node_param (p, "top", gsk_blend_node_get_top_child (node));
|
||||
|
||||
end_node (p);
|
||||
|
||||
+21
-20
@@ -1,23 +1,23 @@
|
||||
gsk_private_gl_shaders = [
|
||||
'resources/glsl/preamble.glsl',
|
||||
'resources/glsl/preamble.fs.glsl',
|
||||
'resources/glsl/preamble.vs.glsl',
|
||||
'resources/glsl/border.glsl',
|
||||
'resources/glsl/blit.glsl',
|
||||
'resources/glsl/coloring.glsl',
|
||||
'resources/glsl/color.glsl',
|
||||
'resources/glsl/linear_gradient.glsl',
|
||||
'resources/glsl/radial_gradient.glsl',
|
||||
'resources/glsl/conic_gradient.glsl',
|
||||
'resources/glsl/color_matrix.glsl',
|
||||
'resources/glsl/blur.glsl',
|
||||
'resources/glsl/inset_shadow.glsl',
|
||||
'resources/glsl/outset_shadow.glsl',
|
||||
'resources/glsl/unblurred_outset_shadow.glsl',
|
||||
'resources/glsl/cross_fade.glsl',
|
||||
'resources/glsl/blend.glsl',
|
||||
'resources/glsl/repeat.glsl',
|
||||
'resources/glsl/custom.glsl',
|
||||
'gl/resources/preamble.glsl',
|
||||
'gl/resources/preamble.fs.glsl',
|
||||
'gl/resources/preamble.vs.glsl',
|
||||
'gl/resources/border.glsl',
|
||||
'gl/resources/blit.glsl',
|
||||
'gl/resources/coloring.glsl',
|
||||
'gl/resources/color.glsl',
|
||||
'gl/resources/linear_gradient.glsl',
|
||||
'gl/resources/radial_gradient.glsl',
|
||||
'gl/resources/conic_gradient.glsl',
|
||||
'gl/resources/color_matrix.glsl',
|
||||
'gl/resources/blur.glsl',
|
||||
'gl/resources/inset_shadow.glsl',
|
||||
'gl/resources/outset_shadow.glsl',
|
||||
'gl/resources/unblurred_outset_shadow.glsl',
|
||||
'gl/resources/cross_fade.glsl',
|
||||
'gl/resources/blend.glsl',
|
||||
'gl/resources/repeat.glsl',
|
||||
'gl/resources/custom.glsl',
|
||||
]
|
||||
|
||||
gsk_private_ngl_shaders = [
|
||||
@@ -85,6 +85,7 @@ gsk_private_sources = files([
|
||||
'ngl/gskngltexturelibrary.c',
|
||||
'ngl/gskngluniformstate.c',
|
||||
'ngl/gskngltexturepool.c',
|
||||
'ngl/fp16.c',
|
||||
])
|
||||
|
||||
gsk_public_headers = files([
|
||||
@@ -158,7 +159,7 @@ if have_vulkan
|
||||
'vulkan/gskvulkanshader.c',
|
||||
])
|
||||
|
||||
subdir('resources/vulkan')
|
||||
subdir('vulkan/resources')
|
||||
endif # have_vulkan
|
||||
|
||||
if get_variable('broadway_enabled')
|
||||
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
/* fp16.c
|
||||
*
|
||||
* Copyright 2021 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "fp16private.h"
|
||||
|
||||
#ifdef HAVE_F16C
|
||||
#include <immintrin.h>
|
||||
#endif
|
||||
|
||||
static inline guint
|
||||
as_uint (const float x)
|
||||
{
|
||||
return *(guint*)&x;
|
||||
}
|
||||
|
||||
static inline float
|
||||
as_float (const guint x)
|
||||
{
|
||||
return *(float*)&x;
|
||||
}
|
||||
|
||||
// IEEE-754 16-bit floating-point format (without infinity): 1-5-10
|
||||
|
||||
static inline float
|
||||
half_to_float (const guint16 x)
|
||||
{
|
||||
const guint e = (x&0x7C00)>>10; // exponent
|
||||
const guint m = (x&0x03FF)<<13; // mantissa
|
||||
const guint v = as_uint((float)m)>>23;
|
||||
return as_float((x&0x8000)<<16 | (e!=0)*((e+112)<<23|m) | ((e==0)&(m!=0))*((v-37)<<23|((m<<(150-v))&0x007FE000)));
|
||||
}
|
||||
|
||||
static inline guint16
|
||||
float_to_half (const float x)
|
||||
{
|
||||
const guint b = as_uint(x)+0x00001000; // round-to-nearest-even
|
||||
const guint e = (b&0x7F800000)>>23; // exponent
|
||||
const guint m = b&0x007FFFFF; // mantissa
|
||||
return (b&0x80000000)>>16 | (e>112)*((((e-112)<<10)&0x7C00)|m>>13) | ((e<113)&(e>101))*((((0x007FF000+m)>>(125-e))+1)>>1) | (e>143)*0x7FFF; // sign : normalized : denormalized : saturate
|
||||
}
|
||||
|
||||
static void
|
||||
float_to_half4_c (const float f[4],
|
||||
guint16 h[4])
|
||||
{
|
||||
h[0] = float_to_half (f[0]);
|
||||
h[1] = float_to_half (f[1]);
|
||||
h[2] = float_to_half (f[2]);
|
||||
h[3] = float_to_half (f[3]);
|
||||
}
|
||||
|
||||
static void
|
||||
half_to_float4_c (const guint16 h[4],
|
||||
float f[4])
|
||||
{
|
||||
f[0] = half_to_float (h[0]);
|
||||
f[1] = half_to_float (h[1]);
|
||||
f[2] = half_to_float (h[2]);
|
||||
f[3] = half_to_float (h[3]);
|
||||
}
|
||||
|
||||
#ifdef HAVE_F16C
|
||||
|
||||
static void
|
||||
float_to_half4_f16c (const float f[4],
|
||||
guint16 h[4])
|
||||
{
|
||||
__m128 s = _mm_loadu_ps (f);
|
||||
__m128i i = _mm_cvtps_ph (s, 0);
|
||||
_mm_storel_epi64 ((__m128i*)h, i);
|
||||
}
|
||||
|
||||
static void
|
||||
half_to_float4_f16c (const guint16 h[4],
|
||||
float f[4])
|
||||
{
|
||||
__m128i i = _mm_loadl_epi64 ((__m128i_u const *)h);
|
||||
__m128 s = _mm_cvtph_ps (i);
|
||||
_mm_store_ps (f, s);
|
||||
}
|
||||
|
||||
void float_to_half4 (const float f[4], guint16 h[4]) __attribute__((ifunc ("resolve_float_to_half4")));
|
||||
void half_to_float4 (const guint16 h[4], float f[4]) __attribute__((ifunc ("resolve_half_to_float4")));
|
||||
|
||||
static void *
|
||||
resolve_float_to_half4 (void)
|
||||
{
|
||||
__builtin_cpu_init ();
|
||||
if (__builtin_cpu_supports ("f16c"))
|
||||
return float_to_half4_f16c;
|
||||
else
|
||||
return float_to_half4_c;
|
||||
}
|
||||
|
||||
static void *
|
||||
resolve_half_to_float4 (void)
|
||||
{
|
||||
__builtin_cpu_init ();
|
||||
if (__builtin_cpu_supports ("f16c"))
|
||||
return half_to_float4_f16c;
|
||||
else
|
||||
return half_to_float4_c;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifdef __APPLE__
|
||||
// turns out aliases don't work on Darwin
|
||||
|
||||
void
|
||||
float_to_half4 (const float f[4],
|
||||
guint16 h[4])
|
||||
{
|
||||
float_to_half4_c (f, h);
|
||||
}
|
||||
|
||||
void
|
||||
half_to_float4 (const guint16 h[4],
|
||||
float f[4])
|
||||
{
|
||||
half_to_float4_c (h, f);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void float_to_half4 (const float f[4], guint16 h[4]) __attribute__((alias ("float_to_half4_c")));
|
||||
void half_to_float4 (const guint16 h[4], float f[4]) __attribute__((alias ("half_to_float4_c")));
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* GTK_HAS_F16C */
|
||||
@@ -0,0 +1,40 @@
|
||||
/* fp16private.h
|
||||
*
|
||||
* Copyright 2021 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
*/
|
||||
|
||||
#ifndef __FP16_PRIVATE_H__
|
||||
#define __FP16_PRIVATE_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define FP16_ZERO ((guint16)0)
|
||||
#define FP16_ONE ((guint16)15360)
|
||||
#define FP16_MINUS_ONE ((guint16)48128)
|
||||
|
||||
void float_to_half4 (const float f[4],
|
||||
guint16 h[4]);
|
||||
|
||||
void half_to_float4 (const guint16 h[4],
|
||||
float f[4]);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -951,6 +951,7 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue *self,
|
||||
guint n_binds = 0;
|
||||
guint n_fbos = 0;
|
||||
guint n_uniforms = 0;
|
||||
guint n_programs = 0;
|
||||
guint vao_id;
|
||||
guint vbo_id;
|
||||
int textures[4];
|
||||
@@ -1003,13 +1004,13 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue *self,
|
||||
|
||||
/* 2 = color location */
|
||||
glEnableVertexAttribArray (2);
|
||||
glVertexAttribPointer (2, 4, GL_FLOAT, GL_FALSE,
|
||||
glVertexAttribPointer (2, 4, GL_HALF_FLOAT, GL_FALSE,
|
||||
sizeof (GskNglDrawVertex),
|
||||
(void *) G_STRUCT_OFFSET (GskNglDrawVertex, color));
|
||||
|
||||
/* 3 = color2 location */
|
||||
glEnableVertexAttribArray (3);
|
||||
glVertexAttribPointer (3, 4, GL_FLOAT, GL_FALSE,
|
||||
glVertexAttribPointer (3, 4, GL_HALF_FLOAT, GL_FALSE,
|
||||
sizeof (GskNglDrawVertex),
|
||||
(void *) G_STRUCT_OFFSET (GskNglDrawVertex, color2));
|
||||
|
||||
@@ -1062,6 +1063,8 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue *self,
|
||||
{
|
||||
program = batch->any.program;
|
||||
glUseProgram (program);
|
||||
|
||||
n_programs++;
|
||||
}
|
||||
|
||||
if (apply_framebuffer (&framebuffer, batch->draw.framebuffer))
|
||||
@@ -1144,6 +1147,7 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue *self,
|
||||
gdk_profiler_set_int_counter (self->metrics.n_binds, n_binds);
|
||||
gdk_profiler_set_int_counter (self->metrics.n_uniforms, n_uniforms);
|
||||
gdk_profiler_set_int_counter (self->metrics.n_fbos, n_fbos);
|
||||
gdk_profiler_set_int_counter (self->metrics.n_programs, n_programs);
|
||||
gdk_profiler_set_int_counter (self->metrics.n_uploads, self->n_uploads);
|
||||
gdk_profiler_set_int_counter (self->metrics.queue_depth, self->batches.len);
|
||||
|
||||
@@ -1415,6 +1419,7 @@ gsk_ngl_command_queue_set_profiler (GskNglCommandQueue *self,
|
||||
self->metrics.n_fbos = gdk_profiler_define_int_counter ("fbos", "Number of framebuffers attached");
|
||||
self->metrics.n_uniforms = gdk_profiler_define_int_counter ("uniforms", "Number of uniforms changed");
|
||||
self->metrics.n_uploads = gdk_profiler_define_int_counter ("uploads", "Number of texture uploads");
|
||||
self->metrics.n_programs = gdk_profiler_define_int_counter ("programs", "Number of program changes");
|
||||
self->metrics.queue_depth = gdk_profiler_define_int_counter ("gl-queue-depth", "Depth of GL command batches");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -250,6 +250,7 @@ struct _GskNglCommandQueue
|
||||
guint n_fbos;
|
||||
guint n_uniforms;
|
||||
guint n_uploads;
|
||||
guint n_programs;
|
||||
guint queue_depth;
|
||||
} metrics;
|
||||
|
||||
|
||||
+259
-150
@@ -43,6 +43,7 @@
|
||||
#include "gsknglshadowlibraryprivate.h"
|
||||
|
||||
#include "ninesliceprivate.h"
|
||||
#include "fp16private.h"
|
||||
|
||||
#define ORTHO_NEAR_PLANE -10000
|
||||
#define ORTHO_FAR_PLANE 10000
|
||||
@@ -211,6 +212,13 @@ node_is_invisible (const GskRenderNode *node)
|
||||
node->bounds.size.height == 0.0f;
|
||||
}
|
||||
|
||||
static inline gboolean G_GNUC_PURE
|
||||
rounded_rect_equal (const GskRoundedRect *r1,
|
||||
const GskRoundedRect *r2)
|
||||
{
|
||||
return memcmp (r1, r2, sizeof (GskRoundedRect)) == 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
gsk_rounded_rect_shrink_to_minimum (GskRoundedRect *self)
|
||||
{
|
||||
@@ -810,9 +818,9 @@ interval_contains (float p1, float w1,
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
gsk_ngl_render_job_update_clip (GskNglRenderJob *job,
|
||||
const GskRenderNode *node,
|
||||
gboolean *pushed_clip)
|
||||
gsk_ngl_render_job_update_clip (GskNglRenderJob *job,
|
||||
const graphene_rect_t *bounds,
|
||||
gboolean *pushed_clip)
|
||||
{
|
||||
graphene_rect_t transformed_bounds;
|
||||
gboolean no_clip = FALSE;
|
||||
@@ -826,7 +834,7 @@ gsk_ngl_render_job_update_clip (GskNglRenderJob *job,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gsk_ngl_render_job_transform_bounds (job, &node->bounds, &transformed_bounds);
|
||||
gsk_ngl_render_job_transform_bounds (job, bounds, &transformed_bounds);
|
||||
|
||||
if (!rect_intersects (&job->current_clip->rect.bounds, &transformed_bounds))
|
||||
{
|
||||
@@ -884,6 +892,13 @@ gsk_ngl_render_job_update_clip (GskNglRenderJob *job,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
rgba_to_half (const GdkRGBA *rgba,
|
||||
guint16 h[4])
|
||||
{
|
||||
float_to_half4 ((const float *)rgba, h);
|
||||
}
|
||||
|
||||
/* fill_vertex_data */
|
||||
static void
|
||||
gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
|
||||
@@ -895,16 +910,16 @@ gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
|
||||
float min_v,
|
||||
float max_u,
|
||||
float max_v,
|
||||
const GdkRGBA *color)
|
||||
guint16 c[4])
|
||||
{
|
||||
GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { min_u, min_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { min_u, max_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { max_u, min_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { max_u, max_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { min_x, max_y }, { min_u, max_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { max_u, min_v }, { color->red, color->green, color->blue, color->alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { min_x, min_y }, .uv = { min_u, min_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { min_x, max_y }, .uv = { min_u, max_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { max_u, min_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { max_x, max_y }, .uv = { max_u, max_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { min_x, max_y }, .uv = { min_u, max_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { max_u, min_v }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
}
|
||||
|
||||
/* load_vertex_data_with_region */
|
||||
@@ -912,7 +927,7 @@ static inline void
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (GskNglRenderJob *job,
|
||||
const graphene_rect_t *bounds,
|
||||
const GskNglRenderOffscreen *offscreen,
|
||||
const GdkRGBA *color)
|
||||
guint16 color[4])
|
||||
{
|
||||
float min_x = job->offset_x + bounds->origin.x;
|
||||
float min_y = job->offset_y + bounds->origin.y;
|
||||
@@ -932,7 +947,8 @@ gsk_ngl_render_job_draw_offscreen (GskNglRenderJob *job,
|
||||
const graphene_rect_t *bounds,
|
||||
const GskNglRenderOffscreen *offscreen)
|
||||
{
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job, bounds, offscreen, &(GdkRGBA) { 0.f, 0.f, 0.f, 0.f });
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job, bounds, offscreen,
|
||||
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO });
|
||||
}
|
||||
|
||||
/* load_float_vertex_data */
|
||||
@@ -942,7 +958,7 @@ gsk_ngl_render_job_draw_with_color (GskNglRenderJob *job,
|
||||
float y,
|
||||
float width,
|
||||
float height,
|
||||
const GdkRGBA *color)
|
||||
guint16 color[4])
|
||||
{
|
||||
float min_x = job->offset_x + x;
|
||||
float min_y = job->offset_y + y;
|
||||
@@ -959,14 +975,15 @@ gsk_ngl_render_job_draw (GskNglRenderJob *job,
|
||||
float width,
|
||||
float height)
|
||||
{
|
||||
gsk_ngl_render_job_draw_with_color (job, x, y, width, height, &(GdkRGBA) { 0.f, 0.f, 0.f, 0.f });
|
||||
gsk_ngl_render_job_draw_with_color (job, x, y, width, height,
|
||||
(guint16[]) { FP_ZERO, FP_ZERO, FP_ZERO, FP_ZERO });
|
||||
}
|
||||
|
||||
/* load_vertex_data */
|
||||
static inline void
|
||||
gsk_ngl_render_job_draw_rect_with_color (GskNglRenderJob *job,
|
||||
const graphene_rect_t *bounds,
|
||||
const GdkRGBA *color)
|
||||
guint16 color[4])
|
||||
{
|
||||
gsk_ngl_render_job_draw_with_color (job,
|
||||
bounds->origin.x,
|
||||
@@ -995,11 +1012,12 @@ gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob *job,
|
||||
float min_y = job->offset_y + bounds->origin.y;
|
||||
float max_x = min_x + bounds->size.width;
|
||||
float max_y = min_y + bounds->size.height;
|
||||
guint16 color[4] = { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO };
|
||||
|
||||
gsk_ngl_render_job_draw_coords (job,
|
||||
min_x, min_y, max_x, max_y,
|
||||
0, 1, 1, 0,
|
||||
&(GdkRGBA) { 0.f, 0.f, 0.f, 0.f } );
|
||||
color);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -1253,7 +1271,7 @@ blur_offscreen (GskNglRenderJob *job,
|
||||
gsk_ngl_render_job_draw_coords (job,
|
||||
0, 0, texture_to_blur_width, texture_to_blur_height,
|
||||
0, 1, 1, 0,
|
||||
&(GdkRGBA) { 0.f, 0.f, 0.f, 0.f });
|
||||
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO });
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
|
||||
/* Bind second pass framebuffer and clear it */
|
||||
@@ -1280,7 +1298,7 @@ blur_offscreen (GskNglRenderJob *job,
|
||||
gsk_ngl_render_job_draw_coords (job,
|
||||
0, 0, texture_to_blur_width, texture_to_blur_height,
|
||||
0, 1, 1, 0,
|
||||
&(GdkRGBA) { 0.f, 0.f, 0.f, 0.f });
|
||||
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO });
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
|
||||
gsk_ngl_render_job_pop_modelview (job);
|
||||
@@ -1349,15 +1367,54 @@ blur_node (GskNglRenderJob *job,
|
||||
*max_y = job->offset_y + node->bounds.origin.y + node->bounds.size.height + half_blur_extra;
|
||||
}
|
||||
|
||||
#define ATLAS_SIZE 512
|
||||
|
||||
static inline void
|
||||
gsk_ngl_render_job_visit_color_node (GskNglRenderJob *job,
|
||||
const GskRenderNode *node)
|
||||
{
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&node->bounds,
|
||||
gsk_color_node_get_color (node));
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
guint16 color[4];
|
||||
GskNglProgram *program;
|
||||
GskNglCommandBatch *batch;
|
||||
|
||||
rgba_to_half (gsk_color_node_get_color (node), color);
|
||||
|
||||
/* Avoid switching away from the coloring program for
|
||||
* rendering a solid color.
|
||||
*/
|
||||
program = CHOOSE_PROGRAM (job, coloring);
|
||||
batch = gsk_ngl_command_queue_get_batch (job->command_queue);
|
||||
|
||||
if (batch->any.kind == GSK_NGL_COMMAND_KIND_DRAW &&
|
||||
batch->any.program == program->id)
|
||||
{
|
||||
GskNglRenderOffscreen offscreen = {0};
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, program);
|
||||
|
||||
/* The top left few pixels in our atlases are always
|
||||
* solid white, so we can use it here, without
|
||||
* having to choose any particular atlas texture.
|
||||
*/
|
||||
offscreen.was_offscreen = FALSE;
|
||||
offscreen.area.x = 1.f / ATLAS_SIZE;
|
||||
offscreen.area.y = 1.f / ATLAS_SIZE;
|
||||
offscreen.area.x2 = 2.f / ATLAS_SIZE;
|
||||
offscreen.area.y2 = 2.f / ATLAS_SIZE;
|
||||
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&node->bounds,
|
||||
&offscreen,
|
||||
color);
|
||||
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
else
|
||||
{
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
|
||||
gsk_ngl_render_job_draw_rect_with_color (job, &node->bounds, color);
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -1627,28 +1684,41 @@ gsk_ngl_render_job_visit_rect_border_node (GskNglRenderJob *job,
|
||||
const float *widths = gsk_border_node_get_widths (node);
|
||||
const graphene_point_t *origin = &node->bounds.origin;
|
||||
const graphene_size_t *size = &node->bounds.size;
|
||||
guint16 color[4];
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
|
||||
|
||||
if (widths[0] > 0)
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x, origin->y, size->width - widths[1], widths[0]),
|
||||
&colors[0]);
|
||||
{
|
||||
rgba_to_half (&colors[0], color);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x, origin->y, size->width - widths[1], widths[0]),
|
||||
color);
|
||||
}
|
||||
|
||||
if (widths[1] > 0)
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x + size->width - widths[1], origin->y, widths[1], size->height - widths[2]),
|
||||
&colors[0]);
|
||||
{
|
||||
rgba_to_half (&colors[1], color);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x + size->width - widths[1], origin->y, widths[1], size->height - widths[2]),
|
||||
color);
|
||||
}
|
||||
|
||||
if (widths[2] > 0)
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x + widths[3], origin->y + size->height - widths[2], size->width - widths[1], widths[2]),
|
||||
&colors[0]);
|
||||
{
|
||||
rgba_to_half (&colors[2], color);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x + widths[3], origin->y + size->height - widths[2], size->width - widths[1], widths[2]),
|
||||
color);
|
||||
}
|
||||
|
||||
if (widths[3] > 0)
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x, origin->y + widths[0], widths[3], size->height - widths[0]),
|
||||
&colors[0]);
|
||||
{
|
||||
rgba_to_half (&colors[3], color);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (origin->x, origin->y + widths[0], widths[3], size->height - widths[0]),
|
||||
color);
|
||||
}
|
||||
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
@@ -1658,7 +1728,7 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob *job,
|
||||
const GskRenderNode *node)
|
||||
{
|
||||
const GskRoundedRect *rounded_outline = gsk_border_node_get_outline (node);
|
||||
const GdkRGBA *c = gsk_border_node_get_colors (node);
|
||||
const GdkRGBA *colors = gsk_border_node_get_colors (node);
|
||||
const float *widths = gsk_border_node_get_widths (node);
|
||||
struct {
|
||||
float w;
|
||||
@@ -1669,6 +1739,7 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob *job,
|
||||
float max_x = min_x + node->bounds.size.width;
|
||||
float max_y = min_y + node->bounds.size.height;
|
||||
GskRoundedRect outline;
|
||||
guint16 color[4];
|
||||
|
||||
memset (sizes, 0, sizeof sizes);
|
||||
|
||||
@@ -1712,52 +1783,60 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob *job,
|
||||
{
|
||||
GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { 0, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
rgba_to_half (&colors[0], color);
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { min_x, min_y }, .uv = { 0, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { min_x + sizes[0].w, min_y + sizes[0].h }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { max_x - sizes[1].w, min_y + sizes[1].h }, .uv = { 1, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { min_x + sizes[0].w, min_y + sizes[0].h }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
}
|
||||
|
||||
if (widths[1] > 0)
|
||||
{
|
||||
GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
rgba_to_half (&colors[1], color);
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { 1, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { max_x - sizes[1].w, min_y + sizes[1].h }, .uv = { 0, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { max_x - sizes[2].w, max_y - sizes[2].h }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { max_x, max_y }, .uv = { 1, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { max_x - sizes[2].w, max_y - sizes[2].h }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { max_x, min_y }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
}
|
||||
|
||||
if (widths[2] > 0)
|
||||
{
|
||||
GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
rgba_to_half (&colors[2], color);
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { 1, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { min_x , max_y }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { min_x + sizes[3].w, max_y - sizes[3].h }, .uv = { 0, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { min_x, max_y }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { max_x - sizes[2].w, max_y - sizes[2].h }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { max_x, max_y }, .uv = { 1, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { min_x , max_y }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { max_x - sizes[2].w, max_y - sizes[2].h }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
}
|
||||
|
||||
if (widths[3] > 0)
|
||||
{
|
||||
GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { 0, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
rgba_to_half (&colors[3], color);
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { min_x, min_y }, .uv = { 0, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { min_x, max_y }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { min_x + sizes[0].w, min_y + sizes[0].h }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { min_x + sizes[3].w, max_y - sizes[3].h }, .uv = { 1, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { min_x, max_y }, .uv = { 0, 0 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { min_x + sizes[0].w, min_y + sizes[0].h }, .uv = { 1, 1 }, .color = { color[0], color[1], color[2], color[3] } };
|
||||
}
|
||||
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
@@ -1775,8 +1854,6 @@ gsk_ngl_render_job_visit_css_background (GskNglRenderJob *job,
|
||||
const GskRenderNode *node2)
|
||||
{
|
||||
const GskRenderNode *child = gsk_rounded_clip_node_get_child (node);
|
||||
const GdkRGBA *c2 = gsk_color_node_get_color (child);
|
||||
const GdkRGBA *c = gsk_border_node_get_colors (node2);
|
||||
const GskRoundedRect *rounded_outline = gsk_border_node_get_outline (node2);
|
||||
const float *widths = gsk_border_node_get_widths (node2);
|
||||
float min_x = job->offset_x + node2->bounds.origin.x;
|
||||
@@ -1785,10 +1862,15 @@ gsk_ngl_render_job_visit_css_background (GskNglRenderJob *job,
|
||||
float max_y = min_y + node2->bounds.size.height;
|
||||
GskRoundedRect outline;
|
||||
GskNglDrawVertex *vertices;
|
||||
guint16 color[4];
|
||||
guint16 color2[4];
|
||||
|
||||
if (node_is_invisible (node2))
|
||||
return;
|
||||
|
||||
rgba_to_half (&gsk_border_node_get_colors (node2)[0], color);
|
||||
rgba_to_half (gsk_color_node_get_color (child), color2);
|
||||
|
||||
gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, filled_border));
|
||||
@@ -1803,12 +1885,12 @@ gsk_ngl_render_job_visit_css_background (GskNglRenderJob *job,
|
||||
|
||||
vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
|
||||
|
||||
vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[4] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha }, { c2->red, c2->green, c2->blue, c2->alpha } };
|
||||
vertices[0] = (GskNglDrawVertex) { .position = { min_x, min_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
vertices[1] = (GskNglDrawVertex) { .position = { min_x, max_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
vertices[2] = (GskNglDrawVertex) { .position = { max_x, min_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
vertices[3] = (GskNglDrawVertex) { .position = { max_x, max_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
vertices[4] = (GskNglDrawVertex) { .position = { min_x, max_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
vertices[5] = (GskNglDrawVertex) { .position = { max_x, min_y }, .color = { color[0], color[1], color[2], color[3] }, .color2 = { color2[0], color2[1], color2[2], color2[3] } };
|
||||
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
@@ -1933,6 +2015,7 @@ gsk_ngl_render_job_visit_unblurred_inset_shadow_node (GskNglRenderJob *job,
|
||||
{
|
||||
const GskRoundedRect *outline = gsk_inset_shadow_node_get_outline (node);
|
||||
GskRoundedRect transformed_outline;
|
||||
guint16 color[4];
|
||||
|
||||
gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
|
||||
|
||||
@@ -1947,7 +2030,8 @@ gsk_ngl_render_job_visit_unblurred_inset_shadow_node (GskNglRenderJob *job,
|
||||
UNIFORM_INSET_SHADOW_OFFSET, 0,
|
||||
gsk_inset_shadow_node_get_dx (node),
|
||||
gsk_inset_shadow_node_get_dy (node));
|
||||
gsk_ngl_render_job_draw_rect_with_color (job, &node->bounds, gsk_inset_shadow_node_get_color (node));
|
||||
rgba_to_half (gsk_inset_shadow_node_get_color (node), color);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job, &node->bounds, color);
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
|
||||
@@ -1968,6 +2052,7 @@ gsk_ngl_render_job_visit_blurred_inset_shadow_node (GskNglRenderJob *job,
|
||||
int blurred_texture_id;
|
||||
GskTextureKey key;
|
||||
GskNglRenderOffscreen offscreen = {0};
|
||||
guint16 color[4];
|
||||
|
||||
g_assert (blur_radius > 0);
|
||||
|
||||
@@ -2047,9 +2132,10 @@ gsk_ngl_render_job_visit_blurred_inset_shadow_node (GskNglRenderJob *job,
|
||||
UNIFORM_INSET_SHADOW_OFFSET, 0,
|
||||
offset_x * scale_x,
|
||||
offset_y * scale_y);
|
||||
rgba_to_half (gsk_inset_shadow_node_get_color (node), color);
|
||||
gsk_ngl_render_job_draw_with_color (job,
|
||||
0, 0, texture_width, texture_height,
|
||||
gsk_inset_shadow_node_get_color (node));
|
||||
color);
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
|
||||
gsk_ngl_render_job_pop_modelview (job);
|
||||
@@ -2132,7 +2218,7 @@ gsk_ngl_render_job_visit_unblurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
float spread = gsk_outset_shadow_node_get_spread (node);
|
||||
float dx = gsk_outset_shadow_node_get_dx (node);
|
||||
float dy = gsk_outset_shadow_node_get_dy (node);
|
||||
const GdkRGBA *color = gsk_outset_shadow_node_get_color (node);
|
||||
guint16 color[4];
|
||||
const float edge_sizes[] = { // Top, right, bottom, left
|
||||
spread - dy, spread + dx, spread + dy, spread - dx
|
||||
};
|
||||
@@ -2143,6 +2229,8 @@ gsk_ngl_render_job_visit_unblurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
{ outline->corner[3].width + spread - dx, outline->corner[3].height + spread + dy },
|
||||
};
|
||||
|
||||
rgba_to_half (gsk_outset_shadow_node_get_color (node), color);
|
||||
|
||||
gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, unblurred_outset_shadow));
|
||||
@@ -2205,16 +2293,14 @@ static inline void
|
||||
gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
const GskRenderNode *node)
|
||||
{
|
||||
static const GdkRGBA white = { 1, 1, 1, 1 };
|
||||
|
||||
const GskRoundedRect *outline = gsk_outset_shadow_node_get_outline (node);
|
||||
const GdkRGBA *color = gsk_outset_shadow_node_get_color (node);
|
||||
float scale_x = job->scale_x;
|
||||
float scale_y = job->scale_y;
|
||||
float blur_radius = gsk_outset_shadow_node_get_blur_radius (node);
|
||||
float blur_extra = blur_radius * 2.0f; /* 2.0 = shader radius_multiplier */
|
||||
float half_blur_extra = blur_extra / 2.0f;
|
||||
int extra_blur_pixels = ceilf (half_blur_extra * scale_x);
|
||||
int extra_blur_pixels_x = ceilf (half_blur_extra * scale_x);
|
||||
int extra_blur_pixels_y = ceilf (half_blur_extra * scale_y);
|
||||
float spread = gsk_outset_shadow_node_get_spread (node);
|
||||
float dx = gsk_outset_shadow_node_get_dx (node);
|
||||
float dy = gsk_outset_shadow_node_get_dy (node);
|
||||
@@ -2225,13 +2311,26 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
int blurred_texture_id;
|
||||
int cached_tid;
|
||||
gboolean do_slicing;
|
||||
guint16 color[4];
|
||||
float half_width = outline->bounds.size.width / 2;
|
||||
float half_height = outline->bounds.size.height / 2;
|
||||
|
||||
rgba_to_half (gsk_outset_shadow_node_get_color (node), color);
|
||||
|
||||
/* scaled_outline is the minimal outline we need to draw the given drop shadow,
|
||||
* enlarged by the spread and offset by the blur radius. */
|
||||
scaled_outline = *outline;
|
||||
|
||||
if (outline->bounds.size.width < blur_extra ||
|
||||
outline->bounds.size.height < blur_extra)
|
||||
outline->bounds.size.height < blur_extra ||
|
||||
outline->corner[0].width >= half_width ||
|
||||
outline->corner[1].width >= half_width ||
|
||||
outline->corner[2].width >= half_width ||
|
||||
outline->corner[3].width >= half_width ||
|
||||
outline->corner[0].height >= half_height ||
|
||||
outline->corner[1].height >= half_height ||
|
||||
outline->corner[2].height >= half_height ||
|
||||
outline->corner[3].height >= half_height)
|
||||
{
|
||||
do_slicing = FALSE;
|
||||
gsk_rounded_rect_shrink (&scaled_outline, -spread, -spread, -spread, -spread);
|
||||
@@ -2254,10 +2353,10 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
texture_width = (int)ceil ((scaled_outline.bounds.size.width + blur_extra) * scale_x);
|
||||
texture_height = (int)ceil ((scaled_outline.bounds.size.height + blur_extra) * scale_y);
|
||||
|
||||
scaled_outline.bounds.origin.x = extra_blur_pixels;
|
||||
scaled_outline.bounds.origin.y = extra_blur_pixels;
|
||||
scaled_outline.bounds.size.width = texture_width - (extra_blur_pixels * 2);
|
||||
scaled_outline.bounds.size.height = texture_height - (extra_blur_pixels * 2);
|
||||
scaled_outline.bounds.origin.x = extra_blur_pixels_x;
|
||||
scaled_outline.bounds.origin.y = extra_blur_pixels_y;
|
||||
scaled_outline.bounds.size.width = texture_width - (extra_blur_pixels_x * 2);
|
||||
scaled_outline.bounds.size.height = texture_height - (extra_blur_pixels_y * 2);
|
||||
|
||||
for (guint i = 0; i < G_N_ELEMENTS (scaled_outline.corner); i++)
|
||||
{
|
||||
@@ -2306,7 +2405,8 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
|
||||
/* Draw the outline using color program */
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
|
||||
gsk_ngl_render_job_draw_with_color (job, 0, 0, texture_width, texture_height, &white);
|
||||
gsk_ngl_render_job_draw_with_color (job, 0, 0, texture_width, texture_height,
|
||||
(guint16[]){ FP16_ONE, FP16_ONE, FP16_ONE, FP16_ONE });
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
|
||||
/* Reset state from offscreen */
|
||||
@@ -2344,7 +2444,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
float min_x = floorf (outline->bounds.origin.x - spread - half_blur_extra + dx);
|
||||
float min_y = floorf (outline->bounds.origin.y - spread - half_blur_extra + dy);
|
||||
|
||||
offscreen.was_offscreen = FALSE;
|
||||
offscreen.was_offscreen = TRUE;
|
||||
offscreen.texture_id = blurred_texture_id;
|
||||
init_full_texture_region (&offscreen);
|
||||
|
||||
@@ -2369,6 +2469,8 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
return;
|
||||
}
|
||||
|
||||
/* slicing */
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
|
||||
gsk_ngl_program_set_uniform_texture (job->current_program,
|
||||
UNIFORM_SHARED_SOURCE, 0,
|
||||
@@ -2387,24 +2489,36 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
float max_y = ceilf (outline->bounds.origin.y + outline->bounds.size.height +
|
||||
half_blur_extra + dy + spread);
|
||||
const GskNglTextureNineSlice *slices;
|
||||
float left_width, center_width, right_width;
|
||||
float top_height, center_height, bottom_height;
|
||||
GskNglTexture *texture;
|
||||
|
||||
texture = gsk_ngl_driver_get_texture_by_id (job->driver, blurred_texture_id);
|
||||
slices = gsk_ngl_texture_get_nine_slice (texture, &scaled_outline, extra_blur_pixels);
|
||||
slices = gsk_ngl_texture_get_nine_slice (texture, &scaled_outline, extra_blur_pixels_x, extra_blur_pixels_y);
|
||||
|
||||
offscreen.was_offscreen = TRUE;
|
||||
|
||||
/* Our texture coordinates MUST be scaled, while the actual vertex coords
|
||||
* MUST NOT be scaled. */
|
||||
* MUST NOT be scaled.
|
||||
*/
|
||||
|
||||
left_width = slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x;
|
||||
right_width = slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x;
|
||||
center_width = (max_x - min_x) - (left_width + right_width);
|
||||
|
||||
top_height = slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y;
|
||||
bottom_height = slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y;
|
||||
center_height = (max_y - min_y) - (top_height + bottom_height);
|
||||
|
||||
/* Top left */
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_TOP_LEFT]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_LEFT].area, sizeof offscreen.area);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x, min_y,
|
||||
slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x,
|
||||
slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
|
||||
&GRAPHENE_RECT_INIT (min_x,
|
||||
min_y,
|
||||
left_width,
|
||||
top_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2413,13 +2527,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_TOP_CENTER]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_CENTER].area, sizeof offscreen.area);
|
||||
float width = (max_x - min_x) - (slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x +
|
||||
slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x + (slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x),
|
||||
&GRAPHENE_RECT_INIT (min_x + left_width,
|
||||
min_y,
|
||||
width,
|
||||
slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y),
|
||||
center_width,
|
||||
top_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2429,10 +2541,10 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_RIGHT].area, sizeof offscreen.area);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (max_x - (slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x),
|
||||
&GRAPHENE_RECT_INIT (max_x - right_width,
|
||||
min_y,
|
||||
slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x,
|
||||
slices[NINE_SLICE_TOP_RIGHT].rect.height / scale_y),
|
||||
right_width,
|
||||
top_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2442,10 +2554,10 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_RIGHT].area, sizeof offscreen.area);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x),
|
||||
max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y),
|
||||
slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x,
|
||||
slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y),
|
||||
&GRAPHENE_RECT_INIT (max_x - right_width,
|
||||
max_y - bottom_height,
|
||||
right_width,
|
||||
bottom_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2456,9 +2568,9 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_LEFT].area, sizeof offscreen.area);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x,
|
||||
max_y - (slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y),
|
||||
slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x,
|
||||
slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y),
|
||||
max_y - bottom_height,
|
||||
left_width,
|
||||
bottom_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2467,13 +2579,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_LEFT_CENTER]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_LEFT_CENTER].area, sizeof offscreen.area);
|
||||
float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y +
|
||||
slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x,
|
||||
min_y + (slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
|
||||
slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x,
|
||||
height),
|
||||
min_y + top_height,
|
||||
left_width,
|
||||
center_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2482,13 +2592,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_RIGHT_CENTER]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_RIGHT_CENTER].area, sizeof offscreen.area);
|
||||
float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_RIGHT].rect.height / scale_y +
|
||||
slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (max_x - (slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x),
|
||||
min_y + (slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
|
||||
slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x,
|
||||
height),
|
||||
&GRAPHENE_RECT_INIT (max_x - right_width,
|
||||
min_y + top_height,
|
||||
right_width,
|
||||
center_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2497,13 +2605,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_BOTTOM_CENTER]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_CENTER].area, sizeof offscreen.area);
|
||||
float width = (max_x - min_x) - (slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x +
|
||||
slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x + (slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x),
|
||||
max_y - (slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y),
|
||||
width,
|
||||
slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y),
|
||||
&GRAPHENE_RECT_INIT (min_x + left_width,
|
||||
max_y - bottom_height,
|
||||
center_width,
|
||||
bottom_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
@@ -2511,17 +2617,20 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
|
||||
/* Middle */
|
||||
if (nine_slice_is_visible (&slices[NINE_SLICE_CENTER]))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_CENTER].area, sizeof offscreen.area);
|
||||
float width = (max_x - min_x) - (slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x +
|
||||
slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x);
|
||||
float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y +
|
||||
slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x + (slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x),
|
||||
min_y + (slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y),
|
||||
width, height),
|
||||
&offscreen,
|
||||
color);
|
||||
if (!gsk_rounded_rect_contains_rect (outline, &GRAPHENE_RECT_INIT (min_x + left_width,
|
||||
min_y + top_height,
|
||||
center_width,
|
||||
center_height)))
|
||||
{
|
||||
memcpy (&offscreen.area, &slices[NINE_SLICE_CENTER].area, sizeof offscreen.area);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job,
|
||||
&GRAPHENE_RECT_INIT (min_x + left_width,
|
||||
min_y + top_height,
|
||||
center_width,
|
||||
center_height),
|
||||
&offscreen,
|
||||
color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2690,7 +2799,7 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob *job,
|
||||
guint last_texture = 0;
|
||||
GskNglDrawVertex *vertices;
|
||||
guint used = 0;
|
||||
GdkRGBA c;
|
||||
guint16 c[4] = { FP16_MINUS_ONE, FP16_MINUS_ONE, FP16_MINUS_ONE, FP16_MINUS_ONE };
|
||||
const PangoGlyphInfo *gi;
|
||||
guint i;
|
||||
int yshift;
|
||||
@@ -2702,10 +2811,8 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob *job,
|
||||
/* If the font has color glyphs, we don't need to recolor anything.
|
||||
* We tell the shader by setting the color to vec4(-1).
|
||||
*/
|
||||
if (!force_color && gsk_text_node_has_color_glyphs (node))
|
||||
c = (GdkRGBA) { -1.f, -1.f, -1.f, -1.f };
|
||||
else
|
||||
c = *color;
|
||||
if (force_color || !gsk_text_node_has_color_glyphs (node))
|
||||
rgba_to_half (color, c);
|
||||
|
||||
lookup.font = (PangoFont *)font;
|
||||
lookup.scale = (guint) (text_scale * 1024);
|
||||
@@ -2783,13 +2890,13 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob *job,
|
||||
glyph_x2 = glyph_x + glyph->ink_rect.width;
|
||||
glyph_y2 = glyph_y + glyph->ink_rect.height;
|
||||
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x, glyph_y }, { tx, ty }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x, glyph_y2 }, { tx, ty2 }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x2, glyph_y }, { tx2, ty }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x, glyph_y }, .uv = { tx, ty }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x, glyph_y2 }, .uv = { tx, ty2 }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x2, glyph_y }, .uv = { tx2, ty }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x2, glyph_y2 }, { tx2, ty2 }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x, glyph_y2 }, { tx, ty2 }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { { glyph_x2, glyph_y }, { tx2, ty }, { c.red, c.green, c.blue, c.alpha } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x2, glyph_y2 }, .uv = { tx2, ty2 }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x, glyph_y2 }, .uv = { tx, ty2 }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
*(vertices++) = (GskNglDrawVertex) { .position = { glyph_x2, glyph_y }, .uv = { tx2, ty }, .color = { c[0], c[1], c[2], c[3] } };
|
||||
|
||||
batch->draw.vbo_count += GSK_NGL_N_VERTICES;
|
||||
used++;
|
||||
@@ -2822,6 +2929,7 @@ gsk_ngl_render_job_visit_shadow_node (GskNglRenderJob *job,
|
||||
const float dy = shadow->dy;
|
||||
GskNglRenderOffscreen offscreen = {0};
|
||||
graphene_rect_t bounds;
|
||||
guint16 color[4];
|
||||
|
||||
if (shadow->radius == 0 &&
|
||||
gsk_render_node_get_node_type (shadow_child) == GSK_TEXT_NODE)
|
||||
@@ -2884,7 +2992,8 @@ gsk_ngl_render_job_visit_shadow_node (GskNglRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job, &bounds, &offscreen, &shadow->color);
|
||||
rgba_to_half (&shadow->color, color);
|
||||
gsk_ngl_render_job_draw_offscreen_with_color (job, &bounds, &offscreen, color);
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
gsk_ngl_render_job_offset (job, -dx, -dy);
|
||||
}
|
||||
@@ -2941,7 +3050,7 @@ gsk_ngl_render_job_visit_blur_node (GskNglRenderJob *job,
|
||||
gsk_ngl_render_job_draw_coords (job,
|
||||
min_x, min_y, max_x, max_y,
|
||||
0, 1, 1, 0,
|
||||
&(GdkRGBA) { 0.f, 0.f, 0.f, 0.f } );
|
||||
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO } );
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
|
||||
@@ -3047,10 +3156,10 @@ static inline void
|
||||
gsk_ngl_render_job_visit_gl_shader_node_fallback (GskNglRenderJob *job,
|
||||
const GskRenderNode *node)
|
||||
{
|
||||
static const GdkRGBA pink = { 255 / 255., 105 / 255., 180 / 255., 1.0 };
|
||||
guint16 pink[4] = { 15360, 13975, 14758, 15360 }; /* 255 105 180 */
|
||||
|
||||
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
|
||||
gsk_ngl_render_job_draw_rect_with_color (job, &node->bounds, &pink);
|
||||
gsk_ngl_render_job_draw_rect_with_color (job, &node->bounds, pink);
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
}
|
||||
|
||||
@@ -3256,7 +3365,7 @@ gsk_ngl_render_job_visit_texture_node (GskNglRenderJob *job,
|
||||
gsk_ngl_render_job_draw_coords (job,
|
||||
x1, y1, x2, y2,
|
||||
0, 0, 1, 1,
|
||||
&(GdkRGBA) { 0.f, 0.f, 0.f, 0.f });
|
||||
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO });
|
||||
}
|
||||
|
||||
gsk_ngl_render_job_end_draw (job);
|
||||
@@ -3332,7 +3441,7 @@ gsk_ngl_render_job_visit_node (GskNglRenderJob *job,
|
||||
if (node_is_invisible (node))
|
||||
return;
|
||||
|
||||
if (!gsk_ngl_render_job_update_clip (job, node, &has_clip))
|
||||
if (!gsk_ngl_render_job_update_clip (job, &node->bounds, &has_clip))
|
||||
return;
|
||||
|
||||
switch (gsk_render_node_get_node_type (node))
|
||||
@@ -3392,8 +3501,8 @@ gsk_ngl_render_job_visit_node (GskNglRenderJob *job,
|
||||
if (gsk_render_node_get_node_type (grandchild) == GSK_COLOR_NODE &&
|
||||
gsk_render_node_get_node_type (child2) == GSK_BORDER_NODE &&
|
||||
gsk_border_node_get_uniform_color (child2) &&
|
||||
gsk_rounded_rect_equal (gsk_rounded_clip_node_get_clip (child),
|
||||
gsk_border_node_get_outline (child2)))
|
||||
rounded_rect_equal (gsk_rounded_clip_node_get_clip (child),
|
||||
gsk_border_node_get_outline (child2)))
|
||||
{
|
||||
gsk_ngl_render_job_visit_css_background (job, child, child2);
|
||||
i++; /* skip the border node */
|
||||
|
||||
@@ -202,6 +202,31 @@ gsk_ngl_shadow_library_lookup (GskNglShadowLibrary *self,
|
||||
return ret->texture_id;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
write_shadow_to_png (const Shadow *shadow)
|
||||
{
|
||||
int width = shadow->outline.bounds.size.width + (shadow->outline.bounds.origin.x * 2);
|
||||
int height = shadow->outline.bounds.size.height + (shadow->outline.bounds.origin.y * 2);
|
||||
int stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, width);
|
||||
guchar *data = g_malloc (height * stride);
|
||||
cairo_surface_t *s;
|
||||
char *filename = g_strdup_printf ("shadow_cache_%d_%d_%d.png",
|
||||
width, height, shadow->texture_id);
|
||||
|
||||
glBindTexture (GL_TEXTURE_2D, shadow->texture_id);
|
||||
glGetTexImage (GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
|
||||
s = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32,
|
||||
width, height,
|
||||
stride);
|
||||
cairo_surface_write_to_png (s, filename);
|
||||
|
||||
cairo_surface_destroy (s);
|
||||
g_free (data);
|
||||
g_free (filename);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
gsk_ngl_shadow_library_begin_frame (GskNglShadowLibrary *self)
|
||||
{
|
||||
@@ -211,6 +236,14 @@ gsk_ngl_shadow_library_begin_frame (GskNglShadowLibrary *self)
|
||||
|
||||
g_return_if_fail (GSK_IS_NGL_SHADOW_LIBRARY (self));
|
||||
|
||||
#if 0
|
||||
for (i = 0, p = self->shadows->len; i < p; i++)
|
||||
{
|
||||
const Shadow *shadow = &g_array_index (self->shadows, Shadow, i);
|
||||
write_shadow_to_png (shadow);
|
||||
}
|
||||
#endif
|
||||
|
||||
watermark = self->driver->current_frame_id - MAX_UNUSED_FRAMES;
|
||||
|
||||
for (i = 0, p = self->shadows->len; i < p; i++)
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <gdk/gdkglcontextprivate.h>
|
||||
#include <gsk/gskdebugprivate.h>
|
||||
|
||||
#include "gsknglcommandqueueprivate.h"
|
||||
@@ -239,6 +240,51 @@ gsk_ngl_texture_atlas_pack (GskNglTextureAtlas *self,
|
||||
return rect.was_packed;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_ngl_texture_atlas_initialize (GskNglDriver *driver,
|
||||
GskNglTextureAtlas *atlas)
|
||||
{
|
||||
/* Insert a single pixel at 0,0 for use in coloring */
|
||||
|
||||
gboolean packed G_GNUC_UNUSED;
|
||||
int x, y;
|
||||
guint gl_format;
|
||||
guint gl_type;
|
||||
guint8 pixel_data[4 * 3 * 3];
|
||||
|
||||
gdk_gl_context_push_debug_group_printf (gdk_gl_context_get_current (),
|
||||
"Initializing Atlas");
|
||||
|
||||
packed = gsk_ngl_texture_atlas_pack (atlas, 3, 3, &x, &y);
|
||||
g_assert (packed);
|
||||
g_assert (x == 0 && y == 0);
|
||||
|
||||
memset (pixel_data, 255, sizeof pixel_data);
|
||||
|
||||
if (gdk_gl_context_get_use_es (gdk_gl_context_get_current ()))
|
||||
{
|
||||
gl_format = GL_RGBA;
|
||||
gl_type = GL_UNSIGNED_BYTE;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_format = GL_BGRA;
|
||||
gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||
}
|
||||
|
||||
glBindTexture (GL_TEXTURE_2D, atlas->texture_id);
|
||||
|
||||
glTexSubImage2D (GL_TEXTURE_2D, 0,
|
||||
0, 0,
|
||||
3, 3,
|
||||
gl_format, gl_type,
|
||||
pixel_data);
|
||||
|
||||
gdk_gl_context_pop_debug_group (gdk_gl_context_get_current ());
|
||||
|
||||
driver->command_queue->n_uploads++;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_ngl_texture_atlases_pack (GskNglDriver *driver,
|
||||
int width,
|
||||
@@ -265,6 +311,8 @@ gsk_ngl_texture_atlases_pack (GskNglDriver *driver,
|
||||
/* No atlas has enough space, so create a new one... */
|
||||
atlas = gsk_ngl_driver_create_atlas (driver);
|
||||
|
||||
gsk_ngl_texture_atlas_initialize (driver, atlas);
|
||||
|
||||
/* Pack it onto that one, which surely has enough space... */
|
||||
if (!gsk_ngl_texture_atlas_pack (atlas, width, height, &x, &y))
|
||||
g_assert_not_reached ();
|
||||
|
||||
@@ -170,7 +170,8 @@ gsk_ngl_texture_new (guint texture_id,
|
||||
const GskNglTextureNineSlice *
|
||||
gsk_ngl_texture_get_nine_slice (GskNglTexture *texture,
|
||||
const GskRoundedRect *outline,
|
||||
float extra_pixels)
|
||||
float extra_pixels_x,
|
||||
float extra_pixels_y)
|
||||
{
|
||||
g_assert (texture != NULL);
|
||||
g_assert (outline != NULL);
|
||||
@@ -180,7 +181,7 @@ gsk_ngl_texture_get_nine_slice (GskNglTexture *texture,
|
||||
texture->nine_slice = g_new0 (GskNglTextureNineSlice, 9);
|
||||
|
||||
nine_slice_rounded_rect (texture->nine_slice, outline);
|
||||
nine_slice_grow (texture->nine_slice, extra_pixels);
|
||||
nine_slice_grow (texture->nine_slice, extra_pixels_x, extra_pixels_y);
|
||||
nine_slice_to_texture_coords (texture->nine_slice, texture->width, texture->height);
|
||||
}
|
||||
|
||||
|
||||
@@ -94,7 +94,8 @@ GskNglTexture *gsk_ngl_texture_new (guint
|
||||
gint64 frame_id);
|
||||
const GskNglTextureNineSlice *gsk_ngl_texture_get_nine_slice (GskNglTexture *texture,
|
||||
const GskRoundedRect *outline,
|
||||
float extra_pixels);
|
||||
float extra_pixels_x,
|
||||
float extra_pixels_y);
|
||||
void gsk_ngl_texture_free (GskNglTexture *texture);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -54,9 +54,11 @@ typedef struct _GskNglDriver GskNglDriver;
|
||||
struct _GskNglDrawVertex
|
||||
{
|
||||
float position[2];
|
||||
float uv[2];
|
||||
float color[4];
|
||||
float color2[4];
|
||||
union {
|
||||
float uv[2];
|
||||
guint16 color2[4];
|
||||
};
|
||||
guint16 color[4];
|
||||
};
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -215,17 +215,7 @@ gsk_ngl_uniform_state_end_frame (GskNglUniformState *state)
|
||||
|
||||
state->values_pos = allocator;
|
||||
|
||||
/* It can happen that our space requirements grow due to
|
||||
* difference in order increasing padding. As a pragmatic
|
||||
* solution to this, just increase the allocation to cover
|
||||
* the predefined mappins.
|
||||
*/
|
||||
if (allocator > state->values_len)
|
||||
{
|
||||
while (allocator > state->values_len)
|
||||
state->values_len *= 2;
|
||||
state->values_buf = g_realloc (state->values_buf, state->values_len);
|
||||
}
|
||||
g_assert (allocator <= state->values_len);
|
||||
|
||||
memset (state->apply_hash, 0, sizeof state->apply_hash);
|
||||
}
|
||||
|
||||
+51
-50
@@ -159,121 +159,122 @@ nine_slice_to_texture_coords (GskNglTextureNineSlice *slices,
|
||||
|
||||
static inline void
|
||||
nine_slice_grow (GskNglTextureNineSlice *slices,
|
||||
int amount)
|
||||
int amount_x,
|
||||
int amount_y)
|
||||
{
|
||||
if (amount == 0)
|
||||
if (amount_x == 0 && amount_y == 0)
|
||||
return;
|
||||
|
||||
/* top left */
|
||||
slices[0].rect.x -= amount;
|
||||
slices[0].rect.y -= amount;
|
||||
if (amount > slices[0].rect.width)
|
||||
slices[0].rect.width += amount * 2;
|
||||
slices[0].rect.x -= amount_x;
|
||||
slices[0].rect.y -= amount_y;
|
||||
if (amount_x > slices[0].rect.width)
|
||||
slices[0].rect.width += amount_x * 2;
|
||||
else
|
||||
slices[0].rect.width += amount;
|
||||
slices[0].rect.width += amount_x;
|
||||
|
||||
if (amount > slices[0].rect.height)
|
||||
slices[0].rect.height += amount * 2;
|
||||
if (amount_y > slices[0].rect.height)
|
||||
slices[0].rect.height += amount_y * 2;
|
||||
else
|
||||
slices[0].rect.height += amount;
|
||||
slices[0].rect.height += amount_y;
|
||||
|
||||
|
||||
/* Top center */
|
||||
slices[1].rect.y -= amount;
|
||||
if (amount > slices[1].rect.height)
|
||||
slices[1].rect.height += amount * 2;
|
||||
slices[1].rect.y -= amount_y;
|
||||
if (amount_y > slices[1].rect.height)
|
||||
slices[1].rect.height += amount_y * 2;
|
||||
else
|
||||
slices[1].rect.height += amount;
|
||||
slices[1].rect.height += amount_y;
|
||||
|
||||
/* top right */
|
||||
slices[2].rect.y -= amount;
|
||||
if (amount > slices[2].rect.width)
|
||||
slices[2].rect.y -= amount_y;
|
||||
if (amount_x > slices[2].rect.width)
|
||||
{
|
||||
slices[2].rect.x -= amount;
|
||||
slices[2].rect.width += amount * 2;
|
||||
slices[2].rect.x -= amount_x;
|
||||
slices[2].rect.width += amount_x * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[2].rect.width += amount;
|
||||
slices[2].rect.width += amount_x;
|
||||
}
|
||||
|
||||
if (amount > slices[2].rect.height)
|
||||
slices[2].rect.height += amount * 2;
|
||||
if (amount_y > slices[2].rect.height)
|
||||
slices[2].rect.height += amount_y * 2;
|
||||
else
|
||||
slices[2].rect.height += amount;
|
||||
slices[2].rect.height += amount_y;
|
||||
|
||||
|
||||
|
||||
slices[3].rect.x -= amount;
|
||||
if (amount > slices[3].rect.width)
|
||||
slices[3].rect.width += amount * 2;
|
||||
slices[3].rect.x -= amount_x;
|
||||
if (amount_x > slices[3].rect.width)
|
||||
slices[3].rect.width += amount_x * 2;
|
||||
else
|
||||
slices[3].rect.width += amount;
|
||||
slices[3].rect.width += amount_x;
|
||||
|
||||
/* Leave center alone */
|
||||
|
||||
if (amount > slices[5].rect.width)
|
||||
if (amount_x > slices[5].rect.width)
|
||||
{
|
||||
slices[5].rect.x -= amount;
|
||||
slices[5].rect.width += amount * 2;
|
||||
slices[5].rect.x -= amount_x;
|
||||
slices[5].rect.width += amount_x * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[5].rect.width += amount;
|
||||
slices[5].rect.width += amount_x;
|
||||
}
|
||||
|
||||
|
||||
/* Bottom left */
|
||||
slices[6].rect.x -= amount;
|
||||
if (amount > slices[6].rect.width)
|
||||
slices[6].rect.x -= amount_x;
|
||||
if (amount_x > slices[6].rect.width)
|
||||
{
|
||||
slices[6].rect.width += amount * 2;
|
||||
slices[6].rect.width += amount_x * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[6].rect.width += amount;
|
||||
slices[6].rect.width += amount_x;
|
||||
}
|
||||
|
||||
if (amount > slices[6].rect.height)
|
||||
if (amount_y > slices[6].rect.height)
|
||||
{
|
||||
slices[6].rect.y -= amount;
|
||||
slices[6].rect.height += amount * 2;
|
||||
slices[6].rect.y -= amount_y;
|
||||
slices[6].rect.height += amount_y * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[6].rect.height += amount;
|
||||
slices[6].rect.height += amount_y;
|
||||
}
|
||||
|
||||
|
||||
/* Bottom center */
|
||||
if (amount > slices[7].rect.height)
|
||||
if (amount_y > slices[7].rect.height)
|
||||
{
|
||||
slices[7].rect.y -= amount;
|
||||
slices[7].rect.height += amount * 2;
|
||||
slices[7].rect.y -= amount_y;
|
||||
slices[7].rect.height += amount_y * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[7].rect.height += amount;
|
||||
slices[7].rect.height += amount_y;
|
||||
}
|
||||
|
||||
if (amount > slices[8].rect.width)
|
||||
if (amount_x > slices[8].rect.width)
|
||||
{
|
||||
slices[8].rect.x -= amount;
|
||||
slices[8].rect.width += amount * 2;
|
||||
slices[8].rect.x -= amount_x;
|
||||
slices[8].rect.width += amount_x * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[8].rect.width += amount;
|
||||
slices[8].rect.width += amount_x;
|
||||
}
|
||||
|
||||
if (amount > slices[8].rect.height)
|
||||
if (amount_y > slices[8].rect.height)
|
||||
{
|
||||
slices[8].rect.y -= amount;
|
||||
slices[8].rect.height += amount * 2;
|
||||
slices[8].rect.y -= amount_y;
|
||||
slices[8].rect.height += amount_y * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
slices[8].rect.height += amount;
|
||||
slices[8].rect.height += amount_y;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_NINE_SLICE
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user