summaryrefslogtreecommitdiff
path: root/elpa/xelb-0.20/xcb-renderutil.el
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-04-01 18:10:15 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-04-01 18:10:15 +0000
commitdabaff03992c102c395314629f63ce93a2c1bd3a (patch)
tree990472507186637085165b7cbbf7abf15c10889a /elpa/xelb-0.20/xcb-renderutil.el
init commit
Diffstat (limited to 'elpa/xelb-0.20/xcb-renderutil.el')
-rw-r--r--elpa/xelb-0.20/xcb-renderutil.el296
1 files changed, 296 insertions, 0 deletions
diff --git a/elpa/xelb-0.20/xcb-renderutil.el b/elpa/xelb-0.20/xcb-renderutil.el
new file mode 100644
index 0000000..6e7f9f3
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-renderutil.el
@@ -0,0 +1,296 @@
+;;; xcb-renderutil.el --- Utility functions for -*- lexical-binding: t -*-
+;;; the Render extension
+
+;; Copyright (C) 2016-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs 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 General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides utility functions for the Render extension.
+
+;; Todo
+;; + Glyph-related functions are not implemented.
+
+;; References:
+;; + xcb/util-renderutil (git://anongit.freedesktop.org/xcb/util-renderutil)
+
+;;; Code:
+
+(require 'xcb)
+(require 'xcb-render)
+
+;; Protocol version.
+(defconst xcb:renderutil:-MAJOR_VERSION 0)
+(defconst xcb:renderutil:-MINOR_VERSION 11)
+
+;; PICTFORMINFO masks.
+(defconst xcb:renderutil:PICT_FORMAT:ID 1)
+(defconst xcb:renderutil:PICT_FORMAT:TYPE 2)
+(defconst xcb:renderutil:PICT_FORMAT:DEPTH 4)
+(defconst xcb:renderutil:PICT_FORMAT:RED 8)
+(defconst xcb:renderutil:PICT_FORMAT:RED_MASK 16)
+(defconst xcb:renderutil:PICT_FORMAT:GREEN 32)
+(defconst xcb:renderutil:PICT_FORMAT:GREEN_MASK 64)
+(defconst xcb:renderutil:PICT_FORMAT:BLUE 128)
+(defconst xcb:renderutil:PICT_FORMAT:BLUE_MASK 256)
+(defconst xcb:renderutil:PICT_FORMAT:ALPHA 512)
+(defconst xcb:renderutil:PICT_FORMAT:ALPHA_MASK 1024)
+(defconst xcb:renderutil:PICT_FORMAT:COLORMAP 2048)
+
+;; Indices of standard PictFormats.
+(defconst xcb:renderutil:PICT_STANDARD:ARGB_32 0)
+(defconst xcb:renderutil:PICT_STANDARD:RGB_24 1)
+(defconst xcb:renderutil:PICT_STANDARD:A_8 2)
+(defconst xcb:renderutil:PICT_STANDARD:A_4 3)
+(defconst xcb:renderutil:PICT_STANDARD:A_1 4)
+
+(defconst xcb:renderutil:STANDARD-TEMPLATES
+ (list
+ ;; xcb:renderutil:PICT_STANDARD:ARGB_32
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 32
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 16
+ :red-mask #xFF
+ :green-shift 8
+ :green-mask #xFF
+ :blue-shift 0
+ :blue-mask #xFF
+ :alpha-shift 24
+ :alpha-mask #xFF)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:RGB_24
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 24
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 16
+ :red-mask #xFF
+ :green-shift 8
+ :green-mask #xFF
+ :blue-shift 0
+ :blue-mask #xFF
+ :alpha-shift 0
+ :alpha-mask #x00)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_8
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 8
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #xFF)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_4
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 4
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #x0F)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_1
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 1
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #x01)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK)))
+ "Standard PictFormats.")
+
+(cl-defmethod xcb:renderutil:-get-cache ((obj xcb:connection))
+ "Return the cache and initialize the extension when first called."
+ (let ((result (plist-get (slot-value obj 'extra-plist) 'renderutil))
+ required-depths)
+ (unless (or result
+ (= 0 (slot-value
+ (xcb:get-extension-data obj 'xcb:render)
+ 'present)))
+ (setq result
+ (vector (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryVersion
+ :client-major-version
+ xcb:renderutil:-MAJOR_VERSION
+ :client-minor-version
+ xcb:renderutil:-MINOR_VERSION))
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryPictFormats))))
+ (setq required-depths '(1 4 8 24 32))
+ (catch 'break
+ (dolist (s (slot-value (aref result 1) 'screens))
+ (dolist (d (slot-value s 'depths))
+ (setq required-depths
+ (delq (slot-value d 'depth) required-depths))
+ (unless required-depths
+ (throw 'break nil)))))
+ (if required-depths
+ (setq result nil)
+ (setf (slot-value obj 'extra-plist)
+ (plist-put (slot-value obj 'extra-plist) 'renderutil result))))
+ result))
+
+(defun xcb:renderutil:find-visual-format (formats visual)
+ "Search FORMATS for a format matching visual VISUAL."
+ (catch 'return
+ (dolist (s (slot-value formats 'screens))
+ (dolist (d (slot-value s 'depths))
+ (dolist (v (slot-value d 'visuals))
+ (when (= (slot-value v 'visual) visual)
+ (throw 'return (slot-value v 'format))))))))
+
+(defun xcb:renderutil:find-format (formats mask template count)
+ "Search FORMATS for a format matching mask MASK and template TEMPLATE.
+
+Return COUNT-th match."
+ (catch 'return
+ (unless formats
+ (throw 'return nil))
+ (dolist (f (slot-value formats 'formats))
+ (when (and (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:ID))
+ (eq (slot-value template 'id) (slot-value f 'id))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:TYPE))
+ (eq (slot-value template 'type) (slot-value f 'type))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:DEPTH))
+ (eq (slot-value template 'depth) (slot-value f 'depth))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:RED))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:RED_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:GREEN))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:GREEN_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:BLUE))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:BLUE_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:COLORMAP))
+ (eq (slot-value template 'colormap)
+ (slot-value f 'colormap))
+ t))
+ (when (= count 0)
+ (throw 'return (slot-value f 'id))
+ (cl-decf count))))))
+
+(defun xcb:renderutil:find-standard (formats format)
+ "Search FORMATS for a standard format matching format ID FORMAT."
+ (when (and (<= 0 format (1- (length xcb:renderutil:STANDARD-TEMPLATES))))
+ (let ((standard-format (elt xcb:renderutil:STANDARD-TEMPLATES format)))
+ (xcb:renderutil:find-format formats
+ (aref standard-format 1)
+ (aref standard-format 0)
+ 0))))
+
+(cl-defmethod xcb:renderutil:query-version ((obj xcb:connection))
+ "Return the version of Render extension."
+ (let ((cache (xcb:renderutil:-get-cache obj)))
+ (when cache
+ (aref cache 0))))
+
+(cl-defmethod xcb:renderutil:query-formats ((obj xcb:connection))
+ "Return supported formats of this X server."
+ (let ((cache (xcb:renderutil:-get-cache obj)))
+ (when cache
+ (aref cache 1))))
+
+
+
+(provide 'xcb-renderutil)
+
+;;; xcb-renderutil.el ends here