UPC.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. // UPC.cpp: implementation of the CUPC class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "UPCAE.h"
  6. #include "UPC.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. CUPC::CUPC()
  16. {
  17. m_nSymbology = UPCA;
  18. }
  19. CUPC::CUPC(int nSymbology)
  20. {
  21. m_nSymbology = nSymbology;
  22. }
  23. CUPC::~CUPC()
  24. {
  25. }
  26. void CUPC::LoadData(CString csMessage, double dNarrowBar, double dFinalHeight, long nGuardbarHeight, HDC hDC, int nStartingXPixel, int nStartingYPixel, double dRatio)
  27. {
  28. m_nGuardbarHeight = nGuardbarHeight;
  29. //standardize the message
  30. int nLen = csMessage.GetLength();
  31. int i,nNumberOfAdditionZero = m_nSymbology == UPCA ? 11 - nLen : 7 - nLen;
  32. if (nNumberOfAdditionZero > 0){ // missing some numbers
  33. for (i = 0 ; i < nNumberOfAdditionZero ; i ++)
  34. csMessage = '0' + csMessage ;// just adding zeros at the head of message
  35. }
  36. else if (nNumberOfAdditionZero < 0){
  37. if (m_nSymbology == UPCA)
  38. csMessage.Delete(10,-nNumberOfAdditionZero);
  39. else
  40. csMessage.Delete(6,-nNumberOfAdditionZero);
  41. }
  42. CBarcode::LoadData(csMessage,dNarrowBar,dFinalHeight,hDC,nStartingXPixel,nStartingYPixel,dRatio);
  43. }
  44. long CUPC::CalculateCheckSumDigit()
  45. {
  46. int i, nLen, nSum = 0, nItem;
  47. nLen = m_csMessage.GetLength();
  48. for (i = 0 ; i < nLen ; i++){
  49. nItem = i%2 ? ((int)m_csMessage.GetAt(i)-48)*1 : ((int)m_csMessage.GetAt(i)-48)*3;
  50. nSum += nItem;
  51. }
  52. nSum %= 10;
  53. return (10-nSum)%10;
  54. }
  55. CString CUPC::RetrieveSystemNumberPattern(int iSystemNumber /* = 0 */, int iNumber)
  56. {
  57. CString strCharPattern;
  58. if (iSystemNumber == 0){
  59. switch (iNumber){
  60. case 0:
  61. strCharPattern = "EEEOOO";
  62. break;
  63. case 1:
  64. strCharPattern = "EEOEOO";
  65. break;
  66. case 2:
  67. strCharPattern = "EEOOEO";
  68. break;
  69. case 3:
  70. strCharPattern = "EEOOOE";
  71. break;
  72. case 4:
  73. strCharPattern = "EOEEOO";
  74. break;
  75. case 5:
  76. strCharPattern = "EOOEEO";
  77. break;
  78. case 6:
  79. strCharPattern = "EOOOEE";
  80. break;
  81. case 7:
  82. strCharPattern = "EOEOEO";
  83. break;
  84. case 8:
  85. strCharPattern = "EOEOOE";
  86. break;
  87. case 9:
  88. strCharPattern = "EOOEOE";
  89. break;
  90. }
  91. }
  92. else{
  93. switch(iNumber){
  94. case 0:
  95. strCharPattern = "OOOEEE";
  96. break;
  97. case 1:
  98. strCharPattern = "OOEOEE";
  99. break;
  100. case 2:
  101. strCharPattern = "OOEEOE";
  102. break;
  103. case 3:
  104. strCharPattern = "OOEEEO";
  105. break;
  106. case 4:
  107. strCharPattern = "OEOOEE";
  108. break;
  109. case 5:
  110. strCharPattern = "OEEOOE";
  111. break;
  112. case 6:
  113. strCharPattern = "OEEEOO";
  114. break;
  115. case 7:
  116. strCharPattern = "OEOEOE";
  117. break;
  118. case 8:
  119. strCharPattern = "OEOEEO";
  120. break;
  121. case 9:
  122. strCharPattern = "OEEOEO";
  123. break;
  124. }
  125. }
  126. return strCharPattern;
  127. }
  128. CString CUPC::RetrieveLeftOddParityPattern(int iNumber)
  129. {
  130. CString strCharPattern;
  131. switch(iNumber){
  132. case 0:
  133. strCharPattern = "sssbbsb";
  134. break;
  135. case 1:
  136. strCharPattern = "ssbbssb";
  137. break;
  138. case 2:
  139. strCharPattern = "ssbssbb";
  140. break;
  141. case 3:
  142. strCharPattern = "sbbbbsb";
  143. break;
  144. case 4:
  145. strCharPattern = "sbsssbb";
  146. break;
  147. case 5:
  148. strCharPattern = "sbbsssb";
  149. break;
  150. case 6:
  151. strCharPattern = "sbsbbbb";
  152. break;
  153. case 7:
  154. strCharPattern = "sbbbsbb";
  155. break;
  156. case 8:
  157. strCharPattern = "sbbsbbb";
  158. break;
  159. case 9:
  160. strCharPattern = "sssbsbb";
  161. break;
  162. }
  163. return strCharPattern;
  164. }
  165. CString CUPC::RetrieveLeftEvenParityPattern(int iNumber)
  166. {
  167. CString strCharPattern;
  168. switch(iNumber){
  169. case 0:
  170. strCharPattern = "sbssbbb";
  171. break;
  172. case 1:
  173. strCharPattern = "sbbssbb";
  174. break;
  175. case 2:
  176. strCharPattern = "ssbbsbb";
  177. break;
  178. case 3:
  179. strCharPattern = "sbssssb";
  180. break;
  181. case 4:
  182. strCharPattern = "ssbbbsb";
  183. break;
  184. case 5:
  185. strCharPattern = "sbbbssb";
  186. break;
  187. case 6:
  188. strCharPattern = "ssssbsb";
  189. break;
  190. case 7:
  191. strCharPattern = "ssbsssb";
  192. break;
  193. case 8:
  194. strCharPattern = "sssbssb";
  195. break;
  196. case 9:
  197. strCharPattern = "ssbsbbb";
  198. break;
  199. }
  200. return strCharPattern;
  201. }
  202. CString CUPC::RetrieveLeftPattern(int iNumber)
  203. {
  204. CString strCharPattern;
  205. switch(iNumber){
  206. case 0:
  207. strCharPattern = "sssbbsb";
  208. break;
  209. case 1:
  210. strCharPattern = "ssbbssb";
  211. break;
  212. case 2:
  213. strCharPattern = "ssbssbb";
  214. break;
  215. case 3:
  216. strCharPattern = "sbbbbsb";
  217. break;
  218. case 4:
  219. strCharPattern = "sbsssbb";
  220. break;
  221. case 5:
  222. strCharPattern = "sbbsssb";
  223. break;
  224. case 6:
  225. strCharPattern = "sbsbbbb";
  226. break;
  227. case 7:
  228. strCharPattern = "sbbbsbb";
  229. break;
  230. case 8:
  231. strCharPattern = "sbbsbbb";
  232. break;
  233. case 9:
  234. strCharPattern = "sssbsbb";
  235. break;
  236. }
  237. return strCharPattern;
  238. }
  239. CString CUPC::RetrieveRightPattern(int iNumber)
  240. {
  241. CString strCharPattern;
  242. switch(iNumber){
  243. case 0:
  244. strCharPattern = "bbbssbs";
  245. break;
  246. case 1:
  247. strCharPattern = "bbssbbs";
  248. break;
  249. case 2:
  250. strCharPattern = "bbsbbss";
  251. break;
  252. case 3:
  253. strCharPattern = "bssssbs";
  254. break;
  255. case 4:
  256. strCharPattern = "bsbbbss";
  257. break;
  258. case 5:
  259. strCharPattern = "bssbbbs";
  260. break;
  261. case 6:
  262. strCharPattern = "bsbssss";
  263. break;
  264. case 7:
  265. strCharPattern = "bsssbss";
  266. break;
  267. case 8:
  268. strCharPattern = "bssbsss";
  269. break;
  270. case 9:
  271. strCharPattern = "bbbsbss";
  272. break;
  273. }
  274. return strCharPattern;
  275. }
  276. void CUPC::DrawPattern(CString csPattern)
  277. {
  278. int i,nXPixel,nYPixel;
  279. CDC oDC;
  280. // attach to the device context
  281. oDC.Attach(m_hDC);
  282. // initialize X pixel value
  283. nXPixel = m_nStartingXPixel;
  284. for (i=0;i<csPattern.GetLength();i++)
  285. {
  286. // X value for loop
  287. for (nXPixel=m_nStartingXPixel;nXPixel<m_nStartingXPixel+m_nNarrowBarPixelWidth;nXPixel++)
  288. {
  289. // Y value for loop
  290. for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight+m_nGuardbarHeight;nYPixel++)
  291. {
  292. // if this is a bar
  293. if (csPattern.GetAt(i)=='b')
  294. oDC.SetPixelV(nXPixel,nYPixel,COLORBLACK);
  295. // else
  296. // oDC.SetPixelV(nXPixel,nYPixel,COLORWHITE);
  297. }
  298. }
  299. // advance the starting position
  300. m_nStartingXPixel+= m_nNarrowBarPixelWidth;
  301. }
  302. // detach from the device context
  303. oDC.Detach();
  304. return;
  305. }
  306. void CUPC::DrawUPCA()
  307. {
  308. int i, tmpGuardBarHeight;
  309. DrawPattern("sssssssss"); // draw quite zone
  310. DrawPattern("bsb"); // draw lead
  311. DrawPattern(RetrieveLeftPattern((int)m_csMessage.GetAt(0)-48)); // draw number system
  312. tmpGuardBarHeight = m_nGuardbarHeight;
  313. m_nGuardbarHeight = 0;
  314. for (i = 1 ; i < 6 ; i++)// draw manufacturer code
  315. DrawPattern(RetrieveLeftPattern((int)m_csMessage.GetAt(i)-48));
  316. m_nGuardbarHeight = tmpGuardBarHeight;
  317. DrawPattern("sbsbs"); // draw separator bars
  318. tmpGuardBarHeight = m_nGuardbarHeight;
  319. m_nGuardbarHeight = 0;
  320. for (i = 6 ; i < 11 ; i ++) // draw product code
  321. DrawPattern(RetrieveRightPattern((int)m_csMessage.GetAt(i)-48));
  322. m_nGuardbarHeight = tmpGuardBarHeight;
  323. DrawPattern(RetrieveRightPattern(CalculateCheckSumDigit())); //draw check sum digits
  324. DrawPattern("bsb"); // draw trailer bars
  325. DrawPattern("sssssssss"); // draw quite zone
  326. }
  327. void CUPC::DrawUPCE()
  328. {
  329. int i,nCheckDigit, nSystemNumber, tmpGuardBarHeight;
  330. nSystemNumber = (int)m_csMessage.GetAt(0)-48;
  331. nCheckDigit = CalculateCheckSumDigit();
  332. CString strSystemNumberPattern = RetrieveSystemNumberPattern(nSystemNumber,nCheckDigit);
  333. DrawPattern("sssssssss"); // draw quite zone
  334. DrawPattern("bsb"); // draw lead
  335. tmpGuardBarHeight = m_nGuardbarHeight;
  336. m_nGuardbarHeight = 0;
  337. for (i = 1 ; i < 7 ; i ++){
  338. if (strSystemNumberPattern[i-1] == 'O')
  339. DrawPattern(RetrieveLeftOddParityPattern((int)m_csMessage.GetAt(i)-48));
  340. if (strSystemNumberPattern[i-1] == 'E')
  341. DrawPattern(RetrieveLeftEvenParityPattern((int)m_csMessage.GetAt(i)-48));
  342. }
  343. m_nGuardbarHeight = tmpGuardBarHeight;
  344. DrawPattern("sbsbs"); // draw separator bars
  345. DrawPattern("b"); // draw trailer bars
  346. DrawPattern("sssssssss"); // draw quite zone
  347. }
  348. void CUPC::DrawBitmap()
  349. {
  350. if (m_nSymbology == UPCA)
  351. DrawUPCA();
  352. else
  353. DrawUPCE();
  354. }
  355. void CUPC::BitmapToClipboard()
  356. {
  357. }