square.dart 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'dart:async';
  2. import 'dart:math';
  3. import 'dart:typed_data';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:the_paint/src/generated/client.pbgrpc.dart';
  7. import 'dart:ui' as ui;
  8. import '../color_ref.dart';
  9. import '../square/in_memory.dart';
  10. import '../square/square.dart';
  11. class SquareComponent extends StatefulWidget {
  12. Point<int> tile;
  13. ColorRef color;
  14. SquareComponent(this.tile, this.color, {Key? key}) : super(key: key);
  15. @override
  16. SquareComponentState createState() => SquareComponentState();
  17. }
  18. class SquareComponentState extends State<SquareComponent> {
  19. // late ResponseStream<MonitorReply> responses;
  20. late final SquereData __serverSquareData;
  21. bool __updated = false;
  22. ui.Image? img;
  23. Uint8List data = Uint8List(256 * 256 * 4);
  24. void renderImage() {
  25. ui.decodeImageFromPixels(data, 256, 256, ui.PixelFormat.rgba8888, setImg,
  26. allowUpscaling: false);
  27. }
  28. void setImg(ui.Image data) {
  29. if (mounted) {
  30. setState(() {
  31. img = data;
  32. });
  33. }
  34. }
  35. @override
  36. void initState() {
  37. __serverSquareData = InMemorySquereData(widget.tile);
  38. loadPoints();
  39. super.initState();
  40. }
  41. Future<void> loadPoints() async {
  42. // TODO: only update the image if the last update hapenned in less than 200ms
  43. await for (var value in __serverSquareData.getSteam()) {
  44. BPoint? lastPosition;
  45. for (var point in value.points) {
  46. lastPosition = point.point;
  47. var p = lastPosition;
  48. final startByte = (p.x + p.y * 256) * 4;
  49. List.generate(
  50. 4,
  51. (index) =>
  52. data[startByte + index] = point.color.rgba >> 8 * index & 0xff);
  53. }
  54. renderImage();
  55. }
  56. }
  57. @override
  58. Widget build(BuildContext context) {
  59. return GestureDetector(
  60. onTapDown: (details) {
  61. var point = Point<int>(
  62. details.localPosition.dx.floor(),
  63. details.localPosition.dy.floor(),
  64. );
  65. __serverSquareData.paint(point, widget.color.getColor());
  66. },
  67. child: RawImage(
  68. image: img,
  69. filterQuality: FilterQuality.none,
  70. ),
  71. );
  72. }
  73. @override
  74. void dispose() {
  75. super.dispose();
  76. }
  77. }