Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add EAN barcodes. #57

Merged
merged 116 commits into from
Dec 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
ecc8997
Refactor to support version2.
Dec 4, 2023
3d06b74
Update gold files for new SDK's better alpha blending
Dec 4, 2023
dddb92e
Move some code from texture.toit to common.toit
Dec 4, 2023
7ea4e41
Assemble all the test outputs in one big png.
Dec 4, 2023
30edbe9
Tighter bounds on partial updates
Dec 4, 2023
6ec2d36
Don't be limited by update width so much
Dec 4, 2023
6830c36
Update gold files
Dec 4, 2023
20e353f
Add the simple elements.
Dec 4, 2023
0b46c59
Remove the textures, now it's Elements only.
Dec 4, 2023
4796157
Add style objects.
Dec 4, 2023
e964f81
Add CSS-style gradients as backgrounds.
Dec 4, 2023
7b6a099
Borders with rounded corners and drop shadows.
Dec 4, 2023
9a6e8d1
PngElement for displaying 1-8 bit PNGs.
Dec 4, 2023
1fc3573
EAN barcodes.
Dec 4, 2023
a5205e8
Remove more references to textures
Dec 4, 2023
9fd7994
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 4, 2023
063a4ee
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 4, 2023
978a60f
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 4, 2023
0a08de7
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 4, 2023
70e59c6
Remove barcodes
Dec 4, 2023
c7c5d4b
Add back rudimentary bar code file.
Dec 4, 2023
e54ac0d
Add EAN barcodes.
Dec 4, 2023
4e4c621
Fix command line (non-CI) submodule setup
Dec 5, 2023
b93ed5e
Merge branch 'erik-225-use-pngdiff' into erik-250-tighter-updates
Dec 5, 2023
556a507
Merge branch 'erik-250-tighter-updates' into erik-300-add-elements
Dec 5, 2023
e43d5a6
Merge branch 'erik-300-add-elements' into erik-400-remove-textures
Dec 5, 2023
3e98cb9
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 5, 2023
d9bb619
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 5, 2023
2b522f6
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 5, 2023
cff70cf
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 5, 2023
ea47c59
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 5, 2023
0539190
feedback
Dec 5, 2023
84061af
feedback
Dec 5, 2023
b570730
Merge branch 'erik-225-use-pngdiff' into erik-250-tighter-updates
Dec 5, 2023
bc171ac
Merge branch 'erik-250-tighter-updates' into erik-300-add-elements
Dec 5, 2023
e7c64ce
Merge branch 'erik-300-add-elements' into erik-400-remove-textures
Dec 5, 2023
6d9e3b1
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 5, 2023
554eda9
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 5, 2023
9266ca7
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 5, 2023
fa2fce3
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 5, 2023
22ea90a
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 5, 2023
528ad59
min_w and min_h no longer needed
Dec 5, 2023
e039294
min_w and min_h no longer needed
Dec 5, 2023
30b64d8
Fix too-narrow patches when we hit the display height
Dec 5, 2023
238cdd8
Merge branch 'erik-250-tighter-updates' into erik-300-add-elements
Dec 5, 2023
3ba1d5b
Merge branch 'erik-300-add-elements' into erik-400-remove-textures
Dec 5, 2023
6fd1f64
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 5, 2023
1d03547
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 5, 2023
a655834
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 5, 2023
858088c
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 5, 2023
0d734e2
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 5, 2023
0e203d2
feedback
Dec 5, 2023
b9bba65
Merge branch 'erik-100-version-2' into erik-200-move-to-common
Dec 5, 2023
a3d88f4
Merge branch 'erik-200-move-to-common' into erik-225-use-pngdiff
Dec 5, 2023
fb8110c
Merge branch 'erik-225-use-pngdiff' into erik-250-tighter-updates
Dec 5, 2023
088223f
Merge branch 'erik-250-tighter-updates' into erik-300-add-elements
Dec 5, 2023
746788f
Merge branch 'erik-300-add-elements' into erik-400-remove-textures
Dec 5, 2023
d9df8c9
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 5, 2023
69c550c
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 5, 2023
990bf2c
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 5, 2023
7684d46
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 5, 2023
fd496ce
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 5, 2023
ffb5c9c
Merge remote-tracking branch 'origin/main' into erik-100-version-2
Dec 5, 2023
8923389
Merge branch 'erik-100-version-2' into erik-200-move-to-common
Dec 5, 2023
aa00f7d
Merge remote-tracking branch 'origin/main' into erik-200-move-to-common
Dec 5, 2023
b36ee18
Merge branch 'erik-200-move-to-common' into erik-225-use-pngdiff
Dec 5, 2023
027a569
Merge remote-tracking branch 'origin/main' into erik-225-use-pngdiff
Dec 5, 2023
22bf74e
Merge branch 'erik-225-use-pngdiff' into erik-250-tighter-updates
Dec 5, 2023
e7bdcf8
Merge remote-tracking branch 'origin/main' into erik-250-tighter-updates
Dec 5, 2023
186dd59
Merge branch 'erik-250-tighter-updates' into erik-300-add-elements
Dec 5, 2023
1595417
Merge branch 'erik-300-add-elements' into erik-400-remove-textures
Dec 5, 2023
3a29de2
Merge branch 'erik-400-remove-textures' into erik-500-styles
Dec 5, 2023
b526026
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 5, 2023
0d38264
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 5, 2023
0bb65f4
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 5, 2023
45e901b
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 5, 2023
5e12953
feedback
Dec 6, 2023
c8d6417
feedback
Dec 6, 2023
ab38eca
feedback
Dec 6, 2023
ed116f2
Merge remote-tracking branch 'origin/erik-300-add-elements' into erik…
Dec 6, 2023
3b85734
Merge remote-tracking branch 'origin/erik-400-remove-textures' into e…
Dec 6, 2023
dd9e645
Merge remote-tracking branch 'origin/erik-500-styles' into erik-550-g…
Dec 6, 2023
d610c27
Merge remote-tracking branch 'origin/erik-550-gradients' into erik-60…
Dec 6, 2023
f683412
Merge remote-tracking branch 'origin/erik-600-rounded-corners' into e…
Dec 6, 2023
bbd6489
Merge remote-tracking branch 'origin/erik-650-png' into erik-700-barc…
Dec 6, 2023
6f40faa
Return any from get_element_by_id
Dec 6, 2023
baa5cf2
Merge remote-tracking branch 'origin/main' into erik-300-add-elements
Dec 6, 2023
afae253
Merge remote-tracking branch 'origin/erik-300-add-elements' into erik…
Dec 6, 2023
a632094
Merge remote-tracking branch 'origin/main' into erik-400-remove-textures
Dec 6, 2023
7c1b708
Merge remote-tracking branch 'origin/erik-400-remove-textures' into e…
Dec 6, 2023
ee4d578
Merge remote-tracking branch 'origin/main' into erik-500-styles
Dec 6, 2023
78d7be8
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 6, 2023
7de1907
Merge remote-tracking branch 'origin/main' into erik-550-gradients
Dec 6, 2023
8fa1edf
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 6, 2023
0201a91
Merge remote-tracking branch 'origin/erik-600-rounded-corners' into e…
Dec 6, 2023
ccaff34
Merge remote-tracking branch 'origin/erik-650-png' into erik-700-barc…
Dec 6, 2023
1b16d03
Merge remote-tracking branch 'origin/main' into erik-500-styles
Dec 7, 2023
687905c
Merge branch 'erik-500-styles' into erik-550-gradients
Dec 7, 2023
8be1ad5
Merge branch 'erik-550-gradients' into erik-600-rounded-corners
Dec 7, 2023
c239f43
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 7, 2023
590d1b7
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 7, 2023
bf60019
Feedback, some reformatting, 3-component loops
Dec 7, 2023
c69ac99
feedback
Dec 7, 2023
81b87a2
Merge branch 'erik-600-rounded-corners' into erik-700-barcodes
Dec 7, 2023
0e410e7
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 7, 2023
a30f18f
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 7, 2023
e9af793
Fix the NoBorder inheritance issue
Dec 7, 2023
77b7b86
Merge remote-tracking branch 'origin/erik-600-rounded-corners' into e…
Dec 7, 2023
45c1abb
Fix wrong refactoring
Dec 7, 2023
3bb7b17
Merge remote-tracking branch 'origin/erik-600-rounded-corners' into e…
Dec 7, 2023
05c3103
Merge remote-tracking branch 'origin/main' into erik-600-rounded-corners
Dec 7, 2023
57b6f6a
Merge branch 'erik-600-rounded-corners' into erik-650-png
Dec 7, 2023
4fdb831
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 7, 2023
4a51825
feedback
Dec 7, 2023
335bc8c
Merge remote-tracking branch 'origin/main' into erik-650-png
Dec 7, 2023
1af0289
Merge branch 'erik-650-png' into erik-700-barcodes
Dec 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions src/bar_code.toit
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
// Use of this source code is governed by an MIT-style license that can be
// found in the LICENSE file.

import font show Font

import .common
import .element show CustomElement
import .style

EAN_13_QUIET_ZONE_WIDTH ::= 9
EAN_13_START_WIDTH ::= 3
EAN_13_MIDDLE_WIDTH ::= 5
Expand All @@ -15,3 +21,110 @@ EAN_13_L_CODES_ ::= [0x0d, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0x0b]
EAN_13_G_CODES_ ::= [0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x05, 0x11, 0x09, 0x17]
// Encoding of the first (invisible) digit.
EAN_13_FIRST_CODES_ ::= [0x00, 0x0b, 0x0d, 0x0e, 0x13, 0x19, 0x1c, 0x15, 0x16, 0x1a]

// Element that draws a standard EAN-13 bar code. TODO: Other scales.
class BarCodeEanElement extends CustomElement:
color_/int? := 0
background_ := 0xff
sans10_ ::= Font.get "sans10"
number_height_ := EAN_13_BOTTOM_SPACE

type -> string: return "bar-code-ean"

set_attribute key/string value -> none:
if key == "color":
if color_ != value:
invalidate
color_ = value
else:
super key value

code_/string := ? // 13 digit code as a string.

code= value/string -> none:
if value != code_: invalidate
code_ = value

code -> string: return code_

/**
$code_: The 13 digit product code.
$x: The left edge of the barcode in the coordinate system of the transform.
$y: The top edge of the barcode in the coordinate system of the transform.
Use $set_styles to set the background to white and the color to black.
*/
constructor .code_/string --x/int?=null --y/int?=null:
// The numbers go below the bar code in a way that depends on the size
// of the digits, so we need to take that into account when calculating
// the bounding box.
number_height_ = (sans10_.text_extent "8")[1]
height := EAN_13_HEIGHT + number_height_ - EAN_13_BOTTOM_SPACE
w := EAN_13_WIDTH
h := height + 1
super --x=x --y=y --w=w --h=h

l_ digit:
return EAN_13_L_CODES_[digit & 0xf]

g_ digit:
return EAN_13_G_CODES_[digit & 0xf]

r_ digit:
return (l_ digit) ^ 0x7f

// Make a white background behind the bar code and draw the digits along the bottom.
draw_background_ canvas/Canvas:
// Bar code coordinates.
text_x := EAN_13_QUIET_ZONE_WIDTH + EAN_13_START_WIDTH
text_y := EAN_13_HEIGHT + number_height_ - EAN_13_BOTTOM_SPACE + 1

canvas.text 1 text_y --text=code_[..1] --color=color_ --font=sans10_

code_[1..7].split "":
if it != "":
canvas.text text_x text_y --text=it --color=color_ --font=sans10_
text_x += EAN_13_DIGIT_WIDTH
text_x += EAN_13_MIDDLE_WIDTH - 1
code_[7..13].split "":
if it != "":
canvas.text text_x text_y --text=it --color=color_ --font=sans10_
text_x += EAN_13_DIGIT_WIDTH
marker_width := (sans10_.text_extent ">")[0]
text_x += EAN_13_START_WIDTH + EAN_13_QUIET_ZONE_WIDTH - marker_width
canvas.text text_x text_y --text=">" --color=color_ --font=sans10_

// Redraw routine.
custom_draw canvas/Canvas:
draw_background_ canvas

x := EAN_13_QUIET_ZONE_WIDTH
long_height := EAN_13_HEIGHT
short_height := EAN_13_HEIGHT - EAN_13_BOTTOM_SPACE
// Start bars: 101.
canvas.rectangle x 0 --w=1 --h=long_height --color=color_
canvas.rectangle x + 2 0 --w=1 --h=long_height --color=color_
x += 3
first_code := EAN_13_FIRST_CODES_[code_[0] & 0xf]
// Left digits using the L or G mapping.
for i := 1; i < 7; i++:
digit := code_[i]
code := ((first_code >> (6 - i)) & 1) == 0 ? (l_ digit) : (g_ digit)
for b := 6; b >= 0; b--:
if ((1 << b) & code) != 0:
canvas.rectangle x 0 --w=1 --h=short_height --color=color_
x++
// Middle bars: 01010
canvas.rectangle x + 1 0 --w=1 --h=long_height --color=color_
canvas.rectangle x + 3 0 --w=1 --h=long_height --color=color_
x += 5
// Left digits using the R mapping.
for i := 7; i < 13; i++:
digit := code_[i]
code := r_ digit
for b := 6; b >= 0; b--:
if ((1 << b) & code) != 0:
canvas.rectangle x 0 --w=1 --h=short_height --color=color_
x++
// End bars: 101.
canvas.rectangle x 0 --w=1 --h=long_height --color=color_
canvas.rectangle x + 2 0 --w=1 --h=long_height --color=color_
37 changes: 37 additions & 0 deletions tests/barcode_visualized.toit
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (C) 2023 Toitware ApS.
// Use of this source code is governed by a Zero-Clause BSD license that can
// be found in the TESTS_LICENSE file.

// Tests drawing a supermarket-style bar code on a pixel display.

import expect show *
import pixel_display show *
import pixel_display.bar_code show *
import pixel_display.element show *
import pixel_display.style show Style
import .png_visualizer

main args:
if args.size != 1:
print "Usage: script.toit png-basename"
exit 1
driver := SeveralColorPngVisualizer 120 160 args[0] --outline=SEVERAL_BLUE
display := SeveralColorPixelDisplay driver --portrait=false
display.background = SEVERAL_GRAY

style := Style --type_map={
"bar-code-ean": Style --color=SEVERAL_BLACK --background=SEVERAL_WHITE,
}

barcode := BarCodeEanElement --x=15 --y=15 "4035999001512"
display.add barcode
display.set_styles [style]
display.draw

barcode.move_to 20 20
display.draw

barcode.code = "4000417020000"
display.draw

driver.write_png
Binary file added tests/gold/barcode_visualized.toit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.