
commit
c8eaefa4c6
17 changed files with 897 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||
((scheme-mode |
|||
. |
|||
((eval . (put 'call-with-window 'scheme-indent-function 1)) |
|||
(eval . (put 'call-with-renderer 'scheme-indent-function 1)) |
|||
(eval . (put 'surface-parse-match 'scheme-indent-function 1)) |
|||
(eval . (put 'pixel-format-parse-match 'scheme-indent-function 1)) |
|||
(eval . (put 'palette-parse-match 'scheme-indent-function 1)) |
|||
(eval . (put 'color-parse-match 'scheme-indent-function 1))))) |
@ -0,0 +1,11 @@ |
|||
/Makefile |
|||
/Makefile.in |
|||
/aclocal.m4 |
|||
/autom4te.cache |
|||
/build-aux |
|||
/config.log |
|||
/config.status |
|||
/configure |
|||
/pre-inst-env |
|||
*.go |
|||
/sdl2/config.scm |
@ -0,0 +1 @@ |
|||
Nicolò Balzarotti <nicolo@nixo.xyz> |
@ -0,0 +1,165 @@ |
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
Version 3, 29 June 2007 |
|||
|
|||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
|
|||
This version of the GNU Lesser General Public License incorporates |
|||
the terms and conditions of version 3 of the GNU General Public |
|||
License, supplemented by the additional permissions listed below. |
|||
|
|||
0. Additional Definitions. |
|||
|
|||
As used herein, "this License" refers to version 3 of the GNU Lesser |
|||
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
|||
General Public License. |
|||
|
|||
"The Library" refers to a covered work governed by this License, |
|||
other than an Application or a Combined Work as defined below. |
|||
|
|||
An "Application" is any work that makes use of an interface provided |
|||
by the Library, but which is not otherwise based on the Library. |
|||
Defining a subclass of a class defined by the Library is deemed a mode |
|||
of using an interface provided by the Library. |
|||
|
|||
A "Combined Work" is a work produced by combining or linking an |
|||
Application with the Library. The particular version of the Library |
|||
with which the Combined Work was made is also called the "Linked |
|||
Version". |
|||
|
|||
The "Minimal Corresponding Source" for a Combined Work means the |
|||
Corresponding Source for the Combined Work, excluding any source code |
|||
for portions of the Combined Work that, considered in isolation, are |
|||
based on the Application, and not on the Linked Version. |
|||
|
|||
The "Corresponding Application Code" for a Combined Work means the |
|||
object code and/or source code for the Application, including any data |
|||
and utility programs needed for reproducing the Combined Work from the |
|||
Application, but excluding the System Libraries of the Combined Work. |
|||
|
|||
1. Exception to Section 3 of the GNU GPL. |
|||
|
|||
You may convey a covered work under sections 3 and 4 of this License |
|||
without being bound by section 3 of the GNU GPL. |
|||
|
|||
2. Conveying Modified Versions. |
|||
|
|||
If you modify a copy of the Library, and, in your modifications, a |
|||
facility refers to a function or data to be supplied by an Application |
|||
that uses the facility (other than as an argument passed when the |
|||
facility is invoked), then you may convey a copy of the modified |
|||
version: |
|||
|
|||
a) under this License, provided that you make a good faith effort to |
|||
ensure that, in the event an Application does not supply the |
|||
function or data, the facility still operates, and performs |
|||
whatever part of its purpose remains meaningful, or |
|||
|
|||
b) under the GNU GPL, with none of the additional permissions of |
|||
this License applicable to that copy. |
|||
|
|||
3. Object Code Incorporating Material from Library Header Files. |
|||
|
|||
The object code form of an Application may incorporate material from |
|||
a header file that is part of the Library. You may convey such object |
|||
code under terms of your choice, provided that, if the incorporated |
|||
material is not limited to numerical parameters, data structure |
|||
layouts and accessors, or small macros, inline functions and templates |
|||
(ten or fewer lines in length), you do both of the following: |
|||
|
|||
a) Give prominent notice with each copy of the object code that the |
|||
Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the object code with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
4. Combined Works. |
|||
|
|||
You may convey a Combined Work under terms of your choice that, |
|||
taken together, effectively do not restrict modification of the |
|||
portions of the Library contained in the Combined Work and reverse |
|||
engineering for debugging such modifications, if you also do each of |
|||
the following: |
|||
|
|||
a) Give prominent notice with each copy of the Combined Work that |
|||
the Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
c) For a Combined Work that displays copyright notices during |
|||
execution, include the copyright notice for the Library among |
|||
these notices, as well as a reference directing the user to the |
|||
copies of the GNU GPL and this license document. |
|||
|
|||
d) Do one of the following: |
|||
|
|||
0) Convey the Minimal Corresponding Source under the terms of this |
|||
License, and the Corresponding Application Code in a form |
|||
suitable for, and under terms that permit, the user to |
|||
recombine or relink the Application with a modified version of |
|||
the Linked Version to produce a modified Combined Work, in the |
|||
manner specified by section 6 of the GNU GPL for conveying |
|||
Corresponding Source. |
|||
|
|||
1) Use a suitable shared library mechanism for linking with the |
|||
Library. A suitable mechanism is one that (a) uses at run time |
|||
a copy of the Library already present on the user's computer |
|||
system, and (b) will operate properly with a modified version |
|||
of the Library that is interface-compatible with the Linked |
|||
Version. |
|||
|
|||
e) Provide Installation Information, but only if you would otherwise |
|||
be required to provide such information under section 6 of the |
|||
GNU GPL, and only to the extent that such information is |
|||
necessary to install and execute a modified version of the |
|||
Combined Work produced by recombining or relinking the |
|||
Application with a modified version of the Linked Version. (If |
|||
you use option 4d0, the Installation Information must accompany |
|||
the Minimal Corresponding Source and Corresponding Application |
|||
Code. If you use option 4d1, you must provide the Installation |
|||
Information in the manner specified by section 6 of the GNU GPL |
|||
for conveying Corresponding Source.) |
|||
|
|||
5. Combined Libraries. |
|||
|
|||
You may place library facilities that are a work based on the |
|||
Library side by side in a single library together with other library |
|||
facilities that are not Applications and are not covered by this |
|||
License, and convey such a combined library under terms of your |
|||
choice, if you do both of the following: |
|||
|
|||
a) Accompany the combined library with a copy of the same work based |
|||
on the Library, uncombined with any other library facilities, |
|||
conveyed under the terms of this License. |
|||
|
|||
b) Give prominent notice with the combined library that part of it |
|||
is a work based on the Library, and explaining where to find the |
|||
accompanying uncombined form of the same work. |
|||
|
|||
6. Revised Versions of the GNU Lesser General Public License. |
|||
|
|||
The Free Software Foundation may publish revised and/or new versions |
|||
of the GNU Lesser General Public License from time to time. Such new |
|||
versions will be similar in spirit to the present version, but may |
|||
differ in detail to address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the |
|||
Library as you received it specifies that a certain numbered version |
|||
of the GNU Lesser General Public License "or any later version" |
|||
applies to it, you have the option of following the terms and |
|||
conditions either of that published version or of any later version |
|||
published by the Free Software Foundation. If the Library as you |
|||
received it does not specify a version number of the GNU Lesser |
|||
General Public License, you may choose any version of the GNU Lesser |
|||
General Public License ever published by the Free Software Foundation. |
|||
|
|||
If the Library as you received it specifies that a proxy can decide |
|||
whether future versions of the GNU Lesser General Public License shall |
|||
apply, that proxy's public statement of acceptance of any version is |
|||
permanent authorization for you to choose that version for the |
|||
Library. |
@ -0,0 +1,56 @@ |
|||
# guile-fontconfig --- FFI bindings for FontConfig
|
|||
# Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz>
|
|||
#
|
|||
# This file is part of guile-fontconfig.
|
|||
#
|
|||
# Guile-fontconfig 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 3 of
|
|||
# the License, or (at your option) any later version.
|
|||
#
|
|||
# Guile-fontconfig 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 Lesser General Public
|
|||
# License along with guile-fontconfig. If not, see
|
|||
# <http://www.gnu.org/licenses/>.
|
|||
|
|||
GOBJECTS = $(SOURCES:%.scm=%.go) |
|||
|
|||
nobase_mod_DATA = $(SOURCES) $(NOCOMP_SOURCES) |
|||
nobase_go_DATA = $(GOBJECTS) |
|||
|
|||
# Make sure source files are installed first, so that the mtime of
|
|||
# installed compiled files is greater than that of installed source
|
|||
# files. See
|
|||
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
|
|||
# for details.
|
|||
guile_install_go_files = install-nobase_goDATA |
|||
$(guile_install_go_files): install-nobase_modDATA |
|||
|
|||
CLEANFILES = $(GOBJECTS) |
|||
EXTRA_DIST = $(SOURCES) $(NOCOMP_SOURCES) |
|||
GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat |
|||
SUFFIXES = .scm .go |
|||
.scm.go: |
|||
$(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_WARNINGS) -o "$@" "$<" |
|||
|
|||
moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION) |
|||
godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache |
|||
|
|||
SOURCES = \
|
|||
fontconfig.scm \
|
|||
fontconfig/bindings.scm \
|
|||
fontconfig/config.scm \
|
|||
fontconfig/object-set.scm \
|
|||
fontconfig/pattern.scm |
|||
|
|||
EXTRA_DIST += \
|
|||
pre-inst-env.in \
|
|||
README \
|
|||
guix.scm \
|
|||
examples/example.scm |
|||
|
|||
.PHONY: publish |
@ -0,0 +1,77 @@ |
|||
-*- mode: org -*- |
|||
|
|||
Guile-FontConfig provides Guile Scheme bindings for the FontConfig C |
|||
shared library. The bindings are written in pure Scheme by using |
|||
Guile's foreign function interface. |
|||
|
|||
* Requirements |
|||
|
|||
Guile-FontConfig currently depends on the following packages: |
|||
|
|||
- GNU Guile >= 2.0.9 |
|||
- FontConfig |
|||
- GNU Make |
|||
- GNU pkg-config |
|||
|
|||
When building from a Git checkout, the following additional packages |
|||
are required: |
|||
|
|||
- GNU Autoconf |
|||
- GNU Automake |
|||
- GNU Texinfo |
|||
|
|||
* Installing |
|||
|
|||
Guile-FontConfig uses the standard GNU build system, so installation |
|||
requires the usual incantations: |
|||
|
|||
#+BEGIN_SRC sh |
|||
./configure |
|||
make |
|||
make install |
|||
#+END_SRC |
|||
|
|||
When building from a Git checkout, the following spell is necessary |
|||
before running any of the above commands: |
|||
|
|||
#+BEGIN_SRC sh |
|||
./bootstrap |
|||
#+END_SRC |
|||
|
|||
GNU Guix users may install the current development snapshot |
|||
described in =guix.scm= with the following command: |
|||
|
|||
#+BEGIN_SRC sh |
|||
guix package -f guix.scm |
|||
#+END_SRC |
|||
|
|||
* Developing |
|||
|
|||
To build the source code from a Git checkout, run the following: |
|||
|
|||
#+BEGIN_SRC sh |
|||
./bootstrap |
|||
./configure |
|||
make |
|||
#+END_SRC |
|||
|
|||
To start a Guile REPL with a pre-configured load path for using |
|||
guile-fontconfig, use the =pre-inst-env= script: |
|||
|
|||
#+BEGIN_SRC sh |
|||
./pre-inst-env guile |
|||
#+END_SRC |
|||
|
|||
GNU Guix users may create a development environment with all of the |
|||
necessary dependencies by running the following command: |
|||
|
|||
#+BEGIN_SRC sh |
|||
guix environment -l guix.scm |
|||
#+END_SRC |
|||
|
|||
* Contact & Credits |
|||
|
|||
Bug reports and patches may be sent to <nicolo@nixo.xyz>. |
|||
|
|||
This repository and this library is based on David Thomson's |
|||
Guile-SDL2, available [[https://dthompson.us/projects/guile-sdl2.html][here]] and distributed under GNU LGPLv3+. |
@ -0,0 +1,3 @@ |
|||
#!/bin/sh |
|||
|
|||
autoreconf -vif |
@ -0,0 +1,44 @@ |
|||
# -*- Autoconf -*- |
|||
# |
|||
# guile-fontconfig --- FFI bindings for FontConfig |
|||
# Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
# |
|||
# This file is part of guile-fontconfig. |
|||
# |
|||
# Guile-fontconfig 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 3 of |
|||
# the License, or (at your option) any later version. |
|||
# |
|||
# Guile-fontconfig 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 Lesser General Public |
|||
# License along with guile-fontconfig. If not, see |
|||
# <http://www.gnu.org/licenses/>. |
|||
|
|||
AC_INIT(guile-fontconfig, 0.0.1) |
|||
AC_CONFIG_SRCDIR(fontconfig) |
|||
AC_CONFIG_AUX_DIR([build-aux]) |
|||
AM_INIT_AUTOMAKE([color-tests -Wall -Wno-portability foreign]) |
|||
AM_SILENT_RULES([yes]) |
|||
|
|||
AC_CONFIG_FILES([Makefile fontconfig/config.scm]) |
|||
AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env]) |
|||
|
|||
GUILE_PKG([3.0 2.2 2.0]) |
|||
GUILE_PROGS |
|||
|
|||
PKG_CHECK_MODULES([FONTCONFIG], [fontconfig]) |
|||
PKG_CHECK_VAR([FONTCONFIG_LIBDIR], [fontconfig], [libdir]) |
|||
AC_MSG_CHECKING([FONTCONFIG library path]) |
|||
AS_IF([test "x$FONTCONFIG_LIBDIR" = "x"], [ |
|||
AC_MSG_FAILURE([unable to find FontConfig library directory]) |
|||
], [ |
|||
AC_MSG_RESULT([$FONTCONFIG_LIBDIR]) |
|||
]) |
|||
AC_SUBST([FONTCONFIG_LIBDIR]) |
|||
|
|||
AC_OUTPUT |
@ -0,0 +1,22 @@ |
|||
(use-modules (fontconfig)) |
|||
|
|||
(let ((pattern (make-pattern |
|||
'((family "JuliaMono"))))) |
|||
(map |
|||
(lambda (pat) |
|||
(format #t " |
|||
--------------------- |
|||
Font located at: ~A |
|||
Style & Family: ~A ~A |
|||
Fc Match String: ~A |
|||
" |
|||
(pattern-get pat "file") |
|||
(pattern-get pat "style") |
|||
(pattern-get pat "family") |
|||
(pattern->format pat "%{=fcmatch}"))) |
|||
(pattern-list pattern))) |
|||
|
|||
(let ((pattern (make-pattern '()))) |
|||
(format #t "There are a total of ~A fonts!\n" (length (pattern-list pattern)))) |
|||
|
|||
(display (make-pattern)) |
@ -0,0 +1,28 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconifg 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
;;; Code: |
|||
|
|||
(define-module (fontconfig) |
|||
#:use-module (fontconfig pattern) |
|||
#:use-module (fontconfig object-set) |
|||
#:re-export (make-pattern |
|||
pattern-list pattern-get |
|||
pattern->string pattern->format |
|||
make-object-set)) |
@ -0,0 +1,114 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
;;; Commentary: |
|||
;; |
|||
;; Low-level FFI bindings. |
|||
;; |
|||
;;; Code: |
|||
|
|||
(define-module (fontconfig bindings) |
|||
#:use-module (fontconfig config) |
|||
#:use-module (system foreign) |
|||
#:export (fontconfig-func |
|||
define-foreign |
|||
|
|||
fontconfig-pattern-create fontconfig-pattern-destroy |
|||
fontconfig-object-set-destroy)) |
|||
|
|||
(define fontconfig-func |
|||
(let ((lib (dynamic-link %libfontconfig))) |
|||
(lambda (return-type function-name arg-types) |
|||
"Return a procedure for the foreign function FUNCTION-NAME in |
|||
the FontConfig shared library. That function must return a value of |
|||
RETURN-TYPE and accept arguments of ARG-TYPES." |
|||
(pointer->procedure return-type |
|||
(dynamic-func function-name lib) |
|||
arg-types)))) |
|||
|
|||
(define-syntax-rule (define-foreign name return-type func-name arg-types) |
|||
(define-public name |
|||
(fontconfig-func return-type func-name arg-types))) |
|||
|
|||
|
|||
;;; |
|||
;;; Initialization |
|||
;;; |
|||
|
|||
(define-foreign fontconfig-init-load-config-and-fonts |
|||
'* "FcInitLoadConfigAndFonts" '()) |
|||
|
|||
(define-foreign fontconfig-finalize |
|||
void "FcFini" '()) |
|||
|
|||
|
|||
;;; |
|||
;;; Version |
|||
;;; |
|||
|
|||
(define-foreign fontconfig-get-version |
|||
int "FcGetVersion" '()) |
|||
|
|||
|
|||
;;; |
|||
;;; Pattern |
|||
;;; |
|||
|
|||
(define-foreign fontconfig-pattern-create |
|||
'* "FcPatternCreate" '()) |
|||
|
|||
(define fontconfig-pattern-destroy |
|||
(dynamic-func "FcPatternDestroy" (dynamic-link %libfontconfig))) |
|||
|
|||
(define-foreign fontconfig-pattern-add-string |
|||
int "FcPatternAddString" '(* * *)) |
|||
|
|||
(define-foreign fontconfig-pattern-add-double |
|||
int "FcPatternAddDouble" `(* * ,double)) |
|||
|
|||
(define-foreign fontconfig-pattern-add-integer |
|||
int "FcPatternAddInteger" `(* * ,int)) |
|||
|
|||
(define-foreign fontconfig-pattern-add-bool |
|||
int "FcPatternAddBool" `(* * ,int)) |
|||
|
|||
(define-foreign fontconfig-name-unparse |
|||
'* "FcNameUnparse" '(*)) |
|||
|
|||
(define-foreign fontconfig-pattern-format |
|||
'* "FcPatternFormat" '(* *)) |
|||
|
|||
;; FcResult (FcPattern *p, const char *object, int id, FcValue *v); |
|||
(define-foreign fontconfig-pattern-get |
|||
int "FcPatternGet" `(* * ,int *)) |
|||
|
|||
;;; |
|||
;;; Object Set |
|||
;;; |
|||
(define-foreign fontconfig-object-set-create |
|||
'* "FcObjectSetCreate" '()) |
|||
|
|||
(define-foreign fontconfig-object-set-add |
|||
int "FcObjectSetAdd" '(* *)) |
|||
|
|||
(define-foreign fontconfig-font-list |
|||
'* "FcFontList" '(* * *)) |
|||
|
|||
(define fontconfig-object-set-destroy |
|||
(dynamic-func "FcObjectSetDestroy" (dynamic-link %libfontconfig))) |
@ -0,0 +1,24 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (fontconfig config) |
|||
#:export (%libfontconfig)) |
|||
|
|||
(define %libfontconfig |
|||
"/gnu/store/y9fdy234r6hqiacd7hgwlmbdsngbp8p1-fontconfig-2.13.1/lib/libfontconfig.so") |
@ -0,0 +1,24 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (fontconfig config) |
|||
#:export (%libfontconfig)) |
|||
|
|||
(define %libfontconfig |
|||
"@FONTCONFIG_LIBDIR@/libfontconfig.so") |
@ -0,0 +1,40 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (fontconfig object-set) |
|||
#:use-module ((fontconfig bindings) #:prefix ffi:) |
|||
#:use-module (system foreign) |
|||
#:export (make-object-set |
|||
unwrap-object-set |
|||
object-set-add!)) |
|||
|
|||
(define-wrapped-pointer-type <object-set> |
|||
object-set? |
|||
wrap-object-set unwrap-object-set |
|||
(lambda (pattern port) |
|||
(format port "#<object-set>"))) |
|||
|
|||
(define (make-object-set) |
|||
(let* ((ptr (ffi:fontconfig-object-set-create)) |
|||
(object-set (wrap-object-set ptr))) |
|||
(set-pointer-finalizer! ptr ffi:fontconfig-object-set-destroy) |
|||
object-set)) |
|||
|
|||
(define (object-set-add! os attr) |
|||
(ffi:fontconfig-object-set-add (unwrap-object-set os) (string->pointer attr))) |
@ -0,0 +1,156 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (fontconfig pattern) |
|||
#:use-module (ice-9 match) |
|||
#:use-module ((fontconfig bindings) #:prefix ffi:) |
|||
#:use-module (fontconfig object-set) |
|||
#:use-module (rnrs bytevectors) |
|||
#:use-module (srfi srfi-26) |
|||
#:use-module (system foreign) |
|||
#:export (make-pattern |
|||
pattern-get |
|||
pattern-list pattern->string pattern->format)) |
|||
|
|||
(define %string-attrs |
|||
'(family |
|||
style foundry file lang |
|||
fullname familylang stylelang fullnamelang |
|||
compatibility fontformat fontfeatures namelang |
|||
prgname hash postscriptname)) |
|||
|
|||
(define %double-attrs |
|||
'(size aspect pixelsize scale dpi)) |
|||
|
|||
(define %integer-attrs |
|||
'(slant weight spacing hintstyle width index rgba fontversion lcdfilter)) |
|||
|
|||
(define %bool-attrs |
|||
'(antialias |
|||
histing verticallayout autohint outline scalable |
|||
minspace embolden embeddedbitmap decorative)) |
|||
|
|||
(define-wrapped-pointer-type <pattern> |
|||
pattern? |
|||
wrap-pattern unwrap-pattern |
|||
(lambda (pattern port) (format port "#<pattern>"))) |
|||
|
|||
(define symbol->pointer |
|||
(compose string->pointer symbol->string)) |
|||
|
|||
(define (pattern-add-string pattern attr value) |
|||
(ffi:fontconfig-pattern-add-string |
|||
(unwrap-pattern pattern) (symbol->pointer attr) (string->pointer value))) |
|||
(define (pattern-add-double pattern attr value) |
|||
(ffi:fontconfig-pattern-add-double |
|||
(unwrap-pattern pattern) (symbol->pointer attr) value)) |
|||
(define (pattern-add-integer pattern attr value) |
|||
(ffi:fontconfig-pattern-add-integer |
|||
(unwrap-pattern pattern) (symbol->pointer attr) value)) |
|||
(define (pattern-add-bool pattern attr value) |
|||
(ffi:fontconfig-pattern-add-bool |
|||
(unwrap-pattern pattern) (symbol->pointer attr) (if value 1 0))) |
|||
|
|||
(define* (make-pattern #:optional (args '())) |
|||
(define bool? (cute member <> %bool-attrs)) |
|||
(define int? (cute member <> %integer-attrs)) |
|||
(define double? (cute member <> %double-attrs)) |
|||
(define string? (cute member <> %string-attrs)) |
|||
(let* ((ptr (ffi:fontconfig-pattern-create)) |
|||
(pattern |
|||
(if (null-pointer? ptr) |
|||
(error "make-pattern" "failed to create pattern") |
|||
(wrap-pattern ptr)))) |
|||
(set-pointer-finalizer! ptr ffi:fontconfig-pattern-destroy) |
|||
(map (lambda (args) |
|||
(apply (match args |
|||
(((? bool? attr) value) pattern-add-bool) |
|||
(((? int? attr) value) pattern-add-integer) |
|||
(((? double? attr) value) pattern-add-double) |
|||
(((? string? attr) value) pattern-add-string)) |
|||
pattern args)) |
|||
args) |
|||
pattern)) |
|||
|
|||
(define (font-list pattern os) |
|||
(ffi:fontconfig-font-list |
|||
%null-pointer (unwrap-pattern pattern) (unwrap-object-set os))) |
|||
|
|||
(define (char*->pointer pointer offset) |
|||
(dereference-pointer |
|||
(bytevector->pointer |
|||
(pointer->bytevector pointer int (* int offset))))) |
|||
|
|||
(define (pattern->string pattern) |
|||
(pointer->string |
|||
(ffi:fontconfig-name-unparse (unwrap-pattern pattern)))) |
|||
|
|||
(define (make-font-list nfont sfont fonts) |
|||
(map (compose wrap-pattern (cute char*->pointer fonts <>)) |
|||
(iota nfont))) |
|||
|
|||
;; https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcpatternformat.html |
|||
(define* (pattern->format pattern #:optional (format "%{=fclist}")) |
|||
(let ((ptr (ffi:fontconfig-pattern-format |
|||
(unwrap-pattern pattern) (string->pointer format)))) |
|||
(if (null-pointer? ptr) |
|||
(error "pattern->format" "invalid format") |
|||
(pointer->string ptr)) |
|||
;; FIXME: How to FREE ptr! |
|||
)) |
|||
|
|||
(define %fc-types |
|||
'(fc-unknown ; -1 |
|||
fc-void |
|||
fc-integer |
|||
fc-double |
|||
fc-string |
|||
fc-bool |
|||
fc-matrix |
|||
fc-charset |
|||
fc-ftface |
|||
fc-langset |
|||
fc-range)) |
|||
|
|||
(define (int->fc-type int) |
|||
(list-ref %fc-types (1+ int))) |
|||
|
|||
(define (fontconfig-value ptr) |
|||
(match-let* (((type ptr) (parse-c-struct ptr `(,int *))) |
|||
(type (int->fc-type type))) |
|||
(match type |
|||
;; Other types are not implemented |
|||
('fc-void *unspecified*) |
|||
('fc-string (pointer->string ptr)) |
|||
(_ (error "fontconfig-value" "NOT IMPLEMENTED YET!"))))) |
|||
|
|||
(define (pattern-get pattern attr) |
|||
(let ((out (bytevector->pointer (make-bytevector (* int 2))))) |
|||
(ffi:fontconfig-pattern-get |
|||
(unwrap-pattern pattern) (string->pointer attr) 0 out) |
|||
(fontconfig-value out))) |
|||
|
|||
(define (pointer->font-list ptr) |
|||
(apply make-font-list (parse-c-struct ptr `(,int ,int *)))) |
|||
|
|||
(define (pattern-list pattern) |
|||
(let ((os (make-object-set))) |
|||
(for-each (cute object-set-add! os <>) |
|||
'("family" "style" "file")) |
|||
(pointer->font-list (font-list pattern os)))) |
@ -0,0 +1,92 @@ |
|||
;;; guile-fontconfig --- FFI bindings for FontConfig |
|||
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
;;; |
|||
;;; This file is part of guile-fontconfig. |
|||
;;; |
|||
;;; Guile-fontconfig 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 3 of |
|||
;;; the License, or (at your option) any later version. |
|||
;;; |
|||
;;; Guile-fontconfig 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 Lesser General Public |
|||
;;; License along with guile-fontconfig. If not, see |
|||
;;; <http://www.gnu.org/licenses/>. |
|||
|
|||
;;; Commentary: |
|||
;; |
|||
;; GNU Guix development package. To build and install, run: |
|||
;; |
|||
;; guix package -f guix.scm |
|||
;; |
|||
;; To use as the basis for a development environment, run: |
|||
;; |
|||
;; guix environment -l guix.scm |
|||
;; |
|||
;;; Code: |
|||
|
|||
(use-modules (ice-9 match) |
|||
(ice-9 popen) |
|||
(ice-9 rdelim) |
|||
(srfi srfi-1) |
|||
(srfi srfi-26) |
|||
(guix gexp) |
|||
(guix packages) |
|||
(guix licenses) |
|||
(guix git-download) |
|||
(guix build-system gnu) |
|||
((guix build utils) #:select (with-directory-excursion)) |
|||
(gnu packages) |
|||
(gnu packages autotools) |
|||
(gnu packages guile) |
|||
(gnu packages pkg-config) |
|||
(gnu packages fontutils) |
|||
(gnu packages texinfo)) |
|||
|
|||
(define %source-dir (dirname (current-filename))) |
|||
|
|||
(define git-file? |
|||
(let* ((pipe (with-directory-excursion %source-dir |
|||
(open-pipe* OPEN_READ "git" "ls-files"))) |
|||
(files (let loop ((lines '())) |
|||
(match (read-line pipe) |
|||
((? eof-object?) |
|||
(reverse lines)) |
|||
(line |
|||
(loop (cons line lines)))))) |
|||
(status (close-pipe pipe))) |
|||
(lambda (file stat) |
|||
(match (stat:type stat) |
|||
('directory #t) |
|||
((or 'regular 'symlink) |
|||
(any (cut string-suffix? <> file) files)) |
|||
(_ #f))))) |
|||
|
|||
(package |
|||
(name "guile-fontconfig") |
|||
(version "0.0.1") |
|||
(source (local-file %source-dir #:recursive? #t #:select? git-file?)) |
|||
(build-system gnu-build-system) |
|||
(arguments |
|||
'(#:make-flags '("GUILE_AUTO_COMPILE=0") |
|||
#:phases |
|||
(modify-phases %standard-phases |
|||
(add-after 'unpack 'bootstrap |
|||
(lambda _ (zero? (system* "sh" "bootstrap"))))))) |
|||
(native-inputs |
|||
`(("autoconf" ,autoconf) |
|||
("automake" ,automake) |
|||
("pkg-config" ,pkg-config) |
|||
("texinfo" ,texinfo))) |
|||
(inputs |
|||
`(("guile" ,guile-3.0) |
|||
("fontconfig" ,fontconfig))) |
|||
(synopsis "Guile bindings for FontConfig") |
|||
(description "Guile-fontconfig provides pure Guile Scheme bindings to the |
|||
FontConfig C shared library via the foreign function interface.") |
|||
(home-page "") |
|||
(license lgpl3+)) |
@ -0,0 +1,32 @@ |
|||
#!/bin/sh |
|||
|
|||
# guile-fontconfig --- FFI bindings for FONTCONFIG |
|||
# Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz> |
|||
# |
|||
# This file is part of guile-fontconfig. |
|||
# |
|||
# Guile-fontconfig 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 3 of |
|||
# the License, or (at your option) any later version. |
|||
# |
|||
# Guile-fontconfig 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 Lesser General Public |
|||
# License along with guile-fontconfig. If not, see |
|||
# <http://www.gnu.org/licenses/>. |
|||
|
|||
abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`" |
|||
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`" |
|||
|
|||
GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH" |
|||
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH" |
|||
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH |
|||
|
|||
PATH="$abs_top_builddir/scripts:$PATH" |
|||
export PATH |
|||
|
|||
exec "$@" |
Loading…
Reference in new issue