1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2023 Google LLC 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker""" 10*c8dee2aaSAndroid Build Coastguard WorkerThe fonts collected by this script are used by SkParagraphTests.cpp which uses measurements 11*c8dee2aaSAndroid Build Coastguard Workerthat are very particular to the specific font being used. Thus, we try to get the fonts from 12*c8dee2aaSAndroid Build Coastguard Workera repeatable, documented source. 13*c8dee2aaSAndroid Build Coastguard Worker""" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workerimport argparse 17*c8dee2aaSAndroid Build Coastguard Workerimport os 18*c8dee2aaSAndroid Build Coastguard Workerimport subprocess 19*c8dee2aaSAndroid Build Coastguard Workerimport tempfile 20*c8dee2aaSAndroid Build Coastguard Workerimport shutil 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker# NotoNaskhArabic-Regular.ttf from https://fonts.google.com/noto/specimen/Noto+Naskh+Arabic 23*c8dee2aaSAndroid Build Coastguard Worker# The fonts.google.com website seems to download the various .ttf files and then zip them client 24*c8dee2aaSAndroid Build Coastguard Worker# side. By using DevTools to watch what happens when the Download Family button is pressed, and 25*c8dee2aaSAndroid Build Coastguard Worker# then using sha256sum to verify the file in the .zip (with the nice name) matches the 26*c8dee2aaSAndroid Build Coastguard Worker# indecipherable url, one can find the following link. I mirrored this to 27*c8dee2aaSAndroid Build Coastguard Worker# https://storage.googleapis.com/skia-cdn/google-web-fonts/NotoNaskhArabic-Regular.ttf 28*c8dee2aaSAndroid Build Coastguard Worker# in case the gstatic links "expire" at some point. 29*c8dee2aaSAndroid Build Coastguard Worker# We cannot easily look at the .woff2 links from 30*c8dee2aaSAndroid Build Coastguard Worker# https://fonts.googleapis.com/css2?family=Noto%20Naskh%20Arabic 31*c8dee2aaSAndroid Build Coastguard Worker# as those seem to each have a subset of the unicode range and that makes our tests awkward. 32*c8dee2aaSAndroid Build Coastguard WorkerARABIC_URL = 'https://fonts.gstatic.com/s/notonaskharabic/v33/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwvc5krK0z9_Mnuw.ttf' 33*c8dee2aaSAndroid Build Coastguard WorkerARABIC_SHA256 = 'b957e8c71a24e50c1aad4df775c46282bbe5e62e2b2b2ca72b153d75b6a15edd' 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Workerdef create_asset(target_dir): 36*c8dee2aaSAndroid Build Coastguard Worker """Copy the fonts from two different git repos into one folder.""" 37*c8dee2aaSAndroid Build Coastguard Worker os.makedirs(target_dir, exist_ok=True) 38*c8dee2aaSAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as tmp: 39*c8dee2aaSAndroid Build Coastguard Worker os.chdir(tmp) 40*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(['git', 'clone', 'https://github.com/Rusino/textlayout']) 41*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(['git', 'clone', 'https://skia.googlesource.com/skia/']) 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker os.chdir(os.path.join(tmp, "textlayout")) 44*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(['git', 'checkout', '9c1868e84da1db358807ebff5cf52327e53560a0']) 45*c8dee2aaSAndroid Build Coastguard Worker shutil.copytree("fonts", target_dir, dirs_exist_ok=True) 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker os.chdir(os.path.join(tmp, "skia")) 48*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(['git', 'checkout', '2f82ef6e77774dc4e8e382b2fb6159c58c0f8725']) 49*c8dee2aaSAndroid Build Coastguard Worker shutil.copytree(os.path.join("resources", "fonts"), target_dir, dirs_exist_ok=True) 50*c8dee2aaSAndroid Build Coastguard Worker # Cleanup files that are not fonts needed for tests 51*c8dee2aaSAndroid Build Coastguard Worker shutil.rmtree(os.path.join(target_dir, "abc")) 52*c8dee2aaSAndroid Build Coastguard Worker shutil.rmtree(os.path.join(target_dir, "svg")) 53*c8dee2aaSAndroid Build Coastguard Worker os.remove(os.path.join(target_dir, "fonts.xml")) 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker target_file = os.path.join(target_dir, 'NotoNaskhArabic-Regular.ttf') 56*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(['wget', '--quiet', '--output-document', target_file, ARABIC_URL]) 57*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output(['sha256sum', target_file], encoding='utf-8') 58*c8dee2aaSAndroid Build Coastguard Worker actual_hash = output.split(' ')[0] 59*c8dee2aaSAndroid Build Coastguard Worker if actual_hash != ARABIC_SHA256: 60*c8dee2aaSAndroid Build Coastguard Worker raise Exception('SHA256 does not match (%s != %s)' % (actual_hash, ARABIC_SHA256)) 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Workerdef main(): 64*c8dee2aaSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 65*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument('--target_dir', '-t', required=True) 66*c8dee2aaSAndroid Build Coastguard Worker args = parser.parse_args() 67*c8dee2aaSAndroid Build Coastguard Worker create_asset(args.target_dir) 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Workerif __name__ == '__main__': 71*c8dee2aaSAndroid Build Coastguard Worker main() 72*c8dee2aaSAndroid Build Coastguard Worker 73