Skip to content

Commit 2f35e8d

Browse files
committed
Set up for font-weight support on GPU renderer
Part of #237584
1 parent 27a8bad commit 2f35e8d

File tree

5 files changed

+74
-43
lines changed

5 files changed

+74
-43
lines changed

src/vs/base/common/color.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -535,17 +535,17 @@ export class Color {
535535
return this._toString;
536536
}
537537

538-
private _toNumber24Bit?: number;
539-
toNumber24Bit(): number {
540-
if (!this._toNumber24Bit) {
541-
this._toNumber24Bit = (
538+
private _toNumber32Bit?: number;
539+
toNumber32Bit(): number {
540+
if (!this._toNumber32Bit) {
541+
this._toNumber32Bit = (
542542
this.rgba.r /* */ << 24 |
543543
this.rgba.g /* */ << 16 |
544544
this.rgba.b /* */ << 8 |
545545
this.rgba.a * 0xFF << 0
546546
) >>> 0;
547547
}
548-
return this._toNumber24Bit;
548+
return this._toNumber32Bit;
549549
}
550550

551551
static getLighterColor(of: Color, relative: Color, factor?: number): Color {

src/vs/base/test/common/color.test.ts

+30-30
Original file line numberDiff line numberDiff line change
@@ -118,40 +118,40 @@ suite('Color', () => {
118118
});
119119
});
120120

121-
suite('toNumber24Bit', () => {
121+
suite('toNumber32Bit', () => {
122122
test('alpha channel', () => {
123-
assert.deepStrictEqual(Color.fromHex('#00000000').toNumber24Bit(), 0x00000000);
124-
assert.deepStrictEqual(Color.fromHex('#00000080').toNumber24Bit(), 0x00000080);
125-
assert.deepStrictEqual(Color.fromHex('#000000FF').toNumber24Bit(), 0x000000FF);
123+
assert.deepStrictEqual(Color.fromHex('#00000000').toNumber32Bit(), 0x00000000);
124+
assert.deepStrictEqual(Color.fromHex('#00000080').toNumber32Bit(), 0x00000080);
125+
assert.deepStrictEqual(Color.fromHex('#000000FF').toNumber32Bit(), 0x000000FF);
126126
});
127127

128128
test('opaque', () => {
129-
assert.deepStrictEqual(Color.fromHex('#000000').toNumber24Bit(), 0x000000FF);
130-
assert.deepStrictEqual(Color.fromHex('#FFFFFF').toNumber24Bit(), 0xFFFFFFFF);
131-
assert.deepStrictEqual(Color.fromHex('#FF0000').toNumber24Bit(), 0xFF0000FF);
132-
assert.deepStrictEqual(Color.fromHex('#00FF00').toNumber24Bit(), 0x00FF00FF);
133-
assert.deepStrictEqual(Color.fromHex('#0000FF').toNumber24Bit(), 0x0000FFFF);
134-
assert.deepStrictEqual(Color.fromHex('#FFFF00').toNumber24Bit(), 0xFFFF00FF);
135-
assert.deepStrictEqual(Color.fromHex('#00FFFF').toNumber24Bit(), 0x00FFFFFF);
136-
assert.deepStrictEqual(Color.fromHex('#FF00FF').toNumber24Bit(), 0xFF00FFFF);
137-
assert.deepStrictEqual(Color.fromHex('#C0C0C0').toNumber24Bit(), 0xC0C0C0FF);
138-
assert.deepStrictEqual(Color.fromHex('#808080').toNumber24Bit(), 0x808080FF);
139-
assert.deepStrictEqual(Color.fromHex('#800000').toNumber24Bit(), 0x800000FF);
140-
assert.deepStrictEqual(Color.fromHex('#808000').toNumber24Bit(), 0x808000FF);
141-
assert.deepStrictEqual(Color.fromHex('#008000').toNumber24Bit(), 0x008000FF);
142-
assert.deepStrictEqual(Color.fromHex('#800080').toNumber24Bit(), 0x800080FF);
143-
assert.deepStrictEqual(Color.fromHex('#008080').toNumber24Bit(), 0x008080FF);
144-
assert.deepStrictEqual(Color.fromHex('#000080').toNumber24Bit(), 0x000080FF);
145-
assert.deepStrictEqual(Color.fromHex('#010203').toNumber24Bit(), 0x010203FF);
146-
assert.deepStrictEqual(Color.fromHex('#040506').toNumber24Bit(), 0x040506FF);
147-
assert.deepStrictEqual(Color.fromHex('#070809').toNumber24Bit(), 0x070809FF);
148-
assert.deepStrictEqual(Color.fromHex('#0a0A0a').toNumber24Bit(), 0x0a0A0aFF);
149-
assert.deepStrictEqual(Color.fromHex('#0b0B0b').toNumber24Bit(), 0x0b0B0bFF);
150-
assert.deepStrictEqual(Color.fromHex('#0c0C0c').toNumber24Bit(), 0x0c0C0cFF);
151-
assert.deepStrictEqual(Color.fromHex('#0d0D0d').toNumber24Bit(), 0x0d0D0dFF);
152-
assert.deepStrictEqual(Color.fromHex('#0e0E0e').toNumber24Bit(), 0x0e0E0eFF);
153-
assert.deepStrictEqual(Color.fromHex('#0f0F0f').toNumber24Bit(), 0x0f0F0fFF);
154-
assert.deepStrictEqual(Color.fromHex('#a0A0a0').toNumber24Bit(), 0xa0A0a0FF);
129+
assert.deepStrictEqual(Color.fromHex('#000000').toNumber32Bit(), 0x000000FF);
130+
assert.deepStrictEqual(Color.fromHex('#FFFFFF').toNumber32Bit(), 0xFFFFFFFF);
131+
assert.deepStrictEqual(Color.fromHex('#FF0000').toNumber32Bit(), 0xFF0000FF);
132+
assert.deepStrictEqual(Color.fromHex('#00FF00').toNumber32Bit(), 0x00FF00FF);
133+
assert.deepStrictEqual(Color.fromHex('#0000FF').toNumber32Bit(), 0x0000FFFF);
134+
assert.deepStrictEqual(Color.fromHex('#FFFF00').toNumber32Bit(), 0xFFFF00FF);
135+
assert.deepStrictEqual(Color.fromHex('#00FFFF').toNumber32Bit(), 0x00FFFFFF);
136+
assert.deepStrictEqual(Color.fromHex('#FF00FF').toNumber32Bit(), 0xFF00FFFF);
137+
assert.deepStrictEqual(Color.fromHex('#C0C0C0').toNumber32Bit(), 0xC0C0C0FF);
138+
assert.deepStrictEqual(Color.fromHex('#808080').toNumber32Bit(), 0x808080FF);
139+
assert.deepStrictEqual(Color.fromHex('#800000').toNumber32Bit(), 0x800000FF);
140+
assert.deepStrictEqual(Color.fromHex('#808000').toNumber32Bit(), 0x808000FF);
141+
assert.deepStrictEqual(Color.fromHex('#008000').toNumber32Bit(), 0x008000FF);
142+
assert.deepStrictEqual(Color.fromHex('#800080').toNumber32Bit(), 0x800080FF);
143+
assert.deepStrictEqual(Color.fromHex('#008080').toNumber32Bit(), 0x008080FF);
144+
assert.deepStrictEqual(Color.fromHex('#000080').toNumber32Bit(), 0x000080FF);
145+
assert.deepStrictEqual(Color.fromHex('#010203').toNumber32Bit(), 0x010203FF);
146+
assert.deepStrictEqual(Color.fromHex('#040506').toNumber32Bit(), 0x040506FF);
147+
assert.deepStrictEqual(Color.fromHex('#070809').toNumber32Bit(), 0x070809FF);
148+
assert.deepStrictEqual(Color.fromHex('#0a0A0a').toNumber32Bit(), 0x0a0A0aFF);
149+
assert.deepStrictEqual(Color.fromHex('#0b0B0b').toNumber32Bit(), 0x0b0B0bFF);
150+
assert.deepStrictEqual(Color.fromHex('#0c0C0c').toNumber32Bit(), 0x0c0C0cFF);
151+
assert.deepStrictEqual(Color.fromHex('#0d0D0d').toNumber32Bit(), 0x0d0D0dFF);
152+
assert.deepStrictEqual(Color.fromHex('#0e0E0e').toNumber32Bit(), 0x0e0E0eFF);
153+
assert.deepStrictEqual(Color.fromHex('#0f0F0f').toNumber32Bit(), 0x0f0F0fFF);
154+
assert.deepStrictEqual(Color.fromHex('#a0A0a0').toNumber32Bit(), 0xa0A0a0FF);
155155
});
156156
});
157157

src/vs/editor/browser/gpu/fullFileRenderStrategy.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,16 @@ export class FullFileRenderStrategy extends ViewEventHandler implements IGpuRend
386386
if (!parsedColor) {
387387
throw new BugIndicatingError('Invalid color format ' + value);
388388
}
389-
charMetadata = parsedColor.toNumber24Bit();
389+
charMetadata = parsedColor.toNumber32Bit();
390+
break;
391+
}
392+
case 'font-weight': {
393+
const parsedValue = parseCssFontWeight(value);
394+
if (parsedValue >= 400) {
395+
// TODO: Set bold (https://github.com/microsoft/vscode/issues/237584)
396+
} else {
397+
// TODO: Set normal (https://github.com/microsoft/vscode/issues/237584)
398+
}
390399
break;
391400
}
392401
default: throw new BugIndicatingError('Unexpected inline decoration style');
@@ -485,3 +494,13 @@ export class FullFileRenderStrategy extends ViewEventHandler implements IGpuRend
485494
this._queuedBufferUpdates[1].push(e);
486495
}
487496
}
497+
498+
function parseCssFontWeight(value: string) {
499+
switch (value) {
500+
case 'lighter':
501+
case 'normal': return 400;
502+
case 'bolder':
503+
case 'bold': return 700;
504+
}
505+
return parseInt(value);
506+
}

src/vs/editor/browser/gpu/raster/glyphRasterizer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export class GlyphRasterizer extends Disposable implements IGlyphRasterizer {
9494

9595
public _rasterizeGlyph(
9696
chars: string,
97-
metadata: number,
97+
tokenMetadata: number,
9898
charMetadata: number,
9999
colorMap: string[],
100100
): Readonly<IRasterizedGlyph> {
@@ -109,7 +109,7 @@ export class GlyphRasterizer extends Disposable implements IGlyphRasterizer {
109109
this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);
110110

111111
const fontSb = new StringBuilder(200);
112-
const fontStyle = TokenMetadata.getFontStyle(metadata);
112+
const fontStyle = TokenMetadata.getFontStyle(tokenMetadata);
113113
if (fontStyle & FontStyle.Italic) {
114114
fontSb.appendString('italic ');
115115
}
@@ -128,7 +128,7 @@ export class GlyphRasterizer extends Disposable implements IGlyphRasterizer {
128128
if (charMetadata) {
129129
this._ctx.fillStyle = `#${charMetadata.toString(16).padStart(8, '0')}`;
130130
} else {
131-
this._ctx.fillStyle = colorMap[TokenMetadata.getForeground(metadata)];
131+
this._ctx.fillStyle = colorMap[TokenMetadata.getForeground(tokenMetadata)];
132132
}
133133
this._ctx.textBaseline = 'top';
134134

src/vs/editor/browser/gpu/viewGpuContext.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ export class ViewGpuContext extends Disposable {
170170
return false;
171171
}
172172
for (const r of rule.style) {
173-
if (!gpuSupportedDecorationCssRules.includes(r)) {
173+
if (!supportsCssRule(r, rule.style)) {
174174
return false;
175175
}
176176
}
@@ -220,8 +220,8 @@ export class ViewGpuContext extends Disposable {
220220
return false;
221221
}
222222
for (const r of rule.style) {
223-
if (!gpuSupportedDecorationCssRules.includes(r)) {
224-
problemRules.push(r);
223+
if (!supportsCssRule(r, rule.style)) {
224+
problemRules.push(`${r}: ${rule.style[r as any]}`);
225225
return false;
226226
}
227227
}
@@ -249,8 +249,20 @@ export class ViewGpuContext extends Disposable {
249249
}
250250

251251
/**
252-
* A list of fully supported decoration CSS rules that can be used in the GPU renderer.
252+
* A list of supported decoration CSS rules that can be used in the GPU renderer.
253253
*/
254254
const gpuSupportedDecorationCssRules = [
255255
'color',
256+
// TODO: https://github.com/microsoft/vscode/issues/237584
257+
// 'font-weight',
256258
];
259+
260+
function supportsCssRule(rule: string, style: CSSStyleDeclaration) {
261+
if (!gpuSupportedDecorationCssRules.includes(rule)) {
262+
return false;
263+
}
264+
// Check for values that aren't supported
265+
switch (rule) {
266+
default: return true;
267+
}
268+
}

0 commit comments

Comments
 (0)