Compare commits
1 Commits
rendering-
...
x11-shadow
Author | SHA1 | Date | |
---|---|---|---|
|
b1cf09f112 |
@@ -117,11 +117,10 @@ release-build:
|
|||||||
EXTRA_MESON_FLAGS: "--buildtype=release"
|
EXTRA_MESON_FLAGS: "--buildtype=release"
|
||||||
script:
|
script:
|
||||||
- .gitlab-ci/show-info-linux.sh
|
- .gitlab-ci/show-info-linux.sh
|
||||||
- mkdir _install
|
- export PATH="$HOME/.local/bin:$PATH"
|
||||||
- export PATH="$HOME/.local/bin:${CI_PROJECT_DIR}/_install/bin:$PATH"
|
|
||||||
- .gitlab-ci/install-meson-project.sh --prefix ${CI_PROJECT_DIR}/_install https://gitlab.gnome.org/jadahl/catch.git main
|
|
||||||
- meson subprojects download
|
- meson subprojects download
|
||||||
- meson subprojects update --reset
|
- meson subprojects update --reset
|
||||||
|
- mkdir _install
|
||||||
- meson setup
|
- meson setup
|
||||||
--prefix=${CI_PROJECT_DIR}/_install
|
--prefix=${CI_PROJECT_DIR}/_install
|
||||||
${COMMON_MESON_FLAGS}
|
${COMMON_MESON_FLAGS}
|
||||||
@@ -446,10 +445,10 @@ reference:
|
|||||||
--force-fallback-for=gdk-pixbuf,pango
|
--force-fallback-for=gdk-pixbuf,pango
|
||||||
-Dintrospection=enabled
|
-Dintrospection=enabled
|
||||||
-Ddocumentation=true
|
-Ddocumentation=true
|
||||||
-Dman-pages=true
|
-Dgtk_doc=true
|
||||||
-Dgdk-pixbuf:gtk_doc=true
|
-Dgdk-pixbuf:gtk_doc=true
|
||||||
-Dpango:documentation=true
|
-Dpango:gtk_doc=true
|
||||||
-Dbuild-demos=true
|
-Dbuild-demos=false
|
||||||
-Dbuild-examples=false
|
-Dbuild-examples=false
|
||||||
-Dbuild-tests=false
|
-Dbuild-tests=false
|
||||||
-Dbuild-testsuite=false
|
-Dbuild-testsuite=false
|
||||||
@@ -461,7 +460,6 @@ reference:
|
|||||||
- mv _build/docs/reference/gdk/gdk4-wayland/ _reference/gdk4-wayland/
|
- mv _build/docs/reference/gdk/gdk4-wayland/ _reference/gdk4-wayland/
|
||||||
- mv _build/docs/reference/gsk/gsk4/ _reference/gsk4/
|
- mv _build/docs/reference/gsk/gsk4/ _reference/gsk4/
|
||||||
- mv _build/docs/reference/gtk/gtk4/ _reference/gtk4/
|
- mv _build/docs/reference/gtk/gtk4/ _reference/gtk4/
|
||||||
- mv _build/docs/reference/gtk/*.html _reference/gtk4/
|
|
||||||
- mv _build/subprojects/pango/docs/Pango/ _reference/Pango/
|
- mv _build/subprojects/pango/docs/Pango/ _reference/Pango/
|
||||||
- mv _build/subprojects/pango/docs/PangoCairo/ _reference/PangoCairo/
|
- mv _build/subprojects/pango/docs/PangoCairo/ _reference/PangoCairo/
|
||||||
- mv _build/subprojects/pango/docs/PangoFc/ _reference/PangoFc/
|
- mv _build/subprojects/pango/docs/PangoFc/ _reference/PangoFc/
|
||||||
|
@@ -24,7 +24,7 @@ flatpak build ${builddir} meson \
|
|||||||
-Dbuild-examples=false \
|
-Dbuild-examples=false \
|
||||||
-Dintrospection=disabled \
|
-Dintrospection=disabled \
|
||||||
-Dbuild-demos=true \
|
-Dbuild-demos=true \
|
||||||
-Dprofile=devel \
|
-Ddemo-profile=devel \
|
||||||
_flatpak_build
|
_flatpak_build
|
||||||
|
|
||||||
flatpak build --env=CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA ${builddir} ninja -C _flatpak_build install
|
flatpak build --env=CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA ${builddir} ninja -C _flatpak_build install
|
||||||
|
@@ -1,91 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<-EOF
|
|
||||||
Usage: $(basename $0) [OPTION…] REPO_URL COMMIT
|
|
||||||
|
|
||||||
Check out and install a meson project
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-Dkey=val Option to pass on to meson
|
|
||||||
--prefix Prefix to install to
|
|
||||||
--subdir Build subdirectory instead of whole project
|
|
||||||
--prepare Script to run before build
|
|
||||||
|
|
||||||
-h, --help Display this help
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
TEMP=$(getopt \
|
|
||||||
--name=$(basename $0) \
|
|
||||||
--options='D:h' \
|
|
||||||
--longoptions='prefix:' \
|
|
||||||
--longoptions='subdir:' \
|
|
||||||
--longoptions='prepare:' \
|
|
||||||
--longoptions='help' \
|
|
||||||
-- "$@")
|
|
||||||
|
|
||||||
eval set -- "$TEMP"
|
|
||||||
unset TEMP
|
|
||||||
|
|
||||||
MESON_OPTIONS=()
|
|
||||||
PREFIX=/usr
|
|
||||||
SUBDIR=.
|
|
||||||
PREPARE=:
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
case "$1" in
|
|
||||||
-D)
|
|
||||||
MESON_OPTIONS+=( -D$2 )
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
|
|
||||||
--prefix)
|
|
||||||
PREFIX=$2
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
|
|
||||||
--subdir)
|
|
||||||
SUBDIR=$2
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
|
|
||||||
--prepare)
|
|
||||||
PREPARE=$2
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--help)
|
|
||||||
usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
--)
|
|
||||||
shift
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ $# -lt 2 ]]; then
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
REPO_URL="$1"
|
|
||||||
COMMIT="$2"
|
|
||||||
|
|
||||||
CHECKOUT_DIR=$(mktemp --directory)
|
|
||||||
trap "rm -rf $CHECKOUT_DIR" EXIT
|
|
||||||
|
|
||||||
git clone --depth 1 "$REPO_URL" -b "$COMMIT" "$CHECKOUT_DIR"
|
|
||||||
|
|
||||||
pushd "$CHECKOUT_DIR/$SUBDIR"
|
|
||||||
sh -c "$PREPARE"
|
|
||||||
meson setup --prefix "$PREFIX" _build "${MESON_OPTIONS[@]}"
|
|
||||||
meson compile -C _build
|
|
||||||
meson install -C _build
|
|
||||||
popd
|
|
@@ -35,7 +35,7 @@ The issue tracker is meant to be used for actionable issues only.
|
|||||||
|
|
||||||
You should not open a new issue for security related questions.
|
You should not open a new issue for security related questions.
|
||||||
|
|
||||||
When in doubt, follow the process for [GNOME security issues](https://security.gnome.org/).
|
When in doubt, follow [security](https://security.gnome.org/).
|
||||||
|
|
||||||
### Bug reports
|
### Bug reports
|
||||||
|
|
||||||
@@ -100,16 +100,14 @@ development tools appropriate for your operating system, including:
|
|||||||
- Meson
|
- Meson
|
||||||
- Ninja
|
- Ninja
|
||||||
- Gettext (19.7 or newer)
|
- Gettext (19.7 or newer)
|
||||||
- a [C99 compatible compiler][glib-toolchain-reqs]
|
- a [C99 compatible compiler](https://wiki.gnome.org/Projects/GLib/CompilerRequirements)
|
||||||
|
|
||||||
Up-to-date instructions about developing GNOME applications and libraries
|
Up-to-date instructions about developing GNOME applications and libraries
|
||||||
can be found on [the GNOME Developer Center](https://developer.gnome.org).
|
can be found on [the GNOME Developer Center](https://developer.gnome.org).
|
||||||
|
|
||||||
The GTK project uses GitLab for code hosting and for tracking issues. More
|
The GTK project uses GitLab for code hosting and for tracking issues. More
|
||||||
information about using GitLab can be found on [the GNOME handbook][handbook].
|
information about using GitLab can be found [on the GNOME
|
||||||
|
wiki](https://wiki.gnome.org/GitLab).
|
||||||
[glib-toolchain-reqs]: https://gitlab.gnome.org/GNOME/glib/-/blob/main/docs/toolchain-requirements.md
|
|
||||||
[handbook]: https://handbook.gnome.org/infrastructure/gitlab.html
|
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
@@ -133,7 +131,7 @@ GTK will attempt to download and build some of these dependencies if it
|
|||||||
cannot find them on your system.
|
cannot find them on your system.
|
||||||
|
|
||||||
Additionally, you may want to look at projects that create a development
|
Additionally, you may want to look at projects that create a development
|
||||||
environment for you, like [jhbuild](https://gitlab.gnome.org/GNOME/jhbuild)
|
environment for you, like [jhbuild](https://wiki.gnome.org/HowDoI/Jhbuild)
|
||||||
and [gvsbuild](https://github.com/wingtk/gvsbuild).
|
and [gvsbuild](https://github.com/wingtk/gvsbuild).
|
||||||
|
|
||||||
### Getting started
|
### Getting started
|
||||||
@@ -146,28 +144,33 @@ $ git clone https://gitlab.gnome.org/yourusername/gtk.git
|
|||||||
$ cd gtk
|
$ cd gtk
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Note**: if you plan to push changes to back to the main repository and
|
||||||
|
have a GNOME account, you can skip the fork, and use the following instead:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ git clone git@gitlab.gnome.org:GNOME/gtk.git
|
||||||
|
$ cd gtk
|
||||||
|
```
|
||||||
|
|
||||||
To compile the Git version of GTK on your system, you will need to
|
To compile the Git version of GTK on your system, you will need to
|
||||||
configure your build using Meson:
|
configure your build using Meson:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ meson setup _builddir .
|
$ meson _builddir .
|
||||||
$ meson compile -C _builddir
|
$ cd _builddir
|
||||||
|
$ ninja
|
||||||
```
|
```
|
||||||
|
|
||||||
Typically, you should work on your own branch:
|
Typically, you should work on your own branch:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ git switch -C your-branch
|
$ git checkout -b your-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
Once you've finished working on the bug fix or feature, push the branch
|
Once you've finished working on the bug fix or feature, push the branch
|
||||||
to the Git repository and open a new merge request, to let the GTK
|
to the Git repository and open a new merge request, to let the GTK
|
||||||
maintainers review your contribution.
|
maintainers review your contribution.
|
||||||
|
|
||||||
**Important**: Do **not** attach a diff or a patch file to a GitLab issue.
|
|
||||||
Patches cannot be reviewed, and do not not go through the CI pipeline. If
|
|
||||||
you wish to submit your changes to GTK, always use a merge request.
|
|
||||||
|
|
||||||
### Code reviews
|
### Code reviews
|
||||||
|
|
||||||
Each contribution is reviewed by the core developers of the GTK project.
|
Each contribution is reviewed by the core developers of the GTK project.
|
||||||
@@ -259,4 +262,4 @@ people committing to GTK to follow a few rules:
|
|||||||
|
|
||||||
If you have been contributing to GTK for a while and you don't have commit
|
If you have been contributing to GTK for a while and you don't have commit
|
||||||
access to the repository, you may ask to obtain it following the [GNOME account
|
access to the repository, you may ask to obtain it following the [GNOME account
|
||||||
process](https://handbook.gnome.org/infrastructure/developer-access.html).
|
process](https://wiki.gnome.org/AccountsTeam/NewAccounts).
|
||||||
|
312
NEWS
312
NEWS
@@ -1,316 +1,6 @@
|
|||||||
Overview of Changes in 4.15.5, xx-xx-xxxx
|
Overview of Changes in 4.15.0, xx-xx-xxxx
|
||||||
=========================================
|
=========================================
|
||||||
|
|
||||||
Overview of Changes in 4.15.4, 30-07-2024
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
* GtkPopover:
|
|
||||||
- Fix size allocation with wrapping labels
|
|
||||||
|
|
||||||
* GtkColumnView:
|
|
||||||
- Check column visibility when measuring
|
|
||||||
|
|
||||||
* CSS:
|
|
||||||
- Fix fallout from recent changes
|
|
||||||
- Make implementation of currentcolor inheritance match browsers
|
|
||||||
|
|
||||||
* Gdk:
|
|
||||||
- Introduce GdkColorState for encoding color space information
|
|
||||||
Currently, we support srgb, srgb-linear, rec2100-pq and rec2100-linear
|
|
||||||
- Add color states to GdkTexture, as well as to the texture builder
|
|
||||||
and downloader objects, and convert as necessary
|
|
||||||
- Add GdkMemoryTextureBuilder
|
|
||||||
- Attach color states when loading or saving textures
|
|
||||||
- Add GdkCicpParams to create color state objects for cicp tuples
|
|
||||||
- Drop GDK_DEBUG=vulkan-validate
|
|
||||||
Use VK_INSTEANCE_LAYERS=VK_LAYER_KHRONOS_validation instead
|
|
||||||
|
|
||||||
* Gsk:
|
|
||||||
- Improve caching of glyphs and textures
|
|
||||||
- Remove the uber shader
|
|
||||||
- Numerous bug fixes
|
|
||||||
- Fix corner cases in offload handling
|
|
||||||
- Implement occlusion culling for opaque content
|
|
||||||
- Allow offloading (some) transformed textures
|
|
||||||
- Take colorstate into account when compositing
|
|
||||||
- Add GDK_DEBUG=linear to opt into linear compositing
|
|
||||||
- Implement tiling for large textures
|
|
||||||
- Stop using descriptors and go back to simpler texture
|
|
||||||
management that should work better with older GL
|
|
||||||
- Use correct shader clip mode for glyphs
|
|
||||||
- Improve shadow rendering
|
|
||||||
|
|
||||||
* Media:
|
|
||||||
- Attach color states to textures obtained from gstreamer
|
|
||||||
|
|
||||||
* Wayland:
|
|
||||||
- Allow offloading GL textures via dmabuf export
|
|
||||||
- Suppot the xx-color-management-v4 protocol
|
|
||||||
|
|
||||||
* Deprecations:
|
|
||||||
- GskGLShader and the render node
|
|
||||||
|
|
||||||
* Tools:
|
|
||||||
- Improve the rendernode tool extract command
|
|
||||||
- Add an image tool that is about manipulating textures
|
|
||||||
|
|
||||||
* Build:
|
|
||||||
- GTK now requires a C11 compiler
|
|
||||||
|
|
||||||
* Translation updates
|
|
||||||
Georgian
|
|
||||||
Hebrew
|
|
||||||
Hindi
|
|
||||||
Occitan
|
|
||||||
Slovenian
|
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in 4.15.3, 29-06-2024
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
* Accessibility:
|
|
||||||
- Only emit notifications when cursor positions change in GtkText
|
|
||||||
- Fix handling of help text properties
|
|
||||||
|
|
||||||
* CSS:
|
|
||||||
- Fix some crashes introduced in recent currentcolor changes
|
|
||||||
|
|
||||||
* DND:
|
|
||||||
- Avoid a critical
|
|
||||||
|
|
||||||
* Documentation:
|
|
||||||
- Fix many oversights and missing docs
|
|
||||||
|
|
||||||
* maxOS:
|
|
||||||
- Add native keyboard shortcuts
|
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in 4.15.2, 28-06-2024
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
* GtkFileChooserWidget:
|
|
||||||
- Plug some memory leaks
|
|
||||||
- Make Ctrl-Shift-N create a new folder
|
|
||||||
|
|
||||||
* GtkPopover:
|
|
||||||
- Handle resizing and position changes better
|
|
||||||
|
|
||||||
* CSS:
|
|
||||||
- Support color(), oklab(), etc (https://www.w3.org/TR/css-color-4/)
|
|
||||||
- Support color-mix() (https://www.w3.org/TR/css-color-5/)
|
|
||||||
- Support relative colors (https://www.w3.org/TR/css-color-5/)
|
|
||||||
- Support more colorspaces in color()
|
|
||||||
- Allow percentages for opacity
|
|
||||||
- Handle currentcolor more correctly
|
|
||||||
|
|
||||||
* Accessibility:
|
|
||||||
- Avoid markup when reading labels
|
|
||||||
|
|
||||||
* GSK:
|
|
||||||
- Subset fonts when serializing node trees
|
|
||||||
- Make ngl export render_texture results as dmabufs
|
|
||||||
|
|
||||||
* Wayland:
|
|
||||||
- Use xdg-dialog protocol for attached dialogs
|
|
||||||
|
|
||||||
* Windows:
|
|
||||||
- Build with UNICODE
|
|
||||||
|
|
||||||
* macOS:
|
|
||||||
- Implement fullscreen-on-monitor
|
|
||||||
|
|
||||||
* Documentation:
|
|
||||||
- Widget shortcuts and actions are now described in the docs
|
|
||||||
|
|
||||||
* Debugging:
|
|
||||||
- Add GTK_DEBUG=css for warning about deprecated css syntax
|
|
||||||
|
|
||||||
* Tools:
|
|
||||||
- rendernode-tool: Add an extract command for data urls
|
|
||||||
|
|
||||||
* Deprecations:
|
|
||||||
- CSS Color functions shade(), lighter(), darker(), alpha(), mix()
|
|
||||||
|
|
||||||
* Translation updates:
|
|
||||||
Czech
|
|
||||||
Hebrew
|
|
||||||
Serbian
|
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in 4.15.1, 21-05-2024
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
* GtkGraphicsOffload:
|
|
||||||
- Don't crash without a child
|
|
||||||
|
|
||||||
* GtkSpinner:
|
|
||||||
- Don't animate when unmapped
|
|
||||||
|
|
||||||
* CSS:
|
|
||||||
- Support the :root selector
|
|
||||||
- Support variables and custom properties (https://www.w3.org/TR/css-variables-1/)
|
|
||||||
- Implement math functions (https://www.w3.org/TR/css-values-4/)
|
|
||||||
- Support modern syntax and calc in rgb() and hsl()
|
|
||||||
|
|
||||||
* Icontheme:
|
|
||||||
- Make symbolic svg loading more efficient
|
|
||||||
- Handle color-free symbolics more efficiently
|
|
||||||
|
|
||||||
* Accessibility:
|
|
||||||
- Make the gtk-demo sidebar search more accessible
|
|
||||||
- Stop emitting focus events
|
|
||||||
- Realize child contexts when necessary
|
|
||||||
|
|
||||||
* GDK:
|
|
||||||
- Support XDG_ACTIVATION_TOKEN
|
|
||||||
- dmabuf: Be more defensive when importing unknown formats to GL
|
|
||||||
- dmabuf: Use narrow range for YUV
|
|
||||||
- vulkan: Recreate swapchains when necessary or beneficial
|
|
||||||
|
|
||||||
* GSK:
|
|
||||||
- Improve logging for GDK_DEBUG=offload
|
|
||||||
- Improve logging for GSK_DEBUG=renderer
|
|
||||||
- gpu: Warn about inefficient texture import
|
|
||||||
- gpu: Handle tiny offscreens correctly
|
|
||||||
- vulkan: Add profiler marks in various places
|
|
||||||
- vulkan: Fix a problem with imported dmabufs showing up black
|
|
||||||
- cairo: Speed up mask nodes, since we use them for symbolic icons
|
|
||||||
|
|
||||||
* Wayland:
|
|
||||||
- Use wl_compositor version 6
|
|
||||||
|
|
||||||
* X11:
|
|
||||||
- Implement a missing method
|
|
||||||
|
|
||||||
* Build:
|
|
||||||
- Fix many ubsan warnings
|
|
||||||
|
|
||||||
* Debugging:
|
|
||||||
- Show more texture details in the recorder
|
|
||||||
- Use GTK_DEBUG=css to see CSS deprecations
|
|
||||||
|
|
||||||
* macOS:
|
|
||||||
- Fix problems with events handed back to the OS
|
|
||||||
- Respect GDK_DEBUG=default-settings
|
|
||||||
- Allow applictions to handle Dock > Quit
|
|
||||||
|
|
||||||
* Deprecations:
|
|
||||||
- Use of @name colors in CSS
|
|
||||||
|
|
||||||
* Translation updates:
|
|
||||||
Catalan
|
|
||||||
Georgian
|
|
||||||
Hungarian
|
|
||||||
Korean
|
|
||||||
Portuguese
|
|
||||||
Turkish
|
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in 4.15.0, 21-04-2024
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
This release changes the default GSK renderer to be Vulkan, on
|
|
||||||
Wayland. Other platforms still use ngl.
|
|
||||||
|
|
||||||
The intent of this change is to get wider testing and verify that
|
|
||||||
Vulkan drivers are good enough for us to rely on. If significant
|
|
||||||
problems show up, we will revert this change for 4.16.
|
|
||||||
|
|
||||||
You can still override the renderer choice using the GSK_RENDERER
|
|
||||||
environment variable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
This release also changes font rendering settings by introducing
|
|
||||||
a new high-level gtk-font-rendering settings which gives GTK more
|
|
||||||
freedom to decide on font rendering.
|
|
||||||
|
|
||||||
You can still use the low-level font-related settings by changing
|
|
||||||
the new property to 'manual'.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
* GtkColumnView:
|
|
||||||
- Fix infinite loops in dispose
|
|
||||||
- Fix problems with weak ref cycles in GtkExpression
|
|
||||||
|
|
||||||
* GtkListView:
|
|
||||||
* GtkShortcutManager:
|
|
||||||
- Track the propagation phase of added controllers
|
|
||||||
|
|
||||||
* GtkGLArea:
|
|
||||||
- Produce dmabuf textures, so graphics offload is possible
|
|
||||||
|
|
||||||
* GtkTextView:
|
|
||||||
- Support text shadows
|
|
||||||
|
|
||||||
* GtkGraphicsOffload:
|
|
||||||
- Add a black-background property
|
|
||||||
|
|
||||||
* Settings:
|
|
||||||
- Add a new gtk-font-rendering setting
|
|
||||||
|
|
||||||
* Accessibility:
|
|
||||||
- Add support for GetRangeExtents to GtkAccessibleText
|
|
||||||
- Add support for GetOffsetAtPoint to GtkAccessibleText
|
|
||||||
- Implement GtkAccessibleRange for scrollbars
|
|
||||||
|
|
||||||
* GDK:
|
|
||||||
- Add a callback-based cursor API
|
|
||||||
|
|
||||||
* GSK:
|
|
||||||
- Use the Vulkan renderer by default
|
|
||||||
- Avoid an infinite recursion with offscreens in some cases
|
|
||||||
- Optimize graphics offload to make it more likely that compositors
|
|
||||||
can use direct scanout
|
|
||||||
|
|
||||||
* X11:
|
|
||||||
- Fix some confusing debug messages
|
|
||||||
- Drop a no-longer-relevant optimization that was interfering with
|
|
||||||
getting the current window manager capabilities
|
|
||||||
|
|
||||||
* macOS:
|
|
||||||
- Implement the color picker for macOS 10.15+
|
|
||||||
|
|
||||||
* Debugging:
|
|
||||||
- Snow monitor resolution in the inspector
|
|
||||||
|
|
||||||
* Demos:
|
|
||||||
- Use graphics offload in the shadertoy demo
|
|
||||||
- Show more reliable fps numbers in the fishbowl demo
|
|
||||||
|
|
||||||
* Tools:
|
|
||||||
- Support generating pdf in gtk4-rendernode-tool
|
|
||||||
|
|
||||||
* Build:
|
|
||||||
- Require pango 1.52
|
|
||||||
- Require cairo 1.18
|
|
||||||
- Add a missing dependency that was causing build failures
|
|
||||||
- Drop deprecated build options:
|
|
||||||
gtk_doc -> documentation
|
|
||||||
update_screenshots -> screenshots
|
|
||||||
demo-profile -> profile
|
|
||||||
demos -> build-demos
|
|
||||||
|
|
||||||
* Deprecations:
|
|
||||||
- gdk_widget_set/get_font_options
|
|
||||||
- gdk_wayland/x11_display_set_cursor_theme
|
|
||||||
|
|
||||||
* Translation updates:
|
|
||||||
Basque
|
|
||||||
Brazilian Portuguese
|
|
||||||
British English
|
|
||||||
Chinese (China)
|
|
||||||
Hebrew
|
|
||||||
Kabyle
|
|
||||||
Persian
|
|
||||||
Polish
|
|
||||||
Russian
|
|
||||||
Slovenian
|
|
||||||
Swedish
|
|
||||||
Turkish
|
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in 4.14.2, 03-04-2024
|
Overview of Changes in 4.14.2, 03-04-2024
|
||||||
=========================================
|
=========================================
|
||||||
|
|
||||||
|
15
README.md
15
README.md
@@ -39,21 +39,18 @@ Nightly documentation can be found at
|
|||||||
- Gsk: https://gnome.pages.gitlab.gnome.org/gtk/gsk4/
|
- Gsk: https://gnome.pages.gitlab.gnome.org/gtk/gsk4/
|
||||||
|
|
||||||
Nightly flatpaks of our demos can be installed from the
|
Nightly flatpaks of our demos can be installed from the
|
||||||
[GNOME Nightly](https://nightly.gnome.org/) repository:
|
[GNOME Nightly](https://wiki.gnome.org/Apps/Nightly) repository:
|
||||||
|
- `flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo`
|
||||||
```sh
|
- `flatpak install gnome-nightly org.gtk.Demo4`
|
||||||
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
|
- `flatpak install gnome-nightly org.gtk.WidgetFactory4`
|
||||||
flatpak install gnome-nightly org.gtk.Demo4
|
- `flatpak install gnome-nightly org.gtk.IconBrowser4`
|
||||||
flatpak install gnome-nightly org.gtk.WidgetFactory4
|
|
||||||
flatpak install gnome-nightly org.gtk.IconBrowser4
|
|
||||||
```
|
|
||||||
|
|
||||||
Building and installing
|
Building and installing
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
In order to build GTK you will need:
|
In order to build GTK you will need:
|
||||||
|
|
||||||
- [a C11 compatible compiler](https://gitlab.gnome.org/GNOME/glib/-/blob/main/docs/toolchain-requirements.md)
|
- [a C99 compatible compiler](https://wiki.gnome.org/Projects/GLib/CompilerRequirements)
|
||||||
- [Python 3](https://www.python.org/)
|
- [Python 3](https://www.python.org/)
|
||||||
- [Meson](http://mesonbuild.com)
|
- [Meson](http://mesonbuild.com)
|
||||||
- [Ninja](https://ninja-build.org)
|
- [Ninja](https://ninja-build.org)
|
||||||
|
@@ -186,7 +186,7 @@
|
|||||||
"config-opts" : [
|
"config-opts" : [
|
||||||
"--libdir=/app/lib",
|
"--libdir=/app/lib",
|
||||||
"-Dbuildtype=debugoptimized",
|
"-Dbuildtype=debugoptimized",
|
||||||
"-Dprofile=devel"
|
"-Ddemo-profile=devel"
|
||||||
],
|
],
|
||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
"config-opts" : [
|
"config-opts" : [
|
||||||
"--libdir=/app/lib",
|
"--libdir=/app/lib",
|
||||||
"-Dbuildtype=debugoptimized",
|
"-Dbuildtype=debugoptimized",
|
||||||
"-Dprofile=devel"
|
"-Ddemo-profile=devel"
|
||||||
],
|
],
|
||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
"config-opts" : [
|
"config-opts" : [
|
||||||
"--libdir=/app/lib",
|
"--libdir=/app/lib",
|
||||||
"-Dbuildtype=debugoptimized",
|
"-Dbuildtype=debugoptimized",
|
||||||
"-Dprofile=devel"
|
"-Ddemo-profile=devel"
|
||||||
],
|
],
|
||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
"config-opts" : [
|
"config-opts" : [
|
||||||
"--libdir=/app/lib",
|
"--libdir=/app/lib",
|
||||||
"-Dbuildtype=debugoptimized",
|
"-Dbuildtype=debugoptimized",
|
||||||
"-Dprofile=devel"
|
"-Ddemo-profile=devel"
|
||||||
],
|
],
|
||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
|
@@ -170,7 +170,6 @@ update_paintable (GtkWidget *widget,
|
|||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
create_cogs (void)
|
create_cogs (void)
|
||||||
{
|
{
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
GtkWidget *picture;
|
GtkWidget *picture;
|
||||||
static GskGLShader *cog_shader = NULL;
|
static GskGLShader *cog_shader = NULL;
|
||||||
GdkPaintable *paintable;
|
GdkPaintable *paintable;
|
||||||
@@ -183,7 +182,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|||||||
gtk_widget_add_tick_callback (picture, update_paintable, NULL, NULL);
|
gtk_widget_add_tick_callback (picture, update_paintable, NULL, NULL);
|
||||||
|
|
||||||
return picture;
|
return picture;
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@@ -363,9 +363,7 @@ insert_markup_idle (gpointer data)
|
|||||||
|
|
||||||
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
|
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
|
||||||
{
|
{
|
||||||
guint id;
|
g_idle_add (insert_markup_idle, data);
|
||||||
id = g_idle_add (insert_markup_idle, data);
|
|
||||||
g_source_set_name_by_id (id, "[gtk-demo] insert_markup_idle");
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,9 +398,7 @@ parse_markup_idle (gpointer data)
|
|||||||
do {
|
do {
|
||||||
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
|
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
|
||||||
{
|
{
|
||||||
guint id;
|
g_idle_add (parse_markup_idle, data);
|
||||||
id = g_idle_add (parse_markup_idle, data);
|
|
||||||
g_source_set_name_by_id (id, "[gtk-demo] parse_markup_idle");
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,8 +20,6 @@
|
|||||||
#include "gtkshadertoy.h"
|
#include "gtkshadertoy.h"
|
||||||
#include "gskshaderpaintable.h"
|
#include "gskshaderpaintable.h"
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
static GtkWidget *demo_window = NULL;
|
static GtkWidget *demo_window = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -362,5 +360,3 @@ do_gltransition (GtkWidget *do_widget)
|
|||||||
|
|
||||||
return demo_window;
|
return demo_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -22,8 +22,6 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include "gskshaderpaintable.h"
|
#include "gskshaderpaintable.h"
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GskShaderPaintable:
|
* GskShaderPaintable:
|
||||||
*
|
*
|
||||||
@@ -334,5 +332,3 @@ gsk_shader_paintable_update_time (GskShaderPaintable *self,
|
|||||||
|
|
||||||
g_bytes_unref (args);
|
g_bytes_unref (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -22,8 +22,6 @@
|
|||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gsk/gsk.h>
|
#include <gsk/gsk.h>
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GSK_TYPE_SHADER_PAINTABLE (gsk_shader_paintable_get_type ())
|
#define GSK_TYPE_SHADER_PAINTABLE (gsk_shader_paintable_get_type ())
|
||||||
@@ -43,5 +41,3 @@ void gsk_shader_paintable_update_time (GskShaderPaintable *self
|
|||||||
int time_idx,
|
int time_idx,
|
||||||
gint64 frame_time);
|
gint64 frame_time);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -456,33 +456,43 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
|
|||||||
{
|
{
|
||||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
GdkFrameClock *frame_clock;
|
GdkFrameClock *frame_clock;
|
||||||
GdkFrameTimings *end;
|
GdkFrameTimings *start, *end;
|
||||||
gint64 end_counter;
|
gint64 start_counter, end_counter;
|
||||||
double fps, expected_fps;
|
gint64 n_frames, expected_frames;
|
||||||
|
gint64 start_timestamp, end_timestamp;
|
||||||
gint64 interval;
|
gint64 interval;
|
||||||
|
|
||||||
frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (fishbowl));
|
frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (fishbowl));
|
||||||
if (frame_clock == NULL)
|
if (frame_clock == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fps = gdk_frame_clock_get_fps (frame_clock);
|
start_counter = gdk_frame_clock_get_history_start (frame_clock);
|
||||||
if (fps <= 0.0)
|
end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
|
||||||
|
start = gdk_frame_clock_get_timings (frame_clock, start_counter);
|
||||||
|
for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
|
||||||
|
end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end);
|
||||||
|
end = gdk_frame_clock_get_timings (frame_clock, end_counter))
|
||||||
|
end_counter--;
|
||||||
|
if (end_counter - start_counter < 4)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
priv->framerate = fps;
|
start_timestamp = gdk_frame_timings_get_presentation_time (start);
|
||||||
|
end_timestamp = gdk_frame_timings_get_presentation_time (end);
|
||||||
|
if (start_timestamp == 0 || end_timestamp == 0)
|
||||||
|
{
|
||||||
|
start_timestamp = gdk_frame_timings_get_frame_time (start);
|
||||||
|
end_timestamp = gdk_frame_timings_get_frame_time (end);
|
||||||
|
}
|
||||||
|
|
||||||
|
n_frames = end_counter - start_counter;
|
||||||
|
priv->framerate = ((double) n_frames) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
|
||||||
|
priv->framerate = ((int)(priv->framerate * 100))/100.0;
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
||||||
|
|
||||||
if (!priv->benchmark)
|
if (!priv->benchmark)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
|
|
||||||
for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
|
|
||||||
end != NULL && !gdk_frame_timings_get_complete (end);
|
|
||||||
end = gdk_frame_clock_get_timings (frame_clock, end_counter))
|
|
||||||
end_counter--;
|
|
||||||
if (end == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
interval = gdk_frame_timings_get_refresh_interval (end);
|
interval = gdk_frame_timings_get_refresh_interval (end);
|
||||||
if (interval == 0)
|
if (interval == 0)
|
||||||
{
|
{
|
||||||
@@ -490,16 +500,16 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
|
|||||||
if (interval == 0)
|
if (interval == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
expected_fps = (double) G_USEC_PER_SEC / interval;
|
expected_frames = round ((double) (end_timestamp - start_timestamp) / interval);
|
||||||
|
|
||||||
if (fps > (expected_fps - 1))
|
if (n_frames >= expected_frames)
|
||||||
{
|
{
|
||||||
if (priv->last_benchmark_change > 0)
|
if (priv->last_benchmark_change > 0)
|
||||||
priv->last_benchmark_change *= 2;
|
priv->last_benchmark_change *= 2;
|
||||||
else
|
else
|
||||||
priv->last_benchmark_change = 1;
|
priv->last_benchmark_change = 1;
|
||||||
}
|
}
|
||||||
else if (0.95 * fps < expected_fps)
|
else if (n_frames + 1 < expected_frames)
|
||||||
{
|
{
|
||||||
if (priv->last_benchmark_change < 0)
|
if (priv->last_benchmark_change < 0)
|
||||||
priv->last_benchmark_change--;
|
priv->last_benchmark_change--;
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
#include "gtkshaderbin.h"
|
#include "gtkshaderbin.h"
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GskGLShader *shader;
|
GskGLShader *shader;
|
||||||
GtkStateFlags state;
|
GtkStateFlags state;
|
||||||
@@ -264,5 +262,3 @@ gtk_shader_bin_new (void)
|
|||||||
|
|
||||||
return GTK_WIDGET (self);
|
return GTK_WIDGET (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GTK_TYPE_SHADER_BIN (gtk_shader_bin_get_type ())
|
#define GTK_TYPE_SHADER_BIN (gtk_shader_bin_get_type ())
|
||||||
@@ -20,5 +18,3 @@ void gtk_shader_bin_set_child (GtkShaderBin *self,
|
|||||||
GtkWidget *gtk_shader_bin_get_child (GtkShaderBin *self);
|
GtkWidget *gtk_shader_bin_get_child (GtkShaderBin *self);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
#include "gtkshaderstack.h"
|
#include "gtkshaderstack.h"
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
struct _GtkShaderStack
|
struct _GtkShaderStack
|
||||||
{
|
{
|
||||||
GtkWidget parent_instance;
|
GtkWidget parent_instance;
|
||||||
@@ -361,5 +359,3 @@ gtk_shader_stack_set_active (GtkShaderStack *self,
|
|||||||
self->current = MIN (index, self->children->len);
|
self->current = MIN (index, self->children->len);
|
||||||
update_child_visible (self);
|
update_child_visible (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GTK_TYPE_SHADER_STACK (gtk_shader_stack_get_type ())
|
#define GTK_TYPE_SHADER_STACK (gtk_shader_stack_get_type ())
|
||||||
@@ -20,5 +18,3 @@ void gtk_shader_stack_set_active (GtkShaderStack *self,
|
|||||||
int index);
|
int index);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
||||||
|
@@ -40,7 +40,7 @@ get_win32_all_locales_scripts (LPWSTR locale_w, DWORD flags, LPARAM param)
|
|||||||
{
|
{
|
||||||
wchar_t *langname_w = NULL;
|
wchar_t *langname_w = NULL;
|
||||||
wchar_t locale_abbrev_w[9];
|
wchar_t locale_abbrev_w[9];
|
||||||
gchar *langname, *locale_abbrev, *locale;
|
gchar *langname, *locale_abbrev, *locale, *p;
|
||||||
gint i;
|
gint i;
|
||||||
const LCTYPE iso639_lctypes[] = { LOCALE_SISO639LANGNAME, LOCALE_SISO639LANGNAME2 };
|
const LCTYPE iso639_lctypes[] = { LOCALE_SISO639LANGNAME, LOCALE_SISO639LANGNAME2 };
|
||||||
GHashTable *ht_scripts_langs = (GHashTable *) param;
|
GHashTable *ht_scripts_langs = (GHashTable *) param;
|
||||||
@@ -59,6 +59,7 @@ get_win32_all_locales_scripts (LPWSTR locale_w, DWORD flags, LPARAM param)
|
|||||||
GetLocaleInfoEx (locale_w, LOCALE_SLOCALIZEDDISPLAYNAME, langname_w, langname_size);
|
GetLocaleInfoEx (locale_w, LOCALE_SLOCALIZEDDISPLAYNAME, langname_w, langname_size);
|
||||||
langname = g_utf16_to_utf8 (langname_w, -1, NULL, NULL, NULL);
|
langname = g_utf16_to_utf8 (langname_w, -1, NULL, NULL, NULL);
|
||||||
locale = g_utf16_to_utf8 (locale_w, -1, NULL, NULL, NULL);
|
locale = g_utf16_to_utf8 (locale_w, -1, NULL, NULL, NULL);
|
||||||
|
p = strchr (locale, '-');
|
||||||
lang = pango_language_from_string (locale);
|
lang = pango_language_from_string (locale);
|
||||||
if (g_hash_table_lookup (ht_scripts_langs, lang) == NULL)
|
if (g_hash_table_lookup (ht_scripts_langs, lang) == NULL)
|
||||||
g_hash_table_insert (ht_scripts_langs, lang, langname);
|
g_hash_table_insert (ht_scripts_langs, lang, langname);
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <glib/gi18n.h>
|
|
||||||
|
|
||||||
#include "demos.h"
|
#include "demos.h"
|
||||||
#include "fontify.h"
|
#include "fontify.h"
|
||||||
@@ -924,34 +923,6 @@ clear_search (GtkSearchBar *bar)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
search_results_update (GObject *filter_model,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
GtkEntry *entry)
|
|
||||||
{
|
|
||||||
gsize n_items = g_list_model_get_n_items (G_LIST_MODEL (filter_model));
|
|
||||||
|
|
||||||
if (strlen (gtk_editable_get_text (GTK_EDITABLE (entry))) > 0)
|
|
||||||
{
|
|
||||||
char *text;
|
|
||||||
|
|
||||||
if (n_items > 0)
|
|
||||||
text = g_strdup_printf (ngettext ("%ld search result", "%ld search results", (long) n_items), (long) n_items);
|
|
||||||
else
|
|
||||||
text = g_strdup (_("No search results"));
|
|
||||||
|
|
||||||
gtk_accessible_update_property (GTK_ACCESSIBLE (entry),
|
|
||||||
GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, text,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
g_free (text);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_accessible_reset_property (GTK_ACCESSIBLE (entry), GTK_ACCESSIBLE_PROPERTY_DESCRIPTION);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activate (GApplication *app)
|
activate (GApplication *app)
|
||||||
{
|
{
|
||||||
@@ -999,7 +970,6 @@ activate (GApplication *app)
|
|||||||
|
|
||||||
search_entry = GTK_WIDGET (gtk_builder_get_object (builder, "search-entry"));
|
search_entry = GTK_WIDGET (gtk_builder_get_object (builder, "search-entry"));
|
||||||
g_signal_connect (search_entry, "search-changed", G_CALLBACK (demo_search_changed_cb), filter);
|
g_signal_connect (search_entry, "search-changed", G_CALLBACK (demo_search_changed_cb), filter);
|
||||||
g_signal_connect (filter_model, "notify::n-items", G_CALLBACK (search_results_update), search_entry);
|
|
||||||
|
|
||||||
selection = gtk_single_selection_new (G_LIST_MODEL (filter_model));
|
selection = gtk_single_selection_new (G_LIST_MODEL (filter_model));
|
||||||
g_signal_connect (selection, "notify::selected-item", G_CALLBACK (selection_cb), NULL);
|
g_signal_connect (selection, "notify::selected-item", G_CALLBACK (selection_cb), NULL);
|
||||||
|
@@ -299,7 +299,7 @@ node_editor_application_new (void)
|
|||||||
|
|
||||||
app = g_object_new (NODE_EDITOR_APPLICATION_TYPE,
|
app = g_object_new (NODE_EDITOR_APPLICATION_TYPE,
|
||||||
"application-id", "org.gtk.gtk4.NodeEditor",
|
"application-id", "org.gtk.gtk4.NodeEditor",
|
||||||
"flags", G_APPLICATION_HANDLES_OPEN | G_APPLICATION_NON_UNIQUE,
|
"flags", G_APPLICATION_HANDLES_OPEN,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
g_application_add_main_option (G_APPLICATION (app), "version", 0, 0,G_OPTION_ARG_NONE, "Show program version", NULL);
|
g_application_add_main_option (G_APPLICATION (app), "version", 0, 0,G_OPTION_ARG_NONE, "Show program version", NULL);
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<gresource prefix="/org/gtk/gtk4/node-editor">
|
<gresource prefix="/org/gtk/gtk4/node-editor">
|
||||||
<file preprocess="xml-stripblanks">node-editor-window.ui</file>
|
<file preprocess="xml-stripblanks">node-editor-window.ui</file>
|
||||||
<file preprocess="xml-stripblanks">help-window.ui</file>
|
<file preprocess="xml-stripblanks">help-window.ui</file>
|
||||||
<file alias='node-format.md'>../../docs/reference/gtk/node-format.md</file>
|
<file>node-format.md</file>
|
||||||
<file alias='icons/apps/org.gtk.gtk4.NodeEditor.svg'>data/scalable/apps/org.gtk.gtk4.NodeEditor.svg</file>
|
<file alias='icons/apps/org.gtk.gtk4.NodeEditor.svg'>data/scalable/apps/org.gtk.gtk4.NodeEditor.svg</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
@@ -1,15 +1,13 @@
|
|||||||
Title: The Node file format
|
# The Node file format
|
||||||
|
|
||||||
GSK render nodes can be serialized and deserialized using APIs such as `gsk_render_node_serialize()` and `gsk_render_node_deserialize()`. The intended use for this is development - primarily the development of GTK - by allowing things such as creating testsuites and benchmarks, exchanging nodes in bug reports. GTK includes the `gtk4-node-editor` application for creating such test files.
|
GSK render nodes can be serialized and deserialized using APIs such as `gsk_render_node_serialize()` and `gsk_render_node_deserialize()`. The intended use for this is development - primarily the development of GTK - by allowing things such as creating testsuites and benchmarks, exchanging nodes in bug reports. GTK includes the `gtk4-node-editor` application for creating such test files.
|
||||||
|
|
||||||
The format is a text format that follows the [CSS syntax rules](https://drafts.csswg.org/css-syntax-3/). In particular, this means that every array of bytes will produce a render node when parsed, as there is a defined error recovery method. For more details on error handling, please refer to the documentation of the parsing APIs.
|
The format is a text format that follows the [CSS syntax rules](https://drafts.csswg.org/css-syntax-3/). In particular, this means that every array of bytes will produce a render node when parsed, as there is a defined error recovery method. For more details on error handling, please refer to the documentation of the parsing APIs.
|
||||||
|
|
||||||
The grammar of a node text representation using [the CSS value definition syntax](https://drafts.csswg.org/css-values-3/#value-defs) looks like this:
|
The grammar of a node text representation using [the CSS value definition syntax](https://drafts.csswg.org/css-values-3/#value-defs) looks like this:
|
||||||
|
**document**: `<node>\*`
|
||||||
document: <@-rule>*<node>*
|
**node**: container [ "name" ] { <document> } | `<node-type> [ "name" ] { <property>* }` | "name"
|
||||||
@-rule: @cicp "name" { <property>* }
|
**property**: `<property-name>: <node> | <value> ;`
|
||||||
node: container [ "name" ] { <document> } | <node-type> [ "name" ] { <property>* } | "name"
|
|
||||||
property: <property-name>: <node> | <value> ;
|
|
||||||
|
|
||||||
Each node has its own `<node-type>` and supports a custom set of properties, each with their own `<property-name>` and syntax. The following paragraphs document each of the nodes and their properties.
|
Each node has its own `<node-type>` and supports a custom set of properties, each with their own `<property-name>` and syntax. The following paragraphs document each of the nodes and their properties.
|
||||||
|
|
||||||
@@ -27,45 +25,6 @@ Nodes can be given a name by adding a string after the `<node-type>` in their de
|
|||||||
|
|
||||||
Just like nodes, textures can be referenced by name. When defining a named texture, the name has to be placed in front of the URL.
|
Just like nodes, textures can be referenced by name. When defining a named texture, the name has to be placed in front of the URL.
|
||||||
|
|
||||||
# Color states
|
|
||||||
|
|
||||||
Color states are represented either by an ident (for builtin ones) or a string
|
|
||||||
(for custom ones):
|
|
||||||
|
|
||||||
color-state: <ident> | <string>
|
|
||||||
|
|
||||||
Custom color states can be defined at the beginning of the document, with an @cicp rule.
|
|
||||||
|
|
||||||
The format for @cicp rules is
|
|
||||||
|
|
||||||
@cicp "name" {
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
The following properties can be set for custom color states:
|
|
||||||
|
|
||||||
| property | syntax | default | printed |
|
|
||||||
| --------- | ---------------- | -------- | ----------- |
|
|
||||||
| primaries | `<integer>` | 2 | always |
|
|
||||||
| transfer | `<integer>` | 2 | always |
|
|
||||||
| matrix | `<integer>` | 2 | always |
|
|
||||||
| range | `narrow | full` | full | non-default |
|
|
||||||
|
|
||||||
Note that the primaries, transfer and matrix properties always need
|
|
||||||
to be specified, since GTK does not allow creating color state objects
|
|
||||||
with these being set to 2 (== unspecified).
|
|
||||||
|
|
||||||
# Colors
|
|
||||||
|
|
||||||
Colors can be specified with a variation of the modern CSS color syntax:
|
|
||||||
|
|
||||||
color(<color-state> <number> <number> <number> ["/" <number>])
|
|
||||||
|
|
||||||
The traditional syntax for sRGB colors still works as well:
|
|
||||||
|
|
||||||
rgba(<number>, <number>, <number>, <number)
|
|
||||||
rgb(<number, <number>, <number>)
|
|
||||||
|
|
||||||
# Nodes
|
# Nodes
|
||||||
|
|
||||||
### container
|
### container
|
||||||
@@ -371,7 +330,6 @@ stroke bounds of the path.
|
|||||||
| offset | `<point>` | 0 0 | non-default |
|
| offset | `<point>` | 0 0 | non-default |
|
||||||
| hint-style | `<hint style>` | slight | non-default |
|
| hint-style | `<hint style>` | slight | non-default |
|
||||||
| antialias | `<antialias>` | gray | non-default |
|
| antialias | `<antialias>` | gray | non-default |
|
||||||
| hint-metrics | `<hint metrics>` | off | non-default |
|
|
||||||
|
|
||||||
Creates a node like `gsk_text_node_new()` with the given properties.
|
Creates a node like `gsk_text_node_new()` with the given properties.
|
||||||
|
|
||||||
@@ -388,7 +346,6 @@ font, an error node will be returned.
|
|||||||
|
|
||||||
Possible values for hint-style are none, slight or full.
|
Possible values for hint-style are none, slight or full.
|
||||||
Possible value for antialias are none or gray.
|
Possible value for antialias are none or gray.
|
||||||
Possible value for hint-metrics are on or off.
|
|
||||||
|
|
||||||
### texture
|
### texture
|
||||||
|
|
@@ -5,11 +5,8 @@ Title: Cairo interaction
|
|||||||
[Cairo](http://cairographics.org) is a graphics library that supports vector
|
[Cairo](http://cairographics.org) is a graphics library that supports vector
|
||||||
graphics and image compositing that can be used with GTK.
|
graphics and image compositing that can be used with GTK.
|
||||||
|
|
||||||
GDK does not wrap the Cairo API and it is not possible to use cairo directly
|
GDK does not wrap the Cairo API; instead it allows to create Cairo
|
||||||
to draw on a [class@Gdk.Surface]. You can either use a
|
drawing contexts which can be used to draw on [class@Gdk.Surface]s.
|
||||||
[GtkDrawingArea](../gtk4/class.DrawingArea.html) widget or
|
|
||||||
[gtk_snapshot_append_cairo](../gtk4/func.Snapshot.append_cairo.html)
|
|
||||||
for drawing with cairo in a GTK4 application.
|
|
||||||
|
|
||||||
Additional functions allow use [struct@Gdk.Rectangle]s with Cairo
|
Additional functions allow use [struct@Gdk.Rectangle]s with Cairo
|
||||||
and to use [struct@Gdk.RGBA], `GdkPixbuf`, and [class@Gdk.Surface]
|
and to use [struct@Gdk.RGBA], `GdkPixbuf`, and [class@Gdk.Surface]
|
||||||
|
@@ -111,11 +111,3 @@ content_images = [
|
|||||||
]
|
]
|
||||||
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gdk/"
|
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gdk/"
|
||||||
urlmap_file = "urlmap.js"
|
urlmap_file = "urlmap.js"
|
||||||
|
|
||||||
[[object]]
|
|
||||||
name = "DECLARE_INTERNAL_TYPE"
|
|
||||||
hidden = true
|
|
||||||
|
|
||||||
[[object]]
|
|
||||||
pattern = "KEY_*"
|
|
||||||
check_ignore = true
|
|
||||||
|
@@ -29,18 +29,6 @@ if get_option('documentation')
|
|||||||
install_dir: docs_dir,
|
install_dir: docs_dir,
|
||||||
)
|
)
|
||||||
|
|
||||||
test('doc-check-gdk',
|
|
||||||
gidocgen,
|
|
||||||
args: [
|
|
||||||
'check',
|
|
||||||
'--config', gdk4_toml,
|
|
||||||
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gtk'),
|
|
||||||
gdk_gir[0],
|
|
||||||
],
|
|
||||||
depends: gdk_gir[0],
|
|
||||||
suite: ['docs'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if x11_enabled
|
if x11_enabled
|
||||||
gdk4x11_toml = configure_file(
|
gdk4x11_toml = configure_file(
|
||||||
input: 'gdk4-x11.toml.in',
|
input: 'gdk4-x11.toml.in',
|
||||||
@@ -99,17 +87,5 @@ if get_option('documentation')
|
|||||||
install: true,
|
install: true,
|
||||||
install_dir: docs_dir,
|
install_dir: docs_dir,
|
||||||
)
|
)
|
||||||
|
|
||||||
test('doc-check-gdk-wayland',
|
|
||||||
gidocgen,
|
|
||||||
args: [
|
|
||||||
'check',
|
|
||||||
'--config', gdk4wayland_toml,
|
|
||||||
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gtk'),
|
|
||||||
gdk_wayland_gir[0],
|
|
||||||
],
|
|
||||||
depends: gdk_wayland_gir[0],
|
|
||||||
suite: ['docs'],
|
|
||||||
)
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@@ -66,7 +66,3 @@ content_images = [
|
|||||||
]
|
]
|
||||||
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gsk/"
|
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gsk/"
|
||||||
urlmap_file = "urlmap.js"
|
urlmap_file = "urlmap.js"
|
||||||
|
|
||||||
[[object]]
|
|
||||||
name = "INCLUDE_WARNING"
|
|
||||||
hidden = true
|
|
||||||
|
@@ -30,16 +30,4 @@ if get_option('documentation')
|
|||||||
install: true,
|
install: true,
|
||||||
install_dir: docs_dir,
|
install_dir: docs_dir,
|
||||||
)
|
)
|
||||||
|
|
||||||
test('doc-check-gsk',
|
|
||||||
gidocgen,
|
|
||||||
args: [
|
|
||||||
'check',
|
|
||||||
'--config', gsk4_toml,
|
|
||||||
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gtk'),
|
|
||||||
gsk_gir[0],
|
|
||||||
],
|
|
||||||
depends: gsk_gir[0],
|
|
||||||
suite: ['docs'],
|
|
||||||
)
|
|
||||||
endif
|
endif
|
||||||
|
@@ -140,7 +140,7 @@ Other libraries are maintained separately.
|
|||||||
file formats. It is available [here](ttps://download.gnome.org/sources/gdk-pixbuf/).
|
file formats. It is available [here](ttps://download.gnome.org/sources/gdk-pixbuf/).
|
||||||
- [Pango](http://www.pango.org) is a library for internationalized
|
- [Pango](http://www.pango.org) is a library for internationalized
|
||||||
text handling. It is available [here](https://download.gnome.org/sources/pango/).
|
text handling. It is available [here](https://download.gnome.org/sources/pango/).
|
||||||
- [GObject Introspection](https://gitlab.gnome.org/GNOME/gobject-introspection)
|
- [GObject Introspection](https://wiki.gnome.org/Projects/GObjectIntrospection)
|
||||||
is a framework for making introspection data available to language
|
is a framework for making introspection data available to language
|
||||||
bindings. It is available [here](https://download.gnome.org/sources/gobject-introspection/).
|
bindings. It is available [here](https://download.gnome.org/sources/gobject-introspection/).
|
||||||
- The [GNU libiconv](https://www.gnu.org/software/libiconv/) library
|
- The [GNU libiconv](https://www.gnu.org/software/libiconv/) library
|
||||||
|
@@ -74,7 +74,6 @@ in a selector, widget names must be prefixed with a # character.
|
|||||||
| E:not(selector) | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#negation) | |
|
| E:not(selector) | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#negation) | |
|
||||||
| E:dir(ltr), E:dir(rtl) | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#the-dir-pseudo) | |
|
| E:dir(ltr), E:dir(rtl) | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#the-dir-pseudo) | |
|
||||||
| E:drop(active) | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#drag-pseudos) | |
|
| E:drop(active) | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#drag-pseudos) | |
|
||||||
| E:root | [CSS Selector Level 3](https://www.w3.org/TR/selectors-3/#root-pseudo) | |
|
|
||||||
| E F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#descendent-combinators) | |
|
| E F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#descendent-combinators) | |
|
||||||
| E > F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#child-combinators) | |
|
| E > F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#child-combinators) | |
|
||||||
| E ~ F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#general-sibling-combinators) | |
|
| E ~ F | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#general-sibling-combinators) | |
|
||||||
|
@@ -15,16 +15,16 @@ spec.
|
|||||||
The following units are supported for basic datatypes:
|
The following units are supported for basic datatypes:
|
||||||
|
|
||||||
Length
|
Length
|
||||||
: px, pt, em, ex, rem, pc, in, cm, mm
|
: px, pt, em, ex, rem, pc, in, cm, mm, calc()
|
||||||
|
|
||||||
Percentage
|
Percentage
|
||||||
: %
|
: %, calc()
|
||||||
|
|
||||||
Angle
|
Angle
|
||||||
: deg, rad, grad, turn
|
: deg, grad, turn, calc()
|
||||||
|
|
||||||
Time
|
Time
|
||||||
: s, ms
|
: s, ms, calc()
|
||||||
|
|
||||||
Length values with the em or ex units are resolved using the font
|
Length values with the em or ex units are resolved using the font
|
||||||
size value, unless they occur in setting the font-size itself, in
|
size value, unless they occur in setting the font-size itself, in
|
||||||
@@ -33,15 +33,11 @@ which case they are resolved using the inherited font size value.
|
|||||||
The rem unit is resolved using the initial font size value, which is
|
The rem unit is resolved using the initial font size value, which is
|
||||||
not quite the same as the CSS definition of rem.
|
not quite the same as the CSS definition of rem.
|
||||||
|
|
||||||
Length values using physical units (pt, pc, in, cm, mm) are translated
|
The calc() notation adds considerable expressive power. There are limits
|
||||||
to px using the dpi value specified by the -gtk-dpi property, which is
|
on what types can be combined in such an expression (e.g. it does not make
|
||||||
different from the CSS definition, which uses a fixed dpi of 96.
|
sense to add a number and a time). For the full details, see the
|
||||||
|
[CSS3 Values and Units](https://www.w3.org/TR/css3-values/#calc-notation)
|
||||||
The calc() notation adds considerable expressive power to all of these
|
spec.
|
||||||
datatypes. There are limits on what types can be combined in such an
|
|
||||||
expression (e.g. it does not make sense to add a number and a time).
|
|
||||||
For the full details, see the
|
|
||||||
[CSS Values and Units](https://www.w3.org/TR/css-values-4/) spec.
|
|
||||||
|
|
||||||
A common pattern among shorthand properties (called 'four sides') is one
|
A common pattern among shorthand properties (called 'four sides') is one
|
||||||
where one to four values can be specified, to determine a value for each
|
where one to four values can be specified, to determine a value for each
|
||||||
@@ -60,80 +56,38 @@ follows:
|
|||||||
1 value:
|
1 value:
|
||||||
: all
|
: all
|
||||||
|
|
||||||
## Custom Properties
|
|
||||||
|
|
||||||
GTK supports custom properties as defined in the
|
|
||||||
[CSS Custom Properties for Cascading Variables](https://www.w3.org/TR/css-variables-1)
|
|
||||||
spec.
|
|
||||||
|
|
||||||
Custom properties are defined as follows:
|
|
||||||
|
|
||||||
```css
|
|
||||||
--prop: red;
|
|
||||||
```
|
|
||||||
|
|
||||||
and used via the `var` keyword:
|
|
||||||
|
|
||||||
```css
|
|
||||||
color: var(--prop);
|
|
||||||
```
|
|
||||||
|
|
||||||
Custom properties can have a fallback for when the referred property is invalid:
|
|
||||||
|
|
||||||
```css
|
|
||||||
color: var(--prop, green);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
### CSS Colors
|
GTK extends the CSS syntax with several additional ways to specify colors.
|
||||||
|
|
||||||
Colors can be expressed in numerous ways in CSS (see the
|
|
||||||
[Color Module](https://www.w3.org/TR/css-color-5/). GTK supports
|
|
||||||
many (but not all) of these.
|
|
||||||
|
|
||||||
You can use rgb(), rgba(), hsl() with both the legacy or the modern CSS
|
|
||||||
syntax, and calc() can be used as well in color expressions. hwb(), oklab(),
|
|
||||||
oklch(), color(), color-mix() and relative colors are supported as well.
|
|
||||||
|
|
||||||
### Non-CSS Colors
|
|
||||||
|
|
||||||
GTK extends the CSS syntax with several additional ways to specify colors.
|
|
||||||
|
|
||||||
These extensions are deprecated and should be replaced by the equivalent
|
|
||||||
standard CSS notions.
|
|
||||||
|
|
||||||
The first is a reference to a color defined via a @define-color rule in CSS.
|
The first is a reference to a color defined via a @define-color rule in CSS.
|
||||||
The syntax for @define-color rules is as follows:
|
The syntax for @define-color rules is as follows:
|
||||||
|
|
||||||
```
|
```
|
||||||
@define-color name color
|
@define-color Name Color
|
||||||
```
|
```
|
||||||
|
|
||||||
To refer to the color defined by a @define-color rule, prefix the name with @.
|
To refer to the color defined by a @define-color rule, prefix the name with @.
|
||||||
|
|
||||||
The standard CSS mechanisms that should be used instead of @define-color are
|
|
||||||
custom properties, :root and var().
|
|
||||||
|
|
||||||
GTK also supports color expressions, which allow colors to be transformed to
|
GTK also supports color expressions, which allow colors to be transformed to
|
||||||
new ones. Color expressions can be nested, providing a rich language to
|
new ones. Color expressions can be nested, providing a rich language to
|
||||||
define colors. Color expressions resemble functions, taking 1 or more colors
|
define colors. Color expressions resemble functions, taking 1 or more colors
|
||||||
and in some cases a number as arguments.
|
and in some cases a number as arguments.
|
||||||
|
|
||||||
`lighter(color)`
|
`lighter(Color)`
|
||||||
: produces a brighter variant of `color`.
|
: produces a brighter variant of Color
|
||||||
|
|
||||||
`darker(color)`
|
`darker(Color)`
|
||||||
: produces a darker variant of `color`.
|
: produces a darker variant of Color
|
||||||
|
|
||||||
`shade(color, number)`
|
`shade(Color, Number)`
|
||||||
: changes the lightness of `color`. The `number` ranges from 0 for black to 2 for white.
|
: changes the lightness of Color. The number ranges from 0 for black to 2 for white.
|
||||||
|
|
||||||
`alpha(color, number)`
|
`alpha(Color, Number)`
|
||||||
: multiplies the alpha value of `color` by `number` (between 0 and 1).
|
: replaces the alpha value of color with number (between 0 and 1)
|
||||||
|
|
||||||
`mix(color1, color2, number)`
|
`mix(Color1, Color2, Number)`
|
||||||
: interpolates between the two colors.
|
: interpolates between the two colors
|
||||||
|
|
||||||
## Images
|
## Images
|
||||||
|
|
||||||
@@ -141,7 +95,7 @@ GTK extends the CSS syntax for images and also uses it for specifying icons.
|
|||||||
To load a themed icon, use
|
To load a themed icon, use
|
||||||
|
|
||||||
```
|
```
|
||||||
-gtk-icontheme(name)
|
-gtk-icontheme(Name)
|
||||||
```
|
```
|
||||||
|
|
||||||
The specified icon name is used to look up a themed icon, while taking into
|
The specified icon name is used to look up a themed icon, while taking into
|
||||||
@@ -170,14 +124,14 @@ and the
|
|||||||
syntax makes this available. -gtk-recolor requires a url as first argument.
|
syntax makes this available. -gtk-recolor requires a url as first argument.
|
||||||
The remaining arguments specify the color palette to use. If the palette is
|
The remaining arguments specify the color palette to use. If the palette is
|
||||||
not explicitly specified, the current value of the -gtk-icon-palette property
|
not explicitly specified, the current value of the -gtk-icon-palette property
|
||||||
is used.
|
is used.
|
||||||
|
|
||||||
GTK supports scaled rendering on hi-resolution displays. This works best if
|
GTK supports scaled rendering on hi-resolution displays. This works best if
|
||||||
images can specify normal and hi-resolution variants. From CSS, this can be
|
images can specify normal and hi-resolution variants. From CSS, this can be
|
||||||
done with
|
done with
|
||||||
|
|
||||||
```
|
```
|
||||||
-gtk-scaled(image1, image2)
|
-gtk-scaled(Image1, Image2)
|
||||||
```
|
```
|
||||||
|
|
||||||
## GTK CSS Properties
|
## GTK CSS Properties
|
||||||
|
@@ -99,15 +99,16 @@ reaches the requested phase. However, in practice most things
|
|||||||
happen at higher levels:
|
happen at higher levels:
|
||||||
|
|
||||||
- If you are doing an animation, you can use
|
- If you are doing an animation, you can use
|
||||||
[method@Gtk.Widget.add_tick_callback] which will cause a regular
|
gtk_widget_add_tick_callback() which will cause a regular
|
||||||
beating of the clock with a callback in the Update phase
|
beating of the clock with a callback in the Update phase
|
||||||
until you stop the tick.
|
until you stop the tick.
|
||||||
- If some state changes that causes the size of your widget to
|
- If some state changes that causes the size of your widget to
|
||||||
change you call [method@Gtk.Widget.queue_resize] which will request
|
change you call gtk_widget_queue_resize() which will request
|
||||||
a Layout phase and mark your widget as needing relayout.
|
a Layout phase and mark your widget as needing relayout.
|
||||||
- If some state changes so you need to redraw your widget you
|
- If some state changes so you need to redraw some area of
|
||||||
use [method@Gtk.Widget.queue_draw] to request a Paint phase for
|
your widget you use the normal gtk_widget_queue_draw()
|
||||||
your widget.
|
set of functions. These will request a Paint phase and
|
||||||
|
mark the region as needing redraw.
|
||||||
|
|
||||||
There are also a lot of implicit triggers of these from the
|
There are also a lot of implicit triggers of these from the
|
||||||
CSS layer (which does animations, resizes and repaints as needed).
|
CSS layer (which does animations, resizes and repaints as needed).
|
||||||
|
@@ -245,6 +245,9 @@ to connect the "clicked" signal with [method@Gtk.Window.destroy], then the funct
|
|||||||
would be called on `button` (which would not go well, since the function expects
|
would be called on `button` (which would not go well, since the function expects
|
||||||
a `GtkWindow` as argument).
|
a `GtkWindow` as argument).
|
||||||
|
|
||||||
|
More information about creating buttons can be found
|
||||||
|
[here](https://wiki.gnome.org/HowDoI/Buttons).
|
||||||
|
|
||||||
The rest of the code in `example-1.c` is identical to `example-0.c`. The next
|
The rest of the code in `example-1.c` is identical to `example-0.c`. The next
|
||||||
section will elaborate further on how to add several [class@Gtk.Widget]s to your
|
section will elaborate further on how to add several [class@Gtk.Widget]s to your
|
||||||
GTK application.
|
GTK application.
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-broadwayd
|
|||||||
The Broadway display server
|
The Broadway display server
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
| **gtk4-broadwayd** [OPTIONS...] <DISPLAY>
|
| **gtk4-broadwayd** [OPTIONS...] <DISPLAY>
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-builder-tool
|
|||||||
GtkBuilder File Utility
|
GtkBuilder File Utility
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
| **gtk4-builder-tool** <COMMAND> [OPTIONS...] <FILE>
|
| **gtk4-builder-tool** <COMMAND> [OPTIONS...] <FILE>
|
||||||
|
@@ -8,9 +8,6 @@ gtk4-demo-application
|
|||||||
Demonstrate GtkApplication
|
Demonstrate GtkApplication
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-demo
|
|||||||
Demonstrate GTK widgets
|
Demonstrate GTK widgets
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-encode-symbolic-svg
|
|||||||
Symbolic icon conversion utility
|
Symbolic icon conversion utility
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-icon-browser
|
|||||||
List themed icons
|
List themed icons
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -1,97 +0,0 @@
|
|||||||
.. _gtk4-image-tool(1):
|
|
||||||
|
|
||||||
====================
|
|
||||||
gtk4-image-tool
|
|
||||||
====================
|
|
||||||
|
|
||||||
-----------------------
|
|
||||||
Image Utility
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
--------
|
|
||||||
| **gtk4-image-tool** <COMMAND> [OPTIONS...] <FILE>...
|
|
||||||
|
|
|
||||||
| **gtk4-image-tool** compare [OPTIONS...] <FILE1> <FILE2>
|
|
||||||
| **gtk4-image-tool** convert [OPTIONS...] <FILE1> <FILE2>
|
|
||||||
| **gtk4-image-tool** info [OPTIONS...] <FILE>
|
|
||||||
| **gtk4-image-tool** relabel [OPTIONS...] <FILE1> <FILE2>
|
|
||||||
| **gtk4-image-tool** show [OPTIONS...] <FILE>...
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
-----------
|
|
||||||
|
|
||||||
``gtk4-image-tool`` can perform various operations on images.
|
|
||||||
|
|
||||||
COMMANDS
|
|
||||||
--------
|
|
||||||
|
|
||||||
Information
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
The ``info`` command shows general information about the image, such
|
|
||||||
as its format and color state.
|
|
||||||
|
|
||||||
Showing
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
The ``show`` command displays one or more images, side-by-side.
|
|
||||||
|
|
||||||
``--undecorated``
|
|
||||||
|
|
||||||
Removes window decorations. This is meant for rendering of exactly the image
|
|
||||||
without any titlebar.
|
|
||||||
|
|
||||||
Compare
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
The ``compare`` command compares two images. If any differences are found,
|
|
||||||
the exit code is 1. If the images are identical, it is 0.
|
|
||||||
|
|
||||||
``--output=FILE``
|
|
||||||
|
|
||||||
Save the differences as a png image in ``FILE``.
|
|
||||||
|
|
||||||
``--quiet``
|
|
||||||
|
|
||||||
Don't write results to stdout.
|
|
||||||
|
|
||||||
Conversion
|
|
||||||
^^^^^^^^^^
|
|
||||||
|
|
||||||
The ``convert`` command converts the image to a different format or color state.
|
|
||||||
|
|
||||||
``--format=FORMAT``
|
|
||||||
|
|
||||||
Convert to the given format. The supported formats can be listed
|
|
||||||
with ``--format=list``.
|
|
||||||
|
|
||||||
``--color-state=COLORSTATE``
|
|
||||||
|
|
||||||
Convert to the given color state. The supported color states can be
|
|
||||||
listed with ``--format=list``.
|
|
||||||
|
|
||||||
``--cicp=CICP``
|
|
||||||
|
|
||||||
Convert to a color state that is specified as a cicp tuple. The cicp tuple
|
|
||||||
must be specified as four numbers, separated by /, e.g. 1/13/6/0.
|
|
||||||
|
|
||||||
Relabeling
|
|
||||||
^^^^^^^^^^
|
|
||||||
|
|
||||||
The ``relabel`` command changes the color state of an image without conversion.
|
|
||||||
This can be useful to produce wrong color renderings for diagnostics.
|
|
||||||
|
|
||||||
``--color-state=COLORSTATE``
|
|
||||||
|
|
||||||
Relabel to the given color state. The supported color states can be
|
|
||||||
listed with ``--format=list``.
|
|
||||||
|
|
||||||
``--cicp=CICP``
|
|
||||||
|
|
||||||
Relabel to a color state that is specified as a cicp tuple. The cicp tuple
|
|
||||||
must be specified as four numbers, separated by /, e.g. 1/13/6/0.
|
|
@@ -8,10 +8,6 @@ gtk4-launch
|
|||||||
Launch an application
|
Launch an application
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-node-editor
|
|||||||
Editor render nodes
|
Editor render nodes
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-path-tool
|
|||||||
GskPath Utility
|
GskPath Utility
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
| **gtk4-path-tool** <COMMAND> [OPTIONS...] <PATH>
|
| **gtk4-path-tool** <COMMAND> [OPTIONS...] <PATH>
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-query-settings
|
|||||||
Print name and value of GTK settings
|
Print name and value of GTK settings
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,17 +8,12 @@ gtk4-rendernode-tool
|
|||||||
GskRenderNode Utility
|
GskRenderNode Utility
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
| **gtk4-rendernode-tool** <COMMAND> [OPTIONS...] <FILE>
|
| **gtk4-rendernode-tool** <COMMAND> [OPTIONS...] <FILE>
|
||||||
|
|
|
|
||||||
| **gtk4-rendernode-tool** benchmark [OPTIONS...] <FILE>
|
| **gtk4-rendernode-tool** benchmark [OPTIONS...] <FILE>
|
||||||
| **gtk4-rendernode-tool** compare [OPTIONS...] <FILE1> <FILE2>
|
| **gtk4-rendernode-tool** compare [OPTIONS...] <FILE1> <FILE2>
|
||||||
| **gtk4-rendernode-tool** extract [OPTIONS...] <FILE>
|
|
||||||
| **gtk4-rendernode-tool** info [OPTIONS...] <FILE>
|
| **gtk4-rendernode-tool** info [OPTIONS...] <FILE>
|
||||||
| **gtk4-rendernode-tool** render [OPTIONS...] <FILE> [<FILE>]
|
| **gtk4-rendernode-tool** render [OPTIONS...] <FILE> [<FILE>]
|
||||||
| **gtk4-rendernode-tool** show [OPTIONS...] <FILE>
|
| **gtk4-rendernode-tool** show [OPTIONS...] <FILE>
|
||||||
@@ -50,14 +45,13 @@ without any titlebar.
|
|||||||
Rendering
|
Rendering
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
|
|
||||||
The ``render`` command saves a rendering of the rendernode as a png, tiff or svg
|
The ``render`` command saves a rendering of the rendernode as a png or tiff image.
|
||||||
image or as pdf document. The name of the file to write can be specified as a second
|
The name of the file to write can be specified as a second FILE argument.
|
||||||
FILE argument.
|
|
||||||
|
|
||||||
``--renderer=RENDERER``
|
``--renderer=RENDERER``
|
||||||
|
|
||||||
Use the given renderer. Use ``--renderer=help`` to get a information
|
Use the given renderer. Use ``--renderer=help`` to get a information
|
||||||
about possible values for the ``RENDERER``.
|
about poassible values for the ``RENDERER``.
|
||||||
|
|
||||||
Benchmark
|
Benchmark
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
@@ -99,16 +93,4 @@ exit code is 1. If the images are identical, it is 0.
|
|||||||
|
|
||||||
``--quiet``
|
``--quiet``
|
||||||
|
|
||||||
Don't write results to stdout.
|
Don't write results to stdout.`
|
||||||
|
|
||||||
|
|
||||||
Extract
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
The ``extract`` command saves all the data urls found in a node file to a given
|
|
||||||
directory. The file names for the extracted files are derived from the mimetype
|
|
||||||
of the url.
|
|
||||||
|
|
||||||
``--dir=DIRECTORY``
|
|
||||||
|
|
||||||
Save extracted files in ``DIRECTORY`` (defaults to the current directory).
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-update-icon-cache
|
|||||||
Icon theme caching utility
|
Icon theme caching utility
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -8,10 +8,6 @@ gtk4-widget-factory
|
|||||||
Showcase GTK widgets and styles
|
Showcase GTK widgets and styles
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
:Version: GTK
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: GTK commands
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@@ -77,15 +77,12 @@ content_files = [
|
|||||||
"section-tree-widget.md",
|
"section-tree-widget.md",
|
||||||
"migrating-2to4.md",
|
"migrating-2to4.md",
|
||||||
"migrating-3to4.md",
|
"migrating-3to4.md",
|
||||||
"migrating-4to5.md",
|
|
||||||
"broadway.md",
|
"broadway.md",
|
||||||
"osx.md",
|
"osx.md",
|
||||||
"wayland.md",
|
"wayland.md",
|
||||||
"windows.md",
|
"windows.md",
|
||||||
"x11.md",
|
"x11.md",
|
||||||
"tools.md",
|
|
||||||
"visual_index.md",
|
"visual_index.md",
|
||||||
"node-format.md",
|
|
||||||
]
|
]
|
||||||
content_images = [
|
content_images = [
|
||||||
"../images/favicon.svg",
|
"../images/favicon.svg",
|
||||||
@@ -252,12 +249,3 @@ content_images = [
|
|||||||
]
|
]
|
||||||
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gtk/"
|
content_base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gtk/"
|
||||||
urlmap_file = "urlmap.js"
|
urlmap_file = "urlmap.js"
|
||||||
|
|
||||||
[[object]]
|
|
||||||
name = "StyleProvider"
|
|
||||||
[[object.signal]]
|
|
||||||
name = "gtk-private-changed"
|
|
||||||
hidden = true
|
|
||||||
|
|
||||||
[check]
|
|
||||||
skip_deprecated = true
|
|
||||||
|
@@ -140,11 +140,6 @@ capture phase, and key bindings locally, during the target phase.
|
|||||||
Under the hood, all shortcuts are represented as instances of `GtkShortcut`,
|
Under the hood, all shortcuts are represented as instances of `GtkShortcut`,
|
||||||
and they are managed by `GtkShortcutController`.
|
and they are managed by `GtkShortcutController`.
|
||||||
|
|
||||||
Note that GTK does not do anything to map the primary shortcut modifier
|
|
||||||
to <kbd>Command</kbd> on macOS. If you want to let your application to follow
|
|
||||||
macOS user experience conventions, you must create macOS-specific keyboard shortcuts.
|
|
||||||
The <kbd>Command</kbd> is named `Meta` (`GDK_META_MASK`) in GTK.
|
|
||||||
|
|
||||||
## Text input
|
## Text input
|
||||||
|
|
||||||
When actual text input is needed (i.e. not just keyboard shortcuts),
|
When actual text input is needed (i.e. not just keyboard shortcuts),
|
||||||
|
@@ -14,7 +14,6 @@ expand_content_md_files = [
|
|||||||
'running.md',
|
'running.md',
|
||||||
'migrating-2to4.md',
|
'migrating-2to4.md',
|
||||||
'migrating-3to4.md',
|
'migrating-3to4.md',
|
||||||
'migrating-4to5.md',
|
|
||||||
'actions.md',
|
'actions.md',
|
||||||
'input-handling.md',
|
'input-handling.md',
|
||||||
'drawing-model.md',
|
'drawing-model.md',
|
||||||
@@ -26,8 +25,7 @@ expand_content_md_files = [
|
|||||||
'section-tree-widget.md',
|
'section-tree-widget.md',
|
||||||
'section-list-widget.md',
|
'section-list-widget.md',
|
||||||
'question_index.md',
|
'question_index.md',
|
||||||
'visual_index.md',
|
'visual_index.md'
|
||||||
'tools.md',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
gtk_images = []
|
gtk_images = []
|
||||||
@@ -62,52 +60,39 @@ if get_option('documentation')
|
|||||||
build_by_default: true,
|
build_by_default: true,
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: docs_dir,
|
install_dir: docs_dir,
|
||||||
install_tag: 'doc',
|
|
||||||
)
|
|
||||||
|
|
||||||
test('doc-check-gtk',
|
|
||||||
gidocgen,
|
|
||||||
args: [
|
|
||||||
'check',
|
|
||||||
'--config', gtk4_toml,
|
|
||||||
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gtk'),
|
|
||||||
gtk_gir[0],
|
|
||||||
],
|
|
||||||
depends: gtk_gir[0],
|
|
||||||
suite: ['docs'],
|
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
rst2man = find_program('rst2man', 'rst2man.py', required: get_option('man-pages'))
|
rst2man = find_program('rst2man', 'rst2man.py', required: false)
|
||||||
rst2html5 = find_program('rst2html5', 'rst2html5.py', required: get_option('documentation'))
|
if get_option('man-pages') and not rst2man.found()
|
||||||
|
error('No rst2man found, but man pages were explicitly enabled')
|
||||||
|
endif
|
||||||
|
|
||||||
rst_files = [
|
if get_option('man-pages') and rst2man.found()
|
||||||
[ 'gtk4-broadwayd', '1' ],
|
rst_files = [
|
||||||
[ 'gtk4-builder-tool', '1' ],
|
[ 'gtk4-broadwayd', '1' ],
|
||||||
[ 'gtk4-encode-symbolic-svg', '1', ],
|
[ 'gtk4-builder-tool', '1' ],
|
||||||
[ 'gtk4-image-tool', '1' ],
|
[ 'gtk4-encode-symbolic-svg', '1', ],
|
||||||
[ 'gtk4-launch', '1', ],
|
[ 'gtk4-launch', '1', ],
|
||||||
[ 'gtk4-query-settings', '1', ],
|
[ 'gtk4-query-settings', '1', ],
|
||||||
[ 'gtk4-rendernode-tool', '1' ],
|
[ 'gtk4-rendernode-tool', '1' ],
|
||||||
[ 'gtk4-update-icon-cache', '1', ],
|
[ 'gtk4-update-icon-cache', '1', ],
|
||||||
[ 'gtk4-path-tool', '1', ],
|
[ 'gtk4-path-tool', '1', ],
|
||||||
]
|
|
||||||
|
|
||||||
if get_option('build-demos')
|
|
||||||
rst_files += [
|
|
||||||
[ 'gtk4-demo', '1', ],
|
|
||||||
[ 'gtk4-demo-application', '1', ],
|
|
||||||
[ 'gtk4-widget-factory', '1', ],
|
|
||||||
[ 'gtk4-icon-browser', '1', ],
|
|
||||||
[ 'gtk4-node-editor', '1', ],
|
|
||||||
]
|
]
|
||||||
endif
|
|
||||||
|
|
||||||
rst2x_flags = [
|
if get_option('demos')
|
||||||
'--syntax-highlight=none',
|
rst_files += [
|
||||||
]
|
[ 'gtk4-demo', '1', ],
|
||||||
|
[ 'gtk4-demo-application', '1', ],
|
||||||
|
[ 'gtk4-widget-factory', '1', ],
|
||||||
|
[ 'gtk4-icon-browser', '1', ],
|
||||||
|
[ 'gtk4-node-editor', '1', ],
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
if get_option('man-pages')
|
rst2man_flags = [
|
||||||
|
'--syntax-highlight=none',
|
||||||
|
]
|
||||||
|
|
||||||
foreach rst: rst_files
|
foreach rst: rst_files
|
||||||
man_name = rst[0]
|
man_name = rst[0]
|
||||||
@@ -118,34 +103,12 @@ if get_option('man-pages')
|
|||||||
output: '@0@.@1@'.format(man_name, man_section),
|
output: '@0@.@1@'.format(man_name, man_section),
|
||||||
command: [
|
command: [
|
||||||
rst2man,
|
rst2man,
|
||||||
rst2x_flags,
|
rst2man_flags,
|
||||||
'@INPUT@',
|
'@INPUT@',
|
||||||
],
|
],
|
||||||
capture: true,
|
capture: true,
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: get_option('mandir') / 'man@0@'.format(man_section),
|
install_dir: get_option('mandir') / 'man@0@'.format(man_section),
|
||||||
install_tag: 'doc',
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
endif
|
|
||||||
|
|
||||||
if get_option('documentation')
|
|
||||||
|
|
||||||
foreach rst: rst_files
|
|
||||||
man_name = rst[0]
|
|
||||||
|
|
||||||
custom_target(
|
|
||||||
input: '@0@.rst'.format(man_name),
|
|
||||||
output: '@0@.html'.format(man_name),
|
|
||||||
command: [
|
|
||||||
rst2html5,
|
|
||||||
rst2x_flags,
|
|
||||||
'@INPUT@',
|
|
||||||
],
|
|
||||||
capture: true,
|
|
||||||
install: true,
|
|
||||||
install_dir: docs_dir / 'gtk4',
|
|
||||||
install_tag: 'doc',
|
|
||||||
)
|
)
|
||||||
endforeach
|
endforeach
|
||||||
endif
|
endif
|
||||||
|
@@ -451,11 +451,11 @@ hint about how modifiers are expected to be used. It also promoted
|
|||||||
the use of `<Primary>` instead of `<Control>` to specify accelerators that
|
the use of `<Primary>` instead of `<Control>` to specify accelerators that
|
||||||
adapt to platform conventions.
|
adapt to platform conventions.
|
||||||
|
|
||||||
In GTK 4, the meaning of modifiers has been fixed, and applications are
|
In GTK 4, the meaning of modifiers has been fixed, and backends are
|
||||||
expected to map the platform conventions to the existing modifiers.
|
expected to map the platform conventions to the existing modifiers.
|
||||||
The expected use of modifiers in GTK 4 is:
|
The expected use of modifiers in GTK 4 is:
|
||||||
|
|
||||||
`GDK_CONTROL_MASK` (`GDK_META_MASK` on macOS)
|
`GDK_CONTROL_MASK`
|
||||||
: Primary accelerators
|
: Primary accelerators
|
||||||
|
|
||||||
`GDK_ALT_MASK`
|
`GDK_ALT_MASK`
|
||||||
@@ -464,7 +464,7 @@ The expected use of modifiers in GTK 4 is:
|
|||||||
`GDK_SHIFT_MASK`
|
`GDK_SHIFT_MASK`
|
||||||
: Extending selections
|
: Extending selections
|
||||||
|
|
||||||
`GDK_CONTROL_MASK` (`GDK_META_MASK` on macOS)
|
`GDK_CONTROL_MASK`
|
||||||
: Modifying selections
|
: Modifying selections
|
||||||
|
|
||||||
`GDK_CONTROL_MASK|GDK_ALT_MASK`
|
`GDK_CONTROL_MASK|GDK_ALT_MASK`
|
||||||
@@ -473,15 +473,9 @@ The expected use of modifiers in GTK 4 is:
|
|||||||
Consequently, `GdkModifierIntent` and related APIs have been removed,
|
Consequently, `GdkModifierIntent` and related APIs have been removed,
|
||||||
and `<Control>` is preferred over `<Primary>` in accelerators.
|
and `<Control>` is preferred over `<Primary>` in accelerators.
|
||||||
|
|
||||||
In GTK 3 on macOS, the `<Primary>` modifier mapped to the <kbd>Command</kbd> key.
|
|
||||||
In GTK 4, this is no longer the case: `<Primary>` is synonymous to `<Control>`.
|
|
||||||
If you want to make your application to feel native on macOS,
|
|
||||||
you need to add accelerators for macOS that use the `<Meta>` modifier.
|
|
||||||
|
|
||||||
A related change is that GTK 4 no longer supports the use of archaic
|
A related change is that GTK 4 no longer supports the use of archaic
|
||||||
X11 'real' modifiers with the names Mod1,..., Mod5, and `GDK_MOD1_MASK`
|
X11 'real' modifiers with the names Mod1,..., Mod5, and `GDK_MOD1_MASK`
|
||||||
has been renamed to `GDK_ALT_MASK` and `GDK_MOD2_MASK` has been renamed to
|
has been renamed to `GDK_ALT_MASK`.
|
||||||
`GDK_META_MASK`.
|
|
||||||
|
|
||||||
### Replace `GtkClipboard` with `GdkClipboard`
|
### Replace `GtkClipboard` with `GdkClipboard`
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ use a GtkLabel.
|
|||||||
If you have a need for custom drawing that fits into the current
|
If you have a need for custom drawing that fits into the current
|
||||||
(dark or light) theme, e.g. for rendering a graph, you can still
|
(dark or light) theme, e.g. for rendering a graph, you can still
|
||||||
get the current style foreground color, using
|
get the current style foreground color, using
|
||||||
[method@Gtk.Widget.get_color].
|
[method@Gtk.Widget.get_style_color].
|
||||||
|
|
||||||
## Local stylesheets are going away
|
## Local stylesheets are going away
|
||||||
|
|
||||||
@@ -73,103 +73,6 @@ GTK 5 will no longer provide this functionality. The recommendations
|
|||||||
is to use a global stylesheet (i.e. gtk_style_context_add_provider_for_display())
|
is to use a global stylesheet (i.e. gtk_style_context_add_provider_for_display())
|
||||||
and rely on style classes to make your CSS apply only where desired.
|
and rely on style classes to make your CSS apply only where desired.
|
||||||
|
|
||||||
## Non-standard CSS extensions are going away
|
|
||||||
|
|
||||||
GTK's CSS machinery has a some non-standard extensions around colors:
|
|
||||||
named colors with \@define-color and color functions: lighter(), darker(),
|
|
||||||
shade(), alpha(), mix().
|
|
||||||
|
|
||||||
GTK now implements equivalent functionality from the CSS specs.
|
|
||||||
|
|
||||||
### \@define-color is going away
|
|
||||||
|
|
||||||
\@define-color should be replaced by custom properties in the :root scope.
|
|
||||||
|
|
||||||
Instead of
|
|
||||||
|
|
||||||
```
|
|
||||||
@define-color fg_color #2e3436
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
box {
|
|
||||||
color: @fg_color;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
use
|
|
||||||
|
|
||||||
```
|
|
||||||
:root {
|
|
||||||
--fg-color: #2e3436;
|
|
||||||
}
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
box {
|
|
||||||
color: var(--fg-color);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
For more information about custom CSS properties and variables, see the
|
|
||||||
[CSS Custom Properties for Cascading Variables](https://www.w3.org/TR/css-variables-1/)
|
|
||||||
spec.
|
|
||||||
|
|
||||||
### Color expressions are going away
|
|
||||||
|
|
||||||
The color functions can all be replaced by combinations of calc() and color-mix().
|
|
||||||
|
|
||||||
ligher(c) and darker(c) are just shade(c, 1.3) or shade(c, 0.7), respectively, and
|
|
||||||
thus can be handled the same way as shade in the examples below.
|
|
||||||
|
|
||||||
Replace
|
|
||||||
|
|
||||||
```
|
|
||||||
a {
|
|
||||||
color: mix(red, green, 0.8);
|
|
||||||
}
|
|
||||||
|
|
||||||
b {
|
|
||||||
color: alpha(green, 0.6);
|
|
||||||
}
|
|
||||||
|
|
||||||
c {
|
|
||||||
color: shade(red, 1.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
d {
|
|
||||||
color: shade(red, 0.7);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
with
|
|
||||||
|
|
||||||
```
|
|
||||||
a {
|
|
||||||
color: color-mix(in srgb, red, green 80%);
|
|
||||||
}
|
|
||||||
|
|
||||||
b {
|
|
||||||
color: rgb(from green, r g b / calc(alpha * 0.6));
|
|
||||||
}
|
|
||||||
|
|
||||||
c {
|
|
||||||
color: hsl(from red, h calc(s * 1.3) calc(l * 1.3));
|
|
||||||
}
|
|
||||||
|
|
||||||
d {
|
|
||||||
color: hsl(from red, h calc(s * 0.7) calc(l * 0.7));
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Variations of these replacements are possible.
|
|
||||||
|
|
||||||
Note that GTK has historically computed mix() and shade() values in the SRGB and HSL
|
|
||||||
colorspaces, but using OKLAB instead might yield slightly better results.
|
|
||||||
|
|
||||||
For more information about color-mix(), see the
|
|
||||||
[CSS Color](https://drafts.csswg.org/css-color-5) spec.
|
|
||||||
|
|
||||||
## Chooser interfaces are going away
|
## Chooser interfaces are going away
|
||||||
|
|
||||||
The GtkColorChooser, GtkFontChooser, GtkFileChooser and GtkAppChooser
|
The GtkColorChooser, GtkFontChooser, GtkFileChooser and GtkAppChooser
|
||||||
|
@@ -7,5 +7,5 @@ on top of the Quartz API.
|
|||||||
Currently, the macOS port does not use any additional commandline options
|
Currently, the macOS port does not use any additional commandline options
|
||||||
or environment variables.
|
or environment variables.
|
||||||
|
|
||||||
For up-to-date information on building, installation, and bundling, see the
|
For up-to-date information about the current status of this port, see the
|
||||||
[GTK website](https://www.gtk.org/docs/installations/macos).
|
[project page](https://wiki.gnome.org/Projects/GTK/OSX).
|
||||||
|
@@ -58,12 +58,12 @@ GTK is divided into three parts:
|
|||||||
storage types for efficient use in GUI applications, and much more.
|
storage types for efficient use in GUI applications, and much more.
|
||||||
|
|
||||||
[gnu-lgpl]: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
|
[gnu-lgpl]: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
|
||||||
[glib]: https://docs.gtk.org/glib/
|
[glib]: https://developer.gnome.org/glib/stable/
|
||||||
[gobject]: https://docs.gtk.org/gobject/
|
[gobject]: https://developer.gnome.org/gobject/stable/
|
||||||
[gio]: https://docs.gtk.org/gio/
|
[gio]: https://developer.gnome.org/gio/stable/
|
||||||
[cairo]: https://www.cairographics.org/manual/
|
[cairo]: https://www.cairographics.org/manual/
|
||||||
[opengl]: https://www.opengl.org/about/
|
[opengl]: https://www.opengl.org/about/
|
||||||
[vulkan]: https://www.vulkan.org/
|
[vulkan]: https://www.vulkan.org/
|
||||||
[pango]: https://docs.gtk.org/Pango/
|
[pango]: https://pango.gnome.org/
|
||||||
[gdkpixbuf]: https://docs.gtk.org/gdk-pixbuf/
|
[gdkpixbuf]: https://developer.gnome.org/gdk-pixbuf/stable/
|
||||||
[graphene]: https://ebassi.github.io/graphene/
|
[graphene]: https://ebassi.github.io/graphene/
|
||||||
|
@@ -5,12 +5,10 @@ Slug: gtk-running
|
|||||||
|
|
||||||
GTK inspects a number of environment variables in addition to
|
GTK inspects a number of environment variables in addition to
|
||||||
standard variables like `LANG`, `PATH`, `HOME` or `DISPLAY`; mostly
|
standard variables like `LANG`, `PATH`, `HOME` or `DISPLAY`; mostly
|
||||||
to determine paths to look for certain files. The
|
to determine paths to look for certain files. The [X11](#x11-envar),
|
||||||
[X11](https://docs.gtk.org/gtk4/x11.html#x11-specific-environment-variables),
|
[Wayland](#wayland-envar), [Windows](#win32-envar) and
|
||||||
[Wayland](https://docs.gtk.org/gtk4/wayland.html#wayland-specific-environment-variables),
|
[Broadway](#broadway-envar) GDK backends use some additional
|
||||||
[Windows](https://docs.gtk.org/gtk4/windows.html#windows-specific-environment-variables) and
|
environment variables.
|
||||||
[Broadway](https://docs.gtk.org/gtk4/broadway.html#broadway-specific-environment-variables)
|
|
||||||
GDK backends use some additional environment variables.
|
|
||||||
|
|
||||||
Note that environment variables are generally used for debugging
|
Note that environment variables are generally used for debugging
|
||||||
purposes. They are not guaranteed to be API stable, and should not
|
purposes. They are not guaranteed to be API stable, and should not
|
||||||
@@ -219,10 +217,6 @@ A number of options affect behavior instead of logging:
|
|||||||
`no-portals`
|
`no-portals`
|
||||||
: Disable use of [portals](https://docs.flatpak.org/en/latest/portals.html)
|
: Disable use of [portals](https://docs.flatpak.org/en/latest/portals.html)
|
||||||
|
|
||||||
`force-offload`
|
|
||||||
: Force graphics offload for all textures, even when slower. This allows
|
|
||||||
to debug offloading in the absence of dmabufs.
|
|
||||||
|
|
||||||
`gl-disable`
|
`gl-disable`
|
||||||
: Disable OpenGL support
|
: Disable OpenGL support
|
||||||
|
|
||||||
@@ -292,8 +286,8 @@ are only available when GTK has been configured with `-Ddebug=true`.
|
|||||||
`fallback`
|
`fallback`
|
||||||
: Information about fallback usage in renderers
|
: Information about fallback usage in renderers
|
||||||
|
|
||||||
`cache`
|
`glyphcache`
|
||||||
: Information about caching
|
: Information about glyph caching
|
||||||
|
|
||||||
`verbose`
|
`verbose`
|
||||||
: Print verbose output while rendering
|
: Print verbose output while rendering
|
||||||
|
@@ -155,7 +155,6 @@ Each property name is part of the `GtkAccessibleProperty` enumeration.
|
|||||||
| %GTK_ACCESSIBLE_PROPERTY_VALUE_MIN | “aria-valuemin” | double |
|
| %GTK_ACCESSIBLE_PROPERTY_VALUE_MIN | “aria-valuemin” | double |
|
||||||
| %GTK_ACCESSIBLE_PROPERTY_VALUE_NOW | “aria-valuenow” | double |
|
| %GTK_ACCESSIBLE_PROPERTY_VALUE_NOW | “aria-valuenow” | double |
|
||||||
| %GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT | “aria-valuetext” | translatable string |
|
| %GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT | “aria-valuetext” | translatable string |
|
||||||
| %GTK_ACCESSIBLE_PROPERTY_HELP_TEXT | N/A | translatable string |
|
|
||||||
|
|
||||||
#### List of accessible relations
|
#### List of accessible relations
|
||||||
|
|
||||||
@@ -217,10 +216,6 @@ are accessible as part of the development process. The GTK Inspector shows
|
|||||||
the accessible attributes of each widget, and also provides an overlay that
|
the accessible attributes of each widget, and also provides an overlay that
|
||||||
can highlight accessibility issues.
|
can highlight accessibility issues.
|
||||||
|
|
||||||
If you support some non-standard keyboard interactions for a widget, you
|
|
||||||
**should** set an appropriate `GTK_ACCESSIBLE_PROPERTY_HELP_TEXT` to help
|
|
||||||
discoverability of the behavior.
|
|
||||||
|
|
||||||
It is possible to set accessible attributes in UI files as well:
|
It is possible to set accessible attributes in UI files as well:
|
||||||
```xml
|
```xml
|
||||||
<object class="GtkButton" id="button1">
|
<object class="GtkButton" id="button1">
|
||||||
|
@@ -1,18 +0,0 @@
|
|||||||
Title: Tools and Demos
|
|
||||||
|
|
||||||
GTK ships with a number of tools and demos that come with their own
|
|
||||||
documentation in the form of man pages.
|
|
||||||
|
|
||||||
- [gtk4-broadwayd](gtk4-broadwayd.html)
|
|
||||||
- [gtk4-builder-tool](gtk4-builder-tool.html)
|
|
||||||
- [gtk4-demo](gtk4-demo.html)
|
|
||||||
- [gtk4-demo-application](gtk4-demo-application.html)
|
|
||||||
- [gtk4-encode-symbolic-svg](gtk4-encode-symbolic-svg.html)
|
|
||||||
- [gtk4-icon-browser](gtk4-icon-browser.html)
|
|
||||||
- [gtk4-launch](gtk4-launch.html)
|
|
||||||
- [gtk4-node-editor](gtk4-node-editor.html)
|
|
||||||
- [gtk4-path-tool](gtk4-path-tool.html)
|
|
||||||
- [gtk4-query-settings](gtk4-query-settings.html)
|
|
||||||
- [gtk4-rendernode-tool](gtk4-rendernode-tool.html)
|
|
||||||
- [gtk4-update-icon-cache](gtk4-update-icon-cache.html)
|
|
||||||
- [gtk4-widget-factory](gtk4-widget-factory.html)
|
|
@@ -43,7 +43,7 @@ X11 details, in particular the ICCCM and the Extended Window Manager
|
|||||||
Hints specifications. [freedesktop.org](http://www.freedesktop.org/standards/)
|
Hints specifications. [freedesktop.org](http://www.freedesktop.org/standards/)
|
||||||
has links to many relevant specifications.
|
has links to many relevant specifications.
|
||||||
|
|
||||||
The GDK manual covers [using Xlib in a GTK program](https://docs.gtk.org/gdk4/x11.html).
|
The GDK manual covers [using Xlib in a GTK program](#gdk-X-Window-System-Interaction).
|
||||||
|
|
||||||
### Server, client, window manager
|
### Server, client, window manager
|
||||||
|
|
||||||
|
@@ -91,31 +91,6 @@ const GDK_META_MASK = 1 << 28;
|
|||||||
|
|
||||||
var useDataUrls = window.location.search.includes("datauri");
|
var useDataUrls = window.location.search.includes("datauri");
|
||||||
|
|
||||||
/* check if we are on Android and using Chrome */
|
|
||||||
var isAndroidChrome = false;
|
|
||||||
{
|
|
||||||
var ua = navigator.userAgent.toLowerCase();
|
|
||||||
if (ua.indexOf("android") > -1 && ua.indexOf("chrom") > -1) {
|
|
||||||
isAndroidChrome = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* check for the passive option for Event listener */
|
|
||||||
let passiveSupported = false;
|
|
||||||
try {
|
|
||||||
const options = {
|
|
||||||
get passive() { // This function will be called when the browser
|
|
||||||
// attempts to access the passive property.
|
|
||||||
passiveSupported = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener("test", null, options);
|
|
||||||
window.removeEventListener("test", null, options);
|
|
||||||
} catch(err) {
|
|
||||||
passiveSupported = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This base64code is based on https://github.com/beatgammit/base64-js/blob/master/index.js which is MIT licensed */
|
/* This base64code is based on https://github.com/beatgammit/base64-js/blob/master/index.js which is MIT licensed */
|
||||||
|
|
||||||
var b64_lookup = [];
|
var b64_lookup = [];
|
||||||
@@ -240,32 +215,11 @@ function logStackTrace(len) {
|
|||||||
log(callstack[i]);
|
log(callstack[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper functions for touch identifier to make it unique on Android */
|
|
||||||
var globalTouchIdentifier = Math.round(Date.now() / 1000);
|
|
||||||
function touchIdentifierStart(tId)
|
|
||||||
{
|
|
||||||
if (isAndroidChrome) {
|
|
||||||
if (tId == 0) {
|
|
||||||
return ++globalTouchIdentifier;
|
|
||||||
}
|
|
||||||
return globalTouchIdentifier + tId;
|
|
||||||
}
|
|
||||||
return tId;
|
|
||||||
}
|
|
||||||
function touchIdentifier(tId)
|
|
||||||
{
|
|
||||||
if (isAndroidChrome) {
|
|
||||||
return globalTouchIdentifier + tId;
|
|
||||||
}
|
|
||||||
return tId;
|
|
||||||
}
|
|
||||||
|
|
||||||
var grab = new Object();
|
var grab = new Object();
|
||||||
grab.surface = null;
|
grab.surface = null;
|
||||||
grab.ownerEvents = false;
|
grab.ownerEvents = false;
|
||||||
grab.implicit = false;
|
grab.implicit = false;
|
||||||
var keyDownList = [];
|
var keyDownList = [];
|
||||||
var inputList = [];
|
|
||||||
var lastSerial = 0;
|
var lastSerial = 0;
|
||||||
var lastX = 0;
|
var lastX = 0;
|
||||||
var lastY = 0;
|
var lastY = 0;
|
||||||
@@ -1033,14 +987,7 @@ function handleDisplayCommands(display_commands)
|
|||||||
break;
|
break;
|
||||||
case DISPLAY_OP_DELETE_SURFACE:
|
case DISPLAY_OP_DELETE_SURFACE:
|
||||||
var id = cmd[1];
|
var id = cmd[1];
|
||||||
if (id == surfaceWithMouse) {
|
delete surfaces[id];
|
||||||
surfaceWithMouse = 0;
|
|
||||||
}
|
|
||||||
if (id == realSurfaceWithMouse) {
|
|
||||||
realSurfaceWithMouse = 0;
|
|
||||||
firstTouchDownId = null;
|
|
||||||
}
|
|
||||||
delete surfaces[id];
|
|
||||||
break;
|
break;
|
||||||
case DISPLAY_OP_CHANGE_TEXTURE:
|
case DISPLAY_OP_CHANGE_TEXTURE:
|
||||||
var image = cmd[1];
|
var image = cmd[1];
|
||||||
@@ -1424,14 +1371,8 @@ function getEffectiveEventTarget (id) {
|
|||||||
function updateKeyboardStatus() {
|
function updateKeyboardStatus() {
|
||||||
if (fakeInput != null && showKeyboardChanged) {
|
if (fakeInput != null && showKeyboardChanged) {
|
||||||
showKeyboardChanged = false;
|
showKeyboardChanged = false;
|
||||||
if (showKeyboard) {
|
if (showKeyboard)
|
||||||
if (isAndroidChrome) {
|
|
||||||
fakeInput.blur();
|
|
||||||
fakeInput.value = ' '.repeat(80); // TODO: Should be exchange with broadway server
|
|
||||||
// to bring real value here.
|
|
||||||
}
|
|
||||||
fakeInput.focus();
|
fakeInput.focus();
|
||||||
}
|
|
||||||
else
|
else
|
||||||
fakeInput.blur();
|
fakeInput.blur();
|
||||||
}
|
}
|
||||||
@@ -2983,19 +2924,6 @@ function pushKeyEvent(fev) {
|
|||||||
keyDownList.push(fev);
|
keyDownList.push(fev);
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyInputEvent(ev) {
|
|
||||||
var members = ['inputType', 'data'], i, obj = {};
|
|
||||||
for (i = 0; i < members.length; i++) {
|
|
||||||
if (typeof ev[members[i]] !== "undefined")
|
|
||||||
obj[members[i]] = ev[members[i]];
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function pushInputEvent(fev) {
|
|
||||||
inputList.push(fev);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getKeyEvent(keyCode, pop) {
|
function getKeyEvent(keyCode, pop) {
|
||||||
var i, fev = null;
|
var i, fev = null;
|
||||||
for (i = keyDownList.length-1; i >= 0; i--) {
|
for (i = keyDownList.length-1; i >= 0; i--) {
|
||||||
@@ -3094,29 +3022,6 @@ function handleKeyUp(e) {
|
|||||||
keysym = fev.keysym;
|
keysym = fev.keysym;
|
||||||
else {
|
else {
|
||||||
//log("Key event (keyCode = " + ev.keyCode + ") not found on keyDownList");
|
//log("Key event (keyCode = " + ev.keyCode + ") not found on keyDownList");
|
||||||
if (isAndroidChrome && (ev.keyCode == 229)) {
|
|
||||||
var i, fev = null, len = inputList.length, str;
|
|
||||||
for (i = 0; i < len; i++) {
|
|
||||||
fev = inputList[i];
|
|
||||||
switch(fev.inputType) {
|
|
||||||
case "deleteContentBackward":
|
|
||||||
sendInput(BROADWAY_EVENT_KEY_PRESS, [65288, lastState]);
|
|
||||||
sendInput(BROADWAY_EVENT_KEY_RELEASE, [65288, lastState]);
|
|
||||||
break;
|
|
||||||
case "insertText":
|
|
||||||
if (fev.data !== undefined) {
|
|
||||||
for (let sym of fev.data) {
|
|
||||||
sendInput(BROADWAY_EVENT_KEY_PRESS, [sym.codePointAt(0), lastState]);
|
|
||||||
sendInput(BROADWAY_EVENT_KEY_RELEASE, [sym.codePointAt(0), lastState]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inputList.splice(0, len);
|
|
||||||
}
|
|
||||||
keysym = 0;
|
keysym = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3125,16 +3030,6 @@ function handleKeyUp(e) {
|
|||||||
return cancelEvent(ev);
|
return cancelEvent(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleInput (e) {
|
|
||||||
var fev = null, ev = (e ? e : window.event), keysym = null, suppress = false;
|
|
||||||
|
|
||||||
fev = copyInputEvent(ev);
|
|
||||||
pushInputEvent(fev);
|
|
||||||
|
|
||||||
// Stop keypress events just in case
|
|
||||||
return cancelEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onKeyDown (ev) {
|
function onKeyDown (ev) {
|
||||||
updateForEvent(ev);
|
updateForEvent(ev);
|
||||||
return handleKeyDown(ev);
|
return handleKeyDown(ev);
|
||||||
@@ -3150,11 +3045,6 @@ function onKeyUp (ev) {
|
|||||||
return handleKeyUp(ev);
|
return handleKeyUp(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onInput (ev) {
|
|
||||||
updateForEvent(ev);
|
|
||||||
return handleInput(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelEvent(ev)
|
function cancelEvent(ev)
|
||||||
{
|
{
|
||||||
ev = ev ? ev : window.event;
|
ev = ev ? ev : window.event;
|
||||||
@@ -3186,14 +3076,13 @@ function onMouseWheel(ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onTouchStart(ev) {
|
function onTouchStart(ev) {
|
||||||
ev.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
updateKeyboardStatus();
|
updateKeyboardStatus();
|
||||||
updateForEvent(ev);
|
updateForEvent(ev);
|
||||||
|
|
||||||
for (var i = 0; i < ev.changedTouches.length; i++) {
|
for (var i = 0; i < ev.changedTouches.length; i++) {
|
||||||
var touch = ev.changedTouches.item(i);
|
var touch = ev.changedTouches.item(i);
|
||||||
var touchId = touchIdentifierStart(touch.identifier);
|
|
||||||
|
|
||||||
var origId = getSurfaceId(touch);
|
var origId = getSurfaceId(touch);
|
||||||
var id = getEffectiveEventTarget (origId);
|
var id = getEffectiveEventTarget (origId);
|
||||||
@@ -3201,7 +3090,7 @@ function onTouchStart(ev) {
|
|||||||
var isEmulated = 0;
|
var isEmulated = 0;
|
||||||
|
|
||||||
if (firstTouchDownId == null) {
|
if (firstTouchDownId == null) {
|
||||||
firstTouchDownId = touchId;
|
firstTouchDownId = touch.identifier;
|
||||||
isEmulated = 1;
|
isEmulated = 1;
|
||||||
|
|
||||||
if (realSurfaceWithMouse != origId || id != surfaceWithMouse) {
|
if (realSurfaceWithMouse != origId || id != surfaceWithMouse) {
|
||||||
@@ -3216,54 +3105,52 @@ function onTouchStart(ev) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInput (BROADWAY_EVENT_TOUCH, [0, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
sendInput (BROADWAY_EVENT_TOUCH, [0, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTouchMove(ev) {
|
function onTouchMove(ev) {
|
||||||
ev.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
updateKeyboardStatus();
|
updateKeyboardStatus();
|
||||||
updateForEvent(ev);
|
updateForEvent(ev);
|
||||||
|
|
||||||
for (var i = 0; i < ev.changedTouches.length; i++) {
|
for (var i = 0; i < ev.changedTouches.length; i++) {
|
||||||
var touch = ev.changedTouches.item(i);
|
var touch = ev.changedTouches.item(i);
|
||||||
var touchId = touchIdentifier(touch.identifier);
|
|
||||||
|
|
||||||
var origId = getSurfaceId(touch);
|
var origId = getSurfaceId(touch);
|
||||||
var id = getEffectiveEventTarget (origId);
|
var id = getEffectiveEventTarget (origId);
|
||||||
var pos = getPositionsFromEvent(touch, id);
|
var pos = getPositionsFromEvent(touch, id);
|
||||||
|
|
||||||
var isEmulated = 0;
|
var isEmulated = 0;
|
||||||
if (firstTouchDownId == touchId) {
|
if (firstTouchDownId == touch.identifier) {
|
||||||
isEmulated = 1;
|
isEmulated = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInput (BROADWAY_EVENT_TOUCH, [1, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
sendInput (BROADWAY_EVENT_TOUCH, [1, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTouchEnd(ev) {
|
function onTouchEnd(ev) {
|
||||||
ev.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
updateKeyboardStatus();
|
updateKeyboardStatus();
|
||||||
updateForEvent(ev);
|
updateForEvent(ev);
|
||||||
|
|
||||||
for (var i = 0; i < ev.changedTouches.length; i++) {
|
for (var i = 0; i < ev.changedTouches.length; i++) {
|
||||||
var touch = ev.changedTouches.item(i);
|
var touch = ev.changedTouches.item(i);
|
||||||
var touchId = touchIdentifier(touch.identifier);
|
|
||||||
|
|
||||||
var origId = getSurfaceId(touch);
|
var origId = getSurfaceId(touch);
|
||||||
var id = getEffectiveEventTarget (origId);
|
var id = getEffectiveEventTarget (origId);
|
||||||
var pos = getPositionsFromEvent(touch, id);
|
var pos = getPositionsFromEvent(touch, id);
|
||||||
|
|
||||||
var isEmulated = 0;
|
var isEmulated = 0;
|
||||||
if (firstTouchDownId == touchId) {
|
if (firstTouchDownId == touch.identifier) {
|
||||||
isEmulated = 1;
|
isEmulated = 1;
|
||||||
firstTouchDownId = null;
|
firstTouchDownId = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInput (BROADWAY_EVENT_TOUCH, [2, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
sendInput (BROADWAY_EVENT_TOUCH, [2, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3280,11 +3167,11 @@ function setupDocument(document)
|
|||||||
document.onkeyup = onKeyUp;
|
document.onkeyup = onKeyUp;
|
||||||
|
|
||||||
if (document.addEventListener) {
|
if (document.addEventListener) {
|
||||||
document.addEventListener('DOMMouseScroll', onMouseWheel, passiveSupported ? { passive: false, capture: false } : false);
|
document.addEventListener('DOMMouseScroll', onMouseWheel, false);
|
||||||
document.addEventListener('mousewheel', onMouseWheel, passiveSupported ? { passive: false, capture: false } : false);
|
document.addEventListener('mousewheel', onMouseWheel, false);
|
||||||
document.addEventListener('touchstart', onTouchStart, passiveSupported ? { passive: false, capture: false } : false);
|
document.addEventListener('touchstart', onTouchStart, false);
|
||||||
document.addEventListener('touchmove', onTouchMove, passiveSupported ? { passive: false, capture: false } : false);
|
document.addEventListener('touchmove', onTouchMove, false);
|
||||||
document.addEventListener('touchend', onTouchEnd, passiveSupported ? { passive: false, capture: false } : false);
|
document.addEventListener('touchend', onTouchEnd, false);
|
||||||
} else if (document.attachEvent) {
|
} else if (document.attachEvent) {
|
||||||
element.attachEvent("onmousewheel", onMouseWheel);
|
element.attachEvent("onmousewheel", onMouseWheel);
|
||||||
}
|
}
|
||||||
@@ -3350,14 +3237,12 @@ function connect()
|
|||||||
};
|
};
|
||||||
|
|
||||||
var iOS = /(iPad|iPhone|iPod)/g.test( navigator.userAgent );
|
var iOS = /(iPad|iPhone|iPod)/g.test( navigator.userAgent );
|
||||||
if (iOS || isAndroidChrome) {
|
if (iOS) {
|
||||||
fakeInput = document.createElement("input");
|
fakeInput = document.createElement("input");
|
||||||
fakeInput.type = "text";
|
fakeInput.type = "text";
|
||||||
fakeInput.style.position = "absolute";
|
fakeInput.style.position = "absolute";
|
||||||
fakeInput.style.left = "-1000px";
|
fakeInput.style.left = "-1000px";
|
||||||
fakeInput.style.top = "-1000px";
|
fakeInput.style.top = "-1000px";
|
||||||
document.body.appendChild(fakeInput);
|
document.body.appendChild(fakeInput);
|
||||||
if (isAndroidChrome)
|
|
||||||
fakeInput.addEventListener('input', onInput, passiveSupported ? { passive: false, capture: false } : false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,11 +33,9 @@ gdk_broadway_cairo_context_dispose (GObject *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_broadway_cairo_context_begin_frame (GdkDrawContext *draw_context,
|
gdk_broadway_cairo_context_begin_frame (GdkDrawContext *draw_context,
|
||||||
GdkMemoryDepth depth,
|
GdkMemoryDepth depth,
|
||||||
cairo_region_t *region,
|
cairo_region_t *region)
|
||||||
GdkColorState **out_color_state,
|
|
||||||
GdkMemoryDepth *out_depth)
|
|
||||||
{
|
{
|
||||||
GdkBroadwayCairoContext *self = GDK_BROADWAY_CAIRO_CONTEXT (draw_context);
|
GdkBroadwayCairoContext *self = GDK_BROADWAY_CAIRO_CONTEXT (draw_context);
|
||||||
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self));
|
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self));
|
||||||
@@ -61,9 +59,6 @@ gdk_broadway_cairo_context_begin_frame (GdkDrawContext *draw_context,
|
|||||||
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
|
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
|
||||||
cairo_fill (cr);
|
cairo_fill (cr);
|
||||||
cairo_destroy (cr);
|
cairo_destroy (cr);
|
||||||
|
|
||||||
*out_color_state = GDK_COLOR_STATE_SRGB;
|
|
||||||
*out_depth = gdk_color_state_get_depth (GDK_COLOR_STATE_SRGB);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -33,11 +33,9 @@ gdk_broadway_draw_context_dispose (GObject *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_broadway_draw_context_begin_frame (GdkDrawContext *draw_context,
|
gdk_broadway_draw_context_begin_frame (GdkDrawContext *draw_context,
|
||||||
GdkMemoryDepth depth,
|
GdkMemoryDepth depth,
|
||||||
cairo_region_t *region,
|
cairo_region_t *region)
|
||||||
GdkColorState **out_color_state,
|
|
||||||
GdkMemoryDepth *out_depth)
|
|
||||||
{
|
{
|
||||||
GdkBroadwayDrawContext *self = GDK_BROADWAY_DRAW_CONTEXT (draw_context);
|
GdkBroadwayDrawContext *self = GDK_BROADWAY_DRAW_CONTEXT (draw_context);
|
||||||
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self));
|
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self));
|
||||||
@@ -54,9 +52,6 @@ gdk_broadway_draw_context_begin_frame (GdkDrawContext *draw_context,
|
|||||||
|
|
||||||
self->nodes = g_array_new (FALSE, FALSE, sizeof(guint32));
|
self->nodes = g_array_new (FALSE, FALSE, sizeof(guint32));
|
||||||
self->node_textures = g_ptr_array_new_with_free_func (g_object_unref);
|
self->node_textures = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
|
|
||||||
*out_color_state = GDK_COLOR_STATE_SRGB;
|
|
||||||
*out_depth = gdk_color_state_get_depth (GDK_COLOR_STATE_SRGB);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -52,7 +52,8 @@ broadwayjs_h = custom_target('broadwayjs.h',
|
|||||||
)
|
)
|
||||||
|
|
||||||
libgdk_broadway = static_library('gdk-broadway',
|
libgdk_broadway = static_library('gdk-broadway',
|
||||||
sources: [ clienthtml_h, broadwayjs_h, gdk_broadway_sources, gdk_gen_headers ],
|
clienthtml_h, broadwayjs_h,
|
||||||
|
gdk_broadway_sources, gdkconfig, gdkenum_h,
|
||||||
include_directories: [confinc, gdkinc],
|
include_directories: [confinc, gdkinc],
|
||||||
c_args: [
|
c_args: [
|
||||||
'-DGTK_COMPILATION',
|
'-DGTK_COMPILATION',
|
||||||
|
74
gdk/gdk.c
74
gdk/gdk.c
@@ -43,14 +43,6 @@
|
|||||||
|
|
||||||
#include <fribidi.h>
|
#include <fribidi.h>
|
||||||
|
|
||||||
/* GTK has a general architectural assumption that gsize is pointer-sized
|
|
||||||
* (equivalent to uintptr_t), making it non-portable to architectures like
|
|
||||||
* CHERI where that isn't true. If a future release relaxes that
|
|
||||||
* assumption, changes will be needed in numerous places.
|
|
||||||
* See also https://gitlab.gnome.org/GNOME/glib/-/issues/2842 for the
|
|
||||||
* equivalent in GLib, which would be a prerequisite. */
|
|
||||||
G_STATIC_ASSERT (sizeof (gsize) == sizeof (void *));
|
|
||||||
G_STATIC_ASSERT (G_ALIGNOF (gsize) == G_ALIGNOF (void *));
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GDK_WINDOWING_X11:
|
* GDK_WINDOWING_X11:
|
||||||
@@ -128,11 +120,8 @@ static const GdkDebugKey gdk_debug_keys[] = {
|
|||||||
{ "dmabuf", GDK_DEBUG_DMABUF, "Information about dmabuf buffers" },
|
{ "dmabuf", GDK_DEBUG_DMABUF, "Information about dmabuf buffers" },
|
||||||
{ "offload", GDK_DEBUG_OFFLOAD, "Information about subsurfaces and graphics offload" },
|
{ "offload", GDK_DEBUG_OFFLOAD, "Information about subsurfaces and graphics offload" },
|
||||||
|
|
||||||
{ "linear", GDK_DEBUG_LINEAR, "Enable linear rendering" },
|
|
||||||
{ "hdr", GDK_DEBUG_HDR, "Force HDR rendering" },
|
|
||||||
{ "portals", GDK_DEBUG_PORTALS, "Force use of portals" },
|
{ "portals", GDK_DEBUG_PORTALS, "Force use of portals" },
|
||||||
{ "no-portals", GDK_DEBUG_NO_PORTALS, "Disable use of portals" },
|
{ "no-portals", GDK_DEBUG_NO_PORTALS, "Disable use of portals" },
|
||||||
{ "force-offload", GDK_DEBUG_FORCE_OFFLOAD, "Force graphics offload for all textures" },
|
|
||||||
{ "gl-disable", GDK_DEBUG_GL_DISABLE, "Disable OpenGL support" },
|
{ "gl-disable", GDK_DEBUG_GL_DISABLE, "Disable OpenGL support" },
|
||||||
{ "gl-no-fractional", GDK_DEBUG_GL_NO_FRACTIONAL, "Disable fractional scaling for OpenGL" },
|
{ "gl-no-fractional", GDK_DEBUG_GL_NO_FRACTIONAL, "Disable fractional scaling for OpenGL" },
|
||||||
{ "gl-debug", GDK_DEBUG_GL_DEBUG, "Insert debugging information in OpenGL" },
|
{ "gl-debug", GDK_DEBUG_GL_DEBUG, "Insert debugging information in OpenGL" },
|
||||||
@@ -143,6 +132,7 @@ static const GdkDebugKey gdk_debug_keys[] = {
|
|||||||
{ "gl-glx", GDK_DEBUG_GL_GLX, "Use GLX on X11" },
|
{ "gl-glx", GDK_DEBUG_GL_GLX, "Use GLX on X11" },
|
||||||
{ "gl-wgl", GDK_DEBUG_GL_WGL, "Use WGL on Windows" },
|
{ "gl-wgl", GDK_DEBUG_GL_WGL, "Use WGL on Windows" },
|
||||||
{ "vulkan-disable", GDK_DEBUG_VULKAN_DISABLE, "Disable Vulkan support" },
|
{ "vulkan-disable", GDK_DEBUG_VULKAN_DISABLE, "Disable Vulkan support" },
|
||||||
|
{ "vulkan-validate", GDK_DEBUG_VULKAN_VALIDATE, "Load the Vulkan validation layer" },
|
||||||
{ "default-settings",GDK_DEBUG_DEFAULT_SETTINGS, "Force default values for xsettings" },
|
{ "default-settings",GDK_DEBUG_DEFAULT_SETTINGS, "Force default values for xsettings" },
|
||||||
{ "high-depth", GDK_DEBUG_HIGH_DEPTH, "Use high bit depth rendering if possible" },
|
{ "high-depth", GDK_DEBUG_HIGH_DEPTH, "Use high bit depth rendering if possible" },
|
||||||
{ "no-vsync", GDK_DEBUG_NO_VSYNC, "Repaint instantly (uses 100% CPU with animations)" },
|
{ "no-vsync", GDK_DEBUG_NO_VSYNC, "Repaint instantly (uses 100% CPU with animations)" },
|
||||||
@@ -152,50 +142,31 @@ static const GdkDebugKey gdk_debug_keys[] = {
|
|||||||
|
|
||||||
#ifdef G_HAS_CONSTRUCTORS
|
#ifdef G_HAS_CONSTRUCTORS
|
||||||
#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
|
#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
|
||||||
#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(stash_and_unset_environment)
|
#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(stash_desktop_startup_notification_id)
|
||||||
#endif
|
#endif
|
||||||
G_DEFINE_CONSTRUCTOR(stash_and_unset_environment)
|
G_DEFINE_CONSTRUCTOR(stash_desktop_startup_notification_id)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *startup_notification_id = NULL;
|
static char *startup_notification_id = NULL;
|
||||||
static char *xdg_activation_token = NULL;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stash_and_unset_environment (void)
|
stash_desktop_startup_notification_id (void)
|
||||||
{
|
{
|
||||||
/* Copies environment variables and unsets them so they won't be inherited by
|
const char *desktop_startup_id;
|
||||||
* child processes and confuse things.
|
|
||||||
*
|
|
||||||
* Changing environment variables can be racy so we try to do this as early as
|
|
||||||
* possible in the program flow and before any printing that might involve
|
|
||||||
* environment variables.
|
|
||||||
*/
|
|
||||||
struct {
|
|
||||||
const char *key;
|
|
||||||
char **dst;
|
|
||||||
} vars[] = {
|
|
||||||
{ "DESKTOP_STARTUP_ID", &startup_notification_id },
|
|
||||||
{ "XDG_ACTIVATION_TOKEN", &xdg_activation_token },
|
|
||||||
};
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (vars); i++)
|
desktop_startup_id = g_getenv ("DESKTOP_STARTUP_ID");
|
||||||
*vars[i].dst = g_strdup (g_getenv (vars[i].key));
|
if (desktop_startup_id && *desktop_startup_id != '\0')
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (vars); i++)
|
|
||||||
g_unsetenv (vars[i].key);
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (vars); i++)
|
|
||||||
{
|
{
|
||||||
if (*vars[i].dst == NULL)
|
if (!g_utf8_validate (desktop_startup_id, -1, NULL))
|
||||||
continue;
|
g_warning ("DESKTOP_STARTUP_ID contains invalid UTF-8");
|
||||||
|
else
|
||||||
if (!g_utf8_validate (*vars[i].dst, -1, NULL))
|
startup_notification_id = g_strdup (desktop_startup_id);
|
||||||
{
|
|
||||||
g_warning ("%s contains invalid UTF-8", vars[i].key);
|
|
||||||
g_clear_pointer (vars[i].dst, g_free);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear the environment variable so it won't be inherited by
|
||||||
|
* child processes and confuse things.
|
||||||
|
*/
|
||||||
|
g_unsetenv ("DESKTOP_STARTUP_ID");
|
||||||
}
|
}
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
@@ -320,7 +291,7 @@ gdk_pre_parse (void)
|
|||||||
gdk_gl_backend_use (GDK_GL_WGL);
|
gdk_gl_backend_use (GDK_GL_WGL);
|
||||||
|
|
||||||
#ifndef G_HAS_CONSTRUCTORS
|
#ifndef G_HAS_CONSTRUCTORS
|
||||||
stash_and_unset_environment ();
|
stash_desktop_startup_notification_id ();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,20 +325,15 @@ gdk_display_open_default (void)
|
|||||||
/*< private >
|
/*< private >
|
||||||
* gdk_get_startup_notification_id:
|
* gdk_get_startup_notification_id:
|
||||||
*
|
*
|
||||||
* Returns the original value of the XDG_ACTIVATION_TOKEN environment
|
* Returns the original value of the DESKTOP_STARTUP_ID environment
|
||||||
* variable if it was defined and valid, otherwise it returns the original
|
* variable if it was defined and valid, or %NULL otherwise.
|
||||||
* value of the DESKTOP_STARTUP_ID environment variable if it was defined
|
|
||||||
* and valid, or %NULL if neither of them were defined and valid.
|
|
||||||
*
|
*
|
||||||
* Returns: (nullable) (transfer none): the original value of the
|
* Returns: (nullable) (transfer none): the original value of the
|
||||||
* XDG_ACTIVATION_TOKEN or DESKTOP_STARTUP_ID environment variable
|
* DESKTOP_STARTUP_ID environment variable
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *
|
||||||
gdk_get_startup_notification_id (void)
|
gdk_get_startup_notification_id (void)
|
||||||
{
|
{
|
||||||
if (xdg_activation_token)
|
|
||||||
return xdg_activation_token;
|
|
||||||
|
|
||||||
return startup_notification_id;
|
return startup_notification_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,9 +29,7 @@
|
|||||||
#include <gdk/gdkapplaunchcontext.h>
|
#include <gdk/gdkapplaunchcontext.h>
|
||||||
#include <gdk/gdkcairo.h>
|
#include <gdk/gdkcairo.h>
|
||||||
#include <gdk/gdkcairocontext.h>
|
#include <gdk/gdkcairocontext.h>
|
||||||
#include <gdk/gdkcicpparams.h>
|
|
||||||
#include <gdk/gdkclipboard.h>
|
#include <gdk/gdkclipboard.h>
|
||||||
#include <gdk/gdkcolorstate.h>
|
|
||||||
#include <gdk/gdkconfig.h>
|
#include <gdk/gdkconfig.h>
|
||||||
#include <gdk/gdkcontentdeserializer.h>
|
#include <gdk/gdkcontentdeserializer.h>
|
||||||
#include <gdk/gdkcontentformats.h>
|
#include <gdk/gdkcontentformats.h>
|
||||||
@@ -63,7 +61,6 @@
|
|||||||
#include <gdk/gdkkeys.h>
|
#include <gdk/gdkkeys.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
#include <gdk/gdkmemorytexture.h>
|
#include <gdk/gdkmemorytexture.h>
|
||||||
#include <gdk/gdkmemorytexturebuilder.h>
|
|
||||||
#include <gdk/gdkmonitor.h>
|
#include <gdk/gdkmonitor.h>
|
||||||
#include <gdk/gdkpaintable.h>
|
#include <gdk/gdkpaintable.h>
|
||||||
#include <gdk/gdkpango.h>
|
#include <gdk/gdkpango.h>
|
||||||
|
@@ -41,10 +41,8 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
#ifdef GDK_ARRAY_NULL_TERMINATED
|
#ifdef GDK_ARRAY_NULL_TERMINATED
|
||||||
#define GDK_ARRAY_REAL_SIZE(_size) ((_size) + 1)
|
#define GDK_ARRAY_REAL_SIZE(_size) ((_size) + 1)
|
||||||
#define GDK_ARRAY_MAX_SIZE (G_MAXSIZE / sizeof (_T_) - 1)
|
|
||||||
#else
|
#else
|
||||||
#define GDK_ARRAY_REAL_SIZE(_size) (_size)
|
#define GDK_ARRAY_REAL_SIZE(_size) (_size)
|
||||||
#define GDK_ARRAY_MAX_SIZE (G_MAXSIZE / sizeof (_T_))
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* make this readable */
|
/* make this readable */
|
||||||
@@ -179,23 +177,18 @@ G_GNUC_UNUSED static inline void
|
|||||||
gdk_array(reserve) (GdkArray *self,
|
gdk_array(reserve) (GdkArray *self,
|
||||||
gsize n)
|
gsize n)
|
||||||
{
|
{
|
||||||
gsize new_capacity, size, capacity;
|
gsize new_size, size;
|
||||||
|
|
||||||
if (G_UNLIKELY (n > GDK_ARRAY_MAX_SIZE))
|
if (n <= gdk_array(get_capacity) (self))
|
||||||
g_error ("requesting array size of %zu, but maximum size is %zu", n, GDK_ARRAY_MAX_SIZE);
|
return;
|
||||||
|
|
||||||
capacity = gdk_array(get_capacity) (self);
|
|
||||||
if (n <= capacity)
|
|
||||||
return;
|
|
||||||
|
|
||||||
size = gdk_array(get_size) (self);
|
size = gdk_array(get_size) (self);
|
||||||
/* capacity * 2 can overflow, that's why we MAX() */
|
new_size = ((gsize) 1) << g_bit_storage (MAX (GDK_ARRAY_REAL_SIZE (n), 16) - 1);
|
||||||
new_capacity = MAX (GDK_ARRAY_REAL_SIZE (n), capacity * 2);
|
|
||||||
|
|
||||||
#ifdef GDK_ARRAY_PREALLOC
|
#ifdef GDK_ARRAY_PREALLOC
|
||||||
if (self->start == self->preallocated)
|
if (self->start == self->preallocated)
|
||||||
{
|
{
|
||||||
self->start = g_new (_T_, new_capacity);
|
self->start = g_new (_T_, new_size);
|
||||||
memcpy (self->start, self->preallocated, sizeof (_T_) * GDK_ARRAY_REAL_SIZE (size));
|
memcpy (self->start, self->preallocated, sizeof (_T_) * GDK_ARRAY_REAL_SIZE (size));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -203,15 +196,15 @@ gdk_array(reserve) (GdkArray *self,
|
|||||||
#ifdef GDK_ARRAY_NULL_TERMINATED
|
#ifdef GDK_ARRAY_NULL_TERMINATED
|
||||||
if (self->start == NULL)
|
if (self->start == NULL)
|
||||||
{
|
{
|
||||||
self->start = g_new (_T_, new_capacity);
|
self->start = g_new (_T_, new_size);
|
||||||
*self->start = *(_T_[1]) { 0 };
|
*self->start = *(_T_[1]) { 0 };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
self->start = g_renew (_T_, self->start, new_capacity);
|
self->start = g_renew (_T_, self->start, new_size);
|
||||||
|
|
||||||
self->end = self->start + size;
|
self->end = self->start + size;
|
||||||
self->end_allocation = self->start + new_capacity;
|
self->end_allocation = self->start + new_size;
|
||||||
#ifdef GDK_ARRAY_NULL_TERMINATED
|
#ifdef GDK_ARRAY_NULL_TERMINATED
|
||||||
self->end_allocation--;
|
self->end_allocation--;
|
||||||
#endif
|
#endif
|
||||||
@@ -319,7 +312,6 @@ gdk_array(get) (const GdkArray *self,
|
|||||||
#undef gdk_array_paste
|
#undef gdk_array_paste
|
||||||
#undef gdk_array
|
#undef gdk_array
|
||||||
#undef GDK_ARRAY_REAL_SIZE
|
#undef GDK_ARRAY_REAL_SIZE
|
||||||
#undef GDK_ARRAY_MAX_SIZE
|
|
||||||
|
|
||||||
#undef GDK_ARRAY_BY_VALUE
|
#undef GDK_ARRAY_BY_VALUE
|
||||||
#undef GDK_ARRAY_ELEMENT_TYPE
|
#undef GDK_ARRAY_ELEMENT_TYPE
|
||||||
|
@@ -1,159 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
#include "gdkcolorprivate.h"
|
|
||||||
|
|
||||||
#include "gdkmemoryformatprivate.h"
|
|
||||||
#include "gdkmemorytexture.h"
|
|
||||||
|
|
||||||
#include <cairo.h>
|
|
||||||
#include <graphene.h>
|
|
||||||
|
|
||||||
static inline cairo_format_t
|
|
||||||
gdk_cairo_format_for_depth (GdkMemoryDepth depth)
|
|
||||||
{
|
|
||||||
switch (depth)
|
|
||||||
{
|
|
||||||
case GDK_MEMORY_NONE:
|
|
||||||
case GDK_MEMORY_U8:
|
|
||||||
return CAIRO_FORMAT_ARGB32;
|
|
||||||
|
|
||||||
case GDK_MEMORY_U8_SRGB:
|
|
||||||
case GDK_MEMORY_U16:
|
|
||||||
case GDK_MEMORY_FLOAT16:
|
|
||||||
case GDK_MEMORY_FLOAT32:
|
|
||||||
return CAIRO_FORMAT_RGBA128F;
|
|
||||||
|
|
||||||
case GDK_N_DEPTHS:
|
|
||||||
default:
|
|
||||||
g_return_val_if_reached (CAIRO_FORMAT_ARGB32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline GdkMemoryDepth
|
|
||||||
gdk_cairo_depth_for_format (cairo_format_t format)
|
|
||||||
{
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case CAIRO_FORMAT_ARGB32:
|
|
||||||
case CAIRO_FORMAT_RGB24:
|
|
||||||
case CAIRO_FORMAT_RGB16_565:
|
|
||||||
case CAIRO_FORMAT_A1:
|
|
||||||
case CAIRO_FORMAT_A8:
|
|
||||||
return GDK_MEMORY_U8;
|
|
||||||
|
|
||||||
case CAIRO_FORMAT_RGB30:
|
|
||||||
return GDK_MEMORY_U16;
|
|
||||||
|
|
||||||
case CAIRO_FORMAT_RGB96F:
|
|
||||||
case CAIRO_FORMAT_RGBA128F:
|
|
||||||
return GDK_MEMORY_FLOAT32;
|
|
||||||
|
|
||||||
case CAIRO_FORMAT_INVALID:
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return GDK_MEMORY_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkMemoryFormat
|
|
||||||
gdk_cairo_format_to_memory_format (cairo_format_t format)
|
|
||||||
{
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case CAIRO_FORMAT_ARGB32:
|
|
||||||
return GDK_MEMORY_DEFAULT;
|
|
||||||
|
|
||||||
case CAIRO_FORMAT_RGB24:
|
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
||||||
return GDK_MEMORY_B8G8R8X8;
|
|
||||||
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
return GDK_MEMORY_X8R8G8B8;
|
|
||||||
#else
|
|
||||||
#error "Unknown byte order for Cairo format"
|
|
||||||
#endif
|
|
||||||
case CAIRO_FORMAT_A8:
|
|
||||||
return GDK_MEMORY_A8;
|
|
||||||
case CAIRO_FORMAT_RGB96F:
|
|
||||||
return GDK_MEMORY_R32G32B32_FLOAT;
|
|
||||||
case CAIRO_FORMAT_RGBA128F:
|
|
||||||
return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
|
|
||||||
|
|
||||||
case CAIRO_FORMAT_RGB16_565:
|
|
||||||
case CAIRO_FORMAT_RGB30:
|
|
||||||
case CAIRO_FORMAT_INVALID:
|
|
||||||
case CAIRO_FORMAT_A1:
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return GDK_MEMORY_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cairo_set_source_color (cairo_t *cr,
|
|
||||||
GdkColorState *ccs,
|
|
||||||
const GdkColor *color)
|
|
||||||
{
|
|
||||||
float c[4];
|
|
||||||
gdk_color_to_float (color, ccs, c);
|
|
||||||
cairo_set_source_rgba (cr, c[0], c[1], c[2], c[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cairo_set_source_rgba_ccs (cairo_t *cr,
|
|
||||||
GdkColorState *ccs,
|
|
||||||
const GdkRGBA *rgba)
|
|
||||||
{
|
|
||||||
GdkColor c;
|
|
||||||
gdk_color_init_from_rgba (&c, rgba);
|
|
||||||
gdk_cairo_set_source_color (cr, ccs, &c);
|
|
||||||
gdk_color_finish (&c);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cairo_pattern_add_color_stop_rgba_ccs (cairo_pattern_t *pattern,
|
|
||||||
GdkColorState *ccs,
|
|
||||||
double offset,
|
|
||||||
const GdkRGBA *rgba)
|
|
||||||
{
|
|
||||||
float color[4];
|
|
||||||
|
|
||||||
gdk_color_state_from_rgba (ccs, rgba, color);
|
|
||||||
cairo_pattern_add_color_stop_rgba (pattern, offset, color[0], color[1], color[2], color[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cairo_rect (cairo_t *cr,
|
|
||||||
const graphene_rect_t *rect)
|
|
||||||
{
|
|
||||||
cairo_rectangle (cr,
|
|
||||||
rect->origin.x, rect->origin.y,
|
|
||||||
rect->size.width, rect->size.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cairo_surface_convert_color_state (cairo_surface_t *surface,
|
|
||||||
GdkColorState *source,
|
|
||||||
GdkColorState *target)
|
|
||||||
{
|
|
||||||
cairo_surface_t *image_surface;
|
|
||||||
|
|
||||||
if (gdk_color_state_equal (source, target))
|
|
||||||
return;
|
|
||||||
|
|
||||||
image_surface = cairo_surface_map_to_image (surface, NULL);
|
|
||||||
|
|
||||||
gdk_memory_convert_color_state (cairo_image_surface_get_data (image_surface),
|
|
||||||
cairo_image_surface_get_stride (image_surface),
|
|
||||||
gdk_cairo_format_to_memory_format (cairo_image_surface_get_format (image_surface)),
|
|
||||||
source,
|
|
||||||
target,
|
|
||||||
cairo_image_surface_get_width (image_surface),
|
|
||||||
cairo_image_surface_get_height (image_surface));
|
|
||||||
|
|
||||||
cairo_surface_mark_dirty (image_surface);
|
|
||||||
cairo_surface_unmap_image (surface, image_surface);
|
|
||||||
/* https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/487 */
|
|
||||||
cairo_surface_mark_dirty (surface);
|
|
||||||
}
|
|
||||||
|
|
@@ -1,481 +0,0 @@
|
|||||||
/* gdkcicpparams.c
|
|
||||||
*
|
|
||||||
* Copyright 2024 Matthias Clasen
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "gdkcicpparamsprivate.h"
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
#include "gdkenumtypes.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpParams:
|
|
||||||
*
|
|
||||||
* The `GdkCicpParams` struct contains the parameters that define
|
|
||||||
* a colorstate according to the ITU-T H.273
|
|
||||||
* [specification](https://www.itu.int/rec/T-REC-H.273/en).
|
|
||||||
*
|
|
||||||
* See the documentation of individual properties for supported values.
|
|
||||||
*
|
|
||||||
* The 'unspecified' value (2) is not treated in any special way, and
|
|
||||||
* must be replaced by a different value before creating a color state.
|
|
||||||
*
|
|
||||||
* `GdkCicpParams` can be used as a builder object to construct a color
|
|
||||||
* state from Cicp data with [method@Gdk.CicpParams.build_color_state].
|
|
||||||
* The function will return an error if the given parameters are not
|
|
||||||
* supported.
|
|
||||||
*
|
|
||||||
* You can obtain a `GdkCicpParams` object from a color state with
|
|
||||||
* [method@Gdk.ColorState.create_cicp_params]. This can be used to
|
|
||||||
* create a variant of a color state, by changing just one of the cicp
|
|
||||||
* parameters, or just to obtain information about the color state.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* {{{ GObject boilerplate */
|
|
||||||
|
|
||||||
struct _GdkCicpParams
|
|
||||||
{
|
|
||||||
GObject parent_instance;
|
|
||||||
|
|
||||||
GdkCicp cicp;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GdkCicpParamsClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (GdkCicpParams, gdk_cicp_params, G_TYPE_OBJECT)
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PROP_COLOR_PRIMARIES = 1,
|
|
||||||
PROP_TRANSFER_FUNCTION,
|
|
||||||
PROP_MATRIX_COEFFICIENTS,
|
|
||||||
PROP_RANGE,
|
|
||||||
|
|
||||||
N_PROPERTIES,
|
|
||||||
};
|
|
||||||
|
|
||||||
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_cicp_params_init (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
self->cicp.color_primaries = 2;
|
|
||||||
self->cicp.transfer_function = 2;
|
|
||||||
self->cicp.matrix_coefficients = 2;
|
|
||||||
self->cicp.range = GDK_CICP_RANGE_NARROW;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_cicp_params_get_property (GObject *object,
|
|
||||||
guint property_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
GdkCicpParams *self = GDK_CICP_PARAMS (object);
|
|
||||||
|
|
||||||
switch (property_id)
|
|
||||||
{
|
|
||||||
case PROP_COLOR_PRIMARIES:
|
|
||||||
g_value_set_uint (value, self->cicp.color_primaries);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_TRANSFER_FUNCTION:
|
|
||||||
g_value_set_uint (value, self->cicp.transfer_function);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_MATRIX_COEFFICIENTS:
|
|
||||||
g_value_set_uint (value, self->cicp.matrix_coefficients);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_RANGE:
|
|
||||||
g_value_set_enum (value, self->cicp.range);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_cicp_params_set_property (GObject *object,
|
|
||||||
guint property_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
GdkCicpParams *self = GDK_CICP_PARAMS (object);
|
|
||||||
|
|
||||||
switch (property_id)
|
|
||||||
{
|
|
||||||
case PROP_COLOR_PRIMARIES:
|
|
||||||
gdk_cicp_params_set_color_primaries (self, g_value_get_uint (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_TRANSFER_FUNCTION:
|
|
||||||
gdk_cicp_params_set_transfer_function (self, g_value_get_uint (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_MATRIX_COEFFICIENTS:
|
|
||||||
gdk_cicp_params_set_matrix_coefficients (self, g_value_get_uint (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_RANGE:
|
|
||||||
gdk_cicp_params_set_range (self, g_value_get_enum (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_cicp_params_class_init (GdkCicpParamsClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->get_property = gdk_cicp_params_get_property;
|
|
||||||
object_class->set_property = gdk_cicp_params_set_property;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpParams:color-primaries:
|
|
||||||
*
|
|
||||||
* The color primaries to use.
|
|
||||||
*
|
|
||||||
* Supported values:
|
|
||||||
*
|
|
||||||
* - 1: BT.709 / sRGB
|
|
||||||
* - 2: unspecified
|
|
||||||
* - 5: PAL
|
|
||||||
* - 6,7: BT.601 / NTSC
|
|
||||||
* - 9: BT.2020
|
|
||||||
* - 12: Display P3
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
properties[PROP_COLOR_PRIMARIES] =
|
|
||||||
g_param_spec_uint ("color-primaries", NULL, NULL,
|
|
||||||
0, 255, 2,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpParams:transfer-function:
|
|
||||||
*
|
|
||||||
* The transfer function to use.
|
|
||||||
*
|
|
||||||
* Supported values:
|
|
||||||
*
|
|
||||||
* - 1,6,14,15: BT.709, BT.601, BT.2020
|
|
||||||
* - 2: unspecified
|
|
||||||
* - 4: gamma 2.2
|
|
||||||
* - 5: gamma 2.8
|
|
||||||
* - 8: linear
|
|
||||||
* - 13: sRGB
|
|
||||||
* - 16: BT.2100 PQ
|
|
||||||
* - 18: BT.2100 HLG
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
properties[PROP_TRANSFER_FUNCTION] =
|
|
||||||
g_param_spec_uint ("transfer-function", NULL, NULL,
|
|
||||||
0, 255, 2,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpParams:matrix-coefficients:
|
|
||||||
*
|
|
||||||
* The matrix coefficients (for YUV to RGB conversion).
|
|
||||||
*
|
|
||||||
* Supported values:
|
|
||||||
*
|
|
||||||
* - 0: RGB
|
|
||||||
* - 2: unspecified
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
properties[PROP_MATRIX_COEFFICIENTS] =
|
|
||||||
g_param_spec_uint ("matrix-coefficients", NULL, NULL,
|
|
||||||
0, 255, 2,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpParams:range:
|
|
||||||
*
|
|
||||||
* Whether the data is using the full range of values.
|
|
||||||
*
|
|
||||||
* The range of the data.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
properties[PROP_RANGE] =
|
|
||||||
g_param_spec_enum ("range", NULL, NULL,
|
|
||||||
GDK_TYPE_CICP_RANGE,
|
|
||||||
GDK_CICP_RANGE_NARROW,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Public API */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_new:
|
|
||||||
*
|
|
||||||
* Creates a new `GdkCicpParams` object.
|
|
||||||
*
|
|
||||||
* The initial values of the properties are the values for "undefined"
|
|
||||||
* and need to be set before a color state object can be built.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full): a new `GdkCicpParams`
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkCicpParams *
|
|
||||||
gdk_cicp_params_new (void)
|
|
||||||
{
|
|
||||||
return g_object_new (GDK_TYPE_CICP_PARAMS, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_get_color_primaries:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
*
|
|
||||||
* Returns the value of the color-primaries property
|
|
||||||
* of @self.
|
|
||||||
*
|
|
||||||
* Returns: the color-primaries value
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
guint
|
|
||||||
gdk_cicp_params_get_color_primaries (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (GDK_IS_CICP_PARAMS (self), 0);
|
|
||||||
|
|
||||||
return self->cicp.color_primaries;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_set_color_primaries:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
* @color_primaries: the new color primaries value
|
|
||||||
*
|
|
||||||
* Sets the color-primaries property of @self.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_cicp_params_set_color_primaries (GdkCicpParams *self,
|
|
||||||
guint color_primaries)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GDK_IS_CICP_PARAMS (self));
|
|
||||||
|
|
||||||
if (self->cicp.color_primaries == color_primaries)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->cicp.color_primaries = color_primaries;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_PRIMARIES]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_get_transfer_function:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
*
|
|
||||||
* Gets the transfer-function property of @self.
|
|
||||||
*
|
|
||||||
* Returns: the transfer-function value
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
guint
|
|
||||||
gdk_cicp_params_get_transfer_function (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (GDK_IS_CICP_PARAMS (self), 0);
|
|
||||||
|
|
||||||
return self->cicp.transfer_function;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_set_transfer_function:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
* @transfer_function: the new transfer-function value
|
|
||||||
*
|
|
||||||
* Sets the transfer-function property of @self.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_cicp_params_set_transfer_function (GdkCicpParams *self,
|
|
||||||
guint transfer_function)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GDK_IS_CICP_PARAMS (self));
|
|
||||||
|
|
||||||
if (self->cicp.transfer_function == transfer_function)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->cicp.transfer_function = transfer_function;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRANSFER_FUNCTION]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_get_matrix_coefficients:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
*
|
|
||||||
* Gets the matrix-coefficients property of @self.
|
|
||||||
*
|
|
||||||
* Returns: the matrix-coefficients value
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
guint
|
|
||||||
gdk_cicp_params_get_matrix_coefficients (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (GDK_IS_CICP_PARAMS (self), 0);
|
|
||||||
|
|
||||||
return self->cicp.matrix_coefficients;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_set_matrix_coefficients:
|
|
||||||
* @self a `GdkCicpParams`
|
|
||||||
* @matrix_coefficients: the new matrix-coefficients value
|
|
||||||
*
|
|
||||||
* Sets the matrix-coefficients property of @self.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_cicp_params_set_matrix_coefficients (GdkCicpParams *self,
|
|
||||||
guint matrix_coefficients)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GDK_IS_CICP_PARAMS (self));
|
|
||||||
|
|
||||||
if (self->cicp.matrix_coefficients == matrix_coefficients)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->cicp.matrix_coefficients = matrix_coefficients;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MATRIX_COEFFICIENTS]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_get_range:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
*
|
|
||||||
* Gets the range property of @self.
|
|
||||||
*
|
|
||||||
* Returns: the range value
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkCicpRange
|
|
||||||
gdk_cicp_params_get_range (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (GDK_IS_CICP_PARAMS (self), GDK_CICP_RANGE_NARROW);
|
|
||||||
|
|
||||||
return self->cicp.range;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_set_range:
|
|
||||||
* @self: a `GdkCipParams`
|
|
||||||
* @range: the range value
|
|
||||||
*
|
|
||||||
* Sets the range property of @self
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_cicp_params_set_range (GdkCicpParams *self,
|
|
||||||
GdkCicpRange range)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GDK_IS_CICP_PARAMS (self));
|
|
||||||
|
|
||||||
if (self->cicp.range == range)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->cicp.range = range;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RANGE]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_cicp_params_build_color_state:
|
|
||||||
* @self: a `GdkCicpParams`
|
|
||||||
* @error: return location for errors
|
|
||||||
*
|
|
||||||
* Creates a new `GdkColorState` object for the cicp parameters in @self.
|
|
||||||
*
|
|
||||||
* Note that this may fail if the cicp parameters in @self are not
|
|
||||||
* supported by GTK. In that case, `NULL` is returned, and @error is set
|
|
||||||
* with an error message that can be presented to the user.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): A newly allocated `GdkColorState`
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_cicp_params_build_color_state (GdkCicpParams *self,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
return gdk_color_state_new_for_cicp (gdk_cicp_params_get_cicp (self), error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Private API */
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_cicp_params_new_for_cicp:
|
|
||||||
* @cicp: a GdkCicp struct
|
|
||||||
*
|
|
||||||
* Create a `GdkCicpParams` from the values in @cicp.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full): a new `GdkCicpParams` object
|
|
||||||
*/
|
|
||||||
GdkCicpParams *
|
|
||||||
gdk_cicp_params_new_for_cicp (const GdkCicp *cicp)
|
|
||||||
{
|
|
||||||
return g_object_new (GDK_TYPE_CICP_PARAMS,
|
|
||||||
"color-primaries", cicp->color_primaries,
|
|
||||||
"transfer-function", cicp->transfer_function,
|
|
||||||
"matrix-coefficients", cicp->matrix_coefficients,
|
|
||||||
"range", cicp->range,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_cicp_params_get_cicp:
|
|
||||||
* @self: a `GdkCicpParams` object
|
|
||||||
*
|
|
||||||
* Gets the `GdkCicp` struct of @self.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): a `GdkCicp` struct containing
|
|
||||||
* the values of @self
|
|
||||||
*/
|
|
||||||
const GdkCicp *
|
|
||||||
gdk_cicp_params_get_cicp (GdkCicpParams *self)
|
|
||||||
{
|
|
||||||
return &self->cicp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* vim:set foldmethod=marker expandtab: */
|
|
@@ -1,90 +0,0 @@
|
|||||||
/* gdkcicpparams.h
|
|
||||||
*
|
|
||||||
* Copyright 2024 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
|
|
||||||
#define GDK_TYPE_CICP_PARAMS (gdk_cicp_params_get_type ())
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GDK_DECLARE_INTERNAL_TYPE (GdkCicpParams, gdk_cicp_params, GDK, CICP_PARAMS, GObject)
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkCicpParams *gdk_cicp_params_new (void);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
guint gdk_cicp_params_get_color_primaries (GdkCicpParams *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_cicp_params_set_color_primaries (GdkCicpParams *self,
|
|
||||||
guint color_primaries);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
guint gdk_cicp_params_get_transfer_function (GdkCicpParams *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_cicp_params_set_transfer_function (GdkCicpParams *self,
|
|
||||||
guint transfer_function);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
guint gdk_cicp_params_get_matrix_coefficients (GdkCicpParams *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_cicp_params_set_matrix_coefficients (GdkCicpParams *self,
|
|
||||||
guint matrix_coefficients);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkCicpRange:
|
|
||||||
* @GDK_CICP_RANGE_NARROW: The values use the range of 16-235 (for Y) and 16-240 for u and v.
|
|
||||||
* @GDK_CICO_RANGE_FULL: The values use the full range.
|
|
||||||
*
|
|
||||||
* The values of this enumeration describe whether image data uses
|
|
||||||
* the full range of 8-bit values.
|
|
||||||
*
|
|
||||||
* In digital broadcasting, it is common to reserve the lowest and
|
|
||||||
* highest values. Typically the allowed values for the narrow range
|
|
||||||
* are 16-235 for Y and 16-240 for u,v (when dealing with YUV data).
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GDK_CICP_RANGE_NARROW,
|
|
||||||
GDK_CICP_RANGE_FULL,
|
|
||||||
} GdkCicpRange;
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkCicpRange gdk_cicp_params_get_range (GdkCicpParams *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_cicp_params_set_range (GdkCicpParams *self,
|
|
||||||
GdkCicpRange range);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_cicp_params_build_color_state (GdkCicpParams *self,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
@@ -1,84 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "gdkcicpparams.h"
|
|
||||||
|
|
||||||
typedef struct _GdkCicp GdkCicp;
|
|
||||||
|
|
||||||
struct _GdkCicp
|
|
||||||
{
|
|
||||||
guint color_primaries;
|
|
||||||
guint transfer_function;
|
|
||||||
guint matrix_coefficients;
|
|
||||||
GdkCicpRange range;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_cicp_equal:
|
|
||||||
* @p1: a `GdkCicp`
|
|
||||||
* @p2: another `GdkCicp`
|
|
||||||
*
|
|
||||||
* Compare two cicp tuples for equality.
|
|
||||||
*
|
|
||||||
* Note that several cicp values are 'functionally equivalent'.
|
|
||||||
* If you are interested in that notion, use gdk_cicp_equivalent().
|
|
||||||
*
|
|
||||||
* Returns: whether @p1 and @p2 are equal
|
|
||||||
*/
|
|
||||||
static inline gboolean
|
|
||||||
gdk_cicp_equal (const GdkCicp *p1,
|
|
||||||
const GdkCicp *p2)
|
|
||||||
{
|
|
||||||
return p1->color_primaries == p2->color_primaries &&
|
|
||||||
p1->transfer_function == p2->transfer_function &&
|
|
||||||
p1->matrix_coefficients == p2->matrix_coefficients &&
|
|
||||||
p1->range == p2->range;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_cicp_normalize (const GdkCicp *orig,
|
|
||||||
GdkCicp *out)
|
|
||||||
{
|
|
||||||
memcpy (out, orig, sizeof (GdkCicp));
|
|
||||||
|
|
||||||
/* ntsc */
|
|
||||||
if (out->color_primaries == 6)
|
|
||||||
out->color_primaries = 5;
|
|
||||||
|
|
||||||
/* bt709 */
|
|
||||||
if (out->transfer_function == 6 ||
|
|
||||||
out->transfer_function == 14 ||
|
|
||||||
out->transfer_function == 15)
|
|
||||||
out->transfer_function = 1;
|
|
||||||
|
|
||||||
/* bt601 */
|
|
||||||
if (out->matrix_coefficients == 6)
|
|
||||||
out->matrix_coefficients = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_cicp_equivalent:
|
|
||||||
* @p1: a `GdkCicp`
|
|
||||||
* @p2: another `GdkCicp`
|
|
||||||
*
|
|
||||||
* Determine whether two cicp tuples are functionally equivalent.
|
|
||||||
*
|
|
||||||
* Returns: whether @p1 and @p2 are functionally equivalent
|
|
||||||
*/
|
|
||||||
static inline gboolean
|
|
||||||
gdk_cicp_equivalent (const GdkCicp *p1,
|
|
||||||
const GdkCicp *p2)
|
|
||||||
{
|
|
||||||
GdkCicp n1, n2;
|
|
||||||
|
|
||||||
if (gdk_cicp_equal (p1, p2))
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
gdk_cicp_normalize (p1, &n1);
|
|
||||||
gdk_cicp_normalize (p2, &n2);
|
|
||||||
|
|
||||||
return gdk_cicp_equal (&n1, &n2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const GdkCicp * gdk_cicp_params_get_cicp (GdkCicpParams *params);
|
|
||||||
|
|
||||||
GdkCicpParams * gdk_cicp_params_new_for_cicp (const GdkCicp *cicp);
|
|
@@ -515,13 +515,15 @@ gdk_clipboard_get_content (GdkClipboard *clipboard)
|
|||||||
* @clipboard: a `GdkClipboard`
|
* @clipboard: a `GdkClipboard`
|
||||||
* @io_priority: the I/O priority of the request
|
* @io_priority: the I/O priority of the request
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data:: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously instructs the @clipboard to store its contents remotely.
|
* Asynchronously instructs the @clipboard to store its contents remotely.
|
||||||
*
|
*
|
||||||
* If the clipboard is not local, this function does nothing but report success.
|
* If the clipboard is not local, this function does nothing but report success.
|
||||||
*
|
*
|
||||||
|
* The @callback must call [method@Gdk.Clipboard.store_finish].
|
||||||
|
*
|
||||||
* The purpose of this call is to preserve clipboard contents beyond the
|
* The purpose of this call is to preserve clipboard contents beyond the
|
||||||
* lifetime of an application, so this function is typically called on
|
* lifetime of an application, so this function is typically called on
|
||||||
* exit. Depending on the platform, the functionality may not be available
|
* exit. Depending on the platform, the functionality may not be available
|
||||||
@@ -630,12 +632,15 @@ gdk_clipboard_read_internal (GdkClipboard *clipboard,
|
|||||||
* @mime_types: (array zero-terminated=1): a %NULL-terminated array of mime types to choose from
|
* @mime_types: (array zero-terminated=1): a %NULL-terminated array of mime types to choose from
|
||||||
* @io_priority: the I/O priority of the request
|
* @io_priority: the I/O priority of the request
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously requests an input stream to read the @clipboard's
|
* Asynchronously requests an input stream to read the @clipboard's
|
||||||
* contents from.
|
* contents from.
|
||||||
*
|
*
|
||||||
|
* When the operation is finished @callback will be called. You must then
|
||||||
|
* call [method@Gdk.Clipboard.read_finish] to get the result of the operation.
|
||||||
|
*
|
||||||
* The clipboard will choose the most suitable mime type from the given list
|
* The clipboard will choose the most suitable mime type from the given list
|
||||||
* to fulfill the request, preferring the ones listed first.
|
* to fulfill the request, preferring the ones listed first.
|
||||||
*/
|
*/
|
||||||
@@ -823,12 +828,15 @@ gdk_clipboard_read_value_internal (GdkClipboard *clipboard,
|
|||||||
* @type: a `GType` to read
|
* @type: a `GType` to read
|
||||||
* @io_priority: the I/O priority of the request
|
* @io_priority: the I/O priority of the request
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously request the @clipboard contents converted to the given
|
* Asynchronously request the @clipboard contents converted to the given
|
||||||
* @type.
|
* @type.
|
||||||
*
|
*
|
||||||
|
* When the operation is finished @callback will be called. You must then call
|
||||||
|
* [method@Gdk.Clipboard.read_value_finish] to get the resulting `GValue`.
|
||||||
|
*
|
||||||
* For local clipboard contents that are available in the given `GType`,
|
* For local clipboard contents that are available in the given `GType`,
|
||||||
* the value will be copied directly. Otherwise, GDK will try to use
|
* the value will be copied directly. Otherwise, GDK will try to use
|
||||||
* [func@content_deserialize_async] to convert the clipboard's data.
|
* [func@content_deserialize_async] to convert the clipboard's data.
|
||||||
@@ -882,11 +890,14 @@ gdk_clipboard_read_value_finish (GdkClipboard *clipboard,
|
|||||||
* gdk_clipboard_read_texture_async:
|
* gdk_clipboard_read_texture_async:
|
||||||
* @clipboard: a `GdkClipboard`
|
* @clipboard: a `GdkClipboard`
|
||||||
* @cancellable: (nullable): optional `GCancellable` object, %NULL to ignore.
|
* @cancellable: (nullable): optional `GCancellable` object, %NULL to ignore.
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously request the @clipboard contents converted to a `GdkPixbuf`.
|
* Asynchronously request the @clipboard contents converted to a `GdkPixbuf`.
|
||||||
*
|
*
|
||||||
|
* When the operation is finished @callback will be called. You must then
|
||||||
|
* call [method@Gdk.Clipboard.read_texture_finish] to get the result.
|
||||||
|
*
|
||||||
* This is a simple wrapper around [method@Gdk.Clipboard.read_value_async].
|
* This is a simple wrapper around [method@Gdk.Clipboard.read_value_async].
|
||||||
* Use that function or [method@Gdk.Clipboard.read_async] directly if you
|
* Use that function or [method@Gdk.Clipboard.read_async] directly if you
|
||||||
* need more control over the operation.
|
* need more control over the operation.
|
||||||
@@ -944,11 +955,14 @@ gdk_clipboard_read_texture_finish (GdkClipboard *clipboard,
|
|||||||
* gdk_clipboard_read_text_async:
|
* gdk_clipboard_read_text_async:
|
||||||
* @clipboard: a `GdkClipboard`
|
* @clipboard: a `GdkClipboard`
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously request the @clipboard contents converted to a string.
|
* Asynchronously request the @clipboard contents converted to a string.
|
||||||
*
|
*
|
||||||
|
* When the operation is finished @callback will be called. You must then
|
||||||
|
* call [method@Gdk.Clipboard.read_text_finish] to get the result.
|
||||||
|
*
|
||||||
* This is a simple wrapper around [method@Gdk.Clipboard.read_value_async].
|
* This is a simple wrapper around [method@Gdk.Clipboard.read_value_async].
|
||||||
* Use that function or [method@Gdk.Clipboard.read_async] directly if you
|
* Use that function or [method@Gdk.Clipboard.read_async] directly if you
|
||||||
* need more control over the operation.
|
* need more control over the operation.
|
||||||
|
301
gdk/gdkcolor.c
301
gdk/gdkcolor.c
@@ -1,301 +0,0 @@
|
|||||||
/* GDK - The GIMP Drawing Kit
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 Benjamin Otte
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "gdkcolorprivate.h"
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
#include "gdkrgbaprivate.h"
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* GdkColor:
|
|
||||||
* @color_state: the color state to interpret the values in
|
|
||||||
* @values: the 3 coordinates that define the color, followed
|
|
||||||
* by the alpha value
|
|
||||||
*
|
|
||||||
* A `GdkColor` represents a color.
|
|
||||||
*
|
|
||||||
* The color state defines the meaning and range of the values.
|
|
||||||
* E.g., the srgb color state has r, g, b components representing
|
|
||||||
* red, green and blue with a range of [0,1], while the oklch color
|
|
||||||
* state has l, c, h components representing luminosity, chromaticity
|
|
||||||
* and hue, with l ranging from 0 to 1 and c from 0 to about 0.4, while
|
|
||||||
* h is interpreted as angle in degrees.
|
|
||||||
*
|
|
||||||
* value[3] is always the alpha value with a range of [0,1].
|
|
||||||
*
|
|
||||||
* The values are also available under the names red, green, blue
|
|
||||||
* and alpha, or r, g, b and a.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_init:
|
|
||||||
* @self: the `GdkColor` struct to initialize
|
|
||||||
* @color_state: the color state
|
|
||||||
* @values: the values
|
|
||||||
*
|
|
||||||
* Initializes the `GdkColor` with the given color state
|
|
||||||
* and values.
|
|
||||||
*
|
|
||||||
* Note that this takes a reference on @color_state that
|
|
||||||
* must be freed by calling [function@Gdk.Color.finish]
|
|
||||||
* when the `GdkColor` is no longer needed.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_init) (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const float values[4])
|
|
||||||
{
|
|
||||||
_gdk_color_init (self, color_state, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_init_copy:
|
|
||||||
* @self: the `GdkColor` struct to initialize
|
|
||||||
* @color: the `GdkColor` to copy
|
|
||||||
*
|
|
||||||
* Initializes the `GdkColor` by copying the contents
|
|
||||||
* of another `GdkColor`.
|
|
||||||
*
|
|
||||||
* Note that this takes a reference on the color state
|
|
||||||
* that must be freed by calling [function@Gdk.Color.finish]
|
|
||||||
* when the `GdkColor` is no longer needed.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_init_copy) (GdkColor *self,
|
|
||||||
const GdkColor *color)
|
|
||||||
{
|
|
||||||
_gdk_color_init_copy (self, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_init_from_rgba:
|
|
||||||
* @self: the `GdkColor` struct to initialize
|
|
||||||
* @rgba: the `GdkRGBA` to copy
|
|
||||||
*
|
|
||||||
* Initializes the `GdkColor` by copying the contents
|
|
||||||
* of a `GdkRGBA`.
|
|
||||||
*
|
|
||||||
* Note that `GdkRGBA` colors are always in the sRGB
|
|
||||||
* color state.
|
|
||||||
*
|
|
||||||
* Note that this takes a reference on the color state
|
|
||||||
* that must be freed by calling [function@Gdk.Color.finish]
|
|
||||||
* when the `GdkColor` is no longer needed.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_init_from_rgba) (GdkColor *self,
|
|
||||||
const GdkRGBA *rgba)
|
|
||||||
{
|
|
||||||
_gdk_color_init_from_rgba (self, rgba);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
*
|
|
||||||
* Drop the reference on the color state of @self.
|
|
||||||
*
|
|
||||||
* After this, @self is empty and can be initialized again
|
|
||||||
* with [function@Gdk.Color.init] and its variants.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_finish) (GdkColor *self)
|
|
||||||
{
|
|
||||||
_gdk_color_finish (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_equal:
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
* @other: another `GdkColor`
|
|
||||||
*
|
|
||||||
* Compares two `GdkColor` structs for equality.
|
|
||||||
*
|
|
||||||
* Returns: `TRUE` if @self and @other are equal
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
(gdk_color_equal) (const GdkColor *self,
|
|
||||||
const GdkColor *other)
|
|
||||||
{
|
|
||||||
return _gdk_color_equal (self, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_is_clear:
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
*
|
|
||||||
* Returns whether @self is fully transparent.
|
|
||||||
*
|
|
||||||
* Returns: `TRUE` if @self is transparent
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
(gdk_color_is_clear) (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return _gdk_color_is_clear (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_is_opaque:
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
*
|
|
||||||
* Returns whether @self is fully opaque.
|
|
||||||
*
|
|
||||||
* Returns: `TRUE` if @self if opaque
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
(gdk_color_is_opaque) (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return _gdk_color_is_opaque (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_convert:
|
|
||||||
* @self: the `GdkColor` to store the result in
|
|
||||||
* @color_state: the target color start
|
|
||||||
* @other: the `GdkColor` to convert
|
|
||||||
*
|
|
||||||
* Converts a given `GdkColor` to another color state.
|
|
||||||
*
|
|
||||||
* After the conversion, @self will represent the same
|
|
||||||
* color as @other in @color_state, to the degree possible.
|
|
||||||
*
|
|
||||||
* Different color states have different gamuts of colors
|
|
||||||
* they can represent, and converting a color to a color
|
|
||||||
* state with a smaller gamut may yield an 'out of gamut'
|
|
||||||
* result.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_convert) (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const GdkColor *other)
|
|
||||||
{
|
|
||||||
gdk_color_convert (self, color_state, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_to_float:
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
* @target: the color state to convert to
|
|
||||||
* @values: the location to store the result in
|
|
||||||
*
|
|
||||||
* Converts a given `GdkColor to another color state
|
|
||||||
* and stores the result in a `float[4]`.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_to_float) (const GdkColor *self,
|
|
||||||
GdkColorState *target,
|
|
||||||
float values[4])
|
|
||||||
{
|
|
||||||
gdk_color_to_float (self, target, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_from_rgba:
|
|
||||||
* @self: the `GdkColor` to store the result in
|
|
||||||
* @color_state: the target color state
|
|
||||||
* @rgba: the `GdkRGBA` to convert
|
|
||||||
*
|
|
||||||
* Converts a given `GdkRGBA` to the target @color_state.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_color_from_rgba (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const GdkRGBA *rgba)
|
|
||||||
{
|
|
||||||
GdkColor tmp = {
|
|
||||||
.color_state = GDK_COLOR_STATE_SRGB,
|
|
||||||
.r = rgba->red,
|
|
||||||
.g = rgba->green,
|
|
||||||
.b = rgba->blue,
|
|
||||||
.a = rgba->alpha
|
|
||||||
};
|
|
||||||
|
|
||||||
gdk_color_convert (self, color_state, &tmp);
|
|
||||||
gdk_color_finish (&tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_get_depth:
|
|
||||||
* @self: a `GdkColor`
|
|
||||||
*
|
|
||||||
* Returns the preferred depth for the color state of @self.
|
|
||||||
*
|
|
||||||
* Returns: the preferred depth
|
|
||||||
*/
|
|
||||||
GdkMemoryDepth
|
|
||||||
(gdk_color_get_depth) (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return gdk_color_state_get_depth (self->color_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_print:
|
|
||||||
* @self: the `GdkColor` to print
|
|
||||||
* @string: the string to print to
|
|
||||||
*
|
|
||||||
* Appends a representation of @self to @string.
|
|
||||||
*
|
|
||||||
* The representation is inspired by CSS3 colors,
|
|
||||||
* but not 100% identical, and looks like this:
|
|
||||||
*
|
|
||||||
* color(NAME R G B / A)
|
|
||||||
*
|
|
||||||
* where `NAME` identifies color state, and
|
|
||||||
* `R`, `G`, `B` and `A` are the components of the color.
|
|
||||||
*
|
|
||||||
* The alpha may be omitted if it is 1.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_color_print (const GdkColor *self,
|
|
||||||
GString *string)
|
|
||||||
{
|
|
||||||
if (gdk_color_state_equal (self->color_state, GDK_COLOR_STATE_SRGB))
|
|
||||||
{
|
|
||||||
gdk_rgba_print ((const GdkRGBA *) self->values, string);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_string_append_printf (string, "color(%s %g %g %g",
|
|
||||||
gdk_color_state_get_name (self->color_state),
|
|
||||||
self->r, self->g, self->b);
|
|
||||||
if (self->a < 1)
|
|
||||||
g_string_append_printf (string, " / %g", self->a);
|
|
||||||
g_string_append_c (string, ')');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*< private >
|
|
||||||
* gdk_color_print:
|
|
||||||
* @self: the `GdkColor` to print
|
|
||||||
*
|
|
||||||
* Create a string representation of @self.
|
|
||||||
*
|
|
||||||
* See [method@Gdk.Color.print] for details about
|
|
||||||
* the format.
|
|
||||||
|
|
||||||
* Returns: (transfer full): a newly-allocated string
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
gdk_color_to_string (const GdkColor *self)
|
|
||||||
{
|
|
||||||
GString *string = g_string_new ("");
|
|
||||||
gdk_color_print (self, string);
|
|
||||||
return g_string_free (string, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@@ -1,224 +0,0 @@
|
|||||||
/* gdkcolordefs.h
|
|
||||||
*
|
|
||||||
* Copyright 2024 Matthias Clasen
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Note that this header is shared between the color state implementation
|
|
||||||
* and tests, and must not include other headers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
srgb_oetf (float v)
|
|
||||||
{
|
|
||||||
if (v > 0.0031308f)
|
|
||||||
return 1.055f * powf (v, 1.f / 2.4f) - 0.055f;
|
|
||||||
else
|
|
||||||
return 12.92f * v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
srgb_eotf (float v)
|
|
||||||
{
|
|
||||||
if (v >= 0.04045f)
|
|
||||||
return powf (((v + 0.055f) / (1.f + 0.055f)), 2.4f);
|
|
||||||
else
|
|
||||||
return v / 12.92f;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
gamma22_oetf (float v)
|
|
||||||
{
|
|
||||||
return powf (v, 1.f / 2.2f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
gamma22_eotf (float v)
|
|
||||||
{
|
|
||||||
return powf (v, 2.2f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
gamma28_oetf (float v)
|
|
||||||
{
|
|
||||||
return powf (v, 1.f / 2.8f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
gamma28_eotf (float v)
|
|
||||||
{
|
|
||||||
return powf (v, 2.8f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
pq_eotf (float v)
|
|
||||||
{
|
|
||||||
float ninv = (1 << 14) / 2610.0;
|
|
||||||
float minv = (1 << 5) / 2523.0;
|
|
||||||
float c1 = 3424.0 / (1 << 12);
|
|
||||||
float c2 = 2413.0 / (1 << 7);
|
|
||||||
float c3 = 2392.0 / (1 << 7);
|
|
||||||
|
|
||||||
float x = powf (MAX ((powf (v, minv) - c1), 0) / (c2 - (c3 * (powf (v, minv)))), ninv);
|
|
||||||
|
|
||||||
return x * 10000 / 203.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
pq_oetf (float v)
|
|
||||||
{
|
|
||||||
float x = v * 203.0 / 10000.0;
|
|
||||||
float n = 2610.0 / (1 << 14);
|
|
||||||
float m = 2523.0 / (1 << 5);
|
|
||||||
float c1 = 3424.0 / (1 << 12);
|
|
||||||
float c2 = 2413.0 / (1 << 7);
|
|
||||||
float c3 = 2392.0 / (1 << 7);
|
|
||||||
|
|
||||||
return powf (((c1 + (c2 * powf (x, n))) / (1 + (c3 * powf (x, n)))), m);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
bt709_eotf (float v)
|
|
||||||
{
|
|
||||||
const float a = 1.099;
|
|
||||||
const float d = 0.0812;
|
|
||||||
|
|
||||||
if (v < d)
|
|
||||||
return v / 4.5f;
|
|
||||||
else
|
|
||||||
return powf ((v + (a - 1)) / a, 1 / 0.45f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
bt709_oetf (float v)
|
|
||||||
{
|
|
||||||
const float a = 1.099;
|
|
||||||
const float b = 0.018;
|
|
||||||
|
|
||||||
if (v < b)
|
|
||||||
return v * 4.5f;
|
|
||||||
else
|
|
||||||
return a * powf (v, 0.45f) - (a - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
hlg_eotf (float v)
|
|
||||||
{
|
|
||||||
const float a = 0.17883277;
|
|
||||||
const float b = 0.28466892;
|
|
||||||
const float c = 0.55991073;
|
|
||||||
|
|
||||||
if (v <= 0.5)
|
|
||||||
return (v * v) / 3;
|
|
||||||
else
|
|
||||||
return (expf ((v - c) / a) + b) / 12.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
hlg_oetf (float v)
|
|
||||||
{
|
|
||||||
const float a = 0.17883277;
|
|
||||||
const float b = 0.28466892;
|
|
||||||
const float c = 0.55991073;
|
|
||||||
|
|
||||||
if (v <= 1/12.0)
|
|
||||||
return sqrtf (3 * v);
|
|
||||||
else
|
|
||||||
return a * logf (12 * v - b) + c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
|
|
||||||
* for how to derive the abc_to_xyz matrices from chromaticity coordinates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const float identity[9] = {
|
|
||||||
1, 0, 0,
|
|
||||||
0, 1, 0,
|
|
||||||
0, 0, 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float srgb_to_xyz[9] = {
|
|
||||||
0.4124564, 0.3575761, 0.1804375,
|
|
||||||
0.2126729, 0.7151522, 0.0721750,
|
|
||||||
0.0193339, 0.1191920, 0.9503041,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float xyz_to_srgb[9] = {
|
|
||||||
3.2404542, -1.5371385, -0.4985314,
|
|
||||||
-0.9692660, 1.8760108, 0.0415560,
|
|
||||||
0.0556434, -0.2040259, 1.0572252,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float rec2020_to_xyz[9] = {
|
|
||||||
0.6369580, 0.1446169, 0.1688810,
|
|
||||||
0.2627002, 0.6779981, 0.0593017,
|
|
||||||
0.0000000, 0.0280727, 1.0609851,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float xyz_to_rec2020[9] = {
|
|
||||||
1.7166512, -0.3556708, -0.2533663,
|
|
||||||
-0.6666844, 1.6164812, 0.0157685,
|
|
||||||
0.0176399, -0.0427706, 0.9421031,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float pal_to_xyz[9] = {
|
|
||||||
0.4305538, 0.3415498, 0.1783523,
|
|
||||||
0.2220043, 0.7066548, 0.0713409,
|
|
||||||
0.0201822, 0.1295534, 0.9393222,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float xyz_to_pal[9] = {
|
|
||||||
3.0633611, -1.3933902, -0.4758237,
|
|
||||||
-0.9692436, 1.8759675, 0.0415551,
|
|
||||||
0.0678610, -0.2287993, 1.0690896,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float ntsc_to_xyz[9] = {
|
|
||||||
0.3935209, 0.3652581, 0.1916769,
|
|
||||||
0.2123764, 0.7010599, 0.0865638,
|
|
||||||
0.0187391, 0.1119339, 0.9583847,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float xyz_to_ntsc[9] = {
|
|
||||||
3.5060033, -1.7397907, -0.5440583,
|
|
||||||
-1.0690476, 1.9777789, 0.0351714,
|
|
||||||
0.0563066, -0.1969757, 1.0499523,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float p3_to_xyz[9] = {
|
|
||||||
0.4865709, 0.2656677, 0.1982173,
|
|
||||||
0.2289746, 0.6917385, 0.0792869,
|
|
||||||
0.0000000, 0.0451134, 1.0439444,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float xyz_to_p3[9] = {
|
|
||||||
2.4934969, -0.9313836, -0.4027108,
|
|
||||||
-0.8294890, 1.7626641, 0.0236247,
|
|
||||||
0.0358458, -0.0761724, 0.9568845,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* premultiplied matrices for default conversions */
|
|
||||||
|
|
||||||
static const float rec2020_to_srgb[9] = {
|
|
||||||
1.660227, -0.587548, -0.072838,
|
|
||||||
-0.124553, 1.132926, -0.008350,
|
|
||||||
-0.018155, -0.100603, 1.118998,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const float srgb_to_rec2020[9] = {
|
|
||||||
0.627504, 0.329275, 0.043303,
|
|
||||||
0.069108, 0.919519, 0.011360,
|
|
||||||
0.016394, 0.088011, 0.895380,
|
|
||||||
};
|
|
@@ -1,135 +0,0 @@
|
|||||||
/* GDK - The GIMP Drawing Kit
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 Benjamin Otte
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define gdk_color_init(...) _gdk_color_init (__VA_ARGS__)
|
|
||||||
static inline void
|
|
||||||
_gdk_color_init (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const float values[4])
|
|
||||||
{
|
|
||||||
self->color_state = gdk_color_state_ref (color_state);
|
|
||||||
memcpy (self->values, values, sizeof (float) * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_init_copy(self, color) _gdk_color_init_copy ((self), (color))
|
|
||||||
static inline void
|
|
||||||
_gdk_color_init_copy (GdkColor *self,
|
|
||||||
const GdkColor *color)
|
|
||||||
{
|
|
||||||
_gdk_color_init (self, color->color_state, color->values);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_init_from_rgb(self, rgba) _gdk_color_init_from_rgba ((self), (rgba))
|
|
||||||
static inline void
|
|
||||||
_gdk_color_init_from_rgba (GdkColor *self,
|
|
||||||
const GdkRGBA *rgba)
|
|
||||||
{
|
|
||||||
_gdk_color_init (self, GDK_COLOR_STATE_SRGB, (const float *) rgba);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_finish(self) _gdk_color_finish ((self))
|
|
||||||
static inline void
|
|
||||||
_gdk_color_finish (GdkColor *self)
|
|
||||||
{
|
|
||||||
gdk_color_state_unref (self->color_state);
|
|
||||||
self->color_state = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_get_color_state(self) _gdk_color_get_color_state ((self))
|
|
||||||
static inline GdkColorState *
|
|
||||||
_gdk_color_get_color_state (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return self->color_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_equal(self, other) _gdk_color_equal ((self), (other))
|
|
||||||
static inline gboolean
|
|
||||||
_gdk_color_equal (const GdkColor *self,
|
|
||||||
const GdkColor *other)
|
|
||||||
{
|
|
||||||
return self->values[0] == other->values[0] &&
|
|
||||||
self->values[1] == other->values[1] &&
|
|
||||||
self->values[2] == other->values[2] &&
|
|
||||||
self->values[3] == other->values[3] &&
|
|
||||||
gdk_color_state_equal (self->color_state, other->color_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_is_clear(self) _gdk_color_is_clear ((self))
|
|
||||||
static inline gboolean
|
|
||||||
_gdk_color_is_clear (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return self->alpha < (255.f / 65535.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_is_opaque(self) _gdk_color_is_opaque ((self))
|
|
||||||
static inline gboolean
|
|
||||||
_gdk_color_is_opaque (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return self->alpha > (65280.f / 65535.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_convert(self, cs, other) _gdk_color_convert ((self), (cs), (other))
|
|
||||||
static inline void
|
|
||||||
_gdk_color_convert (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const GdkColor *other)
|
|
||||||
{
|
|
||||||
if (gdk_color_state_equal (color_state, other->color_state))
|
|
||||||
{
|
|
||||||
gdk_color_init_copy (self, other);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->color_state = gdk_color_state_ref (color_state);
|
|
||||||
|
|
||||||
gdk_color_state_convert_color (other->color_state,
|
|
||||||
other->values,
|
|
||||||
self->color_state,
|
|
||||||
self->values);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_to_float(self, cs, values) _gdk_color_to_float ((self), (cs), (values))
|
|
||||||
static inline void
|
|
||||||
_gdk_color_to_float (const GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
float values[4])
|
|
||||||
{
|
|
||||||
if (gdk_color_state_equal (self->color_state, color_state))
|
|
||||||
{
|
|
||||||
memcpy (values, self->values, sizeof (float) * 4);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_color_state_convert_color (self->color_state,
|
|
||||||
self->values,
|
|
||||||
color_state,
|
|
||||||
values);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_get_depth(self) _gdk_color_get_depth ((self))
|
|
||||||
static inline GdkMemoryDepth
|
|
||||||
_gdk_color_get_depth (const GdkColor *self)
|
|
||||||
{
|
|
||||||
return gdk_color_state_get_depth (self->color_state);
|
|
||||||
}
|
|
||||||
|
|
@@ -1,107 +0,0 @@
|
|||||||
/* GDK - The GIMP Drawing Kit
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 Benjamin Otte
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
|
||||||
#include <gdk/gdkcolorstate.h>
|
|
||||||
#include <gdk/gdkrgba.h>
|
|
||||||
#include <gdk/gdkmemoryformatprivate.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _GdkColor GdkColor;
|
|
||||||
|
|
||||||
/* The interpretation of the first 3 components depends on the color state.
|
|
||||||
* values[3] is always alpha.
|
|
||||||
*/
|
|
||||||
struct _GdkColor
|
|
||||||
{
|
|
||||||
GdkColorState *color_state;
|
|
||||||
union {
|
|
||||||
float values[4];
|
|
||||||
struct {
|
|
||||||
float r;
|
|
||||||
float g;
|
|
||||||
float b;
|
|
||||||
float a;
|
|
||||||
};
|
|
||||||
struct {
|
|
||||||
float red;
|
|
||||||
float green;
|
|
||||||
float blue;
|
|
||||||
float alpha;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, r) == G_STRUCT_OFFSET (GdkColor, red));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, g) == G_STRUCT_OFFSET (GdkColor, green));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, b) == G_STRUCT_OFFSET (GdkColor, blue));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, a) == G_STRUCT_OFFSET (GdkColor, alpha));
|
|
||||||
|
|
||||||
/* The committee notes that since all known implementations but one "get it right"
|
|
||||||
* this may well not be a defect at all.
|
|
||||||
* https://open-std.org/JTC1/SC22/WG14/www/docs/n2396.htm#dr_496
|
|
||||||
*/
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, r) == G_STRUCT_OFFSET (GdkColor, values[0]));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, g) == G_STRUCT_OFFSET (GdkColor, values[1]));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, b) == G_STRUCT_OFFSET (GdkColor, values[2]));
|
|
||||||
G_STATIC_ASSERT (G_STRUCT_OFFSET (GdkColor, a) == G_STRUCT_OFFSET (GdkColor, values[3]));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GDK_COLOR_SRGB(r,g,b,a) (GdkColor) { \
|
|
||||||
.color_state = GDK_COLOR_STATE_SRGB, \
|
|
||||||
.values = { (r), (g), (b), (a) } \
|
|
||||||
}
|
|
||||||
|
|
||||||
void gdk_color_init (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const float values[4]);
|
|
||||||
void gdk_color_init_copy (GdkColor *self,
|
|
||||||
const GdkColor *color);
|
|
||||||
void gdk_color_init_from_rgba (GdkColor *self,
|
|
||||||
const GdkRGBA *rgba);
|
|
||||||
void gdk_color_finish (GdkColor *self);
|
|
||||||
|
|
||||||
gboolean gdk_color_equal (const GdkColor *color1,
|
|
||||||
const GdkColor *color2);
|
|
||||||
gboolean gdk_color_is_clear (const GdkColor *self);
|
|
||||||
gboolean gdk_color_is_opaque (const GdkColor *self);
|
|
||||||
GdkMemoryDepth gdk_color_get_depth (const GdkColor *self);
|
|
||||||
|
|
||||||
void gdk_color_convert (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const GdkColor *other);
|
|
||||||
|
|
||||||
void gdk_color_to_float (const GdkColor *self,
|
|
||||||
GdkColorState *target,
|
|
||||||
float values[4]);
|
|
||||||
|
|
||||||
void gdk_color_from_rgba (GdkColor *self,
|
|
||||||
GdkColorState *color_state,
|
|
||||||
const GdkRGBA *rgba);
|
|
||||||
|
|
||||||
void gdk_color_print (const GdkColor *self,
|
|
||||||
GString *string);
|
|
||||||
|
|
||||||
char * gdk_color_to_string (const GdkColor *self);
|
|
||||||
|
|
||||||
#include "gdkcolorimpl.h"
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
@@ -1,774 +0,0 @@
|
|||||||
/* gdkcolorstate.c
|
|
||||||
*
|
|
||||||
* Copyright 2024 Matthias Clasen
|
|
||||||
*
|
|
||||||
* 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "gdkcolordefs.h"
|
|
||||||
|
|
||||||
#include <glib/gi18n-lib.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkColorState:
|
|
||||||
*
|
|
||||||
* A `GdkColorState` object provides the information to interpret
|
|
||||||
* colors and pixels in a variety of ways.
|
|
||||||
*
|
|
||||||
* They are also known as
|
|
||||||
* [*color spaces*](https://en.wikipedia.org/wiki/Color_space).
|
|
||||||
*
|
|
||||||
* Crucially, GTK knows how to convert colors from one color
|
|
||||||
* state to another.
|
|
||||||
*
|
|
||||||
* `GdkColorState objects are immutable and therefore threadsafe.
|
|
||||||
*
|
|
||||||
* Since 4.16
|
|
||||||
*/
|
|
||||||
|
|
||||||
G_DEFINE_BOXED_TYPE (GdkColorState, gdk_color_state,
|
|
||||||
gdk_color_state_ref, gdk_color_state_unref);
|
|
||||||
|
|
||||||
/* {{{ Public API */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_ref:
|
|
||||||
* @self: a `GdkColorState`
|
|
||||||
*
|
|
||||||
* Increase the reference count of @self.
|
|
||||||
*
|
|
||||||
* Returns: the object that was passed in
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
(gdk_color_state_ref) (GdkColorState *self)
|
|
||||||
{
|
|
||||||
return _gdk_color_state_ref (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_unref:
|
|
||||||
* @self:a `GdkColorState`
|
|
||||||
*
|
|
||||||
* Decrease the reference count of @self.
|
|
||||||
*
|
|
||||||
* Unless @self is static, it will be freed
|
|
||||||
* when the reference count reaches zero.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
(gdk_color_state_unref) (GdkColorState *self)
|
|
||||||
{
|
|
||||||
_gdk_color_state_unref (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_get_srgb:
|
|
||||||
*
|
|
||||||
* Returns the color state object representing the sRGB color space.
|
|
||||||
*
|
|
||||||
* This color state uses the primaries defined by BT.709-6 and the transfer function
|
|
||||||
* defined by IEC 61966-2-1.
|
|
||||||
*
|
|
||||||
* It is equivalent to the [Cicp](class.CicpParams.html) tuple 1/13/0/1.
|
|
||||||
*
|
|
||||||
* See e.g. [the CSS Color Module](https://www.w3.org/TR/css-color-4/#predefined-sRGB)
|
|
||||||
* for details about this colorstate.
|
|
||||||
*
|
|
||||||
* Returns: the color state object for sRGB
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_get_srgb (void)
|
|
||||||
{
|
|
||||||
return GDK_COLOR_STATE_SRGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_get_srgb_linear:
|
|
||||||
*
|
|
||||||
* Returns the color state object representing the linearized sRGB color space.
|
|
||||||
*
|
|
||||||
* This color state uses the primaries defined by BT.709-6 and a linear transfer function.
|
|
||||||
*
|
|
||||||
* It is equivalent to the [Cicp](class.CicpParams.html) tuple 1/8/0/1.
|
|
||||||
*
|
|
||||||
* See e.g. [the CSS Color Module](https://www.w3.org/TR/css-color-4/#predefined-sRGB-linear)
|
|
||||||
* for details about this colorstate.
|
|
||||||
*
|
|
||||||
* Returns: the color state object for linearized sRGB
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_get_srgb_linear (void)
|
|
||||||
{
|
|
||||||
return GDK_COLOR_STATE_SRGB_LINEAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_get_rec2100_pq:
|
|
||||||
*
|
|
||||||
* Returns the color state object representing the rec2100-pq color space.
|
|
||||||
*
|
|
||||||
* This color state uses the primaries defined by BT.2020-2 and BT.2100-0 and the transfer
|
|
||||||
* function defined by SMPTE ST 2084 and BT.2100-2.
|
|
||||||
*
|
|
||||||
* It is equivalent to the [Cicp](class.CicpParams.html) tuple 9/16/0/1.
|
|
||||||
*
|
|
||||||
* See e.g. [the CSS HDR Module](https://drafts.csswg.org/css-color-hdr/#valdef-color-rec2100-pq)
|
|
||||||
* for details about this colorstate.
|
|
||||||
*
|
|
||||||
* Returns: the color state object for rec2100-pq
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_get_rec2100_pq (void)
|
|
||||||
{
|
|
||||||
return GDK_COLOR_STATE_REC2100_PQ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_get_rec2100_linear:
|
|
||||||
*
|
|
||||||
* Returns the color state object representing the linear rec2100 color space.
|
|
||||||
*
|
|
||||||
* This color state uses the primaries defined by BT.2020-2 and BT.2100-0 and a linear
|
|
||||||
* transfer function.
|
|
||||||
*
|
|
||||||
* It is equivalent to the [Cicp](class.CicpParams.html) tuple 9/8/0/1.
|
|
||||||
*
|
|
||||||
* See e.g. [the CSS HDR Module](https://drafts.csswg.org/css-color-hdr/#valdef-color-rec2100-linear)
|
|
||||||
* for details about this colorstate.
|
|
||||||
*
|
|
||||||
* Returns: the color state object for linearized rec2100
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_get_rec2100_linear (void)
|
|
||||||
{
|
|
||||||
return GDK_COLOR_STATE_REC2100_LINEAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_equal:
|
|
||||||
* @self: a `GdkColorState`
|
|
||||||
* @other: another `GdkColorStatee`
|
|
||||||
*
|
|
||||||
* Compares two `GdkColorStates` for equality.
|
|
||||||
*
|
|
||||||
* Note that this function is not guaranteed to be perfect and two objects
|
|
||||||
* describing the same color state may compare not equal. However, different
|
|
||||||
* color states will never compare equal.
|
|
||||||
*
|
|
||||||
* Returns: %TRUE if the two color states compare equal
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
(gdk_color_state_equal) (GdkColorState *self,
|
|
||||||
GdkColorState *other)
|
|
||||||
{
|
|
||||||
return _gdk_color_state_equal (self, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_color_state_create_cicp_params:
|
|
||||||
* @self: a `GdkColorState`
|
|
||||||
*
|
|
||||||
* Create a [class@Gdk.CicpParams] representing the colorstate.
|
|
||||||
*
|
|
||||||
* It is not guaranteed that every `GdkColorState` can be
|
|
||||||
* represented with Cicp parameters. If that is the case,
|
|
||||||
* this function returns `NULL`.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): A new [class@Gdk.CicpParams]
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkCicpParams *
|
|
||||||
gdk_color_state_create_cicp_params (GdkColorState *self)
|
|
||||||
{
|
|
||||||
const GdkCicp *cicp = gdk_color_state_get_cicp (self);
|
|
||||||
|
|
||||||
if (cicp)
|
|
||||||
return gdk_cicp_params_new_for_cicp (cicp);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Conversion functions */
|
|
||||||
|
|
||||||
typedef float (* GdkTransferFunc) (float v);
|
|
||||||
typedef const float GdkColorMatrix[9];
|
|
||||||
|
|
||||||
#define IDENTITY ((float*)0)
|
|
||||||
#define NONE ((GdkTransferFunc)0)
|
|
||||||
|
|
||||||
#define TRANSFORM(name, eotf, matrix, oetf) \
|
|
||||||
static void \
|
|
||||||
name (GdkColorState *self, \
|
|
||||||
float (*values)[4], \
|
|
||||||
gsize n_values) \
|
|
||||||
{ \
|
|
||||||
for (gsize i = 0; i < n_values; i++) \
|
|
||||||
{ \
|
|
||||||
if (eotf != NONE) \
|
|
||||||
{ \
|
|
||||||
values[i][0] = eotf (values[i][0]); \
|
|
||||||
values[i][1] = eotf (values[i][1]); \
|
|
||||||
values[i][2] = eotf (values[i][2]); \
|
|
||||||
} \
|
|
||||||
if (matrix != IDENTITY) \
|
|
||||||
{ \
|
|
||||||
float res[3]; \
|
|
||||||
res[0] = matrix[0] * values[i][0] + matrix[1] * values[i][1] + matrix[2] * values[i][2]; \
|
|
||||||
res[1] = matrix[3] * values[i][0] + matrix[4] * values[i][1] + matrix[5] * values[i][2]; \
|
|
||||||
res[2] = matrix[6] * values[i][0] + matrix[7] * values[i][1] + matrix[8] * values[i][2]; \
|
|
||||||
values[i][0] = res[0]; \
|
|
||||||
values[i][1] = res[1]; \
|
|
||||||
values[i][2] = res[2]; \
|
|
||||||
} \
|
|
||||||
if (oetf != NONE) \
|
|
||||||
{ \
|
|
||||||
values[i][0] = oetf (values[i][0]); \
|
|
||||||
values[i][1] = oetf (values[i][1]); \
|
|
||||||
values[i][2] = oetf (values[i][2]); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
TRANSFORM(gdk_default_srgb_to_srgb_linear, srgb_eotf, IDENTITY, NONE);
|
|
||||||
TRANSFORM(gdk_default_srgb_linear_to_srgb, NONE, IDENTITY, srgb_oetf)
|
|
||||||
TRANSFORM(gdk_default_rec2100_pq_to_rec2100_linear, pq_eotf, IDENTITY, NONE)
|
|
||||||
TRANSFORM(gdk_default_rec2100_linear_to_rec2100_pq, NONE, IDENTITY, pq_oetf)
|
|
||||||
TRANSFORM(gdk_default_srgb_linear_to_rec2100_linear, NONE, srgb_to_rec2020, NONE)
|
|
||||||
TRANSFORM(gdk_default_rec2100_linear_to_srgb_linear, NONE, rec2020_to_srgb, NONE)
|
|
||||||
TRANSFORM(gdk_default_srgb_to_rec2100_linear, srgb_eotf, srgb_to_rec2020, NONE)
|
|
||||||
TRANSFORM(gdk_default_rec2100_pq_to_srgb_linear, pq_eotf, rec2020_to_srgb, NONE)
|
|
||||||
TRANSFORM(gdk_default_srgb_linear_to_rec2100_pq, NONE, srgb_to_rec2020, pq_oetf)
|
|
||||||
TRANSFORM(gdk_default_rec2100_linear_to_srgb, NONE, rec2020_to_srgb, srgb_oetf)
|
|
||||||
TRANSFORM(gdk_default_srgb_to_rec2100_pq, srgb_eotf, srgb_to_rec2020, pq_oetf)
|
|
||||||
TRANSFORM(gdk_default_rec2100_pq_to_srgb, pq_eotf, rec2020_to_srgb, srgb_oetf)
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Default implementation */
|
|
||||||
/* {{{ Vfuncs */
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gdk_default_color_state_equal (GdkColorState *self,
|
|
||||||
GdkColorState *other)
|
|
||||||
{
|
|
||||||
return self == other;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
gdk_default_color_state_get_name (GdkColorState *color_state)
|
|
||||||
{
|
|
||||||
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
|
|
||||||
|
|
||||||
return self->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkColorState *
|
|
||||||
gdk_default_color_state_get_no_srgb_tf (GdkColorState *color_state)
|
|
||||||
{
|
|
||||||
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
|
|
||||||
|
|
||||||
return self->no_srgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFloatColorConvert
|
|
||||||
gdk_default_color_state_get_convert_to (GdkColorState *color_state,
|
|
||||||
GdkColorState *target)
|
|
||||||
{
|
|
||||||
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
|
|
||||||
|
|
||||||
if (GDK_IS_DEFAULT_COLOR_STATE (target))
|
|
||||||
return self->convert_to[GDK_DEFAULT_COLOR_STATE_ID (target)];
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFloatColorConvert
|
|
||||||
gdk_default_color_state_get_convert_from (GdkColorState *color_state,
|
|
||||||
GdkColorState *source)
|
|
||||||
{
|
|
||||||
/* This is ok because the default-to-default conversion functions
|
|
||||||
* don't use the passed colorstate at all.
|
|
||||||
*/
|
|
||||||
return gdk_default_color_state_get_convert_to (source, color_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const GdkCicp *
|
|
||||||
gdk_default_color_state_get_cicp (GdkColorState *color_state)
|
|
||||||
{
|
|
||||||
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
|
|
||||||
|
|
||||||
return &self->cicp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
static const
|
|
||||||
GdkColorStateClass GDK_DEFAULT_COLOR_STATE_CLASS = {
|
|
||||||
.free = NULL, /* crash here if this ever happens */
|
|
||||||
.equal = gdk_default_color_state_equal,
|
|
||||||
.get_name = gdk_default_color_state_get_name,
|
|
||||||
.get_no_srgb_tf = gdk_default_color_state_get_no_srgb_tf,
|
|
||||||
.get_convert_to = gdk_default_color_state_get_convert_to,
|
|
||||||
.get_convert_from = gdk_default_color_state_get_convert_from,
|
|
||||||
.get_cicp = gdk_default_color_state_get_cicp,
|
|
||||||
};
|
|
||||||
|
|
||||||
GdkDefaultColorState gdk_default_color_states[] = {
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB] = {
|
|
||||||
.parent = {
|
|
||||||
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
|
|
||||||
.ref_count = 0,
|
|
||||||
.depth = GDK_MEMORY_U8_SRGB,
|
|
||||||
.rendering_color_state = GDK_COLOR_STATE_SRGB_LINEAR,
|
|
||||||
},
|
|
||||||
.name = "srgb",
|
|
||||||
.no_srgb = GDK_COLOR_STATE_SRGB_LINEAR,
|
|
||||||
.convert_to = {
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_srgb_to_srgb_linear,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_to_rec2100_pq,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_to_rec2100_linear,
|
|
||||||
},
|
|
||||||
.cicp = { 1, 13, 0, 1 },
|
|
||||||
},
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = {
|
|
||||||
.parent = {
|
|
||||||
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
|
|
||||||
.ref_count = 0,
|
|
||||||
.depth = GDK_MEMORY_U8,
|
|
||||||
.rendering_color_state = GDK_COLOR_STATE_SRGB_LINEAR,
|
|
||||||
},
|
|
||||||
.name = "srgb-linear",
|
|
||||||
.no_srgb = NULL,
|
|
||||||
.convert_to = {
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB] = gdk_default_srgb_linear_to_srgb,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_linear_to_rec2100_pq,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_linear_to_rec2100_linear,
|
|
||||||
},
|
|
||||||
.cicp = { 1, 8, 0, 1 },
|
|
||||||
},
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = {
|
|
||||||
.parent = {
|
|
||||||
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
|
|
||||||
.ref_count = 0,
|
|
||||||
.depth = GDK_MEMORY_FLOAT16,
|
|
||||||
.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR,
|
|
||||||
},
|
|
||||||
.name = "rec2100-pq",
|
|
||||||
.no_srgb = NULL,
|
|
||||||
.convert_to = {
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB] = gdk_default_rec2100_pq_to_srgb,
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_pq_to_srgb_linear,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_rec2100_pq_to_rec2100_linear,
|
|
||||||
},
|
|
||||||
.cicp = { 9, 16, 0, 1 },
|
|
||||||
},
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = {
|
|
||||||
.parent = {
|
|
||||||
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
|
|
||||||
.ref_count = 0,
|
|
||||||
.depth = GDK_MEMORY_FLOAT16,
|
|
||||||
.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR,
|
|
||||||
},
|
|
||||||
.name = "rec2100-linear",
|
|
||||||
.no_srgb = NULL,
|
|
||||||
.convert_to = {
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB] = gdk_default_rec2100_linear_to_srgb,
|
|
||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_linear_to_srgb_linear,
|
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_rec2100_linear_to_rec2100_pq,
|
|
||||||
},
|
|
||||||
.cicp = { 9, 8, 0, 1 },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Cicp implementation */
|
|
||||||
|
|
||||||
typedef struct _GdkCicpColorState GdkCicpColorState;
|
|
||||||
struct _GdkCicpColorState
|
|
||||||
{
|
|
||||||
GdkColorState parent;
|
|
||||||
|
|
||||||
GdkColorState *no_srgb;
|
|
||||||
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
GdkTransferFunc eotf;
|
|
||||||
GdkTransferFunc oetf;
|
|
||||||
|
|
||||||
float *to_srgb;
|
|
||||||
float *to_rec2020;
|
|
||||||
float *from_srgb;
|
|
||||||
float *from_rec2020;
|
|
||||||
|
|
||||||
GdkCicp cicp;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* {{{ Conversion functions */
|
|
||||||
|
|
||||||
#define cicp ((GdkCicpColorState *)self)
|
|
||||||
|
|
||||||
TRANSFORM(gdk_cicp_to_srgb, cicp->eotf, cicp->to_srgb, srgb_oetf)
|
|
||||||
TRANSFORM(gdk_cicp_to_srgb_linear, cicp->eotf, cicp->to_srgb, NONE)
|
|
||||||
TRANSFORM(gdk_cicp_to_rec2100_pq, cicp->eotf, cicp->to_rec2020, pq_oetf)
|
|
||||||
TRANSFORM(gdk_cicp_to_rec2100_linear, cicp->eotf, cicp->to_rec2020, NONE)
|
|
||||||
TRANSFORM(gdk_cicp_from_srgb, srgb_eotf, cicp->from_srgb, cicp->oetf)
|
|
||||||
TRANSFORM(gdk_cicp_from_srgb_linear, NONE, cicp->from_srgb, cicp->oetf)
|
|
||||||
TRANSFORM(gdk_cicp_from_rec2100_pq, pq_eotf, cicp->from_rec2020, cicp->oetf)
|
|
||||||
TRANSFORM(gdk_cicp_from_rec2100_linear, NONE, cicp->from_rec2020, cicp->oetf)
|
|
||||||
|
|
||||||
#undef cicp
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Vfuncs */
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_cicp_color_state_free (GdkColorState *cs)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *self = (GdkCicpColorState *) cs;
|
|
||||||
|
|
||||||
if (self->no_srgb)
|
|
||||||
gdk_color_state_unref (self->no_srgb);
|
|
||||||
|
|
||||||
g_free (self->to_srgb);
|
|
||||||
g_free (self->to_rec2020);
|
|
||||||
g_free (self->from_srgb);
|
|
||||||
g_free (self->from_rec2020);
|
|
||||||
|
|
||||||
g_free (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gdk_cicp_color_state_equal (GdkColorState *self,
|
|
||||||
GdkColorState *other)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *cs1 = (GdkCicpColorState *) self;
|
|
||||||
GdkCicpColorState *cs2 = (GdkCicpColorState *) other;
|
|
||||||
|
|
||||||
return gdk_cicp_equal (&cs1->cicp, &cs2->cicp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
gdk_cicp_color_state_get_name (GdkColorState *self)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *cs = (GdkCicpColorState *) self;
|
|
||||||
|
|
||||||
return cs->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkColorState *
|
|
||||||
gdk_cicp_color_state_get_no_srgb_tf (GdkColorState *self)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *cs = (GdkCicpColorState *) self;
|
|
||||||
|
|
||||||
return cs->no_srgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFloatColorConvert
|
|
||||||
gdk_cicp_color_state_get_convert_to (GdkColorState *self,
|
|
||||||
GdkColorState *target)
|
|
||||||
{
|
|
||||||
if (!GDK_IS_DEFAULT_COLOR_STATE (target))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
switch (GDK_DEFAULT_COLOR_STATE_ID (target))
|
|
||||||
{
|
|
||||||
case GDK_COLOR_STATE_ID_SRGB:
|
|
||||||
return gdk_cicp_to_srgb;
|
|
||||||
case GDK_COLOR_STATE_ID_SRGB_LINEAR:
|
|
||||||
return gdk_cicp_to_srgb_linear;
|
|
||||||
case GDK_COLOR_STATE_ID_REC2100_PQ:
|
|
||||||
return gdk_cicp_to_rec2100_pq;
|
|
||||||
case GDK_COLOR_STATE_ID_REC2100_LINEAR:
|
|
||||||
return gdk_cicp_to_rec2100_linear;
|
|
||||||
|
|
||||||
case GDK_COLOR_STATE_N_IDS:
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFloatColorConvert
|
|
||||||
gdk_cicp_color_state_get_convert_from (GdkColorState *self,
|
|
||||||
GdkColorState *source)
|
|
||||||
{
|
|
||||||
if (!GDK_IS_DEFAULT_COLOR_STATE (source))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
switch (GDK_DEFAULT_COLOR_STATE_ID (source))
|
|
||||||
{
|
|
||||||
case GDK_COLOR_STATE_ID_SRGB:
|
|
||||||
return gdk_cicp_from_srgb;
|
|
||||||
case GDK_COLOR_STATE_ID_SRGB_LINEAR:
|
|
||||||
return gdk_cicp_from_srgb_linear;
|
|
||||||
case GDK_COLOR_STATE_ID_REC2100_PQ:
|
|
||||||
return gdk_cicp_from_rec2100_pq;
|
|
||||||
case GDK_COLOR_STATE_ID_REC2100_LINEAR:
|
|
||||||
return gdk_cicp_from_rec2100_linear;
|
|
||||||
|
|
||||||
case GDK_COLOR_STATE_N_IDS:
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const GdkCicp *
|
|
||||||
gdk_cicp_color_state_get_cicp (GdkColorState *color_state)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *self = (GdkCicpColorState *) color_state;
|
|
||||||
|
|
||||||
return &self->cicp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
static const
|
|
||||||
GdkColorStateClass GDK_CICP_COLOR_STATE_CLASS = {
|
|
||||||
.free = gdk_cicp_color_state_free,
|
|
||||||
.equal = gdk_cicp_color_state_equal,
|
|
||||||
.get_name = gdk_cicp_color_state_get_name,
|
|
||||||
.get_no_srgb_tf = gdk_cicp_color_state_get_no_srgb_tf,
|
|
||||||
.get_convert_to = gdk_cicp_color_state_get_convert_to,
|
|
||||||
.get_convert_from = gdk_cicp_color_state_get_convert_from,
|
|
||||||
.get_cicp = gdk_cicp_color_state_get_cicp,
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline float *
|
|
||||||
multiply (float res[9],
|
|
||||||
const float m1[9],
|
|
||||||
const float m2[9])
|
|
||||||
{
|
|
||||||
#define IDX(i,j) 3*i+j
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
for (int j = 0; j < 3; j++)
|
|
||||||
res[IDX(i,j)] = m1[IDX(i,0)] * m2[IDX(0,j)]
|
|
||||||
+ m1[IDX(i,1)] * m2[IDX(1,j)]
|
|
||||||
+ m1[IDX(i,2)] * m2[IDX(2,j)];
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_new_for_cicp (const GdkCicp *cicp,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
GdkCicpColorState *self;
|
|
||||||
GdkTransferFunc eotf;
|
|
||||||
GdkTransferFunc oetf;
|
|
||||||
gconstpointer to_xyz;
|
|
||||||
gconstpointer from_xyz;
|
|
||||||
|
|
||||||
if (cicp->range == GDK_CICP_RANGE_NARROW || cicp->matrix_coefficients != 0)
|
|
||||||
{
|
|
||||||
g_set_error (error,
|
|
||||||
G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
_("cicp: Narrow range or YUV not supported"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cicp->color_primaries == 2 ||
|
|
||||||
cicp->transfer_function == 2 ||
|
|
||||||
cicp->matrix_coefficients == 2)
|
|
||||||
{
|
|
||||||
g_set_error (error,
|
|
||||||
G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
_("cicp: Unspecified parameters not supported"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (guint i = 0; i < GDK_COLOR_STATE_N_IDS; i++)
|
|
||||||
{
|
|
||||||
if (gdk_cicp_equivalent (cicp, &gdk_default_color_states[i].cicp))
|
|
||||||
return (GdkColorState *) &gdk_default_color_states[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cicp->transfer_function)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
case 6:
|
|
||||||
case 14:
|
|
||||||
case 15:
|
|
||||||
eotf = bt709_eotf;
|
|
||||||
oetf = bt709_oetf;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
eotf = gamma22_eotf;
|
|
||||||
oetf = gamma22_oetf;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
eotf = gamma28_eotf;
|
|
||||||
oetf = gamma28_oetf;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
eotf = NONE;
|
|
||||||
oetf = NONE;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
eotf = srgb_eotf;
|
|
||||||
oetf = srgb_oetf;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
eotf = pq_eotf;
|
|
||||||
oetf = pq_oetf;
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
eotf = hlg_eotf;
|
|
||||||
oetf = hlg_oetf;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_set_error (error,
|
|
||||||
G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
_("cicp: Transfer function %u not supported"),
|
|
||||||
cicp->transfer_function);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cicp->color_primaries)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
to_xyz = srgb_to_xyz;
|
|
||||||
from_xyz = xyz_to_srgb;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
to_xyz = pal_to_xyz;
|
|
||||||
from_xyz = xyz_to_pal;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
to_xyz = ntsc_to_xyz;
|
|
||||||
from_xyz = xyz_to_ntsc;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
to_xyz = rec2020_to_xyz;
|
|
||||||
from_xyz = xyz_to_rec2020;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
to_xyz = p3_to_xyz;
|
|
||||||
from_xyz = xyz_to_p3;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_set_error (error,
|
|
||||||
G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
_("cicp: Color primaries %u not supported"),
|
|
||||||
cicp->color_primaries);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
self = g_new0 (GdkCicpColorState, 1);
|
|
||||||
|
|
||||||
self->parent.klass = &GDK_CICP_COLOR_STATE_CLASS;
|
|
||||||
self->parent.ref_count = 1;
|
|
||||||
|
|
||||||
/* sRGB is special-cased by being a default colorstate */
|
|
||||||
self->parent.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR;
|
|
||||||
|
|
||||||
self->parent.depth = GDK_MEMORY_FLOAT16;
|
|
||||||
|
|
||||||
memcpy (&self->cicp, cicp, sizeof (GdkCicp));
|
|
||||||
|
|
||||||
self->eotf = eotf;
|
|
||||||
self->oetf = oetf;
|
|
||||||
|
|
||||||
self->to_srgb = multiply (g_new (float, 9), xyz_to_srgb, to_xyz);
|
|
||||||
self->to_rec2020 = multiply (g_new (float, 9), xyz_to_rec2020, to_xyz);
|
|
||||||
self->from_srgb = multiply (g_new (float, 9), from_xyz, srgb_to_xyz);
|
|
||||||
self->from_rec2020 = multiply (g_new (float, 9), from_xyz, rec2020_to_xyz);
|
|
||||||
|
|
||||||
self->name = g_strdup_printf ("cicp-%u/%u/%u/%u",
|
|
||||||
cicp->color_primaries,
|
|
||||||
cicp->transfer_function,
|
|
||||||
cicp->matrix_coefficients,
|
|
||||||
cicp->range);
|
|
||||||
|
|
||||||
if (cicp->transfer_function == 13)
|
|
||||||
{
|
|
||||||
GdkCicp no_srgb;
|
|
||||||
|
|
||||||
memcpy (&no_srgb, cicp, sizeof (GdkCicp));
|
|
||||||
no_srgb.transfer_function = 8;
|
|
||||||
|
|
||||||
self->no_srgb = gdk_color_state_new_for_cicp (&no_srgb, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (GdkColorState *) self;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
/* {{{ Private API */
|
|
||||||
|
|
||||||
/*<private>
|
|
||||||
* gdk_color_state_get_name:
|
|
||||||
* @self: a colorstate
|
|
||||||
*
|
|
||||||
* Returns the name of @self.
|
|
||||||
*
|
|
||||||
* This is *not* a translated, user-visible string.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): a name for representing the color state
|
|
||||||
* in diagnostic output
|
|
||||||
*/
|
|
||||||
const char *
|
|
||||||
gdk_color_state_get_name (GdkColorState *self)
|
|
||||||
{
|
|
||||||
return self->klass->get_name (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*<private>
|
|
||||||
* gdk_color_state_get_no_srgb_tf:
|
|
||||||
* @self: a colorstate
|
|
||||||
*
|
|
||||||
* This function checks if the colorstate uses an sRGB transfer function
|
|
||||||
* as final operation. In that case, it is suitable for use with GL_SRGB
|
|
||||||
* (and the Vulkan equivalents).
|
|
||||||
*
|
|
||||||
* If it is suitable, the colorstate without the transfer function is
|
|
||||||
* returned. Otherwise, this function returns NULL.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): the colorstate without sRGB transfer function.
|
|
||||||
**/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_color_state_get_no_srgb_tf (GdkColorState *self)
|
|
||||||
{
|
|
||||||
if (!GDK_DEBUG_CHECK (LINEAR))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return self->klass->get_no_srgb_tf (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* vim:set foldmethod=marker expandtab: */
|
|
@@ -1,62 +0,0 @@
|
|||||||
/* gdkcolorstate.h
|
|
||||||
*
|
|
||||||
* Copyright 2024 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GDK_TYPE_COLOR_STATE (gdk_color_state_get_type ())
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GType gdk_color_state_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_color_state_ref (GdkColorState *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_color_state_unref (GdkColorState *self);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_color_state_get_srgb (void);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_color_state_get_srgb_linear (void);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_color_state_get_rec2100_pq (void);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_color_state_get_rec2100_linear (void);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
gboolean gdk_color_state_equal (GdkColorState *self,
|
|
||||||
GdkColorState *other);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkCicpParams *gdk_color_state_create_cicp_params (GdkColorState *self);
|
|
||||||
|
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkColorState, gdk_color_state_unref);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
@@ -1,220 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "gdkcolorstate.h"
|
|
||||||
|
|
||||||
#include "gdkcicpparamsprivate.h"
|
|
||||||
#include "gdkdebugprivate.h"
|
|
||||||
#include "gdkmemoryformatprivate.h"
|
|
||||||
#include "gdkrgba.h"
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GDK_COLOR_STATE_ID_SRGB,
|
|
||||||
GDK_COLOR_STATE_ID_SRGB_LINEAR,
|
|
||||||
GDK_COLOR_STATE_ID_REC2100_PQ,
|
|
||||||
GDK_COLOR_STATE_ID_REC2100_LINEAR,
|
|
||||||
|
|
||||||
GDK_COLOR_STATE_N_IDS
|
|
||||||
} GdkColorStateId;
|
|
||||||
|
|
||||||
typedef struct _GdkColorStateClass GdkColorStateClass;
|
|
||||||
|
|
||||||
struct _GdkColorState
|
|
||||||
{
|
|
||||||
const GdkColorStateClass *klass;
|
|
||||||
gatomicrefcount ref_count;
|
|
||||||
|
|
||||||
GdkMemoryDepth depth;
|
|
||||||
GdkColorState *rendering_color_state;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Note: self may be the source or the target colorstate */
|
|
||||||
typedef void (* GdkFloatColorConvert)(GdkColorState *self,
|
|
||||||
float (*values)[4],
|
|
||||||
gsize n_values);
|
|
||||||
|
|
||||||
struct _GdkColorStateClass
|
|
||||||
{
|
|
||||||
void (* free) (GdkColorState *self);
|
|
||||||
gboolean (* equal) (GdkColorState *self,
|
|
||||||
GdkColorState *other);
|
|
||||||
const char * (* get_name) (GdkColorState *self);
|
|
||||||
GdkColorState * (* get_no_srgb_tf) (GdkColorState *self);
|
|
||||||
GdkFloatColorConvert (* get_convert_to) (GdkColorState *self,
|
|
||||||
GdkColorState *target);
|
|
||||||
GdkFloatColorConvert (* get_convert_from) (GdkColorState *self,
|
|
||||||
GdkColorState *source);
|
|
||||||
const GdkCicp * (* get_cicp) (GdkColorState *self);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct _GdkDefaultColorState GdkDefaultColorState;
|
|
||||||
|
|
||||||
struct _GdkDefaultColorState
|
|
||||||
{
|
|
||||||
GdkColorState parent;
|
|
||||||
|
|
||||||
const char *name;
|
|
||||||
GdkColorState *no_srgb;
|
|
||||||
GdkFloatColorConvert convert_to[GDK_COLOR_STATE_N_IDS];
|
|
||||||
|
|
||||||
GdkCicp cicp;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern GdkDefaultColorState gdk_default_color_states[GDK_COLOR_STATE_N_IDS];
|
|
||||||
|
|
||||||
#define GDK_COLOR_STATE_SRGB ((GdkColorState *) &gdk_default_color_states[GDK_COLOR_STATE_ID_SRGB])
|
|
||||||
#define GDK_COLOR_STATE_SRGB_LINEAR ((GdkColorState *) &gdk_default_color_states[GDK_COLOR_STATE_ID_SRGB_LINEAR])
|
|
||||||
#define GDK_COLOR_STATE_REC2100_PQ ((GdkColorState *) &gdk_default_color_states[GDK_COLOR_STATE_ID_REC2100_PQ])
|
|
||||||
#define GDK_COLOR_STATE_REC2100_LINEAR ((GdkColorState *) &gdk_default_color_states[GDK_COLOR_STATE_ID_REC2100_LINEAR])
|
|
||||||
|
|
||||||
#define GDK_IS_DEFAULT_COLOR_STATE(c) ((GdkDefaultColorState *) (c) >= &gdk_default_color_states[0] && \
|
|
||||||
(GdkDefaultColorState *) (c) < &gdk_default_color_states[GDK_COLOR_STATE_N_IDS])
|
|
||||||
#define GDK_DEFAULT_COLOR_STATE_ID(c) ((GdkColorStateId) (((GdkDefaultColorState *) c) - gdk_default_color_states))
|
|
||||||
|
|
||||||
const char * gdk_color_state_get_name (GdkColorState *color_state);
|
|
||||||
GdkColorState * gdk_color_state_get_no_srgb_tf (GdkColorState *self);
|
|
||||||
|
|
||||||
GdkColorState * gdk_color_state_new_for_cicp (const GdkCicp *cicp,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
static inline GdkColorState *
|
|
||||||
gdk_color_state_get_rendering_color_state (GdkColorState *self,
|
|
||||||
gboolean srgb)
|
|
||||||
{
|
|
||||||
if (srgb)
|
|
||||||
{
|
|
||||||
self = gdk_color_state_get_no_srgb_tf (self);
|
|
||||||
g_assert (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GDK_DEBUG_CHECK (HDR))
|
|
||||||
self = GDK_COLOR_STATE_REC2100_PQ;
|
|
||||||
|
|
||||||
if (!GDK_DEBUG_CHECK (LINEAR))
|
|
||||||
return self;
|
|
||||||
|
|
||||||
return self->rendering_color_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline GdkMemoryDepth
|
|
||||||
gdk_color_state_get_depth (GdkColorState *self)
|
|
||||||
{
|
|
||||||
if (!GDK_DEBUG_CHECK (LINEAR) && self->depth == GDK_MEMORY_U8_SRGB)
|
|
||||||
return GDK_MEMORY_U8;
|
|
||||||
|
|
||||||
return self->depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline GdkColorState *
|
|
||||||
gdk_color_state_get_by_id (GdkColorStateId id)
|
|
||||||
{
|
|
||||||
return (GdkColorState *) &gdk_default_color_states[id];
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_state_ref(self) _gdk_color_state_ref (self)
|
|
||||||
static inline GdkColorState *
|
|
||||||
_gdk_color_state_ref (GdkColorState *self)
|
|
||||||
{
|
|
||||||
if (GDK_IS_DEFAULT_COLOR_STATE (self))
|
|
||||||
return self;
|
|
||||||
|
|
||||||
g_atomic_ref_count_inc (&self->ref_count);
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_state_unref(self) _gdk_color_state_unref (self)
|
|
||||||
static inline void
|
|
||||||
_gdk_color_state_unref (GdkColorState *self)
|
|
||||||
{
|
|
||||||
if (GDK_IS_DEFAULT_COLOR_STATE (self))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (g_atomic_ref_count_dec (&self->ref_count))
|
|
||||||
self->klass->free (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gdk_color_state_equal(a,b) _gdk_color_state_equal ((a), (b))
|
|
||||||
static inline gboolean
|
|
||||||
_gdk_color_state_equal (GdkColorState *self,
|
|
||||||
GdkColorState *other)
|
|
||||||
{
|
|
||||||
if (self == other)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (self->klass != other->klass)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return self->klass->equal (self, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: the functions returned from this expect the source
|
|
||||||
* color state to be passed as self
|
|
||||||
*/
|
|
||||||
static inline GdkFloatColorConvert
|
|
||||||
gdk_color_state_get_convert_to (GdkColorState *self,
|
|
||||||
GdkColorState *target)
|
|
||||||
{
|
|
||||||
return self->klass->get_convert_to (self, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: the functions returned from this expect the target
|
|
||||||
* color state to be passed as self
|
|
||||||
*/
|
|
||||||
static inline GdkFloatColorConvert
|
|
||||||
gdk_color_state_get_convert_from (GdkColorState *self,
|
|
||||||
GdkColorState *source)
|
|
||||||
{
|
|
||||||
return self->klass->get_convert_from (self, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline const GdkCicp *
|
|
||||||
gdk_color_state_get_cicp (GdkColorState *self)
|
|
||||||
{
|
|
||||||
return self->klass->get_cicp (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_color_state_convert_color (GdkColorState *src_cs,
|
|
||||||
const float src[4],
|
|
||||||
GdkColorState *dest_cs,
|
|
||||||
float dest[4])
|
|
||||||
{
|
|
||||||
GdkFloatColorConvert convert = NULL;
|
|
||||||
GdkFloatColorConvert convert2 = NULL;
|
|
||||||
|
|
||||||
memcpy (dest, src, sizeof (float) * 4);
|
|
||||||
|
|
||||||
if (gdk_color_state_equal (src_cs, dest_cs))
|
|
||||||
return;
|
|
||||||
|
|
||||||
convert = gdk_color_state_get_convert_to (src_cs, dest_cs);
|
|
||||||
|
|
||||||
if (!convert)
|
|
||||||
convert2 = gdk_color_state_get_convert_from (dest_cs, src_cs);
|
|
||||||
|
|
||||||
if (!convert && !convert2)
|
|
||||||
{
|
|
||||||
GdkColorState *connection = GDK_COLOR_STATE_REC2100_LINEAR;
|
|
||||||
convert = gdk_color_state_get_convert_to (src_cs, connection);
|
|
||||||
convert2 = gdk_color_state_get_convert_from (dest_cs, connection);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (convert)
|
|
||||||
convert (src_cs, (float(*)[4]) dest, 1);
|
|
||||||
|
|
||||||
if (convert2)
|
|
||||||
convert2 (dest_cs, (float(*)[4]) dest, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
gdk_color_state_from_rgba (GdkColorState *self,
|
|
||||||
const GdkRGBA *rgba,
|
|
||||||
float out_color[4])
|
|
||||||
{
|
|
||||||
gdk_color_state_convert_color (GDK_COLOR_STATE_SRGB,
|
|
||||||
(const float *) rgba,
|
|
||||||
self,
|
|
||||||
out_color);
|
|
||||||
}
|
|
||||||
|
|
@@ -533,13 +533,16 @@ deserialize_not_found (GdkContentDeserializer *deserializer)
|
|||||||
* @type: the GType to deserialize from
|
* @type: the GType to deserialize from
|
||||||
* @io_priority: the I/O priority of the operation
|
* @io_priority: the I/O priority of the operation
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the operation is done
|
* @callback: (scope async): callback to call when the operation is done
|
||||||
* @user_data: data to pass to the callback function
|
* @user_data: (closure): data to pass to the callback function
|
||||||
*
|
*
|
||||||
* Read content from the given input stream and deserialize it, asynchronously.
|
* Read content from the given input stream and deserialize it, asynchronously.
|
||||||
*
|
*
|
||||||
* The default I/O priority is %G_PRIORITY_DEFAULT (i.e. 0), and lower numbers
|
* The default I/O priority is %G_PRIORITY_DEFAULT (i.e. 0), and lower numbers
|
||||||
* indicate a higher priority.
|
* indicate a higher priority.
|
||||||
|
*
|
||||||
|
* When the operation is finished, @callback will be called. You must then
|
||||||
|
* call [func@Gdk.content_deserialize_finish] to get the result of the operation.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gdk_content_deserialize_async (GInputStream *stream,
|
gdk_content_deserialize_async (GInputStream *stream,
|
||||||
|
@@ -273,12 +273,16 @@ gdk_content_provider_content_changed (GdkContentProvider *provider)
|
|||||||
* @stream: the `GOutputStream` to write to
|
* @stream: the `GOutputStream` to write to
|
||||||
* @io_priority: I/O priority of the request.
|
* @io_priority: I/O priority of the request.
|
||||||
* @cancellable: (nullable): optional `GCancellable` object, %NULL to ignore.
|
* @cancellable: (nullable): optional `GCancellable` object, %NULL to ignore.
|
||||||
* @callback: (scope async) (closure user_data): callback to call when the request is satisfied
|
* @callback: (scope async): callback to call when the request is satisfied
|
||||||
* @user_data: the data to pass to callback function
|
* @user_data: (closure): the data to pass to callback function
|
||||||
*
|
*
|
||||||
* Asynchronously writes the contents of @provider to @stream in the given
|
* Asynchronously writes the contents of @provider to @stream in the given
|
||||||
* @mime_type.
|
* @mime_type.
|
||||||
*
|
*
|
||||||
|
* When the operation is finished @callback will be called. You must then call
|
||||||
|
* [method@Gdk.ContentProvider.write_mime_type_finish] to get the result
|
||||||
|
* of the operation.
|
||||||
|
*
|
||||||
* The given mime type does not need to be listed in the formats returned by
|
* The given mime type does not need to be listed in the formats returned by
|
||||||
* [method@Gdk.ContentProvider.ref_formats]. However, if the given `GType` is
|
* [method@Gdk.ContentProvider.ref_formats]. However, if the given `GType` is
|
||||||
* not supported, `G_IO_ERROR_NOT_SUPPORTED` will be reported.
|
* not supported, `G_IO_ERROR_NOT_SUPPORTED` will be reported.
|
||||||
|
@@ -539,13 +539,16 @@ serialize_not_found (GdkContentSerializer *serializer)
|
|||||||
* @value: the content to serialize
|
* @value: the content to serialize
|
||||||
* @io_priority: the I/O priority of the operation
|
* @io_priority: the I/O priority of the operation
|
||||||
* @cancellable: (nullable): optional `GCancellable` object
|
* @cancellable: (nullable): optional `GCancellable` object
|
||||||
* @callback: (scope async) (closure): callback to call when the operation is done
|
* @callback: (scope async): callback to call when the operation is done
|
||||||
* @user_data: data to pass to the callback function
|
* @user_data: (closure): data to pass to the callback function
|
||||||
*
|
*
|
||||||
* Serialize content and write it to the given output stream, asynchronously.
|
* Serialize content and write it to the given output stream, asynchronously.
|
||||||
*
|
*
|
||||||
* The default I/O priority is %G_PRIORITY_DEFAULT (i.e. 0), and lower numbers
|
* The default I/O priority is %G_PRIORITY_DEFAULT (i.e. 0), and lower numbers
|
||||||
* indicate a higher priority.
|
* indicate a higher priority.
|
||||||
|
*
|
||||||
|
* When the operation is finished, @callback will be called. You must then
|
||||||
|
* call [func@Gdk.content_serialize_finish] to get the result of the operation.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gdk_content_serialize_async (GOutputStream *stream,
|
gdk_content_serialize_async (GOutputStream *stream,
|
||||||
|
@@ -52,7 +52,7 @@ GdkCursor* gdk_cursor_new_from_name (const char *name,
|
|||||||
GdkCursor *fallback);
|
GdkCursor *fallback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GdkCursorGetTextureCallback:
|
* GdkCursorGetTestureCallback:
|
||||||
* @cursor: the `GdkCursor`
|
* @cursor: the `GdkCursor`
|
||||||
* @cursor_size: the nominal cursor size, in application pixels
|
* @cursor_size: the nominal cursor size, in application pixels
|
||||||
* @scale: the device scale
|
* @scale: the device scale
|
||||||
|
@@ -40,21 +40,20 @@ typedef enum {
|
|||||||
GDK_DEBUG_OFFLOAD = 1 << 12,
|
GDK_DEBUG_OFFLOAD = 1 << 12,
|
||||||
|
|
||||||
/* flags below are influencing behavior */
|
/* flags below are influencing behavior */
|
||||||
GDK_DEBUG_LINEAR = 1 << 13,
|
GDK_DEBUG_PORTALS = 1 << 14,
|
||||||
GDK_DEBUG_HDR = 1 << 14,
|
GDK_DEBUG_NO_PORTALS = 1 << 15,
|
||||||
GDK_DEBUG_PORTALS = 1 << 15,
|
GDK_DEBUG_GL_DISABLE = 1 << 16,
|
||||||
GDK_DEBUG_NO_PORTALS = 1 << 16,
|
GDK_DEBUG_GL_NO_FRACTIONAL= 1 << 17,
|
||||||
GDK_DEBUG_GL_DISABLE = 1 << 17,
|
|
||||||
GDK_DEBUG_GL_NO_FRACTIONAL= 1 << 18,
|
GDK_DEBUG_GL_DISABLE_GL = 1 << 19,
|
||||||
GDK_DEBUG_FORCE_OFFLOAD = 1 << 19,
|
GDK_DEBUG_GL_DISABLE_GLES = 1 << 20,
|
||||||
GDK_DEBUG_GL_DISABLE_GL = 1 << 20,
|
GDK_DEBUG_GL_PREFER_GL = 1 << 21,
|
||||||
GDK_DEBUG_GL_DISABLE_GLES = 1 << 21,
|
GDK_DEBUG_GL_DEBUG = 1 << 22,
|
||||||
GDK_DEBUG_GL_PREFER_GL = 1 << 22,
|
GDK_DEBUG_GL_EGL = 1 << 23,
|
||||||
GDK_DEBUG_GL_DEBUG = 1 << 23,
|
GDK_DEBUG_GL_GLX = 1 << 24,
|
||||||
GDK_DEBUG_GL_EGL = 1 << 24,
|
GDK_DEBUG_GL_WGL = 1 << 25,
|
||||||
GDK_DEBUG_GL_GLX = 1 << 25,
|
GDK_DEBUG_VULKAN_DISABLE = 1 << 26,
|
||||||
GDK_DEBUG_GL_WGL = 1 << 26,
|
GDK_DEBUG_VULKAN_VALIDATE = 1 << 27,
|
||||||
GDK_DEBUG_VULKAN_DISABLE = 1 << 27,
|
|
||||||
GDK_DEBUG_DEFAULT_SETTINGS= 1 << 28,
|
GDK_DEBUG_DEFAULT_SETTINGS= 1 << 28,
|
||||||
GDK_DEBUG_HIGH_DEPTH = 1 << 29,
|
GDK_DEBUG_HIGH_DEPTH = 1 << 29,
|
||||||
GDK_DEBUG_NO_VSYNC = 1 << 30,
|
GDK_DEBUG_NO_VSYNC = 1 << 30,
|
||||||
|
@@ -1,82 +0,0 @@
|
|||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "gdkdihedralprivate.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_dihedral_get_mat2 (GdkDihedral transform,
|
|
||||||
float *xx,
|
|
||||||
float *xy,
|
|
||||||
float *yx,
|
|
||||||
float *yy)
|
|
||||||
{
|
|
||||||
const float mat[8][2][2] = {
|
|
||||||
[GDK_DIHEDRAL_NORMAL] = {
|
|
||||||
{ 1.0, 0.0 },
|
|
||||||
{ 0.0, 1.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_90] = {
|
|
||||||
{ 0.0, 1.0 },
|
|
||||||
{ -1.0, 0.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_180] = {
|
|
||||||
{ -1.0, 0.0 },
|
|
||||||
{ 0.0, -1.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_270] = {
|
|
||||||
{ 0.0, -1.0 },
|
|
||||||
{ 1.0, 0.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_FLIPPED] = {
|
|
||||||
{ -1.0, 0.0 },
|
|
||||||
{ 0.0, 1.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_FLIPPED_90] = {
|
|
||||||
{ 0.0, -1.0 },
|
|
||||||
{ -1.0, 0.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_FLIPPED_180] = {
|
|
||||||
{ 1.0, 0.0 },
|
|
||||||
{ 0.0, -1.0 }
|
|
||||||
},
|
|
||||||
[GDK_DIHEDRAL_FLIPPED_270] = {
|
|
||||||
{ 0.0, 1.0 },
|
|
||||||
{ 1.0, 0.0 }
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
*xx = mat[transform][0][0];
|
|
||||||
*xy = mat[transform][1][0];
|
|
||||||
*yx = mat[transform][0][1];
|
|
||||||
*yy = mat[transform][1][1];
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkDihedral
|
|
||||||
gdk_dihedral_combine (GdkDihedral first,
|
|
||||||
GdkDihedral second)
|
|
||||||
{
|
|
||||||
return ((first & 4) ^ (second & 4)) |
|
|
||||||
((((first & 3) * (((second & 4) >> 1) + 1)) + second) & 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkDihedral
|
|
||||||
gdk_dihedral_invert (GdkDihedral self)
|
|
||||||
{
|
|
||||||
return ((4 - self) * (((self & 4) >> 1) + 1) & 3) | (self & 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gdk_dihedral_swaps_xy (GdkDihedral self)
|
|
||||||
{
|
|
||||||
return (self & 1) ? TRUE : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
gdk_dihedral_get_name (GdkDihedral self)
|
|
||||||
{
|
|
||||||
const char *name[] = {
|
|
||||||
"normal", "90", "180", "270", "flipped", "flipped-90", "flipped-180", "flipped-270"
|
|
||||||
};
|
|
||||||
|
|
||||||
return name[self];
|
|
||||||
}
|
|
@@ -1,49 +0,0 @@
|
|||||||
/* GDK - The GIMP Drawing Kit
|
|
||||||
* Copyright (C) 2024 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 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GDK_DIHEDRAL_NORMAL,
|
|
||||||
GDK_DIHEDRAL_90,
|
|
||||||
GDK_DIHEDRAL_180,
|
|
||||||
GDK_DIHEDRAL_270,
|
|
||||||
GDK_DIHEDRAL_FLIPPED,
|
|
||||||
GDK_DIHEDRAL_FLIPPED_90,
|
|
||||||
GDK_DIHEDRAL_FLIPPED_180,
|
|
||||||
GDK_DIHEDRAL_FLIPPED_270,
|
|
||||||
} GdkDihedral;
|
|
||||||
|
|
||||||
void gdk_dihedral_get_mat2 (GdkDihedral transform,
|
|
||||||
float *xx,
|
|
||||||
float *xy,
|
|
||||||
float *yx,
|
|
||||||
float *yy);
|
|
||||||
|
|
||||||
GdkDihedral gdk_dihedral_combine (GdkDihedral first,
|
|
||||||
GdkDihedral second);
|
|
||||||
GdkDihedral gdk_dihedral_invert (GdkDihedral self);
|
|
||||||
gboolean gdk_dihedral_swaps_xy (GdkDihedral self);
|
|
||||||
|
|
||||||
const char * gdk_dihedral_get_name (GdkDihedral self);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
@@ -1570,27 +1570,19 @@ describe_egl_config (EGLDisplay egl_display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
gdk_display_get_egl_config (GdkDisplay *self,
|
gdk_display_get_egl_config (GdkDisplay *self)
|
||||||
GdkMemoryDepth depth)
|
|
||||||
{
|
{
|
||||||
GdkDisplayPrivate *priv = gdk_display_get_instance_private (self);
|
GdkDisplayPrivate *priv = gdk_display_get_instance_private (self);
|
||||||
|
|
||||||
switch (depth)
|
return priv->egl_config;
|
||||||
{
|
}
|
||||||
case GDK_MEMORY_NONE:
|
|
||||||
case GDK_MEMORY_U8:
|
|
||||||
case GDK_MEMORY_U8_SRGB:
|
|
||||||
return priv->egl_config;
|
|
||||||
|
|
||||||
case GDK_MEMORY_U16:
|
gpointer
|
||||||
case GDK_MEMORY_FLOAT16:
|
gdk_display_get_egl_config_high_depth (GdkDisplay *self)
|
||||||
case GDK_MEMORY_FLOAT32:
|
{
|
||||||
return priv->egl_config_high_depth;
|
GdkDisplayPrivate *priv = gdk_display_get_instance_private (self);
|
||||||
|
|
||||||
case GDK_N_DEPTHS:
|
return priv->egl_config_high_depth;
|
||||||
default:
|
|
||||||
g_return_val_if_reached (priv->egl_config);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static EGLDisplay
|
static EGLDisplay
|
||||||
@@ -1882,8 +1874,6 @@ gdk_display_init_egl (GdkDisplay *self,
|
|||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_image_dma_buf_import_modifiers");
|
epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_image_dma_buf_import_modifiers");
|
||||||
self->have_egl_dma_buf_export =
|
self->have_egl_dma_buf_export =
|
||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_MESA_image_dma_buf_export");
|
epoxy_has_egl_extension (priv->egl_display, "EGL_MESA_image_dma_buf_export");
|
||||||
self->have_egl_gl_colorspace =
|
|
||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_gl_colorspace");
|
|
||||||
|
|
||||||
if (self->have_egl_no_config_context)
|
if (self->have_egl_no_config_context)
|
||||||
priv->egl_config_high_depth = gdk_display_create_egl_config (self,
|
priv->egl_config_high_depth = gdk_display_create_egl_config (self,
|
||||||
|
@@ -18,16 +18,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "gdkdisplay.h"
|
#include "gdkdisplay.h"
|
||||||
|
#include "gdksurface.h"
|
||||||
#include "gdkcursor.h"
|
#include "gdkcursor.h"
|
||||||
#include "gdkdebugprivate.h"
|
|
||||||
#include "gdkdeviceprivate.h"
|
|
||||||
#include "gdkdmabufdownloaderprivate.h"
|
|
||||||
#include "gdkdmabufprivate.h"
|
|
||||||
#include "gdkkeysprivate.h"
|
|
||||||
#include "gdkmemoryformatprivate.h"
|
|
||||||
#include "gdkmonitor.h"
|
#include "gdkmonitor.h"
|
||||||
|
#include "gdkdebugprivate.h"
|
||||||
#include "gdksurfaceprivate.h"
|
#include "gdksurfaceprivate.h"
|
||||||
|
#include "gdkkeysprivate.h"
|
||||||
|
#include "gdkdeviceprivate.h"
|
||||||
|
#include "gdkdmabufprivate.h"
|
||||||
|
#include "gdkdmabufdownloaderprivate.h"
|
||||||
|
|
||||||
#ifdef GDK_RENDERING_VULKAN
|
#ifdef GDK_RENDERING_VULKAN
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
@@ -45,9 +44,12 @@ typedef struct _GdkDisplayClass GdkDisplayClass;
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
GDK_VULKAN_FEATURE_DMABUF = 1 << 0,
|
GDK_VULKAN_FEATURE_DMABUF = 1 << 0,
|
||||||
GDK_VULKAN_FEATURE_YCBCR = 1 << 1,
|
GDK_VULKAN_FEATURE_YCBCR = 1 << 1,
|
||||||
GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT = 1 << 2,
|
GDK_VULKAN_FEATURE_DESCRIPTOR_INDEXING = 1 << 2,
|
||||||
GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT = 1 << 3,
|
GDK_VULKAN_FEATURE_DYNAMIC_INDEXING = 1 << 3,
|
||||||
GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT = 1 << 4,
|
GDK_VULKAN_FEATURE_NONUNIFORM_INDEXING = 1 << 4,
|
||||||
|
GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT = 1 << 5,
|
||||||
|
GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT = 1 << 6,
|
||||||
|
GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT = 1 << 7,
|
||||||
} GdkVulkanFeatures;
|
} GdkVulkanFeatures;
|
||||||
|
|
||||||
/* Tracks information about the device grab on this display */
|
/* Tracks information about the device grab on this display */
|
||||||
@@ -128,7 +130,6 @@ struct _GdkDisplay
|
|||||||
guint have_egl_pixel_format_float : 1;
|
guint have_egl_pixel_format_float : 1;
|
||||||
guint have_egl_dma_buf_import : 1;
|
guint have_egl_dma_buf_import : 1;
|
||||||
guint have_egl_dma_buf_export : 1;
|
guint have_egl_dma_buf_export : 1;
|
||||||
guint have_egl_gl_colorspace : 1;
|
|
||||||
|
|
||||||
GdkDmabufFormats *dmabuf_formats;
|
GdkDmabufFormats *dmabuf_formats;
|
||||||
GdkDmabufDownloader *dmabuf_downloaders[4];
|
GdkDmabufDownloader *dmabuf_downloaders[4];
|
||||||
@@ -246,8 +247,9 @@ gboolean gdk_display_init_egl (GdkDisplay *display
|
|||||||
gboolean allow_any,
|
gboolean allow_any,
|
||||||
GError **error);
|
GError **error);
|
||||||
gpointer gdk_display_get_egl_display (GdkDisplay *display);
|
gpointer gdk_display_get_egl_display (GdkDisplay *display);
|
||||||
gpointer gdk_display_get_egl_config (GdkDisplay *display,
|
gpointer gdk_display_get_egl_config (GdkDisplay *display);
|
||||||
GdkMemoryDepth depth);
|
gpointer gdk_display_get_egl_config_high_depth
|
||||||
|
(GdkDisplay *display);
|
||||||
|
|
||||||
void gdk_display_set_rgba (GdkDisplay *display,
|
void gdk_display_set_rgba (GdkDisplay *display,
|
||||||
gboolean rgba);
|
gboolean rgba);
|
||||||
|
165
gdk/gdkdmabuf.c
165
gdk/gdkdmabuf.c
@@ -71,7 +71,7 @@ download_memcpy (guchar *dst_data,
|
|||||||
bpp = gdk_memory_format_bytes_per_pixel (dst_format);
|
bpp = gdk_memory_format_bytes_per_pixel (dst_format);
|
||||||
src_stride = dmabuf->planes[0].stride;
|
src_stride = dmabuf->planes[0].stride;
|
||||||
src_data = src_datas[0] + dmabuf->planes[0].offset;
|
src_data = src_datas[0] + dmabuf->planes[0].offset;
|
||||||
g_return_if_fail (sizes[0] >= dmabuf->planes[0].offset + gdk_memory_format_min_buffer_size (dst_format, dst_stride, width, height));
|
g_return_if_fail (sizes[0] >= dmabuf->planes[0].offset + (height - 1) * dst_stride + width * bpp);
|
||||||
|
|
||||||
if (dst_stride == src_stride)
|
if (dst_stride == src_stride)
|
||||||
memcpy (dst_data, src_data, (height - 1) * dst_stride + width * bpp);
|
memcpy (dst_data, src_data, (height - 1) * dst_stride + width * bpp);
|
||||||
@@ -144,8 +144,8 @@ struct _YUVCoefficients
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* multiplied by 65536 */
|
/* multiplied by 65536 */
|
||||||
static const YUVCoefficients itu601_narrow = { 104597, -25675, -53279, 132201 };
|
//static const YUVCoefficients itu601_narrow = { 104597, -25675, -53279, 132201 };
|
||||||
//static const YUVCoefficients itu601_wide = { 74711, -25864, -38050, 133176 };
|
static const YUVCoefficients itu601_wide = { 74711, -25864, -38050, 133176 };
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
get_uv_values (const YUVCoefficients *coeffs,
|
get_uv_values (const YUVCoefficients *coeffs,
|
||||||
@@ -229,7 +229,7 @@ download_nv12 (guchar *dst_data,
|
|||||||
int r, g, b;
|
int r, g, b;
|
||||||
gsize xs, ys;
|
gsize xs, ys;
|
||||||
|
|
||||||
get_uv_values (&itu601_narrow, uv_data[x / X_SUB * 2 + U], uv_data[x / X_SUB * 2 + V], &r, &g, &b);
|
get_uv_values (&itu601_wide, uv_data[x / X_SUB * 2 + U], uv_data[x / X_SUB * 2 + V], &r, &g, &b);
|
||||||
|
|
||||||
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
|
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
|
||||||
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
|
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
|
||||||
@@ -241,108 +241,6 @@ download_nv12 (guchar *dst_data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
get_uv_values16 (const YUVCoefficients *coeffs,
|
|
||||||
guint16 u,
|
|
||||||
guint16 v,
|
|
||||||
gint64 *out_r,
|
|
||||||
gint64 *out_g,
|
|
||||||
gint64 *out_b)
|
|
||||||
{
|
|
||||||
gint64 u2 = (gint64) u - 32767;
|
|
||||||
gint64 v2 = (gint64) v - 32767;
|
|
||||||
*out_r = coeffs->v_to_r * v2;
|
|
||||||
*out_g = coeffs->u_to_g * u2 + coeffs->v_to_g * v2;
|
|
||||||
*out_b = coeffs->u_to_b * u2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
set_rgb_values16 (guint16 rgb[3],
|
|
||||||
guint16 y,
|
|
||||||
gint64 r,
|
|
||||||
gint64 g,
|
|
||||||
gint64 b)
|
|
||||||
{
|
|
||||||
gint64 y2 = (gint64) y * 65536;
|
|
||||||
|
|
||||||
rgb[0] = CLAMP ((y2 + r) >> 16, 0, 65535);
|
|
||||||
rgb[1] = CLAMP ((y2 + g) >> 16, 0, 65535);
|
|
||||||
rgb[2] = CLAMP ((y2 + b) >> 16, 0, 65535);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
download_p010 (guchar *dst,
|
|
||||||
gsize dst_stride,
|
|
||||||
GdkMemoryFormat dst_format,
|
|
||||||
gsize width,
|
|
||||||
gsize height,
|
|
||||||
const GdkDmabuf *dmabuf,
|
|
||||||
const guchar *src_data[GDK_DMABUF_MAX_PLANES],
|
|
||||||
gsize sizes[GDK_DMABUF_MAX_PLANES])
|
|
||||||
{
|
|
||||||
const guint16 *y_data, *uv_data;
|
|
||||||
guint16 *dst_data;
|
|
||||||
gsize x, y, y_stride, uv_stride;
|
|
||||||
gsize U, V, X_SUB, Y_SUB;
|
|
||||||
guint16 SIZE, MASK;
|
|
||||||
|
|
||||||
switch (dmabuf->fourcc)
|
|
||||||
{
|
|
||||||
case DRM_FORMAT_P010:
|
|
||||||
U = 0; V = 1; X_SUB = 2; Y_SUB = 2;
|
|
||||||
SIZE = 10;
|
|
||||||
break;
|
|
||||||
case DRM_FORMAT_P012:
|
|
||||||
U = 0; V = 1; X_SUB = 2; Y_SUB = 2;
|
|
||||||
SIZE = 12;
|
|
||||||
break;
|
|
||||||
case DRM_FORMAT_P016:
|
|
||||||
U = 0; V = 1; X_SUB = 2; Y_SUB = 2;
|
|
||||||
SIZE = 16;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MASK = 0xFFFF << (16 - SIZE);
|
|
||||||
|
|
||||||
y_stride = dmabuf->planes[0].stride / 2;
|
|
||||||
y_data = (const guint16 *) (src_data[0] + dmabuf->planes[0].offset);
|
|
||||||
g_return_if_fail (sizes[0] >= dmabuf->planes[0].offset + height * dmabuf->planes[0].stride);
|
|
||||||
uv_stride = dmabuf->planes[1].stride / 2;
|
|
||||||
uv_data = (const guint16 *) (src_data[1] + dmabuf->planes[1].offset);
|
|
||||||
g_return_if_fail (sizes[1] >= dmabuf->planes[1].offset + (height + Y_SUB - 1) / Y_SUB * dmabuf->planes[1].stride);
|
|
||||||
dst_data = (guint16 *) dst;
|
|
||||||
dst_stride /= 2;
|
|
||||||
|
|
||||||
for (y = 0; y < height; y += Y_SUB)
|
|
||||||
{
|
|
||||||
for (x = 0; x < width; x += X_SUB)
|
|
||||||
{
|
|
||||||
gint64 r, g, b;
|
|
||||||
gsize xs, ys;
|
|
||||||
guint16 u, v;
|
|
||||||
|
|
||||||
u = uv_data[x / X_SUB * 2 + U];
|
|
||||||
u = (u & MASK) | (u >> SIZE);
|
|
||||||
v = uv_data[x / X_SUB * 2 + V];
|
|
||||||
v = (v & MASK) | (v >> SIZE);
|
|
||||||
get_uv_values16 (&itu601_narrow, u, v, &r, &g, &b);
|
|
||||||
|
|
||||||
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
|
|
||||||
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
|
|
||||||
{
|
|
||||||
guint16 y_ = y_data[x + xs + y_stride * ys];
|
|
||||||
y_ = (y_ & MASK) | (y_ >> SIZE);
|
|
||||||
set_rgb_values16 (&dst_data[3 * (x + xs) + dst_stride * ys], y_, r, g, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dst_data += Y_SUB * dst_stride;
|
|
||||||
y_data += Y_SUB * y_stride;
|
|
||||||
uv_data += uv_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
download_yuv_3 (guchar *dst_data,
|
download_yuv_3 (guchar *dst_data,
|
||||||
gsize dst_stride,
|
gsize dst_stride,
|
||||||
@@ -411,7 +309,7 @@ download_yuv_3 (guchar *dst_data,
|
|||||||
int r, g, b;
|
int r, g, b;
|
||||||
gsize xs, ys;
|
gsize xs, ys;
|
||||||
|
|
||||||
get_uv_values (&itu601_narrow, u_data[x / X_SUB], v_data[x / X_SUB], &r, &g, &b);
|
get_uv_values (&itu601_wide, u_data[x / X_SUB], v_data[x / X_SUB], &r, &g, &b);
|
||||||
|
|
||||||
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
|
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
|
||||||
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
|
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
|
||||||
@@ -467,7 +365,7 @@ download_yuyv (guchar *dst_data,
|
|||||||
{
|
{
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
|
|
||||||
get_uv_values (&itu601_narrow, src_data[2 * x + U], src_data[2 * x + V], &r, &g, &b);
|
get_uv_values (&itu601_wide, src_data[2 * x + U], src_data[2 * x + V], &r, &g, &b);
|
||||||
set_rgb_values (&dst_data[3 * x], src_data[2 * x + Y1], r, g, b);
|
set_rgb_values (&dst_data[3 * x], src_data[2 * x + Y1], r, g, b);
|
||||||
if (x + 1 < width)
|
if (x + 1 < width)
|
||||||
set_rgb_values (&dst_data[3 * (x + 1)], src_data[2 * x + Y2], r, g, b);
|
set_rgb_values (&dst_data[3 * (x + 1)], src_data[2 * x + Y2], r, g, b);
|
||||||
@@ -1775,7 +1673,7 @@ static const GdkDrmFormatInfo supported_formats[] = {
|
|||||||
.download = NULL,
|
.download = NULL,
|
||||||
#ifdef GDK_RENDERING_VULKAN
|
#ifdef GDK_RENDERING_VULKAN
|
||||||
.vk = {
|
.vk = {
|
||||||
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
|
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
|
||||||
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@@ -1784,10 +1682,10 @@ static const GdkDrmFormatInfo supported_formats[] = {
|
|||||||
.fourcc = DRM_FORMAT_P010,
|
.fourcc = DRM_FORMAT_P010,
|
||||||
.memory_format = GDK_MEMORY_R16G16B16,
|
.memory_format = GDK_MEMORY_R16G16B16,
|
||||||
.is_yuv = TRUE,
|
.is_yuv = TRUE,
|
||||||
.download = download_p010,
|
.download = NULL,
|
||||||
#ifdef GDK_RENDERING_VULKAN
|
#ifdef GDK_RENDERING_VULKAN
|
||||||
.vk = {
|
.vk = {
|
||||||
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
|
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
|
||||||
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@@ -1796,10 +1694,10 @@ static const GdkDrmFormatInfo supported_formats[] = {
|
|||||||
.fourcc = DRM_FORMAT_P012,
|
.fourcc = DRM_FORMAT_P012,
|
||||||
.memory_format = GDK_MEMORY_R16G16B16,
|
.memory_format = GDK_MEMORY_R16G16B16,
|
||||||
.is_yuv = TRUE,
|
.is_yuv = TRUE,
|
||||||
.download = download_p010,
|
.download = NULL,
|
||||||
#ifdef GDK_RENDERING_VULKAN
|
#ifdef GDK_RENDERING_VULKAN
|
||||||
.vk = {
|
.vk = {
|
||||||
.format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
|
.format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,
|
||||||
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@@ -1808,10 +1706,10 @@ static const GdkDrmFormatInfo supported_formats[] = {
|
|||||||
.fourcc = DRM_FORMAT_P016,
|
.fourcc = DRM_FORMAT_P016,
|
||||||
.memory_format = GDK_MEMORY_R16G16B16,
|
.memory_format = GDK_MEMORY_R16G16B16,
|
||||||
.is_yuv = TRUE,
|
.is_yuv = TRUE,
|
||||||
.download = download_p010,
|
.download = NULL,
|
||||||
#ifdef GDK_RENDERING_VULKAN
|
#ifdef GDK_RENDERING_VULKAN
|
||||||
.vk = {
|
.vk = {
|
||||||
.format = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
|
.format = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
|
||||||
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
.swizzle = VULKAN_DEFAULT_SWIZZLE,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@@ -2130,8 +2028,8 @@ gdk_dmabuf_do_download_mmap (GdkTexture *texture,
|
|||||||
if (gdk_dmabuf_ioctl (dmabuf->planes[i].fd, DMA_BUF_IOCTL_SYNC, &(struct dma_buf_sync) { DMA_BUF_SYNC_START|DMA_BUF_SYNC_READ }) < 0)
|
if (gdk_dmabuf_ioctl (dmabuf->planes[i].fd, DMA_BUF_IOCTL_SYNC, &(struct dma_buf_sync) { DMA_BUF_SYNC_START|DMA_BUF_SYNC_READ }) < 0)
|
||||||
g_warning ("Failed to sync dmabuf: %s", g_strerror (errno));
|
g_warning ("Failed to sync dmabuf: %s", g_strerror (errno));
|
||||||
|
|
||||||
src_data[i] = mmap (NULL, sizes[i], PROT_READ, MAP_SHARED, dmabuf->planes[i].fd, 0);
|
src_data[i] = mmap (NULL, sizes[i], PROT_READ, MAP_SHARED, dmabuf->planes[i].fd, dmabuf->planes[i].offset);
|
||||||
if (src_data[i] == NULL || src_data[i] == MAP_FAILED)
|
if (src_data[i] == NULL)
|
||||||
{
|
{
|
||||||
g_warning ("Failed to mmap dmabuf: %s", g_strerror (errno));
|
g_warning ("Failed to mmap dmabuf: %s", g_strerror (errno));
|
||||||
goto out;
|
goto out;
|
||||||
@@ -2164,21 +2062,13 @@ out:
|
|||||||
void
|
void
|
||||||
gdk_dmabuf_download_mmap (GdkTexture *texture,
|
gdk_dmabuf_download_mmap (GdkTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride)
|
gsize stride)
|
||||||
{
|
{
|
||||||
GdkMemoryFormat src_format = gdk_texture_get_format (texture);
|
GdkMemoryFormat src_format = gdk_texture_get_format (texture);
|
||||||
GdkColorState *src_color_state = gdk_texture_get_color_state (texture);
|
|
||||||
|
|
||||||
if (format == src_format)
|
if (format == src_format)
|
||||||
{
|
gdk_dmabuf_do_download_mmap (texture, data, stride);
|
||||||
gdk_dmabuf_do_download_mmap (texture, data, stride);
|
|
||||||
gdk_memory_convert_color_state (data, stride, format,
|
|
||||||
src_color_state, color_state,
|
|
||||||
gdk_texture_get_width (texture),
|
|
||||||
gdk_texture_get_height (texture));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
@@ -2193,8 +2083,8 @@ gdk_dmabuf_download_mmap (GdkTexture *texture,
|
|||||||
|
|
||||||
gdk_dmabuf_do_download_mmap (texture, src_data, src_stride);
|
gdk_dmabuf_do_download_mmap (texture, src_data, src_stride);
|
||||||
|
|
||||||
gdk_memory_convert (data, stride, format, color_state,
|
gdk_memory_convert (data, stride, format,
|
||||||
src_data, src_stride, src_format, src_color_state,
|
src_data, src_stride, src_format,
|
||||||
width, height);
|
width, height);
|
||||||
|
|
||||||
g_free (src_data);
|
g_free (src_data);
|
||||||
@@ -2471,7 +2361,7 @@ gdk_dmabuf_is_disjoint (const GdkDmabuf *dmabuf)
|
|||||||
{
|
{
|
||||||
struct stat plane_stat;
|
struct stat plane_stat;
|
||||||
|
|
||||||
if (fstat (dmabuf->planes[i].fd, &plane_stat) != 0)
|
if (fstat (dmabuf->planes[0].fd, &plane_stat) != 0)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (first_stat.st_ino != plane_stat.st_ino)
|
if (first_stat.st_ino != plane_stat.st_ino)
|
||||||
@@ -2482,20 +2372,3 @@ gdk_dmabuf_is_disjoint (const GdkDmabuf *dmabuf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_DMABUF */
|
#endif /* HAVE_DMABUF */
|
||||||
|
|
||||||
void
|
|
||||||
gdk_dmabuf_close_fds (GdkDmabuf *dmabuf)
|
|
||||||
{
|
|
||||||
guint i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < dmabuf->n_planes; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j < i; j++)
|
|
||||||
{
|
|
||||||
if (dmabuf->planes[i].fd == dmabuf->planes[j].fd)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i == j)
|
|
||||||
g_close (dmabuf->planes[i].fd, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -35,7 +35,6 @@ void
|
|||||||
gdk_dmabuf_downloader_download (GdkDmabufDownloader *self,
|
gdk_dmabuf_downloader_download (GdkDmabufDownloader *self,
|
||||||
GdkDmabufTexture *texture,
|
GdkDmabufTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride)
|
gsize stride)
|
||||||
{
|
{
|
||||||
@@ -44,6 +43,6 @@ gdk_dmabuf_downloader_download (GdkDmabufDownloader *self,
|
|||||||
g_return_if_fail (GDK_IS_DMABUF_DOWNLOADER (self));
|
g_return_if_fail (GDK_IS_DMABUF_DOWNLOADER (self));
|
||||||
|
|
||||||
iface = GDK_DMABUF_DOWNLOADER_GET_IFACE (self);
|
iface = GDK_DMABUF_DOWNLOADER_GET_IFACE (self);
|
||||||
iface->download (self, texture, format, color_state, data, stride);
|
iface->download (self, texture, format, data, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,7 +20,6 @@ struct _GdkDmabufDownloaderInterface
|
|||||||
void (* download) (GdkDmabufDownloader *downloader,
|
void (* download) (GdkDmabufDownloader *downloader,
|
||||||
GdkDmabufTexture *texture,
|
GdkDmabufTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride);
|
gsize stride);
|
||||||
};
|
};
|
||||||
@@ -32,7 +31,6 @@ gboolean gdk_dmabuf_downloader_supports (GdkDmabufDownlo
|
|||||||
void gdk_dmabuf_downloader_download (GdkDmabufDownloader *downloader,
|
void gdk_dmabuf_downloader_download (GdkDmabufDownloader *downloader,
|
||||||
GdkDmabufTexture *texture,
|
GdkDmabufTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride);
|
gsize stride);
|
||||||
|
|
||||||
|
@@ -163,8 +163,6 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
previous = gdk_gl_context_get_current ();
|
previous = gdk_gl_context_get_current ();
|
||||||
if (previous)
|
|
||||||
g_object_ref (previous);
|
|
||||||
formats = gdk_dmabuf_formats_builder_new ();
|
formats = gdk_dmabuf_formats_builder_new ();
|
||||||
external = gdk_dmabuf_formats_builder_new ();
|
external = gdk_dmabuf_formats_builder_new ();
|
||||||
|
|
||||||
@@ -196,10 +194,7 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (previous)
|
if (previous)
|
||||||
{
|
gdk_gl_context_make_current (previous);
|
||||||
gdk_gl_context_make_current (previous);
|
|
||||||
g_object_unref (previous);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GDK_DMABUF_DOWNLOADER (renderer);
|
return GDK_DMABUF_DOWNLOADER (renderer);
|
||||||
}
|
}
|
||||||
@@ -244,7 +239,7 @@ gdk_dmabuf_egl_create_image (GdkDisplay *display,
|
|||||||
attribs[i++] = EGL_YUV_COLOR_SPACE_HINT_EXT;
|
attribs[i++] = EGL_YUV_COLOR_SPACE_HINT_EXT;
|
||||||
attribs[i++] = EGL_ITU_REC601_EXT;
|
attribs[i++] = EGL_ITU_REC601_EXT;
|
||||||
attribs[i++] = EGL_SAMPLE_RANGE_HINT_EXT;
|
attribs[i++] = EGL_SAMPLE_RANGE_HINT_EXT;
|
||||||
attribs[i++] = EGL_YUV_NARROW_RANGE_EXT;
|
attribs[i++] = EGL_YUV_FULL_RANGE_EXT;
|
||||||
|
|
||||||
#define ADD_PLANE(plane) \
|
#define ADD_PLANE(plane) \
|
||||||
{ \
|
{ \
|
||||||
@@ -270,7 +265,6 @@ gdk_dmabuf_egl_create_image (GdkDisplay *display,
|
|||||||
if (dmabuf->n_planes > 3) ADD_PLANE (3);
|
if (dmabuf->n_planes > 3) ADD_PLANE (3);
|
||||||
|
|
||||||
attribs[i++] = EGL_NONE;
|
attribs[i++] = EGL_NONE;
|
||||||
g_assert (i < G_N_ELEMENTS (attribs));
|
|
||||||
|
|
||||||
image = eglCreateImageKHR (egl_display,
|
image = eglCreateImageKHR (egl_display,
|
||||||
EGL_NO_CONTEXT,
|
EGL_NO_CONTEXT,
|
||||||
|
@@ -207,8 +207,7 @@ gdk_dmabuf_formats_new (GdkDmabufFormat *formats,
|
|||||||
self->n_formats = n_formats;
|
self->n_formats = n_formats;
|
||||||
self->formats = g_new (GdkDmabufFormat, n_formats);
|
self->formats = g_new (GdkDmabufFormat, n_formats);
|
||||||
|
|
||||||
if (n_formats != 0)
|
memcpy (self->formats, formats, n_formats * sizeof (GdkDmabufFormat));
|
||||||
memcpy (self->formats, formats, n_formats * sizeof (GdkDmabufFormat));
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@@ -55,6 +55,4 @@ GDK_AVAILABLE_IN_4_14
|
|||||||
gboolean gdk_dmabuf_formats_equal (const GdkDmabufFormats *formats1,
|
gboolean gdk_dmabuf_formats_equal (const GdkDmabufFormats *formats1,
|
||||||
const GdkDmabufFormats *formats2);
|
const GdkDmabufFormats *formats2);
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdkDmabufFormats, gdk_dmabuf_formats_unref);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
@@ -10,10 +10,6 @@
|
|||||||
((__u32)(c) << 16) | ((__u32)(d) << 24))
|
((__u32)(c) << 16) | ((__u32)(d) << 24))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DRM_FORMAT_INVALID
|
|
||||||
#define DRM_FORMAT_INVALID 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DRM_FORMAT_C1
|
#ifndef DRM_FORMAT_C1
|
||||||
#define DRM_FORMAT_C1 fourcc_code('C', '1', ' ', ' ')
|
#define DRM_FORMAT_C1 fourcc_code('C', '1', ' ', ' ')
|
||||||
#endif
|
#endif
|
||||||
|
@@ -22,17 +22,15 @@ struct _GdkDmabuf
|
|||||||
} planes[GDK_DMABUF_MAX_PLANES];
|
} planes[GDK_DMABUF_MAX_PLANES];
|
||||||
};
|
};
|
||||||
|
|
||||||
void gdk_dmabuf_close_fds (GdkDmabuf *dmabuf);
|
|
||||||
|
|
||||||
#ifdef HAVE_DMABUF
|
#ifdef HAVE_DMABUF
|
||||||
|
|
||||||
GdkDmabufFormats * gdk_dmabuf_get_mmap_formats (void) G_GNUC_CONST;
|
GdkDmabufFormats * gdk_dmabuf_get_mmap_formats (void) G_GNUC_CONST;
|
||||||
void gdk_dmabuf_download_mmap (GdkTexture *texture,
|
void gdk_dmabuf_download_mmap (GdkTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride);
|
gsize stride);
|
||||||
|
|
||||||
|
|
||||||
int gdk_dmabuf_ioctl (int fd,
|
int gdk_dmabuf_ioctl (int fd,
|
||||||
unsigned long request,
|
unsigned long request,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
#include "gdkdmabuftextureprivate.h"
|
#include "gdkdmabuftextureprivate.h"
|
||||||
|
|
||||||
#include "gdkcolorstateprivate.h"
|
|
||||||
#include "gdkdisplayprivate.h"
|
#include "gdkdisplayprivate.h"
|
||||||
#include "gdkdmabufdownloaderprivate.h"
|
#include "gdkdmabufdownloaderprivate.h"
|
||||||
#include "gdkdmabufformatsbuilderprivate.h"
|
#include "gdkdmabufformatsbuilderprivate.h"
|
||||||
@@ -63,13 +62,6 @@ struct _GdkDmabufTextureClass
|
|||||||
GdkTextureClass parent_class;
|
GdkTextureClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_dmabuf_error_quark:
|
|
||||||
*
|
|
||||||
* Registers an error quark for [class@Gdk.DmabufTexture] errors.
|
|
||||||
*
|
|
||||||
* Returns: the error quark
|
|
||||||
**/
|
|
||||||
G_DEFINE_QUARK (gdk-dmabuf-error-quark, gdk_dmabuf_error)
|
G_DEFINE_QUARK (gdk-dmabuf-error-quark, gdk_dmabuf_error)
|
||||||
|
|
||||||
G_DEFINE_TYPE (GdkDmabufTexture, gdk_dmabuf_texture, GDK_TYPE_TEXTURE)
|
G_DEFINE_TYPE (GdkDmabufTexture, gdk_dmabuf_texture, GDK_TYPE_TEXTURE)
|
||||||
@@ -80,10 +72,7 @@ gdk_dmabuf_texture_dispose (GObject *object)
|
|||||||
GdkDmabufTexture *self = GDK_DMABUF_TEXTURE (object);
|
GdkDmabufTexture *self = GDK_DMABUF_TEXTURE (object);
|
||||||
|
|
||||||
if (self->destroy)
|
if (self->destroy)
|
||||||
{
|
self->destroy (self->data);
|
||||||
self->destroy (self->data);
|
|
||||||
self->destroy = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_object (&self->downloader);
|
g_clear_object (&self->downloader);
|
||||||
g_clear_object (&self->display);
|
g_clear_object (&self->display);
|
||||||
@@ -97,7 +86,6 @@ struct _Download
|
|||||||
{
|
{
|
||||||
GdkDmabufTexture *texture;
|
GdkDmabufTexture *texture;
|
||||||
GdkMemoryFormat format;
|
GdkMemoryFormat format;
|
||||||
GdkColorState *color_state;
|
|
||||||
guchar *data;
|
guchar *data;
|
||||||
gsize stride;
|
gsize stride;
|
||||||
volatile int spinlock;
|
volatile int spinlock;
|
||||||
@@ -111,7 +99,6 @@ gdk_dmabuf_texture_invoke_callback (gpointer data)
|
|||||||
gdk_dmabuf_downloader_download (download->texture->downloader,
|
gdk_dmabuf_downloader_download (download->texture->downloader,
|
||||||
download->texture,
|
download->texture,
|
||||||
download->format,
|
download->format,
|
||||||
download->color_state,
|
|
||||||
download->data,
|
download->data,
|
||||||
download->stride);
|
download->stride);
|
||||||
|
|
||||||
@@ -123,17 +110,16 @@ gdk_dmabuf_texture_invoke_callback (gpointer data)
|
|||||||
static void
|
static void
|
||||||
gdk_dmabuf_texture_download (GdkTexture *texture,
|
gdk_dmabuf_texture_download (GdkTexture *texture,
|
||||||
GdkMemoryFormat format,
|
GdkMemoryFormat format,
|
||||||
GdkColorState *color_state,
|
|
||||||
guchar *data,
|
guchar *data,
|
||||||
gsize stride)
|
gsize stride)
|
||||||
{
|
{
|
||||||
GdkDmabufTexture *self = GDK_DMABUF_TEXTURE (texture);
|
GdkDmabufTexture *self = GDK_DMABUF_TEXTURE (texture);
|
||||||
Download download = { self, format, color_state, data, stride, 0 };
|
Download download = { self, format, data, stride, 0 };
|
||||||
|
|
||||||
if (self->downloader == NULL)
|
if (self->downloader == NULL)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DMABUF
|
#ifdef HAVE_DMABUF
|
||||||
gdk_dmabuf_download_mmap (texture, format, color_state, data, stride);
|
gdk_dmabuf_download_mmap (texture, format, data, stride);
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -182,7 +168,6 @@ gdk_dmabuf_texture_new_from_builder (GdkDmabufTextureBuilder *builder,
|
|||||||
GdkTexture *update_texture;
|
GdkTexture *update_texture;
|
||||||
GdkDisplay *display;
|
GdkDisplay *display;
|
||||||
GdkDmabuf dmabuf;
|
GdkDmabuf dmabuf;
|
||||||
GdkColorState *color_state;
|
|
||||||
GError *local_error = NULL;
|
GError *local_error = NULL;
|
||||||
int width, height;
|
int width, height;
|
||||||
gboolean premultiplied;
|
gboolean premultiplied;
|
||||||
@@ -202,24 +187,9 @@ gdk_dmabuf_texture_new_from_builder (GdkDmabufTextureBuilder *builder,
|
|||||||
|
|
||||||
gdk_display_init_dmabuf (display);
|
gdk_display_init_dmabuf (display);
|
||||||
|
|
||||||
color_state = gdk_dmabuf_texture_builder_get_color_state (builder);
|
|
||||||
if (color_state == NULL)
|
|
||||||
{
|
|
||||||
gboolean is_yuv;
|
|
||||||
|
|
||||||
if (gdk_dmabuf_fourcc_is_yuv (dmabuf.fourcc, &is_yuv) && is_yuv)
|
|
||||||
{
|
|
||||||
g_warning_once ("FIXME: Implement the proper colorstate for YUV dmabufs");
|
|
||||||
color_state = gdk_color_state_get_srgb ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
color_state = gdk_color_state_get_srgb ();
|
|
||||||
}
|
|
||||||
|
|
||||||
self = g_object_new (GDK_TYPE_DMABUF_TEXTURE,
|
self = g_object_new (GDK_TYPE_DMABUF_TEXTURE,
|
||||||
"width", width,
|
"width", width,
|
||||||
"height", height,
|
"height", height,
|
||||||
"color-state", color_state,
|
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
g_set_object (&self->display, display);
|
g_set_object (&self->display, display);
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
#include "gdkdebugprivate.h"
|
#include "gdkdebugprivate.h"
|
||||||
#include "gdkdisplay.h"
|
#include "gdkdisplay.h"
|
||||||
#include "gdkenumtypes.h"
|
#include "gdkenumtypes.h"
|
||||||
#include "gdkcolorstate.h"
|
|
||||||
#include "gdkdmabuftextureprivate.h"
|
#include "gdkdmabuftextureprivate.h"
|
||||||
#include "gdkdmabuftexturebuilderprivate.h"
|
#include "gdkdmabuftexturebuilderprivate.h"
|
||||||
|
|
||||||
@@ -42,8 +41,6 @@ struct _GdkDmabufTextureBuilder
|
|||||||
|
|
||||||
GdkDmabuf dmabuf;
|
GdkDmabuf dmabuf;
|
||||||
|
|
||||||
GdkColorState *color_state;
|
|
||||||
|
|
||||||
GdkTexture *update_texture;
|
GdkTexture *update_texture;
|
||||||
cairo_region_t *update_region;
|
cairo_region_t *update_region;
|
||||||
};
|
};
|
||||||
@@ -127,7 +124,6 @@ enum
|
|||||||
PROP_MODIFIER,
|
PROP_MODIFIER,
|
||||||
PROP_PREMULTIPLIED,
|
PROP_PREMULTIPLIED,
|
||||||
PROP_N_PLANES,
|
PROP_N_PLANES,
|
||||||
PROP_COLOR_STATE,
|
|
||||||
PROP_UPDATE_REGION,
|
PROP_UPDATE_REGION,
|
||||||
PROP_UPDATE_TEXTURE,
|
PROP_UPDATE_TEXTURE,
|
||||||
|
|
||||||
@@ -145,7 +141,6 @@ gdk_dmabuf_texture_builder_dispose (GObject *object)
|
|||||||
|
|
||||||
g_clear_object (&self->update_texture);
|
g_clear_object (&self->update_texture);
|
||||||
g_clear_pointer (&self->update_region, cairo_region_destroy);
|
g_clear_pointer (&self->update_region, cairo_region_destroy);
|
||||||
g_clear_pointer (&self->color_state, gdk_color_state_unref);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (gdk_dmabuf_texture_builder_parent_class)->dispose (object);
|
G_OBJECT_CLASS (gdk_dmabuf_texture_builder_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -188,10 +183,6 @@ gdk_dmabuf_texture_builder_get_property (GObject *object,
|
|||||||
g_value_set_uint (value, self->dmabuf.n_planes);
|
g_value_set_uint (value, self->dmabuf.n_planes);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COLOR_STATE:
|
|
||||||
g_value_set_boxed (value, self->color_state);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_UPDATE_REGION:
|
case PROP_UPDATE_REGION:
|
||||||
g_value_set_boxed (value, self->update_region);
|
g_value_set_boxed (value, self->update_region);
|
||||||
break;
|
break;
|
||||||
@@ -244,10 +235,6 @@ gdk_dmabuf_texture_builder_set_property (GObject *object,
|
|||||||
gdk_dmabuf_texture_builder_set_n_planes (self, g_value_get_uint (value));
|
gdk_dmabuf_texture_builder_set_n_planes (self, g_value_get_uint (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COLOR_STATE:
|
|
||||||
gdk_dmabuf_texture_builder_set_color_state (self, g_value_get_boxed (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_UPDATE_REGION:
|
case PROP_UPDATE_REGION:
|
||||||
gdk_dmabuf_texture_builder_set_update_region (self, g_value_get_boxed (value));
|
gdk_dmabuf_texture_builder_set_update_region (self, g_value_get_boxed (value));
|
||||||
break;
|
break;
|
||||||
@@ -360,18 +347,6 @@ gdk_dmabuf_texture_builder_class_init (GdkDmabufTextureBuilderClass *klass)
|
|||||||
1, GDK_DMABUF_MAX_PLANES, 1,
|
1, GDK_DMABUF_MAX_PLANES, 1,
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
/**
|
|
||||||
* GdkDmabufTextureBuilder:color-state:
|
|
||||||
*
|
|
||||||
* The color state of the texture.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
properties[PROP_COLOR_STATE] =
|
|
||||||
g_param_spec_boxed ("color-state", NULL, NULL,
|
|
||||||
GDK_TYPE_COLOR_STATE,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GdkDmabufTextureBuilder:update-region: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_update_region org.gtk.Property.set=gdk_dmabuf_texture_builder_set_update_region)
|
* GdkDmabufTextureBuilder:update-region: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_update_region org.gtk.Property.set=gdk_dmabuf_texture_builder_set_update_region)
|
||||||
*
|
*
|
||||||
@@ -408,8 +383,6 @@ gdk_dmabuf_texture_builder_init (GdkDmabufTextureBuilder *self)
|
|||||||
|
|
||||||
for (int i = 0; i < GDK_DMABUF_MAX_PLANES; i++)
|
for (int i = 0; i < GDK_DMABUF_MAX_PLANES; i++)
|
||||||
self->dmabuf.planes[i].fd = -1;
|
self->dmabuf.planes[i].fd = -1;
|
||||||
|
|
||||||
self->color_state = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -870,55 +843,6 @@ gdk_dmabuf_texture_builder_set_offset (GdkDmabufTextureBuilder *self,
|
|||||||
self->dmabuf.planes[plane].offset = offset;
|
self->dmabuf.planes[plane].offset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_dmabuf_texture_builder_get_color_state: (attributes org.gtk.Method.get_property=color-state)
|
|
||||||
* @self: a `GdkDmabufTextureBuilder`
|
|
||||||
*
|
|
||||||
* Gets the color state previously set via gdk_dmabuf_texture_builder_set_color_state().
|
|
||||||
*
|
|
||||||
* Returns: (nullable): the color state
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_dmabuf_texture_builder_get_color_state (GdkDmabufTextureBuilder *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (GDK_IS_DMABUF_TEXTURE_BUILDER (self), NULL);
|
|
||||||
|
|
||||||
return self->color_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gdk_dmabuf_texture_builder_set_color_state: (attributes org.gtk.Method.set_property=color-state)
|
|
||||||
* @self: a `GdkDmabufTextureBuilder`
|
|
||||||
* @color_state: (nullable): a `GdkColorState` or `NULL` to unset the colorstate.
|
|
||||||
*
|
|
||||||
* Sets the color state for the texture.
|
|
||||||
*
|
|
||||||
* By default, the colorstate is `NULL`. In that case, GTK will choose the
|
|
||||||
* correct colorstate based on the format.
|
|
||||||
* If you don't know what colorstates are, this is probably the right thing.
|
|
||||||
*
|
|
||||||
* Since: 4.16
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gdk_dmabuf_texture_builder_set_color_state (GdkDmabufTextureBuilder *self,
|
|
||||||
GdkColorState *color_state)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GDK_IS_DMABUF_TEXTURE_BUILDER (self));
|
|
||||||
|
|
||||||
if (self->color_state == color_state ||
|
|
||||||
(self->color_state != NULL && color_state != NULL && gdk_color_state_equal (self->color_state, color_state)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_clear_pointer (&self->color_state, gdk_color_state_unref);
|
|
||||||
self->color_state = color_state;
|
|
||||||
if (color_state)
|
|
||||||
gdk_color_state_ref (color_state);
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_STATE]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gdk_dmabuf_texture_builder_get_update_texture: (attributes org.gtk.Method.get_property=update-texture)
|
* gdk_dmabuf_texture_builder_get_update_texture: (attributes org.gtk.Method.get_property=update-texture)
|
||||||
* @self: a `GdkDmabufTextureBuilder`
|
* @self: a `GdkDmabufTextureBuilder`
|
||||||
|
@@ -100,12 +100,6 @@ void gdk_dmabuf_texture_builder_set_offset (GdkDmabufT
|
|||||||
unsigned int plane,
|
unsigned int plane,
|
||||||
unsigned int offset);
|
unsigned int offset);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
GdkColorState * gdk_dmabuf_texture_builder_get_color_state (GdkDmabufTextureBuilder *self);
|
|
||||||
GDK_AVAILABLE_IN_4_16
|
|
||||||
void gdk_dmabuf_texture_builder_set_color_state (GdkDmabufTextureBuilder *self,
|
|
||||||
GdkColorState *color_state);
|
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_4_14
|
GDK_AVAILABLE_IN_4_14
|
||||||
GdkTexture * gdk_dmabuf_texture_builder_get_update_texture (GdkDmabufTextureBuilder *self) G_GNUC_PURE;
|
GdkTexture * gdk_dmabuf_texture_builder_get_update_texture (GdkDmabufTextureBuilder *self) G_GNUC_PURE;
|
||||||
GDK_AVAILABLE_IN_4_14
|
GDK_AVAILABLE_IN_4_14
|
||||||
|
@@ -48,8 +48,6 @@ struct _GdkDrawContextPrivate {
|
|||||||
GdkSurface *surface;
|
GdkSurface *surface;
|
||||||
|
|
||||||
cairo_region_t *frame_region;
|
cairo_region_t *frame_region;
|
||||||
GdkColorState *color_state;
|
|
||||||
GdkMemoryDepth depth;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -203,12 +201,8 @@ static guint pixels_counter;
|
|||||||
static void
|
static void
|
||||||
gdk_draw_context_init (GdkDrawContext *self)
|
gdk_draw_context_init (GdkDrawContext *self)
|
||||||
{
|
{
|
||||||
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (self);
|
|
||||||
|
|
||||||
if (pixels_counter == 0)
|
if (pixels_counter == 0)
|
||||||
pixels_counter = gdk_profiler_define_int_counter ("frame pixels", "Pixels drawn per frame");
|
pixels_counter = gdk_profiler_define_int_counter ("frame pixels", "Pixels drawn per frame");
|
||||||
|
|
||||||
priv->depth = GDK_N_DEPTHS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -384,15 +378,7 @@ gdk_draw_context_begin_frame_full (GdkDrawContext *context,
|
|||||||
priv->frame_region = cairo_region_copy (region);
|
priv->frame_region = cairo_region_copy (region);
|
||||||
priv->surface->paint_context = g_object_ref (context);
|
priv->surface->paint_context = g_object_ref (context);
|
||||||
|
|
||||||
GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context,
|
GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, depth, priv->frame_region);
|
||||||
depth,
|
|
||||||
priv->frame_region,
|
|
||||||
&priv->color_state,
|
|
||||||
&priv->depth);
|
|
||||||
|
|
||||||
/* the callback is meant to set them */
|
|
||||||
g_assert (priv->color_state != NULL);
|
|
||||||
g_assert (priv->depth < GDK_N_DEPTHS);
|
|
||||||
|
|
||||||
cairo_region_intersect_rectangle (priv->frame_region,
|
cairo_region_intersect_rectangle (priv->frame_region,
|
||||||
&(cairo_rectangle_int_t) {
|
&(cairo_rectangle_int_t) {
|
||||||
@@ -463,10 +449,8 @@ gdk_draw_context_end_frame (GdkDrawContext *context)
|
|||||||
|
|
||||||
gdk_profiler_set_int_counter (pixels_counter, region_get_pixels (priv->frame_region));
|
gdk_profiler_set_int_counter (pixels_counter, region_get_pixels (priv->frame_region));
|
||||||
|
|
||||||
g_clear_pointer (&priv->color_state, gdk_color_state_unref);
|
|
||||||
g_clear_pointer (&priv->frame_region, cairo_region_destroy);
|
g_clear_pointer (&priv->frame_region, cairo_region_destroy);
|
||||||
g_clear_object (&priv->surface->paint_context);
|
g_clear_object (&priv->surface->paint_context);
|
||||||
priv->depth = GDK_N_DEPTHS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -494,38 +478,6 @@ gdk_draw_context_get_frame_region (GdkDrawContext *context)
|
|||||||
return priv->frame_region;
|
return priv->frame_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*<private>
|
|
||||||
* gdk_draw_context_get_color_state:
|
|
||||||
* @self: a `GdkDrawContext`
|
|
||||||
*
|
|
||||||
* Gets the target color state while rendering. If no rendering is going on, %NULL is returned.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none) (nullable): the target color state
|
|
||||||
**/
|
|
||||||
GdkColorState *
|
|
||||||
gdk_draw_context_get_color_state (GdkDrawContext *self)
|
|
||||||
{
|
|
||||||
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (self);
|
|
||||||
|
|
||||||
return priv->color_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*<private>
|
|
||||||
* gdk_draw_context_get_depth:
|
|
||||||
* @self: a `GdkDrawContext`
|
|
||||||
*
|
|
||||||
* Gets the target depth while rendering. If no rendering is going on, the return value is undefined.
|
|
||||||
*
|
|
||||||
* Returns: the target depth
|
|
||||||
**/
|
|
||||||
GdkMemoryDepth
|
|
||||||
gdk_draw_context_get_depth (GdkDrawContext *self)
|
|
||||||
{
|
|
||||||
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (self);
|
|
||||||
|
|
||||||
return priv->depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gdk_draw_context_empty_frame (GdkDrawContext *context)
|
gdk_draw_context_empty_frame (GdkDrawContext *context)
|
||||||
{
|
{
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user