anchor.diff:  
     GlobalKey get key => new GlobalObjectKey(this);
   
  +  Widget buildSwatch(BuildContext context, Widget child) {
  +    return new GestureDetector(
  +        onTap: () async {
  +          await SchedulerBinding.instance.endOfFrame;
  +          final Rect area = interestingArea;
  +          print('BASH: convert flutter_`printf %02d \$N`.png -crop '
  +              '${area.width}x${area.height}+${area.left}+${area.top} -resize '
  +              '\'400x600>\' ${filename}.png; ((N++))');
  +          Navigator.of(context).pop();
  +        },
  +        child: child);
  +  }
  +
     Rect get interestingArea {
       final RenderBox box = key.currentContext.findRenderObject();
  -    final Rect area = ((box.localToGlobal(Offset.zero) * ui.window.devicePixelRatio) & (box.size * ui.window.devicePixelRatio));
  +    final Rect area =
  +        ((box.localToGlobal(Offset.zero) * ui.window.devicePixelRatio) &
  +            (box.size * ui.window.devicePixelRatio));
       return area;
     }
   }
  
positive.code:     const SwatchPage('Colors.redAccent', Colors.redAccent, accentPalette),
      const SwatchPage('Colors.pinkAccent', Colors.pinkAccent, accentPalette),
      const SwatchPage('Colors.purpleAccent', Colors.purpleAccent, accentPalette),
      const SwatchPage('Colors.deepPurpleAccent', Colors.deepPurpleAccent, accentPalette),
      const SwatchPage('Colors.indigoAccent', Colors.indigoAccent, accentPalette),
      const SwatchPage('Colors.blueAccent', Colors.blueAccent, accentPalette),
      const SwatchPage('Colors.lightBlueAccent', Colors.lightBlueAccent, accentPalette),
      const SwatchPage('Colors.cyanAccent', Colors.cyanAccent, accentPalette),
      const SwatchPage('Colors.tealAccent', Colors.tealAccent, accentPalette),
      const SwatchPage('Colors.greenAccent', Colors.greenAccent, accentPalette),
      const SwatchPage('Colors.lightGreenAccent', Colors.lightGreenAccent, accentPalette),
      const SwatchPage('Colors.limeAccent', Colors.limeAccent, accentPalette),
      const SwatchPage('Colors.yellowAccent', Colors.yellowAccent, accentPalette),
      const SwatchPage('Colors.amberAccent', Colors.amberAccent, accentPalette),
      const SwatchPage('Colors.orangeAccent', Colors.orangeAccent, accentPalette),
      const SwatchPage('Colors.deepOrangeAccent', Colors.deepOrangeAccent, accentPalette),
      const SwatchPage('Colors.grey', Colors.grey, greyPalette),
      const ColorListPage('Colors.blacks', Colors.white, const <String, Color>{
        'black': Colors.black,
  
negative.code:       'white70': Colors.white70,
      }),
    ];
    print('This app will display a sequence of images. For each one, tap "s"');
    print('in the console to take a screenshot, then tap the screen to');
    print('advance. When all is done, a script will be dumped that shows the');
    print('commands to run to convert all the screenshots to images.');
    print('BASH: N=1 # set this to the number of the first screenshot file');
    Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{};
    for (Page page in pages) {
      routes['/' + page.filename] = page.build;
      print('COLOR: ${page.filename}');
    }
    runApp(new MaterialApp(onGenerateRoute: (RouteSettings settings) {
      if (settings.isInitialRoute &&
          settings.name == Navigator.defaultRouteName) {
        return new MaterialPageRoute<Null>(
          builder: (BuildContext context) {
            return new HomePage(pages);
          },
          settings: settings,
        );
      } else {
        return new MaterialPageRoute<Null>(
          builder: routes[settings.name],
          settings: settings,
        );
      }
    }));
  }
  