diff --git a/engine/src/flutter/lib/web_ui/dev/common.dart b/engine/src/flutter/lib/web_ui/dev/common.dart index 28fdba9b581..0c9c0942226 100644 --- a/engine/src/flutter/lib/web_ui/dev/common.dart +++ b/engine/src/flutter/lib/web_ui/dev/common.dart @@ -269,14 +269,10 @@ const List kAllBrowserNames = [kChrome, kEdge, kFirefox, kSafari /// /// The [browserName] matches the browser name passed as the `--browser` option. BrowserEnvironment getBrowserEnvironment(BrowserName browserName, {required bool useDwarf}) { - switch (browserName) { - case BrowserName.chrome: - return ChromeEnvironment(useDwarf: useDwarf); - case BrowserName.edge: - return EdgeEnvironment(); - case BrowserName.firefox: - return FirefoxEnvironment(); - case BrowserName.safari: - return SafariMacOsEnvironment(); - } + return switch (browserName) { + BrowserName.chrome => ChromeEnvironment(useDwarf: useDwarf), + BrowserName.edge => EdgeEnvironment(), + BrowserName.firefox => FirefoxEnvironment(), + BrowserName.safari => SafariMacOsEnvironment(), + }; } diff --git a/engine/src/flutter/lib/web_ui/dev/steps/compile_bundle_step.dart b/engine/src/flutter/lib/web_ui/dev/steps/compile_bundle_step.dart index d137beb3c33..6d8c0a1a352 100644 --- a/engine/src/flutter/lib/web_ui/dev/steps/compile_bundle_step.dart +++ b/engine/src/flutter/lib/web_ui/dev/steps/compile_bundle_step.dart @@ -64,22 +64,20 @@ class CompileBundleStep implements PipelineStep { } TestCompiler _createCompiler(CompileConfiguration config) { - switch (config.compiler) { - case Compiler.dart2js: - return Dart2JSCompiler( - testSetDirectory, - outputBundleDirectory, - renderer: config.renderer, - isVerbose: isVerbose, - ); - case Compiler.dart2wasm: - return Dart2WasmCompiler( - testSetDirectory, - outputBundleDirectory, - renderer: config.renderer, - isVerbose: isVerbose, - ); - } + return switch (config.compiler) { + Compiler.dart2js => Dart2JSCompiler( + testSetDirectory, + outputBundleDirectory, + renderer: config.renderer, + isVerbose: isVerbose, + ), + Compiler.dart2wasm => Dart2WasmCompiler( + testSetDirectory, + outputBundleDirectory, + renderer: config.renderer, + isVerbose: isVerbose, + ), + }; } @override diff --git a/engine/src/flutter/lib/web_ui/dev/test_platform.dart b/engine/src/flutter/lib/web_ui/dev/test_platform.dart index 986c7f42d55..d5f0635e085 100644 --- a/engine/src/flutter/lib/web_ui/dev/test_platform.dart +++ b/engine/src/flutter/lib/web_ui/dev/test_platform.dart @@ -477,14 +477,11 @@ class BrowserPlatform extends PlatformPlugin { } String getCanvasKitVariant() { - switch (suite.runConfig.variant) { - case CanvasKitVariant.full: - return 'full'; - case CanvasKitVariant.chromium: - return 'chromium'; - case null: - return 'auto'; - } + return switch (suite.runConfig.variant) { + CanvasKitVariant.full => 'full', + CanvasKitVariant.chromium => 'chromium', + null => 'auto', + }; } String _makeBuildConfigString(String scriptBase, CompileConfiguration config) { diff --git a/engine/src/flutter/lib/web_ui/lib/key.dart b/engine/src/flutter/lib/web_ui/lib/key.dart index 9af819928b8..31809610749 100644 --- a/engine/src/flutter/lib/web_ui/lib/key.dart +++ b/engine/src/flutter/lib/web_ui/lib/key.dart @@ -133,55 +133,33 @@ class KeyData { // JavaScript only support 32-bit bitwise operations and needs to use // division instead. final int planeNum = (logical / 0x100000000).floor(); - final String planeDescription = - (() { - switch (planeNum) { - case 0x000: - return ' (Unicode)'; - case 0x001: - return ' (Unprintable)'; - case 0x002: - return ' (Flutter)'; - case 0x011: - return ' (Android)'; - case 0x012: - return ' (Fuchsia)'; - case 0x013: - return ' (iOS)'; - case 0x014: - return ' (macOS)'; - case 0x015: - return ' (GTK)'; - case 0x016: - return ' (Windows)'; - case 0x017: - return ' (Web)'; - case 0x018: - return ' (GLFW)'; - } - return ''; - })(); + final String planeDescription = switch (planeNum) { + 0x000 => ' (Unicode)', + 0x001 => ' (Unprintable)', + 0x002 => ' (Flutter)', + 0x011 => ' (Android)', + 0x012 => ' (Fuchsia)', + 0x013 => ' (iOS)', + 0x014 => ' (macOS)', + 0x015 => ' (GTK)', + 0x016 => ' (Windows)', + 0x017 => ' (Web)', + 0x018 => ' (GLFW)', + _ => '', + }; return '$result$planeDescription'; } String? _escapeCharacter() { - if (character == null) { - return ''; - } - switch (character!) { - case '\n': - return r'"\n"'; - case '\t': - return r'"\t"'; - case '\r': - return r'"\r"'; - case '\b': - return r'"\b"'; - case '\f': - return r'"\f"'; - default: - return '"$character"'; - } + return switch (character) { + null => '', + '\n' => r'"\n"', + '\t' => r'"\t"', + '\r' => r'"\r"', + '\b' => r'"\b"', + '\f' => r'"\f"', + _ => '"$character"', + }; } String? _quotedCharCode() { diff --git a/engine/src/flutter/lib/web_ui/lib/painting.dart b/engine/src/flutter/lib/web_ui/lib/painting.dart index 32d7623aced..4c14c5b5705 100644 --- a/engine/src/flutter/lib/web_ui/lib/painting.dart +++ b/engine/src/flutter/lib/web_ui/lib/painting.dart @@ -705,15 +705,12 @@ Future _decodeImageFromListAsync(Uint8List list, ImageDecoderCallback call // to right, then from top to down. The order of the 4 bytes of pixels is // decided by `format`. Future createBmp(Uint8List pixels, int width, int height, int rowBytes, PixelFormat format) { - late bool swapRedBlue; - switch (format) { - case PixelFormat.bgra8888: - swapRedBlue = true; - case PixelFormat.rgba8888: - swapRedBlue = false; - case PixelFormat.rgbaFloat32: - throw UnimplementedError('RGB conversion from rgbaFloat32 data is not implemented'); - } + final bool swapRedBlue = switch (format) { + PixelFormat.bgra8888 => true, + PixelFormat.rgba8888 => false, + PixelFormat.rgbaFloat32 => + throw UnimplementedError('RGB conversion from rgbaFloat32 data is not implemented'), + }; // See https://en.wikipedia.org/wiki/BMP_file_format for format examples. // The header is in the 108-byte BITMAPV4HEADER format, or as called by diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvas_pool.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvas_pool.dart index f6496f44e18..1c25e7f5cac 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvas_pool.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvas_pool.dart @@ -911,7 +911,7 @@ class ContextStateHandle { strokeCap ??= ui.StrokeCap.butt; if (strokeCap != _currentStrokeCap) { _currentStrokeCap = strokeCap; - context.lineCap = stringForStrokeCap(strokeCap)!; + context.lineCap = strokeCap.name; } } @@ -928,7 +928,7 @@ class ContextStateHandle { strokeJoin ??= ui.StrokeJoin.miter; if (strokeJoin != _currentStrokeJoin) { _currentStrokeJoin = strokeJoin; - context.lineJoin = stringForStrokeJoin(strokeJoin); + context.lineJoin = strokeJoin.name; } } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart index 1e69dcef72e..aea839b71b2 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart @@ -3431,17 +3431,14 @@ String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl; @visibleForTesting List getCanvasKitJsFileNames(CanvasKitVariant variant) { - switch (variant) { - case CanvasKitVariant.auto: - return [ - if (_enableCanvasKitChromiumInAutoMode) _kChromiumCanvasKitJsFileName, - _kFullCanvasKitJsFileName, - ]; - case CanvasKitVariant.full: - return [_kFullCanvasKitJsFileName]; - case CanvasKitVariant.chromium: - return [_kChromiumCanvasKitJsFileName]; - } + return switch (variant) { + CanvasKitVariant.auto => [ + if (_enableCanvasKitChromiumInAutoMode) _kChromiumCanvasKitJsFileName, + _kFullCanvasKitJsFileName, + ], + CanvasKitVariant.full => [_kFullCanvasKitJsFileName], + CanvasKitVariant.chromium => [_kChromiumCanvasKitJsFileName], + }; } Iterable get _canvasKitJsUrls { diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index 6aa70fb9d36..42dec4fa138 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -614,12 +614,10 @@ class HtmlViewEmbedder { } DomElement _getElement(RenderingEntity entity) { - switch (entity) { - case RenderingRenderCanvas(): - return entity.displayCanvas!.hostElement; - case RenderingPlatformView(): - return _viewClipChains[entity.viewId]!.root; - } + return switch (entity) { + RenderingRenderCanvas() => entity.displayCanvas!.hostElement, + RenderingPlatformView() => _viewClipChains[entity.viewId]!.root, + }; } /// Returns a [List] of ints mapping elements from the [next] rendering to @@ -796,18 +794,13 @@ class Mutator { return false; } - switch (type) { - case MutatorType.clipRect: - return rect == typedOther.rect; - case MutatorType.clipRRect: - return rrect == typedOther.rrect; - case MutatorType.clipPath: - return path == typedOther.path; - case MutatorType.transform: - return matrix == typedOther.matrix; - case MutatorType.opacity: - return alpha == typedOther.alpha; - } + return switch (type) { + MutatorType.clipRect => rect == typedOther.rect, + MutatorType.clipRRect => rrect == typedOther.rrect, + MutatorType.clipPath => path == typedOther.path, + MutatorType.transform => matrix == typedOther.matrix, + MutatorType.opacity => alpha == typedOther.alpha, + }; } @override diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart index 3514ec01a5a..1f0d9adf0b3 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart @@ -899,13 +899,10 @@ class CkParagraph implements ui.Paragraph { @override ui.TextRange getWordBoundary(ui.TextPosition position) { assert(!_disposed, 'Paragraph has been disposed.'); - final int characterPosition; - switch (position.affinity) { - case ui.TextAffinity.upstream: - characterPosition = position.offset - 1; - case ui.TextAffinity.downstream: - characterPosition = position.offset; - } + final int characterPosition = switch (position.affinity) { + ui.TextAffinity.upstream => position.offset - 1, + ui.TextAffinity.downstream => position.offset, + }; final SkTextRange skRange = skiaObject.getWordBoundary(characterPosition.toDouble()); return ui.TextRange(start: skRange.start.toInt(), end: skRange.end.toInt()); } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart index edbf7a5105d..df9924d6ccb 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart @@ -1323,31 +1323,6 @@ SvgBlendMode? blendModeToSvgEnum(ui.BlendMode? blendMode) { } } -String? stringForStrokeCap(ui.StrokeCap? strokeCap) { - if (strokeCap == null) { - return null; - } - switch (strokeCap) { - case ui.StrokeCap.butt: - return 'butt'; - case ui.StrokeCap.round: - return 'round'; - case ui.StrokeCap.square: - return 'square'; - } -} - -String stringForStrokeJoin(ui.StrokeJoin strokeJoin) { - switch (strokeJoin) { - case ui.StrokeJoin.round: - return 'round'; - case ui.StrokeJoin.bevel: - return 'bevel'; - case ui.StrokeJoin.miter: - return 'miter'; - } -} - /// Clips the content element against a stack of clip operations and returns /// root of a tree that contains content node. /// diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/html/dom_canvas.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/html/dom_canvas.dart index b0383065249..5cd6d5d63ed 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/html/dom_canvas.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/html/dom_canvas.dart @@ -14,7 +14,6 @@ import '../svg.dart'; import '../text/canvas_paragraph.dart'; import '../util.dart'; import '../vector_math.dart'; -import 'bitmap_canvas.dart'; import 'painting.dart'; import 'path/path.dart'; import 'path/path_to_svg.dart'; @@ -351,8 +350,8 @@ SVGSVGElement pathToSvgElement(SurfacePath path, SurfacePaintData paint) { paint.strokeWidth != null)) { svgPath.setAttribute('stroke', colorValueToCssString(paint.color)); svgPath.setAttribute('stroke-width', '${paint.strokeWidth ?? 1.0}'); - if (paint.strokeCap != null) { - svgPath.setAttribute('stroke-linecap', '${stringForStrokeCap(paint.strokeCap)}'); + if (paint.strokeCap case final value?) { + svgPath.setAttribute('stroke-linecap', value.name); } svgPath.setAttribute('fill', 'none'); } else { diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart index 2dbe201be8f..3567de60d04 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart @@ -453,14 +453,11 @@ class StandardMessageCodec implements MessageCodec { /// [readValueOfType]. int readSize(ReadBuffer buffer) { final int value = buffer.getUint8(); - switch (value) { - case 254: - return buffer.getUint16(); - case 255: - return buffer.getUint32(); - default: - return value; - } + return switch (value) { + 254 => buffer.getUint16(), + 255 => buffer.getUint32(), + _ => value, + }; } } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/shader_data.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/shader_data.dart index afd2f20658d..083714f4d12 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/shader_data.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/shader_data.dart @@ -118,33 +118,20 @@ enum UniformType { } UniformType? uniformTypeFromJson(int value) { - switch (value) { - case 0: - return UniformType.Boolean; - case 1: - return UniformType.SByte; - case 2: - return UniformType.UByte; - case 3: - return UniformType.Short; - case 4: - return UniformType.UShort; - case 5: - return UniformType.Int; - case 6: - return UniformType.Uint; - case 7: - return UniformType.Int64; - case 8: - return UniformType.Uint64; - case 9: - return UniformType.Half; - case 10: - return UniformType.Float; - case 11: - return UniformType.Double; - case 12: - return UniformType.SampledImage; - } - return null; + return switch (value) { + 0 => UniformType.Boolean, + 1 => UniformType.SByte, + 2 => UniformType.UByte, + 3 => UniformType.Short, + 4 => UniformType.UShort, + 5 => UniformType.Int, + 6 => UniformType.Uint, + 7 => UniformType.Int64, + 8 => UniformType.Uint64, + 9 => UniformType.Half, + 10 => UniformType.Float, + 11 => UniformType.Double, + 12 => UniformType.SampledImage, + _ => null, + }; } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart index 04aa59b2040..8c0bde84845 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart @@ -225,13 +225,10 @@ class CanvasParagraph implements ui.Paragraph { @override ui.TextRange getWordBoundary(ui.TextPosition position) { - final int characterPosition; - switch (position.affinity) { - case ui.TextAffinity.upstream: - characterPosition = position.offset - 1; - case ui.TextAffinity.downstream: - characterPosition = position.offset; - } + final int characterPosition = switch (position.affinity) { + ui.TextAffinity.upstream => position.offset - 1, + ui.TextAffinity.downstream => position.offset, + }; final int start = WordBreaker.prevBreakIndex(plainText, characterPosition + 1); final int end = WordBreaker.nextBreakIndex(plainText, characterPosition); return ui.TextRange(start: start, end: end); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/layout_service.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/layout_service.dart index 539cf6cacca..491a4b86ba1 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/layout_service.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/layout_service.dart @@ -587,18 +587,13 @@ class LineBuilder { final double emptySpace = maxWidth - width; final ui.TextAlign textAlign = paragraph.paragraphStyle.effectiveTextAlign; - switch (textAlign) { - case ui.TextAlign.center: - return emptySpace / 2.0; - case ui.TextAlign.right: - return emptySpace; - case ui.TextAlign.start: - return _paragraphDirection == ui.TextDirection.rtl ? emptySpace : 0.0; - case ui.TextAlign.end: - return _paragraphDirection == ui.TextDirection.rtl ? 0.0 : emptySpace; - default: - return 0.0; - } + return switch (textAlign) { + ui.TextAlign.center => emptySpace / 2.0, + ui.TextAlign.right => emptySpace, + ui.TextAlign.start => _paragraphDirection == ui.TextDirection.rtl ? emptySpace : 0.0, + ui.TextAlign.end => _paragraphDirection == ui.TextDirection.rtl ? 0.0 : emptySpace, + _ => 0.0, + }; } bool get isOverflowing => width > maxWidth; diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/paragraph.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/paragraph.dart index fb266863dbd..324ea77bb3a 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/paragraph.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/paragraph.dart @@ -1108,26 +1108,11 @@ String? _textDecorationToCssString( } } if (decorationStyle != null) { - decorations.write(_decorationStyleToCssString(decorationStyle)); + decorations.write(decorationStyle.name); } return decorations.isEmpty ? null : decorations.toString(); } -String? _decorationStyleToCssString(ui.TextDecorationStyle decorationStyle) { - switch (decorationStyle) { - case ui.TextDecorationStyle.dashed: - return 'dashed'; - case ui.TextDecorationStyle.dotted: - return 'dotted'; - case ui.TextDecorationStyle.double: - return 'double'; - case ui.TextDecorationStyle.solid: - return 'solid'; - case ui.TextDecorationStyle.wavy: - return 'wavy'; - } -} - /// Converts [align] to its corresponding CSS value. /// /// This value is used as the "text-align" CSS property, e.g.: diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/text_direction.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/text_direction.dart index dcfeea3c026..e676c410840 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/text_direction.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/text_direction.dart @@ -166,16 +166,11 @@ FragmentFlow _getFragmentFlow(String text, int i) { } final ui.TextDirection? textDirection = _textDirectionLookup.findForChar(codePoint); - switch (textDirection) { - case ui.TextDirection.ltr: - return FragmentFlow.ltr; - - case ui.TextDirection.rtl: - return FragmentFlow.rtl; - - case null: - return FragmentFlow.sandwich; - } + return switch (textDirection) { + ui.TextDirection.ltr => FragmentFlow.ltr, + ui.TextDirection.rtl => FragmentFlow.rtl, + null => FragmentFlow.sandwich, + }; } bool _isDigit(int codePoint) { diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/util.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/util.dart index d711ee1d6e4..f8e0a17e839 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/util.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/util.dart @@ -345,20 +345,14 @@ String colorValueToCssString(int value) { if ((0xff000000 & value) == 0xff000000) { final String hexValue = (value & 0xFFFFFF).toRadixString(16); final int hexValueLength = hexValue.length; - switch (hexValueLength) { - case 1: - return '#00000$hexValue'; - case 2: - return '#0000$hexValue'; - case 3: - return '#000$hexValue'; - case 4: - return '#00$hexValue'; - case 5: - return '#0$hexValue'; - default: - return '#$hexValue'; - } + return switch (hexValueLength) { + 1 => '#00000$hexValue', + 2 => '#0000$hexValue', + 3 => '#000$hexValue', + 4 => '#00$hexValue', + 5 => '#0$hexValue', + _ => '#$hexValue', + }; } else { final double alpha = ((value >> 24) & 0xFF) / 255.0; final StringBuffer sb = StringBuffer(); @@ -889,20 +883,7 @@ class LruCache { } /// Returns the VM-compatible string for the tile mode. -String tileModeString(ui.TileMode? tileMode) { - switch (tileMode) { - case ui.TileMode.clamp: - return 'clamp'; - case ui.TileMode.mirror: - return 'mirror'; - case ui.TileMode.repeated: - return 'repeated'; - case ui.TileMode.decal: - return 'decal'; - case null: - return 'unspecified'; - } -} +String tileModeString(ui.TileMode? tileMode) => tileMode?.name ?? 'unspecified'; /// A size where both the width and height are integers. class BitmapSize {