Last active
July 16, 2023 19:21
-
-
Save evoL/00398769300a9e28c231ba37615828af to your computer and use it in GitHub Desktop.
Flutter's GIF renderer is too compatible with the GIF89a spec unlike the rest of the world
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'dart:typed_data'; | |
void main() { | |
runApp(const MyApp()); | |
} | |
class MyApp extends StatefulWidget { | |
const MyApp({super.key}); | |
@override | |
State<MyApp> createState() => _MyAppState(); | |
} | |
class _MyAppState extends State<MyApp> { | |
// Delay in milliseconds. Valid range is 0-655350. | |
int blackDelayMs = 500; | |
int redDelayMs = 0; | |
@override | |
Widget build(BuildContext context) { | |
return MaterialApp( | |
debugShowCheckedModeBanner: false, | |
home: Scaffold( | |
body: Center( | |
child: Column( | |
children: [ | |
Slider( | |
min: 0, | |
max: 1000, | |
divisions: 100, | |
activeColor: Colors.black, | |
value: blackDelayMs.toDouble(), | |
label: "${blackDelayMs.round()} ms", | |
onChanged: (double value) { | |
setState(() { | |
blackDelayMs = value.round().toInt(); | |
}); | |
}, | |
), | |
Slider( | |
min: 0, | |
max: 1000, | |
divisions: 100, | |
activeColor: Colors.red, | |
value: redDelayMs.toDouble(), | |
label: "${redDelayMs.round()} ms", | |
onChanged: (double value) { | |
setState(() { | |
redDelayMs = value.round().toInt(); | |
}); | |
}, | |
), | |
SizedBox( | |
width: 200, | |
height: 200, | |
child: FittedBox( | |
fit: BoxFit.contain, | |
child: Image.memory(generateGif( | |
blackDelayMs: blackDelayMs, | |
redDelayMs: redDelayMs, | |
)), | |
), | |
), | |
], | |
), | |
), | |
), | |
); | |
} | |
} | |
// GIF data follows. | |
List<int> toBytes(int millis) { | |
final hundreds = millis ~/ 10; | |
return [hundreds & 0xff, (hundreds & 0xffff) >>> 8]; | |
} | |
Uint8List generateGif({required int blackDelayMs, required int redDelayMs}) { | |
return Uint8List.fromList([ | |
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x50, 0x00, | |
0x50, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, | |
0x00, 0x21, 0xff, 0x0b, 0x4e, 0x45, 0x54, 0x53, | |
0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, | |
0x01, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x04, | |
...toBytes(blackDelayMs), 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, | |
0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x02, 0xb6, | |
0x8c, 0x8f, 0xa9, 0xcb, 0x08, 0x0f, 0xa3, 0x9c, | |
0xb4, 0xc6, 0x86, 0x33, 0xb6, 0xbc, 0x73, 0x0d, | |
0x86, 0x81, 0x47, 0x96, 0x80, 0x88, 0x36, 0xe6, | |
0x6a, 0xa5, 0x6e, 0xc2, 0xc6, 0xd2, 0x4b, 0x8f, | |
0xf2, 0x5d, 0xbf, 0x37, 0x9e, 0xa7, 0xbb, 0xdc, | |
0xf3, 0xfd, 0x58, 0x41, 0xd4, 0x90, 0x58, 0x0c, | |
0x1d, 0x57, 0x49, 0xe5, 0xb2, 0xd4, 0x04, 0x3d, | |
0xa1, 0xd1, 0xcc, 0x94, 0x54, 0xb5, 0x5e, 0x3b, | |
0xd9, 0xcd, 0xf6, 0xd3, 0x65, 0x7c, 0xc1, 0x61, | |
0xc5, 0xb8, 0x55, 0x36, 0x9f, 0x29, 0x69, 0xf5, | |
0x7a, 0xd6, 0x76, 0xbc, 0xe1, 0x71, 0xc3, 0x9c, | |
0x5e, 0xbf, 0x5f, 0xea, 0x76, 0xfd, 0x83, 0xdf, | |
0xe7, 0x07, 0x68, 0x23, 0x08, 0xe8, 0xf7, 0x67, | |
0x78, 0x38, 0x78, 0x78, 0x92, 0x58, 0xc8, 0xc7, | |
0xb8, 0xa8, 0xe8, 0xa8, 0x27, 0xf9, 0x98, 0x37, | |
0x09, 0x99, 0x89, 0x79, 0x19, 0x17, 0x49, 0x79, | |
0x67, 0xc9, 0x38, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, | |
0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0x0a, | |
0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b, 0x8b, | |
0x9b, 0xab, 0xbb, 0xcb, 0xdb, 0xeb, 0xfb, 0x0b, | |
0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c, 0x8c, | |
0x9c, 0xac, 0xbc, 0xcc, 0xdc, 0xec, 0xfc, 0x0c, | |
0x1d, 0x2d, 0x3d, 0xed, 0x51, 0x00, 0x00, 0x21, | |
0xf9, 0x04, 0x04, ...toBytes(redDelayMs), 0x00, 0x00, 0x2c, | |
0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, | |
0x00, 0x02, 0x27, 0x94, 0x8f, 0xa9, 0xcb, 0xed, | |
0x0f, 0xa3, 0x9c, 0xb4, 0xda, 0x8b, 0xb3, 0xde, | |
0xbc, 0xfb, 0x0f, 0x86, 0xe2, 0x48, 0x96, 0xe6, | |
0x89, 0xa6, 0xea, 0xca, 0xb6, 0xee, 0x0b, 0xc7, | |
0xf2, 0x4c, 0xd7, 0xf6, 0x8d, 0xe7, 0xfa, 0xce, | |
0x23, 0x05, 0x00, 0x21, 0xf9, 0x04, 0x04, ...toBytes(blackDelayMs), | |
0x00, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, | |
0x28, 0x00, 0x28, 0x00, 0x00, 0x02, 0x27, 0x8c, | |
0x8f, 0xa9, 0xcb, 0xed, 0x0f, 0xa3, 0x9c, 0xb4, | |
0xda, 0x8b, 0xb3, 0xde, 0xbc, 0xfb, 0x0f, 0x86, | |
0xe2, 0x48, 0x96, 0xe6, 0x89, 0xa6, 0xea, 0xca, | |
0xb6, 0xee, 0x0b, 0xc7, 0xf2, 0x4c, 0xd7, 0xf6, | |
0x8d, 0xe7, 0xfa, 0xce, 0x23, 0x05, 0x00, 0x21, | |
0xf9, 0x04, 0x04, ...toBytes(redDelayMs), 0x00, 0x00, 0x2c, | |
0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, | |
0x00, 0x02, 0x27, 0x94, 0x8f, 0xa9, 0xcb, 0xed, | |
0x0f, 0xa3, 0x9c, 0xb4, 0xda, 0x8b, 0xb3, 0xde, | |
0xbc, 0xfb, 0x0f, 0x86, 0xe2, 0x48, 0x96, 0xe6, | |
0x89, 0xa6, 0xea, 0xca, 0xb6, 0xee, 0x0b, 0xc7, | |
0xf2, 0x4c, 0xd7, 0xf6, 0x8d, 0xe7, 0xfa, 0xce, | |
0x23, 0x05, 0x00, 0x21, 0xf9, 0x04, 0x04, ...toBytes(blackDelayMs), | |
0x00, 0x00, 0x2c, 0x28, 0x00, 0x28, 0x00, | |
0x28, 0x00, 0x28, 0x00, 0x00, 0x02, 0x27, 0x8c, | |
0x8f, 0xa9, 0xcb, 0xed, 0x0f, 0xa3, 0x9c, 0xb4, | |
0xda, 0x8b, 0xb3, 0xde, 0xbc, 0xfb, 0x0f, 0x86, | |
0xe2, 0x48, 0x96, 0xe6, 0x89, 0xa6, 0xea, 0xca, | |
0xb6, 0xee, 0x0b, 0xc7, 0xf2, 0x4c, 0xd7, 0xf6, | |
0x8d, 0xe7, 0xfa, 0xce, 0x23, 0x05, 0x00, 0x21, | |
0xf9, 0x04, 0x04, ...toBytes(redDelayMs), 0x00, 0x00, 0x2c, | |
0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, | |
0x00, 0x02, 0x27, 0x94, 0x8f, 0xa9, 0xcb, 0xed, | |
0x0f, 0xa3, 0x9c, 0xb4, 0xda, 0x8b, 0xb3, 0xde, | |
0xbc, 0xfb, 0x0f, 0x86, 0xe2, 0x48, 0x96, 0xe6, | |
0x89, 0xa6, 0xea, 0xca, 0xb6, 0xee, 0x0b, 0xc7, | |
0xf2, 0x4c, 0xd7, 0xf6, 0x8d, 0xe7, 0xfa, 0xce, | |
0x23, 0x05, 0x00, 0x21, 0xf9, 0x04, 0x04, ...toBytes(blackDelayMs), | |
0x00, 0x00, 0x2c, 0x00, 0x00, 0x28, 0x00, | |
0x28, 0x00, 0x28, 0x00, 0x00, 0x02, 0x27, 0x8c, | |
0x8f, 0xa9, 0xcb, 0xed, 0x0f, 0xa3, 0x9c, 0xb4, | |
0xda, 0x8b, 0xb3, 0xde, 0xbc, 0xfb, 0x0f, 0x86, | |
0xe2, 0x48, 0x96, 0xe6, 0x89, 0xa6, 0xea, 0xca, | |
0xb6, 0xee, 0x0b, 0xc7, 0xf2, 0x4c, 0xd7, 0xf6, | |
0x8d, 0xe7, 0xfa, 0xce, 0x23, 0x05, 0x00, 0x3b | |
]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment