emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xelb 8705b7e: Add renderutil library


From: Chris Feng
Subject: [elpa] externals/xelb 8705b7e: Add renderutil library
Date: Sun, 28 Feb 2016 08:50:36 +0000

branch: externals/xelb
commit 8705b7eaf84875613054fcefa6d9289d617cdd46
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>

    Add renderutil library
    
    * xcb-renderutil: New library adding utility functions for the Render
    extension.
---
 xcb-keysyms.el    |    2 +
 xcb-renderutil.el |  296 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 xelb.el           |    2 +
 3 files changed, 300 insertions(+), 0 deletions(-)

diff --git a/xcb-keysyms.el b/xcb-keysyms.el
index e1ef5d6..dd7b797 100644
--- a/xcb-keysyms.el
+++ b/xcb-keysyms.el
@@ -513,6 +513,8 @@ this function will also return symbols for pure modifiers 
keys."
           (push (or mod-alt 'alt) event))
         (event-convert-list event)))))
 
+
+
 (provide 'xcb-keysyms)
 
 ;;; xcb-keysyms.el ends here
diff --git a/xcb-renderutil.el b/xcb-renderutil.el
new file mode 100644
index 0000000..73f55ff
--- /dev/null
+++ b/xcb-renderutil.el
@@ -0,0 +1,296 @@
+;;; xcb-renderutil.el --- Utility functions for  -*- lexical-binding: t -*-
+;;;                       the Render extension
+
+;; Copyright (C) 2016 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <address@hidden>
+
+;; 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 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 f)
+          (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
diff --git a/xelb.el b/xelb.el
index 1fc3b4f..27cbfc2 100644
--- a/xelb.el
+++ b/xelb.el
@@ -63,6 +63,8 @@
 ;; DO NOT load this library; load 'xcb.el' instead.
 ;; This dummy file is created as a placeholder as it is required by GNU ELPA.
 
+
+
 (provide 'xelb)
 
 ;;; xelb.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]