PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/SomethingSpacialSL4/SomethingSpacial/Helpers/BarcodeEngine.cs

#
C# | 870 lines | 638 code | 217 blank | 15 comment | 39 complexity | e88d6d4f9dbf76661f117a3f99f9b792 MD5 | raw file
  1. /* Copyright (C) Elisy.Net 2008 http://code.elisy.net
  2. This program is free software: you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation, either version 3 of the License, or
  5. (at your option) any later version.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program. If not, see <http://www.gnu.org/licenses/>.
  12. */
  13. using System;
  14. using System.Windows;
  15. using System.Windows.Controls;
  16. using System.Windows.Documents;
  17. using System.Windows.Ink;
  18. using System.Windows.Input;
  19. using System.Windows.Media;
  20. using System.Windows.Media.Animation;
  21. using System.Windows.Shapes;
  22. namespace Elisy.Barcode
  23. {
  24. public class BarcodeEngine
  25. {
  26. // Methods
  27. public string Codabar(string a)
  28. {
  29. string s = "";
  30. for (int i = 0; i < a.Length; i++)
  31. s = s + this.Code_Char(this.Codabar_Ch(a.Substring(i, 1)));
  32. return (this.Code_Char(this.Codabar_Ch("d")) + s + this.Code_Char(this.Codabar_Ch("e")));
  33. }
  34. private string Codabar_Ch(string ch)
  35. {
  36. switch (ch)
  37. {
  38. case "0":
  39. return "11111331";
  40. case "1":
  41. return "11113311";
  42. case "2":
  43. return "11131131";
  44. case "3":
  45. return "33111111";
  46. case "4":
  47. return "11311311";
  48. case "5":
  49. return "31111311";
  50. case "6":
  51. return "13111131";
  52. case "7":
  53. return "13113111";
  54. case "8":
  55. return "13311111";
  56. case "9":
  57. return "31131111";
  58. case "-":
  59. return "11133111";
  60. case "$":
  61. return "11331111";
  62. case ":":
  63. return "31113131";
  64. case "/":
  65. return "31311131";
  66. case ".":
  67. return "31313111";
  68. case "+":
  69. return "11313131";
  70. case "a":
  71. return "11331111";
  72. case "b":
  73. return "13131131";
  74. case "c":
  75. return "11131331";
  76. case "d":
  77. return "11133311";
  78. case "t":
  79. return "11331311";
  80. case "n":
  81. return "13131131";
  82. case "*":
  83. return "11131331";
  84. case "e":
  85. return "11133311";
  86. }
  87. return "";
  88. }
  89. public string Code128(string a)
  90. {
  91. int[] bCode = new int[0x400];
  92. int bInd = 0;
  93. string curMode = "";
  94. int i = 0;
  95. int lenA = a.Length;
  96. while (i < lenA)
  97. {
  98. byte ch = (byte)a[i];
  99. i++;
  100. if (ch <= 127)
  101. {
  102. byte ch2;
  103. if (i < lenA)
  104. ch2 = (byte)a[i];
  105. else
  106. ch2 = 0;
  107. if ((((0x30 <= ch) & (ch <= 0x39)) & (0x30 <= ch2)) & (ch2 <= 0x39))
  108. {
  109. i++;
  110. if (bInd == 0)
  111. {
  112. curMode = "C";
  113. bCode[bInd] = 0x69;
  114. bInd++;
  115. }
  116. else if (curMode != "C")
  117. {
  118. curMode = "C";
  119. bCode[bInd] = 0x63;
  120. bInd++;
  121. }
  122. bCode[bInd] = Convert.ToInt16(string.Format("{0}{1}", (char)ch, (char)ch2));
  123. bInd++;
  124. }
  125. else
  126. {
  127. if (bInd == 0)
  128. {
  129. if (ch < 0x20)
  130. {
  131. curMode = "A";
  132. bCode[bInd] = 0x67;
  133. bInd++;
  134. }
  135. else
  136. {
  137. curMode = "B";
  138. bCode[bInd] = 0x68;
  139. bInd++;
  140. }
  141. }
  142. if ((ch < 0x20) & (curMode != "A"))
  143. {
  144. curMode = "A";
  145. bCode[bInd] = 0x65;
  146. bInd++;
  147. }
  148. else if (((0x40 <= ch) & (curMode != "B")) | (curMode == "C"))
  149. {
  150. curMode = "B";
  151. bCode[bInd] = 100;
  152. bInd++;
  153. }
  154. if (ch < 0x20)
  155. {
  156. bCode[bInd] = ch + 0x40;
  157. bInd++;
  158. }
  159. else
  160. {
  161. bCode[bInd] = ch - 0x20;
  162. bInd++;
  163. }
  164. }
  165. }
  166. }
  167. int cCode = bCode[0] % 0x67;
  168. for (i = 1; i <= bInd - 1; i++)
  169. cCode = (cCode + (bCode[i] * i)) % 0x67;
  170. bCode[bInd] = cCode;
  171. bInd++;
  172. bCode[bInd] = 0x6a;
  173. bInd++;
  174. string[] barArray = new string[] {
  175. "155", "515", "551", "449", "485", "845", "458", "494", "854", "548", "584", "944", "056", "416", "452", "065",
  176. "425", "461", "560", "506", "542", "164", "524", "212", "245", "605", "641", "254", "614", "650", "119", "191",
  177. "911", "089", "809", "881", "098", "818", "890", "188", "908", "980", "01:", "092", "812", "029", "0:1", "821",
  178. "221", "182", "902", "128", "1:0", "122", "209", "281", ":01", "218", "290", ":10", "230", "5<0", ";00", "04=",
  179. "0<5", "40=", "4<1", "<05", "<41", "05<", "0=4", "41<", "4=0", "<14", "<50", "=40", "50<", "320", "=04", "830",
  180. "047", "407", "443", "074", "434", "470", "344", "704", "740", "113", "131", "311", "00;", "083", "803", "038",
  181. "0;0", "308", "380", "023", "032", "203", "302", "A", "B", "C", "@"
  182. };
  183. string s = "";
  184. for (i = 0; i <= bInd - 1; i++)
  185. s = s + this.Code_Char(this.Code_128_ID(bCode[i]));
  186. return s;
  187. }
  188. private string Code_128_ID(int id)
  189. {
  190. string s = "";
  191. switch (id)
  192. {
  193. case 0:
  194. return "212222";
  195. case 1:
  196. return "222122";
  197. case 2:
  198. return "222221";
  199. case 3:
  200. return "121223";
  201. case 4:
  202. return "121322";
  203. case 5:
  204. return "131222";
  205. case 6:
  206. return "122213";
  207. case 7:
  208. return "122312";
  209. case 8:
  210. return "132212";
  211. case 9:
  212. return "221213";
  213. case 10:
  214. return "221312";
  215. case 11:
  216. return "231212";
  217. case 12:
  218. return "112232";
  219. case 13:
  220. return "122132";
  221. case 14:
  222. return "122231";
  223. case 15:
  224. return "113222";
  225. case 0x10:
  226. return "123122";
  227. case 0x11:
  228. return "123221";
  229. case 0x12:
  230. return "223211";
  231. case 0x13:
  232. return "221132";
  233. case 20:
  234. return "221231";
  235. case 0x15:
  236. return "213212";
  237. case 0x16:
  238. return "223112";
  239. case 0x17:
  240. return "312131";
  241. case 0x18:
  242. return "311222";
  243. case 0x19:
  244. return "321122";
  245. case 0x1a:
  246. return "321221";
  247. case 0x1b:
  248. return "312212";
  249. case 0x1c:
  250. return "322112";
  251. case 0x1d:
  252. return "322211";
  253. case 30:
  254. return "212123";
  255. case 0x1f:
  256. return "212321";
  257. case 0x20:
  258. return "232121";
  259. case 0x21:
  260. return "111323";
  261. case 0x22:
  262. return "131123";
  263. case 0x23:
  264. return "131321";
  265. case 0x24:
  266. return "112313";
  267. case 0x25:
  268. return "132113";
  269. case 0x26:
  270. return "132311";
  271. case 0x27:
  272. return "211313";
  273. case 40:
  274. return "231113";
  275. case 0x29:
  276. return "231311";
  277. case 0x2a:
  278. return "112133";
  279. case 0x2b:
  280. return "112331";
  281. case 0x2c:
  282. return "132131";
  283. case 0x2d:
  284. return "113123";
  285. case 0x2e:
  286. return "113321";
  287. case 0x2f:
  288. return "133121";
  289. case 0x30:
  290. return "313121";
  291. case 0x31:
  292. return "211331";
  293. case 50:
  294. return "231131";
  295. case 0x33:
  296. return "213113";
  297. case 0x34:
  298. return "213311";
  299. case 0x35:
  300. return "213131";
  301. case 0x36:
  302. return "311123";
  303. case 0x37:
  304. return "311321";
  305. case 0x38:
  306. return "331121";
  307. case 0x39:
  308. return "312113";
  309. case 0x3a:
  310. return "312311";
  311. case 0x3b:
  312. return "332111";
  313. case 60:
  314. return "314111";
  315. case 0x3d:
  316. return "221411";
  317. case 0x3e:
  318. return "431111";
  319. case 0x3f:
  320. return "111224";
  321. case 0x40:
  322. return "111422";
  323. case 0x41:
  324. return "121124";
  325. case 0x42:
  326. return "121421";
  327. case 0x43:
  328. return "141122";
  329. case 0x44:
  330. return "141221";
  331. case 0x45:
  332. return "112214";
  333. case 70:
  334. return "112412";
  335. case 0x47:
  336. return "122114";
  337. case 0x48:
  338. return "122411";
  339. case 0x49:
  340. return "142112";
  341. case 0x4a:
  342. return "142211";
  343. case 0x4b:
  344. return "241211";
  345. case 0x4c:
  346. return "221114";
  347. case 0x4d:
  348. return "413111";
  349. case 0x4e:
  350. return "241112";
  351. case 0x4f:
  352. return "134111";
  353. case 80:
  354. return "111242";
  355. case 0x51:
  356. return "121142";
  357. case 0x52:
  358. return "121241";
  359. case 0x53:
  360. return "114212";
  361. case 0x54:
  362. return "124112";
  363. case 0x55:
  364. return "124211";
  365. case 0x56:
  366. return "411212";
  367. case 0x57:
  368. return "421112";
  369. case 0x58:
  370. return "421211";
  371. case 0x59:
  372. return "212141";
  373. case 90:
  374. return "214121";
  375. case 0x5b:
  376. return "412121";
  377. case 0x5c:
  378. return "111143";
  379. case 0x5d:
  380. return "111341";
  381. case 0x5e:
  382. return "131141";
  383. case 0x5f:
  384. return "114113";
  385. case 0x60:
  386. return "114311";
  387. case 0x61:
  388. return "411113";
  389. case 0x62:
  390. return "411311";
  391. case 0x63:
  392. return "113141";
  393. case 100:
  394. return "114131";
  395. case 0x65:
  396. return "311141";
  397. case 0x66:
  398. return "411131";
  399. case 0x67:
  400. return "211412";
  401. case 0x68:
  402. return "211214";
  403. case 0x69:
  404. return "211232";
  405. case 0x6a:
  406. return "2331112";
  407. }
  408. return s;
  409. }
  410. private string Code_2of5_Ch(string ch)
  411. {
  412. switch (ch)
  413. {
  414. case "0":
  415. return "11331";
  416. case "1":
  417. return "31113";
  418. case "2":
  419. return "13113";
  420. case "3":
  421. return "33111";
  422. case "4":
  423. return "11313";
  424. case "5":
  425. return "31311";
  426. case "6":
  427. return "13311";
  428. case "7":
  429. return "11133";
  430. case "8":
  431. return "31131";
  432. case "9":
  433. break;
  434. }
  435. return "13131";
  436. }
  437. public string Code39(string a)
  438. {
  439. string s = "";
  440. for (int i = 0; i < a.Length; i++)
  441. s = s + this.Code_Char(this.Code_39_Ch(a.Substring(i, 1)));
  442. return (this.Code_Char(this.Code_39_Ch("*")) + s + this.Code_Char(this.Code_39_Ch("*")));
  443. }
  444. private string Code_39_Ch(string ch)
  445. {
  446. switch (ch)
  447. {
  448. case "1":
  449. return "3113111131";
  450. case "2":
  451. return "1133111131";
  452. case "3":
  453. return "3133111111";
  454. case "4":
  455. return "1113311131";
  456. case "5":
  457. return "3113311111";
  458. case "6":
  459. return "1133311111";
  460. case "7":
  461. return "1113113131";
  462. case "8":
  463. return "3113113111";
  464. case "9":
  465. return "1133113111";
  466. case "0":
  467. return "1113313111";
  468. case "A":
  469. return "3111131131";
  470. case "B":
  471. return "1131131131";
  472. case "C":
  473. return "3131131111";
  474. case "D":
  475. return "1111331131";
  476. case "E":
  477. return "3111331111";
  478. case "F":
  479. return "1131331111";
  480. case "G":
  481. return "1111133131";
  482. case "H":
  483. return "3111133111";
  484. case "I":
  485. return "1131133111";
  486. case "J":
  487. return "1111333111";
  488. case "K":
  489. return "3111111331";
  490. case "L":
  491. return "1131111331";
  492. case "M":
  493. return "3131111311";
  494. case "N":
  495. return "1111311331";
  496. case "O":
  497. return "3111311311";
  498. case "P":
  499. return "1131311311";
  500. case "Q":
  501. return "1111113331";
  502. case "R":
  503. return "3111113311";
  504. case "S":
  505. return "1131113311";
  506. case "T":
  507. return "1111313311";
  508. case "U":
  509. return "3311111131";
  510. case "V":
  511. return "1331111131";
  512. case "W":
  513. return "3331111111";
  514. case "X":
  515. return "1311311131";
  516. case "Y":
  517. return "3311311111";
  518. case "Z":
  519. return "1331311111";
  520. case "-":
  521. return "1311113131";
  522. case ".":
  523. return "3311113111";
  524. case " ":
  525. return "1331113111";
  526. case "*":
  527. return "1311313111";
  528. case "$":
  529. return "1313131111";
  530. case "/":
  531. return "1313111311";
  532. case "+":
  533. return "1311131311";
  534. case "%":
  535. return "1113131311";
  536. }
  537. return "";
  538. }
  539. private string Code_Char(string a)
  540. {
  541. switch (a)
  542. {
  543. case "211412":
  544. return "A";
  545. case "211214":
  546. return "B";
  547. case "211232":
  548. return "C";
  549. case "2331112":
  550. return "@";
  551. }
  552. string s = "";
  553. int endValue = (int) Math.Round((double) ((((double) a.Length) / 2.0) - 1.0));
  554. for (int i = 0; i <= endValue; i++)
  555. {
  556. switch (a.Substring((2 * i), 2))
  557. {
  558. case "11":
  559. s = s + "0";
  560. break;
  561. case "21":
  562. s = s + "1";
  563. break;
  564. case "31":
  565. s = s + "2";
  566. break;
  567. case "41":
  568. s = s + "3";
  569. break;
  570. case "12":
  571. s = s + "4";
  572. break;
  573. case "22":
  574. s = s + "5";
  575. break;
  576. case "32":
  577. s = s + "6";
  578. break;
  579. case "42":
  580. s = s + "7";
  581. break;
  582. case "13":
  583. s = s + "8";
  584. break;
  585. case "23":
  586. s = s + "9";
  587. break;
  588. case "33":
  589. s = s + ":";
  590. break;
  591. case "43":
  592. s = s + ";";
  593. break;
  594. case "14":
  595. s = s + "<";
  596. break;
  597. case "24":
  598. s = s + "=";
  599. break;
  600. case "34":
  601. s = s + ">";
  602. break;
  603. case "44":
  604. s = s + "?";
  605. break;
  606. }
  607. }
  608. return s;
  609. }
  610. public string Interleaved2of5(string a, bool check)
  611. {
  612. int i;
  613. string d = "";
  614. for (i = 0; i < a.Length; i++)
  615. {
  616. byte ch = (byte)a[i];
  617. if ((0x30 <= ch) & (ch <= 0x39))
  618. d = d + a[i];
  619. }
  620. if ((((d.Length % 2) > 0) & !check) | (((d.Length % 2) == 0) & check))
  621. d = "0" + d;
  622. if (check)
  623. {
  624. int k = 0;
  625. for (i = 0; i < d.Length; i++)
  626. {
  627. if ((i % 2) > 0)
  628. k += Convert.ToInt16(d.Substring(i, 1)) * 3;
  629. else
  630. k += Convert.ToInt16(d.Substring(i, 1));
  631. }
  632. k = 10 - (k % 10);
  633. d = d + k.ToString();
  634. }
  635. string s = "";
  636. int endValue = (int) Math.Round((double)(d.Length / 2 - 1));
  637. for (i = 0; i <= endValue; i++)
  638. s = s + this.Code_Char(this.Interleaved_2of5_Pair(d.Substring(i * 2, 2)));
  639. return (this.Code_Char("1111") + s + this.Code_Char("3111"));
  640. }
  641. private string Interleaved_2of5_Pair(string pair)
  642. {
  643. string s1 = this.Code_2of5_Ch(pair.Substring(0, 1));
  644. string s2 = this.Code_2of5_Ch(pair.Substring(1, 1));
  645. string s = "";
  646. for (int i = 0; i < s1.Length; i++)
  647. s = s + s1.Substring(i, 1) + s2.Substring(i, 1);
  648. return s;
  649. }
  650. }
  651. }