EAN13.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. // EAN13.cpp: implementation of the CEAN13 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "EAN.h"
  6. #include "EAN13.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CEAN13::CEAN13()
  16. {
  17. m_nSymbology = EAN13;
  18. }
  19. CEAN13::~CEAN13()
  20. {
  21. }
  22. void CEAN13::LoadData(CString csMessage, double dNarrowBar, double dFinalHeight, long nGuardbarHeight, HDC hDC, int nStartingXPixel, int nStartingYPixel, double dRatio)
  23. {
  24. m_nGuardbarHeight = nGuardbarHeight;
  25. CBarcode::LoadData(csMessage,dNarrowBar,dFinalHeight,hDC,nStartingXPixel,nStartingYPixel,dRatio);
  26. }
  27. long CEAN13::CalculateCheckSumDigit()
  28. {
  29. int i, nLen, nSum = 0, nItem;
  30. nLen = m_csMessage.GetLength();
  31. for (i = nLen ; i >= 1 ; i--){
  32. nItem = i%2 ? ((int)m_csMessage.GetAt(i-1)-48)*1 : ((int)m_csMessage.GetAt(i-1)-48)*3;
  33. nSum += nItem;
  34. }
  35. nSum %= 10;
  36. return (10-nSum)%10;
  37. }
  38. CString CEAN13::RetrieveLeftOddParityPattern(int iNumber)
  39. {
  40. CString strCharPattern;
  41. switch(iNumber){
  42. case 0:
  43. strCharPattern = "sssbbsb";
  44. break;
  45. case 1:
  46. strCharPattern = "ssbbssb";
  47. break;
  48. case 2:
  49. strCharPattern = "ssbssbb";
  50. break;
  51. case 3:
  52. strCharPattern = "sbbbbsb";
  53. break;
  54. case 4:
  55. strCharPattern = "sbsssbb";
  56. break;
  57. case 5:
  58. strCharPattern = "sbbsssb";
  59. break;
  60. case 6:
  61. strCharPattern = "sbsbbbb";
  62. break;
  63. case 7:
  64. strCharPattern = "sbbbsbb";
  65. break;
  66. case 8:
  67. strCharPattern = "sbbsbbb";
  68. break;
  69. case 9:
  70. strCharPattern = "sssbsbb";
  71. break;
  72. }
  73. return strCharPattern;
  74. }
  75. CString CEAN13::RetrieveLeftEvenParityPattern(int iNumber)
  76. {
  77. CString strCharPattern;
  78. switch(iNumber){
  79. case 0:
  80. strCharPattern = "sbssbbb";
  81. break;
  82. case 1:
  83. strCharPattern = "sbbssbb";
  84. break;
  85. case 2:
  86. strCharPattern = "ssbbsbb";
  87. break;
  88. case 3:
  89. strCharPattern = "sbssssb";
  90. break;
  91. case 4:
  92. strCharPattern = "ssbbbsb";
  93. break;
  94. case 5:
  95. strCharPattern = "sbbbssb";
  96. break;
  97. case 6:
  98. strCharPattern = "ssssbsb";
  99. break;
  100. case 7:
  101. strCharPattern = "ssbsssb";
  102. break;
  103. case 8:
  104. strCharPattern = "sssbssb";
  105. break;
  106. case 9:
  107. strCharPattern = "ssbsbbb";
  108. break;
  109. }
  110. return strCharPattern;
  111. }
  112. CString CEAN13::RetrieveRightPattern(int iNumber)
  113. {
  114. CString strCharPattern;
  115. switch(iNumber){
  116. case 0:
  117. strCharPattern = "bbbssbs";
  118. break;
  119. case 1:
  120. strCharPattern = "bbssbbs";
  121. break;
  122. case 2:
  123. strCharPattern = "bbsbbss";
  124. break;
  125. case 3:
  126. strCharPattern = "bssssbs";
  127. break;
  128. case 4:
  129. strCharPattern = "bsbbbss";
  130. break;
  131. case 5:
  132. strCharPattern = "bssbbbs";
  133. break;
  134. case 6:
  135. strCharPattern = "bsbssss";
  136. break;
  137. case 7:
  138. strCharPattern = "bsssbss";
  139. break;
  140. case 8:
  141. strCharPattern = "bssbsss";
  142. break;
  143. case 9:
  144. strCharPattern = "bbbsbss";
  145. break;
  146. }
  147. return strCharPattern;
  148. }
  149. CString CEAN13::RetrieveCountryCodePattern(int iNumber)
  150. {
  151. CString strCharPattern;
  152. switch(iNumber){
  153. case 0:
  154. strCharPattern = "OOOOO";
  155. break;
  156. case 1:
  157. strCharPattern = "OEOEE";
  158. break;
  159. case 2:
  160. strCharPattern = "OEEOE";
  161. break;
  162. case 3:
  163. strCharPattern = "OEEEO";
  164. break;
  165. case 4:
  166. strCharPattern = "EOOEE";
  167. break;
  168. case 5:
  169. strCharPattern = "EEOOE";
  170. break;
  171. case 6:
  172. strCharPattern = "EEEOO";
  173. break;
  174. case 7:
  175. strCharPattern = "EOEOE";
  176. break;
  177. case 8:
  178. strCharPattern = "EOEEO";
  179. break;
  180. case 9:
  181. strCharPattern = "EEOEO";
  182. break;
  183. }
  184. return strCharPattern;
  185. }
  186. void CEAN13::DrawPattern(CString csPattern)
  187. {
  188. int i,nXPixel,nYPixel;
  189. CDC oDC;
  190. // attach to the device context
  191. oDC.Attach(m_hDC);
  192. // initialize X pixel value
  193. nXPixel = m_nStartingXPixel;
  194. for (i=0;i<csPattern.GetLength();i++)
  195. {
  196. // X value for loop
  197. for (nXPixel=m_nStartingXPixel;nXPixel<m_nStartingXPixel+m_nNarrowBarPixelWidth;nXPixel++)
  198. {
  199. // Y value for loop
  200. for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight+m_nGuardbarHeight;nYPixel++)
  201. {
  202. // if this is a bar
  203. if (csPattern.GetAt(i)=='b')
  204. oDC.SetPixelV(nXPixel,nYPixel,COLORBLACK);
  205. // else
  206. // oDC.SetPixelV(nXPixel,nYPixel,COLORWHITE);
  207. }
  208. }
  209. // advance the starting position
  210. m_nStartingXPixel+= m_nNarrowBarPixelWidth;
  211. }
  212. // detach from the device context
  213. oDC.Detach();
  214. return;
  215. }
  216. void CEAN13::DrawBitmap()
  217. {
  218. int i, tmpGuardBarHeight;
  219. DrawPattern("sssssssss"); // draw quite zone
  220. DrawPattern("bsb"); // draw lead
  221. CString strCountryCodePattern;
  222. strCountryCodePattern = RetrieveCountryCodePattern((int)m_csMessage.GetAt(0)-48);
  223. tmpGuardBarHeight = m_nGuardbarHeight;
  224. m_nGuardbarHeight = 0;
  225. DrawPattern(RetrieveLeftOddParityPattern((int)m_csMessage.GetAt(1)-48));
  226. for (i = 2 ; i < 7 ; i ++){
  227. if (strCountryCodePattern[i-2] == 'O')
  228. DrawPattern(RetrieveLeftOddParityPattern((int)m_csMessage.GetAt(i)-48));
  229. if (strCountryCodePattern[i-2] == 'E')
  230. DrawPattern(RetrieveLeftEvenParityPattern((int)m_csMessage.GetAt(i)-48));
  231. }
  232. m_nGuardbarHeight = tmpGuardBarHeight;
  233. DrawPattern("sbsbs"); // draw separator bars
  234. tmpGuardBarHeight = m_nGuardbarHeight;
  235. m_nGuardbarHeight = 0;
  236. for (i = 7 ; i < 12 ; i ++)
  237. DrawPattern(RetrieveRightPattern((int)m_csMessage.GetAt(i)-48));
  238. DrawPattern(RetrieveRightPattern(CalculateCheckSumDigit()));
  239. m_nGuardbarHeight = tmpGuardBarHeight;
  240. DrawPattern("bsb"); // draw trailer bars
  241. DrawPattern("sssssssss"); // draw quite zone
  242. }
  243. void CEAN13::BitmapToClipboard()
  244. {
  245. }