qr_finder.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <config.h>
  2. //#include <assert.h>
  3. #include <zbar.h>
  4. #include "decoder.h"
  5. #include "qr_finder.h"
  6. #ifdef DEBUG_QR_FINDER
  7. //# define DEBUG_LEVEL (DEBUG_QR_FINDER)
  8. #endif
  9. #include "debug.h"
  10. /* at this point lengths are all decode unit offsets from the decode edge
  11. * NB owned by finder
  12. */
  13. qr_finder_line *_zbar_decoder_get_qr_finder_line (zbar_decoder_t *dcode)
  14. {
  15. return(&dcode->qrf.line);
  16. }
  17. zbar_symbol_type_t _zbar_find_qr (zbar_decoder_t *dcode)
  18. {
  19. qr_finder_t *qrf = &dcode->qrf;
  20. /* update latest finder pattern width */
  21. qrf->s5 -= get_width(dcode, 6);
  22. qrf->s5 += get_width(dcode, 1);
  23. unsigned s = qrf->s5;
  24. if(get_color(dcode) != ZBAR_SPACE || s < 7)
  25. return(0);
  26. dprintf(2, " qrf: s=%d", s);
  27. int ei = decode_e(pair_width(dcode, 1), s, 7);
  28. dprintf(2, " %d", ei);
  29. if(ei)
  30. goto invalid;
  31. ei = decode_e(pair_width(dcode, 2), s, 7);
  32. dprintf(2, "%d", ei);
  33. if(ei != 2)
  34. goto invalid;
  35. ei = decode_e(pair_width(dcode, 3), s, 7);
  36. dprintf(2, "%d", ei);
  37. if(ei != 2)
  38. goto invalid;
  39. ei = decode_e(pair_width(dcode, 4), s, 7);
  40. dprintf(2, "%d", ei);
  41. if(ei)
  42. goto invalid;
  43. /* valid QR finder symbol
  44. * mark positions needed by decoder
  45. */
  46. unsigned qz = get_width(dcode, 0);
  47. unsigned w = get_width(dcode, 1);
  48. qrf->line.eoffs = qz + (w + 1) / 2;
  49. qrf->line.len = qz + w + get_width(dcode, 2);
  50. qrf->line.pos[0] = qrf->line.len + get_width(dcode, 3);
  51. qrf->line.pos[1] = qrf->line.pos[0];
  52. w = get_width(dcode, 5);
  53. qrf->line.boffs = qrf->line.pos[0] + get_width(dcode, 4) + (w + 1) / 2;
  54. dprintf(2, " boff=%d pos=%d len=%d eoff=%d [valid]\n",
  55. qrf->line.boffs, qrf->line.pos[0], qrf->line.len,
  56. qrf->line.eoffs);
  57. return(ZBAR_QRCODE);
  58. invalid:
  59. dprintf(2, " [invalid]\n");
  60. return(0);
  61. }