Browse Source

некоторый рефакторинг библиотек, попробовал анимацию от полимера, не заработала, надо пробовать стандартную

kpmy 10 years ago
parent
commit
0a8d5996c8
10 changed files with 142 additions and 88 deletions
  1. 9 0
      lib/design.dart
  2. 21 0
      lib/edit.dart
  3. 79 0
      lib/image.dart
  4. 16 84
      lib/poly/chi_canvas.dart
  5. 1 1
      lib/poly/chi_canvas.html
  6. 9 0
      lib/tools.dart
  7. 1 0
      pubspec.yaml
  8. 4 1
      web/edit.html
  9. 1 1
      web/img/eye0-0.json
  10. 1 1
      web/img/eye0-1.json

+ 9 - 0
lib/design.dart

@@ -0,0 +1,9 @@
+library design;
+
+import 'package:color/color.dart';
+//все цвета черно-белой радуги
+final Color BG_COLOR = new Color.hex("ced6b5");
+final Color SHADE_COLOR = new Color.hex("bac1a3");
+final Color BLACK = new Color.hex("000000");
+final Color GREY50 = new Color.hex("7c806d");
+final Color GREY25 = new Color.hex("a5ab91");

+ 21 - 0
lib/edit.dart

@@ -53,6 +53,7 @@ class Port {
   Color lastPen;
   Color lastPen;
 
 
   Map<Tuple2<int, int>, Point> data = new Map();
   Map<Tuple2<int, int>, Point> data = new Map();
+  Tuple2<int, int> size = new Tuple2(50, 40);
 
 
   void prepare(int w, int h){
   void prepare(int w, int h){
     ctx.imageSmoothingEnabled = false;
     ctx.imageSmoothingEnabled = false;
@@ -109,6 +110,12 @@ class Port {
      img.clearRect(0, 0, width, height);
      img.clearRect(0, 0, width, height);
      // Restore the transform
      // Restore the transform
      img.restore();
      img.restore();
+
+     if(size != null){
+       img.setStrokeColorRgb(0xFF, 0, 0);
+       img.strokeRect(2 * OUTER_MARGIN, 2 * OUTER_MARGIN, size.i1 * DOT - 2, size.i2 * DOT - 2);
+     }
+
      int w = 0;
      int w = 0;
      int h = 0;
      int h = 0;
      int y = 2*OUTER_MARGIN;
      int y = 2*OUTER_MARGIN;
@@ -134,6 +141,10 @@ class Port {
      }
      }
   }
   }
 
 
+  void limit(int x, int y){
+    size = new Tuple2(x, y);
+  }
+
   void move(int x, int y){
   void move(int x, int y){
     // Store the current transformation matrix
     // Store the current transformation matrix
     via.save();
     via.save();
@@ -146,6 +157,8 @@ class Port {
     via.setStrokeColorRgb(c.r, c.g, c.b);
     via.setStrokeColorRgb(c.r, c.g, c.b);
     via.strokeRect(x*DOT+1, y*DOT+1, DOT, DOT);
     via.strokeRect(x*DOT+1, y*DOT+1, DOT, DOT);
     via.strokeRect(x*DOT+1+OUTER_STROKE+INNER_MARGIN, y*DOT+1+OUTER_STROKE+INNER_MARGIN, INNER_SIDE+2*INNER_MARGIN, INNER_SIDE+2*INNER_MARGIN);
     via.strokeRect(x*DOT+1+OUTER_STROKE+INNER_MARGIN, y*DOT+1+OUTER_STROKE+INNER_MARGIN, INNER_SIDE+2*INNER_MARGIN, INNER_SIDE+2*INNER_MARGIN);
+    (querySelector("#pos") as SpanElement).text = "$x:$y";
+    (querySelector("#size") as SpanElement).text = "$size";
   }
   }
 
 
   void leave(){
   void leave(){
@@ -201,6 +214,7 @@ class Port {
         name="noname";
         name="noname";
       }
       }
       r["name"]=name;
       r["name"]=name;
+      r["size"]=size.toList();
       r["data"]=ret;
       r["data"]=ret;
       return JSON.encode(r);
       return JSON.encode(r);
     }else{
     }else{
@@ -216,6 +230,11 @@ class Port {
       name = "noname";
       name = "noname";
     }
     }
     (querySelector("#root_name") as InputElement).value = name;
     (querySelector("#root_name") as InputElement).value = name;
+    if (r.containsKey("size"))
+      size = new Tuple2.fromList(r["size"]);
+    else
+      size = new Tuple2(50, 40);
+
     data.clear();
     data.clear();
     List<Map<String, Object>> pl = r["data"];
     List<Map<String, Object>> pl = r["data"];
     if(pl!=null){
     if(pl!=null){
@@ -277,6 +296,8 @@ void run(){
      var c = port.mapCoord(e.offset.x, e.offset.y);
      var c = port.mapCoord(e.offset.x, e.offset.y);
      if(e.button==0){
      if(e.button==0){
        port.put(c.i1, c.i2);
        port.put(c.i1, c.i2);
+     }else if (e.button == 1){
+       port.limit(c.i1+1, c.i2+1);
      }else{
      }else{
        port.clear(c.i1, c.i2);
        port.clear(c.i1, c.i2);
      }
      }

+ 79 - 0
lib/image.dart

@@ -0,0 +1,79 @@
+library image;
+
+import 'package:color/color.dart';
+import 'package:chi/tools.dart';
+import 'package:chi/design.dart';
+import 'dart:convert';
+
+class Dot {
+  int x = 0;
+  int y = 0;
+  Color col = BLACK;
+
+  Dot(this.x, this.y);
+  String toString() => '{x: $x, y: $y, col: "$col"}';
+  Map<String, Object> toMap() {
+    Map<String, Object> ret = new Map();
+    ret["x"] = x;
+    ret["y"] = y;
+    ret["col"] = col.toString();
+    return ret;
+  }
+
+  Dot.fromMap(Map<String, Object> m) {
+    this.x = m["x"];
+    this.y = m["y"];
+    this.col = new Color.hex(m["col"]);
+  }
+}
+
+class Image {
+  Map<Tuple2<int, int>, Dot> data = new Map();
+  Tuple2<int, int> size;
+  Tuple2<int, int> content;
+
+  int get width => size.i1;
+  int get height => size.i2;
+
+  Image.import(String js) {
+    Map<String, Object> r;
+    r = JSON.decode(js);
+    String name = r["name"];
+    if (name == null || name == "") {
+      name = "noname";
+    }
+    if (r.containsKey("size")) size = new Tuple2.fromList(r["size"]); else size = new Tuple2(50, 40);
+
+    data.clear();
+    List<Map<String, Object>> pl = r["data"];
+    if (pl != null) {
+      //normalize
+      Dot min = new Dot(0xFFFFFFFF, 0xFFFFFFFF);
+      Dot max = new Dot(0, 0);
+
+      pl.forEach((Map<String, Object> m) {
+        Dot p = new Dot.fromMap(m);
+        if (p.x <= min.x) min.x = p.x;
+        if (p.y <= min.y) min.y = p.y;
+        if (p.x >= max.x) max.x = p.x;
+        if (p.y >= max.y) max.y = p.y;
+      });
+
+      if (min.x == 0xFFFFFFFF) {
+        min = null;
+        content = size;
+      } else {
+        content = new Tuple2<int, int>(max.x - min.x + 1, max.y - min.y + 1);
+      }
+      pl.forEach((Map<String, Object> m) {
+        Dot p = new Dot.fromMap(m);
+//        if (min != null) {
+//          p.x = p.x - min.x;
+//          p.y = p.y - min.y;
+//        }
+        data[new Tuple2(p.x, p.y)] = p;
+      });
+
+    }
+  }
+}

+ 16 - 84
lib/poly/chi_canvas.dart

@@ -7,89 +7,8 @@ import 'dart:async';
 import 'package:polymer/polymer.dart';
 import 'package:polymer/polymer.dart';
 import 'package:color/color.dart';
 import 'package:color/color.dart';
 import 'package:chi/tools.dart';
 import 'package:chi/tools.dart';
-import 'package:chi/app/loop.dart';
-
-final Color BG_COLOR = new Color.hex("ced6b5");
-final Color SHADE_COLOR = new Color.hex("bac1a3");
-final Color BLACK = new Color.hex("000000");
-final Color GREY50 = new Color.hex("7c806d");
-final Color GREY25 = new Color.hex("a5ab91");
-
-//const int OUTER_SIDE = INNER_SIDE+2*INNER_MARGIN+2*OUTER_STROKE;
-const int DEFAULT_INNER_SIDE = 7;
-const int INNER_MARGIN = 1;
-const int OUTER_MARGIN = 1;
-const int OUTER_STROKE = 1;
-//const DOT = OUTER_SIDE+2*OUTER_MARGIN;
-
-class Point {
-  int x = 0;
-  int y = 0;
-  Color col = BLACK;
-
-  Point(this.x, this.y);
-  String toString() => '{x: $x, y: $y, col: "$col"}';
-  Map<String, Object> toMap() {
-    Map<String, Object> ret = new Map();
-    ret["x"] = x;
-    ret["y"] = y;
-    ret["col"] = col.toString();
-    return ret;
-  }
-
-  Point.fromMap(Map<String, Object> m) {
-    this.x = m["x"];
-    this.y = m["y"];
-    this.col = new Color.hex(m["col"]);
-  }
-}
-
-class Image {
-  int width = 0;
-  int height = 0;
-
-  Map<Tuple2<int, int>, Point> data = new Map();
-
-  Image.import(String js) {
-    Map<String, Object> r;
-    r = JSON.decode(js);
-    String name = r["name"];
-    if (name == null || name == "") {
-      name = "noname";
-    }
-    data.clear();
-    List<Map<String, Object>> pl = r["data"];
-    if (pl != null) {
-      //normalize
-      Point min = new Point(0xFFFFFFFF, 0xFFFFFFFF);
-      Point max = new Point(0, 0);
-
-      pl.forEach((Map<String, Object> m) {
-        Point p = new Point.fromMap(m);
-        if (p.x <= min.x) min.x = p.x;
-        if (p.y <= min.y) min.y = p.y;
-        if (p.x >= max.x) max.x = p.x;
-        if (p.y >= max.y) max.y = p.y;
-      });
-
-      if (min.x == 0xFFFFFFFF) {
-        min = null;
-      } else {
-        width = max.x - min.x + 1;
-        height = max.y - min.y + 1;
-      }
-      pl.forEach((Map<String, Object> m) {
-        Point p = new Point.fromMap(m);
-        if (min != null) {
-          p.x = p.x - min.x;
-          p.y = p.y - min.y;
-        }
-        data[new Tuple2(p.x, p.y)] = p;
-      });
-
-    }
-  }
-}
+import 'package:chi/image.dart';
+import 'package:chi/design.dart';
 
 
 class Frame {
 class Frame {
   int order;
   int order;
@@ -103,6 +22,16 @@ class Frame {
 
 
 @CustomTag("chi-canvas")
 @CustomTag("chi-canvas")
 class ChiCanvas extends PolymerElement implements ChiEventListener {
 class ChiCanvas extends PolymerElement implements ChiEventListener {
+
+  //вычисляются теперь
+  //const int OUTER_SIDE = INNER_SIDE+2*INNER_MARGIN+2*OUTER_STROKE;
+  //const DOT = OUTER_SIDE+2*OUTER_MARGIN;
+
+  static final int DEFAULT_INNER_SIDE = 7;
+  static final int INNER_MARGIN = 1;
+  static final int OUTER_MARGIN = 1;
+  static final int OUTER_STROKE = 1;
+
   @published int base = DEFAULT_INNER_SIDE;
   @published int base = DEFAULT_INNER_SIDE;
   @published bool transparent = true;
   @published bool transparent = true;
   @published int top = 0;
   @published int top = 0;
@@ -173,7 +102,7 @@ class ChiCanvas extends PolymerElement implements ChiEventListener {
       w = 0;
       w = 0;
       while (x < width && w < img.width) {
       while (x < width && w < img.width) {
         var p = new Tuple2<int, int>(w, h);
         var p = new Tuple2<int, int>(w, h);
-        Point tp = img.data[p];
+        Dot tp = img.data[p];
         if (tp != null) {
         if (tp != null) {
           var color = tp.col.toRgbColor();
           var color = tp.col.toRgbColor();
           _ctx.setFillColorRgb(color.r, color.g, color.b);
           _ctx.setFillColorRgb(color.r, color.g, color.b);
@@ -193,6 +122,9 @@ class ChiCanvas extends PolymerElement implements ChiEventListener {
   void registerFrame(ChiFrame f){
   void registerFrame(ChiFrame f){
     assert(f.img!=null);
     assert(f.img!=null);
     frames[f.order]= new Frame.elem(f);
     frames[f.order]= new Frame.elem(f);
+    if(frames.containsKey(0)){
+      front(frames[0].img);
+    }
   }
   }
 
 
   void prepare(int w, int h) {
   void prepare(int w, int h) {

+ 1 - 1
lib/poly/chi_canvas.html

@@ -1,4 +1,4 @@
-<link rel="import" href="../../../packages/polymer/polymer.html">
+<link rel="import" href="../../../packages/polymer/polymer.html"/>
 <link rel="import" href="chi_canvas_common.html"/>
 <link rel="import" href="chi_canvas_common.html"/>
 <polymer-element name="chi-canvas"
 <polymer-element name="chi-canvas"
   attributes="base transparent top left duration"> <template>
   attributes="base transparent top left duration"> <template>

+ 9 - 0
lib/tools.dart

@@ -51,6 +51,15 @@ class Tuple2<T1, T2> {
       return (t.i1 == i1 &&
       return (t.i1 == i1 &&
           t.i2 == i2);
           t.i2 == i2);
     }
     }
+
+    Tuple2.fromList(List l){
+      i1 = l[0];
+      i2 = l[1];
+    }
+
+    List toList(){
+      return [i1, i2];
+    }
 }
 }
 
 
 void initTools(){
 void initTools(){

+ 1 - 0
pubspec.yaml

@@ -6,6 +6,7 @@ environment:
 dependencies:
 dependencies:
   browser: any
   browser: any
   color: any
   color: any
+  core_elements: any
   dartson: any
   dartson: any
   event_bus: any
   event_bus: any
   paper_elements: any
   paper_elements: any

+ 4 - 1
web/edit.html

@@ -17,7 +17,10 @@
 </head>
 </head>
 
 
 <body>
 <body>
-  <div id="root_data_container">Сохранить:
+  <div id="root_data_container">
+    Размер: <span id="size"></span>
+    Позиция: <span id="pos"></span>
+    Сохранить:
     <input id="root_name" value="без имени"/>
     <input id="root_name" value="без имени"/>
     <input type="button" id="root_save_button" value="сохранить"/>
     <input type="button" id="root_save_button" value="сохранить"/>
     Загрузить: <input type='file' id='file_path'/>
     Загрузить: <input type='file' id='file_path'/>

+ 1 - 1
web/img/eye0-0.json

@@ -1 +1 @@
-{"name":"eye0","data":[{"x":3,"y":2,"col":"000000"},{"x":4,"y":2,"col":"000000"},{"x":5,"y":2,"col":"000000"},{"x":2,"y":3,"col":"000000"},{"x":2,"y":4,"col":"000000"},{"x":2,"y":5,"col":"000000"},{"x":2,"y":6,"col":"000000"},{"x":2,"y":7,"col":"000000"},{"x":3,"y":8,"col":"000000"},{"x":4,"y":8,"col":"000000"},{"x":5,"y":8,"col":"000000"},{"x":6,"y":2,"col":"000000"},{"x":7,"y":3,"col":"000000"},{"x":7,"y":4,"col":"000000"},{"x":7,"y":5,"col":"000000"},{"x":7,"y":6,"col":"000000"},{"x":7,"y":7,"col":"000000"},{"x":6,"y":8,"col":"000000"},{"x":5,"y":6,"col":"000000"},{"x":6,"y":6,"col":"7c806d"},{"x":5,"y":7,"col":"7c806d"},{"x":4,"y":6,"col":"7c806d"},{"x":5,"y":5,"col":"7c806d"},{"x":6,"y":5,"col":"a5ab91"},{"x":4,"y":5,"col":"a5ab91"},{"x":4,"y":7,"col":"a5ab91"},{"x":6,"y":7,"col":"a5ab91"},{"x":10,"y":3,"col":"000000"},{"x":10,"y":4,"col":"000000"},{"x":10,"y":5,"col":"000000"},{"x":10,"y":6,"col":"000000"},{"x":10,"y":7,"col":"000000"},{"x":11,"y":8,"col":"000000"},{"x":12,"y":8,"col":"000000"},{"x":13,"y":8,"col":"000000"},{"x":14,"y":8,"col":"000000"},{"x":11,"y":2,"col":"000000"},{"x":12,"y":2,"col":"000000"},{"x":13,"y":2,"col":"000000"},{"x":14,"y":2,"col":"000000"},{"x":15,"y":3,"col":"000000"},{"x":15,"y":4,"col":"000000"},{"x":15,"y":5,"col":"000000"},{"x":15,"y":6,"col":"000000"},{"x":15,"y":7,"col":"000000"},{"x":13,"y":6,"col":"000000"},{"x":13,"y":5,"col":"7c806d"},{"x":14,"y":6,"col":"7c806d"},{"x":12,"y":6,"col":"7c806d"},{"x":12,"y":5,"col":"a5ab91"},{"x":14,"y":5,"col":"a5ab91"},{"x":13,"y":7,"col":"7c806d"},{"x":14,"y":7,"col":"a5ab91"},{"x":12,"y":7,"col":"a5ab91"}]}
+{"name":"eye0","size":[16,9],"data":[{"x":3,"y":2,"col":"000000"},{"x":4,"y":2,"col":"000000"},{"x":5,"y":2,"col":"000000"},{"x":2,"y":3,"col":"000000"},{"x":2,"y":4,"col":"000000"},{"x":2,"y":5,"col":"000000"},{"x":2,"y":6,"col":"000000"},{"x":2,"y":7,"col":"000000"},{"x":3,"y":8,"col":"000000"},{"x":4,"y":8,"col":"000000"},{"x":5,"y":8,"col":"000000"},{"x":6,"y":2,"col":"000000"},{"x":7,"y":3,"col":"000000"},{"x":7,"y":4,"col":"000000"},{"x":7,"y":5,"col":"000000"},{"x":7,"y":6,"col":"000000"},{"x":7,"y":7,"col":"000000"},{"x":6,"y":8,"col":"000000"},{"x":5,"y":6,"col":"000000"},{"x":6,"y":6,"col":"7c806d"},{"x":5,"y":7,"col":"7c806d"},{"x":4,"y":6,"col":"7c806d"},{"x":5,"y":5,"col":"7c806d"},{"x":6,"y":5,"col":"a5ab91"},{"x":4,"y":5,"col":"a5ab91"},{"x":4,"y":7,"col":"a5ab91"},{"x":6,"y":7,"col":"a5ab91"},{"x":10,"y":3,"col":"000000"},{"x":10,"y":4,"col":"000000"},{"x":10,"y":5,"col":"000000"},{"x":10,"y":6,"col":"000000"},{"x":10,"y":7,"col":"000000"},{"x":11,"y":8,"col":"000000"},{"x":12,"y":8,"col":"000000"},{"x":13,"y":8,"col":"000000"},{"x":14,"y":8,"col":"000000"},{"x":11,"y":2,"col":"000000"},{"x":12,"y":2,"col":"000000"},{"x":13,"y":2,"col":"000000"},{"x":14,"y":2,"col":"000000"},{"x":15,"y":3,"col":"000000"},{"x":15,"y":4,"col":"000000"},{"x":15,"y":5,"col":"000000"},{"x":15,"y":6,"col":"000000"},{"x":15,"y":7,"col":"000000"},{"x":13,"y":6,"col":"000000"},{"x":13,"y":5,"col":"7c806d"},{"x":14,"y":6,"col":"7c806d"},{"x":12,"y":6,"col":"7c806d"},{"x":12,"y":5,"col":"a5ab91"},{"x":14,"y":5,"col":"a5ab91"},{"x":13,"y":7,"col":"7c806d"},{"x":14,"y":7,"col":"a5ab91"},{"x":12,"y":7,"col":"a5ab91"}]}

+ 1 - 1
web/img/eye0-1.json

@@ -1 +1 @@
-{"name":"eye0","data":[{"x":3,"y":2,"col":"000000"},{"x":4,"y":2,"col":"000000"},{"x":5,"y":2,"col":"000000"},{"x":2,"y":3,"col":"000000"},{"x":2,"y":4,"col":"000000"},{"x":2,"y":5,"col":"000000"},{"x":2,"y":6,"col":"000000"},{"x":2,"y":7,"col":"000000"},{"x":3,"y":8,"col":"000000"},{"x":4,"y":8,"col":"000000"},{"x":5,"y":8,"col":"000000"},{"x":6,"y":2,"col":"000000"},{"x":7,"y":3,"col":"000000"},{"x":7,"y":4,"col":"000000"},{"x":7,"y":5,"col":"000000"},{"x":7,"y":6,"col":"000000"},{"x":7,"y":7,"col":"000000"},{"x":6,"y":8,"col":"000000"},{"x":10,"y":3,"col":"000000"},{"x":10,"y":4,"col":"000000"},{"x":10,"y":5,"col":"000000"},{"x":10,"y":6,"col":"000000"},{"x":10,"y":7,"col":"000000"},{"x":11,"y":8,"col":"000000"},{"x":12,"y":8,"col":"000000"},{"x":13,"y":8,"col":"000000"},{"x":14,"y":8,"col":"000000"},{"x":11,"y":2,"col":"000000"},{"x":12,"y":2,"col":"000000"},{"x":13,"y":2,"col":"000000"},{"x":14,"y":2,"col":"000000"},{"x":15,"y":3,"col":"000000"},{"x":15,"y":4,"col":"000000"},{"x":15,"y":5,"col":"000000"},{"x":15,"y":6,"col":"000000"},{"x":15,"y":7,"col":"000000"},{"x":4,"y":6,"col":"000000"},{"x":4,"y":5,"col":"7c806d"},{"x":5,"y":6,"col":"7c806d"},{"x":4,"y":7,"col":"7c806d"},{"x":3,"y":6,"col":"7c806d"},{"x":3,"y":5,"col":"a5ab91"},{"x":5,"y":5,"col":"a5ab91"},{"x":5,"y":7,"col":"a5ab91"},{"x":3,"y":7,"col":"a5ab91"},{"x":12,"y":6,"col":"000000"},{"x":12,"y":5,"col":"7c806d"},{"x":13,"y":6,"col":"7c806d"},{"x":12,"y":7,"col":"7c806d"},{"x":11,"y":6,"col":"7c806d"},{"x":11,"y":5,"col":"a5ab91"},{"x":13,"y":5,"col":"a5ab91"},{"x":13,"y":7,"col":"a5ab91"},{"x":11,"y":7,"col":"a5ab91"}]}
+{"name":"eye0","size":[16,9],"data":[{"x":3,"y":2,"col":"000000"},{"x":4,"y":2,"col":"000000"},{"x":5,"y":2,"col":"000000"},{"x":2,"y":3,"col":"000000"},{"x":2,"y":4,"col":"000000"},{"x":2,"y":5,"col":"000000"},{"x":2,"y":6,"col":"000000"},{"x":2,"y":7,"col":"000000"},{"x":3,"y":8,"col":"000000"},{"x":4,"y":8,"col":"000000"},{"x":5,"y":8,"col":"000000"},{"x":6,"y":2,"col":"000000"},{"x":7,"y":3,"col":"000000"},{"x":7,"y":4,"col":"000000"},{"x":7,"y":5,"col":"000000"},{"x":7,"y":6,"col":"000000"},{"x":7,"y":7,"col":"000000"},{"x":6,"y":8,"col":"000000"},{"x":10,"y":3,"col":"000000"},{"x":10,"y":4,"col":"000000"},{"x":10,"y":5,"col":"000000"},{"x":10,"y":6,"col":"000000"},{"x":10,"y":7,"col":"000000"},{"x":11,"y":8,"col":"000000"},{"x":12,"y":8,"col":"000000"},{"x":13,"y":8,"col":"000000"},{"x":14,"y":8,"col":"000000"},{"x":11,"y":2,"col":"000000"},{"x":12,"y":2,"col":"000000"},{"x":13,"y":2,"col":"000000"},{"x":14,"y":2,"col":"000000"},{"x":15,"y":3,"col":"000000"},{"x":15,"y":4,"col":"000000"},{"x":15,"y":5,"col":"000000"},{"x":15,"y":6,"col":"000000"},{"x":15,"y":7,"col":"000000"},{"x":4,"y":6,"col":"000000"},{"x":4,"y":5,"col":"7c806d"},{"x":5,"y":6,"col":"7c806d"},{"x":4,"y":7,"col":"7c806d"},{"x":3,"y":6,"col":"7c806d"},{"x":3,"y":5,"col":"a5ab91"},{"x":5,"y":5,"col":"a5ab91"},{"x":5,"y":7,"col":"a5ab91"},{"x":3,"y":7,"col":"a5ab91"},{"x":12,"y":6,"col":"000000"},{"x":12,"y":5,"col":"7c806d"},{"x":13,"y":6,"col":"7c806d"},{"x":12,"y":7,"col":"7c806d"},{"x":11,"y":6,"col":"7c806d"},{"x":11,"y":5,"col":"a5ab91"},{"x":13,"y":5,"col":"a5ab91"},{"x":13,"y":7,"col":"a5ab91"},{"x":11,"y":7,"col":"a5ab91"}]}