From c1415b8089b9129b256e1084bc57a5fa14ceab66 Mon Sep 17 00:00:00 2001 From: Kanahiro Iguchi Date: Sun, 2 Feb 2025 13:52:08 +0900 Subject: [PATCH] Fix/cjk unicode lookup (#5421) * fix: revert to use unicodeBlockLookup * expose some blocks * test: cjk label rendering * rmtesthtmlforlocal * fix: cover Ideo * test: add cases cjk symbols * revert: unexpose ideographs extension * test: add example to show cjk symbols * test: add render test for cjk-symbols * #5421 * test: add macos, linux expected image * add and rm expected image * add expected image * chore: comment * fix: revert rm comment * chore: rm unneeded bracket --- CHANGELOG.md | 1 + src/render/glyph_manager.test.ts | 6 +++ src/render/glyph_manager.ts | 13 +++++- src/util/is_char_in_unicode_block.ts | 6 +-- .../cjk-symbols/expected-ubuntu.png | Bin 0 -> 15495 bytes .../cjk-symbols/expected-windows.png | Bin 0 -> 17361 bytes .../cjk-symbols/style.json | 43 ++++++++++++++++++ 7 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-ubuntu.png create mode 100644 test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-windows.png create mode 100644 test/integration/render/tests/text-local-ideographs/cjk-symbols/style.json diff --git a/CHANGELOG.md b/CHANGELOG.md index b309098999..21acacb9b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### ✨ Features and improvements +- Fix rendering Japanese symbols which are accidentally ignored. ([#5421](https://github.com/maplibre/maplibre-gl-js/pull/5421) - _...Add new stuff here..._ ### 🐞 Bug fixes diff --git a/src/render/glyph_manager.test.ts b/src/render/glyph_manager.test.ts index ab3692def7..a7e45f8734 100644 --- a/src/render/glyph_manager.test.ts +++ b/src/render/glyph_manager.test.ts @@ -130,6 +130,12 @@ describe('GlyphManager', () => { expect(manager._doesCharSupportLocalGlyph(0x3066)).toBe(true); // Hangul letter a μ•„ expect(manager._doesCharSupportLocalGlyph(0xC544)).toBe(true); + // Japanese full-width dash γƒΌ + expect(manager._doesCharSupportLocalGlyph(0x30FC)).toBe(true); + // Halfwidth and Fullwidth Forms: full-width exclamation ! + expect(manager._doesCharSupportLocalGlyph(0xFF01)).toBe(true); + // CJK Symbols and Punctuation: Japanese Post mark γ€’ + expect(manager._doesCharSupportLocalGlyph(0x3012)).toBe(true); }); test('GlyphManager caches locally generated glyphs', async () => { diff --git a/src/render/glyph_manager.ts b/src/render/glyph_manager.ts index 0efe9f066f..c4afbd68aa 100644 --- a/src/render/glyph_manager.ts +++ b/src/render/glyph_manager.ts @@ -1,6 +1,7 @@ import {loadGlyphRange} from '../style/load_glyph_range'; import TinySDF from '@mapbox/tiny-sdf'; +import {unicodeBlockLookup} from '../util/is_char_in_unicode_block'; import {AlphaImage} from '../util/image'; import type {StyleGlyph} from '../style/style_glyph'; @@ -126,7 +127,17 @@ export class GlyphManager { // text, also include any other CJKV or siniform ideograph or hangul, // hiragana, or katakana character. return !!this.localIdeographFontFamily && - /\p{Ideo}|\p{sc=Hang}|\p{sc=Hira}|\p{sc=Kana}/u.test(String.fromCodePoint(id)); + (/\p{Ideo}|\p{sc=Hang}|\p{sc=Hira}|\p{sc=Kana}/u.test(String.fromCodePoint(id)) || + // fallback: RegExp can't cover all cases. refer Issue #5420 + unicodeBlockLookup['CJK Unified Ideographs'](id) || + unicodeBlockLookup['Hangul Syllables'](id) || + unicodeBlockLookup['Hiragana'](id) || + unicodeBlockLookup['Katakana'](id) || // includes "γƒΌ" + // memo: these symbols are not all. others could be added if needed. + unicodeBlockLookup['CJK Symbols and Punctuation'](id) || // γ€γ€‚γ€ƒγ€„γ€…γ€†γ€‡γ€ˆγ€‰γ€Šγ€‹γ€Œ... + unicodeBlockLookup['Halfwidth and Fullwidth Forms'](id) // οΌοΌŸοΌ‚οΌƒοΌ„οΌ…οΌ†... + ); + } _tinySDF(entry: Entry, stack: string, id: number): StyleGlyph { diff --git a/src/util/is_char_in_unicode_block.ts b/src/util/is_char_in_unicode_block.ts index da108b0a6a..fe2133b244 100644 --- a/src/util/is_char_in_unicode_block.ts +++ b/src/util/is_char_in_unicode_block.ts @@ -112,7 +112,7 @@ export const unicodeBlockLookup: UnicodeBlockLookup = { // 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF, 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF, 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F, - // 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F, + 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F, 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF, // 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F, // 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F, @@ -124,7 +124,7 @@ export const unicodeBlockLookup: UnicodeBlockLookup = { 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF, // 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF, 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF, - // 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF, + 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF, // 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F, // 'Yi Radicals': (char) => char >= 0xA490 && char <= 0xA4CF, // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, @@ -151,7 +151,7 @@ export const unicodeBlockLookup: UnicodeBlockLookup = { // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, - // 'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF, + 'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF, // 'Hangul Jamo Extended-B': (char) => char >= 0xD7B0 && char <= 0xD7FF, // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, diff --git a/test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-ubuntu.png b/test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9f67faa6f06dd08def6154e13825ef4ab21484 GIT binary patch literal 15495 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 U=Rbw@OJBNwU)Wyb2XVjuKlF?s0{{R3 literal 0 HcmV?d00001 diff --git a/test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-windows.png b/test/integration/render/tests/text-local-ideographs/cjk-symbols/expected-windows.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc85054a343630ef8451dd9493fea660bdc037d GIT binary patch literal 17361 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 G-v0tn%51p+ literal 0 HcmV?d00001 diff --git a/test/integration/render/tests/text-local-ideographs/cjk-symbols/style.json b/test/integration/render/tests/text-local-ideographs/cjk-symbols/style.json new file mode 100644 index 0000000000..be2058b8e1 --- /dev/null +++ b/test/integration/render/tests/text-local-ideographs/cjk-symbols/style.json @@ -0,0 +1,43 @@ +{ + "version": 8, + "metadata": { + "test": { + "pixelRatio": 2, + "localIdeographFontFamily": "sans-serif", + "width": 800, + "height": 600 + } + }, + "zoom": 8, + "sources": { + "sample": { + "type": "geojson", + "data": { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 0] + }, + "properties": { + "name_en": "a-b,c.", + "name_ja": "あーい、う。" + } + } + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "sample-text-left", + "type": "symbol", + "source": "sample", + "layout": { + "text-anchor": "top", + "text-field": "{name_ja}{name_en}", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"], + "text-size": 30, + "text-offset": [0, -2] + } + } + ] +}