system/noto-emoji: Added (Noto Emoji fonts).

Signed-off-by: David Spencer <idlemoor@slackbuilds.org>
This commit is contained in:
Andrew Clemons 2017-03-09 21:07:58 +00:00 committed by David Spencer
parent 7a337808e8
commit 50bfa12c57
7 changed files with 401 additions and 0 deletions

9
system/noto-emoji/README Normal file
View file

@ -0,0 +1,9 @@
noto-emoji - Color and Black-and-White Noto emoji fonts
I haven't included a font config in this package since I am still
experimenting with the best configuration. Currently, I am using this
https://gist.github.com/hexchain/47f550472e79d0805060
in /etc/fonts/conf.avail/ and symlinking it to /etc/fonts/conf.d/
It seems to work well with chromium, somewhat less so with firefox.

View file

@ -0,0 +1,11 @@
# Update the X font indexes:
if [ -x /usr/bin/mkfontdir ]; then
( cd /usr/share/fonts/TTF
mkfontscale .
mkfontdir .
)
fi
if [ -x /usr/bin/fc-cache ]; then
/usr/bin/fc-cache -f
fi

View file

@ -0,0 +1,104 @@
#!/bin/sh
# Slackware build script for noto-emoji
# Copyright 2017 Andrew Clemons, Wellington New Zealand
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PRGNAM=noto-emoji
GITREV=${GITREV:-732cb454ac854efe6ce00630fee9ae5499062056}
NOTOTOOLSGITREV=${NOTOTOOLSGITREV:-4bcd7d5bc55963c30cceaadf637836446662fec3}
VERSION=${VERSION:-git$(echo "$GITREV" | sed 's/^\(.\{7\}\).*$/\1/')}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$GITREV
tar xvf $CWD/$PRGNAM-$GITREV.tar.gz
cd $PRGNAM-$GITREV
tar xvf $CWD/nototools-$NOTOTOOLSGITREV.tar.gz
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
cd nototools-$NOTOTOOLSGITREV
export PATH=$PATH:$(pwd)/nototools
export PYTHONPATH=$(pwd)
cd ..
# Slackware's Python is a narrow-build - workaround
for sha in d34c13fb99f07d09c0c98192e7998186a622e28c 1e8488167c26ac1e780e374961d08f1fb1d1e880 ; do
patch -p1 < $CWD/patches/$sha.patch
done
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make VERBOSE=true
install -d $PKG/usr/share/fonts/TTF/
install -m644 *Emoji.ttf $PKG/usr/share/fonts/TTF/
install -m644 fonts/*.ttf $PKG/usr/share/fonts/TTF/
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE README.md \
$PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

View file

@ -0,0 +1,12 @@
PRGNAM="noto-emoji"
VERSION="git732cb45"
HOMEPAGE="https://www.google.com/get/noto/help/emoji/"
DOWNLOAD="https://github.com/googlei18n/noto-emoji/archive/732cb454ac854efe6ce00630fee9ae5499062056/noto-emoji-732cb454ac854efe6ce00630fee9ae5499062056.tar.gz \
https://github.com/googlei18n/nototools/archive/4bcd7d5bc55963c30cceaadf637836446662fec3/nototools-4bcd7d5bc55963c30cceaadf637836446662fec3.tar.gz"
MD5SUM="760193841db3b502fbb3462384eca64b \
40d0a5ac9d5ad1aeb9e9be43017828f3"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="optipng python-fonttools"
MAINTAINER="Andrew Clemons"
EMAIL="andrew.clemons@gmail.com"

View file

@ -0,0 +1,84 @@
From 1e8488167c26ac1e780e374961d08f1fb1d1e880 Mon Sep 17 00:00:00 2001
From: Andrew Clemons <andrew.clemons@gmail.com>
Date: Thu, 9 Mar 2017 21:48:18 +1300
Subject: [PATCH] Add support for "narrow" python to emoji_builder.py
The code currently only works with wide builds since it does not take
UTF-16 surrogate pairs into account.
---
third_party/color_emoji/emoji_builder.py | 41 ++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/third_party/color_emoji/emoji_builder.py b/third_party/color_emoji/emoji_builder.py
index c118e83..3d3e0c8 100644
--- a/third_party/color_emoji/emoji_builder.py
+++ b/third_party/color_emoji/emoji_builder.py
@@ -25,10 +25,36 @@
from nototools import font_data
+def myunichr(cp):
+ if sys.maxunicode < 0x10FFFF and cp > 0xFFFF:
+ return ("\\U" + hex(cp)[2:].zfill(8)).decode("unicode-escape")
+ return unichr(cp)
+
+def myord(high, low):
+ return (ord(high) - 0xD800) * 0x400 + (ord(low) - 0xDC00) + 0x10000
+
+def begins_with_surrogate(string):
+ return sys.maxunicode < 0x10FFFF and len(string) > 1 and (0xD800 <= ord(string[0]) <= 0xDBFF) and (0xDC00 <= ord(string[1]) <= 0xDFFF)
+
def get_glyph_name_from_gsub (string, font, cmap_dict):
ligatures = font['GSUB'].table.LookupList.Lookup[0].SubTable[0].ligatures
- first_glyph = cmap_dict[ord (string[0])]
- rest_of_glyphs = [cmap_dict[ord (ch)] for ch in string[1:]]
+
+ if begins_with_surrogate(string):
+ first_glyph = cmap_dict[myord(string[0], string[1])]
+ string = string[2:]
+ else:
+ first_glyph = cmap_dict[ord (string[0])]
+ string = string[1:]
+
+ rest_of_glyphs = []
+ while (len(string) > 0):
+ if begins_with_surrogate(string):
+ rest_of_glyphs.append(cmap_dict[myord(string[0], string[1])])
+ string = string[2:]
+ else:
+ rest_of_glyphs.append(cmap_dict[ord (string[0])])
+ string = string[1:]
+
for ligature in ligatures[first_glyph]:
if ligature.Component == rest_of_glyphs:
return ligature.LigGlyph
@@ -462,13 +488,13 @@ def is_vs(cp):
if "_" in codes:
pieces = codes.split ("_")
cps = [int(code, 16) for code in pieces]
- uchars = "".join ([unichr(cp) for cp in cps if not is_vs(cp)])
+ uchars = "".join ([myunichr(cp) for cp in cps if not is_vs(cp)])
else:
cp = int(codes, 16)
if is_vs(cp):
print "ignoring unexpected vs input %04x" % cp
continue
- uchars = unichr(cp)
+ uchars = myunichr(cp)
img_files[uchars] = img_file
if not img_files:
raise Exception ("No image files found in '%s'." % glb)
@@ -483,6 +509,13 @@ def is_vs(cp):
except:
print "no cmap entry for %x" % ord(uchars)
raise ValueError("%x" % ord(uchars))
+ elif len (uchars) == 2 and begins_with_surrogate(uchars):
+ cp = myord(uchars[0], uchars[1])
+ try:
+ glyph_name = unicode_cmap.cmap[cp]
+ except:
+ print "no cmap entry for %x" % cp
+ raise ValueError("%x" % ord(uchars))
else:
glyph_name = get_glyph_name_from_gsub (uchars, font, unicode_cmap.cmap)
glyph_id = font.getGlyphID (glyph_name)

View file

@ -0,0 +1,162 @@
From d34c13fb99f07d09c0c98192e7998186a622e28c Mon Sep 17 00:00:00 2001
From: Andrew Clemons <andrew.clemons@gmail.com>
Date: Tue, 7 Mar 2017 18:13:40 +1300
Subject: [PATCH] Tidy mixed tabs and spaces
---
third_party/color_emoji/emoji_builder.py | 76 ++++++++++++++++----------------
1 file changed, 37 insertions(+), 39 deletions(-)
diff --git a/third_party/color_emoji/emoji_builder.py b/third_party/color_emoji/emoji_builder.py
index c847fdb..c118e83 100644
--- a/third_party/color_emoji/emoji_builder.py
+++ b/third_party/color_emoji/emoji_builder.py
@@ -33,7 +33,6 @@ def get_glyph_name_from_gsub (string, font, cmap_dict):
if ligature.Component == rest_of_glyphs:
return ligature.LigGlyph
-
def div (a, b):
return int (round (a / float (b)))
@@ -111,11 +110,11 @@ def write_smallGlyphMetrics (self, width, height):
line_height = (ascent + descent) * y_ppem / float (upem)
line_ascent = ascent * y_ppem / float (upem)
y_bearing = int (round (line_ascent - .5 * (line_height - height)))
- # fudge y_bearing if calculations are a bit off
- if y_bearing == 128:
- y_bearing = 127
+ # fudge y_bearing if calculations are a bit off
+ if y_bearing == 128:
+ y_bearing = 127
advance = width
- # print "small glyph metrics h: %d w: %d" % (height, width)
+ # print "small glyph metrics h: %d w: %d" % (height, width)
# smallGlyphMetrics
# Type Name
# BYTE height
@@ -123,14 +122,14 @@ def write_smallGlyphMetrics (self, width, height):
# CHAR BearingX
# CHAR BearingY
# BYTE Advance
- try:
- self.write (struct.pack ("BBbbB",
- height, width,
- x_bearing, y_bearing,
- advance))
- except Exception as e:
- raise ValueError("%s, h: %d w: %d x: %d y: %d %d a:" % (
- e, height, width, x_bearing, y_bearing, advance))
+ try:
+ self.write (struct.pack ("BBbbB",
+ height, width,
+ x_bearing, y_bearing,
+ advance))
+ except Exception as e:
+ raise ValueError("%s, h: %d w: %d x: %d y: %d %d a:" % (
+ e, height, width, x_bearing, y_bearing, advance))
def write_format1 (self, png):
@@ -253,11 +252,11 @@ def write_sbitLineMetrics_hori (self):
ascent = div (ascent * y_ppem, upem)
descent = - (line_height - ascent)
self.write (struct.pack ("bbBbbbbbbbbb",
- ascent, descent,
- self.strike_metrics.width,
- 0, 0, 0,
- 0, 0, 0, 0, # TODO
- 0, 0))
+ ascent, descent,
+ self.strike_metrics.width,
+ 0, 0, 0,
+ 0, 0, 0, 0, # TODO
+ 0, 0))
def write_sbitLineMetrics_vert (self):
self.write_sbitLineMetrics_hori () # XXX
@@ -430,10 +429,10 @@ def drop_outline_tables (font):
print "Loaded font '%s'." % font_file
font_metrics = FontMetrics (font['head'].unitsPerEm,
- font['hhea'].ascent,
- -font['hhea'].descent)
+ font['hhea'].ascent,
+ -font['hhea'].descent)
print "Font metrics: upem=%d ascent=%d descent=%d." % \
- (font_metrics.upem, font_metrics.ascent, font_metrics.descent)
+ (font_metrics.upem, font_metrics.ascent, font_metrics.descent)
glyph_metrics = font['hmtx'].metrics
unicode_cmap = font['cmap'].getcmap (3, 10)
if not unicode_cmap:
@@ -449,8 +448,8 @@ def drop_outline_tables (font):
eblc.write_header ()
eblc.start_strikes (len (img_prefixes))
- def is_vs(cp):
- return cp >= 0xfe00 and cp <= 0xfe0f
+ def is_vs(cp):
+ return cp >= 0xfe00 and cp <= 0xfe0f
for img_prefix in img_prefixes:
print
@@ -462,13 +461,13 @@ def is_vs(cp):
codes = img_file[len (img_prefix):-4]
if "_" in codes:
pieces = codes.split ("_")
- cps = [int(code, 16) for code in pieces]
+ cps = [int(code, 16) for code in pieces]
uchars = "".join ([unichr(cp) for cp in cps if not is_vs(cp)])
else:
- cp = int(codes, 16)
- if is_vs(cp):
- print "ignoring unexpected vs input %04x" % cp
- continue
+ cp = int(codes, 16)
+ if is_vs(cp):
+ print "ignoring unexpected vs input %04x" % cp
+ continue
uchars = unichr(cp)
img_files[uchars] = img_file
if not img_files:
@@ -479,19 +478,18 @@ def is_vs(cp):
advance = width = height = 0
for uchars, img_file in img_files.items ():
if len (uchars) == 1:
- try:
- glyph_name = unicode_cmap.cmap[ord (uchars)]
- except:
- print "no cmap entry for %x" % ord(uchars)
- raise ValueError("%x" % ord(uchars))
+ try:
+ glyph_name = unicode_cmap.cmap[ord (uchars)]
+ except:
+ print "no cmap entry for %x" % ord(uchars)
+ raise ValueError("%x" % ord(uchars))
else:
glyph_name = get_glyph_name_from_gsub (uchars, font, unicode_cmap.cmap)
glyph_id = font.getGlyphID (glyph_name)
glyph_imgs[glyph_id] = img_file
if "verbose" in options:
uchars_name = ",".join (["%04X" % ord (char) for char in uchars])
- # print "Matched U+%s: id=%d name=%s image=%s" % (
- # uchars_name, glyph_id, glyph_name, img_file)
+ # print "Matched U+%s: id=%d name=%s image=%s" % (uchars_name, glyph_id, glyph_name, img_file)
advance += glyph_metrics[glyph_name][0]
w, h = PNG (img_file).get_size ()
@@ -529,10 +527,10 @@ def is_vs(cp):
drop_outline_tables (font)
print "Dropped outline ('glyf', 'CFF ') and related tables."
- # hack removal of cmap pua entry for unknown flag glyph. If we try to
- # remove it earlier, getGlyphID dies. Need to restructure all of this
- # code.
- font_data.delete_from_cmap(font, [0xfe82b])
+ # hack removal of cmap pua entry for unknown flag glyph. If we try to
+ # remove it earlier, getGlyphID dies. Need to restructure all of this
+ # code.
+ font_data.delete_from_cmap(font, [0xfe82b])
font.save (out_file)
print "Output font '%s' generated." % out_file

View file

@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.
# Line up the first '|' above the ':' following the base package name, and
# the '|' on the right side marks the last column you can put a character in.
# You must make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
noto-emoji: noto-emoji (Noto Emoji fonts)
noto-emoji:
noto-emoji: Color and Black-and-White Noto emoji fonts, and tools for working
noto-emoji: with them.
noto-emoji:
noto-emoji: https://github.com/googlei18n/noto-emoji
noto-emoji:
noto-emoji:
noto-emoji:
noto-emoji:
noto-emoji: