Commit graph

45 commits

Author SHA1 Message Date
Ivan Grokhotkov
cc67312433
Add an option to use single-precision floating point in calculations
On some platforms, such as microcontrollers with a single-precision
FPU, operations on double type can be significantly slower compared
to the float type. For example, on ESP32-S3 microcontroller, decoding
a QR code of a certain size may take 1700ms when 'double' is used and
just 250ms when 'float' is used.

This commit adds two options to allow for such optimizations:

- QUIRC_FLOAT_TYPE: if defined, it is the type name to use in floating
  point calculations. Can be set, for example, using:
    CFLAGS += -DQUIRC_FLOAT_TYPE=float

- QUIRC_USE_TGMATH: if defined, Quirc will internally use <tgmath.h>
  header, instead of <math.h>. This C99-or-later header allows the
  program to call type-generic functions, such as 'sqrt', and the
  calls will be dispatched to the correct implementation (sqrtf, sqrt,
  sqrtl) depending on the actual argument type. Without setting this
  option, the benefit of -DQUIRC_FLOAT_TYPE=float would be limited as
  the double-precision versions of math functions would still be used.

The change is backwards compatible with existing applications. If
these macros are not defined, the behavior is the same as before.
2023-03-21 02:04:39 +01:00
Daniel Beer
516d91a94d Fix stack corruption on oversized QR codes.
Issue reported by dswetz on Github:
https://github.com/dlbeer/quirc/issues/119
2021-10-08 19:40:36 +13:00
Jaap Haitsma
7bd87c32dd Use abs instead of fabs to please compiler 2021-08-25 14:50:45 -04:00
Jaap Haitsma
064ebd5b87 Estimate gridsize better. Fixes #112 2021-08-25 14:40:31 -04:00
Jaap Haitsma
2ff513b0b4 merge upstream 2021-06-16 23:52:51 -04:00
Jaap Haitsma
00f187d94a Remove unused functions 2021-06-16 22:18:15 -04:00
YAMAMOTO Takashi
6b3575cd59 flood_fill_seed: Add comments on exit conditions 2021-05-11 15:03:09 +09:00
YAMAMOTO Takashi
22269c9a43 flood_fill_seed: initialize left_up and left_down together
Just for readability.
2021-05-11 14:59:22 +09:00
YAMAMOTO Takashi
87ca2b6c2d flood_fill_seed: Switch from goto to while 2021-05-11 14:57:53 +09:00
YAMAMOTO Takashi
a436fde8a0 flood_fill_seed: Reduce code duplicatino
This is also a preparation to eliminate the uses of goto.
2021-05-11 14:54:19 +09:00
YAMAMOTO Takashi
eadbc2caca flood_fill_seed: Move flood_fill_line to the "caller"
This restructure allows us to unify "call" and "return_from_call".
2021-05-11 14:09:24 +09:00
YAMAMOTO Takashi
0b69940876 flood_fill_line: call user callback as well 2021-05-11 14:05:02 +09:00
YAMAMOTO Takashi
38f882b3d6 flood_fill_seed: Simplify the flow by having a single "return point". 2021-05-11 13:46:31 +09:00
YAMAMOTO Takashi
1fa9b0c109 flood_fill_seed: Add assertions 2021-05-11 13:26:59 +09:00
YAMAMOTO Takashi
40def012e7 flood_fill_seed: Unify "left" and "x" vars
This reduces the memory usage a bit.
2021-05-11 13:04:02 +09:00
YAMAMOTO Takashi
aad3fc63b6 flood_fill_seed: separate a logic to fill a line 2021-05-11 12:55:44 +09:00
YAMAMOTO Takashi
772cd3e73f Improve stack usage for flood filling
* Make flood filling logic iterative (vs recursive)
  I basically tried one-to-one conversions here to avoid mistakes.
  probably it has a room for later optimizations.

* Use explicit malloc (vs variables on stack) to allocate the work area.

* Estimate the amount of memory for the work area dynamically
  from the image size, instead of using a constant FLOOD_FILL_MAX_DEPTH,
  which is too big in the most cases.
2021-05-11 11:05:58 +09:00
Daniel Beer
c6fc67088a
Merge pull request #103 from yamt/otsu
Fix possible overflows in otsu()
2021-05-11 13:24:56 +12:00
YAMAMOTO Takashi
65379a7c39 finder_scan: Improve capstone detection on small images
When using small captured images, I somehow frequently see failures
to recognize a capstone due to rounding errors.
eg. when pb[] = {2 3 8 3 2}.

This commit tries to improve it by using fixed-point arithmetics.
The scaling factor was chosen somehow arbitrary. A moderate scaling
should be enough.
2021-04-23 10:36:22 +09:00
YAMAMOTO Takashi
734258c775 finder_scan: constify the "check" array 2021-04-23 10:36:22 +09:00
YAMAMOTO Takashi
02ed1066ba test_grouping: use unsigned variables where it makes more sense 2021-04-23 10:36:22 +09:00
YAMAMOTO Takashi
ea9b6ee5ef otsu: Use unsigned for the pixel numbers
Because singed numbers don't make sense here.
2021-04-08 13:38:30 +09:00
YAMAMOTO Takashi
de68db7b69 otsu: Use double for weighted sums
My phone camera produces 12M-pixel images.
They can easily overflow an int.
2021-04-08 13:38:30 +09:00
Claudio Felber
4bc17cf8c6 Optimize quirc_flip() 2020-09-22 12:14:09 +02:00
Claudio Felber
963d6ed126 Fix stack corruption and bus errors while scanning oversized QR codes 2020-09-15 00:51:41 +02:00
Jaap Haitsma
bff065d88b Try all possible groups and new algo for grid_size 2020-05-27 21:33:51 -04:00
Alexandre Perrin
a0b41121e4 Refactored some c99 features
Fixes #68
2020-02-27 20:40:23 +01:00
Alexandre Perrin
026485bdc6 missing <limits.h> header 2019-09-25 11:10:43 +02:00
Alexandre Perrin
bf397f0794
Merge pull request #57 from kAworu/cosmetic
define a QUIRC_PIXEL_ALIAS_IMAGE constant to explicit conditional path
2019-09-25 10:59:08 +02:00
Alexandre Perrin
74459b9f59 Don't assume that sizeof(int) == sizeof(int32_t)
See https://github.com/dlbeer/quirc/pull/59#discussion_r320307589
2019-09-25 10:57:38 +02:00
Sushrut Shringarputale
26d2402655
Fixes issue #60 2019-09-09 23:09:20 -04:00
Sushrut Shringarputale
ed833132d5 Fix some compile-time issues for better production usability
Fixed up some type coercion and uninitialized variable instances for
better production code usability.
2019-08-20 09:50:39 -07:00
Alexandre Perrin
f700e456b4 define a QUIRC_PIXEL_ALIAS_IMAGE constant to explicit conditional path
Before this patch, the "sizeof dance" was confusing, fix #54.
2019-07-02 09:22:25 +02:00
Daniel Beer
5d71b1853e identify: make otsu() static. 2019-05-02 15:56:35 +12:00
Claudio Felber
766f79ce7c Use const struct quirc parameter in otsu() function and fix tabs 2019-04-30 18:44:59 +02:00
Claudio Felber
97ffaabfb5 Replace existing threshold function with Otsu threshold algorithm 2019-04-30 13:02:11 +02:00
Alexandre Perrin
90371f36a0 threshold() uses now the row_average member of struct quirc. 2017-06-11 10:08:58 +02:00
Edward Cragg
c50a89276f identify: fix warning
Fix the following warning when compiling with GCC 6:

lib/identify.c: In function ‘quirc_end’:
lib/identify.c:430:6: warning: ‘last_color’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  int last_color;
      ^~~~~~~~~~
2017-04-30 10:42:14 +01:00
Daniel Beer
84eccbf077 Fix out-of-bounds read in fitness_all(). 2017-03-30 18:05:49 +13:00
Alexandre Perrin
6f0ed74aa2 Comment typo. 2016-10-04 11:13:49 +02:00
Alexandre Perrin
93adbb0b11 Avoid division by zero.
Before this patch, small images (i.e. 7x7 pixels or less) could trigger
SIGFPE because of a (integer) division by zero.
2016-10-04 11:10:55 +02:00
Alexandre Perrin
3a6efb3d84 Large images decoding support
Fix #2, this patch makes large images support a compile time option by
allowing QUIRC_MAX_REGIONS to be tuned via CFLAGS up to 65534 (current
default is 254).
2016-07-15 14:40:40 +02:00
Daniel Beer
8d0eb68255 test_neighbours: fix warnings in static analyzer.
Coverity complains that a negative value of best_v might be passed to
record_qr_grid().

Fix supplied by Harald Eilertsen (http://github.com/snake66/).
2013-02-02 18:07:22 +13:00
Daniel Beer
bdbd932b72 Add protection against stack overflow when flood-filling. 2012-11-13 10:45:55 +13:00
Daniel Beer
a3142bc6b4 Initial commit: version 1.0. 2012-05-04 12:58:42 +12:00