Browse Source

added code points support

pull/9/head
Khoren Markosyan 2 years ago
parent
commit
70a1164181
  1. 3
      .vscode/settings.json
  2. 49
      ios/Classes/src/native_zxing.cpp
  3. 15
      ios/Classes/src/native_zxing.h
  4. 28
      lib/generated_bindings.dart
  5. 2
      lib/src/ui/reader_widget.dart
  6. 1
      lib/src/utils/extentions.dart
  7. 2
      zxscanner/pubspec.lock

3
.vscode/settings.json vendored

@ -4,6 +4,7 @@
"__config": "cpp", "__config": "cpp",
"__nullptr": "cpp", "__nullptr": "cpp",
"codecvt": "cpp", "codecvt": "cpp",
"cmath": "cpp" "cmath": "cpp",
"array": "cpp"
} }
} }

49
ios/Classes/src/native_zxing.cpp

@ -34,28 +34,18 @@ extern "C"
auto *data = new uint8_t[length]; auto *data = new uint8_t[length];
memcpy(data, bytes, length); memcpy(data, bytes, length);
BarcodeFormats formats = BarcodeFormat(format);
DecodeHints hints = DecodeHints().setTryHarder(false).setTryRotate(true).setFormats(formats);
ImageView image{data, width, height, ImageFormat::Lum}; ImageView image{data, width, height, ImageFormat::Lum};
if (cropWidth > 0 && cropHeight > 0 && cropWidth < width && cropHeight < height) if (cropWidth > 0 && cropHeight > 0 && cropWidth < width && cropHeight < height)
{ {
image = image.cropped(width / 2 - cropWidth / 2, height / 2 - cropHeight / 2, cropWidth, cropHeight); image = image.cropped(width / 2 - cropWidth / 2, height / 2 - cropHeight / 2, cropWidth, cropHeight);
} }
DecodeHints hints = DecodeHints().setTryHarder(false).setTryRotate(true).setFormats(BarcodeFormat(format));
Result result = ReadBarcode(image, hints); Result result = ReadBarcode(image, hints);
struct CodeResult code = {false, nullptr}; struct CodeResult code = {false, nullptr};
if (result.isValid()) if (result.isValid())
{ {
code.isValid = result.isValid(); resultToCodeResult(&code, result);
code.format = Format(static_cast<int>(result.format()));
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string text = converter.to_bytes(result.text());
code.text = new char[text.length() + 1];
strcpy(code.text, text.c_str());
platform_log("Result: %s\n", code.text);
} }
int evalInMillis = static_cast<int>(get_now() - start); int evalInMillis = static_cast<int>(get_now() - start);
@ -72,13 +62,12 @@ extern "C"
auto *data = new uint8_t[length]; auto *data = new uint8_t[length];
memcpy(data, bytes, length); memcpy(data, bytes, length);
BarcodeFormats formats = BarcodeFormat(format);
DecodeHints hints = DecodeHints().setTryHarder(false).setTryRotate(true).setFormats(formats);
ImageView image{data, width, height, ImageFormat::Lum}; ImageView image{data, width, height, ImageFormat::Lum};
if (cropWidth > 0 && cropHeight > 0 && cropWidth < width && cropHeight < height) if (cropWidth > 0 && cropHeight > 0 && cropWidth < width && cropHeight < height)
{ {
image = image.cropped(width / 2 - cropWidth / 2, height / 2 - cropHeight / 2, cropWidth, cropHeight); image = image.cropped(width / 2 - cropWidth / 2, height / 2 - cropHeight / 2, cropWidth, cropHeight);
} }
DecodeHints hints = DecodeHints().setTryHarder(false).setTryRotate(true).setFormats(BarcodeFormat(format));
Results results = ReadBarcodes(image, hints); Results results = ReadBarcodes(image, hints);
auto *codes = new struct CodeResult[results.size()]; auto *codes = new struct CodeResult[results.size()];
@ -88,18 +77,9 @@ extern "C"
struct CodeResult code = {false, nullptr}; struct CodeResult code = {false, nullptr};
if (result.isValid()) if (result.isValid())
{ {
code.isValid = result.isValid(); resultToCodeResult(&code, result);
code.format = Format(static_cast<int>(result.format()));
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string text = converter.to_bytes(result.text());
code.text = new char[text.length() + 1];
strcpy(code.text, text.c_str());
codes[i] = code; codes[i] = code;
i++; i++;
platform_log("Result: %s\n", code.text);
} }
} }
@ -133,4 +113,25 @@ extern "C"
platform_log("Encode Barcode in: %d ms\n", evalInMillis); platform_log("Encode Barcode in: %d ms\n", evalInMillis);
return result; return result;
} }
FUNCTION_ATTRIBUTE
void resultToCodeResult(struct CodeResult *code, Result result)
{
code->isValid = result.isValid();
code->format = Format(static_cast<int>(result.format()));
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string text = converter.to_bytes(result.text());
code->text = new char[text.length() + 1];
strcpy(code->text, text.c_str());
auto p = result.position();
auto tl = p.topLeft();
auto tr = p.topRight();
auto bl = p.bottomLeft();
auto br = p.bottomRight();
code->pos = new Pos{tl.x, tl.y, tr.x, tr.y, bl.x, bl.y, br.x, br.y};
platform_log("Result: %s\n", code->text);
}
} }

15
ios/Classes/src/native_zxing.h

@ -28,11 +28,24 @@ extern "C"
Any = OneDCodes | TwoDCodes, Any = OneDCodes | TwoDCodes,
}; };
struct Pos
{
int topLeftX;
int topLeftY;
int topRightX;
int topRightY;
int bottomLeftX;
int bottomLeftY;
int bottomRightX;
int bottomRightY;
};
struct CodeResult struct CodeResult
{ {
int isValid; int isValid;
char *text; char *text;
enum Format format; enum Format format;
struct Pos *pos;
}; };
struct CodeResults struct CodeResults
@ -104,6 +117,8 @@ extern "C"
*/ */
struct EncodeResult encodeBarcode(char *contents, int width, int height, int format, int margin, int eccLevel); struct EncodeResult encodeBarcode(char *contents, int width, int height, int format, int margin, int eccLevel);
void resultToCodeResult(struct CodeResult *code, ZXing::Result result);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

28
lib/generated_bindings.dart

@ -206,6 +206,32 @@ abstract class Format {
static const int Any = 65535; static const int Any = 65535;
} }
class Pos extends ffi.Struct {
@ffi.Int()
external int topLeftX;
@ffi.Int()
external int topLeftY;
@ffi.Int()
external int topRightX;
@ffi.Int()
external int topRightY;
@ffi.Int()
external int bottomLeftX;
@ffi.Int()
external int bottomLeftY;
@ffi.Int()
external int bottomRightX;
@ffi.Int()
external int bottomRightY;
}
class CodeResult extends ffi.Struct { class CodeResult extends ffi.Struct {
@ffi.Int() @ffi.Int()
external int isValid; external int isValid;
@ -214,6 +240,8 @@ class CodeResult extends ffi.Struct {
@ffi.Int32() @ffi.Int32()
external int format; external int format;
external ffi.Pointer<Pos> pos;
} }
class CodeResults extends ffi.Struct { class CodeResults extends ffi.Struct {

2
lib/src/ui/reader_widget.dart

@ -158,7 +158,7 @@ class _ReaderWidgetState extends State<ReaderWidget>
final CodeResult result = await processCameraImage( final CodeResult result = await processCameraImage(
image, image,
format: widget.codeFormat, format: widget.codeFormat,
cropPercent: widget.cropPercent, cropPercent: widget.showCroppingRect ? widget.cropPercent : 0,
); );
if (result.isValidBool) { if (result.isValidBool) {
widget.onScan(result); widget.onScan(result);

1
lib/src/utils/extentions.dart

@ -21,6 +21,7 @@ extension CodeExt on CodeResult {
String? get textString => String? get textString =>
text == nullptr ? null : text.cast<Utf8>().toDartString(); text == nullptr ? null : text.cast<Utf8>().toDartString();
String get formatString => barcodeFormatName(format); String get formatString => barcodeFormatName(format);
Pos get position => pos.ref;
} }
extension EncodeExt on EncodeResult { extension EncodeExt on EncodeResult {

2
zxscanner/pubspec.lock

@ -314,7 +314,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "0.5.0" version: "0.6.0"
font_awesome_flutter: font_awesome_flutter:
dependency: "direct main" dependency: "direct main"
description: description:

Loading…
Cancel
Save