From 34fbef4348ded964c203410a21477d11f99b35f6 Mon Sep 17 00:00:00 2001 From: Doug Felt Date: Fri, 13 Nov 2015 17:35:50 -0800 Subject: [PATCH] Rewrite makefile Change the build process to provide more intermediate steps and maintain intermediate targets. This slows down make's analysis phase, though. Make can be run with -j to parallelize the building, but be careful with multiple targets on the command line (e.g. 'make clean font') since clean's deletion of the output tree can sometimes occur after some of the output directories get built. This is preparatory to replacing the png images with the original internal set. These require a bit more cleanup and processing, which is what these changes do. The overall flow is: - convert all emoji to desired size (136x128). All are smaller than this, most are 128x128 but there are some others. - run waveflag on the flags - convert all flags to desired size(136x128). The flags are 128x128 originally. - 'rename' the flags by creating softlinks with the desired names - run pngquant on all the images and copy them into a single directory, this reduces slight antialiasing differences. - compress all the images, using zopflipng if available, else optipng. zopflipng saves about 10%, but is 10x slower. The remaining steps of building the font are unchanged, for the moment. The intermediate image files are put into a 'build' subdirectory to organize them and keep them out of the way. --- Makefile | 174 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 134 insertions(+), 40 deletions(-) diff --git a/Makefile b/Makefile index 006dd964f..dceab47a6 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - EMOJI = NotoColorEmoji font: $(EMOJI).ttf @@ -20,16 +19,33 @@ CFLAGS = -std=c99 -Wall -Wextra `pkg-config --cflags --libs cairo` LDFLAGS = `pkg-config --libs cairo` PNGQUANTDIR := third_party/pngquant PNGQUANT := $(PNGQUANTDIR)/pngquant -PNGQUANTFLAGS = --speed 1 --skip-if-larger --ext '.png' --force +PNGQUANTFLAGS = --speed 1 --skip-if-larger --force -$(PNGQUANT): - $(MAKE) -C $(PNGQUANTDIR) +# zopflipng is better (about 10%) but much slower. it will be used if +# present. pass ZOPFLIPNG= as an arg to make to use optipng instead. -waveflag: waveflag.c - $(CC) $< -o $@ $(CFLAGS) $(LDFLAGS) +ZOPFLIPNG = zopflipng +OPTIPNG = optipng + +EMOJI_BUILDER = third_party/color_emoji/emoji_builder.py +ADD_GLYPHS = third_party/color_emoji/add_glyphs.py +PUA_ADDER = map_pua_emoji.py +VS_ADDER = add_vs_cmap.py # from nototools + +#EMOJI_SRC_DIR := png/128 +EMOJI_SRC_DIR := /usr/local/google/users/dougfelt/emoji_google/noto-emoji-source/png +FLAGS_SRC_DIR := third_party/region-flags/png + +BUILD_DIR := build +EMOJI_DIR := $(BUILD_DIR)/emoji +FLAGS_DIR := $(BUILD_DIR)/flags +RESIZED_FLAGS_DIR := $(BUILD_DIR)/resized_flags +RENAMED_FLAGS_DIR := $(BUILD_DIR)/renamed_flags +QUANTIZED_DIR := $(BUILD_DIR)/quantized_pngs +COMPRESSED_DIR := $(BUILD_DIR)/compressed_pngs LIMITED_FLAGS = CN DE ES FR GB IT JP KR RU US -FLAGS = AD AE AF AG AI AL AM AO AR AS AT AU AW AX AZ \ +SELECTED_FLAGS = AD AE AF AG AI AL AM AO AR AS AT AU AW AX AZ \ BA BB BD BE BF BG BH BI BJ BM BN BO BR BS BT BW BY BZ \ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ \ DE DJ DK DM DO DZ \ @@ -54,54 +70,127 @@ FLAGS = AD AE AF AG AI AL AM AO AR AS AT AU AW AX AZ \ WS \ YE \ ZA ZM ZW +ALL_FLAGS = ($basename ($notdir $(wildcard $(FLAGS_SRC_DIR)/*.png))) -FLAGS_SRC_DIR = third_party/region-flags/png -FLAGS_DIR = ./flags +FLAGS = $(SELECTED_FLAGS) -GLYPH_NAMES := $(shell ./flag_glyph_name.py $(FLAGS)) -WAVED_FLAGS := $(foreach flag,$(FLAGS),$(FLAGS_DIR)/$(flag).png) -PNG128_FLAGS := $(foreach glyph_name,$(GLYPH_NAMES),$(addprefix ./png/128/emoji_$(glyph_name),.png)) +FLAG_NAMES = $(FLAGS:%=%.png) +FLAG_FILES = $(addprefix $(FLAGS_DIR)/, $(FLAG_NAMES)) +RESIZED_FLAG_FILES = $(addprefix $(RESIZED_FLAGS_DIR)/, $(FLAG_NAMES)) -$(FLAGS_DIR)/%.png: $(FLAGS_SRC_DIR)/%.png ./waveflag $(PNGQUANT) - mkdir -p $(FLAGS_DIR) - ./waveflag "$<" "$@" - optipng -quiet -o7 "$@" - $(PNGQUANT) $(PNGQUANTFLAGS) "$@" +FLAG_GLYPH_NAMES = $(shell ./flag_glyph_name.py $(FLAGS)) +RENAMED_FLAG_NAMES = $(FLAG_GLYPH_NAMES:%=emoji_%.png) +RENAMED_FLAG_FILES = $(addprefix $(RENAMED_FLAGS_DIR)/, $(RENAMED_FLAG_NAMES)) -flag-symlinks: $(WAVED_FLAGS) - $(subst ^, , \ - $(join \ - $(FLAGS:%=ln^-fs^../../flags/%.png^), \ - $(GLYPH_NAMES:%=./png/128/emoji_%.png;) \ - ) \ - ) +EMOJI_NAMES = $(notdir $(wildcard $(EMOJI_SRC_DIR)/emoji_u*.png)) +EMOJI_FILES= $(addprefix $(EMOJI_DIR)/,$(EMOJI_NAMES))) -$(PNG128_FLAGS): flag-symlinks +ALL_NAMES = $(EMOJI_NAMES) $(RENAMED_FLAG_NAMES) -#EMOJI_PNG128 = ./png/128/emoji_u -EMOJI_PNG128 = /tmp/placeholder_emoji_plus/emoji_u +ALL_QUANTIZED_FILES = $(addprefix $(QUANTIZED_DIR)/, $(ALL_NAMES)) +ALL_COMPRESSED_FILES = $(addprefix $(COMPRESSED_DIR)/, $(ALL_NAMES)) -EMOJI_BUILDER = third_party/color_emoji/emoji_builder.py -ADD_GLYPHS = third_party/color_emoji/add_glyphs.py -PUA_ADDER = map_pua_emoji.py -VS_ADDER = add_vs_cmap.py -ifeq (, $(shell which $(VS_ADDER))) - $(error "$(VS_ADDER) not in path, run setup.py in nototools") +# tool checks +ifeq (,$(shell which $(ZOPFLIPNG))) + ifeq (,$(wildcard $(ZOPFLIPNG))) + MISSING_ZOPFLI = fail + endif endif -%.ttx: %.ttx.tmpl $(ADD_GLYPHS) $(UNI) $(PNG128_FLAGS) - python $(ADD_GLYPHS) "$<" "$@" "$(EMOJI_PNG128)" +ifeq (,$(shell which $(OPTIPNG))) + ifeq (,$(wildcard $(OPTIPNG))) + MISSING_OPTIPNG = fail + endif +endif + +ifeq (, $(shell which $(VS_ADDER))) + MISSING_ADDER = fail +endif +emoji: $(EMOJI_FILES) + +flags: $(FLAG_FILES) + +resized_flags: $(RESIZED_FLAG_FILES) + +renamed_flags: $(RENAMED_FLAG_FILES) + +quantized: $(ALL_QUANTIZED_FILES) + +compressed: $(ALL_COMPRESSED_FILES) + +check_compress_tool: +ifdef MISSING_ZOPFLI + ifdef MISSING_OPTIPNG + $(error "neither $(ZOPFLIPNG) nor $(OPTIPNG) is available") + else + @echo "using $(OPTIPNG)" + endif +else + @echo "using $(ZOPFLIPNG)" +endif + +check_vs_adder: +ifdef MISSING_ADDER + $(error "$(VS_ADDER) not in path, run setup.py in nototools") +endif + + +$(EMOJI_DIR) $(FLAGS_DIR) $(RESIZED_FLAGS_DIR) $(RENAMED_FLAGS_DIR) $(QUANTIZED_DIR) $(COMPRESSED_DIR): + mkdir -p "$@" + +$(PNGQUANT): + $(MAKE) -C $(PNGQUANTDIR) + +waveflag: waveflag.c + $(CC) $< -o $@ $(CFLAGS) $(LDFLAGS) + +$(EMOJI_DIR)/%.png: $(EMOJI_SRC_DIR)/%.png | $(EMOJI_DIR) + echo "emoji $< $@" + @convert -extent 136x128 -gravity center -background none "$<" "$@" + +$(FLAGS_DIR)/%.png: $(FLAGS_SRC_DIR)/%.png ./waveflag $(PNGQUANT) | $(FLAGS_DIR) + @./waveflag "$<" "$@" + +$(RESIZED_FLAGS_DIR)/%.png: $(FLAGS_DIR)/%.png | $(RESIZED_FLAGS_DIR) + @convert -extent 136x128 -gravity center -background none "$<" "$@" + +flag-symlinks: $(RESIZED_FLAG_FILES) | $(RENAMED_FLAGS_DIR) + @$(subst ^, , \ + $(join \ + $(FLAGS:%=ln^-fs^../resized_flags/%.png^), \ + $(RENAMED_FLAG_FILES:%=%; ) \ + ) \ + ) + +$(RENAMED_FLAG_FILES): flag-symlinks + +$(QUANTIZED_DIR)/%.png: $(RENAMED_FLAGS_DIR)/%.png $(PNGQUANT) | $(QUANTIZED_DIR) + $(PNGQUANT) $(PNGQUANTFLAGS) -o "$@" "$<" + +$(QUANTIZED_DIR)/%.png: $(EMOJI_DIR)/%.png $(PNGQUANT) | $(QUANTIZED_DIR) + $(PNGQUANT) $(PNGQUANTFLAGS) -o "$@" "$<" + +$(COMPRESSED_DIR)/%.png: $(QUANTIZED_DIR)/%.png | check_compress_tool $(COMPRESSED_DIR) +ifdef MISSING_ZOPFLI + $(OPTIPNG) -quiet -o7 -force -out "$@" "$<" +else + $(ZOPFLIPNG) -y "$<" "$@" 2> /dev/null +endif + + +%.ttx: %.ttx.tmpl $(ADD_GLYPHS) $(ALL_COMPRESSED_FILES) + @python $(ADD_GLYPHS) "$<" "$@" "$(COMPRESSED_DIR)/emoji_u" %.ttf: %.ttx @rm -f "$@" ttx "$<" $(EMOJI).ttf: $(EMOJI).tmpl.ttf $(EMOJI_BUILDER) $(PUA_ADDER) \ - $(EMOJI_PNG128)*.png $(PNG128_FLAGS) - python $(EMOJI_BUILDER) -V $< "$@" $(EMOJI_PNG128) - python $(PUA_ADDER) "$@" "$@-with-pua" + $(ALL_COMPRESSED_FILES) | check_vs_adder + @python $(EMOJI_BUILDER) -V $< "$@" "$(COMPRESSED_DIR)/emoji_u" + @python $(PUA_ADDER) "$@" "$@-with-pua" $(VS_ADDER) --dstdir '.' -o "$@-with-pua-varsel" "$@-with-pua" mv "$@-with-pua-varsel" "$@" rm "$@-with-pua" @@ -109,5 +198,10 @@ $(EMOJI).ttf: $(EMOJI).tmpl.ttf $(EMOJI_BUILDER) $(PUA_ADDER) \ clean: rm -f $(EMOJI).ttf $(EMOJI).tmpl.ttf $(EMOJI).tmpl.ttx rm -f waveflag - rm -rf $(FLAGS_DIR) - rm -f `find -type l -name "*.png"` + rm -rf $(BUILD_DIR) + +.SECONDARY: $(EMOJI_FILES) $(FLAG_FILES) $(RESIZED_FLAG_FILES) $(RENAMED_FLAG_FILES) \ + $(ALL_QUANTIZED_FILES) $(ALL_COMPRESSED_FILES) + +.PHONY: clean flags emoji renamed_flags quantized compressed check_compress_tool +