pax_global_header 0000666 0000000 0000000 00000000064 15002446311 0014506 g ustar 00root root 0000000 0000000 52 comment=157b08ec4274b56b5605d32fa4ec701dd39ef16d
whomwah-rqrcode_core-157b08e/ 0000775 0000000 0000000 00000000000 15002446311 0016162 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/.github/ 0000775 0000000 0000000 00000000000 15002446311 0017522 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/.github/FUNDING.yml 0000664 0000000 0000000 00000000140 15002446311 0021332 0 ustar 00root root 0000000 0000000 # These are supported funding model platforms
github: whomwah
buy_me_a_coffee: duncanrobertson
whomwah-rqrcode_core-157b08e/.github/workflows/ 0000775 0000000 0000000 00000000000 15002446311 0021557 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/.github/workflows/ruby.yml 0000664 0000000 0000000 00000001317 15002446311 0023265 0 ustar 00root root 0000000 0000000 name: rqrcode_core
on:
push:
branches:
- main
- release
pull_request: # Runs on any PR regardless of target branch
workflow_dispatch:
jobs:
Build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
ruby: ["3.0", "3.1", "3.2", "3.3", "3.4"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run Tests
run: bundle exec rake test
- name: StandardRB Check
run: bundle exec standardrb --format progress
whomwah-rqrcode_core-157b08e/.gitignore 0000664 0000000 0000000 00000000137 15002446311 0020153 0 ustar 00root root 0000000 0000000 /.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
/.devcontainer/
*.gem
whomwah-rqrcode_core-157b08e/CHANGELOG.md 0000664 0000000 0000000 00000004006 15002446311 0017773 0 ustar 00root root 0000000 0000000 # Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [2.0.0] - 2025-04-24
- Various README updates
- Fix for issue #43
- Fix for issue #42
- Drop Ruby < 3 to keep up with dependency updates
- Add option to use ENV `RQRCODE_CORE_ARCH_BITS` to override the bits value (32 or 64) used during the encoding process.
This has been shown to greatly reduce the memory usage but I can't prove it doesn't break anything for all people.
Use at your own risk.
- Fixed the 'Do Your Own Rendering' example code to reflect the current interface.
## [1.2.0] - 2021-08-26
- Added Multi Mode Support which allows for multi-segment encoding. Thanks to [@ssayer](https://github.com/ssayer)
## [1.1.0] - 2021-07-01
- Add a basic benchmark file
- Add standardRB badge
- Add `.freeze` on `CONST` lookup objects
- Remove unused `@mode` instance variable
- A batch of small refactors and optimizations
## [1.0.0] - 2021-04-23
### Changed
- README updated
- Small documentation clarification [@smnscp](https://github.com/smnscp).
- Rakefile cleaned up. You can now just run `rake` which will run specs and fix linting using `standardrb`
### Breaking Changes
- Very niche but a breaking change never the less. The `to_s` method _no longer_ accepts the `:true` and `:false` arguments, but prefers `:dark` and `:light`.
## [0.2.0] - 2020-12-26
### Changed
- fix `required_ruby_version` for Ruby 3 support
[unreleased]: https://github.com/whomwah/rqrcode_core/compare/v2.0.0...HEAD
[2.0.0]: https://github.com/whomwah/rqrcode_core/compare/v1.2.0...2.0.0
[1.2.0]: https://github.com/whomwah/rqrcode_core/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/whomwah/rqrcode_core/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/whomwah/rqrcode_core/compare/v0.2.0...v1.0.0
[0.2.0]: https://github.com/whomwah/rqrcode_core/compare/v0.1.2...v0.2.0
whomwah-rqrcode_core-157b08e/Gemfile 0000664 0000000 0000000 00000000141 15002446311 0017451 0 ustar 00root root 0000000 0000000 source "https://rubygems.org"
# Specify your gem's dependencies in rqrcode-base.gemspec
gemspec
whomwah-rqrcode_core-157b08e/Gemfile.lock 0000664 0000000 0000000 00000002637 15002446311 0020414 0 ustar 00root root 0000000 0000000 PATH
remote: .
specs:
rqrcode_core (2.0.0)
GEM
remote: https://rubygems.org/
specs:
ast (2.4.2)
json (2.7.2)
language_server-protocol (3.17.0.3)
lint_roller (1.1.0)
minitest (5.25.1)
parallel (1.26.3)
parser (3.3.5.0)
ast (~> 2.4.1)
racc
racc (1.8.1)
rainbow (3.1.1)
rake (13.2.1)
regexp_parser (2.9.2)
rubocop (1.66.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.4, < 3.0)
rubocop-ast (>= 1.32.2, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.32.3)
parser (>= 3.3.1.0)
rubocop-performance (1.22.1)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.31.1, < 2.0)
ruby-progressbar (1.13.0)
standard (1.41.0)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.0)
rubocop (~> 1.66.0)
standard-custom (~> 1.0.0)
standard-performance (~> 1.5)
standard-custom (1.0.2)
lint_roller (~> 1.0)
rubocop (~> 1.50)
standard-performance (1.5.0)
lint_roller (~> 1.1)
rubocop-performance (~> 1.22.0)
unicode-display_width (2.6.0)
PLATFORMS
aarch64-linux
ruby
DEPENDENCIES
bundler (~> 2.0)
minitest (~> 5.0)
rake (~> 13.0)
rqrcode_core!
standard (~> 1.41)
BUNDLED WITH
2.5.16
whomwah-rqrcode_core-157b08e/LICENSE.txt 0000664 0000000 0000000 00000002073 15002446311 0020007 0 ustar 00root root 0000000 0000000 The MIT License (MIT)
Copyright (c) 2008 Duncan Robertson
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
whomwah-rqrcode_core-157b08e/README.md 0000664 0000000 0000000 00000007703 15002446311 0017450 0 ustar 00root root 0000000 0000000 
[](https://github.com/testdouble/standard)
# RQRCodeCore
`rqrcode_core` is a library for encoding QR Codes in pure Ruby. It has a simple interface with all the standard qrcode options. It was originally adapted in 2008 from a Javascript library by [Kazuhiko Arase](https://github.com/kazuhikoarase).
Features:
- `rqrcode_core` is a Ruby only library. It requires no 3rd party libraries. Just Ruby!
- It is an encoding library. You can't decode QR Codes with it.
- The interface is simple and assumes you just want to encode a string into a QR Code, but also allows for encoding multiple segments.
- QR Code is trademarked by Denso Wave inc.
- Minimum Ruby version is `>= 3.0.0`
`rqrcode_core` is the basis of the popular `rqrcode` gem [https://github.com/whomwah/rqrcode]. This gem allows you to generate different renderings of your QR Code, including `png`, `svg` and `ansi`.
## Installation
Add this line to your application's Gemfile:
```ruby
gem "rqrcode_core"
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install rqrcode_core
## Basic Usage
```ruby
$ require "rqrcode_core"
$ qr = RQRCodeCore::QRCode.new("https://kyan.com")
$ puts qr.to_s
```
Output:
```
xxxxxxx x x x x x xx xxxxxxx
x x xxx xxxxxx xxx x x
x xxx x xxxxx x xx x xxx x
... etc
```
## Multiple Encoding Support
```ruby
$ require "rqrcode_core"
$ qr = RQRCodeCore::QRCode.new([
{data: "byteencoded", mode: :byte_8bit},
{data: "A1" * 100, mode: :alphanumeric},
{data: "1" * 500, mode: :number}
])
```
This will create a QR Code with byte encoded, alphanumeric and number segments. Any combination of encodings/segments will work provided it fits within size limits.
## Doing your own rendering
```ruby
require "rqrcode_core"
qr = RQRCodeCore::QRCode.new("https://kyan.com")
qr.modules.each do |row|
row.each do |col|
print col ? "#" : " "
end
print "\n"
end
```
### Options
The library expects a string or array (for multiple encodings) to be parsed in, other args are optional.
```
data - the string or array you wish to encode
size - the size (integer) of the QR Code (defaults to smallest size needed to encode the string)
max_size - the max_size (Integer) of the QR Code (default RQRCodeCore::QRUtil.max_size)
level - the error correction level, can be:
* Level :l 7% of code can be restored
* Level :m 15% of code can be restored
* Level :q 25% of code can be restored
* Level :h 30% of code can be restored (default :h)
mode - the mode of the QR Code (defaults to alphanumeric or byte_8bit, depending on the input data, only used when data is a string):
* :number
* :alphanumeric
* :byte_8bit
```
#### Example
```ruby
RQRCodeCore::QRCode.new("http://kyan.com", size: 2, level: :m, mode: :byte_8bit)
```
## Development
### Tests
You can run the test suite using:
```
$ ./bin/setup
$ rake
```
or try the project from the console with:
```
$ ./bin/console
```
### Linting
The project uses [standardrb](https://github.com/testdouble/standard) and can be run with:
```
$ ./bin/setup
$ rake standard # check
$ rake standard:fix # fix
```
## Experimental
On 64 bit systems when generating lots of QR Codes the lib will consume more memory than on a 32 bit systems during the internal "right shift zero fill" steps (this is expected). In tests though, it's shown that by forcing the lib to think you're on a 32 systems greatly reduces the memory footprint. This could of course have undesired consequences too! but if you're happy to try, you can use the `RQRCODE_CORE_ARCH_BITS` ENV to make this change. e.g `RQRCODE_CORE_ARCH_BITS=32`.
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/whomwah/rqrcode_core.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
whomwah-rqrcode_core-157b08e/Rakefile 0000664 0000000 0000000 00000000575 15002446311 0017636 0 ustar 00root root 0000000 0000000 begin
require "rake/testtask"
require "standard/rake"
Rake::TestTask.new(:test) do |t|
t.libs << "test"
t.libs << "lib"
t.test_files = FileList["test/**/*_test.rb"]
end
task default: [:test, "standard:fix"]
desc "Run a simple benchmark (x1000)"
task :benchmark do
ruby "test/benchmark.rb"
end
rescue LoadError
# no standard/rspec available
end
whomwah-rqrcode_core-157b08e/bin/ 0000775 0000000 0000000 00000000000 15002446311 0016732 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/bin/console 0000775 0000000 0000000 00000000533 15002446311 0020323 0 ustar 00root root 0000000 0000000 #!/usr/bin/env ruby
require "bundler/setup"
require "rqrcode_core"
# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.
# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start
require "irb"
IRB.start(__FILE__)
whomwah-rqrcode_core-157b08e/bin/setup 0000775 0000000 0000000 00000000203 15002446311 0020013 0 ustar 00root root 0000000 0000000 #!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx
bundle install
# Do any other automated setup that you need to do here
whomwah-rqrcode_core-157b08e/lib/ 0000775 0000000 0000000 00000000000 15002446311 0016730 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/lib/rqrcode_core.rb 0000664 0000000 0000000 00000000167 15002446311 0021730 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
require "rqrcode_core/qrcode"
require "rqrcode_core/version"
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/ 0000775 0000000 0000000 00000000000 15002446311 0021377 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode.rb 0000664 0000000 0000000 00000000745 15002446311 0023207 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require "rqrcode_core/qrcode/qr_8bit_byte"
require "rqrcode_core/qrcode/qr_alphanumeric"
require "rqrcode_core/qrcode/qr_bit_buffer"
require "rqrcode_core/qrcode/qr_code"
require "rqrcode_core/qrcode/qr_math"
require "rqrcode_core/qrcode/qr_multi"
require "rqrcode_core/qrcode/qr_numeric"
require "rqrcode_core/qrcode/qr_polynomial"
require "rqrcode_core/qrcode/qr_rs_block"
require "rqrcode_core/qrcode/qr_segment"
require "rqrcode_core/qrcode/qr_util"
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/ 0000775 0000000 0000000 00000000000 15002446311 0022654 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_8bit_byte.rb 0000664 0000000 0000000 00000000424 15002446311 0025574 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QR8bitByte
def initialize(data)
@data = data
end
def write(buffer)
buffer.byte_encoding_start(@data.bytesize)
@data.each_byte do |b|
buffer.put(b, 8)
end
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_alphanumeric.rb 0000664 0000000 0000000 00000002036 15002446311 0026354 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
ALPHANUMERIC = [
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$",
"%", "*", "+", "-", ".", "/", ":"
].freeze
class QRAlphanumeric
def initialize(data)
unless QRAlphanumeric.valid_data?(data)
raise QRCodeArgumentError, "Not a alpha numeric uppercase string `#{data}`"
end
@data = data
end
def self.valid_data?(data)
(data.chars - ALPHANUMERIC).empty?
end
def write(buffer)
buffer.alphanumeric_encoding_start(@data.size)
@data.size.times do |i|
if i % 2 == 0
if i == (@data.size - 1)
value = ALPHANUMERIC.index(@data[i])
buffer.put(value, 6)
else
value = (ALPHANUMERIC.index(@data[i]) * 45) + ALPHANUMERIC.index(@data[i + 1])
buffer.put(value, 11)
end
end
end
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_bit_buffer.rb 0000664 0000000 0000000 00000003251 15002446311 0026013 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRBitBuffer
attr_reader :buffer
PAD0 = 0xEC
PAD1 = 0x11
def initialize(version)
@version = version
@buffer = []
@length = 0
end
def get(index)
buf_index = (index / 8).floor
(QRUtil.rszf(@buffer[buf_index], 7 - index % 8) & 1) == 1
end
def put(num, length)
(0...length).each do |i|
put_bit((QRUtil.rszf(num, length - i - 1) & 1) == 1)
end
end
def get_length_in_bits
@length
end
def put_bit(bit)
buf_index = (@length / 8).floor
if @buffer.size <= buf_index
@buffer << 0
end
if bit
@buffer[buf_index] |= QRUtil.rszf(0x80, @length % 8)
end
@length += 1
end
def byte_encoding_start(length)
put(QRMODE[:mode_8bit_byte], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_8bit_byte], @version))
end
def alphanumeric_encoding_start(length)
put(QRMODE[:mode_alpha_numk], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_alpha_numk], @version))
end
def numeric_encoding_start(length)
put(QRMODE[:mode_number], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_number], @version))
end
def pad_until(prefered_size)
# Align on byte
while get_length_in_bits % 8 != 0
put_bit(false)
end
# Pad with padding code words
while get_length_in_bits < prefered_size
put(PAD0, 8)
put(PAD1, 8) if get_length_in_bits < prefered_size
end
end
def end_of_message(max_data_bits)
put(0, 4) unless get_length_in_bits + 4 > max_data_bits
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_code.rb 0000664 0000000 0000000 00000037346 15002446311 0024632 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
QRMODE = {
mode_number: 1 << 0, # 1 (binary: 0001)
mode_alpha_numk: 1 << 1, # 2 (binary: 0010)
mode_8bit_byte: 1 << 2 # 4 (binary: 0100)
}.freeze
QRMODE_NAME = {
number: :mode_number,
alphanumeric: :mode_alpha_numk,
byte_8bit: :mode_8bit_byte,
multi: :mode_multi
}.freeze
QRERRORCORRECTLEVEL = {
l: 1,
m: 0,
q: 3,
h: 2
}.freeze
QRMASKPATTERN = {
pattern000: 0,
pattern001: 1,
pattern010: 2,
pattern011: 3,
pattern100: 4,
pattern101: 5,
pattern110: 6,
pattern111: 7
}.freeze
QRMASKCOMPUTATIONS = [
proc { |i, j| (i + j) % 2 == 0 },
proc { |i, j| i % 2 == 0 },
proc { |i, j| j % 3 == 0 },
proc { |i, j| (i + j) % 3 == 0 },
proc { |i, j| ((i / 2).floor + (j / 3).floor) % 2 == 0 },
proc { |i, j| (i * j) % 2 + (i * j) % 3 == 0 },
proc { |i, j| ((i * j) % 2 + (i * j) % 3) % 2 == 0 },
proc { |i, j| ((i * j) % 3 + (i + j) % 2) % 2 == 0 }
].freeze
QRPOSITIONPATTERNLENGTH = (7 + 1) * 2 + 1
QRFORMATINFOLENGTH = 15
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable1-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable2-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable3-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable4-e.html
QRMAXBITS = {
l: [152, 272, 440, 640, 864, 1088, 1248, 1552, 1856, 2192, 2592, 2960, 3424, 3688, 4184,
4712, 5176, 5768, 6360, 6888, 7456, 8048, 8752, 9392, 10_208, 10_960, 11_744, 12_248,
13_048, 13_880, 14_744, 15_640, 16_568, 17_528, 18_448, 19_472, 20_528, 21_616, 22_496, 23_648],
m: [128, 224, 352, 512, 688, 864, 992, 1232, 1456, 1728, 2032, 2320, 2672, 2920, 3320, 3624,
4056, 4504, 5016, 5352, 5712, 6256, 6880, 7312, 8000, 8496, 9024, 9544, 10_136, 10_984,
11_640, 12_328, 13_048, 13_800, 14_496, 15_312, 15_936, 16_816, 17_728, 18_672],
q: [104, 176, 272, 384, 496, 608, 704, 880, 1056, 1232, 1440, 1648, 1952, 2088, 2360, 2600, 2936,
3176, 3560, 3880, 4096, 4544, 4912, 5312, 5744, 6032, 6464, 6968, 7288, 7880, 8264, 8920, 9368,
9848, 10288, 10832, 11408, 12016, 12656, 13328],
h: [72, 128, 208, 288, 368, 480, 528, 688, 800, 976, 1120, 1264, 1440, 1576, 1784,
2024, 2264, 2504, 2728, 3080, 3248, 3536, 3712, 4112, 4304, 4768, 5024, 5288, 5608, 5960,
6344, 6760, 7208, 7688, 7888, 8432, 8768, 9136, 9776, 10_208]
}.freeze
# StandardErrors
class QRCodeArgumentError < ArgumentError; end
class QRCodeRunTimeError < RuntimeError; end
# == Creation
#
# QRCode objects expect only one required constructor parameter
# and an optional hash of any other. Here's a few examples:
#
# qr = RQRCodeCore::QRCode.new('hello world')
# qr = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
#
class QRCode
attr_reader :modules, :module_count, :version
# Expects a string or array (for multi-segment encoding) to be parsed in, other args are optional
#
# # data - the string, QRSegment or array of Hashes (with data:, mode: keys) you wish to encode
# # size - the size (Integer) of the QR Code (defaults to smallest size needed to encode the data)
# # max_size - the max_size (Integer) of the QR Code (default RQRCodeCore::QRUtil.max_size)
# # level - the error correction level, can be:
# * Level :l 7% of code can be restored
# * Level :m 15% of code can be restored
# * Level :q 25% of code can be restored
# * Level :h 30% of code can be restored (default :h)
# # mode - the mode of the QR Code (defaults to alphanumeric or byte_8bit, depending on the input data, only used when data is a string):
# * :number
# * :alphanumeric
# * :byte_8bit
#
# qr = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
# segment_qr = QRCodeCore::QRCode.new({ data: 'foo', mode: :byte_8bit })
# multi_qr = RQRCodeCore::QRCode.new([{ data: 'foo', mode: :byte_8bit }, { data: 'bar1', mode: :alphanumeric }])
def initialize(data, *args)
options = extract_options!(args)
level = (options[:level] || :h).to_sym
max_size = options[:max_size] || QRUtil.max_size
@data = case data
when String
QRSegment.new(data: data, mode: options[:mode])
when Array
raise QRCodeArgumentError, "Array must contain Hashes with :data and :mode keys" unless data.all? { |seg| seg.is_a?(Hash) && %i[data mode].all? { |s| seg.key? s } }
data.map { |seg| QRSegment.new(**seg) }
when QRSegment
data
else
raise QRCodeArgumentError, "data must be a String, QRSegment, or an Array"
end
@error_correct_level = QRERRORCORRECTLEVEL[level]
unless @error_correct_level
raise QRCodeArgumentError, "Unknown error correction level `#{level.inspect}`"
end
size = options[:size] || minimum_version(limit: max_size)
if size > max_size
raise QRCodeArgumentError, "Given size greater than maximum possible size of #{QRUtil.max_size}"
end
@version = size
@module_count = @version * 4 + QRPOSITIONPATTERNLENGTH
@modules = Array.new(@module_count)
@data_list = multi_segment? ? QRMulti.new(@data) : @data.writer
@data_cache = nil
make
end
# checked? is called with a +col+ and +row+ parameter. This will
# return true or false based on whether that coordinate exists in the
# matrix returned. It would normally be called while iterating through
# modules. A simple example would be:
#
# instance.checked?( 10, 10 ) => true
#
def checked?(row, col)
if !row.between?(0, @module_count - 1) || !col.between?(0, @module_count - 1)
raise QRCodeRunTimeError, "Invalid row/column pair: #{row}, #{col}"
end
@modules[row][col]
end
alias_method :dark?, :checked?
extend Gem::Deprecate
deprecate :dark?, :checked?, 2020, 1
# This is a public method that returns the QR Code you have
# generated as a string. It will not be able to be read
# in this format by a QR Code reader, but will give you an
# idea if the final outout. It takes two optional args
# +:dark+ and +:light+ which are there for you to choose
# how the output looks. Here's an example of it's use:
#
# instance.to_s =>
# xxxxxxx x x x x x xx xxxxxxx
# x x xxx xxxxxx xxx x x
# x xxx x xxxxx x xx x xxx x
#
# instance.to_s( dark: 'E', light: 'Q' ) =>
# EEEEEEEQEQQEQEQQQEQEQQEEQQEEEEEEE
# EQQQQQEQQEEEQQEEEEEEQEEEQQEQQQQQE
# EQEEEQEQQEEEEEQEQQQQQQQEEQEQEEEQE
#
def to_s(*args)
options = extract_options!(args)
dark = options[:dark] || "x"
light = options[:light] || " "
quiet_zone_size = options[:quiet_zone_size] || 0
rows = []
@modules.each do |row|
cols = light * quiet_zone_size
row.each do |col|
cols += (col ? dark : light)
end
rows << cols
end
quiet_zone_size.times do
rows.unshift(light * (rows.first.length / light.size))
rows << light * (rows.first.length / light.size)
end
rows.join("\n")
end
# Public overide as default inspect is very verbose
#
# RQRCodeCore::QRCode.new('my string to generate', size: 4, level: :h)
# => QRCodeCore: @data='my string to generate', @error_correct_level=2, @version=4, @module_count=33
#
def inspect
"QRCodeCore: @data='#{@data}', @error_correct_level=#{@error_correct_level}, @version=#{@version}, @module_count=#{@module_count}"
end
# Return a symbol for current error connection level
def error_correction_level
QRERRORCORRECTLEVEL.invert[@error_correct_level]
end
# Return true if this QR Code includes multiple encoded segments
def multi_segment?
@data.is_a?(Array)
end
# Return a symbol in QRMODE.keys for current mode used
def mode
case @data_list
when QRNumeric
:mode_number
when QRAlphanumeric
:mode_alpha_numk
else
:mode_8bit_byte
end
end
protected
def make # :nodoc:
prepare_common_patterns
make_impl(false, get_best_mask_pattern)
end
private
def prepare_common_patterns # :nodoc:
@modules.map! { |row| Array.new(@module_count) }
place_position_probe_pattern(0, 0)
place_position_probe_pattern(@module_count - 7, 0)
place_position_probe_pattern(0, @module_count - 7)
place_position_adjust_pattern
place_timing_pattern
@common_patterns = @modules.map(&:clone)
end
def make_impl(test, mask_pattern) # :nodoc:
@modules = @common_patterns.map(&:clone)
place_format_info(test, mask_pattern)
place_version_info(test) if @version >= 7
if @data_cache.nil?
@data_cache = QRCode.create_data(
@version, @error_correct_level, @data_list
)
end
map_data(@data_cache, mask_pattern)
end
def place_position_probe_pattern(row, col) # :nodoc:
(-1..7).each do |r|
next unless (row + r).between?(0, @module_count - 1)
(-1..7).each do |c|
next unless (col + c).between?(0, @module_count - 1)
is_vert_line = r.between?(0, 6) && (c == 0 || c == 6)
is_horiz_line = c.between?(0, 6) && (r == 0 || r == 6)
is_square = r.between?(2, 4) && c.between?(2, 4)
is_part_of_probe = is_vert_line || is_horiz_line || is_square
@modules[row + r][col + c] = is_part_of_probe
end
end
end
def get_best_mask_pattern # :nodoc:
min_lost_point = 0
pattern = 0
8.times do |i|
make_impl(true, i)
lost_point = QRUtil.get_lost_points(modules)
if i == 0 || min_lost_point > lost_point
min_lost_point = lost_point
pattern = i
end
end
pattern
end
def place_timing_pattern # :nodoc:
(8...@module_count - 8).each do |i|
@modules[i][6] = @modules[6][i] = i % 2 == 0
end
end
def place_position_adjust_pattern # :nodoc:
positions = QRUtil.get_pattern_positions(@version)
positions.each do |row|
positions.each do |col|
next unless @modules[row][col].nil?
(-2..2).each do |r|
(-2..2).each do |c|
is_part_of_pattern = r.abs == 2 || c.abs == 2 || (r == 0 && c == 0)
@modules[row + r][col + c] = is_part_of_pattern
end
end
end
end
end
def place_version_info(test) # :nodoc:
bits = QRUtil.get_bch_version(@version)
18.times do |i|
mod = !test && ((bits >> i) & 1) == 1
@modules[(i / 3).floor][ i % 3 + @module_count - 8 - 3 ] = mod
@modules[i % 3 + @module_count - 8 - 3][ (i / 3).floor ] = mod
end
end
def place_format_info(test, mask_pattern) # :nodoc:
data = (@error_correct_level << 3 | mask_pattern)
bits = QRUtil.get_bch_format_info(data)
QRFORMATINFOLENGTH.times do |i|
mod = !test && ((bits >> i) & 1) == 1
# vertical
row = if i < 6
i
elsif i < 8
i + 1
else
@module_count - 15 + i
end
@modules[row][8] = mod
# horizontal
col = if i < 8
@module_count - i - 1
elsif i < 9
15 - i - 1 + 1
else
15 - i - 1
end
@modules[8][col] = mod
end
# fixed module
@modules[@module_count - 8][8] = !test
end
def map_data(data, mask_pattern) # :nodoc:
inc = -1
row = @module_count - 1
bit_index = 7
byte_index = 0
(@module_count - 1).step(1, -2) do |col|
col -= 1 if col <= 6
loop do
2.times do |c|
if @modules[row][col - c].nil?
dark = false
if byte_index < data.size && !data[byte_index].nil?
dark = ((QRUtil.rszf(data[byte_index], bit_index) & 1) == 1)
end
mask = QRUtil.get_mask(mask_pattern, row, col - c)
dark = !dark if mask
@modules[row][ col - c ] = dark
bit_index -= 1
if bit_index == -1
byte_index += 1
bit_index = 7
end
end
end
row += inc
if row < 0 || @module_count <= row
row -= inc
inc = -inc
break
end
end
end
end
def minimum_version(limit: QRUtil.max_size, version: 1)
raise QRCodeRunTimeError, "Data length exceed maximum capacity of version #{limit}" if version > limit
max_size_bits = QRMAXBITS[error_correction_level][version - 1]
size_bits = multi_segment? ? @data.sum { |seg| seg.size(version) } : @data.size(version)
return version if size_bits < max_size_bits
minimum_version(limit: limit, version: version + 1)
end
def extract_options!(arr) # :nodoc:
arr.last.is_a?(::Hash) ? arr.pop : {}
end
class << self
def count_max_data_bits(rs_blocks) # :nodoc:
max_data_bytes = rs_blocks.reduce(0) do |sum, rs_block|
sum + rs_block.data_count
end
max_data_bytes * 8
end
def create_data(version, error_correct_level, data_list) # :nodoc:
rs_blocks = QRRSBlock.get_rs_blocks(version, error_correct_level)
max_data_bits = QRCode.count_max_data_bits(rs_blocks)
buffer = QRBitBuffer.new(version)
data_list.write(buffer)
buffer.end_of_message(max_data_bits)
if buffer.get_length_in_bits > max_data_bits
raise QRCodeRunTimeError, "code length overflow. (#{buffer.get_length_in_bits}>#{max_data_bits}). (Try a larger size!)"
end
buffer.pad_until(max_data_bits)
QRCode.create_bytes(buffer, rs_blocks)
end
def create_bytes(buffer, rs_blocks) # :nodoc:
offset = 0
max_dc_count = 0
max_ec_count = 0
dcdata = Array.new(rs_blocks.size)
ecdata = Array.new(rs_blocks.size)
rs_blocks.each_with_index do |rs_block, r|
dc_count = rs_block.data_count
ec_count = rs_block.total_count - dc_count
max_dc_count = [max_dc_count, dc_count].max
max_ec_count = [max_ec_count, ec_count].max
dcdata_block = Array.new(dc_count)
dcdata_block.size.times do |i|
dcdata_block[i] = 0xff & buffer.buffer[i + offset]
end
dcdata[r] = dcdata_block
offset += dc_count
rs_poly = QRUtil.get_error_correct_polynomial(ec_count)
raw_poly = QRPolynomial.new(dcdata[r], rs_poly.get_length - 1)
mod_poly = raw_poly.mod(rs_poly)
ecdata_block = Array.new(rs_poly.get_length - 1)
ecdata_block.size.times do |i|
mod_index = i + mod_poly.get_length - ecdata_block.size
ecdata_block[i] = (mod_index >= 0) ? mod_poly.get(mod_index) : 0
end
ecdata[r] = ecdata_block
end
total_code_count = rs_blocks.reduce(0) do |sum, rs_block|
sum + rs_block.total_count
end
data = Array.new(total_code_count)
index = 0
max_dc_count.times do |i|
rs_blocks.size.times do |r|
if i < dcdata[r].size
data[index] = dcdata[r][i]
index += 1
end
end
end
max_ec_count.times do |i|
rs_blocks.size.times do |r|
if i < ecdata[r].size
data[index] = ecdata[r][i]
index += 1
end
end
end
data
end
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_math.rb 0000664 0000000 0000000 00000001523 15002446311 0024635 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRMath
module_eval {
exp_table = Array.new(256)
log_table = Array.new(256)
8.times do |i|
exp_table[i] = 1 << i
end
(8...256).each do |i|
exp_table[i] = exp_table[i - 4] \
^ exp_table[i - 5] \
^ exp_table[i - 6] \
^ exp_table[i - 8]
end
255.times do |i|
log_table[exp_table[i]] = i
end
const_set(:EXP_TABLE, exp_table).freeze
const_set(:LOG_TABLE, log_table).freeze
}
class << self
def glog(n)
raise QRCodeRunTimeError, "glog(#{n})" if n < 1
LOG_TABLE[n]
end
def gexp(n)
while n < 0
n += 255
end
while n >= 256
n -= 255
end
EXP_TABLE[n]
end
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_multi.rb 0000664 0000000 0000000 00000000323 15002446311 0025033 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRMulti
def initialize(data)
@data = data
end
def write(buffer)
@data.each { |seg| seg.writer.write(buffer) }
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_numeric.rb 0000664 0000000 0000000 00000001517 15002446311 0025351 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
NUMERIC = %w[0 1 2 3 4 5 6 7 8 9].freeze
class QRNumeric
def initialize(data)
raise QRCodeArgumentError, "Not a numeric string `#{data}`" unless QRNumeric.valid_data?(data)
@data = data
end
def self.valid_data?(data)
(data.chars - NUMERIC).empty?
end
def write(buffer)
buffer.numeric_encoding_start(@data.size)
@data.size.times do |i|
if i % 3 == 0
chars = @data[i, 3]
bit_length = get_bit_length(chars.length)
buffer.put(get_code(chars), bit_length)
end
end
end
private
NUMBER_LENGTH = {
3 => 10,
2 => 7,
1 => 4
}.freeze
def get_bit_length(length)
NUMBER_LENGTH[length]
end
def get_code(chars)
chars.to_i
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_polynomial.rb 0000664 0000000 0000000 00000002435 15002446311 0026072 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRPolynomial
def initialize(num, shift)
raise QRCodeRunTimeError, "#{num.size}/#{shift}" if num.empty?
offset = 0
while offset < num.size && num[offset] == 0
offset += 1
end
@num = Array.new(num.size - offset + shift)
(0...num.size - offset).each do |i|
@num[i] = num[i + offset]
end
end
def get(index)
@num[index]
end
def get_length
@num.size
end
def multiply(e)
num = Array.new(get_length + e.get_length - 1)
(0...get_length).each do |i|
(0...e.get_length).each do |j|
tmp = num[i + j].nil? ? 0 : num[i + j]
num[i + j] = tmp ^ QRMath.gexp(QRMath.glog(get(i)) + QRMath.glog(e.get(j)))
end
end
QRPolynomial.new(num, 0)
end
def mod(e)
if get_length - e.get_length < 0
return self
end
ratio = QRMath.glog(get(0)) - QRMath.glog(e.get(0))
num = Array.new(get_length)
(0...get_length).each do |i|
num[i] = get(i)
end
(0...e.get_length).each do |i|
tmp = num[i].nil? ? 0 : num[i]
num[i] = tmp ^ QRMath.gexp(QRMath.glog(e.get(i)) + ratio)
end
QRPolynomial.new(num, 0).mod(e)
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_rs_block.rb 0000664 0000000 0000000 00000014761 15002446311 0025512 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRRSBlock
attr_reader :data_count, :total_count
def initialize(total_count, data_count)
@total_count = total_count
@data_count = data_count
end
# http://www.thonky.com/qr-code-tutorial/error-correction-table/
RS_BLOCK_TABLE = [
# L
# M
# Q
# H
# 1
[1, 26, 19],
[1, 26, 16],
[1, 26, 13],
[1, 26, 9],
# 2
[1, 44, 34],
[1, 44, 28],
[1, 44, 22],
[1, 44, 16],
# 3
[1, 70, 55],
[1, 70, 44],
[2, 35, 17],
[2, 35, 13],
# 4
[1, 100, 80],
[2, 50, 32],
[2, 50, 24],
[4, 25, 9],
# 5
[1, 134, 108],
[2, 67, 43],
[2, 33, 15, 2, 34, 16],
[2, 33, 11, 2, 34, 12],
# 6
[2, 86, 68],
[4, 43, 27],
[4, 43, 19],
[4, 43, 15],
# 7
[2, 98, 78],
[4, 49, 31],
[2, 32, 14, 4, 33, 15],
[4, 39, 13, 1, 40, 14],
# 8
[2, 121, 97],
[2, 60, 38, 2, 61, 39],
[4, 40, 18, 2, 41, 19],
[4, 40, 14, 2, 41, 15],
# 9
[2, 146, 116],
[3, 58, 36, 2, 59, 37],
[4, 36, 16, 4, 37, 17],
[4, 36, 12, 4, 37, 13],
# 10
[2, 86, 68, 2, 87, 69],
[4, 69, 43, 1, 70, 44],
[6, 43, 19, 2, 44, 20],
[6, 43, 15, 2, 44, 16],
# 11
[4, 101, 81],
[1, 80, 50, 4, 81, 51],
[4, 50, 22, 4, 51, 23],
[3, 36, 12, 8, 37, 13],
# 12
[2, 116, 92, 2, 117, 93],
[6, 58, 36, 2, 59, 37],
[4, 46, 20, 6, 47, 21],
[7, 42, 14, 4, 43, 15],
# 13
[4, 133, 107],
[8, 59, 37, 1, 60, 38],
[8, 44, 20, 4, 45, 21],
[12, 33, 11, 4, 34, 12],
# 14
[3, 145, 115, 1, 146, 116],
[4, 64, 40, 5, 65, 41],
[11, 36, 16, 5, 37, 17],
[11, 36, 12, 5, 37, 13],
# 15
[5, 109, 87, 1, 110, 88],
[5, 65, 41, 5, 66, 42],
[5, 54, 24, 7, 55, 25],
[11, 36, 12, 7, 37, 13],
# 16
[5, 122, 98, 1, 123, 99],
[7, 73, 45, 3, 74, 46],
[15, 43, 19, 2, 44, 20],
[3, 45, 15, 13, 46, 16],
# 17
[1, 135, 107, 5, 136, 108],
[10, 74, 46, 1, 75, 47],
[1, 50, 22, 15, 51, 23],
[2, 42, 14, 17, 43, 15],
# 18
[5, 150, 120, 1, 151, 121],
[9, 69, 43, 4, 70, 44],
[17, 50, 22, 1, 51, 23],
[2, 42, 14, 19, 43, 15],
# 19
[3, 141, 113, 4, 142, 114],
[3, 70, 44, 11, 71, 45],
[17, 47, 21, 4, 48, 22],
[9, 39, 13, 16, 40, 14],
# 20
[3, 135, 107, 5, 136, 108],
[3, 67, 41, 13, 68, 42],
[15, 54, 24, 5, 55, 25],
[15, 43, 15, 10, 44, 16],
# 21
[4, 144, 116, 4, 145, 117],
[17, 68, 42],
[17, 50, 22, 6, 51, 23],
[19, 46, 16, 6, 47, 17],
# 22
[2, 139, 111, 7, 140, 112],
[17, 74, 46],
[7, 54, 24, 16, 55, 25],
[34, 37, 13],
# 23
[4, 151, 121, 5, 152, 122],
[4, 75, 47, 14, 76, 48],
[11, 54, 24, 14, 55, 25],
[16, 45, 15, 14, 46, 16],
# 24
[6, 147, 117, 4, 148, 118],
[6, 73, 45, 14, 74, 46],
[11, 54, 24, 16, 55, 25],
[30, 46, 16, 2, 47, 17],
# 25
[8, 132, 106, 4, 133, 107],
[8, 75, 47, 13, 76, 48],
[7, 54, 24, 22, 55, 25],
[22, 45, 15, 13, 46, 16],
# 26
[10, 142, 114, 2, 143, 115],
[19, 74, 46, 4, 75, 47],
[28, 50, 22, 6, 51, 23],
[33, 46, 16, 4, 47, 17],
# 27
[8, 152, 122, 4, 153, 123],
[22, 73, 45, 3, 74, 46],
[8, 53, 23, 26, 54, 24],
[12, 45, 15, 28, 46, 16],
# 28
[3, 147, 117, 10, 148, 118],
[3, 73, 45, 23, 74, 46],
[4, 54, 24, 31, 55, 25],
[11, 45, 15, 31, 46, 16],
# 29
[7, 146, 116, 7, 147, 117],
[21, 73, 45, 7, 74, 46],
[1, 53, 23, 37, 54, 24],
[19, 45, 15, 26, 46, 16],
# 30
[5, 145, 115, 10, 146, 116],
[19, 75, 47, 10, 76, 48],
[15, 54, 24, 25, 55, 25],
[23, 45, 15, 25, 46, 16],
# 31
[13, 145, 115, 3, 146, 116],
[2, 74, 46, 29, 75, 47],
[42, 54, 24, 1, 55, 25],
[23, 45, 15, 28, 46, 16],
# 32
[17, 145, 115],
[10, 74, 46, 23, 75, 47],
[10, 54, 24, 35, 55, 25],
[19, 45, 15, 35, 46, 16],
# 33
[17, 145, 115, 1, 146, 116],
[14, 74, 46, 21, 75, 47],
[29, 54, 24, 19, 55, 25],
[11, 45, 15, 46, 46, 16],
# 34
[13, 145, 115, 6, 146, 116],
[14, 74, 46, 23, 75, 47],
[44, 54, 24, 7, 55, 25],
[59, 46, 16, 1, 47, 17],
# 35
[12, 151, 121, 7, 152, 122],
[12, 75, 47, 26, 76, 48],
[39, 54, 24, 14, 55, 25],
[22, 45, 15, 41, 46, 16],
# 36
[6, 151, 121, 14, 152, 122],
[6, 75, 47, 34, 76, 48],
[46, 54, 24, 10, 55, 25],
[2, 45, 15, 64, 46, 16],
# 37
[17, 152, 122, 4, 153, 123],
[29, 74, 46, 14, 75, 47],
[49, 54, 24, 10, 55, 25],
[24, 45, 15, 46, 46, 16],
# 38
[4, 152, 122, 18, 153, 123],
[13, 74, 46, 32, 75, 47],
[48, 54, 24, 14, 55, 25],
[42, 45, 15, 32, 46, 16],
# 39
[20, 147, 117, 4, 148, 118],
[40, 75, 47, 7, 76, 48],
[43, 54, 24, 22, 55, 25],
[10, 45, 15, 67, 46, 16],
# 40
[19, 148, 118, 6, 149, 119],
[18, 75, 47, 31, 76, 48],
[34, 54, 24, 34, 55, 25],
[20, 45, 15, 61, 46, 16]
].freeze
def self.get_rs_blocks(version, error_correct_level)
rs_block = QRRSBlock.get_rs_block_table(version, error_correct_level)
if rs_block.nil?
raise QRCodeRunTimeError,
"bad rsblock @ version: #{version}/error_correct_level:#{error_correct_level}"
end
length = rs_block.size / 3
list = []
(0...length).each do |i|
count = rs_block[i * 3 + 0]
total_count = rs_block[i * 3 + 1]
data_count = rs_block[i * 3 + 2]
(0...count).each do |j|
list << QRRSBlock.new(total_count, data_count)
end
end
list
end
def self.get_rs_block_table(version, error_correct_level)
case error_correct_level
when QRERRORCORRECTLEVEL[:l]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 0]
when QRERRORCORRECTLEVEL[:m]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 1]
when QRERRORCORRECTLEVEL[:q]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 2]
when QRERRORCORRECTLEVEL[:h]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 3]
end
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_segment.rb 0000664 0000000 0000000 00000002556 15002446311 0025355 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRSegment
attr_reader :data, :mode
def initialize(data:, mode: nil)
@data = data
@mode = QRMODE_NAME.dig(mode&.to_sym)
# If mode is not explicitly found choose mode according to data type
@mode ||= if RQRCodeCore::QRNumeric.valid_data?(@data)
QRMODE_NAME[:number]
elsif QRAlphanumeric.valid_data?(@data)
QRMODE_NAME[:alphanumeric]
else
QRMODE_NAME[:byte_8bit]
end
end
def size(version)
4 + header_size(version) + content_size
end
def header_size(version)
QRUtil.get_length_in_bits(QRMODE[mode], version)
end
def content_size
chunk_size, bit_length, extra = case mode
when :mode_number
[3, QRNumeric::NUMBER_LENGTH[3], QRNumeric::NUMBER_LENGTH[data_length % 3] || 0]
when :mode_alpha_numk
[2, 11, 6]
when :mode_8bit_byte
[1, 8, 0]
end
(data_length / chunk_size) * bit_length + (((data_length % chunk_size) == 0) ? 0 : extra)
end
def writer
case mode
when :mode_number
QRNumeric.new(data)
when :mode_alpha_numk
QRAlphanumeric.new(data)
when :mode_multi
QRMulti.new(data)
else
QR8bitByte.new(data)
end
end
private
def data_length
data.bytesize
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/qrcode/qr_util.rb 0000664 0000000 0000000 00000015777 15002446311 0024701 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRUtil
PATTERN_POSITION_TABLE = [
[],
[6, 18],
[6, 22],
[6, 26],
[6, 30],
[6, 34],
[6, 22, 38],
[6, 24, 42],
[6, 26, 46],
[6, 28, 50],
[6, 30, 54],
[6, 32, 58],
[6, 34, 62],
[6, 26, 46, 66],
[6, 26, 48, 70],
[6, 26, 50, 74],
[6, 30, 54, 78],
[6, 30, 56, 82],
[6, 30, 58, 86],
[6, 34, 62, 90],
[6, 28, 50, 72, 94],
[6, 26, 50, 74, 98],
[6, 30, 54, 78, 102],
[6, 28, 54, 80, 106],
[6, 32, 58, 84, 110],
[6, 30, 58, 86, 114],
[6, 34, 62, 90, 118],
[6, 26, 50, 74, 98, 122],
[6, 30, 54, 78, 102, 126],
[6, 26, 52, 78, 104, 130],
[6, 30, 56, 82, 108, 134],
[6, 34, 60, 86, 112, 138],
[6, 30, 58, 86, 114, 142],
[6, 34, 62, 90, 118, 146],
[6, 30, 54, 78, 102, 126, 150],
[6, 24, 50, 76, 102, 128, 154],
[6, 28, 54, 80, 106, 132, 158],
[6, 32, 58, 84, 110, 136, 162],
[6, 26, 54, 82, 110, 138, 166],
[6, 30, 58, 86, 114, 142, 170]
].freeze
G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0
G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0
G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1
DEMERIT_POINTS_1 = 3
DEMERIT_POINTS_2 = 3
DEMERIT_POINTS_3 = 40
DEMERIT_POINTS_4 = 10
BITS_FOR_MODE = {
QRMODE[:mode_number] => [10, 12, 14],
QRMODE[:mode_alpha_numk] => [9, 11, 13],
QRMODE[:mode_8bit_byte] => [8, 16, 16]
}.freeze
# This value is used during the right shift zero fill step. It is
# auto set to 32 or 64 depending on the arch of your system running.
# 64 consumes a LOT more memory. In tests it's shown changing it to 32
# on 64 bit systems greatly reduces the memory footprint. You can use
# RQRCODE_CORE_ARCH_BITS to make this change but beware it may also
# have unintended consequences so use at your own risk.
ARCH_BITS = ENV.fetch("RQRCODE_CORE_ARCH_BITS", nil)&.to_i || 1.size * 8
def self.max_size
PATTERN_POSITION_TABLE.count
end
def self.get_bch_format_info(data)
d = data << 10
while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15) >= 0
d ^= (G15 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15)))
end
((data << 10) | d) ^ G15_MASK
end
def self.rszf(num, count)
# right shift zero fill
(num >> count) & ((1 << (ARCH_BITS - count)) - 1)
end
def self.get_bch_version(data)
d = data << 12
while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18) >= 0
d ^= (G18 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18)))
end
(data << 12) | d
end
def self.get_bch_digit(data)
digit = 0
while data != 0
digit += 1
data = QRUtil.rszf(data, 1)
end
digit
end
def self.get_pattern_positions(version)
PATTERN_POSITION_TABLE[version - 1]
end
def self.get_mask(mask_pattern, i, j)
if mask_pattern > QRMASKCOMPUTATIONS.size
raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}"
end
QRMASKCOMPUTATIONS[mask_pattern].call(i, j)
end
def self.get_error_correct_polynomial(error_correct_length)
a = QRPolynomial.new([1], 0)
(0...error_correct_length).each do |i|
a = a.multiply(QRPolynomial.new([1, QRMath.gexp(i)], 0))
end
a
end
def self.get_length_in_bits(mode, version)
if !QRMODE.value?(mode)
raise QRCodeRunTimeError, "Unknown mode: #{mode}"
end
if version > 40
raise QRCodeRunTimeError, "Unknown version: #{version}"
end
if version.between?(1, 9)
# 1 - 9
macro_version = 0
elsif version <= 26
# 10 - 26
macro_version = 1
elsif version <= 40
# 27 - 40
macro_version = 2
end
BITS_FOR_MODE[mode][macro_version]
end
def self.get_lost_points(modules)
demerit_points = 0
demerit_points += QRUtil.demerit_points_1_same_color(modules)
demerit_points += QRUtil.demerit_points_2_full_blocks(modules)
demerit_points += QRUtil.demerit_points_3_dangerous_patterns(modules)
demerit_points += QRUtil.demerit_points_4_dark_ratio(modules)
demerit_points
end
def self.demerit_points_1_same_color(modules)
demerit_points = 0
module_count = modules.size
# level1
(0...module_count).each do |row|
(0...module_count).each do |col|
same_count = 0
dark = modules[row][col]
(-1..1).each do |r|
next if row + r < 0 || module_count <= row + r
(-1..1).each do |c|
next if col + c < 0 || module_count <= col + c
next if r == 0 && c == 0
if dark == modules[row + r][col + c]
same_count += 1
end
end
end
if same_count > 5
demerit_points += (DEMERIT_POINTS_1 + same_count - 5)
end
end
end
demerit_points
end
def self.demerit_points_2_full_blocks(modules)
demerit_points = 0
module_count = modules.size
# level 2
(0...(module_count - 1)).each do |row|
(0...(module_count - 1)).each do |col|
count = 0
count += 1 if modules[row][col]
count += 1 if modules[row + 1][col]
count += 1 if modules[row][col + 1]
count += 1 if modules[row + 1][col + 1]
if count == 0 || count == 4
demerit_points += DEMERIT_POINTS_2
end
end
end
demerit_points
end
def self.demerit_points_3_dangerous_patterns(modules)
demerit_points = 0
module_count = modules.size
# level 3
modules.each do |row|
(module_count - 6).times do |col_idx|
if row[col_idx] &&
!row[col_idx + 1] &&
row[col_idx + 2] &&
row[col_idx + 3] &&
row[col_idx + 4] &&
!row[col_idx + 5] &&
row[col_idx + 6]
demerit_points += DEMERIT_POINTS_3
end
end
end
(0...module_count).each do |col|
(0...(module_count - 6)).each do |row|
if modules[row][col] &&
!modules[row + 1][col] &&
modules[row + 2][col] &&
modules[row + 3][col] &&
modules[row + 4][col] &&
!modules[row + 5][col] &&
modules[row + 6][col]
demerit_points += DEMERIT_POINTS_3
end
end
end
demerit_points
end
def self.demerit_points_4_dark_ratio(modules)
# level 4
dark_count = modules.reduce(0) do |sum, col|
sum + col.count(true)
end
# Convert to float to prevent integer division
ratio = dark_count.to_f / (modules.size * modules.size)
ratio_delta = (100 * ratio - 50).abs / 5
ratio_delta * DEMERIT_POINTS_4
end
end
end
whomwah-rqrcode_core-157b08e/lib/rqrcode_core/version.rb 0000664 0000000 0000000 00000000112 15002446311 0023403 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
VERSION = "2.0.0"
end
whomwah-rqrcode_core-157b08e/rqrcode_core.gemspec 0000664 0000000 0000000 00000002571 15002446311 0022203 0 ustar 00root root 0000000 0000000 lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "rqrcode_core/version"
Gem::Specification.new do |spec|
spec.name = "rqrcode_core"
spec.version = RQRCodeCore::VERSION
spec.platform = Gem::Platform::RUBY
spec.authors = ["Duncan Robertson"]
spec.email = ["duncan@whomwah.com"]
spec.summary = "A library to encode QR Codes"
spec.description = <<~EOF
rqrcode_core is a Ruby library for encoding QR Codes. The simple
interface (with no runtime dependencies) allows you to create QR Code data structures.
EOF
spec.homepage = "https://github.com/whomwah/rqrcode_core"
spec.license = "MIT"
spec.metadata = {
"bug_tracker_uri" => "https://github.com/whomwah/rqrcode_core/issues",
"changelog_uri" => "https://github.com/whomwah/rqrcode_core/blob/main/CHANGELOG.md"
}
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
end
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.required_ruby_version = "~> 3.0"
spec.add_development_dependency "bundler", "~> 2.0"
spec.add_development_dependency "rake", "~> 13.0"
spec.add_development_dependency "minitest", "~> 5.0"
spec.add_development_dependency "standard", "~> 1.41"
end
whomwah-rqrcode_core-157b08e/test/ 0000775 0000000 0000000 00000000000 15002446311 0017141 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/test/benchmark.rb 0000664 0000000 0000000 00000000377 15002446311 0021427 0 ustar 00root root 0000000 0000000 $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
require "rqrcode_core"
require "benchmark"
Benchmark.bm do |benchmark|
benchmark.report("RQRCode") do
1000.times do
RQRCodeCore::QRCode.new("https://kyan.com").to_s
end
end
end
whomwah-rqrcode_core-157b08e/test/rqrcode_core/ 0000775 0000000 0000000 00000000000 15002446311 0021610 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-157b08e/test/rqrcode_core/data.rb 0000664 0000000 0000000 00000234534 15002446311 0023061 0 ustar 00root root 0000000 0000000 MATRIX_1_H = [[true, true, true, true, true, true, true, false, true, true, false, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, false, false, false, true, true, false, false, true, false, true, false, false, true, false, true, false, true, false, true], [true, true, true, true, true, false, false, true, false, false, true, false, false, true, true, false, true, true, true, true, false], [false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, false, true, true, true, true, false], [false, true, false, false, true, false, false, false, true, false, false, false, true, false, true, false, true, true, true, false, false], [false, true, true, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, false, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, false, false, false, false, false, true, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, false, true, false, false, true, true, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, false, false, true, false]]
MATRIX_3_H = [[true, true, true, true, true, true, true, false, false, true, true, true, true, false, true, true, false, true, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, false, false, false, false, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, false, true, false, false, false, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, true, true, true, true, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, false, true, false, false, true, false, true, false, false, false, true, true, true, true, false, true, false, false, false, false], [true, false, true, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, false, true, false, false, false, true], [true, false, true, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false, true, false, false, true, true, false, false, true, true, true, false], [false, false, false, false, true, true, false, false, false, true, true, true, true, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true], [false, false, true, true, true, true, true, false, false, false, false, true, true, true, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false], [false, true, true, true, true, false, false, true, true, false, true, true, false, true, true, false, true, false, false, false, false, false, false, false, false, true, true, false, false], [false, true, true, true, true, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false, true, false, true, false, false, false, true, false], [true, false, true, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, false, true, true, true, true, false, true, true, false, true, true], [false, true, true, true, false, false, true, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, false, true, true], [false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, false], [true, false, false, true, false, true, true, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, true, false, false], [false, false, true, true, true, true, false, false, false, true, true, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, false, false, true], [false, true, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, false, false, true, true, true, true, true, true, false, true, true], [false, false, false, false, false, false, false, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, false, false, true, true, true, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, false, false, false, false], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, true, false, false, false, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, true, false, false, true, true, false, true, false, false, true, false, true, true, true, true, true, false, true, true, false], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true, true, true, true, true, true, true, false, true, false, false], [true, false, true, true, true, false, true, false, true, false, true, true, true, false, true, true, false, true, false, true, false, false, true, true, false, false, false, false, true], [true, false, false, false, false, false, true, false, false, false, false, false, false, true, false, true, true, true, true, true, false, true, false, true, false, false, false, true, false], [true, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, true, true, true, false]]
MATRIX_5_H = [[true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, true, false, false, true, false, true, true, false, true, true, true, true, false, false, true, true, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, false, true, false, true, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, false, true, false, false, false, false, true, true, true, false, true, true, true, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, true, true, false, true, true, false, true, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, false, true, true, false, true, true, false, true, false, true, false, false, true, true, false, true, false, true, false, false, true, true, true, true, true, false, false, false, false, false, false, true, true, false, false], [false, false, false, true, false, true, false, false, false, false, true, true, true, true, false, true, false, true, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, true, true], [false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, true, false, true, false, true, false, true, true, true, true, true, false, false, false, false, true, true], [true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, false, false, false, false, true, false, true, false, false, true, true, false, true, false, true], [true, false, true, true, false, false, true, true, false, true, true, true, true, false, true, true, false, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true, true, false, true, true, true], [true, false, false, true, true, false, false, false, true, false, false, false, true, false, true, true, true, true, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, true, false, true, true, true, false, false, true, false, false, false, false, false, false, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, false], [true, true, false, false, true, true, false, true, false, true, true, false, false, true, true, true, true, false, true, false, false, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false], [false, true, true, false, true, false, true, false, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, true, true, false, false, true, false, false, false, true, true, false, true, false, false], [true, false, false, true, true, true, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false], [false, true, false, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true, false, false, false, false, false, false, true, true, false, true, true, true, false, true, false, true, false, true], [true, true, true, false, true, true, false, false, true, true, true, true, true, true, true, true, false, true, true, false, false, false, false, false, false, true, false, true, true, true, true, true, true, false, false, false, false], [false, false, false, false, false, true, true, true, false, false, true, true, true, true, true, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, true, false, true, true, true], [true, true, true, false, true, true, false, false, true, true, true, true, false, false, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, true, true, true, true, true, false, false, true], [false, false, true, false, false, false, true, false, false, true, true, true, true, false, true, true, false, true, true, true, false, false, true, false, true, false, true, true, false, true, true, false, false, true, true, false, false], [true, false, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, true, false, true, true, true, false, true, true, false, false, true, true, true, true, false, true, false], [false, false, false, true, false, true, true, true, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, true, true, false, true, true, true, false, true, true, true, false, false], [true, false, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, true, false, true, false, false, false, true, true, true, true, true, true, true, false, true], [true, true, true, true, false, false, true, false, true, false, true, false, false, true, false, false, false, true, false, true, false, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, false], [true, false, false, false, false, false, false, false, true, true, false, false, true, true, false, false, true, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, true, true, false, false, false], [true, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, false, true, true, false, true, true, true, false, false, false, false, true, true, true, true, true, true, false, false, false], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, false, false, true, false, false, false, true, true, true, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, true, true, true, false, true, false, true, false, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true, true, false, true, true, false, false, false, true, true, false, true, true], [true, false, true, true, true, false, true, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true], [true, false, true, true, true, false, true, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, true, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true], [true, true, true, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, true, false, true]]
MATRIX_10_H = [[true, true, true, true, true, true, true, false, false, true, false, true, true, true, true, false, false, true, false, true, true, false, true, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, false, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, true, true, true, true, true, true, true, true, true, true, false, false, true, false, true, false, true, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, false, true, true, false, false, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, true, true, false, true, true, true, true, true, false, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, true, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, false, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, false, true, false, true, false, true, true, true, false, false, true, true, false, true, false, false, false, false], [false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, false, false, true, true, false, true, false, true, true, true, true, true, false, true, false], [true, true, false, false, false, true, true, true, false, false, false, false, true, true, false, true, true, false, false, true, true, true, false, true, true, false, false, false, true, true, false, true, true, true, false, true, true, false, true, false, false, true, false, true, false, true, false, true, true, false, true, true, true, true, true, false, true], [true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, false, false, false, true, false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, false, false, true, false, false, true, true, true, true, false, false, false, true, true, false, false], [false, true, true, true, true, false, true, true, true, false, false, false, true, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, true, true, false, true, false, true, false, false, false, true, false, false, true, true, true, true, true, false, false, true, true, true, false, false, false, false, true, false, false], [true, true, true, true, false, true, false, false, true, false, false, false, false, false, false, false, true, true, true, false, false, false, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, false, true, false, true, true, false, false, false, true, false, true, false, false, true, true, false, true, false, false, true], [false, true, true, true, true, true, true, false, false, true, false, true, true, true, false, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, true, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, true, true, true, false, false, true], [false, true, false, false, true, false, false, false, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, false, false, true, false, true, false, true, false, false, true, true, true, true, false, false, true, false, true], [false, false, true, true, true, true, true, false, true, true, false, false, false, false, false, false, true, true, true, false, true, true, true, false, false, true, true, true, false, true, true, true, false, false, false, false, false, false, false, false, false, true, true, false, true, true, false, true, false, false, false, true, true, false, false, true, false], [true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, true, true, false, true, false, false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, false, false], [true, true, true, false, false, true, true, true, true, true, false, true, false, false, false, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false], [false, true, false, true, true, true, false, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, false, false, false, true, true, true], [false, false, true, false, false, true, true, false, true, true, true, false, false, true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false], [true, false, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, true, true, false, true, true, false, false, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, true, false, false, false], [false, true, false, true, true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, false, true, false, false, false, false, false, true, true, true, true, true, true, false, true], [false, true, false, true, false, false, false, true, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, false, false, true, false, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, true, true, true, true, false], [true, false, false, false, true, true, true, false, false, false, false, true, false, false, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false], [true, false, true, false, true, false, false, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, false, true, false, true, true, false, false, false, true, true, false, true, false, false, false, true, true], [false, false, true, true, true, true, true, true, true, false, true, true, false, true, false, false, true, true, false, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, true, true, false], [true, true, true, false, true, false, false, false, true, true, true, true, true, true, true, true, false, true, true, true, true, true, false, false, false, true, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, true, true, false], [false, true, false, false, true, false, true, false, true, true, false, false, false, false, true, true, false, false, true, false, false, true, true, false, false, true, true, false, true, false, true, false, false, false, false, true, false, true, true, false, false, true, true, true, false, false, true, false, true, false, true, false, true, true, true, false, true], [false, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, false, false, false, false, true, true, true, false, false, false, true, true, true, false, true, false, true, true, false, true, true, true, true, true, true, true, false, true, true, false, false, false, true, true, true, false, false], [true, true, true, false, true, true, true, true, true, true, false, true, false, false, false, false, true, false, false, false, true, false, true, false, true, true, true, true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, false, false, false, false], [false, false, true, true, true, false, false, true, false, false, true, false, true, false, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, true, false, false, false, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true], [false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, true, true, true, true, true, true, true, false, false, false, true, true, false, false, true, false, false, true, false, true, false, false, true, true, true, false, true, false, true, false, true, true, false, true, true, false, false, true, false, false, true, false], [false, false, true, false, true, false, false, false, true, true, false, false, true, true, true, true, false, false, false, true, false, false, true, true, false, true, true, false, false, false, true, true, true, true, false, false, true, true, true, true, true, false, true, true, false, true, false, true, true, true, false, false, true, false, true, false, false], [false, true, true, false, true, true, true, false, false, false, false, false, true, false, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, true, false, false, false, true, false, true, false, true, true, true, false, false, false, true, true, false, true, false, false, true, false, true, false, false, true, false], [false, false, false, true, true, false, false, false, true, false, false, true, true, false, true, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, true, true, true, false, true, false, false, true, false, true, true, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, true], [true, true, true, true, true, false, true, true, true, true, false, true, true, false, false, false, false, true, false, false, true, false, true, true, true, false, false, false, true, false, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, true, true, false, false, false, false, true, true, true, true], [false, false, true, false, true, false, false, false, false, false, false, false, true, true, false, true, false, true, true, true, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, false, false, true, false, false, true, true, false, true, true, true, false, false, false, true, true, true], [false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, false], [false, false, false, false, true, true, false, true, true, false, false, false, false, false, true, true, true, false, false, true, true, false, false, false, true, false, false, true, false, true, true, true, true, true, true, true, false, false, false, true, false, false, true, true, false, false, true, false, false, true, false, true, false, true, false, true, false], [true, false, false, false, false, true, true, true, false, false, false, false, true, false, true, true, false, true, false, false, false, true, true, true, true, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, false, false, true], [true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, true, false, true, true, false, true, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false], [true, true, true, false, true, false, true, true, false, true, false, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, true, true, false, false, true, true, true, false, false, true, false, true, false, true, false, true, true, true, true, true, true], [true, false, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, true, false, true, false, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, false], [true, true, true, true, false, false, true, true, true, false, false, true, false, true, false, false, false, true, true, true, true, true, false, false, false, false, true, true, false, false, false, true, true, false, true, false, false, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, true, false, false, true], [false, false, true, false, true, true, false, false, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, false, true, false, false, true, true, true, false, false, true, false, true, false, true, false, false, true, true, false, true, false, true, false, true, false], [true, false, true, false, false, true, true, true, true, false, false, true, false, false, true, true, false, true, false, false, false, false, false, false, false, false, true, false, true, true, true, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, false, true, false, false, true, true, false, true, true, false, true], [true, true, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, false, true, true, true, false, false, true, false, false, true, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, true, true, true, false, false], [false, false, false, false, false, false, true, true, false, false, true, true, false, true, true, true, true, true, false, false, true, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false], [false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, false, false, true, true, true, false, false, true, false, false, true, true, false, false, false, true, true, false, true, false, true, true, true, false, false, true, true, false, false, false, true, true, true, true, false, false, false, true, true, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, true, true, false, true, true, false, true, false, true, false, true, false, false, false, false, true, false, true, false, true, false, false, true, false, true, true, true, false, true, false, true, true, false, false, true], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, false, true, true, true, true, true, true, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, true, true, true, false, false, false, false, true, false, false, true, false, false, true, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false], [true, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, true, false, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, true, true, false, false, false, true, true, false, false, true, true, false, false, false, true, false], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, false, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false, true, true, true, true, true, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, true, false, false, true, true, false, false], [true, false, false, false, false, false, true, false, false, false, false, true, true, false, false, false, true, true, true, true, false, false, false, true, false, false, false, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, true, true, true, true, false, true, false, false, true, false, true, false, true, true, true, false, false, true, false, true, false, false, false, false, true, false, true, true, true, false, false, false]]
MATRIX_4_H = [[true, true, true, true, true, true, true, false, false, true, true, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, false, true, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, true, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, false, true, false, false, false, false, false, true, true, true, false, true, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true, true, true, false, true, true, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, true, false, false, false, false, true, true, true, false, false, false, false, true, true, true, true, true, true, false, true, false, false, false, false], [false, true, true, true, false, false, false, true, false, false, false, false, false, false, true, false, true, false, true, true, false, true, false, true, false, false, true, true, false, true, true, false, true], [true, false, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, true, false, true, true, true], [false, false, true, true, false, true, false, true, true, true, true, true, false, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, true, false, false, true], [true, false, false, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, false, true, false, false, false, true, false, false, true, true, false, false, false], [false, false, false, true, true, true, false, true, false, true, false, false, false, true, false, false, true, true, false, false, true, false, false, false, true, false, false, false, false, true, false, true, false], [false, false, false, false, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false, true, false, true, true, false, true, false, true, true, true, false, false, false, false], [true, true, true, true, true, true, false, false, false, true, false, false, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, true, true, false, true, true, false], [true, false, false, true, false, false, true, false, false, true, false, true, true, false, true, false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, true, false, true], [false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, false, false, true], [false, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, true, true, false, false, false, true, false, false, false, false, true, false, false, false], [true, false, true, true, true, true, false, false, true, false, false, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false], [false, false, true, false, true, false, true, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, true, false], [true, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, false, true, false, false, false, true, false, false, true, false, false, true, false, false, true], [false, false, true, true, false, false, true, false, true, false, false, true, false, true, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, false, true, true, true], [false, true, false, false, true, true, false, false, false, false, true, true, true, false, true, false, true, false, true, true, true, false, false, true, false, true, true, true, false, false, false, false, true], [true, false, false, true, false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true], [false, false, false, false, false, false, false, false, true, false, true, true, false, false, false, true, true, true, false, false, true, true, false, true, true, false, false, false, true, true, false, false, false], [true, true, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, true, true, false, true, true, false, true, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, false, false, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, false], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, false, true, false, false, false, true, true], [true, false, true, true, true, false, true, false, true, true, true, true, false, false, true, true, true, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, false], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, true, false, false, true, false, false, false, true, true, true, false, true, false, false, false, false, true, true, true, true, true, false, false]]
MATRIX_1_L = [[true, true, true, true, true, true, true, false, false, true, true, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, true, true, true, false, false, false, false, false, false, false, false], [true, true, false, false, false, true, true, true, false, true, false, false, true, false, false, false, true, true, false, false, false], [false, true, true, false, true, true, false, true, true, true, true, false, true, false, true, false, true, true, true, true, false], [true, false, false, false, false, false, true, false, true, false, false, true, false, true, false, false, true, true, true, true, false], [false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, true, true, false, false], [true, true, false, true, false, true, true, false, true, false, true, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, true, true, false, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, true, true, true, true, true, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, true, false, true, false, false, false, true, false]]
MATRIX_1_M = [[true, true, true, true, true, true, true, false, true, false, true, false, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false], [true, false, true, false, false, false, true, true, false, true, false, true, true, false, false, true, false, false, true, false, true], [false, false, true, true, true, true, false, true, true, true, false, false, false, false, false, false, false, true, false, true, true], [true, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, true], [false, false, true, true, true, true, false, true, true, true, true, false, true, false, false, false, true, true, false, false, false], [false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, true, false, true, false, true, true, false, false, true, true, false, true], [true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, true, false, false, true], [true, false, false, false, false, false, true, false, false, false, true, true, false, true, true, false, true, true, false, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, true, true, false, false, true, false, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false], [true, false, true, true, true, false, true, false, true, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false], [true, true, true, true, true, true, true, false, true, true, false, false, false, false, true, true, true, true, false, false, true]]
MATRIX_1_Q = [[true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false], [false, true, false, false, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, true], [false, true, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, true, true, true, false], [false, false, false, false, false, true, true, true, true, false, false, true, false, true, false, false, true, true, true, true, false], [true, false, false, true, true, true, false, false, false, true, false, true, false, false, false, false, true, true, true, false, false], [false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, false, true, false, true, false, false, false, true, false]]
MATRIX_4_L = [[true, true, true, true, true, true, true, false, true, true, true, false, true, false, false, false, false, true, false, true, true, false, true, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, true, false, true, true, false, false, false, false, true, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, false, true, false, false, true, true, true, true, true, false, false, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, false, true, true, false, true, false, true, true, false, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, false, false, true, false, true, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false], [true, true, false, false, true, true, true, false, false, false, false, true, false, true, true, true, true, false, true, false, false, true, false, false, true, false, false, true, false, true, true, true, true], [true, false, true, true, true, true, false, true, false, true, true, false, true, false, false, false, false, true, false, true, true, false, true, true, false, false, false, true, false, false, true, true, false], [false, true, true, true, false, false, true, true, true, false, false, true, true, true, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true, true, true, true, false], [true, true, true, true, true, true, false, true, true, false, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, false, true, true, true, false, false, false, true], [false, true, false, true, true, true, true, true, true, false, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, false, true, true, true, false, false, false, false], [false, true, false, true, false, false, false, false, true, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, true, false, false, true, true, false], [false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, false, true, true, false, true, false, false, true, true, true, true, true, false, false, true, true, false, false], [true, true, false, false, true, false, false, false, true, true, true, false, true, false, true, false, false, true, true, true, true, true, true, false, false, true, true, false, false, false, false, true, true], [false, false, false, true, false, true, true, false, true, true, true, true, false, true, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, false, true], [false, true, true, true, true, true, false, true, false, true, true, false, true, false, false, false, false, true, false, true, true, true, false, true, false, true, false, false, false, false, true, false, false], [true, false, false, true, false, true, true, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, false, true, true, true, false, false, false, false, true, true, false], [false, true, false, true, false, true, false, false, true, false, false, true, false, true, false, true, true, false, false, false, false, true, true, true, true, true, true, true, false, true, false, true, true], [true, false, false, false, false, true, true, false, false, true, true, false, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true], [true, false, false, true, true, false, false, true, true, false, false, false, false, true, true, false, true, false, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false], [false, false, false, false, false, true, true, true, true, false, true, false, false, false, false, false, true, true, false, true, false, false, false, true, true, false, false, false, true, true, true, true, false], [false, false, false, true, true, true, false, true, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, false, true, false, true, false, false, true, true], [true, true, false, true, false, true, true, false, false, false, true, true, false, true, true, true, true, false, true, false, false, false, false, true, true, true, true, true, true, false, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, true, false, false], [true, true, true, true, true, true, true, false, false, false, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, true, false, true, false, true, true, false], [true, false, false, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, true, true, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, true, false, true, true, true, true, false, true, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, true, true, false, true, true, true, false, false, false, true]]
MATRIX_4_M = [[true, true, true, true, true, true, true, false, true, true, false, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, false, false, false, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, true, false, false, true, true, true, true, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, true, true, true, true, true, false, false, true, false, false, false, false, false, false, false, false], [true, false, false, false, true, false, true, true, true, false, true, false, true, false, false, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, false, false, true], [true, true, false, true, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, false, true, false, false, false, true, true, true, true], [false, false, false, false, true, false, true, false, true, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, true, false, false, false, false, false, true, false, false], [true, false, true, true, true, true, false, true, true, false, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, false, true, true], [false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, false, true, false, false, true, false, false, true, false, false, true, true, false, false, true, false, false, true], [true, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, true, false, true, true, true, true, false, false, false], [false, true, true, true, false, true, true, false, false, false, true, false, false, true, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, true, false], [true, true, false, false, true, false, false, false, false, false, true, true, true, true, false, true, true, true, true, false, false, true, true, true, false, false, true, false, false, false, true, true, true], [false, true, true, true, false, false, true, true, true, false, false, true, true, false, false, false, true, true, false, true, true, true, true, false, false, false, true, false, true, false, true, false, true], [false, false, true, true, true, false, false, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, true, true, false, true, false, true, false, true, true, false, false], [false, false, false, true, false, true, true, true, true, true, true, false, true, true, false, true, true, true, false, false, false, true, true, true, false, true, true, true, false, false, true, true, false], [true, true, false, true, false, false, false, true, false, true, false, false, true, true, true, true, true, true, true, true, false, true, false, false, true, false, true, true, true, true, false, false, false], [false, false, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, true, true, true, false, false, true, true, false, false, true, false, false, false, false, false], [true, true, true, true, false, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, true, false, false], [false, false, false, true, true, true, true, true, true, false, false, true, true, false, true, false, true, false, false, true, false, false, true, false, false, false, false, false, true, false, false, true, false], [false, false, false, false, false, true, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, false], [true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, true, false, false, true, false, false, true, false, false, false, true, true, false, true, false], [true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, true, false], [true, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, true, true, false, true, true, true, false, false, false, true, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, true, true, false, true, false, false, true, false, false, true, false, true, true, true, true, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, true, true, false, false, true, true, true, true, true, false, true, false, false, true, false, true, true, false, true, false], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, false], [true, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, false, false, true, false, false, true, false, false], [true, true, true, true, true, true, true, false, true, true, true, true, false, true, true, false, false, true, false, true, true, true, true, false, true, false, true, false, false, false, true, false, true]]
MATRIX_4_Q = [[true, true, true, true, true, true, true, false, false, true, true, true, false, true, true, true, false, true, true, false, false, true, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, true, true, false, false, false, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, false, true, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false], [false, true, false, true, true, true, true, false, true, false, false, false, true, true, false, false, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, true, false], [false, false, false, true, true, true, false, false, true, true, false, false, true, false, false, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false], [true, false, false, false, true, false, true, false, true, false, true, false, true, true, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, false, false, true, true], [false, false, false, true, true, false, false, false, false, true, false, false, true, false, true, false, false, false, true, false, false, true, true, true, false, false, true, false, true, false, true, true, true], [true, true, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, false], [true, false, false, false, true, false, false, false, true, false, false, true, true, false, false, true, false, false, true, true, true, false, false, false, true, true, false, true, false, false, true, false, false], [true, false, true, false, true, true, true, true, false, false, false, false, true, false, true, false, true, true, true, true, true, true, true, false, false, false, true, true, true, false, false, false, false], [true, false, true, true, false, false, false, false, false, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, true, false], [false, false, true, false, false, false, true, false, true, false, true, false, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, true, false, false, true, true], [true, true, false, false, true, false, false, true, false, true, true, false, false, true, false, true, false, true, false, true, true, false, false, false, false, false, true, true, true, false, true, false, true], [true, false, true, true, true, true, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, true, true, true, true, false, false, true, false, false, false, true, true], [true, false, false, false, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, false, true, false, true, true, false, true, true, false, false, false, true, false, false], [true, false, true, true, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, false], [true, false, true, false, true, true, false, false, false, true, false, false, false, true, false, false, true, false, true, false, false, false, false, false, false, true, false, false, true, false, true, true, false], [true, false, false, false, true, false, true, false, true, true, false, true, false, false, false, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, true, true, true], [true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, false, false, true, true, false, false, true, true, true, false], [true, true, true, false, false, true, true, false, true, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, true, true, true, false, false, true, true], [false, false, false, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, false, false, false, true, false, false, true, false, false, false, true, true, false, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, false, true, false, false, false, false], [true, false, false, false, false, false, true, false, true, true, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, false, false, true, true, true, true, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, false, false, true, true, true, true, true, true, true, true, true, false, true, true], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, false, false, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, false, true, true, false, false, true, true, true, true, false, false, false, false, false, true, false, false, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true], [true, true, true, true, true, true, true, false, false, true, true, false, true, true, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, false, false, false]]
MATRIX_UTF8_RU_TEST = [[true, true, true, true, true, true, true, false, true, false, true, true, true, true, true, false, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, false, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, true, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, true, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, true, false, false, false, false, true, true, false, false, false, false, false, false, false, false], [false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, false, true, false, true, false, true, false, true], [false, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, false, true, true, false, false, true, true, true], [false, true, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, false, true, false, true, true, false, true, false], [true, true, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, true, true, true, true, false, true, false, false], [false, false, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, true, true, true, true, false, false, true, true], [true, true, true, true, false, true, false, false, false, true, false, true, false, false, true, false, false, true, true, false, false, true, false, false, true], [true, false, false, true, true, false, true, true, true, false, false, true, true, true, false, true, true, true, false, false, true, false, false, false, false], [true, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false, true, false, false, false, true, true, false, true, true], [true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, false, true], [false, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, true, false, false, false, true, false, false, true, true], [true, true, true, true, true, true, true, false, false, true, true, true, false, true, false, true, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, true, true, false, false, true, false, true, true, true, false, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, false, false, true, true, true, true, true, true, false, false, false], [true, false, true, true, true, false, true, false, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, false, true, false, true, false, false, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, false, false, true, true, false, false, true, true, false, true, true, false, true], [true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, true, false, true, true, true, false, true, false, true]]
whomwah-rqrcode_core-157b08e/test/rqrcode_core/qr_segment_test.rb 0000664 0000000 0000000 00000001356 15002446311 0025345 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require "test_helper"
class RQRCodeCore::QRSegmentTest < Minitest::Test
PAYLOAD = [{data: "byteencoded", mode: :byte_8bit}, {data: "A1" * 107, mode: :alphanumeric}, {data: "1" * 498, mode: :number}]
def test_multi_payloads
RQRCodeCore::QRCode.new(PAYLOAD, level: :l)
RQRCodeCore::QRCode.new(PAYLOAD, level: :m)
RQRCodeCore::QRCode.new(PAYLOAD, level: :q)
RQRCodeCore::QRCode.new(PAYLOAD)
RQRCodeCore::QRCode.new(PAYLOAD, level: :l, max_size: 22)
rescue => e
flunk(e)
end
def test_invalid_code_configs
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new(:not_a_string_or_array)
RQRCodeCore::QRCode.new(PAYLOAD << :not_a_segment)
}
end
end
whomwah-rqrcode_core-157b08e/test/rqrcode_core/qr_util_test.rb 0000664 0000000 0000000 00000007224 15002446311 0024660 0 ustar 00root root 0000000 0000000 require "test_helper"
module RQRCodeCore
class QRUtilTest < Minitest::Test
def test_demerit_points_4_dark_ratio
# Test with all white modules (ratio = 0)
# Expected: (100 * 0 - 50).abs / 5 * 10 = 10 * 10 = 100
modules = Array.new(4) { Array.new(4, false) }
assert_equal 100, QRUtil.demerit_points_4_dark_ratio(modules)
# Test with all black modules (ratio = 1)
# Expected: (100 * 1 - 50).abs / 5 * 10 = 50 / 5 * 10 = 10 * 10 = 100
modules = Array.new(4) { Array.new(4, true) }
assert_equal 100, QRUtil.demerit_points_4_dark_ratio(modules)
# Test with half black, half white modules (ratio = 0.5)
# Expected: (100 * 0.5 - 50).abs / 5 * 10 = 0 / 5 * 10 = 0
modules = [
[true, true, false, false],
[true, true, false, false],
[false, false, true, true],
[false, false, true, true]
]
assert_equal 0, QRUtil.demerit_points_4_dark_ratio(modules)
# Test with 25% black modules (ratio = 0.25)
# Expected: (100 * 0.25 - 50).abs / 5 * 10 = 25 / 5 * 10 = 5 * 10 = 50
modules = [
[true, false, false, false],
[false, true, false, false],
[false, false, true, false],
[false, false, false, true]
]
assert_equal 50, QRUtil.demerit_points_4_dark_ratio(modules)
# Test with 75% black modules (ratio = 0.75)
# Expected: (100 * 0.75 - 50).abs / 5 * 10 = 25 / 5 * 10 = 5 * 10 = 50
modules = [
[true, true, true, true],
[true, true, true, false],
[true, true, false, true],
[true, false, false, true]
]
assert_equal 50, QRUtil.demerit_points_4_dark_ratio(modules)
# Test with different sized modules (3x3)
# 3 black out of 9 = 1/3 ratio = 0.33...
# Expected: (100 * (3/9) - 50).abs / 5 * 10 ≈ 16.67 * 10 = 166.7
modules = [
[true, false, false],
[false, true, false],
[false, false, true]
]
expected = ((100 * (3.0 / 9) - 50).abs / 5) * 10
assert_in_delta expected, QRUtil.demerit_points_4_dark_ratio(modules), 0.01
end
def test_demerit_points_4_dark_ratio_edge_cases
# Test with empty modules
# This shouldn't happen in real QR codes, but let's be safe
modules = []
assert QRUtil.demerit_points_4_dark_ratio(modules).nan?
# Test with 1x1 module
# All white
modules = [[false]]
assert_equal 100, QRUtil.demerit_points_4_dark_ratio(modules)
# All black
modules = [[true]]
assert_equal 100, QRUtil.demerit_points_4_dark_ratio(modules)
end
def test_demerit_points_4_dark_ratio_formula
# Test the formula directly for a specific case
# For a 5x5 module with 13 dark cells:
# ratio = 13/25 = 0.52
# ratio_delta = (100 * 0.52 - 50).abs / 5 = 2/5 = 0.4
# demerit points = 0.4 * 10 = 4
modules = [
[true, true, true, false, false],
[true, true, true, false, false],
[true, true, true, false, true],
[true, true, false, false, false],
[true, false, false, false, false]
]
# Count dark modules
dark_count = modules.flatten.count(true)
assert_equal 13, dark_count
# Calculate ratio
ratio = dark_count.to_f / (5 * 5)
assert_in_delta 0.52, ratio, 0.001
# Calculate ratio_delta
ratio_delta = (100 * ratio - 50).abs / 5
assert_in_delta 0.4, ratio_delta, 0.001
# Calculate demerit points
demerit_points = ratio_delta * 10
assert_in_delta 4, demerit_points, 0.001
# Check that our method gives the same result
assert_in_delta 4, QRUtil.demerit_points_4_dark_ratio(modules), 0.001
end
end
end
whomwah-rqrcode_core-157b08e/test/rqrcode_core/regresions_test.rb 0000664 0000000 0000000 00000000342 15002446311 0025353 0 ustar 00root root 0000000 0000000 require "test_helper"
class RegresionTests < Minitest::Test
# Rs block information was incomplete.
def test_code_length_overflow_bug
RQRCodeCore::QRCode.new("s" * 220)
RQRCodeCore::QRCode.new("s" * 195)
end
end
whomwah-rqrcode_core-157b08e/test/rqrcode_core/rqrcode_test.rb 0000664 0000000 0000000 00000016657 15002446311 0024652 0 ustar 00root root 0000000 0000000 require "test_helper"
class RQRCodeCore::BaseTest < Minitest::Test
require_relative "data"
def test_qrcode_argument_error
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
RQRCodeCore::QRCode.new(size: 1, level: :h)
end
assert_equal "data must be a String, QRSegment, or an Array", error.message
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
RQRCodeCore::QRCode.new(nil)
end
assert_equal "data must be a String, QRSegment, or an Array", error.message
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
RQRCodeCore::QRCode.new({})
end
assert_equal "data must be a String, QRSegment, or an Array", error.message
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
RQRCodeCore::QRCode.new(123)
end
assert_equal "data must be a String, QRSegment, or an Array", error.message
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
assert RQRCodeCore::QRCode.new("10000000000000000000", size: 41, level: :h)
end
assert_equal "Given size greater than maximum possible size of 40", error.message
error = assert_raises(RQRCodeCore::QRCodeArgumentError) do
assert RQRCodeCore::QRCode.new("hello", size: 1, level: :a)
end
assert_equal "Unknown error correction level `:a`", error.message
end
def test_qrcode_runtime_error
error = assert_raises(RQRCodeCore::QRCodeRunTimeError) do
RQRCodeCore::QRCode.new("duncan").checked?(0, 999999)
end
assert_equal "Invalid row/column pair: 0, 999999", error.message
error = assert_raises(RQRCodeCore::QRCodeRunTimeError) do
assert RQRCodeCore::QRCode.new("10000000000000000000", size: 1, level: :h)
end
assert_equal "code length overflow. (81>72). (Try a larger size!)", error.message
error = assert_raises(RQRCodeCore::QRCodeRunTimeError) do
assert RQRCodeCore::QRUtil.get_mask(9, 1, 2)
end
assert_equal "bad mask_pattern: 9", error.message
error = assert_raises(RQRCodeCore::QRCodeRunTimeError) do
assert RQRCodeCore::QRUtil.get_length_in_bits(:duncan, 1)
end
assert_equal "Unknown mode: duncan", error.message
error = assert_raises(RQRCodeCore::QRCodeRunTimeError) do
assert RQRCodeCore::QRUtil.get_length_in_bits(1 << 0, 41)
end
assert_equal "Unknown version: 41", error.message
end
def test_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal qr.modules.size, 21
assert_equal qr.modules, MATRIX_1_H
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal qr.modules, MATRIX_1_H
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :l)
assert_equal qr.modules, MATRIX_1_L
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :m)
assert_equal qr.modules, MATRIX_1_M
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :q)
assert_equal qr.modules, MATRIX_1_Q
end
def test_3_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 3)
assert_equal qr.modules.size, 29
assert_equal qr.modules, MATRIX_3_H
end
def test_5_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 5)
assert_equal qr.modules.size, 37
assert_equal qr.modules, MATRIX_5_H
end
def test_10_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 10)
assert_equal qr.modules.size, 57
assert_equal qr.modules, MATRIX_10_H
end
def test_4_H_
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :l, size: 4)
assert_equal qr.modules, MATRIX_4_L
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :m, size: 4)
assert_equal qr.modules, MATRIX_4_M
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :q, size: 4)
assert_equal qr.modules, MATRIX_4_Q
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw")
assert_equal qr.modules.size, 33
assert_equal qr.modules, MATRIX_4_H
end
def test_to_s
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal "xxxxxxx xx x xxxxxxx\n", qr.to_s[0..21]
assert_equal "qqqqqqqnqqnqnnqqqqqqq\n", qr.to_s(dark: "q", light: "n")[0..21]
assert_equal "@@@@@@@ @@ @ @@@@@@@\n", qr.to_s(dark: "@")[0..21]
end
def test_auto_alphanumeric
# Overflowws without the alpha version
assert RQRCodeCore::QRCode.new("1234567890", size: 1, level: :h)
qr = RQRCodeCore::QRCode.new("DUNCAN", size: 1, level: :h)
assert_equal "xxxxxxx xxx xxxxxxx\n", qr.to_s[0..21]
end
def test_manual_alphanumeric
assert_equal :mode_alpha_numk, RQRCodeCore::QRCode.new("DUNCAN", mode: :alphanumeric).mode
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new("Duncan", mode: :alphanumeric)
}
end
def test_auto_numeric
# When digit only automatically uses numeric mode, default ecc level is :h
digits = RQRCodeCore::QRCode.new("1" * 17) # Version 1, numeric mode, ECC h
assert_equal 1, digits.version
assert_equal :mode_number, digits.mode
assert_equal :h, digits.error_correction_level
# When alpha automatically works
alpha = RQRCodeCore::QRCode.new("X" * 10) # Version 1, alpha mode, ECC h
assert_equal 1, alpha.version
assert_equal :mode_alpha_numk, alpha.mode
assert_equal :h, alpha.error_correction_level
# Generic should use binary
binary = RQRCodeCore::QRCode.new("x" * 7) # Version 1, 8bit mode, ECC h
assert_equal 1, binary.version
assert_equal :mode_8bit_byte, binary.mode
assert_equal :h, binary.error_correction_level
end
def test_numeric_2_M
data = "279042272585972554922067893753871413584876543211601021503002"
qr = RQRCodeCore::QRCode.new(data, size: 2, level: :m, mode: :number)
assert_equal "xxxxxxx x x x xxxxxxx\n", qr.to_s[0..25]
end
def test_rszf_error_not_thrown
assert RQRCodeCore::QRCode.new("2 1058 657682")
assert RQRCodeCore::QRCode.new("40952", size: 1, level: :h)
assert RQRCodeCore::QRCode.new("40932", size: 1, level: :h)
assert RQRCodeCore::QRCode.new("", size: 1, level: :h)
assert RQRCodeCore::QRCode.new("0", size: 1, level: :h)
end
def test_exceed_max_size
assert_raises RQRCodeCore::QRCodeArgumentError do
RQRCodeCore::QRCode.new("duncan", size: 41)
end
end
def test_error_correction_level
# attr_reader was wrong
assert_equal RQRCodeCore::QRCode.new("a", level: :h).error_correction_level, :h
end
def test_version_table
# tables in RQRCodeCore::QRCode::QRMAXBITS wasn't updated to support greater versions
assert_equal RQRCodeCore::QRCode.new("1" * 289, level: :h, mode: :number).version, 11
assert_equal RQRCodeCore::QRCode.new("A" * 175, level: :h, mode: :alphanumeric).version, 11
assert_equal RQRCodeCore::QRCode.new("a" * 383, level: :h, mode: :byte_8bit).version, 21
end
def test_levels
assert RQRCodeCore::QRCode.new("duncan", level: :l)
assert RQRCodeCore::QRCode.new("duncan", level: :m)
assert RQRCodeCore::QRCode.new("duncan", level: :q)
assert RQRCodeCore::QRCode.new("duncan", level: :h)
%w[a b c d e f g i j k n o p r s t u v w x y z].each do |ltr|
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new("duncan", level: ltr.to_sym)
}
end
end
def test_utf8
qr = RQRCodeCore::QRCode.new("тест")
assert_equal qr.modules, MATRIX_UTF8_RU_TEST
end
def test_large_integer
RQRCodeCore::QRCode.new((1 << 64).to_s, mode: :number)
RQRCodeCore::QRCode.new(((1 << 64) + 1).to_s, mode: :number)
rescue => e
flunk(e)
end
end
whomwah-rqrcode_core-157b08e/test/test_helper.rb 0000664 0000000 0000000 00000000112 15002446311 0021776 0 ustar 00root root 0000000 0000000 require "bundler/setup"
require "rqrcode_core"
require "minitest/autorun"