PageRenderTime 53ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/SRC/TWPRINT/CPI.C

http://thai-writer.googlecode.com/
C | 275 lines | 195 code | 36 blank | 44 comment | 35 complexity | 2dea7a17143d822f429ba8efc16dac3f MD5 | raw file
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "inc.h"
  4. /* -------------------------------------------------------------
  5. Routine to set actual character width (character per inch).
  6. characters per inch (cpi) is stored in global int 'cpi'.
  7. the parameter is the buffer store dot data size[1920,3264].
  8. -------------------------------------------------------------
  9. ch/inch dot/char increasingdot process(after/before)
  10. 1 240 216 10/1
  11. 2 120 96 5/1
  12. 3 80 56 10/3
  13. 4 60 36 5/2
  14. 5 48 24 2/1
  15. 6 40 16 5/3
  16. 7 34 10 17/12
  17. 8 30 6 5/4
  18. 9 27 3 9/8
  19. ---------------------------------------------------
  20. 10 24 0 NONE
  21. ---------------------------------------------------
  22. 11 22 - 2 11/12
  23. 12 20 - 4 5/6
  24. 13 18 - 6 3/4
  25. 14 17 - 7 17/24
  26. 15 16 - 8 2/3
  27. 16 15 - 9 15/24
  28. 17 14 -10 7/12
  29. 18 13 -11 13/24
  30. 19 12 -12 1/2
  31. 20 12 -12 1/2
  32. ------------------------------------------------------------ */
  33. /*
  34. void waittest(void)
  35. {
  36. while (ebioskey(1) == 0);
  37. }
  38. */
  39. void charwidth(char buf1[])
  40. {
  41. extern int maxdot; /* already defined in prt.c and pmenu.c */
  42. extern int maxbuffer; /* already defined in pmenu.c */
  43. extern int cpi ; /* already defined in prt.c and pmenu.c */
  44. char *buf2;
  45. char cf[21];
  46. register int i, j, k, m;
  47. buf2 = (char *) calloc(maxdot + 100, sizeof(char));
  48. i = 0;
  49. j = 0;
  50. switch(cpi)
  51. {
  52. case 0 :
  53. break;
  54. case 1 : /* term '10/cpi' generate number */
  55. case 2 : /* of times the same dot appears */
  56. case 5 :
  57. while((i < maxbuffer) && (j < maxdot))
  58. {
  59. k = j + 10 / cpi;
  60. for(; j < k; j++)
  61. buf2[j] = buf1[i];
  62. i++;
  63. }
  64. memmove(buf1, buf2, maxdot);
  65. break;
  66. case 3 :
  67. while(( i < maxbuffer) && ( j < maxdot))
  68. {
  69. k = j + 3; /* 3 times repeat */
  70. for(; j < k; j++)
  71. buf2[j] = buf1[i];
  72. i++;
  73. k = j + 3; /* 3 times repeat */
  74. for(; j < k; j++)
  75. buf2[j] = buf1[i];
  76. i++;
  77. k = j + 4; /* 4 times repeat */
  78. for(; j < k; j++)
  79. buf2[j] = buf1[i];
  80. i++;
  81. }
  82. memmove(buf1, buf2, maxdot);
  83. break;
  84. case 4 :
  85. while(( i < maxbuffer) && ( j < maxdot))
  86. {
  87. k = j + 2; /* 2 times repeat */
  88. for(; j < k; j++)
  89. buf2[j] = buf1[i];
  90. i++;
  91. k = j + 3; /* 3 times repeat */
  92. for(; j < k; j++)
  93. buf2[j] = buf1[i];
  94. i++;
  95. }
  96. memmove(buf1, buf2, maxdot);
  97. break;
  98. case 6 :
  99. while((i < maxbuffer) && (j < maxdot))
  100. {
  101. k = j + 2; /* 2 times repeat */
  102. for(; j < k; j++)
  103. buf2[j] = buf1[i];
  104. i++;
  105. k = j + 2; /* 2 times repeat */
  106. for(; j < k; j++)
  107. buf2[j] = buf1[i];
  108. i++;
  109. k = j + 1; /* 1 times repeat */
  110. for(; j < k; j++)
  111. buf2[j] = buf1[i];
  112. i++;
  113. }
  114. memmove(buf1, buf2, maxdot);
  115. break;
  116. case 7 :
  117. while(( i < maxbuffer) && ( j < maxdot))
  118. {
  119. for(m = 0; m < 5; m++)
  120. {
  121. k = i + 1; /* 1 times iteration */
  122. for(; i < k;)
  123. buf2[j++] = buf1[i++];
  124. buf2[j++] = buf1[i];
  125. buf2[j++] = buf1[i++]; /* 1 dot repeat */
  126. }
  127. buf2[j++] = buf1[i++];
  128. buf2[j++] = buf1[i++];
  129. }
  130. memmove(buf1, buf2, maxdot);
  131. break;
  132. case 8 : /* term '3 + 4 * (cpi - 8)' refer to 3, 7 accordingly */
  133. case 9 :
  134. while((i < maxbuffer) && (j < maxdot))
  135. {
  136. k = i + 3 + 4 * (cpi - 8); /* 3, 7 times iteration */
  137. for(; i < k; )
  138. buf2[j++] = buf1[i++];
  139. buf2[j++] = buf1[i];
  140. buf2[j++] = buf1[i++]; /* 1 dot repeat */
  141. }
  142. memmove(buf1, buf2, maxdot);
  143. break;
  144. case 10 :
  145. break;
  146. case 11 : cf[11] = 12; /* terms (12/-576)(cpi-12)(cpi-13)(...)...(...)... */
  147. case 12 : cf[12] = 6; /* + ( 6/ 168)(cpi-11)(cpi-13)(...)...(...)... */
  148. case 13 : cf[13] = 4; /* + ... */
  149. case 15 : cf[15] = 3; /* + ( 2/1520)(cpi-11)(cpi-12)..(..)..(cpi-19) */
  150. case 19 : cf[19] = 2; /* refer to 12,6,4,3,2,2 accordingly */
  151. case 20 : cf[20] = 2;
  152. /*
  153. while((i < maxbuffer) && (j < maxdot))
  154. {
  155. k = i - 1 + cf[cpi];
  156. for(; i < k; )
  157. buf2[j++] = buf1[i++];
  158. j--;
  159. buf2[j++] |= buf1[i++]; */ /* 1 dot deplete */
  160. /* } */
  161. while((i < maxbuffer) && (j < maxdot))
  162. {
  163. k = i - 1 + cf[cpi];
  164. for(; i < k; )
  165. buf2[j++] |= buf1[i++];
  166. j--;
  167. buf2[j++] |= buf1[i];
  168. buf2[j] |= buf1[i++]; /* 1 dot deplete */
  169. }
  170. memmove(buf1, buf2, maxdot);
  171. break;
  172. case 14 :
  173. while((i < maxbuffer) && (j < maxdot))
  174. {
  175. for(m = 0; m < 7; m++)
  176. {
  177. k = i + 2;
  178. for(; i < k; )
  179. buf2[j++] = buf1[i++];
  180. i++; /* ignore 1 dot of 3 */
  181. }
  182. k = i + 3;
  183. for(; i < k; )
  184. buf2[j++] = buf1[i++];
  185. }
  186. memmove(buf1, buf2, maxdot);
  187. break;
  188. case 16 :
  189. while((i < maxbuffer) && (j < maxdot))
  190. {
  191. for(m = 0; m < 7; m++)
  192. {
  193. k = i + 2;
  194. for(; i < k; )
  195. buf2[j++] = buf1[i++];
  196. i++; /* ignore 1 dot of 3 */
  197. }
  198. i++; i++;
  199. buf2[j++] = buf1[i++];
  200. }
  201. memmove(buf1, buf2, maxdot);
  202. break;
  203. case 17 :
  204. while((i < maxbuffer) && (j < maxdot))
  205. {
  206. for(m = 0; m < 5; m++)
  207. {
  208. k = i +1 ;
  209. for(; i < k;)
  210. buf2[j++] = buf1[i++];
  211. i++; /* ignore 1 dot of 2 */
  212. }
  213. k = i + 2;
  214. for(; i < k; )
  215. buf2[j++] = buf1[i++];
  216. }
  217. memmove(buf1, buf2, maxdot);
  218. break;
  219. case 18 :
  220. while((i < maxbuffer) && (j < maxdot))
  221. {
  222. for(m = 0; m < 11; m++)
  223. {
  224. k = i + 1;
  225. for(; i < k; )
  226. buf2[j++] = buf1[i++];
  227. i++; /* ignore 1 dot of 2 */
  228. }
  229. k = i + 2;
  230. for(; i < k;)
  231. buf2[j++] = buf1[i++];
  232. }
  233. memmove(buf1, buf2, maxdot);
  234. break;
  235. default :
  236. break;
  237. }
  238. free(buf2);
  239. }