From eccf639bb3b535de05cd55bca837d33a4113f9d9 Mon Sep 17 00:00:00 2001 From: siiky Date: Sat, 22 Apr 2023 02:17:40 +0100 Subject: [PATCH 01/21] Start implementing C wrapper --- wrappers/c/zxing.cpp | 202 +++++++++++++++++++++++++++++++++++++++++++ wrappers/c/zxing.h | 143 ++++++++++++++++++++++++++++++ 2 files changed, 345 insertions(+) create mode 100644 wrappers/c/zxing.cpp create mode 100644 wrappers/c/zxing.h diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp new file mode 100644 index 0000000000..596cb83415 --- /dev/null +++ b/wrappers/c/zxing.cpp @@ -0,0 +1,202 @@ +#include "zxing.h" + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ZXing/ImageView.h + */ + +zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) +{ + ZXing::ImageFormat cppformat = (ZXing::ImageFormat) format; + ZXing::ImageView * cppiv = new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); + return (zxing_ImageView) cppiv; +} + +void zxing_ImageView_free (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + delete cppiv; + //cppiv->~ImageView(); +} + +int zxing_ImageView_width (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + return cppiv->width(); +} + +int zxing_ImageView_height (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + return cppiv->height(); +} + +int zxing_ImageView_pixStride (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + return cppiv->pixStride(); +} + +int zxing_ImageView_rowStride (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + return cppiv->rowStride(); +} + +zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv) +{ + ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; + ZXing::ImageFormat cppformat = cppiv->format(); + return (zxing_ImageFormat) cppformat; +} + +/* + * ... + */ + +/* + * ZXing/BarcodeFormat.h + */ + +zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) +{ + return (zxing_BarcodeFormat) ZXing::BarcodeFormatFromString(std::string(format)); +} + +// TODO: +//zxing_BarcodeFormat zxing_BarcodeFormatsFromString (const char * formats) +//{ +// return (zxing_BarcodeFormat) ZXing::BarcodeFormatsFromString(std::string(formats)); +//} + +/* + * ZXing/DecodeHints.h + */ + +zxing_DecodeHints zxing_DecodeHints_new () +{ + ZXing::DecodeHints * cpphints = new ZXing::DecodeHints(); + return (zxing_DecodeHints) cpphints; +} + +void zxing_DecodeHints_free (zxing_DecodeHints hints) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + delete cpphints; +} + +void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + cpphints->setTryHarder(tryHarder); +} + +void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + cpphints->setTryDownscale(tryDownscale); +} + +void zxing_DecodeHints_setFormats (zxing_DecodeHints hints, zxing_BarcodeFormat formats) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + ZXing::BarcodeFormat cppformats = (ZXing::BarcodeFormat) formats; + cpphints->setFormats(cppformats); +} + +void zxing_DecodeHints_setBinarizer (zxing_DecodeHints hints, zxing_Binarizer binarizer) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + ZXing::Binarizer cppbinarizer = (ZXing::Binarizer) binarizer; + cpphints->setBinarizer(cppbinarizer); +} + +void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints hints, zxing_EanAddOnSymbol eanAddOnSymbol) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + ZXing::EanAddOnSymbol cppeanAddOnSymbol = (ZXing::EanAddOnSymbol) eanAddOnSymbol; + cpphints->setEanAddOnSymbol(cppeanAddOnSymbol); +} + +void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode textMode) +{ + ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; + ZXing::TextMode cpptextMode = (ZXing::TextMode) textMode; + cpphints->setTextMode(cpptextMode); +} + +/* + * ... + */ + +/* + * ZXing/Result.h + */ + +void zxing_Result_free (zxing_Result result) +{ + ZXing::Result * cppresult = (ZXing::Result *) result; + delete cppresult; +} + +bool zxing_Result_isValid (zxing_Result result) +{ + ZXing::Result * cppresult = (ZXing::Result *) result; + return cppresult->isValid(); +} + +zxing_BarcodeFormat zxing_Result_format (zxing_Result result) +{ + ZXing::Result * cppresult = (ZXing::Result *) result; + return (zxing_BarcodeFormat) cppresult->format(); +} + +/* + * ... + */ + +/* + * ZXing/ReadBarcode.h + */ + +zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints) +{ + const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; + // TODO + //zxing.cpp: In function ‘void* zxing_ReadBarcode(zxing_ImageView, zxing_DecodeHints)’: + //zxing.cpp:157:76: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + // 157 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; + const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; + ZXing::Result cppresult = ZXing::ReadBarcode(cppiv, cpphints); + ZXing::Result * cppresultptr = new ZXing::Result(cppresult); + return (zxing_Result) cppresultptr; +} + +zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints) +{ + const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; + // TODO + //zxing.cpp: In function ‘void* zxing_ReadBarcodes(zxing_ImageView, zxing_DecodeHints)’: + //zxing.cpp:173:76: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + // 173 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; + const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; + (void) cppiv; + (void) cpphints; + // TODO + //ZXing::Results * cppresults = new ZXing::ReadBarcodes(cppiv, cpphints); + //return (zxing_Results) cppresults; + return NULL; +} + +#ifdef __cplusplus +} +#endif diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h new file mode 100644 index 0000000000..4e32105776 --- /dev/null +++ b/wrappers/c/zxing.h @@ -0,0 +1,143 @@ +#ifndef _ZXING_C_H +#define _ZXING_C_H + +/* + * + * bool + * + * + * uint8_t + */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ZXing/ImageView.h + */ + +typedef void * zxing_ImageView; + +typedef enum { + zxing_ImageFormat_None = 0, + zxing_ImageFormat_Lum = 0x01000000, + zxing_ImageFormat_RGB = 0x03000102, + zxing_ImageFormat_BGR = 0x03020100, + zxing_ImageFormat_RGBX = 0x04000102, + zxing_ImageFormat_XRGB = 0x04010203, + zxing_ImageFormat_BGRX = 0x04020100, + zxing_ImageFormat_XBGR = 0x04030201, +} zxing_ImageFormat; + +zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); +void zxing_ImageView_free (zxing_ImageView iv); + +int zxing_ImageView_width (zxing_ImageView iv); +int zxing_ImageView_height (zxing_ImageView iv); +int zxing_ImageView_pixStride (zxing_ImageView iv); +int zxing_ImageView_rowStride (zxing_ImageView iv); +zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv); +/* ... */ + +/* + * ZXing/BarcodeFormat.h + */ + +typedef enum { + zxing_BarcodeFormat_None = 0, + zxing_BarcodeFormat_Aztec = (1 << 0), + zxing_BarcodeFormat_Codabar = (1 << 1), + zxing_BarcodeFormat_Code39 = (1 << 2), + zxing_BarcodeFormat_Code93 = (1 << 3), + zxing_BarcodeFormat_Code128 = (1 << 4), + zxing_BarcodeFormat_DataBar = (1 << 5), + zxing_BarcodeFormat_DataBarExpanded = (1 << 6), + zxing_BarcodeFormat_DataMatrix = (1 << 7), + zxing_BarcodeFormat_EAN8 = (1 << 8), + zxing_BarcodeFormat_EAN13 = (1 << 9), + zxing_BarcodeFormat_ITF = (1 << 10), + zxing_BarcodeFormat_MaxiCode = (1 << 11), + zxing_BarcodeFormat_PDF417 = (1 << 12), + zxing_BarcodeFormat_QRCode = (1 << 13), + zxing_BarcodeFormat_UPCA = (1 << 14), + zxing_BarcodeFormat_UPCE = (1 << 15), + zxing_BarcodeFormat_MicroQRCode = (1 << 16), + + zxing_BarcodeFormat_LinearCodes = zxing_BarcodeFormat_Codabar | zxing_BarcodeFormat_Code39 | zxing_BarcodeFormat_Code93 | zxing_BarcodeFormat_Code128 | zxing_BarcodeFormat_EAN8 | zxing_BarcodeFormat_EAN13 | zxing_BarcodeFormat_ITF | zxing_BarcodeFormat_DataBar | zxing_BarcodeFormat_DataBarExpanded | zxing_BarcodeFormat_UPCA | zxing_BarcodeFormat_UPCE, + zxing_BarcodeFormat_MatrixCodes = zxing_BarcodeFormat_Aztec | zxing_BarcodeFormat_DataMatrix | zxing_BarcodeFormat_MaxiCode | zxing_BarcodeFormat_PDF417 | zxing_BarcodeFormat_QRCode | zxing_BarcodeFormat_MicroQRCode, + zxing_BarcodeFormat_Any = zxing_BarcodeFormat_LinearCodes | zxing_BarcodeFormat_MatrixCodes, + + zxing_BarcodeFormat__max = zxing_BarcodeFormat_MicroQRCode, +} zxing_BarcodeFormat; + +zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format); + +// TODO: +//zxing_BarcodeFormat zxing_BarcodesFormatFromString (const char * formats); + +/* + * ZXing/DecodeHints.h + */ + +typedef enum { + zxing_Binarizer_LocalAverage, + zxing_Binarizer_GlobalHistogram, + zxing_Binarizer_FixedThreshold, + zxing_Binarizer_BoolCast, +} zxing_Binarizer; + +typedef enum { + zxing_EanAddOnSymbol_Ignore, + zxing_EanAddOnSymbol_Read, + zxing_EanAddOnSymbol_Require, +} zxing_EanAddOnSymbol; + +typedef enum { + zxing_TextMode_Plain, + zxing_TextMode_ECI, + zxing_TextMode_HRI, + zxing_TextMode_Hex, + zxing_TextMode_Escaped, +} zxing_TextMode; + +typedef void * zxing_DecodeHints; + +zxing_DecodeHints zxing_DecodeHints_new (); +void zxing_DecodeHints_free (zxing_DecodeHints hints); + +void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder); +void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale); +void zxing_DecodeHints_setFormats (zxing_DecodeHints hints, zxing_BarcodeFormat formats); +void zxing_DecodeHints_setBinarizer (zxing_DecodeHints hints, zxing_Binarizer binarizer); +void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints hints, zxing_EanAddOnSymbol eanAddOnSymbol); +void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode textMode); +/* ... */ + +/* + * ZXing/Result.h + */ + +typedef void * zxing_Result; +typedef void * zxing_Results; + +void zxing_Result_free (zxing_Result result); + +bool zxing_Result_isValid (zxing_Result result); +zxing_BarcodeFormat zxing_Result_format (zxing_Result result); +/* ... */ + +/* + * ZXing/ReadBarcode.h + */ + +zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints); +zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZXING_C_H */ From a6e43f50f936603afb64f62266849fd8d4aadc1f Mon Sep 17 00:00:00 2001 From: siiky Date: Sun, 23 Apr 2023 13:46:56 +0100 Subject: [PATCH 02/21] Don't use `void*` --- wrappers/c/zxing.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index 4e32105776..2cc4c45808 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -12,15 +12,30 @@ #include #ifdef __cplusplus + +#include +#include +#include + +typedef ZXing::ImageView * zxing_ImageView; +typedef ZXing::DecodeHints * zxing_DecodeHints; +typedef ZXing::Result * zxing_Result; +typedef ZXing::Results * zxing_Results; + extern "C" { +#else + +typedef struct zxing_ImageView * zxing_ImageView; +typedef struct zxing_DecodeHints * zxing_DecodeHints; +typedef struct zxing_Result * zxing_Result; +typedef struct zxing_Results * zxing_Results; + #endif /* * ZXing/ImageView.h */ -typedef void * zxing_ImageView; - typedef enum { zxing_ImageFormat_None = 0, zxing_ImageFormat_Lum = 0x01000000, @@ -103,8 +118,6 @@ typedef enum { zxing_TextMode_Escaped, } zxing_TextMode; -typedef void * zxing_DecodeHints; - zxing_DecodeHints zxing_DecodeHints_new (); void zxing_DecodeHints_free (zxing_DecodeHints hints); @@ -120,9 +133,6 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode text * ZXing/Result.h */ -typedef void * zxing_Result; -typedef void * zxing_Results; - void zxing_Result_free (zxing_Result result); bool zxing_Result_isValid (zxing_Result result); From 9ca0e255d2044b5db845154eaa3746af5f5c51fa Mon Sep 17 00:00:00 2001 From: siiky Date: Sun, 23 Apr 2023 13:49:33 +0100 Subject: [PATCH 03/21] Remove unnecessary `ifdef`s --- wrappers/c/zxing.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 596cb83415..669fbeffe6 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -6,9 +6,7 @@ #include #include -#ifdef __cplusplus extern "C" { -#endif /* * ZXing/ImageView.h @@ -197,6 +195,4 @@ zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHi return NULL; } -#ifdef __cplusplus } -#endif From 1a3d6366c6965b815b12f6722512a0cd3c4f399c Mon Sep 17 00:00:00 2001 From: siiky Date: Sun, 23 Apr 2023 13:55:18 +0100 Subject: [PATCH 04/21] Use `std::move` to create new copies --- wrappers/c/zxing.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 669fbeffe6..e9be389b0a 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -67,7 +67,7 @@ zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv) zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) { - return (zxing_BarcodeFormat) ZXing::BarcodeFormatFromString(std::string(format)); + return (zxing_BarcodeFormat) ZXing::BarcodeFormatFromString(std::string(format)); } // TODO: @@ -175,7 +175,7 @@ zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHint // 157 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; ZXing::Result cppresult = ZXing::ReadBarcode(cppiv, cpphints); - ZXing::Result * cppresultptr = new ZXing::Result(cppresult); + ZXing::Result * cppresultptr = new ZXing::Result(std::move(cppresult)); return (zxing_Result) cppresultptr; } @@ -187,11 +187,9 @@ zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHi //zxing.cpp:173:76: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] // 173 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; - (void) cppiv; - (void) cpphints; - // TODO - //ZXing::Results * cppresults = new ZXing::ReadBarcodes(cppiv, cpphints); - //return (zxing_Results) cppresults; + ZXing::Results cppresults = ZXing::ReadBarcodes(cppiv, cpphints); + ZXing::Results * cppresultsptr = new ZXing::Results(std::move(cppresults)); + return (zxing_Results) cppresultsptr; return NULL; } From 1e154b7851dac6f05d31a782bba6330cdc5ea850 Mon Sep 17 00:00:00 2001 From: siiky Date: Sun, 23 Apr 2023 13:58:43 +0100 Subject: [PATCH 05/21] Change destructor names from `_free` to `_delete` --- wrappers/c/zxing.cpp | 10 +++++----- wrappers/c/zxing.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index e9be389b0a..44dd0084fe 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -19,7 +19,7 @@ zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height return (zxing_ImageView) cppiv; } -void zxing_ImageView_free (zxing_ImageView iv) +void zxing_ImageView_delete (zxing_ImageView iv) { ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; delete cppiv; @@ -86,7 +86,7 @@ zxing_DecodeHints zxing_DecodeHints_new () return (zxing_DecodeHints) cpphints; } -void zxing_DecodeHints_free (zxing_DecodeHints hints) +void zxing_DecodeHints_delete (zxing_DecodeHints hints) { ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; delete cpphints; @@ -140,10 +140,10 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode text * ZXing/Result.h */ -void zxing_Result_free (zxing_Result result) +void zxing_Result_delete (zxing_Result result) { - ZXing::Result * cppresult = (ZXing::Result *) result; - delete cppresult; + ZXing::Result * cppresult = (ZXing::Result *) result; + delete cppresult; } bool zxing_Result_isValid (zxing_Result result) diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index 2cc4c45808..256542fe2d 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -48,7 +48,7 @@ typedef enum { } zxing_ImageFormat; zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); -void zxing_ImageView_free (zxing_ImageView iv); +void zxing_ImageView_delete (zxing_ImageView iv); int zxing_ImageView_width (zxing_ImageView iv); int zxing_ImageView_height (zxing_ImageView iv); @@ -119,7 +119,7 @@ typedef enum { } zxing_TextMode; zxing_DecodeHints zxing_DecodeHints_new (); -void zxing_DecodeHints_free (zxing_DecodeHints hints); +void zxing_DecodeHints_delete (zxing_DecodeHints hints); void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder); void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale); @@ -133,7 +133,7 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode text * ZXing/Result.h */ -void zxing_Result_free (zxing_Result result); +void zxing_Result_delete (zxing_Result result); bool zxing_Result_isValid (zxing_Result result); zxing_BarcodeFormat zxing_Result_format (zxing_Result result); From 8f0f551ca58b79baced061e6a1c6a140fa914715 Mon Sep 17 00:00:00 2001 From: siiky Date: Sun, 23 Apr 2023 14:16:08 +0100 Subject: [PATCH 06/21] Simplify wrapper code A lot of casts are now unnecessary due to the `typedefs`. --- wrappers/c/zxing.cpp | 77 ++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 57 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 44dd0084fe..f275ff1715 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -15,46 +15,37 @@ extern "C" { zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) { ZXing::ImageFormat cppformat = (ZXing::ImageFormat) format; - ZXing::ImageView * cppiv = new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); - return (zxing_ImageView) cppiv; + return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); } void zxing_ImageView_delete (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - delete cppiv; - //cppiv->~ImageView(); + delete iv; } int zxing_ImageView_width (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - return cppiv->width(); + return iv->width(); } int zxing_ImageView_height (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - return cppiv->height(); + return iv->height(); } int zxing_ImageView_pixStride (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - return cppiv->pixStride(); + return iv->pixStride(); } int zxing_ImageView_rowStride (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - return cppiv->rowStride(); + return iv->rowStride(); } zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv) { - ZXing::ImageView * cppiv = (ZXing::ImageView *) iv; - ZXing::ImageFormat cppformat = cppiv->format(); - return (zxing_ImageFormat) cppformat; + return (zxing_ImageFormat) iv->format(); } /* @@ -82,54 +73,42 @@ zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) zxing_DecodeHints zxing_DecodeHints_new () { - ZXing::DecodeHints * cpphints = new ZXing::DecodeHints(); - return (zxing_DecodeHints) cpphints; + return new ZXing::DecodeHints(); } void zxing_DecodeHints_delete (zxing_DecodeHints hints) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - delete cpphints; + delete hints; } void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - cpphints->setTryHarder(tryHarder); + hints->setTryHarder(tryHarder); } void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - cpphints->setTryDownscale(tryDownscale); + hints->setTryDownscale(tryDownscale); } void zxing_DecodeHints_setFormats (zxing_DecodeHints hints, zxing_BarcodeFormat formats) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - ZXing::BarcodeFormat cppformats = (ZXing::BarcodeFormat) formats; - cpphints->setFormats(cppformats); + hints->setFormats((ZXing::BarcodeFormat) formats); } void zxing_DecodeHints_setBinarizer (zxing_DecodeHints hints, zxing_Binarizer binarizer) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - ZXing::Binarizer cppbinarizer = (ZXing::Binarizer) binarizer; - cpphints->setBinarizer(cppbinarizer); + hints->setBinarizer((ZXing::Binarizer) binarizer); } void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints hints, zxing_EanAddOnSymbol eanAddOnSymbol) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - ZXing::EanAddOnSymbol cppeanAddOnSymbol = (ZXing::EanAddOnSymbol) eanAddOnSymbol; - cpphints->setEanAddOnSymbol(cppeanAddOnSymbol); + hints->setEanAddOnSymbol((ZXing::EanAddOnSymbol) eanAddOnSymbol); } void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode textMode) { - ZXing::DecodeHints * cpphints = (ZXing::DecodeHints *) hints; - ZXing::TextMode cpptextMode = (ZXing::TextMode) textMode; - cpphints->setTextMode(cpptextMode); + hints->setTextMode((ZXing::TextMode) textMode); } /* @@ -142,20 +121,17 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode text void zxing_Result_delete (zxing_Result result) { - ZXing::Result * cppresult = (ZXing::Result *) result; - delete cppresult; + delete result; } bool zxing_Result_isValid (zxing_Result result) { - ZXing::Result * cppresult = (ZXing::Result *) result; - return cppresult->isValid(); + return result->isValid(); } zxing_BarcodeFormat zxing_Result_format (zxing_Result result) { - ZXing::Result * cppresult = (ZXing::Result *) result; - return (zxing_BarcodeFormat) cppresult->format(); + return (zxing_BarcodeFormat) result->format(); } /* @@ -169,28 +145,15 @@ zxing_BarcodeFormat zxing_Result_format (zxing_Result result) zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints) { const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; - // TODO - //zxing.cpp: In function ‘void* zxing_ReadBarcode(zxing_ImageView, zxing_DecodeHints)’: - //zxing.cpp:157:76: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - // 157 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; - ZXing::Result cppresult = ZXing::ReadBarcode(cppiv, cpphints); - ZXing::Result * cppresultptr = new ZXing::Result(std::move(cppresult)); - return (zxing_Result) cppresultptr; + return new ZXing::Result(std::move(ZXing::ReadBarcode(cppiv, cpphints))); } zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints) { const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; - // TODO - //zxing.cpp: In function ‘void* zxing_ReadBarcodes(zxing_ImageView, zxing_DecodeHints)’: - //zxing.cpp:173:76: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - // 173 | const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; - ZXing::Results cppresults = ZXing::ReadBarcodes(cppiv, cpphints); - ZXing::Results * cppresultsptr = new ZXing::Results(std::move(cppresults)); - return (zxing_Results) cppresultsptr; - return NULL; + return new ZXing::Results(std::move(ZXing::ReadBarcodes(cppiv, cpphints))); } } From b120f2dc8fced6a8cd0b0db98d4a4d1b6ced4e5f Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 24 Apr 2023 20:57:51 +0100 Subject: [PATCH 07/21] Correctly dereference `ImageView`/`DecodeHints` pointers --- wrappers/c/zxing.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index f275ff1715..85513635fd 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -144,16 +144,18 @@ zxing_BarcodeFormat zxing_Result_format (zxing_Result result) zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints) { - const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; - const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; - return new ZXing::Result(std::move(ZXing::ReadBarcode(cppiv, cpphints))); + const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; + const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; + ZXing::Result result = ZXing::ReadBarcode(*cppiv, *cpphints); + return new ZXing::Result(result); } zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints) { - const ZXing::ImageView & cppiv = (const ZXing::ImageView &) iv; - const ZXing::DecodeHints & cpphints = (const ZXing::DecodeHints &) hints; - return new ZXing::Results(std::move(ZXing::ReadBarcodes(cppiv, cpphints))); + const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; + const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; + ZXing::Results results = ZXing::ReadBarcodes(*cppiv, *cpphints); + return new ZXing::Results(results); } } From 4c2dae6cc5339a3c2050e3ceec09911a305c8043 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 24 Apr 2023 21:13:36 +0100 Subject: [PATCH 08/21] Don't hide pointers behind `typedef`s --- wrappers/c/zxing.cpp | 40 +++++++++++++++---------------- wrappers/c/zxing.h | 56 ++++++++++++++++++++++---------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 85513635fd..1e941c7d5f 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -12,38 +12,38 @@ extern "C" { * ZXing/ImageView.h */ -zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) +zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) { ZXing::ImageFormat cppformat = (ZXing::ImageFormat) format; return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); } -void zxing_ImageView_delete (zxing_ImageView iv) +void zxing_ImageView_delete (zxing_ImageView * iv) { delete iv; } -int zxing_ImageView_width (zxing_ImageView iv) +int zxing_ImageView_width (zxing_ImageView * iv) { return iv->width(); } -int zxing_ImageView_height (zxing_ImageView iv) +int zxing_ImageView_height (zxing_ImageView * iv) { return iv->height(); } -int zxing_ImageView_pixStride (zxing_ImageView iv) +int zxing_ImageView_pixStride (zxing_ImageView * iv) { return iv->pixStride(); } -int zxing_ImageView_rowStride (zxing_ImageView iv) +int zxing_ImageView_rowStride (zxing_ImageView * iv) { return iv->rowStride(); } -zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv) +zxing_ImageFormat zxing_ImageView_format (zxing_ImageView * iv) { return (zxing_ImageFormat) iv->format(); } @@ -71,42 +71,42 @@ zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) * ZXing/DecodeHints.h */ -zxing_DecodeHints zxing_DecodeHints_new () +zxing_DecodeHints * zxing_DecodeHints_new () { return new ZXing::DecodeHints(); } -void zxing_DecodeHints_delete (zxing_DecodeHints hints) +void zxing_DecodeHints_delete (zxing_DecodeHints * hints) { delete hints; } -void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder) +void zxing_DecodeHints_setTryHarder (zxing_DecodeHints * hints, bool tryHarder) { hints->setTryHarder(tryHarder); } -void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale) +void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints * hints, bool tryDownscale) { hints->setTryDownscale(tryDownscale); } -void zxing_DecodeHints_setFormats (zxing_DecodeHints hints, zxing_BarcodeFormat formats) +void zxing_DecodeHints_setFormats (zxing_DecodeHints * hints, zxing_BarcodeFormat formats) { hints->setFormats((ZXing::BarcodeFormat) formats); } -void zxing_DecodeHints_setBinarizer (zxing_DecodeHints hints, zxing_Binarizer binarizer) +void zxing_DecodeHints_setBinarizer (zxing_DecodeHints * hints, zxing_Binarizer binarizer) { hints->setBinarizer((ZXing::Binarizer) binarizer); } -void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints hints, zxing_EanAddOnSymbol eanAddOnSymbol) +void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints * hints, zxing_EanAddOnSymbol eanAddOnSymbol) { hints->setEanAddOnSymbol((ZXing::EanAddOnSymbol) eanAddOnSymbol); } -void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode textMode) +void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode textMode) { hints->setTextMode((ZXing::TextMode) textMode); } @@ -119,17 +119,17 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode text * ZXing/Result.h */ -void zxing_Result_delete (zxing_Result result) +void zxing_Result_delete (zxing_Result * result) { delete result; } -bool zxing_Result_isValid (zxing_Result result) +bool zxing_Result_isValid (zxing_Result * result) { return result->isValid(); } -zxing_BarcodeFormat zxing_Result_format (zxing_Result result) +zxing_BarcodeFormat zxing_Result_format (zxing_Result * result) { return (zxing_BarcodeFormat) result->format(); } @@ -142,7 +142,7 @@ zxing_BarcodeFormat zxing_Result_format (zxing_Result result) * ZXing/ReadBarcode.h */ -zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints) +zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; @@ -150,7 +150,7 @@ zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHint return new ZXing::Result(result); } -zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints) +zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index 256542fe2d..c1d82b1b25 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -17,18 +17,18 @@ #include #include -typedef ZXing::ImageView * zxing_ImageView; -typedef ZXing::DecodeHints * zxing_DecodeHints; -typedef ZXing::Result * zxing_Result; -typedef ZXing::Results * zxing_Results; +typedef ZXing::ImageView zxing_ImageView; +typedef ZXing::DecodeHints zxing_DecodeHints; +typedef ZXing::Result zxing_Result; +typedef ZXing::Results zxing_Results; extern "C" { #else -typedef struct zxing_ImageView * zxing_ImageView; -typedef struct zxing_DecodeHints * zxing_DecodeHints; -typedef struct zxing_Result * zxing_Result; -typedef struct zxing_Results * zxing_Results; +typedef struct zxing_ImageView zxing_ImageView; +typedef struct zxing_DecodeHints zxing_DecodeHints; +typedef struct zxing_Result zxing_Result; +typedef struct zxing_Results zxing_Results; #endif @@ -47,14 +47,14 @@ typedef enum { zxing_ImageFormat_XBGR = 0x04030201, } zxing_ImageFormat; -zxing_ImageView zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); -void zxing_ImageView_delete (zxing_ImageView iv); +zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); +void zxing_ImageView_delete (zxing_ImageView * iv); -int zxing_ImageView_width (zxing_ImageView iv); -int zxing_ImageView_height (zxing_ImageView iv); -int zxing_ImageView_pixStride (zxing_ImageView iv); -int zxing_ImageView_rowStride (zxing_ImageView iv); -zxing_ImageFormat zxing_ImageView_format (zxing_ImageView iv); +int zxing_ImageView_width (zxing_ImageView * iv); +int zxing_ImageView_height (zxing_ImageView * iv); +int zxing_ImageView_pixStride (zxing_ImageView * iv); +int zxing_ImageView_rowStride (zxing_ImageView * iv); +zxing_ImageFormat zxing_ImageView_format (zxing_ImageView * iv); /* ... */ /* @@ -118,33 +118,33 @@ typedef enum { zxing_TextMode_Escaped, } zxing_TextMode; -zxing_DecodeHints zxing_DecodeHints_new (); -void zxing_DecodeHints_delete (zxing_DecodeHints hints); +zxing_DecodeHints * zxing_DecodeHints_new (); +void zxing_DecodeHints_delete (zxing_DecodeHints * hints); -void zxing_DecodeHints_setTryHarder (zxing_DecodeHints hints, bool tryHarder); -void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints hints, bool tryDownscale); -void zxing_DecodeHints_setFormats (zxing_DecodeHints hints, zxing_BarcodeFormat formats); -void zxing_DecodeHints_setBinarizer (zxing_DecodeHints hints, zxing_Binarizer binarizer); -void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints hints, zxing_EanAddOnSymbol eanAddOnSymbol); -void zxing_DecodeHints_setTextMode (zxing_DecodeHints hints, zxing_TextMode textMode); +void zxing_DecodeHints_setTryHarder (zxing_DecodeHints * hints, bool tryHarder); +void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints * hints, bool tryDownscale); +void zxing_DecodeHints_setFormats (zxing_DecodeHints * hints, zxing_BarcodeFormat formats); +void zxing_DecodeHints_setBinarizer (zxing_DecodeHints * hints, zxing_Binarizer binarizer); +void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints * hints, zxing_EanAddOnSymbol eanAddOnSymbol); +void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode textMode); /* ... */ /* * ZXing/Result.h */ -void zxing_Result_delete (zxing_Result result); +void zxing_Result_delete (zxing_Result * result); -bool zxing_Result_isValid (zxing_Result result); -zxing_BarcodeFormat zxing_Result_format (zxing_Result result); +bool zxing_Result_isValid (zxing_Result * result); +zxing_BarcodeFormat zxing_Result_format (zxing_Result * result); /* ... */ /* * ZXing/ReadBarcode.h */ -zxing_Result zxing_ReadBarcode (const zxing_ImageView iv, const zxing_DecodeHints hints); -zxing_Results zxing_ReadBarcodes (const zxing_ImageView iv, const zxing_DecodeHints hints); +zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints); +zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints); #ifdef __cplusplus } From 1111825fbe62fc60df759e6d88d875228a069af4 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 24 Apr 2023 21:26:12 +0100 Subject: [PATCH 09/21] Use `reinterpret_cast` instead of C-style casts --- wrappers/c/zxing.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 1e941c7d5f..3d8283e095 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -144,16 +144,16 @@ zxing_BarcodeFormat zxing_Result_format (zxing_Result * result) zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { - const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; - const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; + const ZXing::ImageView * cppiv = reinterpret_cast(iv); + const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); ZXing::Result result = ZXing::ReadBarcode(*cppiv, *cpphints); return new ZXing::Result(result); } zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { - const ZXing::ImageView * cppiv = (const ZXing::ImageView *) iv; - const ZXing::DecodeHints * cpphints = (const ZXing::DecodeHints *) hints; + const ZXing::ImageView * cppiv = reinterpret_cast(iv); + const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); ZXing::Results results = ZXing::ReadBarcodes(*cppiv, *cpphints); return new ZXing::Results(results); } From de82da9b1b2d572eaea12b37f444ce3fee73fbf1 Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 26 Apr 2023 16:42:04 +0100 Subject: [PATCH 10/21] Make getters const --- wrappers/c/zxing.cpp | 14 +++++++------- wrappers/c/zxing.h | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 3d8283e095..5110a54ac1 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -23,27 +23,27 @@ void zxing_ImageView_delete (zxing_ImageView * iv) delete iv; } -int zxing_ImageView_width (zxing_ImageView * iv) +int zxing_ImageView_width (const zxing_ImageView * iv) { return iv->width(); } -int zxing_ImageView_height (zxing_ImageView * iv) +int zxing_ImageView_height (const zxing_ImageView * iv) { return iv->height(); } -int zxing_ImageView_pixStride (zxing_ImageView * iv) +int zxing_ImageView_pixStride (const zxing_ImageView * iv) { return iv->pixStride(); } -int zxing_ImageView_rowStride (zxing_ImageView * iv) +int zxing_ImageView_rowStride (const zxing_ImageView * iv) { return iv->rowStride(); } -zxing_ImageFormat zxing_ImageView_format (zxing_ImageView * iv) +zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv) { return (zxing_ImageFormat) iv->format(); } @@ -124,12 +124,12 @@ void zxing_Result_delete (zxing_Result * result) delete result; } -bool zxing_Result_isValid (zxing_Result * result) +bool zxing_Result_isValid (const zxing_Result * result) { return result->isValid(); } -zxing_BarcodeFormat zxing_Result_format (zxing_Result * result) +zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result) { return (zxing_BarcodeFormat) result->format(); } diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index c1d82b1b25..80b2e34b8e 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -50,11 +50,11 @@ typedef enum { zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); void zxing_ImageView_delete (zxing_ImageView * iv); -int zxing_ImageView_width (zxing_ImageView * iv); -int zxing_ImageView_height (zxing_ImageView * iv); -int zxing_ImageView_pixStride (zxing_ImageView * iv); -int zxing_ImageView_rowStride (zxing_ImageView * iv); -zxing_ImageFormat zxing_ImageView_format (zxing_ImageView * iv); +int zxing_ImageView_width (const zxing_ImageView * iv); +int zxing_ImageView_height (const zxing_ImageView * iv); +int zxing_ImageView_pixStride (const zxing_ImageView * iv); +int zxing_ImageView_rowStride (const zxing_ImageView * iv); +zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv); /* ... */ /* @@ -135,8 +135,8 @@ void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode te void zxing_Result_delete (zxing_Result * result); -bool zxing_Result_isValid (zxing_Result * result); -zxing_BarcodeFormat zxing_Result_format (zxing_Result * result); +bool zxing_Result_isValid (const zxing_Result * result); +zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result); /* ... */ /* From bca97fa5b122b003c4b9615200b8e7329c2dd10a Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 26 Apr 2023 16:43:01 +0100 Subject: [PATCH 11/21] Don't unnecessarily assign to variable --- wrappers/c/zxing.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 5110a54ac1..eda37f14e2 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -146,16 +146,14 @@ zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_Decode { const ZXing::ImageView * cppiv = reinterpret_cast(iv); const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); - ZXing::Result result = ZXing::ReadBarcode(*cppiv, *cpphints); - return new ZXing::Result(result); + return new ZXing::Result(ZXing::ReadBarcode(*cppiv, *cpphints)); } zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { const ZXing::ImageView * cppiv = reinterpret_cast(iv); const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); - ZXing::Results results = ZXing::ReadBarcodes(*cppiv, *cpphints); - return new ZXing::Results(results); + return new ZXing::Results(ZXing::ReadBarcodes(*cppiv, *cpphints)); } } From 7a18c30b1e75deb86c7e6c691d47fcb09a0a1f9d Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 26 Apr 2023 16:47:42 +0100 Subject: [PATCH 12/21] Use `static_cast` instead of C-style cast for enums --- wrappers/c/zxing.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index eda37f14e2..5cfd5e978c 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -14,7 +14,7 @@ extern "C" { zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) { - ZXing::ImageFormat cppformat = (ZXing::ImageFormat) format; + ZXing::ImageFormat cppformat = static_cast(format); return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); } @@ -45,7 +45,7 @@ int zxing_ImageView_rowStride (const zxing_ImageView * iv) zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv) { - return (zxing_ImageFormat) iv->format(); + return static_cast(iv->format()); } /* @@ -58,7 +58,7 @@ zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv) zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) { - return (zxing_BarcodeFormat) ZXing::BarcodeFormatFromString(std::string(format)); + return static_cast(ZXing::BarcodeFormatFromString(std::string(format))); } // TODO: @@ -93,22 +93,22 @@ void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints * hints, bool tryDowns void zxing_DecodeHints_setFormats (zxing_DecodeHints * hints, zxing_BarcodeFormat formats) { - hints->setFormats((ZXing::BarcodeFormat) formats); + hints->setFormats(static_cast(formats)); } void zxing_DecodeHints_setBinarizer (zxing_DecodeHints * hints, zxing_Binarizer binarizer) { - hints->setBinarizer((ZXing::Binarizer) binarizer); + hints->setBinarizer(static_cast(binarizer)); } void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints * hints, zxing_EanAddOnSymbol eanAddOnSymbol) { - hints->setEanAddOnSymbol((ZXing::EanAddOnSymbol) eanAddOnSymbol); + hints->setEanAddOnSymbol(static_cast(eanAddOnSymbol)); } void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode textMode) { - hints->setTextMode((ZXing::TextMode) textMode); + hints->setTextMode(static_cast(textMode)); } /* @@ -131,7 +131,7 @@ bool zxing_Result_isValid (const zxing_Result * result) zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result) { - return (zxing_BarcodeFormat) result->format(); + return static_cast(result->format()); } /* From ced33303a1722653bf7594089cad5b4c1a7bbc18 Mon Sep 17 00:00:00 2001 From: siiky Date: Thu, 27 Apr 2023 09:20:22 +0100 Subject: [PATCH 13/21] Remove unnecessary variable assignments --- wrappers/c/zxing.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 5cfd5e978c..94a6754a61 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -144,16 +144,12 @@ zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result) zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { - const ZXing::ImageView * cppiv = reinterpret_cast(iv); - const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); - return new ZXing::Result(ZXing::ReadBarcode(*cppiv, *cpphints)); + return new ZXing::Result(ZXing::ReadBarcode(*iv, *hints)); } zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints) { - const ZXing::ImageView * cppiv = reinterpret_cast(iv); - const ZXing::DecodeHints * cpphints = reinterpret_cast(hints); - return new ZXing::Results(ZXing::ReadBarcodes(*cppiv, *cpphints)); + return new ZXing::Results(ZXing::ReadBarcodes(*iv, *hints)); } } From b3ce198f9d32fb905b48a79583a767b97c76412e Mon Sep 17 00:00:00 2001 From: siiky Date: Thu, 27 Apr 2023 09:23:16 +0100 Subject: [PATCH 14/21] Format code with `clang-format` --- wrappers/c/zxing.cpp | 296 +++++++++++++++++++++---------------------- wrappers/c/zxing.h | 241 ++++++++++++++++++----------------- 2 files changed, 274 insertions(+), 263 deletions(-) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 94a6754a61..919e8a4c6c 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -1,155 +1,155 @@ #include "zxing.h" -#include #include #include -#include +#include #include +#include -extern "C" { - -/* - * ZXing/ImageView.h - */ - -zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) -{ - ZXing::ImageFormat cppformat = static_cast(format); - return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); -} - -void zxing_ImageView_delete (zxing_ImageView * iv) -{ - delete iv; -} - -int zxing_ImageView_width (const zxing_ImageView * iv) -{ - return iv->width(); -} - -int zxing_ImageView_height (const zxing_ImageView * iv) -{ - return iv->height(); -} - -int zxing_ImageView_pixStride (const zxing_ImageView * iv) -{ - return iv->pixStride(); -} - -int zxing_ImageView_rowStride (const zxing_ImageView * iv) -{ - return iv->rowStride(); -} - -zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv) -{ - return static_cast(iv->format()); -} - -/* - * ... - */ - -/* - * ZXing/BarcodeFormat.h - */ - -zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format) -{ - return static_cast(ZXing::BarcodeFormatFromString(std::string(format))); -} - -// TODO: -//zxing_BarcodeFormat zxing_BarcodeFormatsFromString (const char * formats) -//{ -// return (zxing_BarcodeFormat) ZXing::BarcodeFormatsFromString(std::string(formats)); -//} - -/* - * ZXing/DecodeHints.h - */ - -zxing_DecodeHints * zxing_DecodeHints_new () -{ - return new ZXing::DecodeHints(); -} - -void zxing_DecodeHints_delete (zxing_DecodeHints * hints) -{ - delete hints; -} - -void zxing_DecodeHints_setTryHarder (zxing_DecodeHints * hints, bool tryHarder) -{ - hints->setTryHarder(tryHarder); -} - -void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints * hints, bool tryDownscale) -{ - hints->setTryDownscale(tryDownscale); -} - -void zxing_DecodeHints_setFormats (zxing_DecodeHints * hints, zxing_BarcodeFormat formats) -{ - hints->setFormats(static_cast(formats)); -} - -void zxing_DecodeHints_setBinarizer (zxing_DecodeHints * hints, zxing_Binarizer binarizer) -{ - hints->setBinarizer(static_cast(binarizer)); -} - -void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints * hints, zxing_EanAddOnSymbol eanAddOnSymbol) -{ - hints->setEanAddOnSymbol(static_cast(eanAddOnSymbol)); -} - -void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode textMode) -{ - hints->setTextMode(static_cast(textMode)); -} - -/* - * ... - */ - -/* - * ZXing/Result.h - */ - -void zxing_Result_delete (zxing_Result * result) -{ - delete result; -} - -bool zxing_Result_isValid (const zxing_Result * result) -{ - return result->isValid(); -} - -zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result) -{ - return static_cast(result->format()); -} - -/* - * ... - */ - -/* - * ZXing/ReadBarcode.h - */ - -zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints) -{ - return new ZXing::Result(ZXing::ReadBarcode(*iv, *hints)); -} - -zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints) -{ - return new ZXing::Results(ZXing::ReadBarcodes(*iv, *hints)); -} - +extern "C" +{ + /* + * ZXing/ImageView.h + */ + + zxing_ImageView* zxing_ImageView_new(const uint8_t* data, int width, int height, zxing_ImageFormat format, int rowStride, + int pixStride) + { + ZXing::ImageFormat cppformat = static_cast(format); + return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); + } + + void zxing_ImageView_delete(zxing_ImageView* iv) + { + delete iv; + } + + int zxing_ImageView_width(const zxing_ImageView* iv) + { + return iv->width(); + } + + int zxing_ImageView_height(const zxing_ImageView* iv) + { + return iv->height(); + } + + int zxing_ImageView_pixStride(const zxing_ImageView* iv) + { + return iv->pixStride(); + } + + int zxing_ImageView_rowStride(const zxing_ImageView* iv) + { + return iv->rowStride(); + } + + zxing_ImageFormat zxing_ImageView_format(const zxing_ImageView* iv) + { + return static_cast(iv->format()); + } + + /* + * ... + */ + + /* + * ZXing/BarcodeFormat.h + */ + + zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* format) + { + return static_cast(ZXing::BarcodeFormatFromString(std::string(format))); + } + + // TODO: + // zxing_BarcodeFormat zxing_BarcodeFormatsFromString (const char * formats) + //{ + // return (zxing_BarcodeFormat) ZXing::BarcodeFormatsFromString(std::string(formats)); + //} + + /* + * ZXing/DecodeHints.h + */ + + zxing_DecodeHints* zxing_DecodeHints_new() + { + return new ZXing::DecodeHints(); + } + + void zxing_DecodeHints_delete(zxing_DecodeHints* hints) + { + delete hints; + } + + void zxing_DecodeHints_setTryHarder(zxing_DecodeHints* hints, bool tryHarder) + { + hints->setTryHarder(tryHarder); + } + + void zxing_DecodeHints_setTryDownscale(zxing_DecodeHints* hints, bool tryDownscale) + { + hints->setTryDownscale(tryDownscale); + } + + void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormat formats) + { + hints->setFormats(static_cast(formats)); + } + + void zxing_DecodeHints_setBinarizer(zxing_DecodeHints* hints, zxing_Binarizer binarizer) + { + hints->setBinarizer(static_cast(binarizer)); + } + + void zxing_DecodeHints_setEanAddOnSymbol(zxing_DecodeHints* hints, zxing_EanAddOnSymbol eanAddOnSymbol) + { + hints->setEanAddOnSymbol(static_cast(eanAddOnSymbol)); + } + + void zxing_DecodeHints_setTextMode(zxing_DecodeHints* hints, zxing_TextMode textMode) + { + hints->setTextMode(static_cast(textMode)); + } + + /* + * ... + */ + + /* + * ZXing/Result.h + */ + + void zxing_Result_delete(zxing_Result* result) + { + delete result; + } + + bool zxing_Result_isValid(const zxing_Result* result) + { + return result->isValid(); + } + + zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result) + { + return static_cast(result->format()); + } + + /* + * ... + */ + + /* + * ZXing/ReadBarcode.h + */ + + zxing_Result* zxing_ReadBarcode(const zxing_ImageView* iv, const zxing_DecodeHints* hints) + { + return new ZXing::Result(ZXing::ReadBarcode(*iv, *hints)); + } + + zxing_Results* zxing_ReadBarcodes(const zxing_ImageView* iv, const zxing_DecodeHints* hints) + { + return new ZXing::Results(ZXing::ReadBarcodes(*iv, *hints)); + } } diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index 80b2e34b8e..d849b3868a 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -13,8 +13,8 @@ #ifdef __cplusplus -#include #include +#include #include typedef ZXing::ImageView zxing_ImageView; @@ -22,7 +22,8 @@ typedef ZXing::DecodeHints zxing_DecodeHints; typedef ZXing::Result zxing_Result; typedef ZXing::Results zxing_Results; -extern "C" { +extern "C" +{ #else typedef struct zxing_ImageView zxing_ImageView; @@ -32,119 +33,129 @@ typedef struct zxing_Results zxing_Results; #endif -/* - * ZXing/ImageView.h - */ - -typedef enum { - zxing_ImageFormat_None = 0, - zxing_ImageFormat_Lum = 0x01000000, - zxing_ImageFormat_RGB = 0x03000102, - zxing_ImageFormat_BGR = 0x03020100, - zxing_ImageFormat_RGBX = 0x04000102, - zxing_ImageFormat_XRGB = 0x04010203, - zxing_ImageFormat_BGRX = 0x04020100, - zxing_ImageFormat_XBGR = 0x04030201, -} zxing_ImageFormat; - -zxing_ImageView * zxing_ImageView_new (const uint8_t * data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride); -void zxing_ImageView_delete (zxing_ImageView * iv); - -int zxing_ImageView_width (const zxing_ImageView * iv); -int zxing_ImageView_height (const zxing_ImageView * iv); -int zxing_ImageView_pixStride (const zxing_ImageView * iv); -int zxing_ImageView_rowStride (const zxing_ImageView * iv); -zxing_ImageFormat zxing_ImageView_format (const zxing_ImageView * iv); -/* ... */ - -/* - * ZXing/BarcodeFormat.h - */ - -typedef enum { - zxing_BarcodeFormat_None = 0, - zxing_BarcodeFormat_Aztec = (1 << 0), - zxing_BarcodeFormat_Codabar = (1 << 1), - zxing_BarcodeFormat_Code39 = (1 << 2), - zxing_BarcodeFormat_Code93 = (1 << 3), - zxing_BarcodeFormat_Code128 = (1 << 4), - zxing_BarcodeFormat_DataBar = (1 << 5), - zxing_BarcodeFormat_DataBarExpanded = (1 << 6), - zxing_BarcodeFormat_DataMatrix = (1 << 7), - zxing_BarcodeFormat_EAN8 = (1 << 8), - zxing_BarcodeFormat_EAN13 = (1 << 9), - zxing_BarcodeFormat_ITF = (1 << 10), - zxing_BarcodeFormat_MaxiCode = (1 << 11), - zxing_BarcodeFormat_PDF417 = (1 << 12), - zxing_BarcodeFormat_QRCode = (1 << 13), - zxing_BarcodeFormat_UPCA = (1 << 14), - zxing_BarcodeFormat_UPCE = (1 << 15), - zxing_BarcodeFormat_MicroQRCode = (1 << 16), - - zxing_BarcodeFormat_LinearCodes = zxing_BarcodeFormat_Codabar | zxing_BarcodeFormat_Code39 | zxing_BarcodeFormat_Code93 | zxing_BarcodeFormat_Code128 | zxing_BarcodeFormat_EAN8 | zxing_BarcodeFormat_EAN13 | zxing_BarcodeFormat_ITF | zxing_BarcodeFormat_DataBar | zxing_BarcodeFormat_DataBarExpanded | zxing_BarcodeFormat_UPCA | zxing_BarcodeFormat_UPCE, - zxing_BarcodeFormat_MatrixCodes = zxing_BarcodeFormat_Aztec | zxing_BarcodeFormat_DataMatrix | zxing_BarcodeFormat_MaxiCode | zxing_BarcodeFormat_PDF417 | zxing_BarcodeFormat_QRCode | zxing_BarcodeFormat_MicroQRCode, - zxing_BarcodeFormat_Any = zxing_BarcodeFormat_LinearCodes | zxing_BarcodeFormat_MatrixCodes, - - zxing_BarcodeFormat__max = zxing_BarcodeFormat_MicroQRCode, -} zxing_BarcodeFormat; - -zxing_BarcodeFormat zxing_BarcodeFormatFromString (const char * format); - -// TODO: -//zxing_BarcodeFormat zxing_BarcodesFormatFromString (const char * formats); - -/* - * ZXing/DecodeHints.h - */ - -typedef enum { - zxing_Binarizer_LocalAverage, - zxing_Binarizer_GlobalHistogram, - zxing_Binarizer_FixedThreshold, - zxing_Binarizer_BoolCast, -} zxing_Binarizer; - -typedef enum { - zxing_EanAddOnSymbol_Ignore, - zxing_EanAddOnSymbol_Read, - zxing_EanAddOnSymbol_Require, -} zxing_EanAddOnSymbol; - -typedef enum { - zxing_TextMode_Plain, - zxing_TextMode_ECI, - zxing_TextMode_HRI, - zxing_TextMode_Hex, - zxing_TextMode_Escaped, -} zxing_TextMode; - -zxing_DecodeHints * zxing_DecodeHints_new (); -void zxing_DecodeHints_delete (zxing_DecodeHints * hints); - -void zxing_DecodeHints_setTryHarder (zxing_DecodeHints * hints, bool tryHarder); -void zxing_DecodeHints_setTryDownscale (zxing_DecodeHints * hints, bool tryDownscale); -void zxing_DecodeHints_setFormats (zxing_DecodeHints * hints, zxing_BarcodeFormat formats); -void zxing_DecodeHints_setBinarizer (zxing_DecodeHints * hints, zxing_Binarizer binarizer); -void zxing_DecodeHints_setEanAddOnSymbol (zxing_DecodeHints * hints, zxing_EanAddOnSymbol eanAddOnSymbol); -void zxing_DecodeHints_setTextMode (zxing_DecodeHints * hints, zxing_TextMode textMode); -/* ... */ - -/* - * ZXing/Result.h - */ - -void zxing_Result_delete (zxing_Result * result); - -bool zxing_Result_isValid (const zxing_Result * result); -zxing_BarcodeFormat zxing_Result_format (const zxing_Result * result); -/* ... */ - -/* - * ZXing/ReadBarcode.h - */ - -zxing_Result * zxing_ReadBarcode (const zxing_ImageView * iv, const zxing_DecodeHints * hints); -zxing_Results * zxing_ReadBarcodes (const zxing_ImageView * iv, const zxing_DecodeHints * hints); + /* + * ZXing/ImageView.h + */ + + typedef enum + { + zxing_ImageFormat_None = 0, + zxing_ImageFormat_Lum = 0x01000000, + zxing_ImageFormat_RGB = 0x03000102, + zxing_ImageFormat_BGR = 0x03020100, + zxing_ImageFormat_RGBX = 0x04000102, + zxing_ImageFormat_XRGB = 0x04010203, + zxing_ImageFormat_BGRX = 0x04020100, + zxing_ImageFormat_XBGR = 0x04030201, + } zxing_ImageFormat; + + zxing_ImageView* zxing_ImageView_new(const uint8_t* data, int width, int height, zxing_ImageFormat format, int rowStride, + int pixStride); + void zxing_ImageView_delete(zxing_ImageView* iv); + + int zxing_ImageView_width(const zxing_ImageView* iv); + int zxing_ImageView_height(const zxing_ImageView* iv); + int zxing_ImageView_pixStride(const zxing_ImageView* iv); + int zxing_ImageView_rowStride(const zxing_ImageView* iv); + zxing_ImageFormat zxing_ImageView_format(const zxing_ImageView* iv); + /* ... */ + + /* + * ZXing/BarcodeFormat.h + */ + + typedef enum + { + zxing_BarcodeFormat_None = 0, + zxing_BarcodeFormat_Aztec = (1 << 0), + zxing_BarcodeFormat_Codabar = (1 << 1), + zxing_BarcodeFormat_Code39 = (1 << 2), + zxing_BarcodeFormat_Code93 = (1 << 3), + zxing_BarcodeFormat_Code128 = (1 << 4), + zxing_BarcodeFormat_DataBar = (1 << 5), + zxing_BarcodeFormat_DataBarExpanded = (1 << 6), + zxing_BarcodeFormat_DataMatrix = (1 << 7), + zxing_BarcodeFormat_EAN8 = (1 << 8), + zxing_BarcodeFormat_EAN13 = (1 << 9), + zxing_BarcodeFormat_ITF = (1 << 10), + zxing_BarcodeFormat_MaxiCode = (1 << 11), + zxing_BarcodeFormat_PDF417 = (1 << 12), + zxing_BarcodeFormat_QRCode = (1 << 13), + zxing_BarcodeFormat_UPCA = (1 << 14), + zxing_BarcodeFormat_UPCE = (1 << 15), + zxing_BarcodeFormat_MicroQRCode = (1 << 16), + + zxing_BarcodeFormat_LinearCodes = zxing_BarcodeFormat_Codabar | zxing_BarcodeFormat_Code39 | zxing_BarcodeFormat_Code93 + | zxing_BarcodeFormat_Code128 | zxing_BarcodeFormat_EAN8 | zxing_BarcodeFormat_EAN13 + | zxing_BarcodeFormat_ITF | zxing_BarcodeFormat_DataBar | zxing_BarcodeFormat_DataBarExpanded + | zxing_BarcodeFormat_UPCA | zxing_BarcodeFormat_UPCE, + zxing_BarcodeFormat_MatrixCodes = zxing_BarcodeFormat_Aztec | zxing_BarcodeFormat_DataMatrix | zxing_BarcodeFormat_MaxiCode + | zxing_BarcodeFormat_PDF417 | zxing_BarcodeFormat_QRCode | zxing_BarcodeFormat_MicroQRCode, + zxing_BarcodeFormat_Any = zxing_BarcodeFormat_LinearCodes | zxing_BarcodeFormat_MatrixCodes, + + zxing_BarcodeFormat__max = zxing_BarcodeFormat_MicroQRCode, + } zxing_BarcodeFormat; + + zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* format); + + // TODO: + // zxing_BarcodeFormat zxing_BarcodesFormatFromString (const char * formats); + + /* + * ZXing/DecodeHints.h + */ + + typedef enum + { + zxing_Binarizer_LocalAverage, + zxing_Binarizer_GlobalHistogram, + zxing_Binarizer_FixedThreshold, + zxing_Binarizer_BoolCast, + } zxing_Binarizer; + + typedef enum + { + zxing_EanAddOnSymbol_Ignore, + zxing_EanAddOnSymbol_Read, + zxing_EanAddOnSymbol_Require, + } zxing_EanAddOnSymbol; + + typedef enum + { + zxing_TextMode_Plain, + zxing_TextMode_ECI, + zxing_TextMode_HRI, + zxing_TextMode_Hex, + zxing_TextMode_Escaped, + } zxing_TextMode; + + zxing_DecodeHints* zxing_DecodeHints_new(); + void zxing_DecodeHints_delete(zxing_DecodeHints* hints); + + void zxing_DecodeHints_setTryHarder(zxing_DecodeHints* hints, bool tryHarder); + void zxing_DecodeHints_setTryDownscale(zxing_DecodeHints* hints, bool tryDownscale); + void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormat formats); + void zxing_DecodeHints_setBinarizer(zxing_DecodeHints* hints, zxing_Binarizer binarizer); + void zxing_DecodeHints_setEanAddOnSymbol(zxing_DecodeHints* hints, zxing_EanAddOnSymbol eanAddOnSymbol); + void zxing_DecodeHints_setTextMode(zxing_DecodeHints* hints, zxing_TextMode textMode); + /* ... */ + + /* + * ZXing/Result.h + */ + + void zxing_Result_delete(zxing_Result* result); + + bool zxing_Result_isValid(const zxing_Result* result); + zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result); + /* ... */ + + /* + * ZXing/ReadBarcode.h + */ + + zxing_Result* zxing_ReadBarcode(const zxing_ImageView* iv, const zxing_DecodeHints* hints); + zxing_Results* zxing_ReadBarcodes(const zxing_ImageView* iv, const zxing_DecodeHints* hints); #ifdef __cplusplus } From 423c22a284273d49f738a75d7b6106e7272a367a Mon Sep 17 00:00:00 2001 From: siiky Date: Fri, 28 Apr 2023 00:15:39 +0100 Subject: [PATCH 15/21] Add C wrapper example program --- wrappers/c/zxing-c-test.c | 52 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 wrappers/c/zxing-c-test.c diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c new file mode 100644 index 0000000000..3fa50957b8 --- /dev/null +++ b/wrappers/c/zxing-c-test.c @@ -0,0 +1,52 @@ +#include "zxing.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "jpeg.h" + +int usage(char* pname) +{ + fprintf(stderr, "Usage: %s FILE FORMATS\n", pname); + return 1; +} + +bool parse_args(int argc, char** argv, char** filename, char** formats) +{ + if (argc != 3) + return false; + *filename = argv[1]; + *formats = argv[2]; + return true; +} + +int main(int argc, char** argv) +{ + char* filename = NULL; + char* formats = NULL; + + if (!parse_args(argc, argv, &filename, &formats)) + return usage(argv[0]); + + int x = 0; + int y = 0; + int channels_in_file = 0; + stbi_uc* data = stbi_load(filename, &x, &y, &channels_in_file, STBI_rgb); + if (!data) + return 2; + + zxing_DecodeHints* hints = zxing_DecodeHints_new(); + zxing_DecodeHints_setTextMode(hints, zxing_TextMode_Plain); + zxing_DecodeHints_setEanAddOnSymbol(hints, zxing_EanAddOnSymbol_Ignore); + zxing_DecodeHints_setFormats(hints, zxing_BarcodeFormatFromString(formats)); + + zxing_ImageView* iv = zxing_ImageView_new(data, x, y, zxing_ImageFormat_RGB, 0, 0); + + zxing_Result* result = zxing_ReadBarcode(iv, hints); + fprintf(stderr, "Result is %s\n", zxing_Result_isValid(result) ? "valid" : "invalid"); + + zxing_Result_delete(result); + zxing_ImageView_delete(iv); + zxing_DecodeHints_delete(hints); + free(data); + + return 0; +} From 1124709849770a38c64c00d45b3dca07611c9cac Mon Sep 17 00:00:00 2001 From: axxel Date: Fri, 28 Apr 2023 10:03:34 +0200 Subject: [PATCH 16/21] include stb_image.h --- wrappers/c/zxing-c-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c index 3fa50957b8..6262b28f5c 100644 --- a/wrappers/c/zxing-c-test.c +++ b/wrappers/c/zxing-c-test.c @@ -1,7 +1,7 @@ #include "zxing.h" #define STB_IMAGE_IMPLEMENTATION -#include "jpeg.h" +#include int usage(char* pname) { From 81d245afdf47dbd7ce7744a0c7d86ff316bfcd63 Mon Sep 17 00:00:00 2001 From: axxel Date: Fri, 28 Apr 2023 10:08:32 +0200 Subject: [PATCH 17/21] stbi_load related cosmetic (variable names + STBI_grey) --- wrappers/c/zxing-c-test.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c index 6262b28f5c..18107b0fcf 100644 --- a/wrappers/c/zxing-c-test.c +++ b/wrappers/c/zxing-c-test.c @@ -26,10 +26,10 @@ int main(int argc, char** argv) if (!parse_args(argc, argv, &filename, &formats)) return usage(argv[0]); - int x = 0; - int y = 0; - int channels_in_file = 0; - stbi_uc* data = stbi_load(filename, &x, &y, &channels_in_file, STBI_rgb); + int width = 0; + int height = 0; + int channels = 0; + stbi_uc* data = stbi_load(filename, &width, &height, &channels, STBI_grey); if (!data) return 2; @@ -38,7 +38,7 @@ int main(int argc, char** argv) zxing_DecodeHints_setEanAddOnSymbol(hints, zxing_EanAddOnSymbol_Ignore); zxing_DecodeHints_setFormats(hints, zxing_BarcodeFormatFromString(formats)); - zxing_ImageView* iv = zxing_ImageView_new(data, x, y, zxing_ImageFormat_RGB, 0, 0); + zxing_ImageView* iv = zxing_ImageView_new(data, width, height, zxing_ImageFormat_Lum, 0, 0); zxing_Result* result = zxing_ReadBarcode(iv, hints); fprintf(stderr, "Result is %s\n", zxing_Result_isValid(result) ? "valid" : "invalid"); From 5b3bcdbf074696a6aef1aa370e957cf4a5ed97df Mon Sep 17 00:00:00 2001 From: siiky Date: Fri, 23 Jun 2023 18:24:32 +0100 Subject: [PATCH 18/21] Add `zxing_Result_bytes()` --- wrappers/c/zxing.cpp | 18 ++++++++++++++++++ wrappers/c/zxing.h | 1 + 2 files changed, 19 insertions(+) diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing.cpp index 919e8a4c6c..60ab0e4119 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing.cpp @@ -135,6 +135,24 @@ extern "C" return static_cast(result->format()); } + char* zxing_Result_bytes(const zxing_Result* result, int* len) + { + const ZXing::ByteArray& bytes = result->bytes(); + size_t nbytes = bytes.size(); + + char* ret = (char*) malloc(nbytes + 1); + if (!ret) { + *len = 0; + return ret; + } + + const char* data = (const char*) bytes.data(); + strncpy(ret, data, nbytes); + *len = nbytes; + + return ret; + } + /* * ... */ diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing.h index d849b3868a..4a7b38fd7d 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing.h @@ -148,6 +148,7 @@ typedef struct zxing_Results zxing_Results; bool zxing_Result_isValid(const zxing_Result* result); zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result); + char* zxing_Result_bytes(const zxing_Result* result, int* len); /* ... */ /* From 6be805b9ddfb2d63ad31e4546aac3af64dff7ef3 Mon Sep 17 00:00:00 2001 From: axxel Date: Fri, 30 Jun 2023 20:39:40 +0200 Subject: [PATCH 19/21] c-API: rename zxing.* to zxing-c.* and add CMake build support --- CMakeLists.txt | 3 +++ wrappers/c/CMakeLists.txt | 6 ++++++ wrappers/c/zxing-c-test.c | 2 +- wrappers/c/{zxing.cpp => zxing-c.cpp} | 8 ++------ wrappers/c/{zxing.h => zxing-c.h} | 6 +++--- 5 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 wrappers/c/CMakeLists.txt rename wrappers/c/{zxing.cpp => zxing-c.cpp} (95%) rename wrappers/c/{zxing.h => zxing-c.h} (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6352a0bc92..b551f54b5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,3 +76,6 @@ endif() if (BUILD_PYTHON_MODULE) add_subdirectory (wrappers/python) endif() + +add_subdirectory (wrappers/c) + diff --git a/wrappers/c/CMakeLists.txt b/wrappers/c/CMakeLists.txt new file mode 100644 index 0000000000..f4401f5672 --- /dev/null +++ b/wrappers/c/CMakeLists.txt @@ -0,0 +1,6 @@ +zxing_add_package_stb() + +if (BUILD_READERS) + add_executable (zxing-c-test zxing-c.cpp zxing-c-test.c) + target_link_libraries (zxing-c-test ZXing::ZXing stb::stb) +endif() diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c index 18107b0fcf..47341baba5 100644 --- a/wrappers/c/zxing-c-test.c +++ b/wrappers/c/zxing-c-test.c @@ -1,4 +1,4 @@ -#include "zxing.h" +#include "zxing-c.h" #define STB_IMAGE_IMPLEMENTATION #include diff --git a/wrappers/c/zxing.cpp b/wrappers/c/zxing-c.cpp similarity index 95% rename from wrappers/c/zxing.cpp rename to wrappers/c/zxing-c.cpp index 60ab0e4119..2ab725d653 100644 --- a/wrappers/c/zxing.cpp +++ b/wrappers/c/zxing-c.cpp @@ -1,10 +1,6 @@ -#include "zxing.h" +#include "zxing-c.h" -#include -#include -#include -#include -#include +#include "ReadBarcode.h" extern "C" { diff --git a/wrappers/c/zxing.h b/wrappers/c/zxing-c.h similarity index 98% rename from wrappers/c/zxing.h rename to wrappers/c/zxing-c.h index 4a7b38fd7d..fc6c1e64a6 100644 --- a/wrappers/c/zxing.h +++ b/wrappers/c/zxing-c.h @@ -13,9 +13,9 @@ #ifdef __cplusplus -#include -#include -#include +#include "DecodeHints.h" +#include "ImageView.h" +#include "Result.h" typedef ZXing::ImageView zxing_ImageView; typedef ZXing::DecodeHints zxing_DecodeHints; From 4c69b1464d7d2e823751ffd652f215300bfdfc8d Mon Sep 17 00:00:00 2001 From: axxel Date: Sat, 1 Jul 2023 12:44:21 +0200 Subject: [PATCH 20/21] c-API: add more properties + ctest case + comment cleanup --- wrappers/c/CMakeLists.txt | 1 + wrappers/c/zxing-c-test.c | 55 +++++++++++++--- wrappers/c/zxing-c.cpp | 131 ++++++++++++++++++++++++++++++-------- wrappers/c/zxing-c.h | 38 +++++++---- 4 files changed, 174 insertions(+), 51 deletions(-) diff --git a/wrappers/c/CMakeLists.txt b/wrappers/c/CMakeLists.txt index f4401f5672..38a817e79e 100644 --- a/wrappers/c/CMakeLists.txt +++ b/wrappers/c/CMakeLists.txt @@ -3,4 +3,5 @@ zxing_add_package_stb() if (BUILD_READERS) add_executable (zxing-c-test zxing-c.cpp zxing-c-test.c) target_link_libraries (zxing-c-test ZXing::ZXing stb::stb) + add_test(NAME zxing-c-test COMMAND zxing-c-test ${CMAKE_SOURCE_DIR}/test/samples/qrcode-1/1.png) endif() diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c index 47341baba5..fb52c4f3a1 100644 --- a/wrappers/c/zxing-c-test.c +++ b/wrappers/c/zxing-c-test.c @@ -1,3 +1,9 @@ +/* +* Copyright 2023 siiky +* Copyright 2023 Axel Waggershauser +*/ +// SPDX-License-Identifier: Apache-2.0 + #include "zxing-c.h" #define STB_IMAGE_IMPLEMENTATION @@ -5,23 +11,38 @@ int usage(char* pname) { - fprintf(stderr, "Usage: %s FILE FORMATS\n", pname); + fprintf(stderr, "Usage: %s FILE [FORMATS]\n", pname); return 1; } -bool parse_args(int argc, char** argv, char** filename, char** formats) +bool parse_args(int argc, char** argv, char** filename, zxing_BarcodeFormats* formats) { - if (argc != 3) + if (argc < 2) return false; *filename = argv[1]; - *formats = argv[2]; + if (argc >= 3) { + *formats = zxing_BarcodeFormatsFromString(argv[2]); + if (*formats == zxing_BarcodeFormat_Invalid) { + fprintf(stderr, "Invalid barcode formats string '%s'\n", argv[2]); + return false; + } + } return true; } +void printF(const char* fmt, char* text) +{ + if (!text) + return; + if (*text) + printf(fmt, text); + free(text); +} + int main(int argc, char** argv) { char* filename = NULL; - char* formats = NULL; + zxing_BarcodeFormats formats = zxing_BarcodeFormat_None; if (!parse_args(argc, argv, &filename, &formats)) return usage(argv[0]); @@ -34,19 +55,33 @@ int main(int argc, char** argv) return 2; zxing_DecodeHints* hints = zxing_DecodeHints_new(); - zxing_DecodeHints_setTextMode(hints, zxing_TextMode_Plain); + zxing_DecodeHints_setTextMode(hints, zxing_TextMode_HRI); zxing_DecodeHints_setEanAddOnSymbol(hints, zxing_EanAddOnSymbol_Ignore); - zxing_DecodeHints_setFormats(hints, zxing_BarcodeFormatFromString(formats)); + zxing_DecodeHints_setFormats(hints, formats); + zxing_DecodeHints_setReturnErrors(hints, true); zxing_ImageView* iv = zxing_ImageView_new(data, width, height, zxing_ImageFormat_Lum, 0, 0); zxing_Result* result = zxing_ReadBarcode(iv, hints); - fprintf(stderr, "Result is %s\n", zxing_Result_isValid(result) ? "valid" : "invalid"); - zxing_Result_delete(result); + if (result) { + printF("Text : %s\n", zxing_Result_text(result)); + printF("Format : %s\n", zxing_BarcodeFormatToString(zxing_Result_format(result))); + printF("Identifier : %s\n", zxing_Result_symbologyIdentifier(result)); + printF("EC Level : %s\n", zxing_Result_ecLevel(result)); + printF("Error : %s\n", zxing_Result_errorMsg(result)); + printf("Rotation : %d\n", zxing_Result_orientation(result)); + printf("isMirrored : %d\n", zxing_Result_isMirrored(result)); + printf("isInverted : %d\n", zxing_Result_isInverted(result)); + + zxing_Result_delete(result); + } else { + printf("No barcode found\n"); + } + zxing_ImageView_delete(iv); zxing_DecodeHints_delete(hints); - free(data); + stbi_image_free(data); return 0; } diff --git a/wrappers/c/zxing-c.cpp b/wrappers/c/zxing-c.cpp index 2ab725d653..a61f866cab 100644 --- a/wrappers/c/zxing-c.cpp +++ b/wrappers/c/zxing-c.cpp @@ -1,7 +1,25 @@ +/* +* Copyright 2023 siiky +* Copyright 2023 Axel Waggershauser +*/ +// SPDX-License-Identifier: Apache-2.0 + #include "zxing-c.h" #include "ReadBarcode.h" +using namespace ZXing; + +char* copy(std::string_view sv) +{ + auto ret = (char*)malloc(sv.size() + 1); + if (ret) { + strncpy(ret, sv.data(), sv.size()); + ret[sv.size()] = '\0'; + } + return ret; +} + extern "C" { /* @@ -11,8 +29,8 @@ extern "C" zxing_ImageView* zxing_ImageView_new(const uint8_t* data, int width, int height, zxing_ImageFormat format, int rowStride, int pixStride) { - ZXing::ImageFormat cppformat = static_cast(format); - return new ZXing::ImageView(data, width, height, cppformat, rowStride, pixStride); + ImageFormat cppformat = static_cast(format); + return new ImageView(data, width, height, cppformat, rowStride, pixStride); } void zxing_ImageView_delete(zxing_ImageView* iv) @@ -53,16 +71,22 @@ extern "C" * ZXing/BarcodeFormat.h */ - zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* format) + zxing_BarcodeFormats zxing_BarcodeFormatsFromString(const char* str) { - return static_cast(ZXing::BarcodeFormatFromString(std::string(format))); + if (!str) + return {}; + try { + auto format = BarcodeFormatsFromString(str); + return static_cast(*reinterpret_cast(&format)); + } catch (...) { + return zxing_BarcodeFormat_Invalid; + } } - // TODO: - // zxing_BarcodeFormat zxing_BarcodeFormatsFromString (const char * formats) - //{ - // return (zxing_BarcodeFormat) ZXing::BarcodeFormatsFromString(std::string(formats)); - //} + char* zxing_BarcodeFormatToString(zxing_BarcodeFormat format) + { + return copy(ToString(static_cast(format))); + } /* * ZXing/DecodeHints.h @@ -70,7 +94,7 @@ extern "C" zxing_DecodeHints* zxing_DecodeHints_new() { - return new ZXing::DecodeHints(); + return new DecodeHints(); } void zxing_DecodeHints_delete(zxing_DecodeHints* hints) @@ -83,29 +107,49 @@ extern "C" hints->setTryHarder(tryHarder); } + void zxing_DecodeHints_setTryRotate(zxing_DecodeHints* hints, bool tryRotate) + { + hints->setTryRotate(tryRotate); + } + + void zxing_DecodeHints_setTryInvert(zxing_DecodeHints* hints, bool tryInvert) + { + hints->setTryInvert(tryInvert); + } + void zxing_DecodeHints_setTryDownscale(zxing_DecodeHints* hints, bool tryDownscale) { hints->setTryDownscale(tryDownscale); } - void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormat formats) + void zxing_DecodeHints_setIsPure(zxing_DecodeHints* hints, bool isPure) { - hints->setFormats(static_cast(formats)); + hints->setIsPure(isPure); + } + + void zxing_DecodeHints_setReturnErrors(zxing_DecodeHints* hints, bool returnErrors) + { + hints->setReturnErrors(returnErrors); + } + + void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormats formats) + { + hints->setFormats(static_cast(formats)); } void zxing_DecodeHints_setBinarizer(zxing_DecodeHints* hints, zxing_Binarizer binarizer) { - hints->setBinarizer(static_cast(binarizer)); + hints->setBinarizer(static_cast(binarizer)); } void zxing_DecodeHints_setEanAddOnSymbol(zxing_DecodeHints* hints, zxing_EanAddOnSymbol eanAddOnSymbol) { - hints->setEanAddOnSymbol(static_cast(eanAddOnSymbol)); + hints->setEanAddOnSymbol(static_cast(eanAddOnSymbol)); } void zxing_DecodeHints_setTextMode(zxing_DecodeHints* hints, zxing_TextMode textMode) { - hints->setTextMode(static_cast(textMode)); + hints->setTextMode(static_cast(textMode)); } /* @@ -126,29 +170,59 @@ extern "C" return result->isValid(); } + char* zxing_Result_errorMsg(const zxing_Result* result) + { + return copy(ToString(result->error())); + } + zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result) { return static_cast(result->format()); } - char* zxing_Result_bytes(const zxing_Result* result, int* len) + uint8_t* zxing_Result_bytes(const zxing_Result* result, int* len) { - const ZXing::ByteArray& bytes = result->bytes(); - size_t nbytes = bytes.size(); + *len = Size(result->bytes()); - char* ret = (char*) malloc(nbytes + 1); - if (!ret) { + auto ret = (uint8_t*)malloc(*len + 1); + if (ret) + memcpy(ret, result->bytes().data(), *len); + else *len = 0; - return ret; - } - - const char* data = (const char*) bytes.data(); - strncpy(ret, data, nbytes); - *len = nbytes; return ret; } + char* zxing_Result_text(const zxing_Result* result) + { + return copy(result->text()); + } + + char* zxing_Result_ecLevel(const zxing_Result* result) + { + return copy(result->ecLevel()); + } + + char* zxing_Result_symbologyIdentifier(const zxing_Result* result) + { + return copy(result->symbologyIdentifier()); + } + + int zxing_Result_orientation(const zxing_Result* result) + { + return result->orientation(); + } + + bool zxing_Result_isInverted(const zxing_Result* result) + { + return result->isInverted(); + } + + bool zxing_Result_isMirrored(const zxing_Result* result) + { + return result->isMirrored(); + } + /* * ... */ @@ -159,11 +233,12 @@ extern "C" zxing_Result* zxing_ReadBarcode(const zxing_ImageView* iv, const zxing_DecodeHints* hints) { - return new ZXing::Result(ZXing::ReadBarcode(*iv, *hints)); + auto res = ReadBarcode(*iv, *hints); + return res.format() != BarcodeFormat::None ? new Result(std::move(res)) : NULL; } zxing_Results* zxing_ReadBarcodes(const zxing_ImageView* iv, const zxing_DecodeHints* hints) { - return new ZXing::Results(ZXing::ReadBarcodes(*iv, *hints)); + return new Results(ReadBarcodes(*iv, *hints)); } } diff --git a/wrappers/c/zxing-c.h b/wrappers/c/zxing-c.h index fc6c1e64a6..11a06738ae 100644 --- a/wrappers/c/zxing-c.h +++ b/wrappers/c/zxing-c.h @@ -1,13 +1,12 @@ +/* +* Copyright 2023 siiky +* Copyright 2023 Axel Waggershauser +*/ +// SPDX-License-Identifier: Apache-2.0 + #ifndef _ZXING_C_H #define _ZXING_C_H -/* - * - * bool - * - * - * uint8_t - */ #include #include @@ -93,13 +92,13 @@ typedef struct zxing_Results zxing_Results; | zxing_BarcodeFormat_PDF417 | zxing_BarcodeFormat_QRCode | zxing_BarcodeFormat_MicroQRCode, zxing_BarcodeFormat_Any = zxing_BarcodeFormat_LinearCodes | zxing_BarcodeFormat_MatrixCodes, - zxing_BarcodeFormat__max = zxing_BarcodeFormat_MicroQRCode, + zxing_BarcodeFormat_Invalid = -1 /* return value when BarcodeFormatsFromString() throws */ } zxing_BarcodeFormat; - zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* format); + typedef zxing_BarcodeFormat zxing_BarcodeFormats; - // TODO: - // zxing_BarcodeFormat zxing_BarcodesFormatFromString (const char * formats); + zxing_BarcodeFormats zxing_BarcodeFormatsFromString(const char* str); + char* zxing_BarcodeFormatToString(zxing_BarcodeFormat format); /* * ZXing/DecodeHints.h @@ -133,8 +132,12 @@ typedef struct zxing_Results zxing_Results; void zxing_DecodeHints_delete(zxing_DecodeHints* hints); void zxing_DecodeHints_setTryHarder(zxing_DecodeHints* hints, bool tryHarder); + void zxing_DecodeHints_setTryRotate(zxing_DecodeHints* hints, bool tryRotate); + void zxing_DecodeHints_setTryInvert(zxing_DecodeHints* hints, bool tryInvert); void zxing_DecodeHints_setTryDownscale(zxing_DecodeHints* hints, bool tryDownscale); - void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormat formats); + void zxing_DecodeHints_setIsPure(zxing_DecodeHints* hints, bool isPure); + void zxing_DecodeHints_setReturnErrors(zxing_DecodeHints* hints, bool returnErrors); + void zxing_DecodeHints_setFormats(zxing_DecodeHints* hints, zxing_BarcodeFormats formats); void zxing_DecodeHints_setBinarizer(zxing_DecodeHints* hints, zxing_Binarizer binarizer); void zxing_DecodeHints_setEanAddOnSymbol(zxing_DecodeHints* hints, zxing_EanAddOnSymbol eanAddOnSymbol); void zxing_DecodeHints_setTextMode(zxing_DecodeHints* hints, zxing_TextMode textMode); @@ -147,8 +150,17 @@ typedef struct zxing_Results zxing_Results; void zxing_Result_delete(zxing_Result* result); bool zxing_Result_isValid(const zxing_Result* result); + char* zxing_Result_errorMsg(const zxing_Result* result); zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result); - char* zxing_Result_bytes(const zxing_Result* result, int* len); + uint8_t* zxing_Result_bytes(const zxing_Result* result, int* len); + char* zxing_Result_text(const zxing_Result* result); + char* zxing_Result_ecLevel(const zxing_Result* result); + char* zxing_Result_symbologyIdentifier(const zxing_Result* result); + int zxing_Result_orientation(const zxing_Result* result); + bool zxing_Result_isInverted(const zxing_Result* result); + bool zxing_Result_isMirrored(const zxing_Result* result); + + /* ... */ /* From 7242bdfaa72bdda58f30ecc62ad5bd45c810e390 Mon Sep 17 00:00:00 2001 From: axxel Date: Sat, 1 Jul 2023 22:12:28 +0200 Subject: [PATCH 21/21] c-API: WIP * new BUILD_C_API cmake option * implement multi symbol api * add ContentType * add zxing_BarcodeFormatFromString * minor cleanup --- .github/workflows/ci.yml | 4 +- CMakeLists.txt | 6 ++- wrappers/c/zxing-c-test.c | 32 +++++++++------- wrappers/c/zxing-c.cpp | 77 +++++++++++++++++++-------------------- wrappers/c/zxing-c.h | 31 ++++++++++------ 5 files changed, 81 insertions(+), 69 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f452f5bbc4..5dee725158 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,7 @@ jobs: # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash - run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_BLACKBOX_TESTS=ON -DBUILD_UNIT_TESTS=ON -DBUILD_PYTHON_MODULE=ON + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_BLACKBOX_TESTS=ON -DBUILD_UNIT_TESTS=ON -DBUILD_PYTHON_MODULE=ON -DBUILD_C_API=ON - name: Build working-directory: ${{runner.workspace}}/build @@ -64,7 +64,7 @@ jobs: run: cmake -E make_directory ${{runner.workspace}}/build - name: Configure - run: cmake -S $GITHUB_WORKSPACE -B ${{runner.workspace}}/build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_BLACKBOX_TESTS=ON -DBUILD_UNIT_TESTS=ON -DBUILD_PYTHON_MODULE=OFF -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS="-march=native -fsanitize=address,undefined -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer" + run: cmake -S $GITHUB_WORKSPACE -B ${{runner.workspace}}/build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_BLACKBOX_TESTS=ON -DBUILD_UNIT_TESTS=ON -DBUILD_PYTHON_MODULE=OFF -DBUILD_C_API=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS="-march=native -fsanitize=address,undefined -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer" - name: Build run: cmake --build ${{runner.workspace}}/build -j8 diff --git a/CMakeLists.txt b/CMakeLists.txt index b551f54b5e..299a72a01a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ option (BUILD_EXAMPLES "Build the example barcode reader/writer applications" ON option (BUILD_BLACKBOX_TESTS "Build the black box reader/writer tests" OFF) option (BUILD_UNIT_TESTS "Build the unit tests (don't enable for production builds)" OFF) option (BUILD_PYTHON_MODULE "Build the python module" OFF) +option (BUILD_C_API "Build the C-API" OFF) set(BUILD_DEPENDENCIES "AUTO" CACHE STRING "Fetch from github or use locally installed (AUTO/GITHUB/LOCAL)") if (WIN32) @@ -77,5 +78,6 @@ if (BUILD_PYTHON_MODULE) add_subdirectory (wrappers/python) endif() -add_subdirectory (wrappers/c) - +if (BUILD_C_API) + add_subdirectory (wrappers/c) +endif() diff --git a/wrappers/c/zxing-c-test.c b/wrappers/c/zxing-c-test.c index fb52c4f3a1..24d4457d66 100644 --- a/wrappers/c/zxing-c-test.c +++ b/wrappers/c/zxing-c-test.c @@ -62,19 +62,25 @@ int main(int argc, char** argv) zxing_ImageView* iv = zxing_ImageView_new(data, width, height, zxing_ImageFormat_Lum, 0, 0); - zxing_Result* result = zxing_ReadBarcode(iv, hints); - - if (result) { - printF("Text : %s\n", zxing_Result_text(result)); - printF("Format : %s\n", zxing_BarcodeFormatToString(zxing_Result_format(result))); - printF("Identifier : %s\n", zxing_Result_symbologyIdentifier(result)); - printF("EC Level : %s\n", zxing_Result_ecLevel(result)); - printF("Error : %s\n", zxing_Result_errorMsg(result)); - printf("Rotation : %d\n", zxing_Result_orientation(result)); - printf("isMirrored : %d\n", zxing_Result_isMirrored(result)); - printf("isInverted : %d\n", zxing_Result_isInverted(result)); - - zxing_Result_delete(result); + zxing_Results* results = zxing_ReadBarcodes(iv, hints); + + if (results) { + for (int i = 0, n = zxing_Results_size(results); i < n; ++i) { + const zxing_Result* result = zxing_Results_at(results, i); + + printF("Text : %s\n", zxing_Result_text(result)); + printF("Format : %s\n", zxing_BarcodeFormatToString(zxing_Result_format(result))); + printF("Content : %s\n", zxing_ContentTypeToString(zxing_Result_contentType(result))); + printF("Identifier : %s\n", zxing_Result_symbologyIdentifier(result)); + printF("EC Level : %s\n", zxing_Result_ecLevel(result)); + printF("Error : %s\n", zxing_Result_errorMsg(result)); + printf("Rotation : %d\n", zxing_Result_orientation(result)); + + if (i < n-1) + printf("\n"); + } + + zxing_Results_delete(results); } else { printf("No barcode found\n"); } diff --git a/wrappers/c/zxing-c.cpp b/wrappers/c/zxing-c.cpp index a61f866cab..d368112638 100644 --- a/wrappers/c/zxing-c.cpp +++ b/wrappers/c/zxing-c.cpp @@ -38,35 +38,6 @@ extern "C" delete iv; } - int zxing_ImageView_width(const zxing_ImageView* iv) - { - return iv->width(); - } - - int zxing_ImageView_height(const zxing_ImageView* iv) - { - return iv->height(); - } - - int zxing_ImageView_pixStride(const zxing_ImageView* iv) - { - return iv->pixStride(); - } - - int zxing_ImageView_rowStride(const zxing_ImageView* iv) - { - return iv->rowStride(); - } - - zxing_ImageFormat zxing_ImageView_format(const zxing_ImageView* iv) - { - return static_cast(iv->format()); - } - - /* - * ... - */ - /* * ZXing/BarcodeFormat.h */ @@ -83,6 +54,12 @@ extern "C" } } + zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* str) + { + zxing_BarcodeFormat res = zxing_BarcodeFormatsFromString(str); + return BitHacks::CountBitsSet(res) == 1 ? res : zxing_BarcodeFormat_Invalid; + } + char* zxing_BarcodeFormatToString(zxing_BarcodeFormat format) { return copy(ToString(static_cast(format))); @@ -152,17 +129,13 @@ extern "C" hints->setTextMode(static_cast(textMode)); } - /* - * ... - */ - /* * ZXing/Result.h */ - void zxing_Result_delete(zxing_Result* result) + char* zxing_ContentTypeToString(zxing_ContentType type) { - delete result; + return copy(ToString(static_cast(type))); } bool zxing_Result_isValid(const zxing_Result* result) @@ -180,6 +153,11 @@ extern "C" return static_cast(result->format()); } + zxing_ContentType zxing_Result_contentType(const zxing_Result* result) + { + return static_cast(result->contentType()); + } + uint8_t* zxing_Result_bytes(const zxing_Result* result, int* len) { *len = Size(result->bytes()); @@ -223,10 +201,6 @@ extern "C" return result->isMirrored(); } - /* - * ... - */ - /* * ZXing/ReadBarcode.h */ @@ -239,6 +213,29 @@ extern "C" zxing_Results* zxing_ReadBarcodes(const zxing_ImageView* iv, const zxing_DecodeHints* hints) { - return new Results(ReadBarcodes(*iv, *hints)); + auto res = ReadBarcodes(*iv, *hints); + return !res.empty() ? new Results(std::move(res)) : NULL; + } + + void zxing_Result_delete(zxing_Result* result) + { + delete result; + } + + void zxing_Results_delete(zxing_Results* results) + { + delete results; + } + + int zxing_Results_size(const zxing_Results* results) + { + return Size(*results); + } + + const zxing_Result* zxing_Results_at(const zxing_Results* results, int i) + { + if (i < 0 || i >= Size(*results)) + return NULL; + return &(*results)[i]; } } diff --git a/wrappers/c/zxing-c.h b/wrappers/c/zxing-c.h index 11a06738ae..daded89240 100644 --- a/wrappers/c/zxing-c.h +++ b/wrappers/c/zxing-c.h @@ -52,13 +52,6 @@ typedef struct zxing_Results zxing_Results; int pixStride); void zxing_ImageView_delete(zxing_ImageView* iv); - int zxing_ImageView_width(const zxing_ImageView* iv); - int zxing_ImageView_height(const zxing_ImageView* iv); - int zxing_ImageView_pixStride(const zxing_ImageView* iv); - int zxing_ImageView_rowStride(const zxing_ImageView* iv); - zxing_ImageFormat zxing_ImageView_format(const zxing_ImageView* iv); - /* ... */ - /* * ZXing/BarcodeFormat.h */ @@ -98,6 +91,7 @@ typedef struct zxing_Results zxing_Results; typedef zxing_BarcodeFormat zxing_BarcodeFormats; zxing_BarcodeFormats zxing_BarcodeFormatsFromString(const char* str); + zxing_BarcodeFormat zxing_BarcodeFormatFromString(const char* str); char* zxing_BarcodeFormatToString(zxing_BarcodeFormat format); /* @@ -141,17 +135,27 @@ typedef struct zxing_Results zxing_Results; void zxing_DecodeHints_setBinarizer(zxing_DecodeHints* hints, zxing_Binarizer binarizer); void zxing_DecodeHints_setEanAddOnSymbol(zxing_DecodeHints* hints, zxing_EanAddOnSymbol eanAddOnSymbol); void zxing_DecodeHints_setTextMode(zxing_DecodeHints* hints, zxing_TextMode textMode); - /* ... */ /* * ZXing/Result.h */ - void zxing_Result_delete(zxing_Result* result); + typedef enum + { + zxing_ContentType_Text, + zxing_ContentType_Binary, + zxing_ContentType_Mixed, + zxing_ContentType_GS1, + zxing_ContentType_ISO15434, + zxing_ContentType_UnknownECI + } zxing_ContentType; + + char* zxing_ContentTypeToString(zxing_ContentType type); bool zxing_Result_isValid(const zxing_Result* result); char* zxing_Result_errorMsg(const zxing_Result* result); zxing_BarcodeFormat zxing_Result_format(const zxing_Result* result); + zxing_ContentType zxing_Result_contentType(const zxing_Result* result); uint8_t* zxing_Result_bytes(const zxing_Result* result, int* len); char* zxing_Result_text(const zxing_Result* result); char* zxing_Result_ecLevel(const zxing_Result* result); @@ -160,9 +164,6 @@ typedef struct zxing_Results zxing_Results; bool zxing_Result_isInverted(const zxing_Result* result); bool zxing_Result_isMirrored(const zxing_Result* result); - - /* ... */ - /* * ZXing/ReadBarcode.h */ @@ -170,6 +171,12 @@ typedef struct zxing_Results zxing_Results; zxing_Result* zxing_ReadBarcode(const zxing_ImageView* iv, const zxing_DecodeHints* hints); zxing_Results* zxing_ReadBarcodes(const zxing_ImageView* iv, const zxing_DecodeHints* hints); + void zxing_Result_delete(zxing_Result* result); + void zxing_Results_delete(zxing_Results* results); + + int zxing_Results_size(const zxing_Results* results); + const zxing_Result* zxing_Results_at(const zxing_Results* results, int i); + #ifdef __cplusplus } #endif pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy