Copy disabled (too large)
Download .txt
Showing preview only (22,687K chars total). Download the full file to get everything.
Repository: bingoogolapple/BGAQRCode-Android
Branch: master
Commit: 20390b2a58c5
Files: 1186
Total size: 21.4 MB
Directory structure:
gitextract_u2lb475g/
├── .gitignore
├── README.md
├── assembleDebug.sh
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── qrcodecore/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── cn/
│ │ └── bingoogolapple/
│ │ └── qrcode/
│ │ └── core/
│ │ ├── BGAQRCodeUtil.java
│ │ ├── BarcodeType.java
│ │ ├── CameraConfigurationManager.java
│ │ ├── CameraPreview.java
│ │ ├── ProcessDataTask.java
│ │ ├── QRCodeView.java
│ │ ├── ScanBoxView.java
│ │ └── ScanResult.java
│ └── res/
│ └── values/
│ ├── attrs.xml
│ └── ids.xml
├── settings.gradle
├── zbar/
│ ├── build.gradle
│ ├── consumer-proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ ├── cn/
│ │ │ └── bingoogolapple/
│ │ │ └── qrcode/
│ │ │ └── zbar/
│ │ │ ├── BarcodeFormat.java
│ │ │ └── ZBarView.java
│ │ └── net/
│ │ └── sourceforge/
│ │ └── zbar/
│ │ ├── Config.java
│ │ ├── Image.java
│ │ ├── ImageScanner.java
│ │ ├── Modifier.java
│ │ ├── Orientation.java
│ │ ├── Symbol.java
│ │ ├── SymbolIterator.java
│ │ └── SymbolSet.java
│ └── jni/
│ ├── Android.mk
│ ├── Application.mk
│ ├── config.h
│ ├── include/
│ │ ├── Makefile.am.inc
│ │ ├── zbar/
│ │ │ ├── Decoder.h
│ │ │ ├── Exception.h
│ │ │ ├── Image.h
│ │ │ ├── ImageScanner.h
│ │ │ ├── Processor.h
│ │ │ ├── QZBar.h
│ │ │ ├── QZBarImage.h
│ │ │ ├── Scanner.h
│ │ │ ├── Symbol.h
│ │ │ ├── Video.h
│ │ │ ├── Window.h
│ │ │ └── zbargtk.h
│ │ └── zbar.h
│ ├── libiconv-1.15/
│ │ ├── ABOUT-NLS
│ │ ├── AUTHORS
│ │ ├── COPYING
│ │ ├── COPYING.LIB
│ │ ├── ChangeLog
│ │ ├── DEPENDENCIES
│ │ ├── DESIGN
│ │ ├── HACKING
│ │ ├── INSTALL.generic
│ │ ├── Makefile
│ │ ├── Makefile.devel
│ │ ├── Makefile.in
│ │ ├── NEWS
│ │ ├── NOTES
│ │ ├── README
│ │ ├── README.djgpp
│ │ ├── README.windows
│ │ ├── THANKS
│ │ ├── aclocal.m4
│ │ ├── build-aux/
│ │ │ ├── ar-lib
│ │ │ ├── compile
│ │ │ ├── config.guess
│ │ │ ├── config.libpath
│ │ │ ├── config.rpath
│ │ │ ├── config.sub
│ │ │ ├── install-reloc
│ │ │ ├── install-sh
│ │ │ ├── ltmain.sh
│ │ │ ├── missing
│ │ │ ├── mkinstalldirs
│ │ │ ├── reloc-ldflags
│ │ │ └── snippet/
│ │ │ ├── _Noreturn.h
│ │ │ ├── arg-nonnull.h
│ │ │ ├── c++defs.h
│ │ │ └── warn-on-use.h
│ │ ├── config.h
│ │ ├── config.h.in
│ │ ├── config.status
│ │ ├── configure
│ │ ├── configure.ac
│ │ ├── djgpp/
│ │ │ ├── Makefile.maint
│ │ │ ├── README
│ │ │ ├── README.in
│ │ │ ├── config.bat
│ │ │ ├── config.sed
│ │ │ ├── config.site
│ │ │ ├── edtest.bat
│ │ │ ├── fnchange.in
│ │ │ ├── fnchange.lst
│ │ │ ├── makefile.sed
│ │ │ ├── sources.sed
│ │ │ ├── stateful-check.sed
│ │ │ ├── stateless-check.sed
│ │ │ └── translit-check.sed
│ │ ├── doc/
│ │ │ └── relocatable.texi
│ │ ├── extras/
│ │ │ ├── ChangeLog
│ │ │ ├── iconv_string.c
│ │ │ └── iconv_string.h
│ │ ├── gnulib-local/
│ │ │ ├── lib/
│ │ │ │ ├── alloca.in.h
│ │ │ │ ├── error.h.diff
│ │ │ │ ├── progname.h.diff
│ │ │ │ ├── xalloc.h
│ │ │ │ ├── xmalloc.c
│ │ │ │ └── xstrdup.c
│ │ │ ├── m4/
│ │ │ │ └── alloca.m4
│ │ │ └── modules/
│ │ │ ├── libiconv-misc
│ │ │ ├── mbstate
│ │ │ └── xalloc
│ │ ├── include/
│ │ │ ├── export.h
│ │ │ ├── iconv.h
│ │ │ ├── iconv.h.build.in
│ │ │ ├── iconv.h.in
│ │ │ └── iconv.h.inst
│ │ ├── lib/
│ │ │ ├── .libs/
│ │ │ │ ├── iconv.o
│ │ │ │ ├── libiconv.lai
│ │ │ │ ├── localcharset.o
│ │ │ │ └── relocatable.o
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── aliases.gperf
│ │ │ ├── aliases.h
│ │ │ ├── aliases2.h
│ │ │ ├── aliases_aix.h
│ │ │ ├── aliases_aix_sysaix.h
│ │ │ ├── aliases_dos.h
│ │ │ ├── aliases_extra.h
│ │ │ ├── aliases_osf1.h
│ │ │ ├── aliases_osf1_sysosf1.h
│ │ │ ├── aliases_sysaix.gperf
│ │ │ ├── aliases_sysaix.h
│ │ │ ├── aliases_syshpux.gperf
│ │ │ ├── aliases_syshpux.h
│ │ │ ├── aliases_sysosf1.gperf
│ │ │ ├── aliases_sysosf1.h
│ │ │ ├── aliases_syssolaris.gperf
│ │ │ ├── aliases_syssolaris.h
│ │ │ ├── armscii_8.h
│ │ │ ├── ascii.h
│ │ │ ├── atarist.h
│ │ │ ├── big5.h
│ │ │ ├── big5_2003.h
│ │ │ ├── big5hkscs1999.h
│ │ │ ├── big5hkscs2001.h
│ │ │ ├── big5hkscs2004.h
│ │ │ ├── big5hkscs2008.h
│ │ │ ├── c99.h
│ │ │ ├── canonical.h
│ │ │ ├── canonical_aix.h
│ │ │ ├── canonical_aix_sysaix.h
│ │ │ ├── canonical_dos.h
│ │ │ ├── canonical_extra.h
│ │ │ ├── canonical_local.h
│ │ │ ├── canonical_local_sysaix.h
│ │ │ ├── canonical_local_syshpux.h
│ │ │ ├── canonical_local_sysosf1.h
│ │ │ ├── canonical_local_syssolaris.h
│ │ │ ├── canonical_osf1.h
│ │ │ ├── canonical_osf1_sysosf1.h
│ │ │ ├── canonical_sysaix.h
│ │ │ ├── canonical_syshpux.h
│ │ │ ├── canonical_sysosf1.h
│ │ │ ├── canonical_syssolaris.h
│ │ │ ├── ces_big5.h
│ │ │ ├── ces_gbk.h
│ │ │ ├── charset.alias
│ │ │ ├── cjk_variants.h
│ │ │ ├── cns11643.h
│ │ │ ├── cns11643_1.h
│ │ │ ├── cns11643_15.h
│ │ │ ├── cns11643_2.h
│ │ │ ├── cns11643_3.h
│ │ │ ├── cns11643_4.h
│ │ │ ├── cns11643_4a.h
│ │ │ ├── cns11643_4b.h
│ │ │ ├── cns11643_5.h
│ │ │ ├── cns11643_6.h
│ │ │ ├── cns11643_7.h
│ │ │ ├── cns11643_inv.h
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── converters.h
│ │ │ ├── cp1046.h
│ │ │ ├── cp1124.h
│ │ │ ├── cp1125.h
│ │ │ ├── cp1129.h
│ │ │ ├── cp1131.h
│ │ │ ├── cp1133.h
│ │ │ ├── cp1161.h
│ │ │ ├── cp1162.h
│ │ │ ├── cp1163.h
│ │ │ ├── cp1250.h
│ │ │ ├── cp1251.h
│ │ │ ├── cp1252.h
│ │ │ ├── cp1253.h
│ │ │ ├── cp1254.h
│ │ │ ├── cp1255.h
│ │ │ ├── cp1256.h
│ │ │ ├── cp1257.h
│ │ │ ├── cp1258.h
│ │ │ ├── cp437.h
│ │ │ ├── cp50221_0208_ext.h
│ │ │ ├── cp50221_0212_ext.h
│ │ │ ├── cp737.h
│ │ │ ├── cp775.h
│ │ │ ├── cp850.h
│ │ │ ├── cp852.h
│ │ │ ├── cp853.h
│ │ │ ├── cp855.h
│ │ │ ├── cp856.h
│ │ │ ├── cp857.h
│ │ │ ├── cp858.h
│ │ │ ├── cp860.h
│ │ │ ├── cp861.h
│ │ │ ├── cp862.h
│ │ │ ├── cp863.h
│ │ │ ├── cp864.h
│ │ │ ├── cp865.h
│ │ │ ├── cp866.h
│ │ │ ├── cp869.h
│ │ │ ├── cp874.h
│ │ │ ├── cp922.h
│ │ │ ├── cp932.h
│ │ │ ├── cp932ext.h
│ │ │ ├── cp936.h
│ │ │ ├── cp936ext.h
│ │ │ ├── cp943.h
│ │ │ ├── cp949.h
│ │ │ ├── cp950.h
│ │ │ ├── cp950ext.h
│ │ │ ├── dec_hanyu.h
│ │ │ ├── dec_kanji.h
│ │ │ ├── encodings.def
│ │ │ ├── encodings_aix.def
│ │ │ ├── encodings_dos.def
│ │ │ ├── encodings_extra.def
│ │ │ ├── encodings_local.def
│ │ │ ├── encodings_osf1.def
│ │ │ ├── euc_cn.h
│ │ │ ├── euc_jisx0213.h
│ │ │ ├── euc_jp.h
│ │ │ ├── euc_kr.h
│ │ │ ├── euc_tw.h
│ │ │ ├── flags.h
│ │ │ ├── flushwc.h
│ │ │ ├── gb12345.h
│ │ │ ├── gb12345ext.h
│ │ │ ├── gb18030.h
│ │ │ ├── gb18030ext.h
│ │ │ ├── gb18030uni.h
│ │ │ ├── gb2312.h
│ │ │ ├── gbk.h
│ │ │ ├── gbkext1.h
│ │ │ ├── gbkext2.h
│ │ │ ├── gbkext_inv.h
│ │ │ ├── genaliases.c
│ │ │ ├── genaliases2.c
│ │ │ ├── genflags.c
│ │ │ ├── gentranslit.c
│ │ │ ├── georgian_academy.h
│ │ │ ├── georgian_ps.h
│ │ │ ├── hkscs1999.h
│ │ │ ├── hkscs2001.h
│ │ │ ├── hkscs2004.h
│ │ │ ├── hkscs2008.h
│ │ │ ├── hp_roman8.h
│ │ │ ├── hz.h
│ │ │ ├── iconv.c
│ │ │ ├── iconv.lo
│ │ │ ├── iconv_open1.h
│ │ │ ├── iconv_open2.h
│ │ │ ├── iso2022_cn.h
│ │ │ ├── iso2022_cnext.h
│ │ │ ├── iso2022_jp.h
│ │ │ ├── iso2022_jp1.h
│ │ │ ├── iso2022_jp2.h
│ │ │ ├── iso2022_jp3.h
│ │ │ ├── iso2022_jpms.h
│ │ │ ├── iso2022_kr.h
│ │ │ ├── iso646_cn.h
│ │ │ ├── iso646_jp.h
│ │ │ ├── iso8859_1.h
│ │ │ ├── iso8859_10.h
│ │ │ ├── iso8859_11.h
│ │ │ ├── iso8859_13.h
│ │ │ ├── iso8859_14.h
│ │ │ ├── iso8859_15.h
│ │ │ ├── iso8859_16.h
│ │ │ ├── iso8859_2.h
│ │ │ ├── iso8859_3.h
│ │ │ ├── iso8859_4.h
│ │ │ ├── iso8859_5.h
│ │ │ ├── iso8859_6.h
│ │ │ ├── iso8859_7.h
│ │ │ ├── iso8859_8.h
│ │ │ ├── iso8859_9.h
│ │ │ ├── isoir165.h
│ │ │ ├── isoir165ext.h
│ │ │ ├── java.h
│ │ │ ├── jisx0201.h
│ │ │ ├── jisx0208.h
│ │ │ ├── jisx0212.h
│ │ │ ├── jisx0213.h
│ │ │ ├── johab.h
│ │ │ ├── johab_hangul.h
│ │ │ ├── koi8_r.h
│ │ │ ├── koi8_ru.h
│ │ │ ├── koi8_t.h
│ │ │ ├── koi8_u.h
│ │ │ ├── ksc5601.h
│ │ │ ├── libcharset.a
│ │ │ ├── libcharset.h
│ │ │ ├── libcharset.la
│ │ │ ├── libiconv.la
│ │ │ ├── localcharset.h
│ │ │ ├── localcharset.lo
│ │ │ ├── loop_unicode.h
│ │ │ ├── loop_wchar.h
│ │ │ ├── loops.h
│ │ │ ├── mac_arabic.h
│ │ │ ├── mac_centraleurope.h
│ │ │ ├── mac_croatian.h
│ │ │ ├── mac_cyrillic.h
│ │ │ ├── mac_greek.h
│ │ │ ├── mac_hebrew.h
│ │ │ ├── mac_iceland.h
│ │ │ ├── mac_roman.h
│ │ │ ├── mac_romania.h
│ │ │ ├── mac_thai.h
│ │ │ ├── mac_turkish.h
│ │ │ ├── mac_ukraine.h
│ │ │ ├── mulelao.h
│ │ │ ├── nextstep.h
│ │ │ ├── pt154.h
│ │ │ ├── relocatable.c
│ │ │ ├── relocatable.h
│ │ │ ├── relocatable.lo
│ │ │ ├── riscos1.h
│ │ │ ├── rk1048.h
│ │ │ ├── shift_jisx0213.h
│ │ │ ├── sjis.h
│ │ │ ├── stamp-h2
│ │ │ ├── tcvn.h
│ │ │ ├── tds565.h
│ │ │ ├── tis620.h
│ │ │ ├── translit.def
│ │ │ ├── translit.h
│ │ │ ├── ucs2.h
│ │ │ ├── ucs2be.h
│ │ │ ├── ucs2internal.h
│ │ │ ├── ucs2le.h
│ │ │ ├── ucs2swapped.h
│ │ │ ├── ucs4.h
│ │ │ ├── ucs4be.h
│ │ │ ├── ucs4internal.h
│ │ │ ├── ucs4le.h
│ │ │ ├── ucs4swapped.h
│ │ │ ├── uhc_1.h
│ │ │ ├── uhc_2.h
│ │ │ ├── utf16.h
│ │ │ ├── utf16be.h
│ │ │ ├── utf16le.h
│ │ │ ├── utf32.h
│ │ │ ├── utf32be.h
│ │ │ ├── utf32le.h
│ │ │ ├── utf7.h
│ │ │ ├── utf8.h
│ │ │ ├── vietcomb.h
│ │ │ └── viscii.h
│ │ ├── libcharset/
│ │ │ ├── AUTHORS
│ │ │ ├── COPYING.LIB
│ │ │ ├── ChangeLog
│ │ │ ├── DEPENDENCIES
│ │ │ ├── HACKING
│ │ │ ├── INSTALL.generic
│ │ │ ├── INTEGRATE
│ │ │ ├── Makefile
│ │ │ ├── Makefile.devel
│ │ │ ├── Makefile.in
│ │ │ ├── NEWS
│ │ │ ├── README
│ │ │ ├── README.djgpp
│ │ │ ├── README.windows
│ │ │ ├── autoconf/
│ │ │ │ └── aclocal.m4
│ │ │ ├── build-aux/
│ │ │ │ ├── config.guess
│ │ │ │ ├── config.libpath
│ │ │ │ ├── config.sub
│ │ │ │ ├── install-sh
│ │ │ │ ├── ltmain.sh
│ │ │ │ └── mkinstalldirs
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── config.status
│ │ │ ├── configure
│ │ │ ├── configure.ac
│ │ │ ├── djgpp/
│ │ │ │ ├── Makefile.maint
│ │ │ │ ├── README
│ │ │ │ ├── README.in
│ │ │ │ ├── config.bat
│ │ │ │ ├── config.sed
│ │ │ │ ├── config.site
│ │ │ │ ├── fnchange.in
│ │ │ │ └── fnchange.lst
│ │ │ ├── include/
│ │ │ │ ├── export.h
│ │ │ │ ├── libcharset.h
│ │ │ │ ├── libcharset.h.in
│ │ │ │ ├── localcharset.h
│ │ │ │ ├── localcharset.h.build.in
│ │ │ │ ├── localcharset.h.in
│ │ │ │ └── localcharset.h.inst
│ │ │ ├── lib/
│ │ │ │ ├── .libs/
│ │ │ │ │ ├── libcharset.a
│ │ │ │ │ ├── libcharset.lai
│ │ │ │ │ ├── localcharset.o
│ │ │ │ │ └── relocatable.o
│ │ │ │ ├── ChangeLog
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── charset.alias
│ │ │ │ ├── config.charset
│ │ │ │ ├── libcharset.la
│ │ │ │ ├── localcharset.c
│ │ │ │ ├── localcharset.lo
│ │ │ │ ├── localcharset.o
│ │ │ │ ├── ref-add.sed
│ │ │ │ ├── ref-add.sin
│ │ │ │ ├── ref-del.sed
│ │ │ │ ├── ref-del.sin
│ │ │ │ ├── relocatable.c
│ │ │ │ ├── relocatable.h
│ │ │ │ ├── relocatable.lo
│ │ │ │ └── relocatable.o
│ │ │ ├── libtool
│ │ │ ├── m4/
│ │ │ │ ├── codeset.m4
│ │ │ │ ├── fcntl-o.m4
│ │ │ │ ├── glibc21.m4
│ │ │ │ ├── libtool.m4
│ │ │ │ ├── ltoptions.m4
│ │ │ │ ├── ltsugar.m4
│ │ │ │ ├── ltversion.m4
│ │ │ │ ├── lt~obsolete.m4
│ │ │ │ ├── relocatable-lib.m4
│ │ │ │ └── visibility.m4
│ │ │ └── tools/
│ │ │ ├── README
│ │ │ ├── aix-3.2.5
│ │ │ ├── aix-4.1.5
│ │ │ ├── aix-4.2.0
│ │ │ ├── aix-4.3.2
│ │ │ ├── all-charsets
│ │ │ ├── all-charsets-X11
│ │ │ ├── all-locales
│ │ │ ├── beos-5
│ │ │ ├── cygwin-1.7.2
│ │ │ ├── darwin-6.8
│ │ │ ├── darwin-7.5
│ │ │ ├── darwin-9.5
│ │ │ ├── freebsd-3.3
│ │ │ ├── glibc-2.1.3
│ │ │ ├── glibc-2.1.90
│ │ │ ├── glibc-2.2
│ │ │ ├── glibc-2.2-XF86-3.3.6
│ │ │ ├── glibc-2.2-XF86-4.0.1f
│ │ │ ├── hpux-10.01
│ │ │ ├── hpux-10.20
│ │ │ ├── hpux-11.00
│ │ │ ├── irix-6.5
│ │ │ ├── locale_charmap
│ │ │ ├── locale_charset.c
│ │ │ ├── locale_codeset.c
│ │ │ ├── locale_monthnames.c
│ │ │ ├── locale_x11encoding.c
│ │ │ ├── netbsd-3.0
│ │ │ ├── openbsd-4.1
│ │ │ ├── osf1-4.0a
│ │ │ ├── osf1-4.0d
│ │ │ ├── osf1-5.1
│ │ │ ├── solaris-2.4
│ │ │ ├── solaris-2.5.1
│ │ │ ├── solaris-2.6
│ │ │ ├── solaris-2.6-cjk
│ │ │ ├── solaris-2.7
│ │ │ ├── sunos-4.1.4
│ │ │ └── win32
│ │ ├── libtool
│ │ ├── m4/
│ │ │ ├── cp.m4
│ │ │ ├── eilseq.m4
│ │ │ ├── endian.m4
│ │ │ ├── general.m4
│ │ │ ├── libtool.m4
│ │ │ ├── ln.m4
│ │ │ ├── ltoptions.m4
│ │ │ ├── ltsugar.m4
│ │ │ ├── ltversion.m4
│ │ │ ├── lt~obsolete.m4
│ │ │ └── proto.m4
│ │ ├── man/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── iconv.1
│ │ │ ├── iconv.1.html
│ │ │ ├── iconv.3
│ │ │ ├── iconv.3.html
│ │ │ ├── iconv_close.3
│ │ │ ├── iconv_close.3.html
│ │ │ ├── iconv_open.3
│ │ │ ├── iconv_open.3.html
│ │ │ ├── iconv_open_into.3
│ │ │ ├── iconv_open_into.3.html
│ │ │ ├── iconvctl.3
│ │ │ └── iconvctl.3.html
│ │ ├── os2/
│ │ │ └── iconv.def
│ │ ├── po/
│ │ │ ├── ChangeLog
│ │ │ ├── LINGUAS
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── Makefile.in.in
│ │ │ ├── Makevars
│ │ │ ├── POTFILES
│ │ │ ├── POTFILES.in
│ │ │ ├── Rules-quot
│ │ │ ├── af.gmo
│ │ │ ├── af.po
│ │ │ ├── bg.gmo
│ │ │ ├── bg.po
│ │ │ ├── boldquot.sed
│ │ │ ├── ca.gmo
│ │ │ ├── ca.po
│ │ │ ├── cs.gmo
│ │ │ ├── cs.po
│ │ │ ├── da.gmo
│ │ │ ├── da.po
│ │ │ ├── de.gmo
│ │ │ ├── de.po
│ │ │ ├── el.gmo
│ │ │ ├── el.po
│ │ │ ├── en@boldquot.header
│ │ │ ├── en@quot.header
│ │ │ ├── eo.gmo
│ │ │ ├── eo.po
│ │ │ ├── es.gmo
│ │ │ ├── es.po
│ │ │ ├── et.gmo
│ │ │ ├── et.po
│ │ │ ├── fi.gmo
│ │ │ ├── fi.po
│ │ │ ├── fr.gmo
│ │ │ ├── fr.po
│ │ │ ├── ga.gmo
│ │ │ ├── ga.po
│ │ │ ├── gl.gmo
│ │ │ ├── gl.po
│ │ │ ├── hr.gmo
│ │ │ ├── hr.po
│ │ │ ├── hu.gmo
│ │ │ ├── hu.po
│ │ │ ├── id.gmo
│ │ │ ├── id.po
│ │ │ ├── insert-header.sin
│ │ │ ├── it.gmo
│ │ │ ├── it.po
│ │ │ ├── ja.gmo
│ │ │ ├── ja.po
│ │ │ ├── libiconv.pot
│ │ │ ├── nl.gmo
│ │ │ ├── nl.po
│ │ │ ├── pl.gmo
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.gmo
│ │ │ ├── pt_BR.po
│ │ │ ├── quot.sed
│ │ │ ├── remove-potcdate.sin
│ │ │ ├── rm.gmo
│ │ │ ├── rm.po
│ │ │ ├── ro.gmo
│ │ │ ├── ro.po
│ │ │ ├── ru.gmo
│ │ │ ├── ru.po
│ │ │ ├── sk.gmo
│ │ │ ├── sk.po
│ │ │ ├── sl.gmo
│ │ │ ├── sl.po
│ │ │ ├── sq.gmo
│ │ │ ├── sq.po
│ │ │ ├── sr.gmo
│ │ │ ├── sr.po
│ │ │ ├── stamp-po
│ │ │ ├── sv.gmo
│ │ │ ├── sv.po
│ │ │ ├── tr.gmo
│ │ │ ├── tr.po
│ │ │ ├── uk.gmo
│ │ │ ├── uk.po
│ │ │ ├── vi.gmo
│ │ │ ├── vi.po
│ │ │ ├── wa.gmo
│ │ │ ├── wa.po
│ │ │ ├── zh_CN.gmo
│ │ │ ├── zh_CN.po
│ │ │ ├── zh_TW.gmo
│ │ │ └── zh_TW.po
│ │ ├── preload/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.devel
│ │ │ ├── Makefile.in
│ │ │ ├── aclocal.m4
│ │ │ ├── config.status
│ │ │ ├── configure
│ │ │ ├── configure.ac
│ │ │ └── libtool
│ │ ├── src/
│ │ │ ├── .libs/
│ │ │ │ └── iconv_no_i18n
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── iconv.c
│ │ │ ├── iconv.o
│ │ │ ├── iconv_no_i18n
│ │ │ ├── iconv_no_i18n.c
│ │ │ └── iconv_no_i18n.o
│ │ ├── srclib/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.am
│ │ │ ├── Makefile.gnulib
│ │ │ ├── Makefile.in
│ │ │ ├── alloca.h
│ │ │ ├── alloca.in.h
│ │ │ ├── allocator.c
│ │ │ ├── allocator.h
│ │ │ ├── allocator.o
│ │ │ ├── areadlink.c
│ │ │ ├── areadlink.h
│ │ │ ├── areadlink.o
│ │ │ ├── arg-nonnull.h
│ │ │ ├── basename-lgpl.c
│ │ │ ├── basename-lgpl.o
│ │ │ ├── binary-io.c
│ │ │ ├── binary-io.h
│ │ │ ├── binary-io.o
│ │ │ ├── c++defs.h
│ │ │ ├── c-ctype.c
│ │ │ ├── c-ctype.h
│ │ │ ├── canonicalize-lgpl.c
│ │ │ ├── canonicalize-lgpl.o
│ │ │ ├── careadlinkat.c
│ │ │ ├── careadlinkat.h
│ │ │ ├── careadlinkat.o
│ │ │ ├── dirname-lgpl.c
│ │ │ ├── dirname-lgpl.o
│ │ │ ├── dirname.h
│ │ │ ├── dosname.h
│ │ │ ├── errno.in.h
│ │ │ ├── error.c
│ │ │ ├── error.h
│ │ │ ├── error.o
│ │ │ ├── fcntl.h
│ │ │ ├── fcntl.in.h
│ │ │ ├── getprogname.c
│ │ │ ├── getprogname.h
│ │ │ ├── getprogname.o
│ │ │ ├── gettext.h
│ │ │ ├── gettimeofday.c
│ │ │ ├── intprops.h
│ │ │ ├── libicrt.a
│ │ │ ├── limits.h
│ │ │ ├── limits.in.h
│ │ │ ├── localcharset.h
│ │ │ ├── lstat.c
│ │ │ ├── lstat.o
│ │ │ ├── malloc.c
│ │ │ ├── malloca.c
│ │ │ ├── malloca.h
│ │ │ ├── malloca.o
│ │ │ ├── malloca.valgrind
│ │ │ ├── msvc-inval.c
│ │ │ ├── msvc-inval.h
│ │ │ ├── msvc-nothrow.c
│ │ │ ├── msvc-nothrow.h
│ │ │ ├── pathmax.h
│ │ │ ├── progname.c
│ │ │ ├── progname.h
│ │ │ ├── progname.o
│ │ │ ├── progreloc.c
│ │ │ ├── raise.c
│ │ │ ├── read.c
│ │ │ ├── readlink.c
│ │ │ ├── readlink.o
│ │ │ ├── relocatable.c
│ │ │ ├── relocatable.h
│ │ │ ├── relocwrapper.c
│ │ │ ├── safe-read.c
│ │ │ ├── safe-read.h
│ │ │ ├── safe-read.o
│ │ │ ├── setenv.c
│ │ │ ├── signal.h
│ │ │ ├── signal.in.h
│ │ │ ├── sigprocmask.c
│ │ │ ├── stat.c
│ │ │ ├── stat.o
│ │ │ ├── stdbool.in.h
│ │ │ ├── stddef.in.h
│ │ │ ├── stdint.h
│ │ │ ├── stdint.in.h
│ │ │ ├── stdio-write.c
│ │ │ ├── stdio.h
│ │ │ ├── stdio.in.h
│ │ │ ├── stdlib.h
│ │ │ ├── stdlib.in.h
│ │ │ ├── streq.h
│ │ │ ├── strerror-override.c
│ │ │ ├── strerror-override.h
│ │ │ ├── strerror-override.o
│ │ │ ├── strerror.c
│ │ │ ├── strerror.o
│ │ │ ├── string.h
│ │ │ ├── string.in.h
│ │ │ ├── stripslash.c
│ │ │ ├── stripslash.o
│ │ │ ├── sys/
│ │ │ │ ├── stat.h
│ │ │ │ ├── time.h
│ │ │ │ └── types.h
│ │ │ ├── sys_stat.in.h
│ │ │ ├── sys_time.in.h
│ │ │ ├── sys_types.in.h
│ │ │ ├── time.h
│ │ │ ├── time.in.h
│ │ │ ├── unistd.c
│ │ │ ├── unistd.h
│ │ │ ├── unistd.in.h
│ │ │ ├── unistd.o
│ │ │ ├── unitypes.h
│ │ │ ├── unitypes.in.h
│ │ │ ├── uniwidth/
│ │ │ │ ├── .dirstamp
│ │ │ │ ├── cjk.h
│ │ │ │ ├── width.c
│ │ │ │ └── width.o
│ │ │ ├── uniwidth.h
│ │ │ ├── uniwidth.in.h
│ │ │ ├── unlocked-io.h
│ │ │ ├── verify.h
│ │ │ ├── warn-on-use.h
│ │ │ ├── xalloc-oversized.h
│ │ │ ├── xalloc.h
│ │ │ ├── xmalloc.c
│ │ │ ├── xmalloc.o
│ │ │ ├── xreadlink.c
│ │ │ ├── xreadlink.h
│ │ │ ├── xreadlink.o
│ │ │ ├── xstrdup.c
│ │ │ └── xstrdup.o
│ │ ├── srcm4/
│ │ │ ├── 00gnulib.m4
│ │ │ ├── absolute-header.m4
│ │ │ ├── alloca.m4
│ │ │ ├── asm-underscore.m4
│ │ │ ├── canonicalize.m4
│ │ │ ├── codeset.m4
│ │ │ ├── dirname.m4
│ │ │ ├── double-slash-root.m4
│ │ │ ├── eealloc.m4
│ │ │ ├── environ.m4
│ │ │ ├── errno_h.m4
│ │ │ ├── error.m4
│ │ │ ├── extensions.m4
│ │ │ ├── extern-inline.m4
│ │ │ ├── fcntl-o.m4
│ │ │ ├── fcntl_h.m4
│ │ │ ├── getprogname.m4
│ │ │ ├── gettext.m4
│ │ │ ├── gettimeofday.m4
│ │ │ ├── glibc2.m4
│ │ │ ├── glibc21.m4
│ │ │ ├── gnulib-cache.m4
│ │ │ ├── gnulib-common.m4
│ │ │ ├── gnulib-comp.m4
│ │ │ ├── gnulib-tool.m4
│ │ │ ├── iconv.m4
│ │ │ ├── include_next.m4
│ │ │ ├── intdiv0.m4
│ │ │ ├── intl.m4
│ │ │ ├── intldir.m4
│ │ │ ├── intlmacosx.m4
│ │ │ ├── intmax.m4
│ │ │ ├── inttypes-pri.m4
│ │ │ ├── inttypes_h.m4
│ │ │ ├── largefile.m4
│ │ │ ├── lcmessage.m4
│ │ │ ├── lib-ld.m4
│ │ │ ├── lib-link.m4
│ │ │ ├── lib-prefix.m4
│ │ │ ├── libunistring-base.m4
│ │ │ ├── limits-h.m4
│ │ │ ├── lock.m4
│ │ │ ├── longlong.m4
│ │ │ ├── lstat.m4
│ │ │ ├── malloc.m4
│ │ │ ├── malloca.m4
│ │ │ ├── mbstate_t.m4
│ │ │ ├── msvc-inval.m4
│ │ │ ├── msvc-nothrow.m4
│ │ │ ├── multiarch.m4
│ │ │ ├── nls.m4
│ │ │ ├── nocrash.m4
│ │ │ ├── off_t.m4
│ │ │ ├── pathmax.m4
│ │ │ ├── po.m4
│ │ │ ├── printf-posix.m4
│ │ │ ├── progtest.m4
│ │ │ ├── raise.m4
│ │ │ ├── read.m4
│ │ │ ├── readlink.m4
│ │ │ ├── relocatable-lib.m4
│ │ │ ├── relocatable.m4
│ │ │ ├── safe-read.m4
│ │ │ ├── setenv.m4
│ │ │ ├── signal_h.m4
│ │ │ ├── signalblocking.m4
│ │ │ ├── sigpipe.m4
│ │ │ ├── size_max.m4
│ │ │ ├── ssize_t.m4
│ │ │ ├── stat.m4
│ │ │ ├── stdbool.m4
│ │ │ ├── stddef_h.m4
│ │ │ ├── stdint.m4
│ │ │ ├── stdint_h.m4
│ │ │ ├── stdio_h.m4
│ │ │ ├── stdlib_h.m4
│ │ │ ├── strerror.m4
│ │ │ ├── string_h.m4
│ │ │ ├── sys_socket_h.m4
│ │ │ ├── sys_stat_h.m4
│ │ │ ├── sys_time_h.m4
│ │ │ ├── sys_types_h.m4
│ │ │ ├── threadlib.m4
│ │ │ ├── time_h.m4
│ │ │ ├── uintmax_t.m4
│ │ │ ├── unistd_h.m4
│ │ │ ├── unlocked-io.m4
│ │ │ ├── visibility.m4
│ │ │ ├── warn-on-use.m4
│ │ │ ├── wchar_t.m4
│ │ │ ├── wint_t.m4
│ │ │ └── xsize.m4
│ │ ├── stamp-h1
│ │ ├── tests/
│ │ │ ├── ARMSCII-8.IRREVERSIBLE.TXT
│ │ │ ├── ARMSCII-8.TXT
│ │ │ ├── ASCII.TXT
│ │ │ ├── ATARIST.TXT
│ │ │ ├── BIG5-2003.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-2003.TXT
│ │ │ ├── BIG5-HKSCS-1999-snippet
│ │ │ ├── BIG5-HKSCS-1999-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-1999.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-1999.TXT
│ │ │ ├── BIG5-HKSCS-2001-snippet
│ │ │ ├── BIG5-HKSCS-2001-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2001.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2001.TXT
│ │ │ ├── BIG5-HKSCS-2004-snippet
│ │ │ ├── BIG5-HKSCS-2004-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2004.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2004.TXT
│ │ │ ├── BIG5-HKSCS-2008-snippet
│ │ │ ├── BIG5-HKSCS-2008-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2008.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2008.TXT
│ │ │ ├── BIG5.TXT
│ │ │ ├── CP1046.TXT
│ │ │ ├── CP1124.TXT
│ │ │ ├── CP1125.TXT
│ │ │ ├── CP1129.TXT
│ │ │ ├── CP1131.TXT
│ │ │ ├── CP1133.TXT
│ │ │ ├── CP1161.IRREVERSIBLE.TXT
│ │ │ ├── CP1161.TXT
│ │ │ ├── CP1162.TXT
│ │ │ ├── CP1163.IRREVERSIBLE.TXT
│ │ │ ├── CP1163.TXT
│ │ │ ├── CP1250.TXT
│ │ │ ├── CP1251.TXT
│ │ │ ├── CP1252.TXT
│ │ │ ├── CP1253.TXT
│ │ │ ├── CP1254.TXT
│ │ │ ├── CP1255-snippet
│ │ │ ├── CP1255-snippet.UTF-8
│ │ │ ├── CP1255.IRREVERSIBLE.TXT
│ │ │ ├── CP1255.TXT
│ │ │ ├── CP1256.TXT
│ │ │ ├── CP1257.TXT
│ │ │ ├── CP1258-snippet
│ │ │ ├── CP1258-snippet.UTF-8
│ │ │ ├── CP1258.IRREVERSIBLE.TXT
│ │ │ ├── CP1258.TXT
│ │ │ ├── CP437.TXT
│ │ │ ├── CP737.TXT
│ │ │ ├── CP775.TXT
│ │ │ ├── CP850.TXT
│ │ │ ├── CP852.TXT
│ │ │ ├── CP853.TXT
│ │ │ ├── CP855.TXT
│ │ │ ├── CP856.TXT
│ │ │ ├── CP857.TXT
│ │ │ ├── CP858.TXT
│ │ │ ├── CP860.TXT
│ │ │ ├── CP861.TXT
│ │ │ ├── CP862.TXT
│ │ │ ├── CP863.TXT
│ │ │ ├── CP864.TXT
│ │ │ ├── CP865.TXT
│ │ │ ├── CP866.TXT
│ │ │ ├── CP869.TXT
│ │ │ ├── CP874.TXT
│ │ │ ├── CP922.TXT
│ │ │ ├── CP932.IRREVERSIBLE.TXT
│ │ │ ├── CP932.TXT
│ │ │ ├── CP936.TXT
│ │ │ ├── CP949.TXT
│ │ │ ├── CP950.IRREVERSIBLE.TXT
│ │ │ ├── CP950.TXT
│ │ │ ├── DEC-HANYU.IRREVERSIBLE.TXT
│ │ │ ├── DEC-HANYU.TXT
│ │ │ ├── DEC-KANJI.TXT
│ │ │ ├── EUC-CN.TXT
│ │ │ ├── EUC-JISX0213.TXT
│ │ │ ├── EUC-JP.IRREVERSIBLE.TXT
│ │ │ ├── EUC-JP.TXT
│ │ │ ├── EUC-KR.TXT
│ │ │ ├── EUC-TW.IRREVERSIBLE.TXT
│ │ │ ├── EUC-TW.TXT
│ │ │ ├── GB18030-BMP.TXT
│ │ │ ├── GB18030.IRREVERSIBLE.TXT
│ │ │ ├── GBK.TXT
│ │ │ ├── Georgian-Academy.TXT
│ │ │ ├── Georgian-PS.TXT
│ │ │ ├── HP-ROMAN8.TXT
│ │ │ ├── HZ-snippet
│ │ │ ├── HZ-snippet.UTF-8
│ │ │ ├── ISO-2022-CN-EXT-snippet
│ │ │ ├── ISO-2022-CN-EXT-snippet.UTF-8
│ │ │ ├── ISO-2022-CN-snippet
│ │ │ ├── ISO-2022-CN-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-1-snippet
│ │ │ ├── ISO-2022-JP-1-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-2-snippet
│ │ │ ├── ISO-2022-JP-2-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-3-snippet
│ │ │ ├── ISO-2022-JP-3-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-MS-snippet
│ │ │ ├── ISO-2022-JP-MS-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-MS-snippet.alt
│ │ │ ├── ISO-2022-JP-snippet
│ │ │ ├── ISO-2022-JP-snippet.UTF-8
│ │ │ ├── ISO-2022-KR-snippet
│ │ │ ├── ISO-2022-KR-snippet.UTF-8
│ │ │ ├── ISO-8859-1.TXT
│ │ │ ├── ISO-8859-10.TXT
│ │ │ ├── ISO-8859-11.TXT
│ │ │ ├── ISO-8859-13.TXT
│ │ │ ├── ISO-8859-14.TXT
│ │ │ ├── ISO-8859-15.TXT
│ │ │ ├── ISO-8859-16.TXT
│ │ │ ├── ISO-8859-2.TXT
│ │ │ ├── ISO-8859-3.TXT
│ │ │ ├── ISO-8859-4.TXT
│ │ │ ├── ISO-8859-5.TXT
│ │ │ ├── ISO-8859-6.TXT
│ │ │ ├── ISO-8859-7.TXT
│ │ │ ├── ISO-8859-8.TXT
│ │ │ ├── ISO-8859-9.TXT
│ │ │ ├── ISO-IR-165.IRREVERSIBLE.TXT
│ │ │ ├── ISO-IR-165.TXT
│ │ │ ├── ISO646-CN.TXT
│ │ │ ├── ISO646-JP.TXT
│ │ │ ├── JIS_X0201.TXT
│ │ │ ├── JOHAB.TXT
│ │ │ ├── KOI8-R.TXT
│ │ │ ├── KOI8-RU.TXT
│ │ │ ├── KOI8-T.TXT
│ │ │ ├── KOI8-U.TXT
│ │ │ ├── MacArabic.TXT
│ │ │ ├── MacCentralEurope.TXT
│ │ │ ├── MacCroatian.TXT
│ │ │ ├── MacCyrillic.TXT
│ │ │ ├── MacGreek.TXT
│ │ │ ├── MacHebrew.TXT
│ │ │ ├── MacIceland.TXT
│ │ │ ├── MacRoman.TXT
│ │ │ ├── MacRomania.TXT
│ │ │ ├── MacThai.TXT
│ │ │ ├── MacTurkish.TXT
│ │ │ ├── MacUkraine.TXT
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── MuleLao-1.TXT
│ │ │ ├── NEXTSTEP.TXT
│ │ │ ├── PT154.TXT
│ │ │ ├── Quotes.ASCII
│ │ │ ├── Quotes.ISO-8859-1
│ │ │ ├── Quotes.UTF-8
│ │ │ ├── RISCOS-LATIN1.TXT
│ │ │ ├── RK1048.TXT
│ │ │ ├── SHIFT_JIS.TXT
│ │ │ ├── SHIFT_JISX0213.TXT
│ │ │ ├── TCVN-snippet
│ │ │ ├── TCVN-snippet.UTF-8
│ │ │ ├── TCVN.IRREVERSIBLE.TXT
│ │ │ ├── TCVN.TXT
│ │ │ ├── TDS565.TXT
│ │ │ ├── TIS-620.TXT
│ │ │ ├── Translit1.ASCII
│ │ │ ├── Translit1.ISO-8859-1
│ │ │ ├── TranslitFail1.ISO-8859-1
│ │ │ ├── UCS-2BE-snippet
│ │ │ ├── UCS-2BE-snippet.UTF-8
│ │ │ ├── UCS-2LE-snippet
│ │ │ ├── UCS-2LE-snippet.UTF-8
│ │ │ ├── UCS-4BE-snippet
│ │ │ ├── UCS-4BE-snippet.UTF-8
│ │ │ ├── UCS-4LE-snippet
│ │ │ ├── UCS-4LE-snippet.UTF-8
│ │ │ ├── UTF-16-snippet
│ │ │ ├── UTF-16-snippet.UTF-8
│ │ │ ├── UTF-16BE-snippet
│ │ │ ├── UTF-16BE-snippet.UTF-8
│ │ │ ├── UTF-16LE-snippet
│ │ │ ├── UTF-16LE-snippet.UTF-8
│ │ │ ├── UTF-32-snippet
│ │ │ ├── UTF-32-snippet.UTF-8
│ │ │ ├── UTF-32BE-snippet
│ │ │ ├── UTF-32BE-snippet.UTF-8
│ │ │ ├── UTF-32LE-snippet
│ │ │ ├── UTF-32LE-snippet.UTF-8
│ │ │ ├── UTF-7-snippet
│ │ │ ├── UTF-7-snippet.UTF-8
│ │ │ ├── VISCII.TXT
│ │ │ ├── check-stateful
│ │ │ ├── check-stateful.bat
│ │ │ ├── check-stateless
│ │ │ ├── check-stateless.bat
│ │ │ ├── check-subst
│ │ │ ├── check-translit
│ │ │ ├── check-translit.bat
│ │ │ ├── check-translitfailure
│ │ │ ├── gengb18030z.c
│ │ │ ├── genutf8.c
│ │ │ ├── table-from.c
│ │ │ ├── table-to.c
│ │ │ ├── test-shiftseq.c
│ │ │ ├── test-to-wchar.c
│ │ │ └── uniq-u.c
│ │ ├── tools/
│ │ │ ├── 8bit_tab_to_h.c
│ │ │ ├── CP50221-0208-EXT.TXT
│ │ │ ├── CP50221-0212-EXT.TXT
│ │ │ ├── JISX0213.TXT
│ │ │ ├── Makefile
│ │ │ ├── cjk_tab_to_h.c
│ │ │ └── cjk_variants.c
│ │ ├── windows/
│ │ │ ├── iconv.rc
│ │ │ ├── libiconv.rc
│ │ │ └── windres-options
│ │ └── woe32dll/
│ │ ├── export.h
│ │ └── iconv-exports.c
│ ├── zbar/
│ │ ├── Makefile.am.inc
│ │ ├── config.c
│ │ ├── convert.c
│ │ ├── debug.h
│ │ ├── decoder/
│ │ │ ├── codabar.c
│ │ │ ├── codabar.h
│ │ │ ├── code128.c
│ │ │ ├── code128.h
│ │ │ ├── code39.c
│ │ │ ├── code39.h
│ │ │ ├── code93.c
│ │ │ ├── code93.h
│ │ │ ├── databar.c
│ │ │ ├── databar.h
│ │ │ ├── ean.c
│ │ │ ├── ean.h
│ │ │ ├── i25.c
│ │ │ ├── i25.h
│ │ │ ├── pdf417.c
│ │ │ ├── pdf417.h
│ │ │ ├── pdf417_hash.h
│ │ │ ├── qr_finder.c
│ │ │ └── qr_finder.h
│ │ ├── decoder.c
│ │ ├── decoder.h
│ │ ├── error.c
│ │ ├── error.h
│ │ ├── event.h
│ │ ├── image.c
│ │ ├── image.h
│ │ ├── img_scanner.c
│ │ ├── img_scanner.h
│ │ ├── jpeg.c
│ │ ├── libzbar.rc
│ │ ├── mutex.h
│ │ ├── processor/
│ │ │ ├── lock.c
│ │ │ ├── null.c
│ │ │ ├── posix.c
│ │ │ ├── posix.h
│ │ │ ├── win.c
│ │ │ └── x.c
│ │ ├── processor.c
│ │ ├── processor.h
│ │ ├── qrcode/
│ │ │ ├── bch15_5.c
│ │ │ ├── bch15_5.h
│ │ │ ├── binarize.c
│ │ │ ├── binarize.h
│ │ │ ├── isaac.c
│ │ │ ├── isaac.h
│ │ │ ├── qrdec.c
│ │ │ ├── qrdec.h
│ │ │ ├── qrdectxt.c
│ │ │ ├── rs.c
│ │ │ ├── rs.h
│ │ │ ├── util.c
│ │ │ └── util.h
│ │ ├── qrcode.h
│ │ ├── refcnt.c
│ │ ├── refcnt.h
│ │ ├── scanner.c
│ │ ├── svg.c
│ │ ├── svg.h
│ │ ├── symbol.c
│ │ ├── symbol.h
│ │ ├── thread.h
│ │ ├── timer.h
│ │ ├── video/
│ │ │ ├── null.c
│ │ │ ├── v4l.c
│ │ │ ├── v4l1.c
│ │ │ ├── v4l2.c
│ │ │ └── vfw.c
│ │ ├── video.c
│ │ ├── video.h
│ │ ├── window/
│ │ │ ├── dib.c
│ │ │ ├── null.c
│ │ │ ├── vfw.c
│ │ │ ├── win.c
│ │ │ ├── win.h
│ │ │ ├── x.c
│ │ │ ├── x.h
│ │ │ ├── ximage.c
│ │ │ └── xv.c
│ │ ├── window.c
│ │ └── window.h
│ └── zbarjni.c
├── zbardemo/
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── cn/
│ │ └── bingoogolapple/
│ │ └── qrcode/
│ │ └── zbardemo/
│ │ ├── MainActivity.java
│ │ └── TestScanActivity.java
│ └── res/
│ ├── drawable/
│ │ └── selector_btn_orange.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── activity_test_scan.xml
│ │ ├── toolbar.xml
│ │ └── view_control.xml
│ └── values/
│ ├── colors.xml
│ ├── strings.xml
│ ├── styles.xml
│ └── styles_base.xml
├── zxing/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── cn/
│ └── bingoogolapple/
│ └── qrcode/
│ └── zxing/
│ ├── QRCodeDecoder.java
│ ├── QRCodeEncoder.java
│ └── ZXingView.java
└── zxingdemo/
├── build.gradle
├── proguard-rules.pro
└── src/
└── main/
├── AndroidManifest.xml
├── java/
│ └── cn/
│ └── bingoogolapple/
│ └── qrcode/
│ └── zxingdemo/
│ ├── MainActivity.java
│ ├── RotateTest.java
│ ├── TestGeneratectivity.java
│ └── TestScanActivity.java
└── res/
├── drawable/
│ └── selector_btn_orange.xml
├── layout/
│ ├── activity_main.xml
│ ├── activity_test_generate.xml
│ ├── activity_test_scan.xml
│ ├── toolbar.xml
│ └── view_control.xml
└── values/
├── colors.xml
├── strings.xml
├── styles.xml
└── styles_base.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.ap_
# Files for the Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
# Gradle files
.gradle/
build/
/*/build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Eclipse project files
.classpath
.project
.settings/
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
# Mac system files
.DS_Store
*.keystore
captures
.externalNativeBuild/
zbarjni/src/main/obj/
zbarjni/src/main/libs/
================================================
FILE: README.md
================================================
:running:BGAQRCode-Android:running:
============
## 目录
* [功能介绍](#功能介绍)
* [常见问题](#常见问题)
* [效果图与示例 apk](#效果图与示例-apk)
* [Gradle 依赖](#gradle-依赖)
* [布局文件](#布局文件)
* [自定义属性说明](#自定义属性说明)
* [接口说明](#接口说明)
* [关于我](#关于我)
## 功能介绍
根据[之前公司](http://www.iqegg.com)的产品需求,参考 [barcodescanner](https://github.com/dm77/barcodescanner) 改的,希望能帮助到有生成二维码、扫描二维码、识别图片二维码等需求的猿友。修改幅度较大,也就没准备针对 [barcodescanner](https://github.com/dm77/barcodescanner) 库提交PR。
- [x] 可定制各式各样的扫描框
- [x] 可定制全屏扫描或只识别扫描框区域内码
- [x] 可定制要识别的码的格式(详细用法查看 TestScanActivity 中的 onClick 方法)
- [x] 可以控制闪光灯,方便夜间使用
- [x] 可以设置用前置摄像头扫描
- [x] 可以二指缩放预览
- [x] 可以监听环境亮度,提示用户打开、关闭闪光灯
- [x] 识别到比较小的码时自动放大
***
- [x] ZXing 生成可自定义颜色、带 logo 的二维码
- [x] ZXing 生成一维码
- [x] ZXing 扫描条码、二维码
- [x] ZXing 识别图库中的条码、二维码图片
***
- [x] ZBar 扫描条码、二维码「已解决中文乱码问题」
- [x] ZBar 识别图库中的条码、二维码图片
## 常见问题
#### 1.部分手机无法扫描出结果,扫描预览界面二维码被压缩
使用的时候将 Toolbar 或者其他 View 盖在 ZBarView 或者 ZXingView 的上面,让 ZBarView 或者 ZXingView 填充屏幕宽高。[ZXing 布局文件参考](https://github.com/bingoogolapple/BGAQRCode-Android/blob/master/zxingdemo/src/main/res/layout/activity_test_scan.xml) [ZBar 布局文件参考](https://github.com/bingoogolapple/BGAQRCode-Android/blob/master/zbardemo/src/main/res/layout/activity_test_scan.xml)
#### 2.出现黑屏
在自己项目里集成时记得在 onDestroy 方法中调用 mQRCodeView.onDestroy(),在 onStop 方法中调用 mQRCodeView.stopCamera(),否则会出现黑屏。如果没执行前面提到的这两个方法出现黑屏的话,那你就只能加上前面提到的两个方法后,重启手机后重新运行了
## 效果图与示例 apk





| [点击下载 ZXingDemo.apk](http://fir.im/ZXingDemo)或扫描下面的二维码安装 | [点击下载 ZBarDemo.apk](http://fir.im/ZBarDemo)或扫描下面的二维码安装 |
| :------------: | :------------: |
|  |  |
## Gradle 依赖
* 把 `maven { url 'https://jitpack.io' }` 添加到 root build.gradle 的 repositories 中
* 在 app build.gradle 中添加如下依赖,末尾的「latestVersion」指的是徽章 [](https://jitpack.io/#bingoogolapple/BGAQRCode-Android) 里的版本名称,请自行替换
>ZXing
```groovy
dependencies {
implementation 'com.github.bingoogolapple.BGAQRCode-Android:zxing:latestVersion'
}
```
>ZBar
```groovy
dependencies {
implementation 'com.github.bingoogolapple.BGAQRCode-Android:zbar:latestVersion'
}
```
## 布局文件
>ZXing
```xml
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/zxingview"
style="@style/MatchMatch"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_scanLineSize="1dp"
app:qrcv_topOffset="90dp" />
```
>ZBar
```xml
<cn.bingoogolapple.qrcode.zbar.ZBarView
android:id="@+id/zbarview"
style="@style/MatchMatch"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_isShowDefaultScanLineDrawable="true"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_topOffset="90dp" />
```
## 自定义属性说明
属性名 | 说明 | 默认值
:----------- | :----------- | :-----------
qrcv_topOffset | 扫描框距离 toolbar 底部的距离 | 90dp
qrcv_cornerSize | 扫描框边角线的宽度 | 3dp
qrcv_cornerLength | 扫描框边角线的长度 | 20dp
qrcv_cornerColor | 扫描框边角线的颜色 | @android:color/white
qrcv_cornerDisplayType | 扫描框边角线显示位置(相对于边框),默认值为中间 | center
qrcv_rectWidth | 扫描框的宽度 | 200dp
qrcv_barcodeRectHeight | 条码扫样式描框的高度 | 140dp
qrcv_maskColor | 除去扫描框,其余部分阴影颜色 | #33FFFFFF
qrcv_scanLineSize | 扫描线的宽度 | 1dp
qrcv_scanLineColor | 扫描线的颜色「扫描线和默认的扫描线图片的颜色」 | @android:color/white
qrcv_scanLineMargin | 扫描线距离上下或者左右边框的间距 | 0dp
qrcv_isShowDefaultScanLineDrawable | 是否显示默认的图片扫描线「设置该属性后 qrcv_scanLineSize 将失效,可以通过 qrcv_scanLineColor 设置扫描线的颜色,避免让你公司的UI单独给你出特定颜色的扫描线图片」 | false
qrcv_customScanLineDrawable | 扫描线的图片资源「默认的扫描线图片样式不能满足你的需求时使用,设置该属性后 qrcv_isShowDefaultScanLineDrawable、qrcv_scanLineSize、qrcv_scanLineColor 将失效」 | null
qrcv_borderSize | 扫描边框的宽度 | 1dp
qrcv_borderColor | 扫描边框的颜色 | @android:color/white
qrcv_animTime | 扫描线从顶部移动到底部的动画时间「单位为毫秒」 | 1000
qrcv_isCenterVertical(已废弃,如果要垂直居中用 qrcv_verticalBias="0.5"来代替) | 扫描框是否垂直居中,该属性为true时会忽略 qrcv_topOffset 属性 | false
qrcv_verticalBias | 扫描框中心点在屏幕垂直方向的比例,当设置此值时,会忽略 qrcv_topOffset 属性 | -1
qrcv_toolbarHeight | Toolbar 的高度,通过该属性来修正由 Toolbar 导致扫描框在垂直方向上的偏差 | 0dp
qrcv_isBarcode | 扫描框的样式是否为扫条形码样式 | false
qrcv_tipText | 提示文案 | null
qrcv_tipTextSize | 提示文案字体大小 | 14sp
qrcv_tipTextColor | 提示文案颜色 | @android:color/white
qrcv_isTipTextBelowRect | 提示文案是否在扫描框的底部 | false
qrcv_tipTextMargin | 提示文案与扫描框之间的间距 | 20dp
qrcv_isShowTipTextAsSingleLine | 是否把提示文案作为单行显示 | false
qrcv_isShowTipBackground | 是否显示提示文案的背景 | false
qrcv_tipBackgroundColor | 提示文案的背景色 | #22000000
qrcv_isScanLineReverse | 扫描线是否来回移动 | true
qrcv_isShowDefaultGridScanLineDrawable | 是否显示默认的网格图片扫描线 | false
qrcv_customGridScanLineDrawable | 扫描线的网格图片资源 | nulll
qrcv_isOnlyDecodeScanBoxArea | 是否只识别扫描框中的码 | false
qrcv_isShowLocationPoint | 是否显示定位点 | false
qrcv_isAutoZoom | 码太小时是否自动缩放 | false
## 接口说明
>QRCodeView
```java
/**
* ZBarView 设置识别的格式。详细用法请看 zbardemo 的 TestScanActivity 中的 onClick 方法
*
* @param barcodeType 识别的格式
* @param formatList barcodeType 为 BarcdeType.CUSTOM 时,必须指定该值
*/
public void setType(BarcodeType barcodeType, List<BarcodeFormat> formatList)
/**
* ZXingView 设置识别的格式。详细用法请看 zxingdemo TestScanActivity 中的 onClick 方法
*
* @param barcodeType 识别的格式
* @param hintMap barcodeType 为 BarcodeType.CUSTOM 时,必须指定该值
*/
public void setType(BarcodeType barcodeType, Map<DecodeHintType, Object> hintMap)
/**
* 设置扫描二维码的代理
*
* @param delegate 扫描二维码的代理
*/
public void setDelegate(Delegate delegate)
/**
* 显示扫描框
*/
public void showScanRect()
/**
* 隐藏扫描框
*/
public void hiddenScanRect()
/**
* 打开后置摄像头开始预览,但是并未开始识别
*/
public void startCamera()
/**
* 打开指定摄像头开始预览,但是并未开始识别
*
* @param cameraFacing Camera.CameraInfo.CAMERA_FACING_BACK or Camera.CameraInfo.CAMERA_FACING_FRONT
*/
public void startCamera(int cameraFacing)
/**
* 关闭摄像头预览,并且隐藏扫描框
*/
public void stopCamera()
/**
* 开始识别
*/
public void startSpot()
/**
* 停止识别
*/
public void stopSpot()
/**
* 停止识别,并且隐藏扫描框
*/
public void stopSpotAndHiddenRect()
/**
* 显示扫描框,并开始识别
*/
public void startSpotAndShowRect()
/**
* 打开闪光灯
*/
public void openFlashlight()
/**
* 关闭散光灯
*/
public void closeFlashlight()
/**
* 解析本地图片二维码。返回二维码图片里的内容 或 null
*
* @param picturePath 要解析的二维码图片本地路径
*/
public void decodeQRCode(String picturePath)
/**
* 解析 Bitmap 二维码。返回二维码图片里的内容 或 null
*
* @param bitmap 要解析的二维码图片
*/
public void decodeQRCode(Bitmap bitmap)
```
>QRCodeView.Delegate 扫描二维码的代理
```java
/**
* 处理扫描结果
*
* @param result 摄像头扫码时只要回调了该方法 result 就一定有值,不会为 null。解析本地图片或 Bitmap 时 result 可能为 null
*/
void onScanQRCodeSuccess(String result)
/**
* 摄像头环境亮度发生变化
*
* @param isDark 是否变暗
*/
void onCameraAmbientBrightnessChanged(boolean isDark);
/**
* 处理打开相机出错
*/
void onScanQRCodeOpenCameraError()
```
>QRCodeEncoder 创建二维码图片。几个重载方法都是耗时操作,请在子线程中调用。
```java
/**
* 同步创建黑色前景色、白色背景色的二维码图片。该方法是耗时操作,请在子线程中调用。
*
* @param content 要生成的二维码图片内容
* @param size 图片宽高,单位为px
*/
public static Bitmap syncEncodeQRCode(String content, int size)
/**
* 同步创建指定前景色、白色背景色的二维码图片。该方法是耗时操作,请在子线程中调用。
*
* @param content 要生成的二维码图片内容
* @param size 图片宽高,单位为px
* @param foregroundColor 二维码图片的前景色
*/
public static Bitmap syncEncodeQRCode(String content, int size, int foregroundColor)
/**
* 同步创建指定前景色、白色背景色、带logo的二维码图片。该方法是耗时操作,请在子线程中调用。
*
* @param content 要生成的二维码图片内容
* @param size 图片宽高,单位为px
* @param foregroundColor 二维码图片的前景色
* @param logo 二维码图片的logo
*/
public static Bitmap syncEncodeQRCode(String content, int size, int foregroundColor, Bitmap logo)
/**
* 同步创建指定前景色、指定背景色、带logo的二维码图片。该方法是耗时操作,请在子线程中调用。
*
* @param content 要生成的二维码图片内容
* @param size 图片宽高,单位为px
* @param foregroundColor 二维码图片的前景色
* @param backgroundColor 二维码图片的背景色
* @param logo 二维码图片的logo
*/
public static Bitmap syncEncodeQRCode(String content, int size, int foregroundColor, int backgroundColor, Bitmap logo)
/**
* 同步创建条形码图片
*
* @param content 要生成条形码包含的内容
* @param width 条形码的宽度,单位px
* @param height 条形码的高度,单位px
* @param textSize 字体大小,单位px,如果等于0则不在底部绘制文字
*/
public static Bitmap syncEncodeBarcode(String content, int width, int height, int textSize)
```
#### 详细用法请查看[ZBarDemo](https://github.com/bingoogolapple/BGAQRCode-Android/tree/master/zbardemo):feet:
#### 详细用法请查看[ZXingDemo](https://github.com/bingoogolapple/BGAQRCode-Android/tree/master/zxingdemo):feet:
## 作者联系方式
| 个人主页 | 邮箱 |
| ------------- | ------------ |
| <a href="https://www.bingoogolapple.cn" target="_blank">bingoogolapple.cn</a> | <a href="mailto:bingoogolapple@gmail.com" target="_blank">bingoogolapple@gmail.com</a> |
| 个人微信号 | 微信群 | 公众号 |
| ------------ | ------------ | ------------ |
| <img width="180" alt="个人微信号" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/BGAQrCode.png"> | <img width="180" alt="微信群" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/WeChatGroup1QrCode.jpg"> | <img width="180" alt="公众号" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/GongZhongHao.png"> |
| 个人 QQ 号 | QQ 群 |
| ------------ | ------------ |
| <img width="180" alt="个人 QQ 号" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/BGAQQQrCode.jpg"> | <img width="180" alt="QQ 群" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/QQGroup1QrCode.jpg"> |
## 打赏支持作者
如果您觉得 BGA 系列开源库或工具软件帮您节省了大量的开发时间,可以扫描下方的二维码打赏支持。您的支持将鼓励我继续创作,打赏后还可以加我微信免费开通一年 [上帝小助手浏览器扩展/插件开发平台](https://github.com/bingoogolapple/bga-god-assistant-config) 的会员服务
| 微信 | QQ | 支付宝 |
| ------------- | ------------- | ------------- |
| <img width="180" alt="微信" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/donate-wechat.jpg"> | <img width="180" alt="QQ" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/donate-qq.jpg"> | <img width="180" alt="支付宝" src="https://github.com/bingoogolapple/bga-god-assistant-config/raw/main/images/donate-alipay.jpg"> |
## 作者项目推荐
* 欢迎您使用我开发的第一个独立开发软件产品 [上帝小助手浏览器扩展/插件开发平台](https://github.com/bingoogolapple/bga-god-assistant-config)
## License
Copyright (C) 2012 The Android Open Source Project
Copyright 2014 bingoogolapple
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: assembleDebug.sh
================================================
#!/bin/bash +x
./gradlew :zxingdemo:assembleDebug
./gradlew :zbardemo:assembleDebug
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
allprojects {
repositories {
maven { url 'https://jitpack.io' }
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Nov 10 17:04:31 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
================================================
FILE: gradle.properties
================================================
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=28
ANDROID_BUILD_SDK_VERSION=28
VERSION_NAME=1.3.8
VERSION_CODE=138
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: qrcodecore/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
android {
compileSdkVersion ANDROID_BUILD_SDK_VERSION as int
defaultConfig {
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
}
}
================================================
FILE: qrcodecore/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.bingoogolapple.qrcode.core">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
</manifest>
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/BGAQRCodeUtil.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.MotionEvent;
import android.view.WindowManager;
public class BGAQRCodeUtil {
private static boolean debug;
public static void setDebug(boolean debug) {
BGAQRCodeUtil.debug = debug;
}
public static boolean isDebug() {
return debug;
}
public static void d(String msg) {
d("BGAQRCode", msg);
}
public static void printRect(String prefix, Rect rect) {
d("BGAQRCodeFocusArea", prefix + " centerX:" + rect.centerX() + " centerY:" + rect.centerY() + " width:" + rect.width() + " height:" + rect.height()
+ " rectHalfWidth:" + rect.width() / 2 + " rectHalfHeight:" + rect.height() / 2
+ " left:" + rect.left + " top:" + rect.top + " right:" + rect.right + " bottom:" + rect.bottom);
}
public static void d(String tag, String msg) {
if (debug) {
Log.d(tag, msg);
}
}
public static void e(String msg) {
if (debug) {
Log.e("BGAQRCode", msg);
}
}
/**
* 是否为竖屏
*/
public static boolean isPortrait(Context context) {
Point screenResolution = getScreenResolution(context);
return screenResolution.y > screenResolution.x;
}
static Point getScreenResolution(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point screenResolution = new Point();
display.getSize(screenResolution);
return screenResolution;
}
public static int getStatusBarHeight(Context context) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[]{
android.R.attr.windowFullscreen
});
boolean windowFullscreen = typedArray.getBoolean(0, false);
typedArray.recycle();
if (windowFullscreen) {
return 0;
}
int height = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
height = context.getResources().getDimensionPixelSize(resourceId);
}
return height;
}
public static int dp2px(Context context, float dpValue) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, context.getResources().getDisplayMetrics());
}
public static int sp2px(Context context, float spValue) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spValue, context.getResources().getDisplayMetrics());
}
static Bitmap adjustPhotoRotation(Bitmap inputBitmap, int orientationDegree) {
if (inputBitmap == null) {
return null;
}
Matrix matrix = new Matrix();
matrix.setRotate(orientationDegree, (float) inputBitmap.getWidth() / 2, (float) inputBitmap.getHeight() / 2);
float outputX, outputY;
if (orientationDegree == 90) {
outputX = inputBitmap.getHeight();
outputY = 0;
} else {
outputX = inputBitmap.getHeight();
outputY = inputBitmap.getWidth();
}
final float[] values = new float[9];
matrix.getValues(values);
float x1 = values[Matrix.MTRANS_X];
float y1 = values[Matrix.MTRANS_Y];
matrix.postTranslate(outputX - x1, outputY - y1);
Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap.getHeight(), inputBitmap.getWidth(), Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
Canvas canvas = new Canvas(outputBitmap);
canvas.drawBitmap(inputBitmap, matrix, paint);
return outputBitmap;
}
static Bitmap makeTintBitmap(Bitmap inputBitmap, int tintColor) {
if (inputBitmap == null) {
return null;
}
Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap.getWidth(), inputBitmap.getHeight(), inputBitmap.getConfig());
Canvas canvas = new Canvas(outputBitmap);
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(tintColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(inputBitmap, 0, 0, paint);
return outputBitmap;
}
/**
* 计算对焦和测光区域
*
* @param coefficient 比率
* @param originFocusCenterX 对焦中心点X
* @param originFocusCenterY 对焦中心点Y
* @param originFocusWidth 对焦宽度
* @param originFocusHeight 对焦高度
* @param previewViewWidth 预览宽度
* @param previewViewHeight 预览高度
*/
static Rect calculateFocusMeteringArea(float coefficient,
float originFocusCenterX, float originFocusCenterY,
int originFocusWidth, int originFocusHeight,
int previewViewWidth, int previewViewHeight) {
int halfFocusAreaWidth = (int) (originFocusWidth * coefficient / 2);
int halfFocusAreaHeight = (int) (originFocusHeight * coefficient / 2);
int centerX = (int) (originFocusCenterX / previewViewWidth * 2000 - 1000);
int centerY = (int) (originFocusCenterY / previewViewHeight * 2000 - 1000);
RectF rectF = new RectF(BGAQRCodeUtil.clamp(centerX - halfFocusAreaWidth, -1000, 1000),
BGAQRCodeUtil.clamp(centerY - halfFocusAreaHeight, -1000, 1000),
BGAQRCodeUtil.clamp(centerX + halfFocusAreaWidth, -1000, 1000),
BGAQRCodeUtil.clamp(centerY + halfFocusAreaHeight, -1000, 1000));
return new Rect(Math.round(rectF.left), Math.round(rectF.top),
Math.round(rectF.right), Math.round(rectF.bottom));
}
static int clamp(int value, int min, int max) {
return Math.min(Math.max(value, min), max);
}
/**
* 计算手指间距
*/
static float calculateFingerSpacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
/**
* 将本地图片文件转换成可解码二维码的 Bitmap。为了避免图片太大,这里对图片进行了压缩。感谢 https://github.com/devilsen 提的 PR
*
* @param picturePath 本地图片文件路径
*/
public static Bitmap getDecodeAbleBitmap(String picturePath) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(picturePath, options);
int sampleSize = options.outHeight / 400;
if (sampleSize <= 0) {
sampleSize = 1;
}
options.inSampleSize = sampleSize;
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(picturePath, options);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/BarcodeType.java
================================================
package cn.bingoogolapple.qrcode.core;
/**
* 作者:王浩
* 创建时间:2018/6/20
* 描述:识别的格式
*/
public enum BarcodeType {
/**
* 所有格式
*/
ALL,
/**
* 所有一维条码格式
*/
ONE_DIMENSION,
/**
* 所有二维条码格式
*/
TWO_DIMENSION,
/**
* 仅 QR_CODE
*/
ONLY_QR_CODE,
/**
* 仅 CODE_128
*/
ONLY_CODE_128,
/**
* 仅 EAN_13
*/
ONLY_EAN_13,
/**
* 高频率格式,包括 QR_CODE、ISBN13、UPC_A、EAN_13、CODE_128
*/
HIGH_FREQUENCY,
/**
* 自定义格式
*/
CUSTOM
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/CameraConfigurationManager.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.content.Context;
import android.graphics.Point;
import android.hardware.Camera;
import android.view.Display;
import android.view.Surface;
import android.view.WindowManager;
import java.util.Collection;
import java.util.List;
final class CameraConfigurationManager {
private final Context mContext;
private Point mCameraResolution;
private Point mPreviewResolution;
CameraConfigurationManager(Context context) {
mContext = context;
}
void initFromCameraParameters(Camera camera) {
Point screenResolution = BGAQRCodeUtil.getScreenResolution(mContext);
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
if (BGAQRCodeUtil.isPortrait(mContext)) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}
mPreviewResolution = getPreviewResolution(camera.getParameters(), screenResolutionForCamera);
if (BGAQRCodeUtil.isPortrait(mContext)) {
mCameraResolution = new Point(mPreviewResolution.y, mPreviewResolution.x);
} else {
mCameraResolution = mPreviewResolution;
}
}
private static boolean autoFocusAble(Camera camera) {
List<String> supportedFocusModes = camera.getParameters().getSupportedFocusModes();
String focusMode = findSettableValue(supportedFocusModes, Camera.Parameters.FOCUS_MODE_AUTO);
return focusMode != null;
}
Point getCameraResolution() {
return mCameraResolution;
}
void setDesiredCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(mPreviewResolution.x, mPreviewResolution.y);
// https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java
int[] previewFpsRange = selectPreviewFpsRange(camera, 60.0f);
if (previewFpsRange != null) {
parameters.setPreviewFpsRange(
previewFpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
previewFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
}
camera.setDisplayOrientation(getDisplayOrientation());
camera.setParameters(parameters);
}
/**
* Selects the most suitable preview frames per second range, given the desired frames per
* second.
*
* @param camera the camera to select a frames per second range from
* @param desiredPreviewFps the desired frames per second for the camera preview frames
* @return the selected preview frames per second range
*/
private int[] selectPreviewFpsRange(Camera camera, float desiredPreviewFps) {
// The camera API uses integers scaled by a factor of 1000 instead of floating-point frame
// rates.
int desiredPreviewFpsScaled = (int) (desiredPreviewFps * 1000.0f);
// The method for selecting the best range is to minimize the sum of the differences between
// the desired value and the upper and lower bounds of the range. This may select a range
// that the desired value is outside of, but this is often preferred. For example, if the
// desired frame rate is 29.97, the range (30, 30) is probably more desirable than the
// range (15, 30).
int[] selectedFpsRange = null;
int minDiff = Integer.MAX_VALUE;
List<int[]> previewFpsRangeList = camera.getParameters().getSupportedPreviewFpsRange();
for (int[] range : previewFpsRangeList) {
int deltaMin = desiredPreviewFpsScaled - range[Camera.Parameters.PREVIEW_FPS_MIN_INDEX];
int deltaMax = desiredPreviewFpsScaled - range[Camera.Parameters.PREVIEW_FPS_MAX_INDEX];
int diff = Math.abs(deltaMin) + Math.abs(deltaMax);
if (diff < minDiff) {
selectedFpsRange = range;
minDiff = diff;
}
}
return selectedFpsRange;
}
void openFlashlight(Camera camera) {
doSetTorch(camera, true);
}
void closeFlashlight(Camera camera) {
doSetTorch(camera, false);
}
private void doSetTorch(Camera camera, boolean newSetting) {
Camera.Parameters parameters = camera.getParameters();
String flashMode;
/** 是否支持闪光灯 */
if (newSetting) {
flashMode = findSettableValue(parameters.getSupportedFlashModes(), Camera.Parameters.FLASH_MODE_TORCH, Camera.Parameters.FLASH_MODE_ON);
} else {
flashMode = findSettableValue(parameters.getSupportedFlashModes(), Camera.Parameters.FLASH_MODE_OFF);
}
if (flashMode != null) {
parameters.setFlashMode(flashMode);
}
camera.setParameters(parameters);
}
private static String findSettableValue(Collection<String> supportedValues, String... desiredValues) {
String result = null;
if (supportedValues != null) {
for (String desiredValue : desiredValues) {
if (supportedValues.contains(desiredValue)) {
result = desiredValue;
break;
}
}
}
return result;
}
private int getDisplayOrientation() {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
if (wm == null) {
return 0;
}
Display display = wm.getDefaultDisplay();
int rotation = display.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
result = (info.orientation - degrees + 360) % 360;
}
return result;
}
private static Point getPreviewResolution(Camera.Parameters parameters, Point screenResolution) {
Point previewResolution =
findBestPreviewSizeValue(parameters.getSupportedPreviewSizes(), screenResolution);
if (previewResolution == null) {
previewResolution = new Point((screenResolution.x >> 3) << 3, (screenResolution.y >> 3) << 3);
}
return previewResolution;
}
private static Point findBestPreviewSizeValue(List<Camera.Size> supportSizeList, Point screenResolution) {
int bestX = 0;
int bestY = 0;
int diff = Integer.MAX_VALUE;
for (Camera.Size previewSize : supportSizeList) {
int newX = previewSize.width;
int newY = previewSize.height;
int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
if (newDiff == 0) {
bestX = newX;
bestY = newY;
break;
} else if (newDiff < diff) {
bestX = newX;
bestY = newY;
diff = newDiff;
}
}
if (bestX > 0 && bestY > 0) {
return new Point(bestX, bestY);
}
return null;
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/CameraPreview.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.util.Collections;
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera mCamera;
private boolean mPreviewing = false;
private boolean mSurfaceCreated = false;
private boolean mIsTouchFocusing = false;
private float mOldDist = 1f;
private CameraConfigurationManager mCameraConfigurationManager;
private Delegate mDelegate;
public CameraPreview(Context context) {
super(context);
getHolder().addCallback(this);
}
void setCamera(Camera camera) {
mCamera = camera;
if (mCamera != null) {
mCameraConfigurationManager = new CameraConfigurationManager(getContext());
mCameraConfigurationManager.initFromCameraParameters(mCamera);
if (mPreviewing) {
requestLayout();
} else {
showCameraPreview();
}
}
}
void setDelegate(Delegate delegate) {
mDelegate = delegate;
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mSurfaceCreated = true;
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
if (surfaceHolder.getSurface() == null) {
return;
}
stopCameraPreview();
showCameraPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mSurfaceCreated = false;
stopCameraPreview();
}
public void reactNativeShowCameraPreview() {
if (getHolder() == null || getHolder().getSurface() == null) {
return;
}
stopCameraPreview();
showCameraPreview();
}
private void showCameraPreview() {
if (mCamera != null) {
try {
mPreviewing = true;
SurfaceHolder surfaceHolder = getHolder();
surfaceHolder.setKeepScreenOn(true);
mCamera.setPreviewDisplay(surfaceHolder);
mCameraConfigurationManager.setDesiredCameraParameters(mCamera);
mCamera.startPreview();
if (mDelegate != null) {
mDelegate.onStartPreview();
}
startContinuousAutoFocus();
} catch (Exception e) {
e.printStackTrace();
}
}
}
void stopCameraPreview() {
if (mCamera != null) {
try {
mPreviewing = false;
mCamera.cancelAutoFocus();
mCamera.setOneShotPreviewCallback(null);
mCamera.stopPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
}
void openFlashlight() {
if (flashLightAvailable()) {
mCameraConfigurationManager.openFlashlight(mCamera);
}
}
void closeFlashlight() {
if (flashLightAvailable()) {
mCameraConfigurationManager.closeFlashlight(mCamera);
}
}
private boolean flashLightAvailable() {
return isPreviewing() && getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
void onScanBoxRectChanged(Rect scanRect) {
if (mCamera == null || scanRect == null || scanRect.left <= 0 || scanRect.top <= 0) {
return;
}
int centerX = scanRect.centerX();
int centerY = scanRect.centerY();
int rectHalfWidth = scanRect.width() / 2;
int rectHalfHeight = scanRect.height() / 2;
BGAQRCodeUtil.printRect("转换前", scanRect);
if (BGAQRCodeUtil.isPortrait(getContext())) {
int temp = centerX;
centerX = centerY;
centerY = temp;
temp = rectHalfWidth;
rectHalfWidth = rectHalfHeight;
rectHalfHeight = temp;
}
scanRect = new Rect(centerX - rectHalfWidth, centerY - rectHalfHeight, centerX + rectHalfWidth, centerY + rectHalfHeight);
BGAQRCodeUtil.printRect("转换后", scanRect);
BGAQRCodeUtil.d("扫码框发生变化触发对焦测光");
handleFocusMetering(scanRect.centerX(), scanRect.centerY(), scanRect.width(), scanRect.height());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isPreviewing()) {
return super.onTouchEvent(event);
}
if (event.getPointerCount() == 1 && (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
if (mIsTouchFocusing) {
return true;
}
mIsTouchFocusing = true;
BGAQRCodeUtil.d("手指触摸触发对焦测光");
float centerX = event.getX();
float centerY = event.getY();
if (BGAQRCodeUtil.isPortrait(getContext())) {
float temp = centerX;
centerX = centerY;
centerY = temp;
}
int focusSize = BGAQRCodeUtil.dp2px(getContext(), 120);
handleFocusMetering(centerX, centerY, focusSize, focusSize);
}
if (event.getPointerCount() == 2) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
mOldDist = BGAQRCodeUtil.calculateFingerSpacing(event);
break;
case MotionEvent.ACTION_MOVE:
float newDist = BGAQRCodeUtil.calculateFingerSpacing(event);
if (newDist > mOldDist) {
handleZoom(true, mCamera);
} else if (newDist < mOldDist) {
handleZoom(false, mCamera);
}
break;
}
}
return true;
}
private static void handleZoom(boolean isZoomIn, Camera camera) {
try {
Camera.Parameters params = camera.getParameters();
if (params.isZoomSupported()) {
int zoom = params.getZoom();
if (isZoomIn && zoom < params.getMaxZoom()) {
BGAQRCodeUtil.d("放大");
zoom++;
} else if (!isZoomIn && zoom > 0) {
BGAQRCodeUtil.d("缩小");
zoom--;
} else {
BGAQRCodeUtil.d("既不放大也不缩小");
}
params.setZoom(zoom);
camera.setParameters(params);
} else {
BGAQRCodeUtil.d("不支持缩放");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handleFocusMetering(float originFocusCenterX, float originFocusCenterY,
int originFocusWidth, int originFocusHeight) {
try {
boolean isNeedUpdate = false;
Camera.Parameters focusMeteringParameters = mCamera.getParameters();
Camera.Size size = focusMeteringParameters.getPreviewSize();
if (focusMeteringParameters.getMaxNumFocusAreas() > 0) {
BGAQRCodeUtil.d("支持设置对焦区域");
isNeedUpdate = true;
Rect focusRect = BGAQRCodeUtil.calculateFocusMeteringArea(1f,
originFocusCenterX, originFocusCenterY,
originFocusWidth, originFocusHeight,
size.width, size.height);
BGAQRCodeUtil.printRect("对焦区域", focusRect);
focusMeteringParameters.setFocusAreas(Collections.singletonList(new Camera.Area(focusRect, 1000)));
focusMeteringParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
} else {
BGAQRCodeUtil.d("不支持设置对焦区域");
}
if (focusMeteringParameters.getMaxNumMeteringAreas() > 0) {
BGAQRCodeUtil.d("支持设置测光区域");
isNeedUpdate = true;
Rect meteringRect = BGAQRCodeUtil.calculateFocusMeteringArea(1.5f,
originFocusCenterX, originFocusCenterY,
originFocusWidth, originFocusHeight,
size.width, size.height);
BGAQRCodeUtil.printRect("测光区域", meteringRect);
focusMeteringParameters.setMeteringAreas(Collections.singletonList(new Camera.Area(meteringRect, 1000)));
} else {
BGAQRCodeUtil.d("不支持设置测光区域");
}
if (isNeedUpdate) {
mCamera.cancelAutoFocus();
mCamera.setParameters(focusMeteringParameters);
mCamera.autoFocus(new Camera.AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
BGAQRCodeUtil.d("对焦测光成功");
} else {
BGAQRCodeUtil.e("对焦测光失败");
}
startContinuousAutoFocus();
}
});
} else {
mIsTouchFocusing = false;
}
} catch (Exception e) {
e.printStackTrace();
BGAQRCodeUtil.e("对焦测光失败:" + e.getMessage());
startContinuousAutoFocus();
}
}
/**
* 连续对焦
*/
private void startContinuousAutoFocus() {
mIsTouchFocusing = false;
if (mCamera == null) {
return;
}
try {
Camera.Parameters parameters = mCamera.getParameters();
// 连续对焦
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
mCamera.setParameters(parameters);
// 要实现连续的自动对焦,这一句必须加上
mCamera.cancelAutoFocus();
} catch (Exception e) {
BGAQRCodeUtil.e("连续对焦失败");
}
}
boolean isPreviewing() {
return mCamera != null && mPreviewing && mSurfaceCreated;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
if (mCameraConfigurationManager != null && mCameraConfigurationManager.getCameraResolution() != null) {
Point cameraResolution = mCameraConfigurationManager.getCameraResolution();
// 取出来的cameraResolution高宽值与屏幕的高宽顺序是相反的
int cameraPreviewWidth = cameraResolution.x;
int cameraPreviewHeight = cameraResolution.y;
if (width * 1f / height < cameraPreviewWidth * 1f / cameraPreviewHeight) {
float ratio = cameraPreviewHeight * 1f / cameraPreviewWidth;
width = (int) (height / ratio + 0.5f);
} else {
float ratio = cameraPreviewWidth * 1f / cameraPreviewHeight;
height = (int) (width / ratio + 0.5f);
}
}
super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}
interface Delegate {
void onStartPreview();
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ProcessDataTask.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.text.TextUtils;
import java.lang.ref.WeakReference;
class ProcessDataTask extends AsyncTask<Void, Void, ScanResult> {
private Camera mCamera;
private byte[] mData;
private boolean mIsPortrait;
private String mPicturePath;
private Bitmap mBitmap;
private WeakReference<QRCodeView> mQRCodeViewRef;
private static long sLastStartTime = 0;
ProcessDataTask(Camera camera, byte[] data, QRCodeView qrCodeView, boolean isPortrait) {
mCamera = camera;
mData = data;
mQRCodeViewRef = new WeakReference<>(qrCodeView);
mIsPortrait = isPortrait;
}
ProcessDataTask(String picturePath, QRCodeView qrCodeView) {
mPicturePath = picturePath;
mQRCodeViewRef = new WeakReference<>(qrCodeView);
}
ProcessDataTask(Bitmap bitmap, QRCodeView qrCodeView) {
mBitmap = bitmap;
mQRCodeViewRef = new WeakReference<>(qrCodeView);
}
ProcessDataTask perform() {
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
return this;
}
void cancelTask() {
if (getStatus() != Status.FINISHED) {
cancel(true);
}
}
@Override
protected void onCancelled() {
super.onCancelled();
mQRCodeViewRef.clear();
mBitmap = null;
mData = null;
}
private ScanResult processData(QRCodeView qrCodeView) {
if (mData == null) {
return null;
}
int width = 0;
int height = 0;
byte[] data = mData;
try {
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size size = parameters.getPreviewSize();
width = size.width;
height = size.height;
if (mIsPortrait) {
data = new byte[mData.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
data[x * height + height - y - 1] = mData[x + y * width];
}
}
int tmp = width;
width = height;
height = tmp;
}
return qrCodeView.processData(data, width, height, false);
} catch (Exception e1) {
e1.printStackTrace();
try {
if (width != 0 && height != 0) {
BGAQRCodeUtil.d("识别失败重试");
return qrCodeView.processData(data, width, height, true);
} else {
return null;
}
} catch (Exception e2) {
e2.printStackTrace();
return null;
}
}
}
@Override
protected ScanResult doInBackground(Void... params) {
QRCodeView qrCodeView = mQRCodeViewRef.get();
if (qrCodeView == null) {
return null;
}
if (mPicturePath != null) {
return qrCodeView.processBitmapData(BGAQRCodeUtil.getDecodeAbleBitmap(mPicturePath));
} else if (mBitmap != null) {
ScanResult result = qrCodeView.processBitmapData(mBitmap);
mBitmap = null;
return result;
} else {
if (BGAQRCodeUtil.isDebug()) {
BGAQRCodeUtil.d("两次任务执行的时间间隔:" + (System.currentTimeMillis() - sLastStartTime));
sLastStartTime = System.currentTimeMillis();
}
long startTime = System.currentTimeMillis();
ScanResult scanResult = processData(qrCodeView);
if (BGAQRCodeUtil.isDebug()) {
long time = System.currentTimeMillis() - startTime;
if (scanResult != null && !TextUtils.isEmpty(scanResult.result)) {
BGAQRCodeUtil.d("识别成功时间为:" + time);
} else {
BGAQRCodeUtil.e("识别失败时间为:" + time);
}
}
return scanResult;
}
}
@Override
protected void onPostExecute(ScanResult result) {
QRCodeView qrCodeView = mQRCodeViewRef.get();
if (qrCodeView == null) {
return;
}
if (mPicturePath != null || mBitmap != null) {
mBitmap = null;
qrCodeView.onPostParseBitmapOrPicture(result);
} else {
qrCodeView.onPostParseData(result);
}
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/QRCodeView.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
public abstract class QRCodeView extends RelativeLayout implements Camera.PreviewCallback {
private static final int NO_CAMERA_ID = -1;
protected Camera mCamera;
protected CameraPreview mCameraPreview;
protected ScanBoxView mScanBoxView;
protected Delegate mDelegate;
protected boolean mSpotAble = false;
protected ProcessDataTask mProcessDataTask;
protected int mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
private PointF[] mLocationPoints;
private Paint mPaint;
protected BarcodeType mBarcodeType = BarcodeType.HIGH_FREQUENCY;
private long mLastPreviewFrameTime = 0;
private ValueAnimator mAutoZoomAnimator;
private long mLastAutoZoomTime = 0;
// 上次环境亮度记录的时间戳
private long mLastAmbientBrightnessRecordTime = System.currentTimeMillis();
// 上次环境亮度记录的索引
private int mAmbientBrightnessDarkIndex = 0;
// 环境亮度历史记录的数组,255 是代表亮度最大值
private static final long[] AMBIENT_BRIGHTNESS_DARK_LIST = new long[]{255, 255, 255, 255};
// 环境亮度扫描间隔
private static final int AMBIENT_BRIGHTNESS_WAIT_SCAN_TIME = 150;
// 亮度低的阀值
private static final int AMBIENT_BRIGHTNESS_DARK = 60;
public QRCodeView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0);
}
public QRCodeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs);
setupReader();
}
private void initView(Context context, AttributeSet attrs) {
mCameraPreview = new CameraPreview(context);
mCameraPreview.setDelegate(new CameraPreview.Delegate() {
@Override
public void onStartPreview() {
setOneShotPreviewCallback();
}
});
mScanBoxView = new ScanBoxView(context);
mScanBoxView.init(this, attrs);
mCameraPreview.setId(R.id.bgaqrcode_camera_preview);
addView(mCameraPreview);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(context, attrs);
layoutParams.addRule(RelativeLayout.ALIGN_TOP, mCameraPreview.getId());
layoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, mCameraPreview.getId());
addView(mScanBoxView, layoutParams);
mPaint = new Paint();
mPaint.setColor(getScanBoxView().getCornerColor());
mPaint.setStyle(Paint.Style.FILL);
}
private void setOneShotPreviewCallback() {
if (mSpotAble && mCameraPreview.isPreviewing()) {
try {
mCamera.setOneShotPreviewCallback(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected abstract void setupReader();
/**
* 设置扫描二维码的代理
*
* @param delegate 扫描二维码的代理
*/
public void setDelegate(Delegate delegate) {
mDelegate = delegate;
}
public CameraPreview getCameraPreview() {
return mCameraPreview;
}
public ScanBoxView getScanBoxView() {
return mScanBoxView;
}
/**
* 显示扫描框
*/
public void showScanRect() {
if (mScanBoxView != null) {
mScanBoxView.setVisibility(View.VISIBLE);
}
}
/**
* 隐藏扫描框
*/
public void hiddenScanRect() {
if (mScanBoxView != null) {
mScanBoxView.setVisibility(View.GONE);
}
}
/**
* 打开后置摄像头开始预览,但是并未开始识别
*/
public void startCamera() {
startCamera(mCameraId);
}
/**
* 打开指定摄像头开始预览,但是并未开始识别
*/
public void startCamera(int cameraFacing) {
if (mCamera != null || Camera.getNumberOfCameras() == 0) {
return;
}
int ultimateCameraId = findCameraIdByFacing(cameraFacing);
if (ultimateCameraId != NO_CAMERA_ID) {
startCameraById(ultimateCameraId);
return;
}
if (cameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK) {
ultimateCameraId = findCameraIdByFacing(Camera.CameraInfo.CAMERA_FACING_FRONT);
} else if (cameraFacing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
ultimateCameraId = findCameraIdByFacing(Camera.CameraInfo.CAMERA_FACING_BACK);
}
if (ultimateCameraId != NO_CAMERA_ID) {
startCameraById(ultimateCameraId);
}
}
private int findCameraIdByFacing(int cameraFacing) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int cameraId = 0; cameraId < Camera.getNumberOfCameras(); cameraId++) {
try {
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == cameraFacing) {
return cameraId;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return NO_CAMERA_ID;
}
private void startCameraById(int cameraId) {
try {
mCameraId = cameraId;
mCamera = Camera.open(cameraId);
mCameraPreview.setCamera(mCamera);
} catch (Exception e) {
e.printStackTrace();
if (mDelegate != null) {
mDelegate.onScanQRCodeOpenCameraError();
}
}
}
/**
* 关闭摄像头预览,并且隐藏扫描框
*/
public void stopCamera() {
try {
stopSpotAndHiddenRect();
if (mCamera != null) {
mCameraPreview.stopCameraPreview();
mCameraPreview.setCamera(null);
mCamera.release();
mCamera = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 开始识别
*/
public void startSpot() {
mSpotAble = true;
startCamera();
setOneShotPreviewCallback();
}
/**
* 停止识别
*/
public void stopSpot() {
mSpotAble = false;
if (mProcessDataTask != null) {
mProcessDataTask.cancelTask();
mProcessDataTask = null;
}
if (mCamera != null) {
try {
mCamera.setOneShotPreviewCallback(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 停止识别,并且隐藏扫描框
*/
public void stopSpotAndHiddenRect() {
stopSpot();
hiddenScanRect();
}
/**
* 显示扫描框,并开始识别
*/
public void startSpotAndShowRect() {
startSpot();
showScanRect();
}
/**
* 打开闪光灯
*/
public void openFlashlight() {
postDelayed(new Runnable() {
@Override
public void run() {
mCameraPreview.openFlashlight();
}
}, mCameraPreview.isPreviewing() ? 0 : 500);
}
/**
* 关闭闪光灯
*/
public void closeFlashlight() {
mCameraPreview.closeFlashlight();
}
/**
* 销毁二维码扫描控件
*/
public void onDestroy() {
stopCamera();
mDelegate = null;
}
/**
* 切换成扫描条码样式
*/
public void changeToScanBarcodeStyle() {
if (!mScanBoxView.getIsBarcode()) {
mScanBoxView.setIsBarcode(true);
}
}
/**
* 切换成扫描二维码样式
*/
public void changeToScanQRCodeStyle() {
if (mScanBoxView.getIsBarcode()) {
mScanBoxView.setIsBarcode(false);
}
}
/**
* 当前是否为条码扫描样式
*/
public boolean getIsScanBarcodeStyle() {
return mScanBoxView.getIsBarcode();
}
@Override
public void onPreviewFrame(final byte[] data, final Camera camera) {
if (BGAQRCodeUtil.isDebug()) {
BGAQRCodeUtil.d("两次 onPreviewFrame 时间间隔:" + (System.currentTimeMillis() - mLastPreviewFrameTime));
mLastPreviewFrameTime = System.currentTimeMillis();
}
if (mCameraPreview != null && mCameraPreview.isPreviewing()) {
try {
handleAmbientBrightness(data, camera);
} catch (Exception e) {
e.printStackTrace();
}
}
if (!mSpotAble || (mProcessDataTask != null && (mProcessDataTask.getStatus() == AsyncTask.Status.PENDING
|| mProcessDataTask.getStatus() == AsyncTask.Status.RUNNING))) {
return;
}
mProcessDataTask = new ProcessDataTask(camera, data, this, BGAQRCodeUtil.isPortrait(getContext())).perform();
}
private void handleAmbientBrightness(byte[] data, Camera camera) {
if (mCameraPreview == null || !mCameraPreview.isPreviewing()) {
return;
}
long currentTime = System.currentTimeMillis();
if (currentTime - mLastAmbientBrightnessRecordTime < AMBIENT_BRIGHTNESS_WAIT_SCAN_TIME) {
return;
}
mLastAmbientBrightnessRecordTime = currentTime;
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
// 像素点的总亮度
long pixelLightCount = 0L;
// 像素点的总数
long pixelCount = width * height;
// 采集步长,因为没有必要每个像素点都采集,可以跨一段采集一个,减少计算负担,必须大于等于1。
int step = 10;
// data.length - allCount * 1.5f 的目的是判断图像格式是不是 YUV420 格式,只有是这种格式才相等
//因为 int 整形与 float 浮点直接比较会出问题,所以这么比
if (Math.abs(data.length - pixelCount * 1.5f) < 0.00001f) {
for (int i = 0; i < pixelCount; i += step) {
// 如果直接加是不行的,因为 data[i] 记录的是色值并不是数值,byte 的范围是 +127 到 —128,
// 而亮度 FFFFFF 是 11111111 是 -127,所以这里需要先转为无符号 unsigned long 参考 Byte.toUnsignedLong()
pixelLightCount += ((long) data[i]) & 0xffL;
}
// 平均亮度
long cameraLight = pixelLightCount / (pixelCount / step);
// 更新历史记录
int lightSize = AMBIENT_BRIGHTNESS_DARK_LIST.length;
AMBIENT_BRIGHTNESS_DARK_LIST[mAmbientBrightnessDarkIndex = mAmbientBrightnessDarkIndex % lightSize] = cameraLight;
mAmbientBrightnessDarkIndex++;
boolean isDarkEnv = true;
// 判断在时间范围 AMBIENT_BRIGHTNESS_WAIT_SCAN_TIME * lightSize 内是不是亮度过暗
for (long ambientBrightness : AMBIENT_BRIGHTNESS_DARK_LIST) {
if (ambientBrightness > AMBIENT_BRIGHTNESS_DARK) {
isDarkEnv = false;
break;
}
}
BGAQRCodeUtil.d("摄像头环境亮度为:" + cameraLight);
if (mDelegate != null) {
mDelegate.onCameraAmbientBrightnessChanged(isDarkEnv);
}
}
}
/**
* 解析本地图片二维码。返回二维码图片里的内容 或 null
*
* @param picturePath 要解析的二维码图片本地路径
*/
public void decodeQRCode(String picturePath) {
mProcessDataTask = new ProcessDataTask(picturePath, this).perform();
}
/**
* 解析 Bitmap 二维码。返回二维码图片里的内容 或 null
*
* @param bitmap 要解析的二维码图片
*/
public void decodeQRCode(Bitmap bitmap) {
mProcessDataTask = new ProcessDataTask(bitmap, this).perform();
}
protected abstract ScanResult processData(byte[] data, int width, int height, boolean isRetry);
protected abstract ScanResult processBitmapData(Bitmap bitmap);
void onPostParseData(ScanResult scanResult) {
if (!mSpotAble) {
return;
}
String result = scanResult == null ? null : scanResult.result;
if (TextUtils.isEmpty(result)) {
try {
if (mCamera != null) {
mCamera.setOneShotPreviewCallback(QRCodeView.this);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
mSpotAble = false;
try {
if (mDelegate != null) {
mDelegate.onScanQRCodeSuccess(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
void onPostParseBitmapOrPicture(ScanResult scanResult) {
if (mDelegate != null) {
String result = scanResult == null ? null : scanResult.result;
mDelegate.onScanQRCodeSuccess(result);
}
}
void onScanBoxRectChanged(Rect rect) {
mCameraPreview.onScanBoxRectChanged(rect);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (!isShowLocationPoint() || mLocationPoints == null) {
return;
}
for (PointF pointF : mLocationPoints) {
canvas.drawCircle(pointF.x, pointF.y, 10, mPaint);
}
mLocationPoints = null;
postInvalidateDelayed(2000);
}
/**
* 是否显示定位点
*/
protected boolean isShowLocationPoint() {
return mScanBoxView != null && mScanBoxView.isShowLocationPoint();
}
/**
* 是否自动缩放
*/
protected boolean isAutoZoom() {
return mScanBoxView != null && mScanBoxView.isAutoZoom();
}
protected boolean transformToViewCoordinates(final PointF[] pointArr, final Rect scanBoxAreaRect, final boolean isNeedAutoZoom, final String result) {
if (pointArr == null || pointArr.length == 0) {
return false;
}
try {
// 不管横屏还是竖屏,size.width 大于 size.height
Camera.Size size = mCamera.getParameters().getPreviewSize();
boolean isMirrorPreview = mCameraId == Camera.CameraInfo.CAMERA_FACING_FRONT;
int statusBarHeight = BGAQRCodeUtil.getStatusBarHeight(getContext());
PointF[] transformedPoints = new PointF[pointArr.length];
int index = 0;
for (PointF qrPoint : pointArr) {
transformedPoints[index] = transform(qrPoint.x, qrPoint.y, size.width, size.height, isMirrorPreview, statusBarHeight, scanBoxAreaRect);
index++;
}
mLocationPoints = transformedPoints;
postInvalidate();
if (isNeedAutoZoom) {
return handleAutoZoom(transformedPoints, result);
}
return false;
} catch (Exception e) {
mLocationPoints = null;
e.printStackTrace();
return false;
}
}
private boolean handleAutoZoom(PointF[] locationPoints, final String result) {
if (mCamera == null || mScanBoxView == null) {
return false;
}
if (locationPoints == null || locationPoints.length < 1) {
return false;
}
if (mAutoZoomAnimator != null && mAutoZoomAnimator.isRunning()) {
return true;
}
if (System.currentTimeMillis() - mLastAutoZoomTime < 1200) {
return true;
}
Camera.Parameters parameters = mCamera.getParameters();
if (!parameters.isZoomSupported()) {
return false;
}
float point1X = locationPoints[0].x;
float point1Y = locationPoints[0].y;
float point2X = locationPoints[1].x;
float point2Y = locationPoints[1].y;
float xLen = Math.abs(point1X - point2X);
float yLen = Math.abs(point1Y - point2Y);
int len = (int) Math.sqrt(xLen * xLen + yLen * yLen);
int scanBoxWidth = mScanBoxView.getRectWidth();
if (len > scanBoxWidth / 4) {
return false;
}
// 二维码在扫描框中的宽度小于扫描框的 1/4,放大镜头
final int maxZoom = parameters.getMaxZoom();
final int zoomStep = maxZoom / 4;
final int zoom = parameters.getZoom();
post(new Runnable() {
@Override
public void run() {
startAutoZoom(zoom, Math.min(zoom + zoomStep, maxZoom), result);
}
});
return true;
}
private void startAutoZoom(int oldZoom, int newZoom, final String result) {
mAutoZoomAnimator = ValueAnimator.ofInt(oldZoom, newZoom);
mAutoZoomAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (mCameraPreview == null || !mCameraPreview.isPreviewing()) {
return;
}
int zoom = (int) animation.getAnimatedValue();
Camera.Parameters parameters = mCamera.getParameters();
parameters.setZoom(zoom);
mCamera.setParameters(parameters);
}
});
mAutoZoomAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
onPostParseData(new ScanResult(result));
}
});
mAutoZoomAnimator.setDuration(600);
mAutoZoomAnimator.setRepeatCount(0);
mAutoZoomAnimator.start();
mLastAutoZoomTime = System.currentTimeMillis();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mAutoZoomAnimator != null) {
mAutoZoomAnimator.cancel();
}
}
private PointF transform(float originX, float originY, float cameraPreviewWidth, float cameraPreviewHeight, boolean isMirrorPreview, int statusBarHeight,
final Rect scanBoxAreaRect) {
int viewWidth = getWidth();
int viewHeight = getHeight();
PointF result;
float scaleX;
float scaleY;
if (BGAQRCodeUtil.isPortrait(getContext())) {
scaleX = viewWidth / cameraPreviewHeight;
scaleY = viewHeight / cameraPreviewWidth;
result = new PointF((cameraPreviewHeight - originX) * scaleX, (cameraPreviewWidth - originY) * scaleY);
result.y = viewHeight - result.y;
result.x = viewWidth - result.x;
if (scanBoxAreaRect == null) {
result.y += statusBarHeight;
}
} else {
scaleX = viewWidth / cameraPreviewWidth;
scaleY = viewHeight / cameraPreviewHeight;
result = new PointF(originX * scaleX, originY * scaleY);
if (isMirrorPreview) {
result.x = viewWidth - result.x;
}
}
if (scanBoxAreaRect != null) {
result.y += scanBoxAreaRect.top;
result.x += scanBoxAreaRect.left;
}
return result;
}
public interface Delegate {
/**
* 处理扫描结果
*
* @param result 摄像头扫码时只要回调了该方法 result 就一定有值,不会为 null。解析本地图片或 Bitmap 时 result 可能为 null
*/
void onScanQRCodeSuccess(String result);
/**
* 摄像头环境亮度发生变化
*
* @param isDark 是否变暗
*/
void onCameraAmbientBrightnessChanged(boolean isDark);
/**
* 处理打开相机出错
*/
void onScanQRCodeOpenCameraError();
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ScanBoxView.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
public class ScanBoxView extends View {
private int mMoveStepDistance;
private int mAnimDelayTime;
private Rect mFramingRect;
private float mScanLineTop;
private float mScanLineLeft;
private Paint mPaint;
private TextPaint mTipPaint;
private int mMaskColor;
private int mCornerColor;
private int mCornerLength;
private int mCornerSize;
private int mRectWidth;
private int mRectHeight;
private int mBarcodeRectHeight;
private int mTopOffset;
private int mScanLineSize;
private int mScanLineColor;
private int mScanLineMargin;
private boolean mIsShowDefaultScanLineDrawable;
private Drawable mCustomScanLineDrawable;
private Bitmap mScanLineBitmap;
private int mBorderSize;
private int mBorderColor;
private int mAnimTime;
private float mVerticalBias;
private int mCornerDisplayType;
private int mToolbarHeight;
private boolean mIsBarcode;
private String mQRCodeTipText;
private String mBarCodeTipText;
private String mTipText;
private int mTipTextSize;
private int mTipTextColor;
private boolean mIsTipTextBelowRect;
private int mTipTextMargin;
private boolean mIsShowTipTextAsSingleLine;
private int mTipBackgroundColor;
private boolean mIsShowTipBackground;
private boolean mIsScanLineReverse;
private boolean mIsShowDefaultGridScanLineDrawable;
private Drawable mCustomGridScanLineDrawable;
private Bitmap mGridScanLineBitmap;
private float mGridScanLineBottom;
private float mGridScanLineRight;
private Bitmap mOriginQRCodeScanLineBitmap;
private Bitmap mOriginBarCodeScanLineBitmap;
private Bitmap mOriginQRCodeGridScanLineBitmap;
private Bitmap mOriginBarCodeGridScanLineBitmap;
private float mHalfCornerSize;
private StaticLayout mTipTextSl;
private int mTipBackgroundRadius;
private boolean mIsOnlyDecodeScanBoxArea;
private boolean mIsShowLocationPoint;
private boolean mIsAutoZoom;
private QRCodeView mQRCodeView;
public ScanBoxView(Context context) {
super(context);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mMaskColor = Color.parseColor("#33FFFFFF");
mCornerColor = Color.WHITE;
mCornerLength = BGAQRCodeUtil.dp2px(context, 20);
mCornerSize = BGAQRCodeUtil.dp2px(context, 3);
mScanLineSize = BGAQRCodeUtil.dp2px(context, 1);
mScanLineColor = Color.WHITE;
mTopOffset = BGAQRCodeUtil.dp2px(context, 90);
mRectWidth = BGAQRCodeUtil.dp2px(context, 200);
mBarcodeRectHeight = BGAQRCodeUtil.dp2px(context, 140);
mScanLineMargin = 0;
mIsShowDefaultScanLineDrawable = false;
mCustomScanLineDrawable = null;
mScanLineBitmap = null;
mBorderSize = BGAQRCodeUtil.dp2px(context, 1);
mBorderColor = Color.WHITE;
mAnimTime = 1000;
mVerticalBias = -1;
mCornerDisplayType = 1;
mToolbarHeight = 0;
mIsBarcode = false;
mMoveStepDistance = BGAQRCodeUtil.dp2px(context, 2);
mTipText = null;
mTipTextSize = BGAQRCodeUtil.sp2px(context, 14);
mTipTextColor = Color.WHITE;
mIsTipTextBelowRect = false;
mTipTextMargin = BGAQRCodeUtil.dp2px(context, 20);
mIsShowTipTextAsSingleLine = false;
mTipBackgroundColor = Color.parseColor("#22000000");
mIsShowTipBackground = false;
mIsScanLineReverse = false;
mIsShowDefaultGridScanLineDrawable = false;
mTipPaint = new TextPaint();
mTipPaint.setAntiAlias(true);
mTipBackgroundRadius = BGAQRCodeUtil.dp2px(context, 4);
mIsOnlyDecodeScanBoxArea = false;
mIsShowLocationPoint = false;
mIsAutoZoom = false;
}
void init(QRCodeView qrCodeView, AttributeSet attrs) {
mQRCodeView = qrCodeView;
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.QRCodeView);
final int count = typedArray.getIndexCount();
for (int i = 0; i < count; i++) {
initCustomAttr(typedArray.getIndex(i), typedArray);
}
typedArray.recycle();
afterInitCustomAttrs();
}
private void initCustomAttr(int attr, TypedArray typedArray) {
if (attr == R.styleable.QRCodeView_qrcv_topOffset) {
mTopOffset = typedArray.getDimensionPixelSize(attr, mTopOffset);
} else if (attr == R.styleable.QRCodeView_qrcv_cornerSize) {
mCornerSize = typedArray.getDimensionPixelSize(attr, mCornerSize);
} else if (attr == R.styleable.QRCodeView_qrcv_cornerLength) {
mCornerLength = typedArray.getDimensionPixelSize(attr, mCornerLength);
} else if (attr == R.styleable.QRCodeView_qrcv_scanLineSize) {
mScanLineSize = typedArray.getDimensionPixelSize(attr, mScanLineSize);
} else if (attr == R.styleable.QRCodeView_qrcv_rectWidth) {
mRectWidth = typedArray.getDimensionPixelSize(attr, mRectWidth);
} else if (attr == R.styleable.QRCodeView_qrcv_maskColor) {
mMaskColor = typedArray.getColor(attr, mMaskColor);
} else if (attr == R.styleable.QRCodeView_qrcv_cornerColor) {
mCornerColor = typedArray.getColor(attr, mCornerColor);
} else if (attr == R.styleable.QRCodeView_qrcv_scanLineColor) {
mScanLineColor = typedArray.getColor(attr, mScanLineColor);
} else if (attr == R.styleable.QRCodeView_qrcv_scanLineMargin) {
mScanLineMargin = typedArray.getDimensionPixelSize(attr, mScanLineMargin);
} else if (attr == R.styleable.QRCodeView_qrcv_isShowDefaultScanLineDrawable) {
mIsShowDefaultScanLineDrawable = typedArray.getBoolean(attr, mIsShowDefaultScanLineDrawable);
} else if (attr == R.styleable.QRCodeView_qrcv_customScanLineDrawable) {
mCustomScanLineDrawable = typedArray.getDrawable(attr);
} else if (attr == R.styleable.QRCodeView_qrcv_borderSize) {
mBorderSize = typedArray.getDimensionPixelSize(attr, mBorderSize);
} else if (attr == R.styleable.QRCodeView_qrcv_borderColor) {
mBorderColor = typedArray.getColor(attr, mBorderColor);
} else if (attr == R.styleable.QRCodeView_qrcv_animTime) {
mAnimTime = typedArray.getInteger(attr, mAnimTime);
} else if (attr == R.styleable.QRCodeView_qrcv_verticalBias) {
mVerticalBias = typedArray.getFloat(attr, mVerticalBias);
} else if (attr == R.styleable.QRCodeView_qrcv_cornerDisplayType) {
mCornerDisplayType = typedArray.getInteger(attr, mCornerDisplayType);
} else if (attr == R.styleable.QRCodeView_qrcv_toolbarHeight) {
mToolbarHeight = typedArray.getDimensionPixelSize(attr, mToolbarHeight);
} else if (attr == R.styleable.QRCodeView_qrcv_barcodeRectHeight) {
mBarcodeRectHeight = typedArray.getDimensionPixelSize(attr, mBarcodeRectHeight);
} else if (attr == R.styleable.QRCodeView_qrcv_isBarcode) {
mIsBarcode = typedArray.getBoolean(attr, mIsBarcode);
} else if (attr == R.styleable.QRCodeView_qrcv_barCodeTipText) {
mBarCodeTipText = typedArray.getString(attr);
} else if (attr == R.styleable.QRCodeView_qrcv_qrCodeTipText) {
mQRCodeTipText = typedArray.getString(attr);
} else if (attr == R.styleable.QRCodeView_qrcv_tipTextSize) {
mTipTextSize = typedArray.getDimensionPixelSize(attr, mTipTextSize);
} else if (attr == R.styleable.QRCodeView_qrcv_tipTextColor) {
mTipTextColor = typedArray.getColor(attr, mTipTextColor);
} else if (attr == R.styleable.QRCodeView_qrcv_isTipTextBelowRect) {
mIsTipTextBelowRect = typedArray.getBoolean(attr, mIsTipTextBelowRect);
} else if (attr == R.styleable.QRCodeView_qrcv_tipTextMargin) {
mTipTextMargin = typedArray.getDimensionPixelSize(attr, mTipTextMargin);
} else if (attr == R.styleable.QRCodeView_qrcv_isShowTipTextAsSingleLine) {
mIsShowTipTextAsSingleLine = typedArray.getBoolean(attr, mIsShowTipTextAsSingleLine);
} else if (attr == R.styleable.QRCodeView_qrcv_isShowTipBackground) {
mIsShowTipBackground = typedArray.getBoolean(attr, mIsShowTipBackground);
} else if (attr == R.styleable.QRCodeView_qrcv_tipBackgroundColor) {
mTipBackgroundColor = typedArray.getColor(attr, mTipBackgroundColor);
} else if (attr == R.styleable.QRCodeView_qrcv_isScanLineReverse) {
mIsScanLineReverse = typedArray.getBoolean(attr, mIsScanLineReverse);
} else if (attr == R.styleable.QRCodeView_qrcv_isShowDefaultGridScanLineDrawable) {
mIsShowDefaultGridScanLineDrawable = typedArray.getBoolean(attr, mIsShowDefaultGridScanLineDrawable);
} else if (attr == R.styleable.QRCodeView_qrcv_customGridScanLineDrawable) {
mCustomGridScanLineDrawable = typedArray.getDrawable(attr);
} else if (attr == R.styleable.QRCodeView_qrcv_isOnlyDecodeScanBoxArea) {
mIsOnlyDecodeScanBoxArea = typedArray.getBoolean(attr, mIsOnlyDecodeScanBoxArea);
} else if (attr == R.styleable.QRCodeView_qrcv_isShowLocationPoint) {
mIsShowLocationPoint = typedArray.getBoolean(attr, mIsShowLocationPoint);
} else if (attr == R.styleable.QRCodeView_qrcv_isAutoZoom) {
mIsAutoZoom = typedArray.getBoolean(attr, mIsAutoZoom);
}
}
private void afterInitCustomAttrs() {
if (mCustomGridScanLineDrawable != null) {
mOriginQRCodeGridScanLineBitmap = ((BitmapDrawable) mCustomGridScanLineDrawable).getBitmap();
}
if (mOriginQRCodeGridScanLineBitmap == null) {
mOriginQRCodeGridScanLineBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qrcode_default_grid_scan_line);
mOriginQRCodeGridScanLineBitmap = BGAQRCodeUtil.makeTintBitmap(mOriginQRCodeGridScanLineBitmap, mScanLineColor);
}
mOriginBarCodeGridScanLineBitmap = BGAQRCodeUtil.adjustPhotoRotation(mOriginQRCodeGridScanLineBitmap, 90);
mOriginBarCodeGridScanLineBitmap = BGAQRCodeUtil.adjustPhotoRotation(mOriginBarCodeGridScanLineBitmap, 90);
mOriginBarCodeGridScanLineBitmap = BGAQRCodeUtil.adjustPhotoRotation(mOriginBarCodeGridScanLineBitmap, 90);
if (mCustomScanLineDrawable != null) {
mOriginQRCodeScanLineBitmap = ((BitmapDrawable) mCustomScanLineDrawable).getBitmap();
}
if (mOriginQRCodeScanLineBitmap == null) {
mOriginQRCodeScanLineBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qrcode_default_scan_line);
mOriginQRCodeScanLineBitmap = BGAQRCodeUtil.makeTintBitmap(mOriginQRCodeScanLineBitmap, mScanLineColor);
}
mOriginBarCodeScanLineBitmap = BGAQRCodeUtil.adjustPhotoRotation(mOriginQRCodeScanLineBitmap, 90);
mTopOffset += mToolbarHeight;
mHalfCornerSize = 1.0f * mCornerSize / 2;
mTipPaint.setTextSize(mTipTextSize);
mTipPaint.setColor(mTipTextColor);
setIsBarcode(mIsBarcode);
}
@Override
public void onDraw(Canvas canvas) {
if (mFramingRect == null) {
return;
}
// 画遮罩层
drawMask(canvas);
// 画边框线
drawBorderLine(canvas);
// 画四个直角的线
drawCornerLine(canvas);
// 画扫描线
drawScanLine(canvas);
// 画提示文本
drawTipText(canvas);
// 移动扫描线的位置
moveScanLine();
}
/**
* 画遮罩层
*/
private void drawMask(Canvas canvas) {
int width = canvas.getWidth();
int height = canvas.getHeight();
if (mMaskColor != Color.TRANSPARENT) {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mMaskColor);
canvas.drawRect(0, 0, width, mFramingRect.top, mPaint);
canvas.drawRect(0, mFramingRect.top, mFramingRect.left, mFramingRect.bottom + 1, mPaint);
canvas.drawRect(mFramingRect.right + 1, mFramingRect.top, width, mFramingRect.bottom + 1, mPaint);
canvas.drawRect(0, mFramingRect.bottom + 1, width, height, mPaint);
}
}
/**
* 画边框线
*/
private void drawBorderLine(Canvas canvas) {
if (mBorderSize > 0) {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mBorderColor);
mPaint.setStrokeWidth(mBorderSize);
canvas.drawRect(mFramingRect, mPaint);
}
}
/**
* 画四个直角的线
*/
private void drawCornerLine(Canvas canvas) {
if (mHalfCornerSize > 0) {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mCornerColor);
mPaint.setStrokeWidth(mCornerSize);
if (mCornerDisplayType == 1) {
canvas.drawLine(mFramingRect.left - mHalfCornerSize, mFramingRect.top, mFramingRect.left - mHalfCornerSize + mCornerLength, mFramingRect.top,
mPaint);
canvas.drawLine(mFramingRect.left, mFramingRect.top - mHalfCornerSize, mFramingRect.left, mFramingRect.top - mHalfCornerSize + mCornerLength,
mPaint);
canvas.drawLine(mFramingRect.right + mHalfCornerSize, mFramingRect.top, mFramingRect.right + mHalfCornerSize - mCornerLength, mFramingRect.top,
mPaint);
canvas.drawLine(mFramingRect.right, mFramingRect.top - mHalfCornerSize, mFramingRect.right, mFramingRect.top - mHalfCornerSize + mCornerLength,
mPaint);
canvas.drawLine(mFramingRect.left - mHalfCornerSize, mFramingRect.bottom, mFramingRect.left - mHalfCornerSize + mCornerLength,
mFramingRect.bottom, mPaint);
canvas.drawLine(mFramingRect.left, mFramingRect.bottom + mHalfCornerSize, mFramingRect.left,
mFramingRect.bottom + mHalfCornerSize - mCornerLength, mPaint);
canvas.drawLine(mFramingRect.right + mHalfCornerSize, mFramingRect.bottom, mFramingRect.right + mHalfCornerSize - mCornerLength,
mFramingRect.bottom, mPaint);
canvas.drawLine(mFramingRect.right, mFramingRect.bottom + mHalfCornerSize, mFramingRect.right,
mFramingRect.bottom + mHalfCornerSize - mCornerLength, mPaint);
} else if (mCornerDisplayType == 2) {
canvas.drawLine(mFramingRect.left, mFramingRect.top + mHalfCornerSize, mFramingRect.left + mCornerLength, mFramingRect.top + mHalfCornerSize,
mPaint);
canvas.drawLine(mFramingRect.left + mHalfCornerSize, mFramingRect.top, mFramingRect.left + mHalfCornerSize, mFramingRect.top + mCornerLength,
mPaint);
canvas.drawLine(mFramingRect.right, mFramingRect.top + mHalfCornerSize, mFramingRect.right - mCornerLength, mFramingRect.top + mHalfCornerSize,
mPaint);
canvas.drawLine(mFramingRect.right - mHalfCornerSize, mFramingRect.top, mFramingRect.right - mHalfCornerSize, mFramingRect.top + mCornerLength,
mPaint);
canvas.drawLine(mFramingRect.left, mFramingRect.bottom - mHalfCornerSize, mFramingRect.left + mCornerLength,
mFramingRect.bottom - mHalfCornerSize, mPaint);
canvas.drawLine(mFramingRect.left + mHalfCornerSize, mFramingRect.bottom, mFramingRect.left + mHalfCornerSize,
mFramingRect.bottom - mCornerLength, mPaint);
canvas.drawLine(mFramingRect.right, mFramingRect.bottom - mHalfCornerSize, mFramingRect.right - mCornerLength,
mFramingRect.bottom - mHalfCornerSize, mPaint);
canvas.drawLine(mFramingRect.right - mHalfCornerSize, mFramingRect.bottom, mFramingRect.right - mHalfCornerSize,
mFramingRect.bottom - mCornerLength, mPaint);
}
}
}
/**
* 画扫描线
*/
private void drawScanLine(Canvas canvas) {
if (mIsBarcode) {
if (mGridScanLineBitmap != null) {
RectF dstGridRectF = new RectF(mFramingRect.left + mHalfCornerSize + 0.5f, mFramingRect.top + mHalfCornerSize + mScanLineMargin,
mGridScanLineRight, mFramingRect.bottom - mHalfCornerSize - mScanLineMargin);
Rect srcGridRect = new Rect((int) (mGridScanLineBitmap.getWidth() - dstGridRectF.width()), 0, mGridScanLineBitmap.getWidth(),
mGridScanLineBitmap.getHeight());
if (srcGridRect.left < 0) {
srcGridRect.left = 0;
dstGridRectF.left = dstGridRectF.right - srcGridRect.width();
}
canvas.drawBitmap(mGridScanLineBitmap, srcGridRect, dstGridRectF, mPaint);
} else if (mScanLineBitmap != null) {
RectF lineRect = new RectF(mScanLineLeft, mFramingRect.top + mHalfCornerSize + mScanLineMargin, mScanLineLeft + mScanLineBitmap.getWidth(),
mFramingRect.bottom - mHalfCornerSize - mScanLineMargin);
canvas.drawBitmap(mScanLineBitmap, null, lineRect, mPaint);
} else {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mScanLineColor);
canvas.drawRect(mScanLineLeft, mFramingRect.top + mHalfCornerSize + mScanLineMargin, mScanLineLeft + mScanLineSize,
mFramingRect.bottom - mHalfCornerSize - mScanLineMargin, mPaint);
}
} else {
if (mGridScanLineBitmap != null) {
RectF dstGridRectF = new RectF(mFramingRect.left + mHalfCornerSize + mScanLineMargin, mFramingRect.top + mHalfCornerSize + 0.5f,
mFramingRect.right - mHalfCornerSize - mScanLineMargin, mGridScanLineBottom);
Rect srcRect = new Rect(0, (int) (mGridScanLineBitmap.getHeight() - dstGridRectF.height()), mGridScanLineBitmap.getWidth(),
mGridScanLineBitmap.getHeight());
if (srcRect.top < 0) {
srcRect.top = 0;
dstGridRectF.top = dstGridRectF.bottom - srcRect.height();
}
canvas.drawBitmap(mGridScanLineBitmap, srcRect, dstGridRectF, mPaint);
} else if (mScanLineBitmap != null) {
RectF lineRect = new RectF(mFramingRect.left + mHalfCornerSize + mScanLineMargin, mScanLineTop,
mFramingRect.right - mHalfCornerSize - mScanLineMargin, mScanLineTop + mScanLineBitmap.getHeight());
canvas.drawBitmap(mScanLineBitmap, null, lineRect, mPaint);
} else {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mScanLineColor);
canvas.drawRect(mFramingRect.left + mHalfCornerSize + mScanLineMargin, mScanLineTop, mFramingRect.right - mHalfCornerSize - mScanLineMargin,
mScanLineTop + mScanLineSize, mPaint);
}
}
}
/**
* 画提示文本
*/
private void drawTipText(Canvas canvas) {
if (TextUtils.isEmpty(mTipText) || mTipTextSl == null) {
return;
}
if (mIsTipTextBelowRect) {
if (mIsShowTipBackground) {
mPaint.setColor(mTipBackgroundColor);
mPaint.setStyle(Paint.Style.FILL);
if (mIsShowTipTextAsSingleLine) {
Rect tipRect = new Rect();
mTipPaint.getTextBounds(mTipText, 0, mTipText.length(), tipRect);
float left = (canvas.getWidth() - tipRect.width()) / 2 - mTipBackgroundRadius;
canvas.drawRoundRect(
new RectF(left, mFramingRect.bottom + mTipTextMargin - mTipBackgroundRadius, left + tipRect.width() + 2 * mTipBackgroundRadius,
mFramingRect.bottom + mTipTextMargin + mTipTextSl.getHeight() + mTipBackgroundRadius), mTipBackgroundRadius,
mTipBackgroundRadius, mPaint);
} else {
canvas.drawRoundRect(new RectF(mFramingRect.left, mFramingRect.bottom + mTipTextMargin - mTipBackgroundRadius, mFramingRect.right,
mFramingRect.bottom + mTipTextMargin + mTipTextSl.getHeight() + mTipBackgroundRadius), mTipBackgroundRadius,
mTipBackgroundRadius,
mPaint);
}
}
canvas.save();
if (mIsShowTipTextAsSingleLine) {
canvas.translate(0, mFramingRect.bottom + mTipTextMargin);
} else {
canvas.translate(mFramingRect.left + mTipBackgroundRadius, mFramingRect.bottom + mTipTextMargin);
}
mTipTextSl.draw(canvas);
canvas.restore();
} else {
if (mIsShowTipBackground) {
mPaint.setColor(mTipBackgroundColor);
mPaint.setStyle(Paint.Style.FILL);
if (mIsShowTipTextAsSingleLine) {
Rect tipRect = new Rect();
mTipPaint.getTextBounds(mTipText, 0, mTipText.length(), tipRect);
float left = (canvas.getWidth() - tipRect.width()) / 2 - mTipBackgroundRadius;
canvas.drawRoundRect(new RectF(left, mFramingRect.top - mTipTextMargin - mTipTextSl.getHeight() - mTipBackgroundRadius,
left + tipRect.width() + 2 * mTipBackgroundRadius, mFramingRect.top - mTipTextMargin + mTipBackgroundRadius),
mTipBackgroundRadius,
mTipBackgroundRadius, mPaint);
} else {
canvas.drawRoundRect(
new RectF(mFramingRect.left, mFramingRect.top - mTipTextMargin - mTipTextSl.getHeight() - mTipBackgroundRadius, mFramingRect.right,
mFramingRect.top - mTipTextMargin + mTipBackgroundRadius), mTipBackgroundRadius, mTipBackgroundRadius, mPaint);
}
}
canvas.save();
if (mIsShowTipTextAsSingleLine) {
canvas.translate(0, mFramingRect.top - mTipTextMargin - mTipTextSl.getHeight());
} else {
canvas.translate(mFramingRect.left + mTipBackgroundRadius, mFramingRect.top - mTipTextMargin - mTipTextSl.getHeight());
}
mTipTextSl.draw(canvas);
canvas.restore();
}
}
/**
* 移动扫描线的位置
*/
private void moveScanLine() {
if (mIsBarcode) {
if (mGridScanLineBitmap == null) {
// 处理非网格扫描图片的情况
mScanLineLeft += mMoveStepDistance;
int scanLineSize = mScanLineSize;
if (mScanLineBitmap != null) {
scanLineSize = mScanLineBitmap.getWidth();
}
if (mIsScanLineReverse) {
if (mScanLineLeft + scanLineSize > mFramingRect.right - mHalfCornerSize || mScanLineLeft < mFramingRect.left + mHalfCornerSize) {
mMoveStepDistance = -mMoveStepDistance;
}
} else {
if (mScanLineLeft + scanLineSize > mFramingRect.right - mHalfCornerSize) {
mScanLineLeft = mFramingRect.left + mHalfCornerSize + 0.5f;
}
}
} else {
// 处理网格扫描图片的情况
mGridScanLineRight += mMoveStepDistance;
if (mGridScanLineRight > mFramingRect.right - mHalfCornerSize) {
mGridScanLineRight = mFramingRect.left + mHalfCornerSize + 0.5f;
}
}
} else {
if (mGridScanLineBitmap == null) {
// 处理非网格扫描图片的情况
mScanLineTop += mMoveStepDistance;
int scanLineSize = mScanLineSize;
if (mScanLineBitmap != null) {
scanLineSize = mScanLineBitmap.getHeight();
}
if (mIsScanLineReverse) {
if (mScanLineTop + scanLineSize > mFramingRect.bottom - mHalfCornerSize || mScanLineTop < mFramingRect.top + mHalfCornerSize) {
mMoveStepDistance = -mMoveStepDistance;
}
} else {
if (mScanLineTop + scanLineSize > mFramingRect.bottom - mHalfCornerSize) {
mScanLineTop = mFramingRect.top + mHalfCornerSize + 0.5f;
}
}
} else {
// 处理网格扫描图片的情况
mGridScanLineBottom += mMoveStepDistance;
if (mGridScanLineBottom > mFramingRect.bottom - mHalfCornerSize) {
mGridScanLineBottom = mFramingRect.top + mHalfCornerSize + 0.5f;
}
}
}
postInvalidateDelayed(mAnimDelayTime, mFramingRect.left, mFramingRect.top, mFramingRect.right, mFramingRect.bottom);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
calFramingRect();
}
private void calFramingRect() {
int leftOffset = (getWidth() - mRectWidth) / 2;
mFramingRect = new Rect(leftOffset, mTopOffset, leftOffset + mRectWidth, mTopOffset + mRectHeight);
if (mIsBarcode) {
mGridScanLineRight = mScanLineLeft = mFramingRect.left + mHalfCornerSize + 0.5f;
} else {
mGridScanLineBottom = mScanLineTop = mFramingRect.top + mHalfCornerSize + 0.5f;
}
if (mQRCodeView != null && isOnlyDecodeScanBoxArea()) {
mQRCodeView.onScanBoxRectChanged(new Rect(mFramingRect));
}
}
public Rect getScanBoxAreaRect(int previewHeight) {
if (mIsOnlyDecodeScanBoxArea && getVisibility() == View.VISIBLE) {
Rect rect = new Rect(mFramingRect);
float ratio = 1.0f * previewHeight / getMeasuredHeight();
float centerX = rect.exactCenterX() * ratio;
float centerY = rect.exactCenterY() * ratio;
float halfWidth = rect.width() / 2f;
float halfHeight = rect.height() / 2f;
float newHalfWidth = halfWidth * ratio;
float newHalfHeight = halfHeight * ratio;
rect.left = (int) (centerX - newHalfWidth);
rect.right = (int) (centerX + newHalfWidth);
rect.top = (int) (centerY - newHalfHeight);
rect.bottom = (int) (centerY + newHalfHeight);
return rect;
} else {
return null;
}
}
public void setIsBarcode(boolean isBarcode) {
mIsBarcode = isBarcode;
refreshScanBox();
}
private void refreshScanBox() {
if (mCustomGridScanLineDrawable != null || mIsShowDefaultGridScanLineDrawable) {
if (mIsBarcode) {
mGridScanLineBitmap = mOriginBarCodeGridScanLineBitmap;
} else {
mGridScanLineBitmap = mOriginQRCodeGridScanLineBitmap;
}
} else if (mCustomScanLineDrawable != null || mIsShowDefaultScanLineDrawable) {
if (mIsBarcode) {
mScanLineBitmap = mOriginBarCodeScanLineBitmap;
} else {
mScanLineBitmap = mOriginQRCodeScanLineBitmap;
}
}
if (mIsBarcode) {
mTipText = mBarCodeTipText;
mRectHeight = mBarcodeRectHeight;
mAnimDelayTime = (int) ((1.0f * mAnimTime * mMoveStepDistance) / mRectWidth);
} else {
mTipText = mQRCodeTipText;
mRectHeight = mRectWidth;
mAnimDelayTime = (int) ((1.0f * mAnimTime * mMoveStepDistance) / mRectHeight);
}
if (!TextUtils.isEmpty(mTipText)) {
if (mIsShowTipTextAsSingleLine) {
mTipTextSl = new StaticLayout(mTipText, mTipPaint, BGAQRCodeUtil.getScreenResolution(getContext()).x, Layout.Alignment.ALIGN_CENTER, 1.0f, 0,
true);
} else {
mTipTextSl = new StaticLayout(mTipText, mTipPaint, mRectWidth - 2 * mTipBackgroundRadius, Layout.Alignment.ALIGN_CENTER, 1.0f, 0, true);
}
}
if (mVerticalBias != -1) {
int screenHeight = BGAQRCodeUtil.getScreenResolution(getContext()).y - BGAQRCodeUtil.getStatusBarHeight(getContext());
if (mToolbarHeight == 0) {
mTopOffset = (int) (screenHeight * mVerticalBias - mRectHeight / 2);
} else {
mTopOffset = mToolbarHeight + (int) ((screenHeight - mToolbarHeight) * mVerticalBias - mRectHeight / 2);
}
}
calFramingRect();
postInvalidate();
}
public boolean getIsBarcode() {
return mIsBarcode;
}
public int getMaskColor() {
return mMaskColor;
}
public void setMaskColor(int maskColor) {
mMaskColor = maskColor;
refreshScanBox();
}
public int getCornerColor() {
return mCornerColor;
}
public void setCornerColor(int cornerColor) {
mCornerColor = cornerColor;
refreshScanBox();
}
public int getCornerLength() {
return mCornerLength;
}
public void setCornerLength(int cornerLength) {
mCornerLength = cornerLength;
refreshScanBox();
}
public int getCornerSize() {
return mCornerSize;
}
public void setCornerSize(int cornerSize) {
mCornerSize = cornerSize;
refreshScanBox();
}
public int getRectWidth() {
return mRectWidth;
}
public void setRectWidth(int rectWidth) {
mRectWidth = rectWidth;
refreshScanBox();
}
public int getRectHeight() {
return mRectHeight;
}
public void setRectHeight(int rectHeight) {
mRectHeight = rectHeight;
refreshScanBox();
}
public int getBarcodeRectHeight() {
return mBarcodeRectHeight;
}
public void setBarcodeRectHeight(int barcodeRectHeight) {
mBarcodeRectHeight = barcodeRectHeight;
refreshScanBox();
}
public int getTopOffset() {
return mTopOffset;
}
public void setTopOffset(int topOffset) {
mTopOffset = topOffset;
refreshScanBox();
}
public int getScanLineSize() {
return mScanLineSize;
}
public void setScanLineSize(int scanLineSize) {
mScanLineSize = scanLineSize;
refreshScanBox();
}
public int getScanLineColor() {
return mScanLineColor;
}
public void setScanLineColor(int scanLineColor) {
mScanLineColor = scanLineColor;
refreshScanBox();
}
public int getScanLineMargin() {
return mScanLineMargin;
}
public void setScanLineMargin(int scanLineMargin) {
mScanLineMargin = scanLineMargin;
refreshScanBox();
}
public boolean isShowDefaultScanLineDrawable() {
return mIsShowDefaultScanLineDrawable;
}
public void setShowDefaultScanLineDrawable(boolean showDefaultScanLineDrawable) {
mIsShowDefaultScanLineDrawable = showDefaultScanLineDrawable;
refreshScanBox();
}
public Drawable getCustomScanLineDrawable() {
return mCustomScanLineDrawable;
}
public void setCustomScanLineDrawable(Drawable customScanLineDrawable) {
mCustomScanLineDrawable = customScanLineDrawable;
refreshScanBox();
}
public Bitmap getScanLineBitmap() {
return mScanLineBitmap;
}
public void setScanLineBitmap(Bitmap scanLineBitmap) {
mScanLineBitmap = scanLineBitmap;
refreshScanBox();
}
public int getBorderSize() {
return mBorderSize;
}
public void setBorderSize(int borderSize) {
mBorderSize = borderSize;
refreshScanBox();
}
public int getBorderColor() {
return mBorderColor;
}
public void setBorderColor(int borderColor) {
mBorderColor = borderColor;
refreshScanBox();
}
public int getAnimTime() {
return mAnimTime;
}
public void setAnimTime(int animTime) {
mAnimTime = animTime;
refreshScanBox();
}
public float getVerticalBias() {
return mVerticalBias;
}
public void setVerticalBias(float verticalBias) {
mVerticalBias = verticalBias;
refreshScanBox();
}
public int getToolbarHeight() {
return mToolbarHeight;
}
public void setToolbarHeight(int toolbarHeight) {
mToolbarHeight = toolbarHeight;
refreshScanBox();
}
public String getQRCodeTipText() {
return mQRCodeTipText;
}
public void setQRCodeTipText(String qrCodeTipText) {
mQRCodeTipText = qrCodeTipText;
refreshScanBox();
}
public String getBarCodeTipText() {
return mBarCodeTipText;
}
public void setBarCodeTipText(String barCodeTipText) {
mBarCodeTipText = barCodeTipText;
refreshScanBox();
}
public String getTipText() {
return mTipText;
}
public void setTipText(String tipText) {
if (mIsBarcode) {
mBarCodeTipText = tipText;
} else {
mQRCodeTipText = tipText;
}
refreshScanBox();
}
public int getTipTextColor() {
return mTipTextColor;
}
public void setTipTextColor(int tipTextColor) {
mTipTextColor = tipTextColor;
mTipPaint.setColor(mTipTextColor);
refreshScanBox();
}
public int getTipTextSize() {
return mTipTextSize;
}
public void setTipTextSize(int tipTextSize) {
mTipTextSize = tipTextSize;
mTipPaint.setTextSize(mTipTextSize);
refreshScanBox();
}
public boolean isTipTextBelowRect() {
return mIsTipTextBelowRect;
}
public void setTipTextBelowRect(boolean tipTextBelowRect) {
mIsTipTextBelowRect = tipTextBelowRect;
refreshScanBox();
}
public int getTipTextMargin() {
return mTipTextMargin;
}
public void setTipTextMargin(int tipTextMargin) {
mTipTextMargin = tipTextMargin;
refreshScanBox();
}
public boolean isShowTipTextAsSingleLine() {
return mIsShowTipTextAsSingleLine;
}
public void setShowTipTextAsSingleLine(boolean showTipTextAsSingleLine) {
mIsShowTipTextAsSingleLine = showTipTextAsSingleLine;
refreshScanBox();
}
public boolean isShowTipBackground() {
return mIsShowTipBackground;
}
public void setShowTipBackground(boolean showTipBackground) {
mIsShowTipBackground = showTipBackground;
refreshScanBox();
}
public int getTipBackgroundColor() {
return mTipBackgroundColor;
}
public void setTipBackgroundColor(int tipBackgroundColor) {
mTipBackgroundColor = tipBackgroundColor;
refreshScanBox();
}
public boolean isScanLineReverse() {
return mIsScanLineReverse;
}
public void setScanLineReverse(boolean scanLineReverse) {
mIsScanLineReverse = scanLineReverse;
refreshScanBox();
}
public boolean isShowDefaultGridScanLineDrawable() {
return mIsShowDefaultGridScanLineDrawable;
}
public void setShowDefaultGridScanLineDrawable(boolean showDefaultGridScanLineDrawable) {
mIsShowDefaultGridScanLineDrawable = showDefaultGridScanLineDrawable;
refreshScanBox();
}
public float getHalfCornerSize() {
return mHalfCornerSize;
}
public void setHalfCornerSize(float halfCornerSize) {
mHalfCornerSize = halfCornerSize;
refreshScanBox();
}
public StaticLayout getTipTextSl() {
return mTipTextSl;
}
public void setTipTextSl(StaticLayout tipTextSl) {
mTipTextSl = tipTextSl;
refreshScanBox();
}
public int getTipBackgroundRadius() {
return mTipBackgroundRadius;
}
public void setTipBackgroundRadius(int tipBackgroundRadius) {
mTipBackgroundRadius = tipBackgroundRadius;
refreshScanBox();
}
public boolean isOnlyDecodeScanBoxArea() {
return mIsOnlyDecodeScanBoxArea;
}
public void setOnlyDecodeScanBoxArea(boolean onlyDecodeScanBoxArea) {
mIsOnlyDecodeScanBoxArea = onlyDecodeScanBoxArea;
calFramingRect();
}
public boolean isShowLocationPoint() {
return mIsShowLocationPoint;
}
public void setShowLocationPoint(boolean showLocationPoint) {
mIsShowLocationPoint = showLocationPoint;
}
public boolean isAutoZoom() {
return mIsAutoZoom;
}
public void setAutoZoom(boolean autoZoom) {
mIsAutoZoom = autoZoom;
}
}
================================================
FILE: qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ScanResult.java
================================================
package cn.bingoogolapple.qrcode.core;
import android.graphics.PointF;
/**
* 作者:王浩
* 创建时间:2018/6/15
* 描述:
*/
public class ScanResult {
String result;
PointF[] resultPoints;
public ScanResult(String result) {
this.result = result;
}
public ScanResult(String result, PointF[] resultPoints) {
this.result = result;
this.resultPoints = resultPoints;
}
}
================================================
FILE: qrcodecore/src/main/res/values/attrs.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="QRCodeView">
<!-- 扫描框距离toolbar底部的距离,默认值为90dp -->
<attr name="qrcv_topOffset" format="dimension|reference" />
<!-- 扫描框边角线的宽度,默认值为3dp -->
<attr name="qrcv_cornerSize" format="dimension|reference" />
<!-- 扫描框边角线的长度,默认值为20dp -->
<attr name="qrcv_cornerLength" format="dimension|reference" />
<!-- 扫描框边角线的颜色,默认值为@android:color/white -->
<attr name="qrcv_cornerColor" format="color|reference" />
<!-- 扫描框边角线显示位置(相对于边框),默认值为中间 -->
<attr name="qrcv_cornerDisplayType">
<enum name="center" value="1" />
<enum name="inside" value="2" />
</attr>
<!-- 扫描框的宽度,默认值为200dp -->
<attr name="qrcv_rectWidth" format="dimension|reference" />
<!-- 条码扫样式描框的高度,默认值为140dp -->
<attr name="qrcv_barcodeRectHeight" format="dimension|reference" />
<!-- 除去扫描框,其余部分阴影颜色,默认值为#33FFFFFF -->
<attr name="qrcv_maskColor" format="color|reference" />
<!-- 扫描线的宽度,默认值为1dp -->
<attr name="qrcv_scanLineSize" format="dimension|reference" />
<!-- 扫描线的颜色,默认值为@android:color/white -->
<attr name="qrcv_scanLineColor" format="color|reference" />
<!-- 扫描线距离上下或者左右边框的间距,默认值为0dp -->
<attr name="qrcv_scanLineMargin" format="dimension|reference" />
<!-- 是否显示默认的图片扫描线,默认值为false -->
<attr name="qrcv_isShowDefaultScanLineDrawable" format="boolean" />
<!-- 扫描线的图片资源,默认值为null -->
<attr name="qrcv_customScanLineDrawable" format="reference" />
<!-- 扫描边框的宽度,默认值为1dp -->
<attr name="qrcv_borderSize" format="dimension|reference" />
<!-- 扫描边框的颜色,默认值为@android:color/white -->
<attr name="qrcv_borderColor" format="color|reference" />
<!-- 扫描线从顶部移动到底部的动画时间,默认值为1000 -->
<attr name="qrcv_animTime" format="integer" />
<!-- 扫描框中心点在屏幕垂直方向的比例,当设置此值时,会忽略 qrcv_topOffset -->
<attr name="qrcv_verticalBias" format="float" />
<!-- Toolbar的高度,当有设置qrcv_isCenterVertical属性时,通过该属性来修正有Toolbar时导致扫描框垂直居中的偏差,默认值为0dp -->
<attr name="qrcv_toolbarHeight" format="dimension|reference" />
<!-- 扫描框的样式是否为扫条形码样式,默认值为false -->
<attr name="qrcv_isBarcode" format="boolean" />
<!-- 扫描二维码时的提示文案,默认值为null -->
<attr name="qrcv_qrCodeTipText" format="string|reference" />
<!-- 扫描条码时的提示文案,默认值为null -->
<attr name="qrcv_barCodeTipText" format="string|reference" />
<!-- 提示文案字体大小,默认值为14sp -->
<attr name="qrcv_tipTextSize" format="dimension|reference" />
<!-- 提示文案颜色,默认值为@android:color/white -->
<attr name="qrcv_tipTextColor" format="color|reference" />
<!-- 提示文案是否在扫描框的底部,默认值为false -->
<attr name="qrcv_isTipTextBelowRect" format="boolean" />
<!-- 提示文案与扫描框之间的间距,默认值为20dp -->
<attr name="qrcv_tipTextMargin" format="dimension|reference" />
<!-- 是否把提示文案作为单行显示,默认值为false -->
<attr name="qrcv_isShowTipTextAsSingleLine" format="boolean" />
<!-- 是否显示提示文案的背景,默认值为false -->
<attr name="qrcv_isShowTipBackground" format="boolean" />
<!-- 提示文案的背景色,默认值为#22000000 -->
<attr name="qrcv_tipBackgroundColor" format="color|reference" />
<!-- 扫描线是否来回移动,默认值为true -->
<attr name="qrcv_isScanLineReverse" format="boolean" />
<!-- 是否显示默认的网格图片扫描线,默认值为false -->
<attr name="qrcv_isShowDefaultGridScanLineDrawable" format="boolean" />
<!-- 扫描线的网格图片资源,默认值为null -->
<attr name="qrcv_customGridScanLineDrawable" format="reference" />
<!-- 是否只识别扫描框中的码,默认值为false -->
<attr name="qrcv_isOnlyDecodeScanBoxArea" format="boolean" />
<!-- 是否显示定位点,默认值为false -->
<attr name="qrcv_isShowLocationPoint" format="boolean" />
<!-- 码太小时是否自动缩放,默认值为false -->
<attr name="qrcv_isAutoZoom" format="boolean" />
</declare-styleable>
</resources>
================================================
FILE: qrcodecore/src/main/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="bgaqrcode_camera_preview" />
</resources>
================================================
FILE: settings.gradle
================================================
include ':qrcodecore', ':zxing', ':zbar', ':zxingdemo', ':zbardemo'
================================================
FILE: zbar/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
android {
compileSdkVersion ANDROID_BUILD_SDK_VERSION as int
defaultConfig {
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
consumerProguardFiles 'consumer-proguard-rules.pro'
}
def isBuildSo = false
if (isBuildSo) { // 构建生成 so 文件
sourceSets {
main {
jniLibs.srcDirs = []
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
} else { // 生成 so 文件后,打包时直接使用生成的 so
sourceSets {
main {
jni.srcDirs = []
}
}
delete(file('.externalNativeBuild'), file('src/main/libs'), file('src/main/obj'))
}
}
dependencies {
api project(':qrcodecore')
}
tasks.whenTaskAdded {
if (it.name == 'releaseAndroidJavadocs') {
it.enabled = false
}
}
================================================
FILE: zbar/consumer-proguard-rules.pro
================================================
-keep class net.sourceforge.zbar.ImageScanner { *; }
-keep class net.sourceforge.zbar.Image { *; }
-keep class net.sourceforge.zbar.SymbolSet { *; }
-keep class net.sourceforge.zbar.Symbol { *; }
================================================
FILE: zbar/src/main/AndroidManifest.xml
================================================
<manifest package="cn.bingoogolapple.qrcode.zbar"/>
================================================
FILE: zbar/src/main/java/cn/bingoogolapple/qrcode/zbar/BarcodeFormat.java
================================================
package cn.bingoogolapple.qrcode.zbar;
import net.sourceforge.zbar.Symbol;
import java.util.ArrayList;
import java.util.List;
/**
* 一维条码、二维码各种类型简介 https://blog.csdn.net/xdg_blog/article/details/52932707
* 在线生成各种码 https://barcode.tec-it.com/zh/
*/
public class BarcodeFormat {
private int mId;
private String mName;
public static final BarcodeFormat NONE = new BarcodeFormat(Symbol.NONE, "NONE");
public static final BarcodeFormat PARTIAL = new BarcodeFormat(Symbol.PARTIAL, "PARTIAL");
public static final BarcodeFormat EAN8 = new BarcodeFormat(Symbol.EAN8, "EAN8");
public static final BarcodeFormat UPCE = new BarcodeFormat(Symbol.UPCE, "UPCE");
public static final BarcodeFormat ISBN10 = new BarcodeFormat(Symbol.ISBN10, "ISBN10");
public static final BarcodeFormat UPCA = new BarcodeFormat(Symbol.UPCA, "UPCA");
public static final BarcodeFormat EAN13 = new BarcodeFormat(Symbol.EAN13, "EAN13");
public static final BarcodeFormat ISBN13 = new BarcodeFormat(Symbol.ISBN13, "ISBN13");
public static final BarcodeFormat I25 = new BarcodeFormat(Symbol.I25, "I25");
public static final BarcodeFormat DATABAR = new BarcodeFormat(Symbol.DATABAR, "DATABAR");
public static final BarcodeFormat DATABAR_EXP = new BarcodeFormat(Symbol.DATABAR_EXP, "DATABAR_EXP");
public static final BarcodeFormat CODABAR = new BarcodeFormat(Symbol.CODABAR, "CODABAR");
public static final BarcodeFormat CODE39 = new BarcodeFormat(Symbol.CODE39, "CODE39");
public static final BarcodeFormat PDF417 = new BarcodeFormat(Symbol.PDF417, "PDF417");
public static final BarcodeFormat QRCODE = new BarcodeFormat(Symbol.QRCODE, "QRCODE");
public static final BarcodeFormat CODE93 = new BarcodeFormat(Symbol.CODE93, "CODE93");
public static final BarcodeFormat CODE128 = new BarcodeFormat(Symbol.CODE128, "CODE128");
static final List<BarcodeFormat> ALL_FORMAT_LIST = new ArrayList<>();
static {
ALL_FORMAT_LIST.add(BarcodeFormat.PARTIAL);
ALL_FORMAT_LIST.add(BarcodeFormat.EAN8);
ALL_FORMAT_LIST.add(BarcodeFormat.UPCE);
// ALL_FORMAT_LIST.add(BarcodeFormat.ISBN10);
ALL_FORMAT_LIST.add(BarcodeFormat.UPCA);
ALL_FORMAT_LIST.add(BarcodeFormat.EAN13);
ALL_FORMAT_LIST.add(BarcodeFormat.ISBN13);
ALL_FORMAT_LIST.add(BarcodeFormat.I25);
// ALL_FORMAT_LIST.add(BarcodeFormat.DATABAR);
ALL_FORMAT_LIST.add(BarcodeFormat.DATABAR_EXP);
ALL_FORMAT_LIST.add(BarcodeFormat.CODABAR);
ALL_FORMAT_LIST.add(BarcodeFormat.CODE39);
ALL_FORMAT_LIST.add(BarcodeFormat.PDF417);
ALL_FORMAT_LIST.add(BarcodeFormat.QRCODE);
ALL_FORMAT_LIST.add(BarcodeFormat.CODE93);
ALL_FORMAT_LIST.add(BarcodeFormat.CODE128);
}
static final List<BarcodeFormat> ONE_DIMENSION_FORMAT_LIST = new ArrayList<>();
static {
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.PARTIAL);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.EAN8);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.UPCE);
// ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.ISBN10);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.UPCA);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.EAN13);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.ISBN13);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.I25);
// ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.DATABAR);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.DATABAR_EXP);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.CODABAR);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.CODE39);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.PDF417);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.CODE93);
ONE_DIMENSION_FORMAT_LIST.add(BarcodeFormat.CODE128);
}
static final List<BarcodeFormat> TWO_DIMENSION_FORMAT_LIST = new ArrayList<>();
static {
TWO_DIMENSION_FORMAT_LIST.add(BarcodeFormat.PDF417);
TWO_DIMENSION_FORMAT_LIST.add(BarcodeFormat.QRCODE);
}
static final List<BarcodeFormat> HIGH_FREQUENCY_FORMAT_LIST = new ArrayList<>();
static {
HIGH_FREQUENCY_FORMAT_LIST.add(BarcodeFormat.QRCODE);
HIGH_FREQUENCY_FORMAT_LIST.add(BarcodeFormat.ISBN13);
HIGH_FREQUENCY_FORMAT_LIST.add(BarcodeFormat.UPCA);
HIGH_FREQUENCY_FORMAT_LIST.add(BarcodeFormat.EAN13);
HIGH_FREQUENCY_FORMAT_LIST.add(BarcodeFormat.CODE128);
}
private BarcodeFormat(int id, String name) {
mId = id;
mName = name;
}
public int getId() {
return mId;
}
public String getName() {
return mName;
}
public static BarcodeFormat getFormatById(int id) {
for (BarcodeFormat format : ALL_FORMAT_LIST) {
if (format.getId() == id) {
return format;
}
}
return BarcodeFormat.NONE;
}
}
================================================
FILE: zbar/src/main/java/cn/bingoogolapple/qrcode/zbar/ZBarView.java
================================================
package cn.bingoogolapple.qrcode.zbar;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import cn.bingoogolapple.qrcode.core.BarcodeType;
import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.core.ScanResult;
public class ZBarView extends QRCodeView {
static {
System.loadLibrary("iconv");
}
private ImageScanner mScanner;
private List<BarcodeFormat> mFormatList;
public ZBarView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0);
}
public ZBarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setupReader();
}
@Override
protected void setupReader() {
mScanner = new ImageScanner();
mScanner.setConfig(0, Config.X_DENSITY, 3);
mScanner.setConfig(0, Config.Y_DENSITY, 3);
mScanner.setConfig(Symbol.NONE, Config.ENABLE, 0);
for (BarcodeFormat format : getFormats()) {
mScanner.setConfig(format.getId(), Config.ENABLE, 1);
}
}
public Collection<BarcodeFormat> getFormats() {
if (mBarcodeType == BarcodeType.ONE_DIMENSION) {
return BarcodeFormat.ONE_DIMENSION_FORMAT_LIST;
} else if (mBarcodeType == BarcodeType.TWO_DIMENSION) {
return BarcodeFormat.TWO_DIMENSION_FORMAT_LIST;
} else if (mBarcodeType == BarcodeType.ONLY_QR_CODE) {
return Collections.singletonList(BarcodeFormat.QRCODE);
} else if (mBarcodeType == BarcodeType.ONLY_CODE_128) {
return Collections.singletonList(BarcodeFormat.CODE128);
} else if (mBarcodeType == BarcodeType.ONLY_EAN_13) {
return Collections.singletonList(BarcodeFormat.EAN13);
} else if (mBarcodeType == BarcodeType.HIGH_FREQUENCY) {
return BarcodeFormat.HIGH_FREQUENCY_FORMAT_LIST;
} else if (mBarcodeType == BarcodeType.CUSTOM) {
return mFormatList;
} else {
return BarcodeFormat.ALL_FORMAT_LIST;
}
}
/**
* 设置识别的格式
*
* @param barcodeType 识别的格式
* @param formatList barcodeType 为 BarcodeType.CUSTOM 时,必须指定该值
*/
public void setType(BarcodeType barcodeType, List<BarcodeFormat> formatList) {
mBarcodeType = barcodeType;
mFormatList = formatList;
if (mBarcodeType == BarcodeType.CUSTOM && (mFormatList == null || mFormatList.isEmpty())) {
throw new RuntimeException("barcodeType 为 BarcodeType.CUSTOM 时 formatList 不能为空");
}
setupReader();
}
@Override
protected ScanResult processData(byte[] data, int width, int height, boolean isRetry) {
Image barcode = new Image(width, height, "Y800");
Rect scanBoxAreaRect = mScanBoxView.getScanBoxAreaRect(height);
if (scanBoxAreaRect != null && !isRetry && scanBoxAreaRect.left + scanBoxAreaRect.width() <= width
&& scanBoxAreaRect.top + scanBoxAreaRect.height() <= height) {
barcode.setCrop(scanBoxAreaRect.left, scanBoxAreaRect.top, scanBoxAreaRect.width(), scanBoxAreaRect.height());
}
barcode.setData(data);
String result = processData(barcode);
return new ScanResult(result);
}
private String processData(Image barcode) {
if (mScanner.scanImage(barcode) == 0) {
return null;
}
for (Symbol symbol : mScanner.getResults()) {
// 未能识别的格式继续遍历
if (symbol.getType() == Symbol.NONE) {
continue;
}
String symData;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
symData = new String(symbol.getDataBytes(), StandardCharsets.UTF_8);
} else {
symData = symbol.getData();
}
// 空数据继续遍历
if (TextUtils.isEmpty(symData)) {
continue;
}
// 处理自动缩放和定位点
boolean isNeedAutoZoom = isNeedAutoZoom(symbol);
if (isShowLocationPoint() || isNeedAutoZoom) {
if (transformToViewCoordinates(symbol.getLocationPoints(), null, isNeedAutoZoom, symData)) {
return null;
} else {
return symData;
}
} else {
return symData;
}
}
return null;
}
private boolean isNeedAutoZoom(Symbol symbol) {
return isAutoZoom() && symbol.getType() == Symbol.QRCODE;
}
@Override
protected ScanResult processBitmapData(Bitmap bitmap) {
try {
int picWidth = bitmap.getWidth();
int picHeight = bitmap.getHeight();
Image barcode = new Image(picWidth, picHeight, "RGB4");
int[] pix = new int[picWidth * picHeight];
bitmap.getPixels(pix, 0, picWidth, 0, 0, picWidth, picHeight);
barcode.setData(pix);
String result = processData(barcode.convert("Y800"));
return new ScanResult(result);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/Config.java
================================================
/*------------------------------------------------------------------------
* Config
*
* Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Decoder configuration options.
*/
public class Config
{
/** Enable symbology/feature. */
public static final int ENABLE = 0;
/** Enable check digit when optional. */
public static final int ADD_CHECK = 1;
/** Return check digit when present. */
public static final int EMIT_CHECK = 2;
/** Enable full ASCII character set. */
public static final int ASCII = 3;
/** Minimum data length for valid decode. */
public static final int MIN_LEN = 0x20;
/** Maximum data length for valid decode. */
public static final int MAX_LEN = 0x21;
/** Required video consistency frames. */
public static final int UNCERTAINTY = 0x40;
/** Enable scanner to collect position data. */
public static final int POSITION = 0x80;
/** Image scanner vertical scan density. */
public static final int X_DENSITY = 0x100;
/** Image scanner horizontal scan density. */
public static final int Y_DENSITY = 0x101;
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/Image.java
================================================
/*------------------------------------------------------------------------
* Image
*
* Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** stores image data samples along with associated format and size
* metadata.
*/
public class Image
{
/** C pointer to a zbar_symbol_t. */
private long peer;
private Object data;
static
{
System.loadLibrary("zbarjni");
init();
}
private static native void init();
public Image ()
{
peer = create();
}
public Image (int width, int height)
{
this();
setSize(width, height);
}
public Image (int width, int height, String format)
{
this();
setSize(width, height);
setFormat(format);
}
public Image (String format)
{
this();
setFormat(format);
}
Image (long peer)
{
this.peer = peer;
}
/** Create an associated peer instance. */
private native long create();
protected void finalize ()
{
destroy();
}
/** Clean up native data associated with an instance. */
public synchronized void destroy ()
{
if(peer != 0) {
destroy(peer);
peer = 0;
}
}
/** Destroy the associated peer instance. */
private native void destroy(long peer);
/** Image format conversion.
* @returns a @em new image with the sample data from the original
* image converted to the requested format fourcc. the original
* image is unaffected.
*/
public Image convert (String format)
{
long newpeer = convert(peer, format);
if(newpeer == 0)
return(null);
return(new Image(newpeer));
}
private native long convert(long peer, String format);
/** Retrieve the image format fourcc. */
public native String getFormat();
/** Specify the fourcc image format code for image sample data. */
public native void setFormat(String format);
/** Retrieve a "sequence" (page/frame) number associated with this
* image.
*/
public native int getSequence();
/** Associate a "sequence" (page/frame) number with this image. */
public native void setSequence(int seq);
/** Retrieve the width of the image. */
public native int getWidth();
/** Retrieve the height of the image. */
public native int getHeight();
/** Retrieve the size of the image. */
public native int[] getSize();
/** Specify the pixel size of the image. */
public native void setSize(int width, int height);
/** Specify the pixel size of the image. */
public native void setSize(int[] size);
/** Retrieve the crop region of the image. */
public native int[] getCrop();
/** Specify the crop region of the image. */
public native void setCrop(int x, int y, int width, int height);
/** Specify the crop region of the image. */
public native void setCrop(int[] crop);
/** Retrieve the image sample data. */
public native byte[] getData();
/** Specify image sample data. */
public native void setData(byte[] data);
/** Specify image sample data. */
public native void setData(int[] data);
/** Retrieve the decoded results associated with this image. */
public SymbolSet getSymbols ()
{
return(new SymbolSet(getSymbols(peer)));
}
private native long getSymbols(long peer);
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/ImageScanner.java
================================================
/*------------------------------------------------------------------------
* ImageScanner
*
* Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Read barcodes from 2-D images.
*/
public class ImageScanner
{
/** C pointer to a zbar_image_scanner_t. */
private long peer;
static
{
System.loadLibrary("zbarjni");
init();
}
private static native void init();
public ImageScanner ()
{
peer = create();
}
/** Create an associated peer instance. */
private native long create();
protected void finalize ()
{
destroy();
}
/** Clean up native data associated with an instance. */
public synchronized void destroy ()
{
if(peer != 0) {
destroy(peer);
peer = 0;
}
}
/** Destroy the associated peer instance. */
private native void destroy(long peer);
/** Set config for indicated symbology (0 for all) to specified value.
*/
public native void setConfig(int symbology, int config, int value)
throws IllegalArgumentException;
/** Parse configuration string and apply to image scanner. */
public native void parseConfig(String config);
/** Enable or disable the inter-image result cache (default disabled).
* Mostly useful for scanning video frames, the cache filters duplicate
* results from consecutive images, while adding some consistency
* checking and hysteresis to the results. Invoking this method also
* clears the cache.
*/
public native void enableCache(boolean enable);
/** Retrieve decode results for last scanned image.
* @returns the SymbolSet result container
*/
public SymbolSet getResults ()
{
return(new SymbolSet(getResults(peer)));
}
private native long getResults(long peer);
/** Scan for symbols in provided Image.
* The image format must currently be "Y800" or "GRAY".
* @returns the number of symbols successfully decoded from the image.
*/
public native int scanImage(Image image);
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/Modifier.java
================================================
/*------------------------------------------------------------------------
* Modifier
*
* Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Decoder symbology modifiers.
*/
public class Modifier
{
/** barcode tagged as GS1 (EAN.UCC) reserved
* (eg, FNC1 before first data character).
* data may be parsed as a sequence of GS1 AIs
*/
public static final int GS1 = 0;
/** barcode tagged as AIM reserved
* (eg, FNC1 after first character or digit pair)
*/
public static final int AIM = 1;
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/Orientation.java
================================================
/*------------------------------------------------------------------------
* Orientation
*
* Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Decoded symbol coarse orientation.
*/
public class Orientation
{
/** Unable to determine orientation. */
public static final int UNKNOWN = -1;
/** Upright, read left to right. */
public static final int UP = 0;
/** sideways, read top to bottom */
public static final int RIGHT = 1;
/** upside-down, read right to left */
public static final int DOWN = 2;
/** sideways, read bottom to top */
public static final int LEFT = 3;
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/Symbol.java
================================================
/*------------------------------------------------------------------------
* Symbol
*
* Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
import android.graphics.PointF;
/**
* Immutable container for decoded result symbols associated with an image
* or a composite symbol.
*/
public class Symbol {
/** No symbol decoded. */
public static final int NONE = 0;
/** Symbol detected but not decoded. */
public static final int PARTIAL = 1;
/** EAN-8. */
public static final int EAN8 = 8;
/** UPC-E. */
public static final int UPCE = 9;
/** ISBN-10 (from EAN-13). */
public static final int ISBN10 = 10;
/** UPC-A. */
public static final int UPCA = 12;
/** EAN-13. */
public static final int EAN13 = 13;
/** ISBN-13 (from EAN-13). */
public static final int ISBN13 = 14;
/** Interleaved 2 of 5. */
public static final int I25 = 25;
/** DataBar (RSS-14). */
public static final int DATABAR = 34;
/** DataBar Expanded. */
public static final int DATABAR_EXP = 35;
/** Codabar. */
public static final int CODABAR = 38;
/** Code 39. */
public static final int CODE39 = 39;
/** PDF417. */
public static final int PDF417 = 57;
/** QR Code. */
public static final int QRCODE = 64;
/** Code 93. */
public static final int CODE93 = 93;
/** Code 128. */
public static final int CODE128 = 128;
/** C pointer to a zbar_symbol_t. */
private long peer;
/** Cached attributes. */
private int type;
static {
System.loadLibrary("zbarjni");
init();
}
private static native void init();
/** Symbols are only created by other package methods. */
Symbol(long peer) {
this.peer = peer;
}
protected void finalize() {
destroy();
}
/** Clean up native data associated with an instance. */
public synchronized void destroy() {
if (peer != 0) {
destroy(peer);
peer = 0;
}
}
/** Release the associated peer instance. */
private native void destroy(long peer);
/** Retrieve type of decoded symbol. */
public int getType() {
if (type == 0) {
type = getType(peer);
}
return (type);
}
private native int getType(long peer);
/** Retrieve symbology boolean configs settings used during decode. */
public native int getConfigMask();
/** Retrieve symbology characteristics detected during decode. */
public native int getModifierMask();
/** Retrieve data decoded from symbol as a String. */
public native String getData();
/** Retrieve raw data bytes decoded from symbol. */
public native byte[] getDataBytes();
/**
* Retrieve a symbol confidence metric. Quality is an unscaled,
* relative quantity: larger values are better than smaller
* values, where "large" and "small" are application dependent.
*/
public native int getQuality();
/**
* Retrieve current cache count. When the cache is enabled for
* the image_scanner this provides inter-frame reliability and
* redundancy information for video streams.
*
* @returns < 0 if symbol is still uncertain
* @returns 0 if symbol is newly verified
* @returns > 0 for duplicate symbols
*/
public native int getCount();
public int getLocationSize() {
return getLocationSize(peer);
}
/**
* Retrieve an approximate, axis-aligned bounding box for the
* symbol.
*/
public int[] getBounds() {
int n = getLocationSize(peer);
if (n <= 0) {
return (null);
}
int[] bounds = new int[4];
int xmin = Integer.MAX_VALUE;
int xmax = Integer.MIN_VALUE;
int ymin = Integer.MAX_VALUE;
int ymax = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
int x = getLocationX(peer, i);
if (xmin > x) xmin = x;
if (xmax < x) xmax = x;
int y = getLocationY(peer, i);
if (ymin > y) ymin = y;
if (ymax < y) ymax = y;
}
bounds[0] = xmin;
bounds[1] = ymin;
bounds[2] = xmax - xmin;
bounds[3] = ymax - ymin;
return (bounds);
}
private native int getLocationSize(long peer);
private native int getLocationX(long peer, int idx);
private native int getLocationY(long peer, int idx);
public int[] getLocationPoint(int idx) {
int[] p = new int[2];
p[0] = getLocationX(peer, idx);
p[1] = getLocationY(peer, idx);
return (p);
}
public PointF[] getLocationPoints() {
int locationSize = getLocationSize(peer);
final PointF[] pointArr = new PointF[locationSize];
for (int pointIndex = 0; pointIndex < locationSize; pointIndex++) {
pointArr[pointIndex] = new PointF(getLocationX(peer, pointIndex), getLocationY(peer, pointIndex));
}
return pointArr;
}
/**
* Retrieve general axis-aligned, orientation of decoded
* symbol.
*/
public native int getOrientation();
/** Retrieve components of a composite result. */
public SymbolSet getComponents() {
return (new SymbolSet(getComponents(peer)));
}
private native long getComponents(long peer);
native long next();
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/SymbolIterator.java
================================================
/*------------------------------------------------------------------------
* SymbolIterator
*
* Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Iterator over a SymbolSet.
*/
public class SymbolIterator
implements java.util.Iterator<Symbol>
{
/** Next symbol to be returned by the iterator. */
private Symbol current;
/** SymbolIterators are only created by internal interface methods. */
SymbolIterator (Symbol first)
{
current = first;
}
/** Returns true if the iteration has more elements. */
public boolean hasNext ()
{
return(current != null);
}
/** Retrieves the next element in the iteration. */
public Symbol next ()
{
if(current == null)
throw(new java.util.NoSuchElementException
("access past end of SymbolIterator"));
Symbol result = current;
long sym = current.next();
if(sym != 0)
current = new Symbol(sym);
else
current = null;
return(result);
}
/** Raises UnsupportedOperationException. */
public void remove ()
{
throw(new UnsupportedOperationException
("SymbolIterator is immutable"));
}
}
================================================
FILE: zbar/src/main/java/net/sourceforge/zbar/SymbolSet.java
================================================
/*------------------------------------------------------------------------
* SymbolSet
*
* Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
*
* This file is part of the ZBar Bar Code Reader.
*
* The ZBar Bar Code Reader is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* The ZBar Bar Code Reader is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with the ZBar Bar Code Reader; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* http://sourceforge.net/projects/zbar
*------------------------------------------------------------------------*/
package net.sourceforge.zbar;
/** Immutable container for decoded result symbols associated with an image
* or a composite symbol.
*/
public class SymbolSet
extends java.util.AbstractCollection<Symbol>
{
/** C pointer to a zbar_symbol_set_t. */
private long peer;
static
{
System.loadLibrary("zbarjni");
init();
}
private static native void init();
/** SymbolSets are only created by other package methods. */
SymbolSet (long peer)
{
this.peer = peer;
}
protected void finalize ()
{
destroy();
}
/** Clean up native data associated with an instance. */
public synchronized void destroy ()
{
if(peer != 0) {
destroy(peer);
peer = 0;
}
}
/** Release the associated peer instance. */
private native void destroy(long peer);
/** Retrieve an iterator over the Symbol elements in this collection. */
public java.util.Iterator<Symbol> iterator ()
{
long sym = firstSymbol(peer);
if(sym == 0)
return(new SymbolIterator(null));
return(new SymbolIterator(new Symbol(sym)));
}
/** Retrieve the number of elements in the collection. */
public native int size();
/** Retrieve C pointer to first symbol in the set. */
private native long firstSymbol(long peer);
}
================================================
FILE: zbar/src/main/jni/Android.mk
================================================
#
# Android NDK makefile
#
# build - <ndk path>/ndk-build ICONV_SRC=<iconv library src>
# clean - <ndk path>/ndk-build clean
#
MY_LOCAL_PATH := $(call my-dir)
# libiconv
include $(CLEAR_VARS)
ICONV_SRC := $(MY_LOCAL_PATH)/libiconv-1.15
LOCAL_PATH := $(ICONV_SRC)
LOCAL_MODULE := libiconv
LOCAL_CFLAGS := \
-Wno-multichar \
-D_ANDROID \
-DLIBDIR="c" \
-DBUILDING_LIBICONV \
-DBUILDING_LIBCHARSET \
-DIN_LIBRARY
LOCAL_SRC_FILES := \
lib/iconv.c \
libcharset/lib/localcharset.c \
lib/relocatable.c
LOCAL_C_INCLUDES := \
$(ICONV_SRC)/include \
$(ICONV_SRC)/libcharset \
$(ICONV_SRC)/libcharset/include
include $(BUILD_SHARED_LIBRARY)
LOCAL_LDLIBS := -llog -lcharset
# libzbarjni
include $(CLEAR_VARS)
LOCAL_PATH := $(MY_LOCAL_PATH)
LOCAL_MODULE := zbarjni
LOCAL_SRC_FILES := zbarjni.c \
zbar/img_scanner.c \
zbar/decoder.c \
zbar/image.c \
zbar/symbol.c \
zbar/convert.c \
zbar/config.c \
zbar/scanner.c \
zbar/error.c \
zbar/refcnt.c \
zbar/video.c \
zbar/video/null.c \
zbar/decoder/code128.c \
zbar/decoder/code39.c \
zbar/decoder/code93.c \
zbar/decoder/codabar.c \
zbar/decoder/databar.c \
zbar/decoder/ean.c \
zbar/decoder/i25.c \
zbar/decoder/qr_finder.c \
zbar/qrcode/bch15_5.c \
zbar/qrcode/binarize.c \
zbar/qrcode/isaac.c \
zbar/qrcode/qrdec.c \
zbar/qrcode/qrdectxt.c \
zbar/qrcode/rs.c \
zbar/qrcode/util.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
$(LOCAL_PATH)/zbar \
$(ICONV_SRC)/include
LOCAL_SHARED_LIBRARIES := libiconv
include $(BUILD_SHARED_LIBRARY)
================================================
FILE: zbar/src/main/jni/Application.mk
================================================
APP_ABI := all
================================================
FILE: zbar/src/main/jni/config.h
================================================
/* manually customized for iPhone platform */
#define HAVE_LANGINFO_CODESET 0
/* whether to build support for Code 128 symbology */
#define ENABLE_CODE128 1
/* whether to build support for Code 93 symbology */
#define ENABLE_CODE93 1
/* whether to build support for Code 39 symbology */
#define ENABLE_CODE39 1
/* whether to build support for Codabar symbology */
#define ENABLE_CODABAR 1
/* whether to build support for DataBar symbology */
#define ENABLE_DATABAR 1
/* whether to build support for EAN symbologies */
#define ENABLE_EAN 1
/* whether to build support for Interleaved 2 of 5 symbology */
#define ENABLE_I25 1
/* whether to build support for PDF417 symbology */
#undef ENABLE_PDF417
/* whether to build support for QR Code */
#define ENABLE_QRCODE 1
/* Define to 1 if you have the `atexit' function. */
#undef HAVE_ATEXIT
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if you have the <features.h> header file. */
#undef HAVE_FEATURES_H
/* Define to 1 if you have the `getpagesize' function. */
#undef HAVE_GETPAGESIZE
/* Define if you have the iconv() function and it works. */
#undef HAVE_ICONV
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <jpeglib.h> header file. */
#undef HAVE_JPEGLIB_H
/* Define to 1 if you have the `jpeg' library (-ljpeg). */
#undef HAVE_LIBJPEG
/* Define to 1 if you have the `pthread' library (-lpthread). */
#undef HAVE_LIBPTHREAD
/* Define to 1 if you have the <linux/videodev2.h> header file. */
#undef HAVE_LINUX_VIDEODEV2_H
/* Define to 1 if you have the <linux/videodev.h> header file. */
#undef HAVE_LINUX_VIDEODEV_H
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1
/* Define to 1 if you have a working `mmap' system call. */
#undef HAVE_MMAP
/* Define to 1 if you have the <poll.h> header file. */
#undef HAVE_POLL_H
/* Define to 1 if you have the <pthread.h> header file. */
#undef HAVE_PTHREAD_H
/* Define to 1 if you have the `setenv' function. */
#undef HAVE_SETENV
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/ioctl.h> header file. */
#undef HAVE_SYS_IOCTL_H
/* Define to 1 if you have the <sys/ipc.h> header file. */
#undef HAVE_SYS_IPC_H
/* Define to 1 if you have the <sys/mman.h> header file. */
#undef HAVE_SYS_MMAN_H
/* Define to 1 if you have the <sys/shm.h> header file. */
#undef HAVE_SYS_SHM_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/times.h> header file. */
#define HAVE_SYS_TIMES_H 1
/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if the system has the type `uintptr_t'. */
#define HAVE_UINTPTR_T 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the <vfw.h> header file. */
#undef HAVE_VFW_H
/* Define to 1 if you have the <X11/extensions/XShm.h> header file. */
#undef HAVE_X11_EXTENSIONS_XSHM_H
/* Define to 1 if you have the <X11/extensions/Xvlib.h> header file. */
#undef HAVE_X11_EXTENSIONS_XVLIB_H
/* Define as const if the declaration of iconv() needs const. */
#undef ICONV_CONST
/* Library major version */
#define LIB_VERSION_MAJOR 0
/* Library minor version */
#define LIB_VERSION_MINOR 2
/* Library revision */
#define LIB_VERSION_REVISION 0
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Define to 1 if assertions should be disabled. */
//#undef NDEBUG
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
#undef NO_MINUS_C_MINUS_O
/* Name of package */
#define PACKAGE "zbar"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "spadix@users.sourceforge.net"
/* Define to the full name of this package. */
#define PACKAGE_NAME "zbar"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "zbar 0.10"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "zbar"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.10"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "0.10"
/* Define to 1 if the X Window System is missing or not being used. */
#define X_DISPLAY_MISSING 1
/* Program major version (before the '.') as a number */
#define ZBAR_VERSION_MAJOR 0
/* Program minor version (after '.') as a number */
#define ZBAR_VERSION_MINOR 10
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
#define below would cause a syntax error. */
#undef _UINT32_T
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
#define below would cause a syntax error. */
#undef _UINT8_T
/* Minimum Windows API version */
#undef _WIN32_WINNT
/* used only for pthread debug attributes */
#undef __USE_UNIX98
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
/* Define to the type of a signed integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef int32_t
/* Define to the type of an unsigned integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef uint32_t
/* Define to the type of an unsigned integer type of width exactly 8 bits if
such a type exists and the standard includes do not define it. */
#undef uint8_t
/* Define to the type of an unsigned integer type wide enough to hold a
pointer, if such a type exists, and if the system does not define it. */
#undef uintptr_t
#ifndef X_DISPLAY_MISSING
# define HAVE_X
#endif
================================================
FILE: zbar/src/main/jni/include/Makefile.am.inc
================================================
zincludedir = $(includedir)/zbar
include_HEADERS = include/zbar.h
zinclude_HEADERS = include/zbar/Scanner.h include/zbar/Decoder.h \
include/zbar/Exception.h include/zbar/Symbol.h include/zbar/Image.h \
include/zbar/ImageScanner.h include/zbar/Video.h include/zbar/Window.h \
include/zbar/Processor.h
if HAVE_GTK
zinclude_HEADERS += include/zbar/zbargtk.h
endif
if HAVE_QT
zinclude_HEADERS += include/zbar/QZBar.h include/zbar/QZBarImage.h
endif
================================================
FILE: zbar/src/main/jni/include/zbar/Decoder.h
================================================
//------------------------------------------------------------------------
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _ZBAR_DECODER_H_
#define _ZBAR_DECODER_H_
/// @file
/// Decoder C++ wrapper
#ifndef _ZBAR_H_
# error "include zbar.h in your application, **not** zbar/Decoder.h"
#endif
#include <string>
namespace zbar {
/// low-level bar width stream decoder interface.
/// identifies symbols and extracts encoded data
class Decoder {
public:
/// Decoder result handler.
/// applications should subtype this and pass an instance to
/// set_handler() to implement result processing
class Handler {
public:
virtual ~Handler() { }
/// invoked by the Decoder as decode results become available.
virtual void decode_callback(Decoder &decoder) = 0;
};
/// constructor.
Decoder ()
: _handler(NULL)
{
_decoder = zbar_decoder_create();
}
~Decoder ()
{
zbar_decoder_destroy(_decoder);
}
/// clear all decoder state.
/// see zbar_decoder_reset()
void reset ()
{
zbar_decoder_reset(_decoder);
}
/// mark start of a new scan pass.
/// see zbar_decoder_new_scan()
void new_scan ()
{
zbar_decoder_new_scan(_decoder);
}
/// process next bar/space width from input stream.
/// see zbar_decode_width()
zbar_symbol_type_t decode_width (unsigned width)
{
return(zbar_decode_width(_decoder, width));
}
/// process next bar/space width from input stream.
/// see zbar_decode_width()
Decoder& operator<< (unsigned width)
{
zbar_decode_width(_decoder, width);
return(*this);
}
/// retrieve color of @em next element passed to Decoder.
/// see zbar_decoder_get_color()
zbar_color_t get_color () const
{
return(zbar_decoder_get_color(_decoder));
}
/// retrieve last decoded symbol type.
/// see zbar_decoder_get_type()
zbar_symbol_type_t get_type () const
{
return(zbar_decoder_get_type(_decoder));
}
/// retrieve string name of last decoded symbol type.
/// see zbar_get_symbol_name()
const char *get_symbol_name () const
{
return(zbar_get_symbol_name(zbar_decoder_get_type(_decoder)));
}
/// retrieve string name for last decode addon.
/// see zbar_get_addon_name()
/// @deprecated in 0.11
const char *get_addon_name () const
{
return(zbar_get_addon_name(zbar_decoder_get_type(_decoder)));
}
/// retrieve last decoded data in ASCII format as a char array.
/// see zbar_decoder_get_data()
const char *get_data_chars() const
{
return(zbar_decoder_get_data(_decoder));
}
/// retrieve last decoded data as a std::string.
/// see zbar_decoder_get_data()
const std::string get_data_string() const
{
return(std::string(zbar_decoder_get_data(_decoder),
zbar_decoder_get_data_length(_decoder)));
}
/// retrieve last decoded data as a std::string.
/// see zbar_decoder_get_data()
const std::string get_data() const
{
return(get_data_string());
}
/// retrieve length of decoded binary data.
/// see zbar_decoder_get_data_length()
int get_data_length() const
{
return(zbar_decoder_get_data_length(_decoder));
}
/// retrieve last decode direction.
/// see zbar_decoder_get_direction()
/// @since 0.11
int get_direction() const
{
return(zbar_decoder_get_direction(_decoder));
}
/// setup callback to handle result data.
void set_handler (Handler &handler)
{
_handler = &handler;
zbar_decoder_set_handler(_decoder, _cb);
zbar_decoder_set_userdata(_decoder, this);
}
/// set config for indicated symbology (0 for all) to specified value.
/// @see zbar_decoder_set_config()
/// @since 0.4
int set_config (zbar_symbol_type_t symbology,
zbar_config_t config,
int value)
{
return(zbar_decoder_set_config(_decoder, symbology, config, value));
}
/// set config parsed from configuration string.
/// @see zbar_decoder_parse_config()
/// @since 0.4
int set_config (std::string cfgstr)
{
return(zbar_decoder_parse_config(_decoder, cfgstr.c_str()));
}
private:
friend class Scanner;
zbar_decoder_t *_decoder;
Handler *_handler;
static void _cb (zbar_decoder_t *cdcode)
{
Decoder *dcode = (Decoder*)zbar_decoder_get_userdata(cdcode);
if(dcode && dcode->_handler)
dcode->_handler->decode_callback(*dcode);
}
};
}
#endif
================================================
FILE: zbar/src/main/jni/include/zbar/Exception.h
================================================
//------------------------------------------------------------------------
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _ZBAR_EXCEPTION_H_
#define _ZBAR_EXCEPTION_H_
/// @file
/// C++ Exception definitions
#ifndef _ZBAR_H_
# error "include zbar.h in your application, **not** zbar/Exception.h"
#endif
#include <exception>
#include <new>
namespace zbar {
/// base class for exceptions defined by this API.
class Exception : public std::exception {
public:
/// create exception from C library error
Exception (const void *obj = NULL)
: std::exception(),
_obj(obj)
{ }
~Exception () throw() { }
/// retrieve error message
virtual const char* what () const throw()
{
if(!_obj)
return("zbar library unspecified generic error");
return(_zbar_error_string(_obj, 0));
}
private:
const void *_obj;
};
/// internal library error.
class InternalError : public Exception {
public:
/// create exception from C library error
InternalError (const void *obj)
: Exception(obj)
{ }
};
/// unsupported request.
class UnsupportedError : public Exception {
public:
/// create exception from C library error
UnsupportedError (const void *obj)
: Exception(obj)
{ }
};
/// invalid request.
class InvalidError : public Exception {
public:
/// create exception from C library error
InvalidError (const void *obj)
: Exception(obj)
{ }
};
/// failed system call.
class SystemError : public Exception {
public:
/// create exception from C library error
SystemError (const void *obj)
: Exception(obj)
{ }
};
/// locking error.
class LockingError : public Exception {
public:
/// create exception from C library error
LockingError (const void *obj)
: Exception(obj)
{ }
};
/// all resources busy.
class BusyError : public Exception {
public:
/// create exception from C library error
BusyError (const void *obj)
: Exception(obj)
{ }
};
/// X11 display error.
class XDisplayError : public Exception {
public:
/// create exception from C library error
XDisplayError (const void *obj)
: Exception(obj)
{ }
};
/// X11 protocol error.
class XProtoError : public Exception {
public:
/// create exception from C library error
XProtoError (const void *obj)
: Exception(obj)
{ }
};
/// output window is closed.
class ClosedError : public Exception {
public:
/// create exception from C library error
ClosedError (const void *obj)
: Exception(obj)
{ }
};
/// image format error
class FormatError : public Exception {
// FIXME needs c equivalent
virtual const char* what () const throw()
{
// FIXME what format?
return("unsupported format");
}
};
/// @internal
/// extract error information and create exception.
static inline std::exception throw_exception (const void *obj)
{
switch(_zbar_get_error_code(obj)) {
case ZBAR_ERR_NOMEM:
throw std::bad_alloc();
case ZBAR_ERR_INTERNAL:
throw InternalError(obj);
case ZBAR_ERR_UNSUPPORTED:
throw UnsupportedError(obj);
case ZBAR_ERR_INVALID:
throw InvalidError(obj);
case ZBAR_ERR_SYSTEM:
throw SystemError(obj);
case ZBAR_ERR_LOCKING:
throw LockingError(obj);
case ZBAR_ERR_BUSY:
throw BusyError(obj);
case ZBAR_ERR_XDISPLAY:
throw XDisplayError(obj);
case ZBAR_ERR_XPROTO:
throw XProtoError(obj);
case ZBAR_ERR_CLOSED:
throw ClosedError(obj);
default:
throw Exception(obj);
}
}
}
#endif
================================================
FILE: zbar/src/main/jni/include/zbar/Image.h
================================================
//------------------------------------------------------------------------
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _ZBAR_IMAGE_H_
#define _ZBAR_IMAGE_H_
/// @file
/// Image C++ wrapper
#ifndef _ZBAR_H_
# error "include zbar.h in your application, **not** zbar/Image.h"
#endif
#include <assert.h>
#include <iterator>
#include "Symbol.h"
#include "Exception.h"
namespace zbar {
class Video;
/// stores image data samples along with associated format and size
/// metadata
class Image {
public:
/// general Image result handler.
/// applications should subtype this and pass an instance to
/// eg. ImageScanner::set_handler() to implement result processing
class Handler {
public:
virtual ~Handler() { }
/// invoked by library when Image should be processed
virtual void image_callback(Image &image) = 0;
/// cast this handler to the C handler
operator zbar_image_data_handler_t* () const
{
return(_cb);
}
private:
static void _cb (zbar_image_t *zimg,
const void *userdata)
{
if(userdata) {
Image *image = (Image*)zbar_image_get_userdata(zimg);
if(image)
((Handler*)userdata)->image_callback(*image);
else {
Image tmp(zimg, 1);
((Handler*)userdata)->image_callback(tmp);
}
}
}
};
class SymbolIterator : public zbar::SymbolIterator {
public:
/// default constructor.
SymbolIterator ()
: zbar::SymbolIterator()
{ }
/// constructor.
SymbolIterator (const SymbolSet &syms)
: zbar::SymbolIterator(syms)
{ }
/// copy constructor.
SymbolIterator (const SymbolIterator& iter)
: zbar::SymbolIterator(iter)
{ }
};
/// constructor.
/// create a new Image with the specified parameters
Image (unsigned width = 0,
unsigned height = 0,
const std::string& format = "",
const void *data = NULL,
unsigned long length = 0)
: _img(zbar_image_create())
{
zbar_image_set_userdata(_img, this);
if(width && height)
set_size(width, height);
if(format.length())
set_format(format);
if(data && length)
set_data(data, length);
}
~Image ()
{
if(zbar_image_get_userdata(_img) == this)
zbar_image_set_userdata(_img, NULL);
zbar_image_ref(_img, -1);
}
/// cast to C image object
operator const zbar_image_t* () const
{
return(_img);
}
/// cast to C image object
operator zbar_image_t* ()
{
return(_img);
}
/// retrieve the image format.
/// see zbar_image_get_format()
unsigned long get_format () const
{
return(zbar_image_get_format(_img));
}
/// specify the fourcc image format code for image sample data.
/// see zbar_image_set_format()
void set_format (unsigned long format)
{
zbar_image_set_format(_img, format);
}
/// specify the fourcc image format code for image sample data.
/// see zbar_image_set_format()
void set_format (const std::string& format)
{
unsigned long fourcc = zbar_fourcc_parse(format.c_str());
zbar_image_set_format(_img, fourcc);
}
/// retrieve a "sequence" (page/frame) number associated with this
/// image.
/// see zbar_image_get_sequence()
/// @since 0.6
unsigned get_sequence () const
{
return(zbar_image_get_sequence(_img));
}
/// associate a "sequence" (page/frame) number with this image.
/// see zbar_image_set_sequence()
/// @since 0.6
void set_sequence (unsigned sequence_num)
{
zbar_image_set_sequence(_img, sequence_num);
}
/// retrieve the width of the image.
/// see zbar_image_get_width()
unsigned get_width () const
{
return(zbar_image_get_width(_img));
}
/// retrieve the height of the image.
/// see zbar_image_get_height()
unsigned get_height () const
{
return(zbar_image_get_height(_img));
}
/// retrieve both dimensions of the image.
/// see zbar_image_get_size()
/// @since 0.11
void get_size (unsigned &width,
unsigned &height) const
{
zbar_image_get_size(_img, &width, &height);
}
/// specify the pixel size of the image.
/// see zbar_image_set_size()
void set_size (unsigned width,
unsigned height)
{
zbar_image_set_size(_img, width, height);
}
/// retrieve the scan crop rectangle.
/// see zbar_image_get_crop()
void get_crop (unsigned &x,
unsigned &y,
unsigned &width,
unsigned &height) const
{
zbar_image_get_crop(_img, &x, &y, &width, &height);
}
/// set the scan crop rectangle.
/// see zbar_image_set_crop()
void set_crop (unsigned x,
unsigned y,
unsigned width,
unsigned height)
{
zbar_image_set_crop(_img, x, y, width, height);
}
/// return the image sample data.
/// see zbar_image_get_data()
const void *get_data () const
{
return(zbar_image_get_data(_img));
}
/// return the size of the image sample data.
/// see zbar_image_get_data_length()
/// @since 0.6
unsigned long get_data_length () const
{
return(zbar_image_get_data_length(_img));
}
/// specify image sample data.
/// see zbar_image_set_data()
void set_data (const void *data,
unsigned long length)
{
zbar_image_set_data(_img, data, length, _cleanup);
}
/// image format conversion.
/// see zbar_image_convert()
Image convert (unsigned long format) const
{
zbar_image_t *img = zbar_image_convert(_img, format);
if(img)
return(Image(img));
throw FormatError();
}
/// image format conversion.
/// see zbar_image_convert()
/// @since 0.11
Image convert (std::string format) const
{
unsigned long fourcc = zbar_fourcc_parse(format.c_str());
return(convert(fourcc));
}
/// image format conversion with crop/pad.
/// see zbar_image_convert_resize()
/// @since 0.4
Image convert (unsigned long format,
unsigned width,
unsigned height) const
{
zbar_image_t *img =
zbar_image_convert_resize(_img, format, width, height);
if(img)
return(Image(img));
throw FormatError();
}
const SymbolSet get_symbols () const {
return(SymbolSet(zbar_image_get_symbols(_img)));
}
void set_symbols (const SymbolSet &syms) {
zbar_image_set_symbols(_img, syms);
}
/// create a new SymbolIterator over decoded results.
SymbolIterator symbol_begin () const {
return(SymbolIterator(get_symbols()));
}
/// return a SymbolIterator suitable for ending iteration.
SymbolIterator symbol_end () const {
return(SymbolIterator());
}
protected:
friend class Video;
/// constructor.
/// @internal
/// create a new Image from a zbar_image_t C object
Image (zbar_image_t *src,
int refs = 0)
: _img(src)
{
if(refs)
zbar_image_ref(_img, refs);
zbar_image_set_userdata(_img, this);
}
/// default data cleanup (noop)
/// @internal
static void _cleanup (zbar_image_t *img)
{
// by default nothing is cleaned
assert(img);
}
private:
zbar_image_t *_img;
};
}
#endif
================================================
FILE: zbar/src/main/jni/include/zbar/ImageScanner.h
================================================
//------------------------------------------------------------------------
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _ZBAR_IMAGE_SCANNER_H_
#define _ZBAR_IMAGE_SCANNER_H_
/// @file
/// Image Scanner C++ wrapper
#ifndef _ZBAR_H_
# error "include zbar.h in your application, **not** zbar/ImageScanner.h"
#endif
#include "Image.h"
namespace zbar {
/// mid-level image scanner interface.
/// reads barcodes from a 2-D Image
class ImageScanner {
public:
/// constructor.
ImageScanner (zbar_image_scanner_t *scanner = NULL)
{
if(scanner)
_scanner = scanner;
else
_scanner = zbar_image_scanner_create();
}
~ImageScanner ()
{
zbar_image_scanner_destroy(_scanner);
}
/// cast to C image_scanner object
operator zbar_image_scanner_t* () const
{
return(_scanner);
}
/// setup result handler callback.
void set_handler (Image::Handler &handler)
{
zbar_image_scanner_set_data_handler(_scanner, handler, &handler);
}
/// set config for indicated symbology (0 for all) to specified value.
/// @see zbar_image_scanner_set_config()
/// @since 0.4
int set_config (zbar_symbol_type_t symbology,
zbar_config_t config,
int value)
{
return(zbar_image_scanner_set_config(_scanner, symbology,
config, value));
}
/// set config parsed from configuration string.
/// @see zbar_image_scanner_parse_config()
/// @since 0.4
int set_config (std::string cfgstr)
{
return(zbar_image_scanner_parse_config(_scanner, cfgstr.c_str()));
}
/// enable or disable the inter-image result cache.
/// see zbar_image_scanner_enable_cache()
void enable_cache (bool enable = true)
{
zbar_image_scanner_enable_cache(_scanner, enable);
}
/// remove previous results from scanner and image.
/// @see zbar_image_scanner_recycle_image()
/// @since 0.10
void recycle_image (Image &image)
{
zbar_image_scanner_recycle_image(_scanner, image);
}
/// retrieve decode results for last scanned image.
/// @see zbar_image_scanner_get_results()
/// @since 0.10
const SymbolSet get_results () const {
return(SymbolSet(zbar_image_scanner_get_results(_scanner)));
}
/// scan for symbols in provided image.
/// see zbar_scan_image()
int scan (Image& image)
{
return(zbar_scan_image(_scanner, image));
}
/// scan for symbols in provided image.
/// see zbar_scan_image()
ImageScanner& operator<< (Image& image)
{
scan(image);
return(*this);
}
private:
zbar_image_scanner_t *_scanner;
};
}
#endif
================================================
FILE: zbar/src/main/jni/include/zbar/Processor.h
================================================
//------------------------------------------------------------------------
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _ZBAR_PROCESSOR_H_
#define _ZBAR_PROCESSOR_H_
/// @file
/// Processor C++ wrapper
#ifndef _ZBAR_H_
# error "include zbar.h in your application, **not** zbar/Processor.h"
#endif
#include "Exception.h"
#include "Image.h"
namespace zbar {
/// high-level self-contained image processor.
/// processes video and images for barcodes, optionally displaying
/// images to a library owned output window
class Processor {
public:
/// value to pass for no timeout.
static const int FOREVER = -1;
/// constructor.
Processor (bool threaded = true,
const char *video_device = "",
bool enable_display = true)
{
_processor = zbar_processor_create(threaded);
if(!_processor)
throw std::bad_alloc();
init(video_device, enable_display);
}
~Processor ()
{
zbar_processor_destroy(_processor);
}
/// cast to C processor object.
operator zbar_processor_t* ()
{
return(_processor);
}
/// opens a video input device and/or prepares to display output.
/// see zbar_processor_init()
void init (const char *video_device = "",
bool enable_display = true)
{
if(zbar_processor_init(_processor, video_device, enable_display))
throw_exception(_processor);
}
/// setup result handler callback.
/// see zbar_processor_set_data_handler()
void set_handler (Image::Handler& handler)
{
zbar_processor_set_data_handler(_processor, handler, &handler);
}
/// set config for indicated symbology (0 for all) to specified value.
/// @see zbar_processor_set_config()
/// @since 0.4
int set_config (zbar_symbol_type_t symbology,
zbar_config_t config,
int value)
{
return(zbar_processor_set_config(_processor, symbology,
config, value));
}
/// set config parsed from configuration string.
/// @see zbar_processor_parse_config()
/// @since 0.4
int set_config (std::string cfgstr)
{
return(zbar_processor_parse_config(_processor, cfgstr.c_str()));
}
/// retrieve the current state of the ouput window.
/// see zbar_processor_is_visible()
bool is_visible ()
{
int rc = zbar_processor_is_visible(_processor);
if(rc < 0)
throw_exception(_processor);
return(rc != 0);
}
/// show or hide the display window owned by the library.
/// see zbar_processor_set_visible()
void set_visible (bool visible = true)
{
if(zbar_processor_set_visible(_processor, visible) < 0)
throw_exception(_processor);
}
/// control the processor in free running video mode.
/// see zbar_processor_set_active()
void set_active (bool active = true)
{
if(zbar_processor_set_active(_processor, active) < 0)
throw_exception(_processor);
}
/// retrieve decode results for last scanned image.
/// @see zbar_processor_get_results()
/// @since 0.10
const SymbolSet get_results () const {
return(SymbolSet(zbar_processor_get_results(_processor)));
}
/// wait for input to the display window from the user.
/// see zbar_processor_user_wait()
int user_wait (int timeout = FOREVER)
{
int rc = zbar_processor_user_wait(_processor, timeout);
if(rc < 0)
throw_exception(_processor);
return(rc);
}
/// process from the video stream until a result is available.
/// see zbar_process_one()
void process_one (int timeout = FOREVER)
{
if(zbar_process_one(_processor, timeout) < 0)
throw_exception(_processor);
}
/// process the provided image for barcodes.
/// see zbar_process_image()
void process_image (Image& image)
{
if(zbar_process_image(_processor, image) < 0)
throw_exception(_processor);
}
/// process the provided image for barcodes.
/// see zbar_process_image()
Processor& operator<< (Image& image)
{
process_image(image);
return(*this);
}
/// force specific input and output formats for debug/testing.
/// see zbar_processor_force_format()
void force_format (unsigned long input_format,
unsigned long output_format)
{
if(zbar_processor_force_format(_processor, input_format,
output_format))
throw_exception(_processor);
}
/// force specific input and output formats for debug/testing.
/// see zbar_processor_force_format()
void force_format (std::string& input_format,
std::string& output_format)
{
unsigned long ifourcc = zbar_fourcc_parse(input_format.c_str());
unsigned long ofourcc = zbar_fourcc_parse(output_format.c_str());
if(zbar_processor_force_format(_processor, ifourcc, ofourcc))
throw_exception(_processor);
}
/// request a preferred size for the video image from the device.
/// see zbar_processor_request_size()
/// @since 0.6
void request_size (int width, int height)
{
zbar_processor_request_size(_processor, width, height);
}
/// request a preferred driver interface version for debug/testing.
/// see zbar_processor_request_interface()
/// @since 0.6
void request_interface (int version)
{
zbar_processor_request_interface(_processor, version);
}
/// request a preferred I/O mode for debug/testing.
/// see zbar_processor_request_iomode()
/// @since 0.7
void request_iomode (int iomode)
{
if(zbar_processor_request_iomode(_processor, iomode))
throw_exception(_processor);
}
private:
zbar_processor_t *_processor;
};
}
#endif
================================================
FILE: zbar/src/main/jni/include/zbar/QZBar.h
================================================
//------------------------------------------------------------------------
// Copyright 2008-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
//
// This file is part of the ZBar Bar Code Reader.
//
// The ZBar Bar Code Reader is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// The ZBar Bar Code Reader is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser Public License for more details.
//
// You should have received a copy of the GNU Lesser Public License
// along with the ZBar Bar Code Reader; if not, write to the Free
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301 USA
//
// http://sourceforge.net/projects/zbar
//------------------------------------------------------------------------
#ifndef _QZBAR_H_
#define _QZBAR_H_
/// @file
/// Barcode Reader Qt4 Widget
#include <qwidget.h>
namespace zbar {
class QZBarThread;
/// barcode reader Qt4 widget.
/// embeds a barcode reader directly into a Qt4 based GUI. the widget
/// can process barcodes from a video source (using the QZBar::videoDevice
/// and QZBar::videoEnabled properties) or from individual QImages
/// supplied to the QZBar::scanImage() slot
/// @since 1.5
class QZBar : public QWidget
{
Q_OBJECT
/// the currently opened video device.
///
/// setting a new device opens it and automatically sets
/// QZBar::videoEnabled
///
/// @see videoDevice(), setVideoDevice()
Q_PROPERTY(QString videoDevice
READ videoDevice
WRITE setVideoDevice
DESIGNABLE false)
/// video device streaming state.
///
/// use to pause/resume video scanning.
///
/// @see isVideoEnabled(), setVideoEnabled()
Q_PROPERTY(bool videoEnabled
READ isVideoEnabled
WRITE setVideoEnabled
DESIGNABLE false)
/// video device opened state.
///
/// (re)setting QZBar::videoDevice should eventually cause it
/// to be opened or closed. any errors while streaming/scanning
/// will also cause the device to be closed
///
/// @see isVideoOpened()
Q_PROPERTY(bool videoOpened
READ isVideoOpened
DESIGNABLE false)
public:
/// constructs a barcode reader widget with the given @a parent
QZBar(QWidget *parent = NULL);
~QZBar();
/// retrieve the currently opened video device.
/// @returns the current video device or the empty string if no
/// device is opened
QString videoDevice() const;
/// retrieve the current video enabled state.
/// @returns true if video scanning is currently enabled, false
/// otherwise
bool isVideoEnabled() const;
/// retrieve the current video opened state.
/// @returns true if video device is currently opened, false otherwise
bool isVideoOpened() const;
/// @{
/// @internal
QSize sizeHint() const;
int heightForWidth(int) const;
QPaintEngine *paintEngine() const;
/// @}
public Q_SLOTS:
/// open a new video device.
///
/// use an empty string to close a currently opened device.
///
/// @note since opening a device may take some time, this call will
/// return immediately and the device will be opened asynchronously
void setVideoDevice(const QString &videoDevice);
/// enable/disable video scanning.
/// has no effect unless a video device is opened
void setVideoEnabled(bool videoEnabled = true);
/// scan for barcodes
gitextract_u2lb475g/
├── .gitignore
├── README.md
├── assembleDebug.sh
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── qrcodecore/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── cn/
│ │ └── bingoogolapple/
│ │ └── qrcode/
│ │ └── core/
│ │ ├── BGAQRCodeUtil.java
│ │ ├── BarcodeType.java
│ │ ├── CameraConfigurationManager.java
│ │ ├── CameraPreview.java
│ │ ├── ProcessDataTask.java
│ │ ├── QRCodeView.java
│ │ ├── ScanBoxView.java
│ │ └── ScanResult.java
│ └── res/
│ └── values/
│ ├── attrs.xml
│ └── ids.xml
├── settings.gradle
├── zbar/
│ ├── build.gradle
│ ├── consumer-proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ ├── cn/
│ │ │ └── bingoogolapple/
│ │ │ └── qrcode/
│ │ │ └── zbar/
│ │ │ ├── BarcodeFormat.java
│ │ │ └── ZBarView.java
│ │ └── net/
│ │ └── sourceforge/
│ │ └── zbar/
│ │ ├── Config.java
│ │ ├── Image.java
│ │ ├── ImageScanner.java
│ │ ├── Modifier.java
│ │ ├── Orientation.java
│ │ ├── Symbol.java
│ │ ├── SymbolIterator.java
│ │ └── SymbolSet.java
│ └── jni/
│ ├── Android.mk
│ ├── Application.mk
│ ├── config.h
│ ├── include/
│ │ ├── Makefile.am.inc
│ │ ├── zbar/
│ │ │ ├── Decoder.h
│ │ │ ├── Exception.h
│ │ │ ├── Image.h
│ │ │ ├── ImageScanner.h
│ │ │ ├── Processor.h
│ │ │ ├── QZBar.h
│ │ │ ├── QZBarImage.h
│ │ │ ├── Scanner.h
│ │ │ ├── Symbol.h
│ │ │ ├── Video.h
│ │ │ ├── Window.h
│ │ │ └── zbargtk.h
│ │ └── zbar.h
│ ├── libiconv-1.15/
│ │ ├── ABOUT-NLS
│ │ ├── AUTHORS
│ │ ├── COPYING
│ │ ├── COPYING.LIB
│ │ ├── ChangeLog
│ │ ├── DEPENDENCIES
│ │ ├── DESIGN
│ │ ├── HACKING
│ │ ├── INSTALL.generic
│ │ ├── Makefile
│ │ ├── Makefile.devel
│ │ ├── Makefile.in
│ │ ├── NEWS
│ │ ├── NOTES
│ │ ├── README
│ │ ├── README.djgpp
│ │ ├── README.windows
│ │ ├── THANKS
│ │ ├── aclocal.m4
│ │ ├── build-aux/
│ │ │ ├── ar-lib
│ │ │ ├── compile
│ │ │ ├── config.guess
│ │ │ ├── config.libpath
│ │ │ ├── config.rpath
│ │ │ ├── config.sub
│ │ │ ├── install-reloc
│ │ │ ├── install-sh
│ │ │ ├── ltmain.sh
│ │ │ ├── missing
│ │ │ ├── mkinstalldirs
│ │ │ ├── reloc-ldflags
│ │ │ └── snippet/
│ │ │ ├── _Noreturn.h
│ │ │ ├── arg-nonnull.h
│ │ │ ├── c++defs.h
│ │ │ └── warn-on-use.h
│ │ ├── config.h
│ │ ├── config.h.in
│ │ ├── config.status
│ │ ├── configure
│ │ ├── configure.ac
│ │ ├── djgpp/
│ │ │ ├── Makefile.maint
│ │ │ ├── README
│ │ │ ├── README.in
│ │ │ ├── config.bat
│ │ │ ├── config.sed
│ │ │ ├── config.site
│ │ │ ├── edtest.bat
│ │ │ ├── fnchange.in
│ │ │ ├── fnchange.lst
│ │ │ ├── makefile.sed
│ │ │ ├── sources.sed
│ │ │ ├── stateful-check.sed
│ │ │ ├── stateless-check.sed
│ │ │ └── translit-check.sed
│ │ ├── doc/
│ │ │ └── relocatable.texi
│ │ ├── extras/
│ │ │ ├── ChangeLog
│ │ │ ├── iconv_string.c
│ │ │ └── iconv_string.h
│ │ ├── gnulib-local/
│ │ │ ├── lib/
│ │ │ │ ├── alloca.in.h
│ │ │ │ ├── error.h.diff
│ │ │ │ ├── progname.h.diff
│ │ │ │ ├── xalloc.h
│ │ │ │ ├── xmalloc.c
│ │ │ │ └── xstrdup.c
│ │ │ ├── m4/
│ │ │ │ └── alloca.m4
│ │ │ └── modules/
│ │ │ ├── libiconv-misc
│ │ │ ├── mbstate
│ │ │ └── xalloc
│ │ ├── include/
│ │ │ ├── export.h
│ │ │ ├── iconv.h
│ │ │ ├── iconv.h.build.in
│ │ │ ├── iconv.h.in
│ │ │ └── iconv.h.inst
│ │ ├── lib/
│ │ │ ├── .libs/
│ │ │ │ ├── iconv.o
│ │ │ │ ├── libiconv.lai
│ │ │ │ ├── localcharset.o
│ │ │ │ └── relocatable.o
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── aliases.gperf
│ │ │ ├── aliases.h
│ │ │ ├── aliases2.h
│ │ │ ├── aliases_aix.h
│ │ │ ├── aliases_aix_sysaix.h
│ │ │ ├── aliases_dos.h
│ │ │ ├── aliases_extra.h
│ │ │ ├── aliases_osf1.h
│ │ │ ├── aliases_osf1_sysosf1.h
│ │ │ ├── aliases_sysaix.gperf
│ │ │ ├── aliases_sysaix.h
│ │ │ ├── aliases_syshpux.gperf
│ │ │ ├── aliases_syshpux.h
│ │ │ ├── aliases_sysosf1.gperf
│ │ │ ├── aliases_sysosf1.h
│ │ │ ├── aliases_syssolaris.gperf
│ │ │ ├── aliases_syssolaris.h
│ │ │ ├── armscii_8.h
│ │ │ ├── ascii.h
│ │ │ ├── atarist.h
│ │ │ ├── big5.h
│ │ │ ├── big5_2003.h
│ │ │ ├── big5hkscs1999.h
│ │ │ ├── big5hkscs2001.h
│ │ │ ├── big5hkscs2004.h
│ │ │ ├── big5hkscs2008.h
│ │ │ ├── c99.h
│ │ │ ├── canonical.h
│ │ │ ├── canonical_aix.h
│ │ │ ├── canonical_aix_sysaix.h
│ │ │ ├── canonical_dos.h
│ │ │ ├── canonical_extra.h
│ │ │ ├── canonical_local.h
│ │ │ ├── canonical_local_sysaix.h
│ │ │ ├── canonical_local_syshpux.h
│ │ │ ├── canonical_local_sysosf1.h
│ │ │ ├── canonical_local_syssolaris.h
│ │ │ ├── canonical_osf1.h
│ │ │ ├── canonical_osf1_sysosf1.h
│ │ │ ├── canonical_sysaix.h
│ │ │ ├── canonical_syshpux.h
│ │ │ ├── canonical_sysosf1.h
│ │ │ ├── canonical_syssolaris.h
│ │ │ ├── ces_big5.h
│ │ │ ├── ces_gbk.h
│ │ │ ├── charset.alias
│ │ │ ├── cjk_variants.h
│ │ │ ├── cns11643.h
│ │ │ ├── cns11643_1.h
│ │ │ ├── cns11643_15.h
│ │ │ ├── cns11643_2.h
│ │ │ ├── cns11643_3.h
│ │ │ ├── cns11643_4.h
│ │ │ ├── cns11643_4a.h
│ │ │ ├── cns11643_4b.h
│ │ │ ├── cns11643_5.h
│ │ │ ├── cns11643_6.h
│ │ │ ├── cns11643_7.h
│ │ │ ├── cns11643_inv.h
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── converters.h
│ │ │ ├── cp1046.h
│ │ │ ├── cp1124.h
│ │ │ ├── cp1125.h
│ │ │ ├── cp1129.h
│ │ │ ├── cp1131.h
│ │ │ ├── cp1133.h
│ │ │ ├── cp1161.h
│ │ │ ├── cp1162.h
│ │ │ ├── cp1163.h
│ │ │ ├── cp1250.h
│ │ │ ├── cp1251.h
│ │ │ ├── cp1252.h
│ │ │ ├── cp1253.h
│ │ │ ├── cp1254.h
│ │ │ ├── cp1255.h
│ │ │ ├── cp1256.h
│ │ │ ├── cp1257.h
│ │ │ ├── cp1258.h
│ │ │ ├── cp437.h
│ │ │ ├── cp50221_0208_ext.h
│ │ │ ├── cp50221_0212_ext.h
│ │ │ ├── cp737.h
│ │ │ ├── cp775.h
│ │ │ ├── cp850.h
│ │ │ ├── cp852.h
│ │ │ ├── cp853.h
│ │ │ ├── cp855.h
│ │ │ ├── cp856.h
│ │ │ ├── cp857.h
│ │ │ ├── cp858.h
│ │ │ ├── cp860.h
│ │ │ ├── cp861.h
│ │ │ ├── cp862.h
│ │ │ ├── cp863.h
│ │ │ ├── cp864.h
│ │ │ ├── cp865.h
│ │ │ ├── cp866.h
│ │ │ ├── cp869.h
│ │ │ ├── cp874.h
│ │ │ ├── cp922.h
│ │ │ ├── cp932.h
│ │ │ ├── cp932ext.h
│ │ │ ├── cp936.h
│ │ │ ├── cp936ext.h
│ │ │ ├── cp943.h
│ │ │ ├── cp949.h
│ │ │ ├── cp950.h
│ │ │ ├── cp950ext.h
│ │ │ ├── dec_hanyu.h
│ │ │ ├── dec_kanji.h
│ │ │ ├── encodings.def
│ │ │ ├── encodings_aix.def
│ │ │ ├── encodings_dos.def
│ │ │ ├── encodings_extra.def
│ │ │ ├── encodings_local.def
│ │ │ ├── encodings_osf1.def
│ │ │ ├── euc_cn.h
│ │ │ ├── euc_jisx0213.h
│ │ │ ├── euc_jp.h
│ │ │ ├── euc_kr.h
│ │ │ ├── euc_tw.h
│ │ │ ├── flags.h
│ │ │ ├── flushwc.h
│ │ │ ├── gb12345.h
│ │ │ ├── gb12345ext.h
│ │ │ ├── gb18030.h
│ │ │ ├── gb18030ext.h
│ │ │ ├── gb18030uni.h
│ │ │ ├── gb2312.h
│ │ │ ├── gbk.h
│ │ │ ├── gbkext1.h
│ │ │ ├── gbkext2.h
│ │ │ ├── gbkext_inv.h
│ │ │ ├── genaliases.c
│ │ │ ├── genaliases2.c
│ │ │ ├── genflags.c
│ │ │ ├── gentranslit.c
│ │ │ ├── georgian_academy.h
│ │ │ ├── georgian_ps.h
│ │ │ ├── hkscs1999.h
│ │ │ ├── hkscs2001.h
│ │ │ ├── hkscs2004.h
│ │ │ ├── hkscs2008.h
│ │ │ ├── hp_roman8.h
│ │ │ ├── hz.h
│ │ │ ├── iconv.c
│ │ │ ├── iconv.lo
│ │ │ ├── iconv_open1.h
│ │ │ ├── iconv_open2.h
│ │ │ ├── iso2022_cn.h
│ │ │ ├── iso2022_cnext.h
│ │ │ ├── iso2022_jp.h
│ │ │ ├── iso2022_jp1.h
│ │ │ ├── iso2022_jp2.h
│ │ │ ├── iso2022_jp3.h
│ │ │ ├── iso2022_jpms.h
│ │ │ ├── iso2022_kr.h
│ │ │ ├── iso646_cn.h
│ │ │ ├── iso646_jp.h
│ │ │ ├── iso8859_1.h
│ │ │ ├── iso8859_10.h
│ │ │ ├── iso8859_11.h
│ │ │ ├── iso8859_13.h
│ │ │ ├── iso8859_14.h
│ │ │ ├── iso8859_15.h
│ │ │ ├── iso8859_16.h
│ │ │ ├── iso8859_2.h
│ │ │ ├── iso8859_3.h
│ │ │ ├── iso8859_4.h
│ │ │ ├── iso8859_5.h
│ │ │ ├── iso8859_6.h
│ │ │ ├── iso8859_7.h
│ │ │ ├── iso8859_8.h
│ │ │ ├── iso8859_9.h
│ │ │ ├── isoir165.h
│ │ │ ├── isoir165ext.h
│ │ │ ├── java.h
│ │ │ ├── jisx0201.h
│ │ │ ├── jisx0208.h
│ │ │ ├── jisx0212.h
│ │ │ ├── jisx0213.h
│ │ │ ├── johab.h
│ │ │ ├── johab_hangul.h
│ │ │ ├── koi8_r.h
│ │ │ ├── koi8_ru.h
│ │ │ ├── koi8_t.h
│ │ │ ├── koi8_u.h
│ │ │ ├── ksc5601.h
│ │ │ ├── libcharset.a
│ │ │ ├── libcharset.h
│ │ │ ├── libcharset.la
│ │ │ ├── libiconv.la
│ │ │ ├── localcharset.h
│ │ │ ├── localcharset.lo
│ │ │ ├── loop_unicode.h
│ │ │ ├── loop_wchar.h
│ │ │ ├── loops.h
│ │ │ ├── mac_arabic.h
│ │ │ ├── mac_centraleurope.h
│ │ │ ├── mac_croatian.h
│ │ │ ├── mac_cyrillic.h
│ │ │ ├── mac_greek.h
│ │ │ ├── mac_hebrew.h
│ │ │ ├── mac_iceland.h
│ │ │ ├── mac_roman.h
│ │ │ ├── mac_romania.h
│ │ │ ├── mac_thai.h
│ │ │ ├── mac_turkish.h
│ │ │ ├── mac_ukraine.h
│ │ │ ├── mulelao.h
│ │ │ ├── nextstep.h
│ │ │ ├── pt154.h
│ │ │ ├── relocatable.c
│ │ │ ├── relocatable.h
│ │ │ ├── relocatable.lo
│ │ │ ├── riscos1.h
│ │ │ ├── rk1048.h
│ │ │ ├── shift_jisx0213.h
│ │ │ ├── sjis.h
│ │ │ ├── stamp-h2
│ │ │ ├── tcvn.h
│ │ │ ├── tds565.h
│ │ │ ├── tis620.h
│ │ │ ├── translit.def
│ │ │ ├── translit.h
│ │ │ ├── ucs2.h
│ │ │ ├── ucs2be.h
│ │ │ ├── ucs2internal.h
│ │ │ ├── ucs2le.h
│ │ │ ├── ucs2swapped.h
│ │ │ ├── ucs4.h
│ │ │ ├── ucs4be.h
│ │ │ ├── ucs4internal.h
│ │ │ ├── ucs4le.h
│ │ │ ├── ucs4swapped.h
│ │ │ ├── uhc_1.h
│ │ │ ├── uhc_2.h
│ │ │ ├── utf16.h
│ │ │ ├── utf16be.h
│ │ │ ├── utf16le.h
│ │ │ ├── utf32.h
│ │ │ ├── utf32be.h
│ │ │ ├── utf32le.h
│ │ │ ├── utf7.h
│ │ │ ├── utf8.h
│ │ │ ├── vietcomb.h
│ │ │ └── viscii.h
│ │ ├── libcharset/
│ │ │ ├── AUTHORS
│ │ │ ├── COPYING.LIB
│ │ │ ├── ChangeLog
│ │ │ ├── DEPENDENCIES
│ │ │ ├── HACKING
│ │ │ ├── INSTALL.generic
│ │ │ ├── INTEGRATE
│ │ │ ├── Makefile
│ │ │ ├── Makefile.devel
│ │ │ ├── Makefile.in
│ │ │ ├── NEWS
│ │ │ ├── README
│ │ │ ├── README.djgpp
│ │ │ ├── README.windows
│ │ │ ├── autoconf/
│ │ │ │ └── aclocal.m4
│ │ │ ├── build-aux/
│ │ │ │ ├── config.guess
│ │ │ │ ├── config.libpath
│ │ │ │ ├── config.sub
│ │ │ │ ├── install-sh
│ │ │ │ ├── ltmain.sh
│ │ │ │ └── mkinstalldirs
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── config.status
│ │ │ ├── configure
│ │ │ ├── configure.ac
│ │ │ ├── djgpp/
│ │ │ │ ├── Makefile.maint
│ │ │ │ ├── README
│ │ │ │ ├── README.in
│ │ │ │ ├── config.bat
│ │ │ │ ├── config.sed
│ │ │ │ ├── config.site
│ │ │ │ ├── fnchange.in
│ │ │ │ └── fnchange.lst
│ │ │ ├── include/
│ │ │ │ ├── export.h
│ │ │ │ ├── libcharset.h
│ │ │ │ ├── libcharset.h.in
│ │ │ │ ├── localcharset.h
│ │ │ │ ├── localcharset.h.build.in
│ │ │ │ ├── localcharset.h.in
│ │ │ │ └── localcharset.h.inst
│ │ │ ├── lib/
│ │ │ │ ├── .libs/
│ │ │ │ │ ├── libcharset.a
│ │ │ │ │ ├── libcharset.lai
│ │ │ │ │ ├── localcharset.o
│ │ │ │ │ └── relocatable.o
│ │ │ │ ├── ChangeLog
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── charset.alias
│ │ │ │ ├── config.charset
│ │ │ │ ├── libcharset.la
│ │ │ │ ├── localcharset.c
│ │ │ │ ├── localcharset.lo
│ │ │ │ ├── localcharset.o
│ │ │ │ ├── ref-add.sed
│ │ │ │ ├── ref-add.sin
│ │ │ │ ├── ref-del.sed
│ │ │ │ ├── ref-del.sin
│ │ │ │ ├── relocatable.c
│ │ │ │ ├── relocatable.h
│ │ │ │ ├── relocatable.lo
│ │ │ │ └── relocatable.o
│ │ │ ├── libtool
│ │ │ ├── m4/
│ │ │ │ ├── codeset.m4
│ │ │ │ ├── fcntl-o.m4
│ │ │ │ ├── glibc21.m4
│ │ │ │ ├── libtool.m4
│ │ │ │ ├── ltoptions.m4
│ │ │ │ ├── ltsugar.m4
│ │ │ │ ├── ltversion.m4
│ │ │ │ ├── lt~obsolete.m4
│ │ │ │ ├── relocatable-lib.m4
│ │ │ │ └── visibility.m4
│ │ │ └── tools/
│ │ │ ├── README
│ │ │ ├── aix-3.2.5
│ │ │ ├── aix-4.1.5
│ │ │ ├── aix-4.2.0
│ │ │ ├── aix-4.3.2
│ │ │ ├── all-charsets
│ │ │ ├── all-charsets-X11
│ │ │ ├── all-locales
│ │ │ ├── beos-5
│ │ │ ├── cygwin-1.7.2
│ │ │ ├── darwin-6.8
│ │ │ ├── darwin-7.5
│ │ │ ├── darwin-9.5
│ │ │ ├── freebsd-3.3
│ │ │ ├── glibc-2.1.3
│ │ │ ├── glibc-2.1.90
│ │ │ ├── glibc-2.2
│ │ │ ├── glibc-2.2-XF86-3.3.6
│ │ │ ├── glibc-2.2-XF86-4.0.1f
│ │ │ ├── hpux-10.01
│ │ │ ├── hpux-10.20
│ │ │ ├── hpux-11.00
│ │ │ ├── irix-6.5
│ │ │ ├── locale_charmap
│ │ │ ├── locale_charset.c
│ │ │ ├── locale_codeset.c
│ │ │ ├── locale_monthnames.c
│ │ │ ├── locale_x11encoding.c
│ │ │ ├── netbsd-3.0
│ │ │ ├── openbsd-4.1
│ │ │ ├── osf1-4.0a
│ │ │ ├── osf1-4.0d
│ │ │ ├── osf1-5.1
│ │ │ ├── solaris-2.4
│ │ │ ├── solaris-2.5.1
│ │ │ ├── solaris-2.6
│ │ │ ├── solaris-2.6-cjk
│ │ │ ├── solaris-2.7
│ │ │ ├── sunos-4.1.4
│ │ │ └── win32
│ │ ├── libtool
│ │ ├── m4/
│ │ │ ├── cp.m4
│ │ │ ├── eilseq.m4
│ │ │ ├── endian.m4
│ │ │ ├── general.m4
│ │ │ ├── libtool.m4
│ │ │ ├── ln.m4
│ │ │ ├── ltoptions.m4
│ │ │ ├── ltsugar.m4
│ │ │ ├── ltversion.m4
│ │ │ ├── lt~obsolete.m4
│ │ │ └── proto.m4
│ │ ├── man/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── iconv.1
│ │ │ ├── iconv.1.html
│ │ │ ├── iconv.3
│ │ │ ├── iconv.3.html
│ │ │ ├── iconv_close.3
│ │ │ ├── iconv_close.3.html
│ │ │ ├── iconv_open.3
│ │ │ ├── iconv_open.3.html
│ │ │ ├── iconv_open_into.3
│ │ │ ├── iconv_open_into.3.html
│ │ │ ├── iconvctl.3
│ │ │ └── iconvctl.3.html
│ │ ├── os2/
│ │ │ └── iconv.def
│ │ ├── po/
│ │ │ ├── ChangeLog
│ │ │ ├── LINGUAS
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── Makefile.in.in
│ │ │ ├── Makevars
│ │ │ ├── POTFILES
│ │ │ ├── POTFILES.in
│ │ │ ├── Rules-quot
│ │ │ ├── af.gmo
│ │ │ ├── af.po
│ │ │ ├── bg.gmo
│ │ │ ├── bg.po
│ │ │ ├── boldquot.sed
│ │ │ ├── ca.gmo
│ │ │ ├── ca.po
│ │ │ ├── cs.gmo
│ │ │ ├── cs.po
│ │ │ ├── da.gmo
│ │ │ ├── da.po
│ │ │ ├── de.gmo
│ │ │ ├── de.po
│ │ │ ├── el.gmo
│ │ │ ├── el.po
│ │ │ ├── en@boldquot.header
│ │ │ ├── en@quot.header
│ │ │ ├── eo.gmo
│ │ │ ├── eo.po
│ │ │ ├── es.gmo
│ │ │ ├── es.po
│ │ │ ├── et.gmo
│ │ │ ├── et.po
│ │ │ ├── fi.gmo
│ │ │ ├── fi.po
│ │ │ ├── fr.gmo
│ │ │ ├── fr.po
│ │ │ ├── ga.gmo
│ │ │ ├── ga.po
│ │ │ ├── gl.gmo
│ │ │ ├── gl.po
│ │ │ ├── hr.gmo
│ │ │ ├── hr.po
│ │ │ ├── hu.gmo
│ │ │ ├── hu.po
│ │ │ ├── id.gmo
│ │ │ ├── id.po
│ │ │ ├── insert-header.sin
│ │ │ ├── it.gmo
│ │ │ ├── it.po
│ │ │ ├── ja.gmo
│ │ │ ├── ja.po
│ │ │ ├── libiconv.pot
│ │ │ ├── nl.gmo
│ │ │ ├── nl.po
│ │ │ ├── pl.gmo
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.gmo
│ │ │ ├── pt_BR.po
│ │ │ ├── quot.sed
│ │ │ ├── remove-potcdate.sin
│ │ │ ├── rm.gmo
│ │ │ ├── rm.po
│ │ │ ├── ro.gmo
│ │ │ ├── ro.po
│ │ │ ├── ru.gmo
│ │ │ ├── ru.po
│ │ │ ├── sk.gmo
│ │ │ ├── sk.po
│ │ │ ├── sl.gmo
│ │ │ ├── sl.po
│ │ │ ├── sq.gmo
│ │ │ ├── sq.po
│ │ │ ├── sr.gmo
│ │ │ ├── sr.po
│ │ │ ├── stamp-po
│ │ │ ├── sv.gmo
│ │ │ ├── sv.po
│ │ │ ├── tr.gmo
│ │ │ ├── tr.po
│ │ │ ├── uk.gmo
│ │ │ ├── uk.po
│ │ │ ├── vi.gmo
│ │ │ ├── vi.po
│ │ │ ├── wa.gmo
│ │ │ ├── wa.po
│ │ │ ├── zh_CN.gmo
│ │ │ ├── zh_CN.po
│ │ │ ├── zh_TW.gmo
│ │ │ └── zh_TW.po
│ │ ├── preload/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.devel
│ │ │ ├── Makefile.in
│ │ │ ├── aclocal.m4
│ │ │ ├── config.status
│ │ │ ├── configure
│ │ │ ├── configure.ac
│ │ │ └── libtool
│ │ ├── src/
│ │ │ ├── .libs/
│ │ │ │ └── iconv_no_i18n
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── iconv.c
│ │ │ ├── iconv.o
│ │ │ ├── iconv_no_i18n
│ │ │ ├── iconv_no_i18n.c
│ │ │ └── iconv_no_i18n.o
│ │ ├── srclib/
│ │ │ ├── Makefile
│ │ │ ├── Makefile.am
│ │ │ ├── Makefile.gnulib
│ │ │ ├── Makefile.in
│ │ │ ├── alloca.h
│ │ │ ├── alloca.in.h
│ │ │ ├── allocator.c
│ │ │ ├── allocator.h
│ │ │ ├── allocator.o
│ │ │ ├── areadlink.c
│ │ │ ├── areadlink.h
│ │ │ ├── areadlink.o
│ │ │ ├── arg-nonnull.h
│ │ │ ├── basename-lgpl.c
│ │ │ ├── basename-lgpl.o
│ │ │ ├── binary-io.c
│ │ │ ├── binary-io.h
│ │ │ ├── binary-io.o
│ │ │ ├── c++defs.h
│ │ │ ├── c-ctype.c
│ │ │ ├── c-ctype.h
│ │ │ ├── canonicalize-lgpl.c
│ │ │ ├── canonicalize-lgpl.o
│ │ │ ├── careadlinkat.c
│ │ │ ├── careadlinkat.h
│ │ │ ├── careadlinkat.o
│ │ │ ├── dirname-lgpl.c
│ │ │ ├── dirname-lgpl.o
│ │ │ ├── dirname.h
│ │ │ ├── dosname.h
│ │ │ ├── errno.in.h
│ │ │ ├── error.c
│ │ │ ├── error.h
│ │ │ ├── error.o
│ │ │ ├── fcntl.h
│ │ │ ├── fcntl.in.h
│ │ │ ├── getprogname.c
│ │ │ ├── getprogname.h
│ │ │ ├── getprogname.o
│ │ │ ├── gettext.h
│ │ │ ├── gettimeofday.c
│ │ │ ├── intprops.h
│ │ │ ├── libicrt.a
│ │ │ ├── limits.h
│ │ │ ├── limits.in.h
│ │ │ ├── localcharset.h
│ │ │ ├── lstat.c
│ │ │ ├── lstat.o
│ │ │ ├── malloc.c
│ │ │ ├── malloca.c
│ │ │ ├── malloca.h
│ │ │ ├── malloca.o
│ │ │ ├── malloca.valgrind
│ │ │ ├── msvc-inval.c
│ │ │ ├── msvc-inval.h
│ │ │ ├── msvc-nothrow.c
│ │ │ ├── msvc-nothrow.h
│ │ │ ├── pathmax.h
│ │ │ ├── progname.c
│ │ │ ├── progname.h
│ │ │ ├── progname.o
│ │ │ ├── progreloc.c
│ │ │ ├── raise.c
│ │ │ ├── read.c
│ │ │ ├── readlink.c
│ │ │ ├── readlink.o
│ │ │ ├── relocatable.c
│ │ │ ├── relocatable.h
│ │ │ ├── relocwrapper.c
│ │ │ ├── safe-read.c
│ │ │ ├── safe-read.h
│ │ │ ├── safe-read.o
│ │ │ ├── setenv.c
│ │ │ ├── signal.h
│ │ │ ├── signal.in.h
│ │ │ ├── sigprocmask.c
│ │ │ ├── stat.c
│ │ │ ├── stat.o
│ │ │ ├── stdbool.in.h
│ │ │ ├── stddef.in.h
│ │ │ ├── stdint.h
│ │ │ ├── stdint.in.h
│ │ │ ├── stdio-write.c
│ │ │ ├── stdio.h
│ │ │ ├── stdio.in.h
│ │ │ ├── stdlib.h
│ │ │ ├── stdlib.in.h
│ │ │ ├── streq.h
│ │ │ ├── strerror-override.c
│ │ │ ├── strerror-override.h
│ │ │ ├── strerror-override.o
│ │ │ ├── strerror.c
│ │ │ ├── strerror.o
│ │ │ ├── string.h
│ │ │ ├── string.in.h
│ │ │ ├── stripslash.c
│ │ │ ├── stripslash.o
│ │ │ ├── sys/
│ │ │ │ ├── stat.h
│ │ │ │ ├── time.h
│ │ │ │ └── types.h
│ │ │ ├── sys_stat.in.h
│ │ │ ├── sys_time.in.h
│ │ │ ├── sys_types.in.h
│ │ │ ├── time.h
│ │ │ ├── time.in.h
│ │ │ ├── unistd.c
│ │ │ ├── unistd.h
│ │ │ ├── unistd.in.h
│ │ │ ├── unistd.o
│ │ │ ├── unitypes.h
│ │ │ ├── unitypes.in.h
│ │ │ ├── uniwidth/
│ │ │ │ ├── .dirstamp
│ │ │ │ ├── cjk.h
│ │ │ │ ├── width.c
│ │ │ │ └── width.o
│ │ │ ├── uniwidth.h
│ │ │ ├── uniwidth.in.h
│ │ │ ├── unlocked-io.h
│ │ │ ├── verify.h
│ │ │ ├── warn-on-use.h
│ │ │ ├── xalloc-oversized.h
│ │ │ ├── xalloc.h
│ │ │ ├── xmalloc.c
│ │ │ ├── xmalloc.o
│ │ │ ├── xreadlink.c
│ │ │ ├── xreadlink.h
│ │ │ ├── xreadlink.o
│ │ │ ├── xstrdup.c
│ │ │ └── xstrdup.o
│ │ ├── srcm4/
│ │ │ ├── 00gnulib.m4
│ │ │ ├── absolute-header.m4
│ │ │ ├── alloca.m4
│ │ │ ├── asm-underscore.m4
│ │ │ ├── canonicalize.m4
│ │ │ ├── codeset.m4
│ │ │ ├── dirname.m4
│ │ │ ├── double-slash-root.m4
│ │ │ ├── eealloc.m4
│ │ │ ├── environ.m4
│ │ │ ├── errno_h.m4
│ │ │ ├── error.m4
│ │ │ ├── extensions.m4
│ │ │ ├── extern-inline.m4
│ │ │ ├── fcntl-o.m4
│ │ │ ├── fcntl_h.m4
│ │ │ ├── getprogname.m4
│ │ │ ├── gettext.m4
│ │ │ ├── gettimeofday.m4
│ │ │ ├── glibc2.m4
│ │ │ ├── glibc21.m4
│ │ │ ├── gnulib-cache.m4
│ │ │ ├── gnulib-common.m4
│ │ │ ├── gnulib-comp.m4
│ │ │ ├── gnulib-tool.m4
│ │ │ ├── iconv.m4
│ │ │ ├── include_next.m4
│ │ │ ├── intdiv0.m4
│ │ │ ├── intl.m4
│ │ │ ├── intldir.m4
│ │ │ ├── intlmacosx.m4
│ │ │ ├── intmax.m4
│ │ │ ├── inttypes-pri.m4
│ │ │ ├── inttypes_h.m4
│ │ │ ├── largefile.m4
│ │ │ ├── lcmessage.m4
│ │ │ ├── lib-ld.m4
│ │ │ ├── lib-link.m4
│ │ │ ├── lib-prefix.m4
│ │ │ ├── libunistring-base.m4
│ │ │ ├── limits-h.m4
│ │ │ ├── lock.m4
│ │ │ ├── longlong.m4
│ │ │ ├── lstat.m4
│ │ │ ├── malloc.m4
│ │ │ ├── malloca.m4
│ │ │ ├── mbstate_t.m4
│ │ │ ├── msvc-inval.m4
│ │ │ ├── msvc-nothrow.m4
│ │ │ ├── multiarch.m4
│ │ │ ├── nls.m4
│ │ │ ├── nocrash.m4
│ │ │ ├── off_t.m4
│ │ │ ├── pathmax.m4
│ │ │ ├── po.m4
│ │ │ ├── printf-posix.m4
│ │ │ ├── progtest.m4
│ │ │ ├── raise.m4
│ │ │ ├── read.m4
│ │ │ ├── readlink.m4
│ │ │ ├── relocatable-lib.m4
│ │ │ ├── relocatable.m4
│ │ │ ├── safe-read.m4
│ │ │ ├── setenv.m4
│ │ │ ├── signal_h.m4
│ │ │ ├── signalblocking.m4
│ │ │ ├── sigpipe.m4
│ │ │ ├── size_max.m4
│ │ │ ├── ssize_t.m4
│ │ │ ├── stat.m4
│ │ │ ├── stdbool.m4
│ │ │ ├── stddef_h.m4
│ │ │ ├── stdint.m4
│ │ │ ├── stdint_h.m4
│ │ │ ├── stdio_h.m4
│ │ │ ├── stdlib_h.m4
│ │ │ ├── strerror.m4
│ │ │ ├── string_h.m4
│ │ │ ├── sys_socket_h.m4
│ │ │ ├── sys_stat_h.m4
│ │ │ ├── sys_time_h.m4
│ │ │ ├── sys_types_h.m4
│ │ │ ├── threadlib.m4
│ │ │ ├── time_h.m4
│ │ │ ├── uintmax_t.m4
│ │ │ ├── unistd_h.m4
│ │ │ ├── unlocked-io.m4
│ │ │ ├── visibility.m4
│ │ │ ├── warn-on-use.m4
│ │ │ ├── wchar_t.m4
│ │ │ ├── wint_t.m4
│ │ │ └── xsize.m4
│ │ ├── stamp-h1
│ │ ├── tests/
│ │ │ ├── ARMSCII-8.IRREVERSIBLE.TXT
│ │ │ ├── ARMSCII-8.TXT
│ │ │ ├── ASCII.TXT
│ │ │ ├── ATARIST.TXT
│ │ │ ├── BIG5-2003.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-2003.TXT
│ │ │ ├── BIG5-HKSCS-1999-snippet
│ │ │ ├── BIG5-HKSCS-1999-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-1999.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-1999.TXT
│ │ │ ├── BIG5-HKSCS-2001-snippet
│ │ │ ├── BIG5-HKSCS-2001-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2001.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2001.TXT
│ │ │ ├── BIG5-HKSCS-2004-snippet
│ │ │ ├── BIG5-HKSCS-2004-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2004.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2004.TXT
│ │ │ ├── BIG5-HKSCS-2008-snippet
│ │ │ ├── BIG5-HKSCS-2008-snippet.UTF-8
│ │ │ ├── BIG5-HKSCS-2008.IRREVERSIBLE.TXT
│ │ │ ├── BIG5-HKSCS-2008.TXT
│ │ │ ├── BIG5.TXT
│ │ │ ├── CP1046.TXT
│ │ │ ├── CP1124.TXT
│ │ │ ├── CP1125.TXT
│ │ │ ├── CP1129.TXT
│ │ │ ├── CP1131.TXT
│ │ │ ├── CP1133.TXT
│ │ │ ├── CP1161.IRREVERSIBLE.TXT
│ │ │ ├── CP1161.TXT
│ │ │ ├── CP1162.TXT
│ │ │ ├── CP1163.IRREVERSIBLE.TXT
│ │ │ ├── CP1163.TXT
│ │ │ ├── CP1250.TXT
│ │ │ ├── CP1251.TXT
│ │ │ ├── CP1252.TXT
│ │ │ ├── CP1253.TXT
│ │ │ ├── CP1254.TXT
│ │ │ ├── CP1255-snippet
│ │ │ ├── CP1255-snippet.UTF-8
│ │ │ ├── CP1255.IRREVERSIBLE.TXT
│ │ │ ├── CP1255.TXT
│ │ │ ├── CP1256.TXT
│ │ │ ├── CP1257.TXT
│ │ │ ├── CP1258-snippet
│ │ │ ├── CP1258-snippet.UTF-8
│ │ │ ├── CP1258.IRREVERSIBLE.TXT
│ │ │ ├── CP1258.TXT
│ │ │ ├── CP437.TXT
│ │ │ ├── CP737.TXT
│ │ │ ├── CP775.TXT
│ │ │ ├── CP850.TXT
│ │ │ ├── CP852.TXT
│ │ │ ├── CP853.TXT
│ │ │ ├── CP855.TXT
│ │ │ ├── CP856.TXT
│ │ │ ├── CP857.TXT
│ │ │ ├── CP858.TXT
│ │ │ ├── CP860.TXT
│ │ │ ├── CP861.TXT
│ │ │ ├── CP862.TXT
│ │ │ ├── CP863.TXT
│ │ │ ├── CP864.TXT
│ │ │ ├── CP865.TXT
│ │ │ ├── CP866.TXT
│ │ │ ├── CP869.TXT
│ │ │ ├── CP874.TXT
│ │ │ ├── CP922.TXT
│ │ │ ├── CP932.IRREVERSIBLE.TXT
│ │ │ ├── CP932.TXT
│ │ │ ├── CP936.TXT
│ │ │ ├── CP949.TXT
│ │ │ ├── CP950.IRREVERSIBLE.TXT
│ │ │ ├── CP950.TXT
│ │ │ ├── DEC-HANYU.IRREVERSIBLE.TXT
│ │ │ ├── DEC-HANYU.TXT
│ │ │ ├── DEC-KANJI.TXT
│ │ │ ├── EUC-CN.TXT
│ │ │ ├── EUC-JISX0213.TXT
│ │ │ ├── EUC-JP.IRREVERSIBLE.TXT
│ │ │ ├── EUC-JP.TXT
│ │ │ ├── EUC-KR.TXT
│ │ │ ├── EUC-TW.IRREVERSIBLE.TXT
│ │ │ ├── EUC-TW.TXT
│ │ │ ├── GB18030-BMP.TXT
│ │ │ ├── GB18030.IRREVERSIBLE.TXT
│ │ │ ├── GBK.TXT
│ │ │ ├── Georgian-Academy.TXT
│ │ │ ├── Georgian-PS.TXT
│ │ │ ├── HP-ROMAN8.TXT
│ │ │ ├── HZ-snippet
│ │ │ ├── HZ-snippet.UTF-8
│ │ │ ├── ISO-2022-CN-EXT-snippet
│ │ │ ├── ISO-2022-CN-EXT-snippet.UTF-8
│ │ │ ├── ISO-2022-CN-snippet
│ │ │ ├── ISO-2022-CN-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-1-snippet
│ │ │ ├── ISO-2022-JP-1-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-2-snippet
│ │ │ ├── ISO-2022-JP-2-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-3-snippet
│ │ │ ├── ISO-2022-JP-3-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-MS-snippet
│ │ │ ├── ISO-2022-JP-MS-snippet.UTF-8
│ │ │ ├── ISO-2022-JP-MS-snippet.alt
│ │ │ ├── ISO-2022-JP-snippet
│ │ │ ├── ISO-2022-JP-snippet.UTF-8
│ │ │ ├── ISO-2022-KR-snippet
│ │ │ ├── ISO-2022-KR-snippet.UTF-8
│ │ │ ├── ISO-8859-1.TXT
│ │ │ ├── ISO-8859-10.TXT
│ │ │ ├── ISO-8859-11.TXT
│ │ │ ├── ISO-8859-13.TXT
│ │ │ ├── ISO-8859-14.TXT
│ │ │ ├── ISO-8859-15.TXT
│ │ │ ├── ISO-8859-16.TXT
│ │ │ ├── ISO-8859-2.TXT
│ │ │ ├── ISO-8859-3.TXT
│ │ │ ├── ISO-8859-4.TXT
│ │ │ ├── ISO-8859-5.TXT
│ │ │ ├── ISO-8859-6.TXT
│ │ │ ├── ISO-8859-7.TXT
│ │ │ ├── ISO-8859-8.TXT
│ │ │ ├── ISO-8859-9.TXT
│ │ │ ├── ISO-IR-165.IRREVERSIBLE.TXT
│ │ │ ├── ISO-IR-165.TXT
│ │ │ ├── ISO646-CN.TXT
│ │ │ ├── ISO646-JP.TXT
│ │ │ ├── JIS_X0201.TXT
│ │ │ ├── JOHAB.TXT
│ │ │ ├── KOI8-R.TXT
│ │ │ ├── KOI8-RU.TXT
│ │ │ ├── KOI8-T.TXT
│ │ │ ├── KOI8-U.TXT
│ │ │ ├── MacArabic.TXT
│ │ │ ├── MacCentralEurope.TXT
│ │ │ ├── MacCroatian.TXT
│ │ │ ├── MacCyrillic.TXT
│ │ │ ├── MacGreek.TXT
│ │ │ ├── MacHebrew.TXT
│ │ │ ├── MacIceland.TXT
│ │ │ ├── MacRoman.TXT
│ │ │ ├── MacRomania.TXT
│ │ │ ├── MacThai.TXT
│ │ │ ├── MacTurkish.TXT
│ │ │ ├── MacUkraine.TXT
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── MuleLao-1.TXT
│ │ │ ├── NEXTSTEP.TXT
│ │ │ ├── PT154.TXT
│ │ │ ├── Quotes.ASCII
│ │ │ ├── Quotes.ISO-8859-1
│ │ │ ├── Quotes.UTF-8
│ │ │ ├── RISCOS-LATIN1.TXT
│ │ │ ├── RK1048.TXT
│ │ │ ├── SHIFT_JIS.TXT
│ │ │ ├── SHIFT_JISX0213.TXT
│ │ │ ├── TCVN-snippet
│ │ │ ├── TCVN-snippet.UTF-8
│ │ │ ├── TCVN.IRREVERSIBLE.TXT
│ │ │ ├── TCVN.TXT
│ │ │ ├── TDS565.TXT
│ │ │ ├── TIS-620.TXT
│ │ │ ├── Translit1.ASCII
│ │ │ ├── Translit1.ISO-8859-1
│ │ │ ├── TranslitFail1.ISO-8859-1
│ │ │ ├── UCS-2BE-snippet
│ │ │ ├── UCS-2BE-snippet.UTF-8
│ │ │ ├── UCS-2LE-snippet
│ │ │ ├── UCS-2LE-snippet.UTF-8
│ │ │ ├── UCS-4BE-snippet
│ │ │ ├── UCS-4BE-snippet.UTF-8
│ │ │ ├── UCS-4LE-snippet
│ │ │ ├── UCS-4LE-snippet.UTF-8
│ │ │ ├── UTF-16-snippet
│ │ │ ├── UTF-16-snippet.UTF-8
│ │ │ ├── UTF-16BE-snippet
│ │ │ ├── UTF-16BE-snippet.UTF-8
│ │ │ ├── UTF-16LE-snippet
│ │ │ ├── UTF-16LE-snippet.UTF-8
│ │ │ ├── UTF-32-snippet
│ │ │ ├── UTF-32-snippet.UTF-8
│ │ │ ├── UTF-32BE-snippet
│ │ │ ├── UTF-32BE-snippet.UTF-8
│ │ │ ├── UTF-32LE-snippet
│ │ │ ├── UTF-32LE-snippet.UTF-8
│ │ │ ├── UTF-7-snippet
│ │ │ ├── UTF-7-snippet.UTF-8
│ │ │ ├── VISCII.TXT
│ │ │ ├── check-stateful
│ │ │ ├── check-stateful.bat
│ │ │ ├── check-stateless
│ │ │ ├── check-stateless.bat
│ │ │ ├── check-subst
│ │ │ ├── check-translit
│ │ │ ├── check-translit.bat
│ │ │ ├── check-translitfailure
│ │ │ ├── gengb18030z.c
│ │ │ ├── genutf8.c
│ │ │ ├── table-from.c
│ │ │ ├── table-to.c
│ │ │ ├── test-shiftseq.c
│ │ │ ├── test-to-wchar.c
│ │ │ └── uniq-u.c
│ │ ├── tools/
│ │ │ ├── 8bit_tab_to_h.c
│ │ │ ├── CP50221-0208-EXT.TXT
│ │ │ ├── CP50221-0212-EXT.TXT
│ │ │ ├── JISX0213.TXT
│ │ │ ├── Makefile
│ │ │ ├── cjk_tab_to_h.c
│ │ │ └── cjk_variants.c
│ │ ├── windows/
│ │ │ ├── iconv.rc
│ │ │ ├── libiconv.rc
│ │ │ └── windres-options
│ │ └── woe32dll/
│ │ ├── export.h
│ │ └── iconv-exports.c
│ ├── zbar/
│ │ ├── Makefile.am.inc
│ │ ├── config.c
│ │ ├── convert.c
│ │ ├── debug.h
│ │ ├── decoder/
│ │ │ ├── codabar.c
│ │ │ ├── codabar.h
│ │ │ ├── code128.c
│ │ │ ├── code128.h
│ │ │ ├── code39.c
│ │ │ ├── code39.h
│ │ │ ├── code93.c
│ │ │ ├── code93.h
│ │ │ ├── databar.c
│ │ │ ├── databar.h
│ │ │ ├── ean.c
│ │ │ ├── ean.h
│ │ │ ├── i25.c
│ │ │ ├── i25.h
│ │ │ ├── pdf417.c
│ │ │ ├── pdf417.h
│ │ │ ├── pdf417_hash.h
│ │ │ ├── qr_finder.c
│ │ │ └── qr_finder.h
│ │ ├── decoder.c
│ │ ├── decoder.h
│ │ ├── error.c
│ │ ├── error.h
│ │ ├── event.h
│ │ ├── image.c
│ │ ├── image.h
│ │ ├── img_scanner.c
│ │ ├── img_scanner.h
│ │ ├── jpeg.c
│ │ ├── libzbar.rc
│ │ ├── mutex.h
│ │ ├── processor/
│ │ │ ├── lock.c
│ │ │ ├── null.c
│ │ │ ├── posix.c
│ │ │ ├── posix.h
│ │ │ ├── win.c
│ │ │ └── x.c
│ │ ├── processor.c
│ │ ├── processor.h
│ │ ├── qrcode/
│ │ │ ├── bch15_5.c
│ │ │ ├── bch15_5.h
│ │ │ ├── binarize.c
│ │ │ ├── binarize.h
│ │ │ ├── isaac.c
│ │ │ ├── isaac.h
│ │ │ ├── qrdec.c
│ │ │ ├── qrdec.h
│ │ │ ├── qrdectxt.c
│ │ │ ├── rs.c
│ │ │ ├── rs.h
│ │ │ ├── util.c
│ │ │ └── util.h
│ │ ├── qrcode.h
│ │ ├── refcnt.c
│ │ ├── refcnt.h
│ │ ├── scanner.c
│ │ ├── svg.c
│ │ ├── svg.h
│ │ ├── symbol.c
│ │ ├── symbol.h
│ │ ├── thread.h
│ │ ├── timer.h
│ │ ├── video/
│ │ │ ├── null.c
│ │ │ ├── v4l.c
│ │ │ ├── v4l1.c
│ │ │ ├── v4l2.c
│ │ │ └── vfw.c
│ │ ├── video.c
│ │ ├── video.h
│ │ ├── window/
│ │ │ ├── dib.c
│ │ │ ├── null.c
│ │ │ ├── vfw.c
│ │ │ ├── win.c
│ │ │ ├── win.h
│ │ │ ├── x.c
│ │ │ ├── x.h
│ │ │ ├── ximage.c
│ │ │ └── xv.c
│ │ ├── window.c
│ │ └── window.h
│ └── zbarjni.c
├── zbardemo/
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── cn/
│ │ └── bingoogolapple/
│ │ └── qrcode/
│ │ └── zbardemo/
│ │ ├── MainActivity.java
│ │ └── TestScanActivity.java
│ └── res/
│ ├── drawable/
│ │ └── selector_btn_orange.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── activity_test_scan.xml
│ │ ├── toolbar.xml
│ │ └── view_control.xml
│ └── values/
│ ├── colors.xml
│ ├── strings.xml
│ ├── styles.xml
│ └── styles_base.xml
├── zxing/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── cn/
│ └── bingoogolapple/
│ └── qrcode/
│ └── zxing/
│ ├── QRCodeDecoder.java
│ ├── QRCodeEncoder.java
│ └── ZXingView.java
└── zxingdemo/
├── build.gradle
├── proguard-rules.pro
└── src/
└── main/
├── AndroidManifest.xml
├── java/
│ └── cn/
│ └── bingoogolapple/
│ └── qrcode/
│ └── zxingdemo/
│ ├── MainActivity.java
│ ├── RotateTest.java
│ ├── TestGeneratectivity.java
│ └── TestScanActivity.java
└── res/
├── drawable/
│ └── selector_btn_orange.xml
├── layout/
│ ├── activity_main.xml
│ ├── activity_test_generate.xml
│ ├── activity_test_scan.xml
│ ├── toolbar.xml
│ └── view_control.xml
└── values/
├── colors.xml
├── strings.xml
├── styles.xml
└── styles_base.xml
Copy disabled (too large)
Download .json
Condensed preview — 1186 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (24,537K chars).
[
{
"path": ".gitignore",
"chars": 527,
"preview": "# Built application files\n*.apk\n*.ap_\n\n# Files for the Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbi"
},
{
"path": "README.md",
"chars": 12273,
"preview": ":running:BGAQRCode-Android:running:\n============\n\n## 目录\n* [功能介绍](#功能介绍)\n* [常见问题](#常见问题)\n* [效果图与示例 apk](#效果图与示例-apk)\n* [G"
},
{
"path": "assembleDebug.sh",
"chars": 84,
"preview": "#!/bin/bash +x\n\n./gradlew :zxingdemo:assembleDebug\n./gradlew :zbardemo:assembleDebug"
},
{
"path": "build.gradle",
"chars": 513,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n r"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 232,
"preview": "#Sun Nov 10 17:04:31 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
},
{
"path": "gradle.properties",
"chars": 135,
"preview": "ANDROID_BUILD_MIN_SDK_VERSION=14\nANDROID_BUILD_TARGET_SDK_VERSION=28\nANDROID_BUILD_SDK_VERSION=28\n\nVERSION_NAME=1.3.8\nVE"
},
{
"path": "gradlew",
"chars": 5080,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "gradlew.bat",
"chars": 2314,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "qrcodecore/build.gradle",
"chars": 306,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\n\nandroid {\n compileSdkVersion "
},
{
"path": "qrcodecore/src/main/AndroidManifest.xml",
"chars": 479,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"cn.bingoogolapple.qrcode.core\">\n\n <"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/BGAQRCodeUtil.java",
"chars": 7317,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport an"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/BarcodeType.java",
"chars": 536,
"preview": "package cn.bingoogolapple.qrcode.core;\n\n/**\n * 作者:王浩\n * 创建时间:2018/6/20\n * 描述:识别的格式\n */\npublic enum BarcodeType {\n /**"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/CameraConfigurationManager.java",
"chars": 7920,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.content.Context;\nimport android.graphics.Point;\nimport android.ha"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/CameraPreview.java",
"chars": 11462,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ProcessDataTask.java",
"chars": 4503,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.graphics.Bitmap;\nimport android.hardware.Camera;\nimport android.o"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/QRCodeView.java",
"chars": 19355,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdap"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ScanBoxView.java",
"chars": 37651,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport an"
},
{
"path": "qrcodecore/src/main/java/cn/bingoogolapple/qrcode/core/ScanResult.java",
"chars": 406,
"preview": "package cn.bingoogolapple.qrcode.core;\n\nimport android.graphics.PointF;\n\n/**\n * 作者:王浩\n * 创建时间:2018/6/15\n * 描述:\n */\npubli"
},
{
"path": "qrcodecore/src/main/res/values/attrs.xml",
"chars": 3969,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"QRCodeView\">\n <!-- 扫描框距离toolbar底部"
},
{
"path": "qrcodecore/src/main/res/values/ids.xml",
"chars": 116,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item type=\"id\" name=\"bgaqrcode_camera_preview\" />\n</resources>"
},
{
"path": "settings.gradle",
"chars": 68,
"preview": "include ':qrcodecore', ':zxing', ':zbar', ':zxingdemo', ':zbardemo'\n"
},
{
"path": "zbar/build.gradle",
"chars": 1040,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\n\nandroid {\n compileSdkVersion "
},
{
"path": "zbar/consumer-proguard-rules.pro",
"chars": 195,
"preview": "-keep class net.sourceforge.zbar.ImageScanner { *; }\n-keep class net.sourceforge.zbar.Image { *; }\n-keep class net.sourc"
},
{
"path": "zbar/src/main/AndroidManifest.xml",
"chars": 51,
"preview": "<manifest package=\"cn.bingoogolapple.qrcode.zbar\"/>"
},
{
"path": "zbar/src/main/java/cn/bingoogolapple/qrcode/zbar/BarcodeFormat.java",
"chars": 4902,
"preview": "package cn.bingoogolapple.qrcode.zbar;\n\nimport net.sourceforge.zbar.Symbol;\n\nimport java.util.ArrayList;\nimport java.uti"
},
{
"path": "zbar/src/main/java/cn/bingoogolapple/qrcode/zbar/ZBarView.java",
"chars": 5577,
"preview": "package cn.bingoogolapple.qrcode.zbar;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.g"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/Config.java",
"chars": 2100,
"preview": "/*------------------------------------------------------------------------\n * Config\n *\n * Copyright 2010 (c) Jeff Bro"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/Image.java",
"chars": 4443,
"preview": "/*------------------------------------------------------------------------\n * Image\n *\n * Copyright 2007-2010 (c) Jeff"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/ImageScanner.java",
"chars": 3084,
"preview": "/*------------------------------------------------------------------------\n * ImageScanner\n *\n * Copyright 2007-2010 ("
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/Modifier.java",
"chars": 1524,
"preview": "/*------------------------------------------------------------------------\n * Modifier\n *\n * Copyright 2010 (c) Jeff B"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/Orientation.java",
"chars": 1605,
"preview": "/*------------------------------------------------------------------------\n * Orientation\n *\n * Copyright 2010 (c) Jef"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/Symbol.java",
"chars": 6396,
"preview": "/*------------------------------------------------------------------------\n * Symbol\n *\n * Copyright 2007-2010 (c) Jef"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/SymbolIterator.java",
"chars": 2230,
"preview": "/*------------------------------------------------------------------------\n * SymbolIterator\n *\n * Copyright 2007-2010"
},
{
"path": "zbar/src/main/java/net/sourceforge/zbar/SymbolSet.java",
"chars": 2488,
"preview": "/*------------------------------------------------------------------------\n * SymbolSet\n *\n * Copyright 2007-2010 (c) "
},
{
"path": "zbar/src/main/jni/Android.mk",
"chars": 1655,
"preview": "#\n# Android NDK makefile \n#\n# build - <ndk path>/ndk-build ICONV_SRC=<iconv library src> \n# clean - <ndk path>/ndk-buil"
},
{
"path": "zbar/src/main/jni/Application.mk",
"chars": 15,
"preview": "APP_ABI := all\n"
},
{
"path": "zbar/src/main/jni/config.h",
"chars": 6691,
"preview": "/* manually customized for iPhone platform */\n\n#define HAVE_LANGINFO_CODESET 0\n\n/* whether to build support for Code 128"
},
{
"path": "zbar/src/main/jni/include/Makefile.am.inc",
"chars": 459,
"preview": "zincludedir = $(includedir)/zbar\ninclude_HEADERS = include/zbar.h\nzinclude_HEADERS = include/zbar/Scanner.h include/zbar"
},
{
"path": "zbar/src/main/jni/include/zbar/Decoder.h",
"chars": 5680,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Exception.h",
"chars": 4624,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Image.h",
"chars": 8853,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/ImageScanner.h",
"chars": 3755,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Processor.h",
"chars": 6971,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/QZBar.h",
"chars": 5016,
"preview": "//------------------------------------------------------------------------\n// Copyright 2008-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/QZBarImage.h",
"chars": 2159,
"preview": "//------------------------------------------------------------------------\n// Copyright 2008-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Scanner.h",
"chars": 4197,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Symbol.h",
"chars": 12766,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Video.h",
"chars": 4445,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/Window.h",
"chars": 3741,
"preview": "//------------------------------------------------------------------------\n// Copyright 2007-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar/zbargtk.h",
"chars": 6445,
"preview": "/*------------------------------------------------------------------------\n * Copyright 2008-2009 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/include/zbar.h",
"chars": 53763,
"preview": "/*------------------------------------------------------------------------\n * Copyright 2007-2010 (c) Jeff Brown <spadi"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/ABOUT-NLS",
"chars": 94012,
"preview": "1 Notes on the Free Translation Project\n***************************************\n\nFree software is going international! "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/AUTHORS",
"chars": 31,
"preview": "Bruno Haible <bruno@clisp.org>\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/COPYING",
"chars": 35147,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/COPYING.LIB",
"chars": 25291,
"preview": "\t\t GNU LIBRARY GENERAL PUBLIC LICENSE\n\t\t Version 2, June 1991\n\n Copyright (C) 1991 Free Software Foundation, Inc."
},
{
"path": "zbar/src/main/jni/libiconv-1.15/ChangeLog",
"chars": 204303,
"preview": "2017-01-30 Bruno Haible <bruno@clisp.org>\n\n\tPrepare for version 1.15.\n\t* src/iconv.c (print_version): Update copyright"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/DEPENDENCIES",
"chars": 67,
"preview": "No packages need to be installed before GNU libiconv is installed.\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/DESIGN",
"chars": 3371,
"preview": "While some other iconv(3) implementations - like FreeBSD iconv(3) - choose\nthe \"many small shared libraries\" and dlopen("
},
{
"path": "zbar/src/main/jni/libiconv-1.15/HACKING",
"chars": 1702,
"preview": "All you need to know when hacking (modifying) GNU libiconv or when building\nit off the Git repository.\n\n\nRequirements\n=="
},
{
"path": "zbar/src/main/jni/libiconv-1.15/INSTALL.generic",
"chars": 11733,
"preview": "Basic Installation\n==================\n\n These are generic installation instructions.\n\n The `configure' shell script "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/Makefile",
"chars": 12070,
"preview": "# Makefile for libiconv\n\n#### Start of system configuration section. ####\n\n# Directories used by \"make\":\nsrcdir = .\n\n# D"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/Makefile.devel",
"chars": 9552,
"preview": "# -*- makefile -*-\n# This is the developer's makefile, not the user's makefile.\n# Don't use it unless you know exactly w"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/Makefile.in",
"chars": 12068,
"preview": "# Makefile for libiconv\n\n#### Start of system configuration section. ####\n\n# Directories used by \"make\":\nsrcdir = @srcdi"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/NEWS",
"chars": 8363,
"preview": "New in 1.15:\n* The UTF-8 converter now rejects surrogates and out-of-range code points.\n* Added ISO-2022-JP-MS converter"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/NOTES",
"chars": 17472,
"preview": "Q: Why does libiconv support encoding XXX? Why does libiconv not support\n encoding ZZZ?\n\nA: libiconv, as an internatio"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/README",
"chars": 5801,
"preview": " GNU LIBICONV - character set conversion library\n\nThis library provides an iconv() implementation, for use on"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/README.djgpp",
"chars": 51,
"preview": "Installation on DJGPP:\n\nSee the file djgpp/README.\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/README.windows",
"chars": 10367,
"preview": "Installation on Microsoft Windows:\n\nThere are three ways to create binaries of this package for Microsoft Windows:\n1) Na"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/THANKS",
"chars": 521,
"preview": " Thanks to for\n\nEdmund Grimley Evans <edmundo@rano.org> bug reports\n\nTaro M"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/aclocal.m4",
"chars": 46793,
"preview": "# generated automatically by aclocal 1.15 -*- Autoconf -*-\n\n# Copyright (C) 1996-2014 Free Software Foundation, Inc.\n\n# "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/ar-lib",
"chars": 5826,
"preview": "#! /bin/sh\n# Wrapper for Microsoft lib.exe\n\nme=ar-lib\nscriptversion=2012-03-01.08; # UTC\n\n# Copyright (C) 2010-2014 Free"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/compile",
"chars": 7333,
"preview": "#! /bin/sh\n# Wrapper for compilers which do not understand '-c -o'.\n\nscriptversion=2012-10-14.11; # UTC\n\n# Copyright (C)"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/config.guess",
"chars": 43940,
"preview": "#! /bin/sh\n# Attempt to guess a canonical system name.\n# Copyright 1992-2017 Free Software Foundation, Inc.\n\ntimestamp"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/config.libpath",
"chars": 4134,
"preview": "#! /bin/sh\n# Output a system dependent set of variables, describing how to set the\n# run time search path of shared libr"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/config.rpath",
"chars": 18574,
"preview": "#! /bin/sh\n# Output a system dependent set of variables, describing how to set the\n# run time search path of shared libr"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/config.sub",
"chars": 36383,
"preview": "#! /bin/sh\n# Configuration validation subroutine script.\n# Copyright 1992-2017 Free Software Foundation, Inc.\n\ntimesta"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/install-reloc",
"chars": 8781,
"preview": "#!/bin/sh\n# install-reloc - install a program including a relocating wrapper\n# Copyright (C) 2003-2017 Free Software Fou"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/install-sh",
"chars": 14675,
"preview": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2013-12-25.23; # UTC\n\n# This originates from"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/ltmain.sh",
"chars": 324089,
"preview": "#! /bin/sh\n## DO NOT EDIT - This file generated from ./build-aux/ltmain.in\n## by inline-source v2014-01-03"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/missing",
"chars": 6872,
"preview": "#! /bin/sh\n# Common wrapper for a few potentially missing GNU programs.\n\nscriptversion=2013-10-28.13; # UTC\n\n# Copyright"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/mkinstalldirs",
"chars": 3423,
"preview": "#! /bin/sh\n# mkinstalldirs --- make directory hierarchy\n\nscriptversion=2005-02-02.21\n\n# Original author: Noah Friedman <"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/reloc-ldflags",
"chars": 3306,
"preview": "#! /bin/sh\n# Output a system dependent linker command for putting a relocatable library\n# search path into an executable"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/snippet/_Noreturn.h",
"chars": 306,
"preview": "#if !defined _Noreturn && __STDC_VERSION__ < 201112\n# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \\\n "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/snippet/arg-nonnull.h",
"chars": 1216,
"preview": "/* A C macro for declaring that specific arguments must not be NULL.\n Copyright (C) 2009-2017 Free Software Foundation"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/snippet/c++defs.h",
"chars": 14421,
"preview": "/* C++ compatible function declaration macros.\n Copyright (C) 2010-2017 Free Software Foundation, Inc.\n\n This progra"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/build-aux/snippet/warn-on-use.h",
"chars": 5127,
"preview": "/* A C macro for emitting warnings if a function is used.\n Copyright (C) 2010-2017 Free Software Foundation, Inc.\n\n "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/config.h",
"chars": 41039,
"preview": "/* config.h. Generated from config.h.in by configure. */\n/* config.h.in. Generated from configure.ac by autoheader. "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/config.h.in",
"chars": 39716,
"preview": "/* config.h.in. Generated from configure.ac by autoheader. */\n\n/* Define to the number of bits in type 'ptrdiff_t'. */"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/config.status",
"chars": 95056,
"preview": "#! /bin/sh\n# Generated by configure.\n# Run this file to recreate the current configuration.\n# Compiler output produced b"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/configure",
"chars": 772822,
"preview": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69 for libi"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/configure.ac",
"chars": 6019,
"preview": "dnl Copyright (C) 1999-2011, 2016 Free Software Foundation, Inc.\ndnl This file is part of the GNU LIBICONV Library.\ndnl\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/Makefile.maint",
"chars": 1149,
"preview": "# Maintainer's Makefile -*-Makefile-*-\n\ntop_srcdir = ..\nsrcdir = .\n\nSHELL = /bin"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/README",
"chars": 5385,
"preview": "This is a port of GNU Libiconv 1.11 to MSDOS/DJGPP.\n\n1.: DJGPP specific changes.\n =======================\n "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/README.in",
"chars": 5327,
"preview": "This is a port of GNU Libiconv @VER@ to MSDOS/DJGPP.\n\n1.: DJGPP specific changes.\n =======================\n "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/config.bat",
"chars": 19840,
"preview": "@echo off\nRem Configure libiconv for DJGPP.\n\nRem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line\nR"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/config.sed",
"chars": 6550,
"preview": "# DJGPP specific configuration file.\n# Sed script for additional DJGPP specific editing\n# of the configure script genera"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/config.site",
"chars": 2195,
"preview": "#! /bin/sh\n\n# This is the config.site file for configuring GNU packages\n# which are to be built with DJGPP tools.\n\n\n# In"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/edtest.bat",
"chars": 1430,
"preview": "@echo off\nif \"%XSRC%\" == \"\" set XSRC=.\ntest -f %XSRC%/tests/stateful-check.org\nif errorlevel 1 update %XSRC%/tests/state"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/fnchange.in",
"chars": 15877,
"preview": "@V@/config.h.in @V@/config.h-in\n@V@/config.h.msvc @V@/"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/fnchange.lst",
"chars": 21063,
"preview": "libiconv-1.11/include/iconv.h.msvc-static libiconv-1.11/include/iconv_h.static-msvc\nlibiconv-1.11/inclu"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/makefile.sed",
"chars": 817,
"preview": "# Fixes for lib/Makefile.in\ns|encodings\\.def|encodings/&|g\ns|encodings_aix\\.def|encodings/aix.def|g\ns|encodings_dos\\.def"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/sources.sed",
"chars": 1768,
"preview": "# Fixes for lib/iconv.c.\n# All encodings files recide in encdings dir now.\n/^#[ \t]*include/ s|\"canonical\\.h|\"canonical/c"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/stateful-check.sed",
"chars": 388,
"preview": "# Sed script for tests/stateful-check editing.\n\n/charsetf=/ a\\\n\\\n# For systems with severe filename restrictions allow f"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/stateless-check.sed",
"chars": 918,
"preview": "# Sed script for tests/stateless-check editing.\n\n/charsetf=/ a\\\n\\\n# For systems with severe filename restrictions\\\n# all"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/djgpp/translit-check.sed",
"chars": 365,
"preview": "# Sed script for tests/translit-check editing.\n\n/\\.\\./ i\\\n# For systems with severe filename restrictions allow for\\\n# a"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/doc/relocatable.texi",
"chars": 2941,
"preview": "@node Enabling Relocatability\n@section Enabling Relocatability\n\nIt has been a pain for many users of GNU packages for a "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/extras/ChangeLog",
"chars": 2332,
"preview": "2011-06-04 Bruno Haible <bruno@clisp.org>\n\n\t* iconv_string.c (iconv_string): Treat incomplete byte sequence like\n\tinva"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/extras/iconv_string.c",
"chars": 4503,
"preview": "/* Copyright (C) 1999-2001, 2003, 2011 Bruno Haible.\n This file is not part of the GNU LIBICONV Library.\n This file "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/extras/iconv_string.h",
"chars": 1735,
"preview": "/* Copyright (C) 1999-2001 Bruno Haible.\n This file is not part of the GNU LIBICONV Library.\n This file is put into "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/alloca.in.h",
"chars": 2297,
"preview": "/* Memory allocation on the stack.\n Copyright (C) 1995, 1999, 2001-2007 Free Software Foundation, Inc.\n\n This progra"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/error.h.diff",
"chars": 1271,
"preview": "*** gnulib/lib/error.h\t2005-05-14 08:03:58.000000000 +0200\n--- srclib/error.h\t2005-05-20 23:06:02.000000000 +0200\n******"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/progname.h.diff",
"chars": 581,
"preview": "*** gnulib/lib/progname.h\t2005-05-14 08:03:58.000000000 +0200\n--- srclib/progname.h\t2005-05-20 23:06:02.000000000 +0200\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/xalloc.h",
"chars": 5195,
"preview": "/* malloc with out of memory checking.\n Copyright (C) 2001-2004, 2006 Free Software Foundation, Inc.\n Written by Bru"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/xmalloc.c",
"chars": 2751,
"preview": "/* xmalloc.c -- malloc with out of memory checking\n Copyright (C) 1990-1996, 2000-2003, 2005-2007 Free Software Founda"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/lib/xstrdup.c",
"chars": 1206,
"preview": "/* xstrdup.c -- copy a string with out of memory checking\n Copyright (C) 1990, 1996, 2000-2003, 2005-2006 Free Softwar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/m4/alloca.m4",
"chars": 1050,
"preview": "# alloca.m4 serial 4 (gettext-0.18.2)\ndnl Copyright (C) 2002-2003, 2006, 2011 Free Software Foundation, Inc.\ndnl This fi"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/modules/libiconv-misc",
"chars": 223,
"preview": "Description:\n\nFiles:\n\nDepends-on:\n\nconfigure.ac:\n\nMakefile.am:\n# Parametrization of the 'relocatable' module.\nAM_CPPFLAG"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/modules/mbstate",
"chars": 165,
"preview": "Description:\nmbstate_t type.\n\nFiles:\nm4/mbstate_t.m4\n\nDepends-on:\n\nconfigure.ac:\nAC_TYPE_MBSTATE_T\n\nMakefile.am:\n\nInclud"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/gnulib-local/modules/xalloc",
"chars": 247,
"preview": "Description:\nMemory allocation with out-of-memory checking.\n\nFiles:\nlib/xalloc.h\nlib/xmalloc.c\nlib/xstrdup.c\n\nDepends-on"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/include/export.h",
"chars": 160,
"preview": "\n#if @HAVE_VISIBILITY@ && BUILDING_LIBICONV\n#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__(\"default\")))\n#el"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/include/iconv.h",
"chars": 9556,
"preview": "/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc.\n This file is part of the GNU LIBICONV"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/include/iconv.h.build.in",
"chars": 9663,
"preview": "/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc.\n This file is part of the GNU LIBICONV"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/include/iconv.h.in",
"chars": 9305,
"preview": "/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc.\n This file is part of the GNU LIBICONV"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/include/iconv.h.inst",
"chars": 9214,
"preview": "/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc.\n This file is part of the GNU LIBICONV"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/.libs/libiconv.lai",
"chars": 905,
"preview": "# libiconv.la - a libtool library file\n# Generated by libtool (GNU libtool) 2.4.6\n#\n# Please DO NOT delete this file!\n# "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/Makefile",
"chars": 10249,
"preview": "# Makefile for libiconv/lib\n\n#### Start of system configuration section. ####\n\n# Directories used by \"make\":\nsrcdir = .\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/Makefile.in",
"chars": 10272,
"preview": "# Makefile for libiconv/lib\n\n#### Start of system configuration section. ####\n\n# Directories used by \"make\":\nsrcdir = @s"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases.gperf",
"chars": 8286,
"preview": "struct alias { int name; unsigned int encoding_index; };\n%struct-type\n%language=ANSI-C\n%define hash-function-name aliase"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases.h",
"chars": 69896,
"preview": "/* ANSI-C code produced by gperf version 3.0.4 */\n/* Command-line: gperf -m 10 lib/aliases.gperf */\n/* Computed positio"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases2.h",
"chars": 1198,
"preview": "/*\n * Copyright (C) 1999-2003, 2008 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_aix.h",
"chars": 614,
"preview": " S(aix_0, \"CP856\", ei_cp856 )\n S(aix_1, \"CP922\", ei_cp922 )\n S(aix_2, \"CP943\", ei_cp943 )\n S(aix_3, \"CP1046\", ei_cp1"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_aix_sysaix.h",
"chars": 824,
"preview": " S(aix_0, \"CP856\", ei_cp856 )\n S(aix_1, \"IBM-856\", ei_cp856 )\n S(aix_2, \"CP922\", ei_cp922 )\n S(aix_3, \"IBM-922\", ei_"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_dos.h",
"chars": 1567,
"preview": " S(dos_0, \"CP437\", ei_cp437 )\n S(dos_1, \"IBM437\", ei_cp437 )\n S(dos_2, \"437\", ei_cp437 )\n S(dos_3, \"CSPC8CODEPAGE437"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_extra.h",
"chars": 525,
"preview": " S(extra_0, \"EUC-JISX0213\", ei_euc_jisx0213 )\n S(extra_1, \"EUC-JIS-2004\", ei_euc_jisx0213 )\n S(extra_2, \"SHIFT_JISX02"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_osf1.h",
"chars": 80,
"preview": " S(osf1_0, \"DEC-KANJI\", ei_dec_kanji )\n S(osf1_1, \"DEC-HANYU\", ei_dec_hanyu )\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_osf1_sysosf1.h",
"chars": 158,
"preview": " S(osf1_0, \"DEC-KANJI\", ei_dec_kanji )\n S(osf1_1, \"DECKANJI\", ei_dec_kanji )\n S(osf1_2, \"DEC-HANYU\", ei_dec_hanyu )\n "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_sysaix.gperf",
"chars": 8469,
"preview": "struct alias { int name; unsigned int encoding_index; };\n%struct-type\n%language=ANSI-C\n%define hash-function-name aliase"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_sysaix.h",
"chars": 74731,
"preview": "/* ANSI-C code produced by gperf version 3.0.4 */\n/* Command-line: gperf -m 10 lib/aliases_sysaix.gperf */\n/* Computed "
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_syshpux.gperf",
"chars": 8504,
"preview": "struct alias { int name; unsigned int encoding_index; };\n%struct-type\n%language=ANSI-C\n%define hash-function-name aliase"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_syshpux.h",
"chars": 75273,
"preview": "/* ANSI-C code produced by gperf version 3.0.4 */\n/* Command-line: gperf -m 10 lib/aliases_syshpux.gperf */\n/* Computed"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_sysosf1.gperf",
"chars": 8384,
"preview": "struct alias { int name; unsigned int encoding_index; };\n%struct-type\n%language=ANSI-C\n%define hash-function-name aliase"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_sysosf1.h",
"chars": 73887,
"preview": "/* ANSI-C code produced by gperf version 3.0.4 */\n/* Command-line: gperf -m 10 lib/aliases_sysosf1.gperf */\n/* Computed"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_syssolaris.gperf",
"chars": 8417,
"preview": "struct alias { int name; unsigned int encoding_index; };\n%struct-type\n%language=ANSI-C\n%define hash-function-name aliase"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/aliases_syssolaris.h",
"chars": 75111,
"preview": "/* ANSI-C code produced by gperf version 3.0.4 */\n/* Command-line: gperf -m 10 lib/aliases_syssolaris.gperf */\n/* Compu"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/armscii_8.h",
"chars": 4265,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/ascii.h",
"chars": 1222,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/atarist.h",
"chars": 6786,
"preview": "/*\n * Copyright (C) 1999-2005, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5.h",
"chars": 261943,
"preview": "/*\n * Copyright (C) 1999-2001, 2012, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5_2003.h",
"chars": 20029,
"preview": "/*\n * Copyright (C) 1999-2001, 2005, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5hkscs1999.h",
"chars": 5715,
"preview": "/*\n * Copyright (C) 1999-2002, 2006, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5hkscs2001.h",
"chars": 6150,
"preview": "/*\n * Copyright (C) 1999-2002, 2006, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5hkscs2004.h",
"chars": 6528,
"preview": "/*\n * Copyright (C) 1999-2002, 2006, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/big5hkscs2008.h",
"chars": 6904,
"preview": "/*\n * Copyright (C) 1999-2002, 2006, 2010 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/c99.h",
"chars": 3259,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical.h",
"chars": 6764,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str392,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str389"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_aix.h",
"chars": 551,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_1"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_aix_sysaix.h",
"chars": 553,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_2"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_dos.h",
"chars": 926,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_4"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_extra.h",
"chars": 442,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_ext"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_local.h",
"chars": 122,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str193,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str496"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_local_sysaix.h",
"chars": 121,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str15,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str484,"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_local_syshpux.h",
"chars": 122,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str171,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str723"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_local_sysosf1.h",
"chars": 122,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str193,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str457"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_local_syssolaris.h",
"chars": 122,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str112,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str491"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_osf1.h",
"chars": 124,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_osf1_sysosf1.h",
"chars": 124,
"preview": " (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0,\n (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_sysaix.h",
"chars": 6752,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str391,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str282"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_syshpux.h",
"chars": 6770,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str396,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str355"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_sysosf1.h",
"chars": 6764,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str453,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str308"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/canonical_syssolaris.h",
"chars": 6748,
"preview": " (int)(long)&((struct stringpool_t *)0)->stringpool_str239,\n (int)(long)&((struct stringpool_t *)0)->stringpool_str275"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/ces_big5.h",
"chars": 1844,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/ces_gbk.h",
"chars": 1721,
"preview": "/*\n * Copyright (C) 1999-2001, 2005, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/charset.alias",
"chars": 616,
"preview": "# This file contains a table of character encoding aliases,\n# suitable for operating system 'darwin16.6.0'.\n# It was aut"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cjk_variants.h",
"chars": 253728,
"preview": "/*\n * Copyright (C) 1999-2001 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n * The"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643.h",
"chars": 1437,
"preview": "/*\n * Copyright (C) 1999-2001 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n * The"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_1.h",
"chars": 51942,
"preview": "/*\n * Copyright (C) 1999-2005, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_15.h",
"chars": 64223,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_2.h",
"chars": 65779,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_3.h",
"chars": 57287,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_4.h",
"chars": 1910,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_4a.h",
"chars": 27438,
"preview": "/*\n * Copyright (C) 1999-2002 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n * The"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_4b.h",
"chars": 40114,
"preview": "/*\n * Copyright (C) 1999-2002 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n * The"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_5.h",
"chars": 76028,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_6.h",
"chars": 57199,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_7.h",
"chars": 58415,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cns11643_inv.h",
"chars": 957190,
"preview": "/*\n * Copyright (C) 1999-2005, 2012, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Librar"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/config.h",
"chars": 2818,
"preview": "/* lib/config.h. Generated from config.h.in by configure. */\n/* Copyright (C) 1999-2003, 2005, 2007, 2010, 2012 Free S"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/config.h.in",
"chars": 2688,
"preview": "/* Copyright (C) 1999-2003, 2005, 2007, 2010, 2012 Free Software Foundation, Inc.\n This file is part of the GNU LIBICO"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/converters.h",
"chars": 8045,
"preview": "/*\n * Copyright (C) 1999-2002, 2004-2011, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV L"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1046.h",
"chars": 6676,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1124.h",
"chars": 3915,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1125.h",
"chars": 5441,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1129.h",
"chars": 5118,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1131.h",
"chars": 5653,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1133.h",
"chars": 3651,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1161.h",
"chars": 2741,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1162.h",
"chars": 1801,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1163.h",
"chars": 1783,
"preview": "/*\n * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1250.h",
"chars": 5618,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
},
{
"path": "zbar/src/main/jni/libiconv-1.15/lib/cp1251.h",
"chars": 5048,
"preview": "/*\n * Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc.\n * This file is part of the GNU LIBICONV Library.\n *\n"
}
]
// ... and 986 more files (download for full content)
About this extraction
This page contains the full source code of the bingoogolapple/BGAQRCode-Android GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1186 files (21.4 MB), approximately 5.7M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.