(1)Make fatten the bezier curve (2)Adjust box's Kakato (3)Update sample
[chise/kage.git] / kagecgi / kagecgi.c
index 6fce983..d14e1d5 100755 (executable)
-//kagecgi.c\r
-//\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <png.h>\r
-#include <glib.h>\r
-#include "kage.h"\r
-#include "kagecgi.h"\r
-\r
-int main(int argc, char *argv[]){\r
-       GString *tmp1, *tmp2, *test1, *test2, *filename;\r
-       FILE *err, *fp;\r
-       char errbuf[errorFileSize];\r
-       char *pos, *cur;\r
-       int dummy;\r
-       int i;\r
-\r
-       dummy = initDB();\r
-\r
-       //set default\r
-       kShotai = kMincho;\r
-//     kShotai = kGothic;\r
-//     kDesign = 0; //jp\r
-       kSize = 200;\r
-       kType = 0; //png\r
-       kInput = 0; //ids or direct\r
-       kResultText = g_string_new("");\r
-       kMode = 0;\r
-       \r
-       //set some param by request\r
-//     tmp1 = g_string_new((gchar *)argv[1]);\r
-       tmp1 = g_string_new((gchar *)getenv("QUERY_STRING"));\r
-       pos = tmp1->str;\r
-       \r
-       //separate token\r
-       if(tmp1->len != 0){\r
-               while(1){\r
-                       cur = strchr(pos, '&');\r
-                       tmp2 = g_string_new(pos);\r
-                       if(cur != NULL) g_string_set_size(tmp2, cur - pos);\r
-                       //got request string\r
-//                     if(strncmp(tmp2->str, "design=jp", 9) == 0) kDesign = 0;\r
-//                     else if(strncmp(tmp2->str, "design=cs", 9) == 0) kDesign = 10;\r
-//                     else if(strncmp(tmp2->str, "design=ct", 9) == 0) kDesign = 11;\r
-//                     else if(strncmp(tmp2->str, "design=kr", 9) == 0) kDesign = 20;\r
-//                     else if(strncmp(tmp2->str, "design=vn", 9) == 0) kDesign = 30;\r
-//                     else if(strncmp(tmp2->str, "design=un", 9) == 0) kDesign = 40;\r
-//                     else if(strncmp(tmp2->str, "shotai=mincho", 13) == 0) kShotai = kMincho;\r
-                       if(strncmp(tmp2->str, "shotai=mincho", 13) == 0) kShotai = kMincho;\r
-                       else if(strncmp(tmp2->str, "shotai=gothic", 13) == 0) kShotai = kGothic;\r
-                       else if(strncmp(tmp2->str, "shotai=skeleton", 15) == 0) kShotai = kGothic;\r
-                       else if(strncmp(tmp2->str, "type=png", 8) == 0) kType = 0;\r
-                       else if(strncmp(tmp2->str, "type=svg", 8) == 0) kType = 1;\r
-                       else if(strncmp(tmp2->str, "type=eps", 8) == 0) kType = 2;\r
-                       else if(strncmp(tmp2->str, "type=raw", 8) == 0) kType = 3;\r
-                       else if(strncmp(tmp2->str, "input=ids", 9) == 0) kInput = 0;\r
-                       else if(strncmp(tmp2->str, "input=directwithadjust", 22) == 0) kInput = 2;\r
-                       else if(strncmp(tmp2->str, "input=direct", 12) == 0) kInput = 1;\r
-                       else if(strncmp(tmp2->str, "size=24", 7) == 0) kSize = 24;\r
-                       else if(strncmp(tmp2->str, "size=200", 8) == 0) kSize = 200;\r
-                       else test1 = g_string_new(tmp2->str);\r
-                       if(cur == NULL) break;\r
-                       pos = cur + 1;\r
-               }\r
-       }\r
-       else{ // redirected request\r
-               kInput = 0;\r
-               tmp1 = g_string_new((gchar *)getenv("REDIRECT_URL"));\r
-               pos = tmp1->str;\r
-               while(1){\r
-                       cur = strchr(pos, '/');\r
-                       tmp2 = g_string_new(pos);\r
-                       if(cur != NULL) g_string_set_size(tmp2, cur - pos);\r
-                       //got request string\r
-//                     if(strncmp(tmp2->str, "jp", 2) == 0) kDesign = 0;\r
-//                     else if(strncmp(tmp2->str, "cs", 2) == 0) kDesign = 10;\r
-//                     else if(strncmp(tmp2->str, "ct", 2) == 0) kDesign = 11;\r
-//                     else if(strncmp(tmp2->str, "kr", 2) == 0) kDesign = 20;\r
-//                     else if(strncmp(tmp2->str, "vn", 2) == 0) kDesign = 30;\r
-//                     else if(strncmp(tmp2->str, "un", 2) == 0) kDesign = 40;\r
-//                     else if(strncmp(tmp2->str, "mincho", 6) == 0) kShotai = kMincho;\r
-                       if(strncmp(tmp2->str, "mincho", 6) == 0) kShotai = kMincho;\r
-                       else if(strncmp(tmp2->str, "gothic", 6) == 0) kShotai = kGothic;\r
-                       else if(strncmp(tmp2->str, "skeleton", 8) == 0) kShotai = kGothic;\r
-                       else if(strncmp(tmp2->str, "v0.4", 4) == 0);\r
-                       else test1 = g_string_new(tmp2->str);\r
-                       if(cur == NULL) break;\r
-                       pos = cur + 1;\r
-               }\r
-               if(strncmp(test1->str + test1->len - 4, ".png", 4) == 0) kType = 0;\r
-               if(strncmp(test1->str + test1->len - 4, ".svg", 4) == 0) kType = 1;\r
-               if(strncmp(test1->str + test1->len - 4, ".eps", 4) == 0) kType = 2;\r
-               if(strncmp(test1->str + test1->len - 4, ".raw", 4) == 0) kType = 3;\r
-               g_string_set_size(test1, test1->len - 4);\r
-       }\r
-       \r
-       //clear result buffer\r
-       test2 = g_string_new("");\r
-       if(kType == 2){\r
-               g_string_append(kResultText, "%!PS-Adobe-3.0 EPSF-3.0\n");\r
-               g_string_append(kResultText, "%%BoundingBox: 0 -208 1024 816\n");\r
-               g_string_append(kResultText, "%%Pages: 0\n");\r
-               g_string_append(kResultText, "%%Title: ");\r
-               g_string_append(kResultText, test1->str);\r
-               g_string_append(kResultText, "\n");\r
-               g_string_append(kResultText, "%%Creator: KAGE System\n");\r
-               g_string_append(kResultText, "%%CreationDate: 00:00 1-1-2004\n");\r
-               g_string_append(kResultText, "%%EndComments\n");\r
-               g_string_append(kResultText, "%%EndProlog\n");\r
-               g_string_append(kResultText, "%%Page \"");\r
-               g_string_append(kResultText, test1->str);\r
-               g_string_append(kResultText, "\" 1\n");\r
-               g_string_append(kResultText, "newpath\n");\r
-       }\r
-       kageCanvas = initPng(canvasWidth, canvasHeight);\r
-       if(kInput == 0) generateGlyph(test1, test2);\r
-       else{\r
-         convert99(test1, test2);\r
-         //      g_string_append(test2, test1->str);\r
-       }\r
-\r
-       if(kType == 0){ //png(image)\r
-               if(test2->len != 0){\r
-                 if(kInput != 1){ //0 and 2\r
-                   test2 = CalcSizes(test2, 1);\r
-                 }\r
-                       DrawBox();\r
-                       drawGlyph(test2, 0);\r
-                       //output to file\r
-                       filename = g_string_new(pngFilePath);\r
-//                     if(kDesign == 0) g_string_append(filename, "jp/");\r
-//                     else if(kDesign == 10) g_string_append(filename, "cs/");\r
-//                     else if(kDesign == 11) g_string_append(filename, "ct/");\r
-//                     else if(kDesign == 20) g_string_append(filename, "kr/");\r
-//                     else if(kDesign == 30) g_string_append(filename, "vn/");\r
-//                     else if(kDesign == 40) g_string_append(filename, "un/");\r
-                       if(kShotai == kMincho) g_string_append(filename, "mincho/");\r
-                       else if(kShotai == kGothic) g_string_append(filename, "gothic/");//skeleton??\r
-                       g_string_append(filename, test1->str);\r
-                       g_string_append(filename, ".png");\r
-                       \r
-//skip for adjustment mode\r
-//                     fp = fopen(filename->str, "w");\r
-//                     writePng(pngWidth, pngHeight, kageCanvas, fp);\r
-//                     fclose(fp);\r
-                       //output to stdout\r
-                       fprintf(stdout, "Content-type: image/png\n\n");\r
-                       writePng(pngWidth, pngHeight, kageCanvas, stdout);\r
-                       //done\r
-                       closePng(pngWidth, pngHeight, kageCanvas);\r
-               }\r
-               else{\r
-                       err = fopen("error.png", "r");\r
-                       fread(errbuf, sizeof(char), errorFileSize, err);\r
-               //      printf("An error occurred.\r\n");\r
-                       fprintf(stdout, "Content-type: image/png\n\n");\r
-                       fwrite(errbuf, sizeof(char), errorFileSize, stdout);\r
-                       fclose(err);\r
-               }\r
-       }\r
-       else if(kType == 1){ //svg(vector graphics)\r
-       }\r
-       else if(kType == 2){ //eps(vector graphics)\r
-               if(test2->len != 0){\r
-                       test2 = CalcSizes(test2, 1);\r
-                       kMode = 1;\r
-                       drawGlyph(test2, 0);\r
-                       g_string_append(kResultText, "fill\n");\r
-                       g_string_append(kResultText, "%%EOF\n");\r
-                       fprintf(stdout, "Content-type: application/postscript\n\n");\r
-                       fprintf(stdout, "%s", kResultText->str);\r
-               }\r
-               else{\r
-                       fprintf(stdout, "Content-type: text/plain\n\n");\r
-                       fprintf(stdout, "An error occurred.");\r
-               }\r
-       }\r
-       else{ //raw(text)\r
-               if(test2->len != 0){\r
-                       fprintf(stdout, "Content-type: text/plain\n\n");\r
-                       fprintf(stdout, "result=%s", test2->str);\r
-               }\r
-               else{\r
-                       fprintf(stdout, "Content-type: text/plain\n\n");\r
-                       fprintf(stdout, "result=nodata");\r
-               }\r
-       }\r
-       dummy = closeDB();\r
-       \r
-       return 0;\r
-}\r
-\r
+//kagecgi.c
+//
+
+#include "kage.h"
+#include "kagecgi.h"
+#include "sysdep.h"
+
+int main(int argc, char *argv[]){
+  KGString *tmp1, *tmp2, *test1, *test2, *filename;
+  FILE *err;
+  char errbuf[errorFileSize];
+  char *pos, *cur;
+  int dummy;
+  int type;
+  
+  dummy = initDB();
+  
+  //set default
+  kShotai = kMincho;
+  //kShotai = kGothic;
+  kSize = 200;
+  kType = 0; //png
+  kInput = 0; //ids or direct
+  kResultText = kg_string_new("");
+  kMode = 0;
+  
+  //confirm request
+  type = 0;
+  //GET request
+  if(type == 0){
+    tmp1 = kg_string_new((kgchar *)getenv("QUERY_STRING"));
+    if(tmp1->len != 0) type = 2;
+  }
+  //argv(detect after GET request)
+  if(type == 0){
+    tmp1 = kg_string_new((kgchar *)argv[1]);
+    if(tmp1->len != 0) type = 1;
+  }
+  //redirect
+  if(type == 0){
+    tmp1 = kg_string_new((kgchar *)getenv("REDIRECT_URL"));
+    if(tmp1->len != 0) type = 3;
+  }
+  //error
+  if(type == 0){
+    fprintf(stderr, "Request Error.\n");
+    return 0;
+  }
+  pos = tmp1->str;
+  
+  //separate token
+  if(type == 1 || type == 2){ //argv or GET request
+    while(1){
+      cur = strchr(pos, '&');
+      tmp2 = kg_string_new(pos);
+      if(cur != NULL) kg_string_set_size(tmp2, cur - pos);
+      //got request string
+      if(strncmp(tmp2->str, "shotai=mincho", 13) == 0) kShotai = kMincho;
+      else if(strncmp(tmp2->str, "shotai=gothic", 13) == 0) kShotai = kGothic;
+      else if(strncmp(tmp2->str, "shotai=skeleton", 15) == 0) kShotai = kGothic;
+      else if(strncmp(tmp2->str, "type=png", 8) == 0) kType = 0;
+      else if(strncmp(tmp2->str, "type=svg", 8) == 0) kType = 1;
+      else if(strncmp(tmp2->str, "type=eps", 8) == 0) kType = 2;
+      else if(strncmp(tmp2->str, "type=raw", 8) == 0) kType = 3;
+      else if(strncmp(tmp2->str, "input=ids", 9) == 0) kInput = 0;
+      else if(strncmp(tmp2->str, "input=directwithadjust", 22) == 0) kInput = 2;
+      else if(strncmp(tmp2->str, "input=direct", 12) == 0) kInput = 1;
+      else if(strncmp(tmp2->str, "size=24", 7) == 0) kSize = 24;
+      else if(strncmp(tmp2->str, "size=200", 8) == 0) kSize = 200;
+      else test1 = kg_string_new(tmp2->str);
+      if(cur == NULL) break;
+      pos = cur + 1;
+    }
+  }
+  else{ // redirected request
+    kInput = 0;
+    while(1){
+      cur = strchr(pos, '/');
+      tmp2 = kg_string_new(pos);
+      if(cur != NULL) kg_string_set_size(tmp2, cur - pos);
+      //got request string
+      if(strncmp(tmp2->str, "mincho", 6) == 0) kShotai = kMincho;
+      else if(strncmp(tmp2->str, "gothic", 6) == 0) kShotai = kGothic;
+      else if(strncmp(tmp2->str, "skeleton", 8) == 0) kShotai = kGothic;
+      else if(strncmp(tmp2->str, "v0.4", 4) == 0);
+      else test1 = kg_string_new(tmp2->str);
+      if(cur == NULL) break;
+      pos = cur + 1;
+    }
+    if(strncmp(test1->str + test1->len - 4, ".png", 4) == 0) kType = 0;
+    if(strncmp(test1->str + test1->len - 4, ".svg", 4) == 0) kType = 1;
+    if(strncmp(test1->str + test1->len - 4, ".eps", 4) == 0) kType = 2;
+    if(strncmp(test1->str + test1->len - 4, ".raw", 4) == 0) kType = 3;
+    kg_string_set_size(test1, test1->len - 4);
+  }
+  
+  //clear result buffer
+  test2 = kg_string_new("");
+  if(kType == 1){ //svg
+    kg_string_append(kResultText, "<?xml version=\"1.0\"?>\n");
+    kg_string_append(kResultText, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n");
+    kg_string_append(kResultText, "<svg width=\"1024\" height=\"1024\" viewBox=\"0 0 1024 1024\">");
+    kg_string_append(kResultText, "<g style=\"fill: black; stroke: black\">");
+  }
+  else if(kType == 2){ //eps
+    kg_string_append(kResultText, "%!PS-Adobe-3.0 EPSF-3.0\n");
+    kg_string_append(kResultText, "%%BoundingBox: 0 -208 1024 816\n");
+    kg_string_append(kResultText, "%%Pages: 0\n");
+    kg_string_append(kResultText, "%%Title: ");
+    kg_string_append(kResultText, test1->str);
+    kg_string_append(kResultText, "\n");
+    kg_string_append(kResultText, "%%Creator: KAGE System\n");
+    kg_string_append(kResultText, "%%CreationDate: 00:00 1-1-2004\n");
+    kg_string_append(kResultText, "%%EndComments\n");
+    kg_string_append(kResultText, "%%EndProlog\n");
+    kg_string_append(kResultText, "%%Page \"");
+    kg_string_append(kResultText, test1->str);
+    kg_string_append(kResultText, "\" 1\n");
+    kg_string_append(kResultText, "newpath\n");
+  }
+  kageCanvas = initPng(canvasWidth, canvasHeight);
+  if(kInput == 0) generateGlyph(test1, test2);
+  else{
+    convert99(test1, test2);
+    //   kg_string_append(test2, test1->str);
+  }
+  
+  if(test2->len != 0) test2 = finalAdjustment(test2);
+  
+  if(kType == 0){ //png(image)
+    if(test2->len != 0){
+      if(kInput != 1){ //0 and 2
+       test2 = CalcSizes(test2, 1);
+      }
+      DrawBox();
+      drawGlyph(test2, DRAW_GLYPH_MODE_NORMAL);
+      //output to file
+      filename = kg_string_new(pngFilePath);
+      if(kShotai == kMincho) kg_string_append(filename, "mincho/");
+      else if(kShotai == kGothic) kg_string_append(filename, "gothic/");//skeleton??
+      kg_string_append(filename, test1->str);
+      kg_string_append(filename, ".png");
+      
+      //skip for adjustment mode
+      //fp = fopen(filename->str, "w");
+      //writePng(pngWidth, pngHeight, kageCanvas, fp);
+      //fclose(fp);
+      //output to stdout
+      if(type != 1) fprintf(stdout, "Content-type: image/png\n\n");
+      writePng(pngWidth, pngHeight, kageCanvas, stdout);
+      //done
+      closePng(pngWidth, pngHeight, kageCanvas);
+    }
+    else{
+      err = fopen(errorFileName, "r");
+      fread(errbuf, sizeof(char), errorFileSize, err);
+      //printf("An error occurred.\r\n");
+      if(type != 1) fprintf(stdout, "Content-type: image/png\n\n");
+      fwrite(errbuf, sizeof(char), errorFileSize, stdout);
+      fclose(err);
+    }
+  }
+  else if(kType == 1){ //svg(vector graphics)
+    if(test2->len != 0){
+      test2 = CalcSizes(test2, 1);
+      kMode = 1;
+      drawGlyph(test2, DRAW_GLYPH_MODE_NORMAL);
+      kg_string_append(kResultText, "</g></svg>\n");
+      if(type != 1) fprintf(stdout, "Content-type: image/svg-xml\n\n");
+      fprintf(stdout, "%s", kResultText->str);
+    }
+    else{
+      if(type != 1) fprintf(stdout, "Content-type: text/plain\n\n");
+      fprintf(stdout, "An error occurred.");
+    }
+  }
+  else if(kType == 2){ //eps(vector graphics)
+    if(test2->len != 0){
+      test2 = CalcSizes(test2, 1);
+      kMode = 2;
+      drawGlyph(test2, DRAW_GLYPH_MODE_NORMAL);
+      kg_string_append(kResultText, "fill\n");
+      kg_string_append(kResultText, "%%EOF\n");
+      if(type != 1) fprintf(stdout, "Content-type: application/postscript\n\n");
+      fprintf(stdout, "%s", kResultText->str);
+    }
+    else{
+      if(type != 1) fprintf(stdout, "Content-type: text/plain\n\n");
+      fprintf(stdout, "An error occurred.");
+    }
+  }
+  else{ //raw(text)
+    
+    if(test2->len != 0){
+      test2 = CalcSizes(test2, 1);
+      if(type != 1) fprintf(stdout, "Content-type: text/plain\n\n");
+      fprintf(stdout, "result=%s", test2->str);
+    }
+    else{
+      if(type != 1) fprintf(stdout, "Content-type: text/plain\n\n");
+      fprintf(stdout, "result=nodata");
+    }
+  }
+  dummy = closeDB();
+  
+  return 0;
+}
+