Added a function to clear data of polygons array.
[chise/kage.git] / engine / kage.js
index 0a91bb7..bc97a5a 100755 (executable)
 function Kage(){\r
-       // method\r
-       function drawFont(polygons, glyph){ // void\r
-               // [glyph] : [stroke]$[stroke]$.....\r
-               // [stroke] : [column]:[column]:.....\r
-               var strokes = glyph.split("$");\r
-               for(var i = 0; i < strokes.length; i++){\r
-                       var columns = strokes[i].split(":");\r
-                       if(Math.floor(columns[0]) != 99){\r
-                               dfDrawFont(this, polygons,\r
-                                                                        Math.floor(columns[0]),\r
-                                                                        Math.floor(columns[1]), Math.floor(columns[2]),\r
-                                                                        Math.floor(columns[3]), Math.floor(columns[4]),\r
-                                                                        Math.floor(columns[5]), Math.floor(columns[6]),\r
-                                                                        Math.floor(columns[7]), Math.floor(columns[8]),\r
-                                                                        Math.floor(columns[9]), Math.floor(columns[10]));\r
-                       } else {\r
-                               var buhin = this.kBuhin.search(columns[7]);\r
-                               if(buhin != ""){\r
-                                       this.drawBuhin(polygons, buhin,\r
-                                                                                                Math.floor(columns[3]),\r
-                                                                                                Math.floor(columns[4]),\r
-                                                                                                Math.floor(columns[5]),\r
-                                                                                                Math.floor(columns[6]));\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       Kage.prototype.drawFont = drawFont;\r
+  // method\r
+  function makeGlyph(polygons, buhin){ // void\r
+    var glyphData = this.kBuhin.search(buhin);\r
+    if(glyphData != ""){\r
+      this.drawStrokesArray(polygons, this.adjustKirikuchi(this.adjustUroko(this.adjustKakato(this.getEachStrokes(glyphData)))));\r
+    }\r
+  }\r
+  Kage.prototype.makeGlyph = makeGlyph;\r
+  \r
+  function getEachStrokes(glyphData){ // strokes array\r
+    var strokesArray = new Array();\r
+    var strokes = glyphData.split("$");\r
+    for(var i = 0; i < strokes.length; i++){\r
+      var columns = strokes[i].split(":");\r
+      if(Math.floor(columns[0]) != 99){\r
+        strokesArray.push([\r
+          Math.floor(columns[0]),\r
+          Math.floor(columns[1]),\r
+          Math.floor(columns[2]),\r
+          Math.floor(columns[3]),\r
+          Math.floor(columns[4]),\r
+          Math.floor(columns[5]),\r
+          Math.floor(columns[6]),\r
+          Math.floor(columns[7]),\r
+          Math.floor(columns[8]),\r
+          Math.floor(columns[9]),\r
+          Math.floor(columns[10])\r
+          ]);\r
+      } else {\r
+        var buhin = this.kBuhin.search(columns[7]);\r
+        if(buhin != ""){\r
+          strokesArray = strokesArray.concat(this.getEachStrokesOfBuhin(buhin,\r
+                                                  Math.floor(columns[3]),\r
+                                                  Math.floor(columns[4]),\r
+                                                  Math.floor(columns[5]),\r
+                                                  Math.floor(columns[6]))\r
+                            );\r
+        }\r
+      }\r
+    }\r
+    return strokesArray;\r
+  }\r
+  Kage.prototype.getEachStrokes = getEachStrokes;\r
+  \r
+  function getEachStrokesOfBuhin(buhin, x1, y1, x2, y2){\r
+    var temp = this.getEachStrokes(buhin);\r
+    var result = new Array();\r
+    for(var i = 0; i < temp.length; i++){\r
+      result.push([temp[i][0],\r
+                   temp[i][1],\r
+                   temp[i][2],\r
+                   x1 + temp[i][3] * (x2 - x1) / 200,\r
+                   y1 + temp[i][4] * (y2 - y1) / 200,\r
+                   x1 + temp[i][5] * (x2 - x1) / 200,\r
+                   y1 + temp[i][6] * (y2 - y1) / 200,\r
+                   x1 + temp[i][7] * (x2 - x1) / 200,\r
+                   y1 + temp[i][8] * (y2 - y1) / 200,\r
+                   x1 + temp[i][9] * (x2 - x1) / 200,\r
+                   y1 + temp[i][10] * (y2 - y1) / 200]);\r
+    }\r
+    return result;\r
+  }\r
+  Kage.prototype.getEachStrokesOfBuhin = getEachStrokesOfBuhin;\r
+  \r
+       function adjustUroko(strokesArray){ // strokesArray\r
+    for(var i = 0; i < strokesArray.length; i++){\r
+      if(strokesArray[i][0] == 1 && strokesArray[i][2] == 0){ // no operation for TATE\r
+        for(var k = 0; k < this.kAdjustUrokoLengthStep; k++){\r
+          var tx, ty, tlen;\r
+          if(strokesArray[i][4] == strokesArray[i][6]){ // YOKO\r
+            tx = strokesArray[i][5] - this.kAdjustUrokoLine[k];\r
+            ty = strokesArray[i][6] - 0.5;\r
+            tlen = strokesArray[i][5] - strokesArray[i][3];\r
+          } else {\r
+            var rad = Math.atan((strokesArray[i][6] - strokesArray[i][4]) / (strokesArray[i][5] - strokesArray[i][3]));\r
+            tx = strokesArray[i][5] - this.kAdjustUrokoLine[k] * Math.cos(rad) - 0.5 * Math.sin(rad);\r
+            ty = strokesArray[i][6] - this.kAdjustUrokoLine[k] * Math.sin(rad) - 0.5 * Math.cos(rad);\r
+            tlen = Math.sqrt((strokesArray[i][6] - strokesArray[i][4]) * (strokesArray[i][6] - strokesArray[i][4]) +\r
+                             (strokesArray[i][5] - strokesArray[i][3]) * (strokesArray[i][5] - strokesArray[i][3]));\r
+          }\r
+          if(tlen < this.kAdjustUrokoLength[k] ||\r
+             isCrossWithOthers(strokesArray, i, tx, ty, strokesArray[i][5], strokesArray[i][6])\r
+             ){\r
+            strokesArray[i][2] += (this.kAdjustUrokoLengthStep - k) * 100;\r
+            k = Infinity;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    return strokesArray;\r
+  }\r
+  Kage.prototype.adjustUroko = adjustUroko;\r
+       \r
+       function adjustKirikuchi(strokesArray){ // strokesArray\r
+    for(var i = 0; i < strokesArray.length; i++){\r
+      if(strokesArray[i][0] == 2 && strokesArray[i][1] == 32 &&\r
+         strokesArray[i][3] > strokesArray[i][5] &&\r
+         strokesArray[i][4] < strokesArray[i][6]){\r
+        for(var j = 0; j < strokesArray.length; j++){ // no need to skip when i == j\r
+          if(strokesArray[j][0] == 1 &&\r
+             strokesArray[j][3] < strokesArray[i][3] && strokesArray[j][5] > strokesArray[i][3] &&\r
+             strokesArray[j][4] == strokesArray[i][4] && strokesArray[j][4] == strokesArray[j][6]){\r
+            strokesArray[i][1] = 132;\r
+            j = strokesArray.length;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    return strokesArray;\r
+  }\r
+  Kage.prototype.adjustKirikuchi = adjustKirikuchi;\r
        \r
-  function drawBuhin(polygons, glyph, x1, y1, x2, y2){\r
-               var strokes = glyph.split("$");\r
-               for(var i = 0; i < strokes.length; i++){\r
-                       var columns = strokes[i].split(":");\r
-                       if(Math.floor(columns[0]) != 99){\r
-                               dfDrawFont(this, polygons,\r
-                                                                        Math.floor(columns[0]),\r
-                                                                        Math.floor(columns[1]),\r
-                                                                        Math.floor(columns[2]),\r
-                                                                        x1 + Math.floor(columns[3]) * (x2 - x1) / 200,\r
-                                                                        y1 + Math.floor(columns[4]) * (y2 - y1) / 200,\r
-                                                                        x1 + Math.floor(columns[5]) * (x2 - x1) / 200,\r
-                                                                        y1 + Math.floor(columns[6]) * (y2 - y1) / 200,\r
-                                                                        x1 + Math.floor(columns[7]) * (x2 - x1) / 200,\r
-                                                                        y1 + Math.floor(columns[8]) * (y2 - y1) / 200,\r
-                                                                        x1 + Math.floor(columns[9]) * (x2 - x1) / 200,\r
-                                                                        y1 + Math.floor(columns[10]) * (y2 - y1) / 200);\r
-                       } else {\r
-                               var buhin = this.kBuhin.search(columns[7]);\r
-                               if(buhin != ""){\r
-                                       this.drawBuhin(polygons, buhin,\r
-                                                                                                x1 + Math.floor(columns[3]) * (x2 - x1) / 200,\r
-                                                                                                y1 + Math.floor(columns[4]) * (y2 - y1) / 200,\r
-                                                                                                x1 + Math.floor(columns[5]) * (x2 - x1) / 200,\r
-                                                                                                y1 + Math.floor(columns[6]) * (y2 - y1) / 200);\r
-                               }\r
-                       }\r
-               }\r
+  function adjustKakato(strokesArray){ // strokesArray\r
+    for(var i = 0; i < strokesArray.length; i++){\r
+      if(strokesArray[i][0] == 1 &&\r
+         (strokesArray[i][2] == 13 || strokesArray[i][2] == 23)){\r
+        for(var k = 0; k < this.kAdjustKakatoStep; k++){\r
+          if(isCrossBoxWithOthers(strokesArray, i,\r
+                               strokesArray[i][5] - this.kAdjustKakatoRangeX / 2,\r
+                               strokesArray[i][6] + this.kAdjustKakatoRangeY[k],\r
+                               strokesArray[i][5] + this.kAdjustKakatoRangeX / 2,\r
+                               strokesArray[i][6] + this.kAdjustKakatoRangeY[k + 1])\r
+             ){\r
+            strokesArray[i][2] += (3 - k) * 100;\r
+            k = Infinity;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    return strokesArray;\r
+  }\r
+  Kage.prototype.adjustKakato = adjustKakato;\r
+  \r
+  function drawStrokesArray(polygons, strokesArray){\r
+    for(var i = 0; i < strokesArray.length; i++){\r
+      dfDrawFont(this, polygons,\r
+                 strokesArray[i][0],\r
+                 strokesArray[i][1],\r
+                 strokesArray[i][2],\r
+                 strokesArray[i][3],\r
+                 strokesArray[i][4],\r
+                 strokesArray[i][5],\r
+                 strokesArray[i][6],\r
+                 strokesArray[i][7],\r
+                 strokesArray[i][8],\r
+                 strokesArray[i][9],\r
+                 strokesArray[i][10]);\r
+    }\r
+  }\r
+  Kage.prototype.drawStrokesArray = drawStrokesArray;\r
+  \r
+  function drawGlyph(polygons, glyph){ // void\r
+    // [glyph] : [stroke]$[stroke]$.....\r
+    // [stroke] : [column]:[column]:.....\r
+    var strokes = glyph.split("$");\r
+    for(var i = 0; i < strokes.length; i++){\r
+      var columns = strokes[i].split(":");\r
+      if(Math.floor(columns[0]) != 99){\r
+        dfDrawFont(this, polygons,\r
+                   Math.floor(columns[0]),\r
+                   Math.floor(columns[1]), Math.floor(columns[2]),\r
+                   Math.floor(columns[3]), Math.floor(columns[4]),\r
+                   Math.floor(columns[5]), Math.floor(columns[6]),\r
+                   Math.floor(columns[7]), Math.floor(columns[8]),\r
+                   Math.floor(columns[9]), Math.floor(columns[10]));\r
+      } else {\r
+        var buhin = this.kBuhin.search(columns[7]);\r
+        if(buhin != ""){\r
+          this.drawBuhin(polygons, buhin,\r
+                         Math.floor(columns[3]),\r
+                         Math.floor(columns[4]),\r
+                         Math.floor(columns[5]),\r
+                         Math.floor(columns[6]));\r
+        }\r
+      }\r
+    }\r
+  }\r
+  Kage.prototype.drawGlyph = drawGlyph;\r
+  \r
+  function drawBuhin(polygons, glyph, x1, y1, x2, y2){ // void\r
+    var strokes = glyph.split("$");\r
+    for(var i = 0; i < strokes.length; i++){\r
+      var columns = strokes[i].split(":");\r
+      if(Math.floor(columns[0]) != 99){\r
+        dfDrawFont(this, polygons,\r
+                   Math.floor(columns[0]),\r
+                   Math.floor(columns[1]),\r
+                   Math.floor(columns[2]),\r
+                   x1 + Math.floor(columns[3]) * (x2 - x1) / 200,\r
+                   y1 + Math.floor(columns[4]) * (y2 - y1) / 200,\r
+                   x1 + Math.floor(columns[5]) * (x2 - x1) / 200,\r
+                   y1 + Math.floor(columns[6]) * (y2 - y1) / 200,\r
+                   x1 + Math.floor(columns[7]) * (x2 - x1) / 200,\r
+                   y1 + Math.floor(columns[8]) * (y2 - y1) / 200,\r
+                   x1 + Math.floor(columns[9]) * (x2 - x1) / 200,\r
+                   y1 + Math.floor(columns[10]) * (y2 - y1) / 200);\r
+      } else {\r
+        var buhin = this.kBuhin.search(columns[7]);\r
+        if(buhin != ""){\r
+          this.drawBuhin(polygons, buhin,\r
+                         x1 + Math.floor(columns[3]) * (x2 - x1) / 200,\r
+                         y1 + Math.floor(columns[4]) * (y2 - y1) / 200,\r
+                         x1 + Math.floor(columns[5]) * (x2 - x1) / 200,\r
+                         y1 + Math.floor(columns[6]) * (y2 - y1) / 200);\r
+        }\r
+      }\r
+    }\r
   }\r
   Kage.prototype.drawBuhin = drawBuhin;\r
   \r
@@ -63,14 +213,28 @@ function Kage(){
   Kage.prototype.kMincho = 0;\r
   Kage.prototype.kGothic = 1;\r
   this.kShotai = this.kMincho;\r
-  this.kMage = 10;\r
+       \r
   this.kRate = 100;\r
+       \r
   this.kMinWidthY = 2;\r
   this.kMinWidthT = 6;\r
   this.kWidth = 5;\r
   this.kKakato = 3;\r
-  //has KAKATO = 2, no KAKATO = 1\r
   this.kL2RDfatten = 1.1;\r
+  this.kMage = 10;\r
+       \r
+  this.kAdjustKakatoL = ([14, 9, 5, 2]); // for KAKATO adjustment 000,100,200,300\r
+  this.kAdjustKakatoR = ([8, 6, 4, 2]); // for KAKATO adjustment 000,100,200,300\r
+  this.kAdjustKakatoRangeX = 20; // check area width\r
+  this.kAdjustKakatoRangeY = ([1, 19, 24, 30]); // 3 steps of checking\r
+  this.kAdjustKakatoStep = 3; // number of steps\r
+       \r
+  this.kAdjustUrokoX = ([24, 20, 16, 12]); // for UROKO adjustment 000,100,200,300\r
+  this.kAdjustUrokoY = ([12, 11, 9, 8]); // for UROKO adjustment 000,100,200,300\r
+  this.kAdjustUrokoLength = ([22, 36, 50]); // length for checking\r
+  this.kAdjustUrokoLengthStep = 3; // number of steps\r
+  this.kAdjustUrokoLine = ([22, 26, 30]); // check for crossing. corresponds to length\r
+       \r
   this.kBuhin = new Buhin();\r
   \r
   return this;\r