Skip to content

Commit

Permalink
Merge pull request #231 from jairbubbles/fix-some-emoji-rendering-wit…
Browse files Browse the repository at this point in the history
…h-segoe-ui-emoji-font

Fix some emoji rendering with Segoe UI Emoji font
  • Loading branch information
JimBobSquarePants authored Feb 6, 2022
2 parents 6388c64 + 9922231 commit b52ed6e
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 135 deletions.
286 changes: 154 additions & 132 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -1,137 +1,159 @@
name: Build

on:
push:
branches:
- master
tags:
- "v*"
pull_request:
branches:
- master
push:
branches:
- master
tags:
- "v*"
pull_request:
branches:
- master

jobs:
Build:
strategy:
matrix:
options:
- os: ubuntu-latest
framework: netcoreapp3.1
runtime: -x64
codecov: false
- os: macos-latest
framework: netcoreapp3.1
runtime: -x64
codecov: false
- os: windows-latest
framework: netcoreapp3.1
runtime: -x64
codecov: true
- os: windows-latest
framework: netcoreapp2.1
runtime: -x64
codecov: false
- os: windows-latest
framework: net472
runtime: -x64
codecov: false
- os: windows-latest
framework: net472
runtime: -x86
codecov: false

runs-on: ${{matrix.options.os}}
if: "!contains(github.event.head_commit.message, '[skip ci]')"

steps:
- uses: actions/checkout@v2

# See https://github.com/actions/checkout/issues/165#issuecomment-657673315
- name: Create LFS file list
run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id

- name: Restore LFS cache
uses: actions/cache@v2
id: lfs-cache
with:
path: .git/lfs
key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}-v1

- name: Git LFS Pull
run: git lfs pull

- name: Install NuGet
uses: NuGet/setup-nuget@v1

- name: Setup Git
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
git fetch --prune --unshallow
git submodule -q update --init --recursive
- name: Setup NuGet Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
shell: pwsh
run: ./ci-build.ps1
env:
SIXLABORS_TESTING: True

- name: Test
shell: pwsh
run: ./ci-test.ps1 "${{matrix.options.os}}" "${{matrix.options.framework}}" "${{matrix.options.runtime}}" "${{matrix.options.codecov}}"
env:
SIXLABORS_TESTING: True
XUNIT_PATH: .\tests\SixLabors.Fonts.Tests # Required for xunit

- name: Export Failed Output
uses: actions/upload-artifact@v2
if: failure()
with:
name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
path: tests/Images/ActualOutput/

- name: Update Codecov
uses: codecov/codecov-action@v1
if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors')
with:
flags: unittests

Publish:
needs: [Build]

runs-on: windows-latest

if: (github.event_name == 'push')

steps:
- uses: actions/checkout@v2

- name: Install NuGet
uses: NuGet/setup-nuget@v1

- name: Setup Git
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
git fetch --prune --unshallow
git submodule -q update --init --recursive
- name: Pack
shell: pwsh
run: ./ci-pack.ps1

- name: Publish to MyGet
shell: pwsh
run: |
nuget.exe push .\artifacts\*.nupkg ${{secrets.MYGET_TOKEN}} -Source https://www.myget.org/F/sixlabors/api/v2/package
nuget.exe push .\artifacts\*.snupkg ${{secrets.MYGET_TOKEN}} -Source https://www.myget.org/F/sixlabors/api/v3/index.json
Build:
strategy:
matrix:
options:
- os: ubuntu-latest
framework: netcoreapp3.1
runtime: -x64
codecov: false
- os: macos-latest
framework: netcoreapp3.1
runtime: -x64
codecov: false
- os: windows-latest
framework: netcoreapp3.1
runtime: -x64
codecov: true
- os: windows-latest
framework: netcoreapp2.1
runtime: -x64
codecov: false
- os: windows-latest
framework: net472
runtime: -x64
codecov: false
- os: windows-latest
framework: net472
runtime: -x86
codecov: false

runs-on: ${{matrix.options.os}}
if: "!contains(github.event.head_commit.message, '[skip ci]')"

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

# See https://github.com/actions/checkout/issues/165#issuecomment-657673315
- name: Git Create LFS file list
run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id

- name: Git Setup LFS Cache
uses: actions/cache@v2
id: lfs-cache
with:
path: .git/lfs
key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}-v1

- name: Git Pull LFS
run: git lfs pull

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Setup
uses: actions/setup-dotnet@v1
with:
dotnet-version: |
6.0.x
5.0.x
3.1.x
2.1.x
- name: DotNet Build
shell: pwsh
run: ./ci-build.ps1 "${{matrix.options.framework}}"
env:
SIXLABORS_TESTING: True

- name: DotNet Test
shell: pwsh
run: ./ci-test.ps1 "${{matrix.options.os}}" "${{matrix.options.framework}}" "${{matrix.options.runtime}}" "${{matrix.options.codecov}}"
env:
SIXLABORS_TESTING: True
XUNIT_PATH: .\tests\SixLabors.Fonts.Tests # Required for xunit

- name: Export Failed Output
uses: actions/upload-artifact@v2
if: failure()
with:
name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
path: tests/Images/ActualOutput/

- name: Codecov Update
uses: codecov/codecov-action@v1
if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors')
with:
flags: unittests

Publish:
needs: [Build]

runs-on: ubuntu-latest

if: (github.event_name == 'push')

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Pack
shell: pwsh
run: ./ci-pack.ps1

- name: MyGet Publish
shell: pwsh
run: |
dotnet nuget push .\artifacts\*.nupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v2/package
dotnet nuget push .\artifacts\*.snupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v3/index.json
# TODO: If github.ref starts with 'refs/tags' then it was tag push and we can optionally push out package to nuget.org
6 changes: 3 additions & 3 deletions src/SixLabors.Fonts/TextLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -565,11 +565,11 @@ private static TextBox BreakLines(
{
glyphAdvance *= options.TabWidth;
}
else if (CodePoint.IsZeroWidthJoiner(codePoint) || CodePoint.IsZeroWidthNonJoiner(codePoint))
else if (metrics.Length == 1 && (CodePoint.IsZeroWidthJoiner(codePoint) || CodePoint.IsZeroWidthNonJoiner(codePoint)))
{
// The zero-width joiner characters should be ignored when determining word or
// line break boundaries so are safe to skip here.
// Any existing instances are the result of font error.
// line break boundaries so are safe to skip here. Any existing instances are the result of font error.
// It multiple metrics are associated with code point, they are most likely the result of a substitution so we shouldn't ignore it.
glyphAdvance = 0;
}
else if (!CodePoint.IsNewLine(codePoint))
Expand Down
Binary file not shown.
15 changes: 15 additions & 0 deletions tests/SixLabors.Fonts.Tests/GlyphTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,21 @@ public void RenderColrGlyphWithVariationSelector()
Assert.Equal(4, layout.Count);
}

[Fact]
public void EmojiWidthIsComputedCorrectlyWithSubstitutionOnZwj()
{
Font font = new FontCollection().Add(TestFonts.SegoeuiEmojiData()).CreateFont(72);

string text = "\U0001F469\U0001F3FB\u200D\U0001F91D\u200D\U0001F469\U0001F3FC"; // women holding hands: light skin tone, medium-light skin tone
string text2 = "\U0001F46D\U0001F3FB"; // women holding hands: light skin tone

FontRectangle size = TextMeasurer.Measure(text, new TextOptions(font));
FontRectangle size2 = TextMeasurer.Measure(text2, new TextOptions(font));

Assert.True(size.Width > 103);
Assert.True(size2.Width > 98);
}

[Theory]
[InlineData(false, false, 1238)]
[InlineData(false, true, 1238)]
Expand Down
4 changes: 4 additions & 0 deletions tests/SixLabors.Fonts.Tests/TestFonts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public static class TestFonts

public static string TwemojiMozillaFile => GetFullPath("Twemoji Mozilla.ttf");

public static string SegoeuiEmojiFile => GetFullPath("seguiemj-win11.ttf");

public static string CarterOneFile => GetFullPath("Carter_One/CarterOne.ttf");

public static string WendyOneFile => GetFullPath("Wendy_One/WendyOne-Regular.ttf");
Expand Down Expand Up @@ -198,6 +200,8 @@ public static class TestFonts

public static Stream TwemojiMozillaData() => OpenStream(TwemojiMozillaFile);

public static Stream SegoeuiEmojiData() => OpenStream(SegoeuiEmojiFile);

public static Stream WendyOneFileData() => OpenStream(WendyOneFile);

public static Stream CarterOneFileData() => OpenStream(CarterOneFile);
Expand Down

0 comments on commit b52ed6e

Please sign in to comment.