signal-desktop/ts/util/avatarTextSizeCalculator.ts
2021-08-05 20:17:05 -04:00

52 lines
1.2 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import * as grapheme from './grapheme';
import { getEmojiCount } from '../components/emoji/lib';
type FontSizes = {
diameter: number;
singleEmoji: number;
smol: number;
text: number;
};
type RectSize = {
height: number;
width: number;
};
export function getFontSizes(bubbleSize: number): FontSizes {
return {
diameter: Math.ceil(bubbleSize * 0.75),
singleEmoji: Math.ceil(bubbleSize * 0.6),
smol: Math.ceil(bubbleSize * 0.05),
text: Math.ceil(bubbleSize * 0.45),
};
}
export function getFittedFontSize(
bubbleSize: number,
text: string,
measure: (candidateFontSize: number) => RectSize
): number {
const sizes = getFontSizes(bubbleSize);
let candidateFontSize = sizes.text;
if (grapheme.count(text) === 1 && getEmojiCount(text) === 1) {
candidateFontSize = sizes.singleEmoji;
}
for (
candidateFontSize;
candidateFontSize >= sizes.smol;
candidateFontSize -= 1
) {
const { height, width } = measure(candidateFontSize);
if (width < sizes.diameter && height < sizes.diameter) {
return candidateFontSize;
}
}
return candidateFontSize;
}