Added stretch flag.
authorKoichi KAMICHI <kamichi@fonts.jp>
Fri, 1 Feb 2013 12:13:21 +0000 (21:13 +0900)
committerKoichi KAMICHI <kamichi@fonts.jp>
Fri, 1 Feb 2013 12:13:21 +0000 (21:13 +0900)
kage.js

diff --git a/kage.js b/kage.js
index e6dda8c..cc98136 100755 (executable)
--- a/kage.js
+++ b/kage.js
@@ -8,6 +8,13 @@ function Kage(size){
   }\r
   Kage.prototype.makeGlyph = makeGlyph;\r
   \r
+  function makeGlyph2(polygons, data){ // void\r
+    if(data != ""){\r
+       this.drawStrokesArray(polygons, this.adjustKirikuchi(this.adjustUroko2(this.adjustUroko(this.adjustKakato(this.adjustTate(this.adjustMage(this.adjustHane(this.getEachStrokes(data)))))))));\r
+    }\r
+  }\r
+  Kage.prototype.makeGlyph2 = makeGlyph2;\r
+  \r
   function getEachStrokes(glyphData){ // strokes array\r
     var strokesArray = new Array();\r
     var strokes = glyphData.split("$");\r
@@ -34,7 +41,9 @@ function Kage(size){
                                                   Math.floor(columns[3]),\r
                                                   Math.floor(columns[4]),\r
                                                   Math.floor(columns[5]),\r
-                                                  Math.floor(columns[6]))\r
+                                                  Math.floor(columns[6]),\r
+                                                  Math.floor(columns[1]),\r
+                                                  Math.floor(columns[2]))\r
                             );\r
         }\r
       }\r
@@ -43,10 +52,27 @@ function Kage(size){
   }\r
   Kage.prototype.getEachStrokes = getEachStrokes;\r
   \r
-  function getEachStrokesOfBuhin(buhin, x1, y1, x2, y2){\r
+  function getEachStrokesOfBuhin(buhin, x1, y1, x2, y2, a1, a2){\r
     var temp = this.getEachStrokes(buhin);\r
     var result = new Array();\r
+    var box = getBox(buhin);\r
     for(var i = 0; i < temp.length; i++){\r
+\r
+       var sx = a1;\r
+       var sy = a2;\r
+       if(sx != 0 || sy != 0){\r
+           temp[i][3] = stretch(sx, temp[i][3], box.minX, box.maxX);\r
+           temp[i][4] = stretch(sy, temp[i][4], box.minY, box.maxY);\r
+           temp[i][5] = stretch(sx, temp[i][5], box.minX, box.maxX);\r
+           temp[i][6] = stretch(sy, temp[i][6], box.minY, box.maxY);\r
+           if(temp[i][0] != 99){\r
+               temp[i][7] = stretch(sx, temp[i][7], box.minX, box.maxX);       \r
+               temp[i][8] = stretch(sy, temp[i][8], box.minY, box.maxY);\r
+           }\r
+           temp[i][9] = stretch(sx, temp[i][9], box.minX, box.maxX);\r
+           temp[i][10] = stretch(sy, temp[i][10], box.minY, box.maxY);\r
+       }\r
+\r
       result.push([temp[i][0],\r
                    temp[i][1],\r
                    temp[i][2],\r
@@ -65,29 +91,32 @@ function Kage(size){
   \r
   function adjustHane(sa){ // strokesArray\r
       for(var i = 0; i < sa.length; i++){\r
-         if((sa[i][0] == 1 || sa[i][0] == 2) && sa[i][2] == 4){\r
+         if((sa[i][0] == 1 || sa[i][0] == 2 || sa[i][0] == 6) && sa[i][2] == 4){\r
              var lpx; // lastPointX\r
              var lpy; // lastPointY\r
              if(sa[i][0] == 1){\r
                  lpx = sa[i][5];\r
                  lpy = sa[i][6];\r
-             } else {\r
+             } else if(sa[i][0] == 2){\r
                  lpx = sa[i][7];\r
                  lpy = sa[i][8];\r
+             } else {\r
+                 lpx = sa[i][9];\r
+                 lpy = sa[i][10];\r
              }\r
              var mn = Infinity; // mostNear\r
              if(lpx + 18 < 100){\r
                  mn = lpx + 18;\r
              }\r
              for(var j = 0; j < sa.length; j++){\r
-                 if(i != j && sa[j][0] == 1 && sa[j][3] == sa[j][5] && sa[j][4] <= lpy && sa[j][6] >= lpy){\r
-                     if(lpx - sa[j][3] < 900){\r
+                 if(i != j && sa[j][0] == 1 && sa[j][3] == sa[j][5] && sa[j][3] < lpx && sa[j][4] <= lpy && sa[j][6] >= lpy){\r
+                     if(lpx - sa[j][3] < 100){\r
                          mn = Math.min(mn, lpx - sa[j][3]);\r
                      }\r
                  }\r
              }\r
              if(mn != Infinity){\r
-                 sa[i][2] += Math.min(400, 400 - Math.floor(mn / 20) * 100); // 0-8 -> 0-400\r
+                 sa[i][2] += 700 - Math.floor(mn / 15) * 100; // 0-99 -> 0-700\r
              }\r
          }\r
       }\r
@@ -274,17 +303,86 @@ function Kage(size){
                          Math.floor(columns[3]),\r
                          Math.floor(columns[4]),\r
                          Math.floor(columns[5]),\r
-                         Math.floor(columns[6]));\r
+                         Math.floor(columns[6]),\r
+                         Math.floor(columns[1]),\r
+                         Math.floor(columns[2]));\r
         }\r
       }\r
     }\r
   }\r
   Kage.prototype.drawGlyph = drawGlyph;\r
   \r
-  function drawBuhin(polygons, glyph, x1, y1, x2, y2){ // void\r
+  function getBox(glyph){ // minX, minY, maxX, maxY\r
+      var a = new Object();\r
+      a.minX = 200;\r
+      a.minY = 200;\r
+      a.maxX = 0;\r
+      a.maxY = 0;\r
+      \r
+      var strokes = getEachStrokes(glyph);\r
+      for(var i = 0; i < strokes.length; i++){\r
+         if(strokes[i][0] == 0){ continue; }\r
+         a.minX = Math.min(a.minX, strokes[i][3]);\r
+         a.maxX = Math.max(a.maxX, strokes[i][3]);\r
+         a.minY = Math.min(a.minY, strokes[i][4]);\r
+         a.maxY = Math.max(a.maxY, strokes[i][4]);\r
+         a.minX = Math.min(a.minX, strokes[i][5]);\r
+         a.maxX = Math.max(a.maxX, strokes[i][5]);\r
+         a.minY = Math.min(a.minY, strokes[i][6]);\r
+         a.maxY = Math.max(a.maxY, strokes[i][6]);\r
+         if(strokes[i][0] == 1){ continue; }\r
+         if(strokes[i][0] == 99){ continue; }\r
+         a.minX = Math.min(a.minX, strokes[i][7]);\r
+         a.maxX = Math.max(a.maxX, strokes[i][7]);\r
+         a.minY = Math.min(a.minY, strokes[i][8]);\r
+         a.maxY = Math.max(a.maxY, strokes[i][8]);\r
+         if(strokes[i][0] == 2){ continue; }\r
+         if(strokes[i][0] == 3){ continue; }\r
+         a.minX = Math.min(a.minX, strokes[i][9]);\r
+         a.maxX = Math.max(a.maxX, strokes[i][9]);\r
+         a.minY = Math.min(a.minY, strokes[i][10]);\r
+         a.maxY = Math.max(a.maxY, strokes[i][10]);\r
+      }\r
+      return a;\r
+  }\r
+  Kage.prototype.getBox = getBox;\r
+\r
+  function stretch(dp, sp, min, max){ // interger\r
+      var p1, p2, p3, p4;\r
+      if(sp < 100){\r
+         p1 = min;\r
+         p3 = min;\r
+         p2 = 100;\r
+         p4 = 100 + dp;\r
+      } else {\r
+         p1 = 100;\r
+         p3 = 100 + dp;\r
+         p2 = max;\r
+         p4 = max;\r
+      }\r
+      return Math.floor(((sp - p1) / (p2 - p1)) * (p4 - p3) + p3);\r
+  }\r
+  Kage.prototype.stretch = stretch;\r
+\r
+  function drawBuhin(polygons, glyph, x1, y1, x2, y2, sx, sy){ // void\r
     var strokes = glyph.split("$");\r
+    var box = getBox(glyph);\r
     for(var i = 0; i < strokes.length; i++){\r
       var columns = strokes[i].split(":");\r
+\r
+       if(sx != 0 || sy != 0){\r
+           columns[3] = stretch(sx, columns[3], box.minX, box.maxX);\r
+           columns[4] = stretch(sy, columns[4], box.minY, box.maxY);\r
+           columns[5] = stretch(sx, columns[5], box.minX, box.maxX);\r
+           columns[6] = stretch(sy, columns[6], box.minY, box.maxY);\r
+           if(columns[0] != 99){\r
+               columns[7] = stretch(sx, columns[7], box.minX, box.maxX);\r
+               columns[8] = stretch(sy, columns[8], box.minY, box.maxY);\r
+           }\r
+           columns[9] = stretch(sx, columns[9], box.minX, box.maxX);\r
+           columns[10] = stretch(sy, columns[10], box.minY, box.maxY);\r
+       }\r
+\r
       if(Math.floor(columns[0]) != 99){\r
         dfDrawFont(this, polygons,\r
                    Math.floor(columns[0]),\r
@@ -305,7 +403,9 @@ function Kage(size){
                          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
+                         y1 + Math.floor(columns[6]) * (y2 - y1) / 200,\r
+                        Math.floor(columns[1]),\r
+                        Math.floor(columns[2]));\r
         }\r
       }\r
     }\r
@@ -372,3 +472,4 @@ function Kage(size){
   \r
   return this;\r
 }\r
+\r