From c9129ed66317abfcd8e7689ef77199bd86bf5309 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 23 Oct 2016 18:34:19 +0100 Subject: works --- Changes | 2 ++ dist.ini | 2 -- lib/Data/QRCode.pm | 46 ++++++++++++++++++++++++++++++++++++++++++++++ lib/Data/QRCode/XS.pm | 43 ++++++------------------------------------- t/base.t | 31 +++++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 39 deletions(-) create mode 100644 Changes create mode 100644 lib/Data/QRCode.pm create mode 100644 t/base.t diff --git a/Changes b/Changes new file mode 100644 index 0000000..0ca684d --- /dev/null +++ b/Changes @@ -0,0 +1,2 @@ +{{$NEXT}} + - first attempt diff --git a/dist.ini b/dist.ini index 5f6eec3..2c9422e 100644 --- a/dist.ini +++ b/dist.ini @@ -59,8 +59,6 @@ dir = scripts [ShareDir] -[MakeMaker] - [Manifest] [License] diff --git a/lib/Data/QRCode.pm b/lib/Data/QRCode.pm new file mode 100644 index 0000000..680e251 --- /dev/null +++ b/lib/Data/QRCode.pm @@ -0,0 +1,46 @@ +package Data::QRCode; +use strict; +use warnings; +# ABSTRACT: qrcodes in C +# VERSION +use Data::QRCode::XS; + +my %levels = ( + L => Data::QRCode::XS::ECLEVEL_L(), + M => Data::QRCode::XS::ECLEVEL_M(), + Q => Data::QRCode::XS::ECLEVEL_Q(), + H => Data::QRCode::XS::ECLEVEL_H(), +); + +sub new { + my ($class, $data, $level, $version) = @_; + $version ||= 0; + $level = $levels{uc $level} || Data::QRCode::XS::ECLEVEL_M(); + return Data::QRCode::XS::_build($class,$data,$level,$version); +} + +sub width { Data::QRCode::XS::width(@_) } + +sub version { Data::QRCode::XS::version(@_) } + +sub data_at { + my ($self,$x,$y) = @_; + my $width = $self->width; + if ($x < 0 or $x >= $width or $y < 0 or $y >= $width) { + return; + } + my $value = Data::QRCode::XS::_data_at($self,$x,$y); + + return { + color => $value & 0x01, + in_data => $value & 0x02, + in_format => $value & 0x04, + in_version => $value & 0x08, + in_timing => $value & 0x10, + in_alignment => $value & 0x20, + in_finder => $value & 0x40, + in_misc => $value & 0x80, + }; +} + +1; diff --git a/lib/Data/QRCode/XS.pm b/lib/Data/QRCode/XS.pm index f42940f..f46cba6 100644 --- a/lib/Data/QRCode/XS.pm +++ b/lib/Data/QRCode/XS.pm @@ -1,63 +1,32 @@ package Data::QRCode::XS; use strict; use warnings; +# ABSTRACT: qrcodes in C # VERSION use Alien::QREncode; use Data::QRCode::XS::Inline C => ( ); -my %levels = ( - L => ECLEVEL_L, - M => ECLEVEL_M, - Q => ECLEVEL_Q, - H => ECLEVEL_H, -); - -sub new { - my ($class, $data, $level, $version) = @_; - $version ||= 0; - $level = $levels{uc $level} || ECLEVEL_M; - return _build($class,$data,$level,$version); -} - -sub data_at { - my ($self,$x,$y) = @_; - my $width = $self->width; - if ($x < 0 or $x >= $width or $y < 0 or $y >= $width) { - return; - } - my $value = _data_at($self,$x,$y); - - return { - color => $value & 0x01, - in_data => $value & 0x02, - in_format => $value & 0x04, - in_version => $value & 0x08, - in_timing => $value & 0x10, - in_alignment => $value & 0x20, - in_finder => $value & 0x40, - in_misc => $value & 0x80, - }; -} - 1; __DATA__ __C__ +#include "qrencode.h" + int ECLEVEL_L() { return QR_ECLEVEL_L; } int ECLEVEL_M() { return QR_ECLEVEL_M; } int ECLEVEL_Q() { return QR_ECLEVEL_Q; } int ECLEVEL_H() { return QR_ECLEVEL_H; } -SV* _build(const char* class, const SV* data, int level, int version ) { +SV* _build(const char* class, SV* data, int level, int version ) { unsigned char * str; STRLEN len; SV * qrsv; SV* self; QRcode* qr_code; str = SvPVutf8(data,len); - qr_code = QRcode_encodeData(len,data,version,(QRecLevel)level); + qr_code = QRcode_encodeData(len,str,version,(QRecLevel)level); qrsv = newSViv((IV)qr_code); self = newRV_noinc(qrsv); sv_bless(self, gv_stashpv(class, GV_ADD)); @@ -81,5 +50,5 @@ void DESTROY(SV* self) { int _data_at(SV* self, int x, int y) { QRcode* qr_code = (QRcode*)SvIV(SvRV(self)); - return qr_code->data[x+y*width]; + return qr_code->data[x+y*qr_code->width]; } diff --git a/t/base.t b/t/base.t new file mode 100644 index 0000000..25bda6a --- /dev/null +++ b/t/base.t @@ -0,0 +1,31 @@ +#!perl +use strict; +use warnings; +use Test2::Bundle::Extended; +use Data::QRCode; + +my $qr = Data::QRCode->new('some words','M'); + +my $text; +for my $y (0..$qr->width-1) { + for my $x (0..$qr->width-1) { + my $data = $qr->data_at($x,$y); + $text .= ( + !$data->{color} ? ' ' : + $data->{in_data} ? 'D' : + $data->{in_format} ? 'F' : + $data->{in_version} ? 'V' : + $data->{in_timing} ? 'T' : + $data->{in_alignment} ? 'A' : + $data->{in_finder} ? 'R' : + '*' + ); + } + $text .= "\n"; +} + +note $text; + +ok($text); + +done_testing; -- cgit v1.2.3