cheetah_qrcode 1.0.2 → 1.0.3

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
2
  SHA256:
3
- metadata.gz: b29d21d21eec28473d59567fa25267c61c18ad20192833cd31f9bbe415b5ff99
4
- data.tar.gz: 49baa7dcb9bae3524c6a179d6857e8d004a3056695bbd2586928396222b1e643
3
+ metadata.gz: 0fe4a038a4c92715c7848f221672a271bc27e9e79b2d450d9894362a8fb321b8
4
+ data.tar.gz: '0462619677f70ede96efd8174fa3d6b52aaada7a7b119117e12936625af33dce'
5
5
  SHA512:
6
- metadata.gz: 177e1343d936bf964a5bc3d83cade60e618b1d6e2d16fa980950977095c83a964c85edd13ab0bc1357da71e427cc18014882bd5f813c5dd0771e9c90be940dfc
7
- data.tar.gz: 770a535c33374561f6a3d4133bd68871bcb0224c7796aba15cfc6464a1e159ae71ffd20ebd1c4aed6118cf5eb72cfc312604ebb2955e84a2d3e7405653732b3a
6
+ metadata.gz: 772f7f33a2da1b72f887a21d895c8fec5e46a00a9fe8c164e12852d775db26f660cb4c154070d1a215f007417e6f196fe6d9195d65a8db1fbdb27fdd22030f51
7
+ data.tar.gz: d8fc4fced392d3ca1f0062b6db4b3b534d80d5ebd8e1d917a427f860cde33a041e95bad1cd42326ff168361938fda278f7dfa9fcb1a6da89837a8bee53c2de49
@@ -24,12 +24,20 @@ static VALUE encode_text(int argc, VALUE* argv, VALUE self) {
24
24
  rb_raise(rb_eTypeError, "Invalid text");
25
25
  }
26
26
 
27
- if (rb_type(arg_ec_level) == T_SYMBOL) {
28
- arg_ec_level = RB_SYM2ID(arg_ec_level);
29
- } else {
27
+ if (rb_type(arg_ec_level) != T_SYMBOL) {
30
28
  rb_raise(rb_eTypeError, "Invalid error correction level, use :L, :M, :Q, :H");
31
29
  }
32
30
 
31
+ if (rb_type(arg_border) != T_FIXNUM) {
32
+ rb_raise(rb_eTypeError, "Invalid border");
33
+ }
34
+
35
+ if (rb_type(arg_size) != T_FIXNUM) {
36
+ rb_raise(rb_eTypeError, "Invalid size");
37
+ }
38
+
39
+ arg_ec_level = RB_SYM2ID(arg_ec_level);
40
+
33
41
  if (arg_ec_level == rb_intern("L") || arg_ec_level == rb_intern("l")) {
34
42
  qrcode_ec_level = qrcodegen_Ecc_LOW;
35
43
  } else if (arg_ec_level == rb_intern("M") || arg_ec_level == rb_intern("m")) {
@@ -42,16 +50,18 @@ static VALUE encode_text(int argc, VALUE* argv, VALUE self) {
42
50
  rb_raise(rb_eTypeError, "Invalid error correction level, use :L, :M, :Q, :H");
43
51
  }
44
52
 
45
- if (rb_type(arg_border) == T_FIXNUM) {
46
- qrcode_border = RB_NUM2UINT(arg_border);
47
- } else {
48
- rb_raise(rb_eTypeError, "Invalid border");
53
+ qrcode_border = RB_NUM2UINT(arg_border);
54
+
55
+ // The max version qrcode is only 117 wide
56
+ if (qrcode_border > 128) {
57
+ rb_raise(rb_eTypeError, "Border too large");
49
58
  }
50
59
 
51
- if (rb_type(arg_size) == T_FIXNUM) {
52
- image_size = RB_NUM2UINT(arg_size);
53
- } else {
54
- rb_raise(rb_eTypeError, "Invalid size");
60
+ image_size = RB_NUM2UINT(arg_size);
61
+
62
+ // 204800x204800 will use 5000MiB memory for image buffer
63
+ if (image_size > 204800) {
64
+ rb_raise(rb_eTypeError, "Image size too large");
55
65
  }
56
66
 
57
67
  bool ok = qrcodegen_encodeText(
@@ -96,7 +106,21 @@ static VALUE encode_text(int argc, VALUE* argv, VALUE self) {
96
106
  // Create image initialized to 0 (Entirely black image)
97
107
  image = calloc(image_length, sizeof(uint8_t));
98
108
  if (!image) {
99
- rb_raise(rb_eRuntimeError, "Unable to create image buffer");
109
+ rb_raise(rb_eRuntimeError, "Unable to create image buffer for %lu bytes", image_length);
110
+ }
111
+
112
+ // Lookup map for qrcode-to-image pixel conversion
113
+ size_t image_scale_map[qrcode_size + 1];
114
+
115
+ // First pixel always start at 0
116
+ image_scale_map[0] = 0;
117
+
118
+ // Last pixel always end at image_size
119
+ image_scale_map[qrcode_size] = image_size;
120
+
121
+ // Precompute image scale pixels
122
+ for (size_t i = 1; i < qrcode_size; i++) {
123
+ image_scale_map[i] = (size_t)(i * image_scale) + 1;
100
124
  }
101
125
 
102
126
  // Loop through qrcode to find white modules to write into image
@@ -108,26 +132,10 @@ static VALUE encode_text(int argc, VALUE* argv, VALUE self) {
108
132
  }
109
133
 
110
134
  // Map current qrcode module to image coordinates
111
- size_t ix_begin = (size_t)(qx * image_scale) + 1;
112
- size_t ix_end = (size_t)((qx + 1) * image_scale) + 1;
113
- size_t iy_begin = (size_t)(qy * image_scale) + 1;
114
- size_t iy_end = (size_t)((qy + 1) * image_scale) + 1;
115
-
116
- // Fix offset for the first pixel
117
- if (qx == 0) {
118
- ix_begin = 0;
119
- }
120
- if (qy == 0) {
121
- iy_begin = 0;
122
- }
123
-
124
- // For boundary safety
125
- if (ix_end > image_size) {
126
- ix_end = image_size;
127
- }
128
- if (iy_end > image_size) {
129
- iy_end = image_size;
130
- }
135
+ size_t ix_begin = image_scale_map[qx];
136
+ size_t ix_end = image_scale_map[qx + 1];
137
+ size_t iy_begin = image_scale_map[qy];
138
+ size_t iy_end = image_scale_map[qy + 1];
131
139
 
132
140
  // Fill white pixels into image at unit of bytes
133
141
  for (size_t iy = iy_begin; iy < iy_end; iy++) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CheetahQRCode
4
- VERSION = '1.0.2'
4
+ VERSION = '1.0.3'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheetah_qrcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - atitan