123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import * as platform from '../../../base/common/platform.js';
- import { EditorZoom } from './editorZoom.js';
- /**
- * Determined from empirical observations.
- * @internal
- */
- const GOLDEN_LINE_HEIGHT_RATIO = platform.isMacintosh ? 1.5 : 1.35;
- /**
- * @internal
- */
- const MINIMUM_LINE_HEIGHT = 8;
- export class BareFontInfo {
- /**
- * @internal
- */
- constructor(opts) {
- this._bareFontInfoBrand = undefined;
- this.zoomLevel = opts.zoomLevel;
- this.pixelRatio = opts.pixelRatio;
- this.fontFamily = String(opts.fontFamily);
- this.fontWeight = String(opts.fontWeight);
- this.fontSize = opts.fontSize;
- this.fontFeatureSettings = opts.fontFeatureSettings;
- this.lineHeight = opts.lineHeight | 0;
- this.letterSpacing = opts.letterSpacing;
- }
- /**
- * @internal
- */
- static createFromValidatedSettings(options, zoomLevel, pixelRatio, ignoreEditorZoom) {
- const fontFamily = options.get(42 /* fontFamily */);
- const fontWeight = options.get(46 /* fontWeight */);
- const fontSize = options.get(45 /* fontSize */);
- const fontFeatureSettings = options.get(44 /* fontLigatures */);
- const lineHeight = options.get(58 /* lineHeight */);
- const letterSpacing = options.get(55 /* letterSpacing */);
- return BareFontInfo._create(fontFamily, fontWeight, fontSize, fontFeatureSettings, lineHeight, letterSpacing, zoomLevel, pixelRatio, ignoreEditorZoom);
- }
- /**
- * @internal
- */
- static _create(fontFamily, fontWeight, fontSize, fontFeatureSettings, lineHeight, letterSpacing, zoomLevel, pixelRatio, ignoreEditorZoom) {
- if (lineHeight === 0) {
- lineHeight = GOLDEN_LINE_HEIGHT_RATIO * fontSize;
- }
- else if (lineHeight < MINIMUM_LINE_HEIGHT) {
- // Values too small to be line heights in pixels are probably in ems. Accept them gracefully.
- lineHeight = lineHeight * fontSize;
- }
- // Enforce integer, minimum constraints
- lineHeight = Math.round(lineHeight);
- if (lineHeight < MINIMUM_LINE_HEIGHT) {
- lineHeight = MINIMUM_LINE_HEIGHT;
- }
- const editorZoomLevelMultiplier = 1 + (ignoreEditorZoom ? 0 : EditorZoom.getZoomLevel() * 0.1);
- fontSize *= editorZoomLevelMultiplier;
- lineHeight *= editorZoomLevelMultiplier;
- return new BareFontInfo({
- zoomLevel: zoomLevel,
- pixelRatio: pixelRatio,
- fontFamily: fontFamily,
- fontWeight: fontWeight,
- fontSize: fontSize,
- fontFeatureSettings: fontFeatureSettings,
- lineHeight: lineHeight,
- letterSpacing: letterSpacing
- });
- }
- /**
- * @internal
- */
- getId() {
- return this.zoomLevel + '-' + this.pixelRatio + '-' + this.fontFamily + '-' + this.fontWeight + '-' + this.fontSize + '-' + this.fontFeatureSettings + '-' + this.lineHeight + '-' + this.letterSpacing;
- }
- /**
- * @internal
- */
- getMassagedFontFamily(fallbackFontFamily) {
- const fontFamily = BareFontInfo._wrapInQuotes(this.fontFamily);
- if (fallbackFontFamily && this.fontFamily !== fallbackFontFamily) {
- return `${fontFamily}, ${fallbackFontFamily}`;
- }
- return fontFamily;
- }
- static _wrapInQuotes(fontFamily) {
- if (/[,"']/.test(fontFamily)) {
- // Looks like the font family might be already escaped
- return fontFamily;
- }
- if (/[+ ]/.test(fontFamily)) {
- // Wrap a font family using + or <space> with quotes
- return `"${fontFamily}"`;
- }
- return fontFamily;
- }
- }
- // change this whenever `FontInfo` members are changed
- export const SERIALIZED_FONT_INFO_VERSION = 1;
- export class FontInfo extends BareFontInfo {
- /**
- * @internal
- */
- constructor(opts, isTrusted) {
- super(opts);
- this._editorStylingBrand = undefined;
- this.version = SERIALIZED_FONT_INFO_VERSION;
- this.isTrusted = isTrusted;
- this.isMonospace = opts.isMonospace;
- this.typicalHalfwidthCharacterWidth = opts.typicalHalfwidthCharacterWidth;
- this.typicalFullwidthCharacterWidth = opts.typicalFullwidthCharacterWidth;
- this.canUseHalfwidthRightwardsArrow = opts.canUseHalfwidthRightwardsArrow;
- this.spaceWidth = opts.spaceWidth;
- this.middotWidth = opts.middotWidth;
- this.wsmiddotWidth = opts.wsmiddotWidth;
- this.maxDigitWidth = opts.maxDigitWidth;
- }
- /**
- * @internal
- */
- equals(other) {
- return (this.fontFamily === other.fontFamily
- && this.fontWeight === other.fontWeight
- && this.fontSize === other.fontSize
- && this.fontFeatureSettings === other.fontFeatureSettings
- && this.lineHeight === other.lineHeight
- && this.letterSpacing === other.letterSpacing
- && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth
- && this.typicalFullwidthCharacterWidth === other.typicalFullwidthCharacterWidth
- && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow
- && this.spaceWidth === other.spaceWidth
- && this.middotWidth === other.middotWidth
- && this.wsmiddotWidth === other.wsmiddotWidth
- && this.maxDigitWidth === other.maxDigitWidth);
- }
- }
|