anchor.diff:        c.drawImageRect(train.image, sourceRect, destRect, null);
       }
       x += columnWidths[1];
  -    train.description.paint(c, new Rect.fromLTWH(x + horizontalPadding, y + verticalPadding, columnWidths[2] - horizontalPadding * 2.0, rowHeight));
  +    train.description.paint(c, new Rect.fromLTWH(x + horizontalPadding, y, columnWidths[2] - horizontalPadding * 2.0, rowHeight));
       x += columnWidths[2];
  -    path.lineTo(x, y);
  -    y += rowHeight + verticalPadding * 2.0;
  +    path.lineTo(x, y - verticalPadding);
  +    y += rowHeight + verticalPadding;
  +    train.yBottom = y;
     }
     final double tableBottom = y;
   
  
positive.code:     captionSize
    ));
  
    final List<double> columnWidths = captions.map/*<double>*/((Text caption) => caption.naturalMaxWidth).toList();
    for (int index = 0; index < kTrainData.length; index += 1) {
      Train train = kTrainData[index];
      columnWidths[0] = math.max(columnWidths[0], train.code.naturalMaxWidth + horizontalPadding * 2.0);
      columnWidths[1] = math.max(columnWidths[1], (train.image?.width ?? 0.0) + horizontalPadding * 2.0);
      columnWidths[2] = math.max(columnWidths[2], train.description.naturalMaxWidth + horizontalPadding * 2.0);
    }
    // make the image column max 40% (and take into account the device pixel ratio)
    columnWidths[1] = math.min(columnWidths[1] / window.devicePixelRatio, width * 0.4);
    columnWidths[2] = width - (columnWidths[0] + columnWidths[1]);
  
    final Path path = new Path();
  
negative.code: import 'dart:ui';
  
  import 'package:mojo/application.dart';
  import 'package:mojo/bindings.dart' as mojo;
  import 'package:mojo/core.dart' as mojo;
  import 'package:mojo/mojo/service_provider.mojom.dart' as mojom;
  import 'package:mojo/mojo/shell.mojom.dart' as mojom;
  