summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2016-11-10 13:27:18 +0000
committerdakkar <dakkar@thenautilus.net>2016-11-10 13:39:29 +0000
commit61f964216b16b25200e2a2ac961f7444c0570daf (patch)
treea39731665727a5f0a5aaa20c1c8c92a8f1a1ffcc /lib
parenttry using more magic (diff)
downloadData-QRCode-61f964216b16b25200e2a2ac961f7444c0570daf.tar.gz
Data-QRCode-61f964216b16b25200e2a2ac961f7444c0570daf.tar.bz2
Data-QRCode-61f964216b16b25200e2a2ac961f7444c0570daf.zip
split into input / qrcode
Diffstat (limited to 'lib')
-rw-r--r--lib/Data/QRCode.pm45
-rw-r--r--lib/Data/QRCode/Input.pm75
-rw-r--r--lib/Data/QRCode/XS.pm47
3 files changed, 104 insertions, 63 deletions
diff --git a/lib/Data/QRCode.pm b/lib/Data/QRCode.pm
index 680e251..b7f8c4e 100644
--- a/lib/Data/QRCode.pm
+++ b/lib/Data/QRCode.pm
@@ -3,33 +3,27 @@ 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(),
+use Data::QRCode::Inline with => 'Alien::QREncode';
+use Data::QRCode::Inline C => (
+ 'DATA',
+ autowrap => 1,
+ typemaps => 'typemap',
);
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);
+ my ($class, $input) = @_;
+ my $self = QRcode_encodeInput($input);
+ bless $self, $class;
+ return $self;
}
-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);
+ my $value = _data_at($self,$x,$y);
return {
color => $value & 0x01,
@@ -44,3 +38,22 @@ sub data_at {
}
1;
+
+__DATA__
+__C__
+
+QRcode *QRcode_encodeInput(QRinput *input);
+
+void DESTROY(QRcode *qrcode) { QRcode_free(qrcode); }
+
+int version(QRcode* self) {
+ return self->version;
+}
+
+int width(QRcode* self) {
+ return self->width;
+}
+
+int _data_at(QRcode* self, int x, int y) {
+ return self->data[x+y*self->width];
+}
diff --git a/lib/Data/QRCode/Input.pm b/lib/Data/QRCode/Input.pm
new file mode 100644
index 0000000..69fd283
--- /dev/null
+++ b/lib/Data/QRCode/Input.pm
@@ -0,0 +1,75 @@
+package Data::QRCode::Input;
+use strict;
+use warnings;
+# ABSTRACT: qrcodes in C
+# VERSION
+use Data::QRCode::Input::Inline with => 'Alien::QREncode';
+use Data::QRCode::Input::Inline C => (
+ 'DATA',
+ autowrap => 1,
+ typemaps => 'typemap',
+);
+
+sub new {
+ my ($class) = @_;
+
+ my $self = QRinput_new();
+ bless $self,$class;
+ return $self;
+}
+
+sub version {
+ my $self = shift;
+ if (@_) {
+ return QRinput_setVersion($self,shift);
+ }
+ else {
+ return QRinput_getVersion($self);
+ }
+}
+
+sub error_correction_level {
+ my $self = shift;
+ if (@_) {
+ return QRinput_setErrorCorrectionLevel($self,shift);
+ }
+ else {
+ return QRinput_getErrorCorrectionLevel($self);
+ }
+}
+
+1;
+
+__DATA__
+__C__
+
+QRecLevel ECLEVEL_L() { return QR_ECLEVEL_L; }
+QRecLevel ECLEVEL_M() { return QR_ECLEVEL_M; }
+QRecLevel ECLEVEL_Q() { return QR_ECLEVEL_Q; }
+QRecLevel ECLEVEL_H() { return QR_ECLEVEL_H; }
+
+QRencodeMode MODE_NUM() { return QR_MODE_NUM; }
+QRencodeMode MODE_AN() { return QR_MODE_AN; }
+QRencodeMode MODE_8() { return QR_MODE_8; }
+QRencodeMode MODE_KANJI() { return QR_MODE_KANJI; }
+QRencodeMode MODE_STRUCTURE() { return QR_MODE_STRUCTURE; }
+QRencodeMode MODE_ECI() { return QR_MODE_ECI; }
+QRencodeMode MODE_FNC1FIRST() { return QR_MODE_FNC1FIRST; }
+QRencodeMode MODE_FNC1SECOND() { return QR_MODE_FNC1SECOND; }
+
+extern QRinput *QRinput_new(void);
+void DESTROY(QRinput *input) { QRinput_free(input); }
+
+int append(QRinput *input, QRencodeMode mode, SV *data) {
+ unsigned char * str;
+ STRLEN len;
+
+ str = SvPVutf8(data,len);
+ return QRinput_append(input,mode,len,str);
+}
+
+extern int QRinput_getVersion(QRinput *input);
+extern int QRinput_setVersion(QRinput *input, int version);
+
+extern QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input);
+extern int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level);
diff --git a/lib/Data/QRCode/XS.pm b/lib/Data/QRCode/XS.pm
deleted file mode 100644
index aa8597a..0000000
--- a/lib/Data/QRCode/XS.pm
+++ /dev/null
@@ -1,47 +0,0 @@
-package Data::QRCode::XS;
-use strict;
-use warnings;
-# ABSTRACT: qrcodes in C
-# VERSION
-use Data::QRCode::XS::Inline with => 'Alien::QREncode';
-use Data::QRCode::XS::Inline C => (
- 'DATA',
- autowrap => 1,
- typemaps => 'typemap',
-);
-
-1;
-
-__DATA__
-__C__
-
-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; }
-
-#define CLASS "Data::QRCode"
-
-QRcode* _build(const char* class, SV* data, int level, int version ) {
- unsigned char * str;
- STRLEN len;
-
- str = SvPVutf8(data,len);
- return QRcode_encodeData(len,str,version,(QRecLevel)level);
-}
-
-int version(QRcode* self) {
- return self->version;
-}
-
-int width(QRcode* self) {
- return self->width;
-}
-
-void DESTROY(QRcode* self) {
- QRcode_free(self);
-}
-
-int _data_at(QRcode* self, int x, int y) {
- return self->data[x+y*self->width];
-}