quirc 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 676a868b0f803c24243c68681637665ee5d7a03c
4
- data.tar.gz: 78cd8a802e7739b8edbd390c30e373284b8e625f
2
+ SHA256:
3
+ metadata.gz: b098fadcd265ce357ef81036d89dd0a2c260f6fbf050389243fd2853efdcf2d6
4
+ data.tar.gz: 8aeecc5d6ae1067f73df6352d8a27fbd5e6a3103d12a0cfde7aaa06bbc78d96c
5
5
  SHA512:
6
- metadata.gz: 2c56ea9979e176d2454102d7c55a85269ee725f80a77e94e0ed13f08f0074f152e80dc3437dd365e0c99cf933ad2bffb6cd1de4fbd18c72ac9ade78cf97db2a6
7
- data.tar.gz: 8158ca3d217c61c4558ef0cb4a9912008c3ce2ce96da36fef0fa04ca26ce3a052d86cad5df05e5649f278b996630452f9dac885ce590da9fd5165c1e70311eb0
6
+ metadata.gz: 043eb2848bc2e10383a3815af8b867caf4bf90c923567942ad09664bbd0e0279cb7ca1bc7615cc859d2786b901559e4071dc20b7d2bbaa6b4815ce1244a1f1f9
7
+ data.tar.gz: 1912a957c0c56ffb6ad5714a0cdc13ac95c4c3cebefad94f00361afa614c53491954ce19f119ff5f33117b79d3645c45711213f89b7037a3e0de0f9078540237
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2017 Jacob Middag
3
+ Copyright (c) 2017-2018 Jacob Middag
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -117,7 +117,7 @@ static const uint8_t gf256_log[256] = {
117
117
  0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
118
118
  };
119
119
 
120
- const static struct galois_field gf256 = {
120
+ static const struct galois_field gf256 = {
121
121
  .p = 255,
122
122
  .log = gf256_log,
123
123
  .exp = gf256_exp
@@ -790,12 +790,18 @@ static quirc_decode_error_t decode_kanji(struct quirc_data *data,
790
790
 
791
791
  for (i = 0; i < count; i++) {
792
792
  int d = take_bits(ds, 13);
793
+ int msB = d / 0xc0;
794
+ int lsB = d % 0xc0;
795
+ int intermediate = (msB << 8) | lsB;
793
796
  uint16_t sjw;
794
797
 
795
- if (d + 0x8140 >= 0x9ffc)
796
- sjw = d + 0x8140;
797
- else
798
- sjw = d + 0xc140;
798
+ if (intermediate + 0x8140 <= 0x9ffc) {
799
+ /* bytes are in the range 0x8140 to 0x9FFC */
800
+ sjw = intermediate + 0x8140;
801
+ } else {
802
+ /* bytes are in the range 0xE040 to 0xEBBF */
803
+ sjw = intermediate + 0xc140;
804
+ }
799
805
 
800
806
  data->payload[data->payload_len++] = sjw >> 8;
801
807
  data->payload[data->payload_len++] = sjw & 0xff;
@@ -196,9 +196,7 @@ static void threshold(struct quirc *q)
196
196
  threshold_s = THRESHOLD_S_MIN;
197
197
 
198
198
  for (y = 0; y < q->h; y++) {
199
- int row_average[q->w];
200
-
201
- memset(row_average, 0, sizeof(row_average));
199
+ memset(q->row_average, 0, q->w * sizeof(int));
202
200
 
203
201
  for (x = 0; x < q->w; x++) {
204
202
  int w, u;
@@ -216,12 +214,12 @@ static void threshold(struct quirc *q)
216
214
  avg_u = (avg_u * (threshold_s - 1)) /
217
215
  threshold_s + row[u];
218
216
 
219
- row_average[w] += avg_w;
220
- row_average[u] += avg_u;
217
+ q->row_average[w] += avg_w;
218
+ q->row_average[u] += avg_u;
221
219
  }
222
220
 
223
221
  for (x = 0; x < q->w; x++) {
224
- if (row[x] < row_average[x] *
222
+ if (row[x] < q->row_average[x] *
225
223
  (100 - THRESHOLD_T) / (200 * threshold_s))
226
224
  row[x] = QUIRC_PIXEL_BLACK;
227
225
  else
@@ -427,7 +425,7 @@ static void finder_scan(struct quirc *q, int y)
427
425
  {
428
426
  quirc_pixel_t *row = q->pixels + y * q->w;
429
427
  int x;
430
- int last_color;
428
+ int last_color = 0;
431
429
  int run_length = 0;
432
430
  int run_count = 0;
433
431
  int pb[5];
@@ -36,34 +36,83 @@ struct quirc *quirc_new(void)
36
36
 
37
37
  void quirc_destroy(struct quirc *q)
38
38
  {
39
- if (q->image)
40
- free(q->image);
39
+ free(q->image);
40
+ /* q->pixels may alias q->image when their type representation is of the
41
+ same size, so we need to be careful here to avoid a double free */
41
42
  if (sizeof(*q->image) != sizeof(*q->pixels))
42
43
  free(q->pixels);
43
-
44
+ free(q->row_average);
44
45
  free(q);
45
46
  }
46
47
 
47
48
  int quirc_resize(struct quirc *q, int w, int h)
48
49
  {
49
- uint8_t *new_image = realloc(q->image, w * h);
50
-
51
- if (!new_image)
52
- return -1;
53
-
50
+ uint8_t *image = NULL;
51
+ quirc_pixel_t *pixels = NULL;
52
+ int *row_average = NULL;
53
+
54
+ /*
55
+ * XXX: w and h should be size_t (or at least unsigned) as negatives
56
+ * values would not make much sense. The downside is that it would break
57
+ * both the API and ABI. Thus, at the moment, let's just do a sanity
58
+ * check.
59
+ */
60
+ if (w < 0 || h < 0)
61
+ goto fail;
62
+
63
+ /*
64
+ * alloc a new buffer for q->image. We avoid realloc(3) because we want
65
+ * on failure to be leave `q` in a consistant, unmodified state.
66
+ */
67
+ image = calloc(w, h);
68
+ if (!image)
69
+ goto fail;
70
+
71
+ /* compute the "old" (i.e. currently allocated) and the "new"
72
+ (i.e. requested) image dimensions */
73
+ size_t olddim = q->w * q->h;
74
+ size_t newdim = w * h;
75
+ size_t min = (olddim < newdim ? olddim : newdim);
76
+
77
+ /*
78
+ * copy the data into the new buffer, avoiding (a) to read beyond the
79
+ * old buffer when the new size is greater and (b) to write beyond the
80
+ * new buffer when the new size is smaller, hence the min computation.
81
+ */
82
+ (void)memcpy(image, q->image, min);
83
+
84
+ /* alloc a new buffer for q->pixels if needed */
54
85
  if (sizeof(*q->image) != sizeof(*q->pixels)) {
55
- size_t new_size = w * h * sizeof(quirc_pixel_t);
56
- quirc_pixel_t *new_pixels = realloc(q->pixels, new_size);
57
- if (!new_pixels)
58
- return -1;
59
- q->pixels = new_pixels;
86
+ pixels = calloc(newdim, sizeof(quirc_pixel_t));
87
+ if (!pixels)
88
+ goto fail;
60
89
  }
61
90
 
62
- q->image = new_image;
91
+ /* alloc a new buffer for q->row_average */
92
+ row_average = calloc(w, sizeof(int));
93
+ if (!row_average)
94
+ goto fail;
95
+
96
+ /* alloc succeeded, update `q` with the new size and buffers */
63
97
  q->w = w;
64
98
  q->h = h;
99
+ free(q->image);
100
+ q->image = image;
101
+ if (sizeof(*q->image) != sizeof(*q->pixels)) {
102
+ free(q->pixels);
103
+ q->pixels = pixels;
104
+ }
105
+ free(q->row_average);
106
+ q->row_average = row_average;
65
107
 
66
108
  return 0;
109
+ /* NOTREACHED */
110
+ fail:
111
+ free(image);
112
+ free(pixels);
113
+ free(row_average);
114
+
115
+ return -1;
67
116
  }
68
117
 
69
118
  int quirc_count(const struct quirc *q)
@@ -121,7 +121,7 @@ struct quirc_code {
121
121
  * is a bitmask giving the actual values of cells. If the cell
122
122
  * at (x, y) is black, then the following bit is set:
123
123
  *
124
- * cell_bitmap[i << 3] & (1 << (i & 7))
124
+ * cell_bitmap[i >> 3] & (1 << (i & 7))
125
125
  *
126
126
  * where i = (y * size) + x.
127
127
  */
@@ -77,6 +77,7 @@ struct quirc_grid {
77
77
  struct quirc {
78
78
  uint8_t *image;
79
79
  quirc_pixel_t *pixels;
80
+ int *row_average; /* used by threshold() */
80
81
  int w;
81
82
  int h;
82
83
 
data/lib/quirc/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quirc
4
- VERSION = "0.0.2".freeze
4
+ VERSION = "0.1.0".freeze
5
5
  end
data/test/helper.rb CHANGED
@@ -10,6 +10,8 @@ module TestHelpers
10
10
  end
11
11
  end
12
12
 
13
- class Minitest::Spec
14
- include TestHelpers
13
+ module Minitest
14
+ class Spec
15
+ include TestHelpers
16
+ end
15
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quirc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Middag
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-18 00:00:00.000000000 Z
11
+ date: 2018-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake-compiler
28
+ name: oily_png
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
@@ -39,33 +39,33 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rubocop
42
+ name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.48'
47
+ version: '1.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.48'
54
+ version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: oily_png
56
+ name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.0'
61
+ version: '0.58'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.0'
68
+ version: '0.58'
69
69
  description: Ruby bindings for C library quirc that extracts and decode QR images
70
70
  email: jacob@gaddim.nl
71
71
  executables: []
@@ -93,7 +93,7 @@ files:
93
93
  - test/fixtures/hello-120-utf8-q.png
94
94
  - test/helper.rb
95
95
  - test/test_decode.rb
96
- homepage: https://github.com/middagj/quirc
96
+ homepage: https://github.com/middagj/quirc-ruby
97
97
  licenses:
98
98
  - MIT
99
99
  metadata: {}
@@ -105,7 +105,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
- version: '2.0'
108
+ version: '2.2'
109
109
  required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  requirements:
111
111
  - - ">="
@@ -113,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
113
  version: '0'
114
114
  requirements: []
115
115
  rubyforge_project:
116
- rubygems_version: 2.6.11
116
+ rubygems_version: 2.7.6
117
117
  signing_key:
118
118
  specification_version: 4
119
119
  summary: QR decoder based on quirc