Android now uses auto focus, assigns and enables all barcode types
This commit is contained in:
commit
bb3b82aace
56
README.md
Normal file
56
README.md
Normal file
@ -0,0 +1,56 @@
|
||||
# ZBar Barcode Scanner Plugin
|
||||
|
||||
This plugin integrates with the [ZBar](http://zbar.sourceforge.net/) library,
|
||||
exposing a JavaScript interface for scanning barcodes (QR, 2D, etc).
|
||||
|
||||
## Installation
|
||||
|
||||
cordova plugins install org.cloudsky.cordovaplugins.zbar
|
||||
|
||||
## License
|
||||
|
||||
This plugin is released under the Apache 2.0 license, but the ZBar library on which it depends (and which is distribute with this plugin) is under the LGPL license (2.1).
|
||||
|
||||
## API
|
||||
|
||||
### Scan barcode
|
||||
|
||||
cloudSky.zBar.scan(params, onSuccess, onFailure)
|
||||
|
||||
Arguments:
|
||||
|
||||
- **params**: Optional parameters:
|
||||
|
||||
```javascript
|
||||
{
|
||||
text_title: "OPTIONAL Title Text - default = 'Scan QR Code'", // Android only
|
||||
text_instructions: "OPTIONAL Instruction Text - default = 'Please point your camera at the QR code.'", // Android only
|
||||
camera: "front" || "back" // defaults to "back"
|
||||
flash: "on" || "off" || "auto" // defaults to "auto". See Quirks
|
||||
drawSight: true || false //defaults to true, create a red sight/line in the center of the scanner view.
|
||||
}
|
||||
```
|
||||
|
||||
- **onSuccess**: function (s) {...} _Callback for successful scan._
|
||||
- **onFailure**: function (s) {...} _Callback for cancelled scan or error._
|
||||
|
||||
Return:
|
||||
|
||||
- success('scanned bar code') _Successful scan with value of scanned code_
|
||||
- error('cancelled') _If user cancelled the scan (with back button etc)_
|
||||
- error('misc error message') _Misc failure_
|
||||
|
||||
Status:
|
||||
|
||||
- Android: DONE
|
||||
- iOS: DONE
|
||||
|
||||
Quirks:
|
||||
|
||||
- __Android__: Flash "on" may cause the flash to alternate between on and off
|
||||
at about a half second/one second interval, instead of making it stay on...
|
||||
|
||||
|
||||
## Thanks
|
||||
|
||||
Thank you to @PaoloMessina for code contributions.
|
72
android/BarcodeFormat.java
Normal file
72
android/BarcodeFormat.java
Normal file
@ -0,0 +1,72 @@
|
||||
package org.cloudsky.cordovaPlugins;
|
||||
|
||||
import net.sourceforge.zbar.Symbol;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class BarcodeFormat {
|
||||
private int mId;
|
||||
private String mName;
|
||||
|
||||
public static final BarcodeFormat NONE = new BarcodeFormat(Symbol.NONE, "NONE");
|
||||
public static final BarcodeFormat PARTIAL = new BarcodeFormat(Symbol.PARTIAL, "PARTIAL");
|
||||
public static final BarcodeFormat EAN8 = new BarcodeFormat(Symbol.EAN8, "EAN8");
|
||||
public static final BarcodeFormat UPCE = new BarcodeFormat(Symbol.UPCE, "UPCE");
|
||||
public static final BarcodeFormat ISBN10 = new BarcodeFormat(Symbol.ISBN10, "ISBN10");
|
||||
public static final BarcodeFormat UPCA = new BarcodeFormat(Symbol.UPCA, "UPCA");
|
||||
public static final BarcodeFormat EAN13 = new BarcodeFormat(Symbol.EAN13, "EAN13");
|
||||
public static final BarcodeFormat ISBN13 = new BarcodeFormat(Symbol.ISBN13, "ISBN13");
|
||||
public static final BarcodeFormat I25 = new BarcodeFormat(Symbol.I25, "I25");
|
||||
public static final BarcodeFormat DATABAR = new BarcodeFormat(Symbol.DATABAR, "DATABAR");
|
||||
public static final BarcodeFormat DATABAR_EXP = new BarcodeFormat(Symbol.DATABAR_EXP, "DATABAR_EXP");
|
||||
public static final BarcodeFormat CODABAR = new BarcodeFormat(Symbol.CODABAR, "CODABAR");
|
||||
public static final BarcodeFormat CODE39 = new BarcodeFormat(Symbol.CODE39, "CODE39");
|
||||
public static final BarcodeFormat PDF417 = new BarcodeFormat(Symbol.PDF417, "PDF417");
|
||||
public static final BarcodeFormat QRCODE = new BarcodeFormat(Symbol.QRCODE, "QRCODE");
|
||||
public static final BarcodeFormat CODE93 = new BarcodeFormat(Symbol.CODE93, "CODE93");
|
||||
public static final BarcodeFormat CODE128 = new BarcodeFormat(Symbol.CODE128, "CODE128");
|
||||
|
||||
public static final List<BarcodeFormat> ALL_FORMATS = new ArrayList<BarcodeFormat>();
|
||||
|
||||
static {
|
||||
ALL_FORMATS.add(BarcodeFormat.PARTIAL);
|
||||
ALL_FORMATS.add(BarcodeFormat.EAN8);
|
||||
ALL_FORMATS.add(BarcodeFormat.UPCE);
|
||||
ALL_FORMATS.add(BarcodeFormat.ISBN10);
|
||||
ALL_FORMATS.add(BarcodeFormat.UPCA);
|
||||
ALL_FORMATS.add(BarcodeFormat.EAN13);
|
||||
ALL_FORMATS.add(BarcodeFormat.ISBN13);
|
||||
ALL_FORMATS.add(BarcodeFormat.I25);
|
||||
ALL_FORMATS.add(BarcodeFormat.DATABAR);
|
||||
ALL_FORMATS.add(BarcodeFormat.DATABAR_EXP);
|
||||
ALL_FORMATS.add(BarcodeFormat.CODABAR);
|
||||
ALL_FORMATS.add(BarcodeFormat.CODE39);
|
||||
ALL_FORMATS.add(BarcodeFormat.PDF417);
|
||||
ALL_FORMATS.add(BarcodeFormat.QRCODE);
|
||||
ALL_FORMATS.add(BarcodeFormat.CODE93);
|
||||
ALL_FORMATS.add(BarcodeFormat.CODE128);
|
||||
}
|
||||
|
||||
public BarcodeFormat(int id, String name) {
|
||||
mId = id;
|
||||
mName = name;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return mId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return mName;
|
||||
}
|
||||
|
||||
public static BarcodeFormat getFormatById(int id) {
|
||||
for(BarcodeFormat format : ALL_FORMATS) {
|
||||
if(format.getId() == id) {
|
||||
return format;
|
||||
}
|
||||
}
|
||||
return BarcodeFormat.NONE;
|
||||
}
|
||||
}
|
78
android/ZBar.java
Normal file
78
android/ZBar.java
Normal file
@ -0,0 +1,78 @@
|
||||
package org.cloudsky.cordovaPlugins;
|
||||
|
||||
import org.apache.cordova.CordovaPlugin;
|
||||
import org.apache.cordova.CallbackContext;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.Context;
|
||||
|
||||
import org.cloudsky.cordovaPlugins.ZBarScannerActivity;
|
||||
|
||||
public class ZBar extends CordovaPlugin {
|
||||
|
||||
// Configuration ---------------------------------------------------
|
||||
|
||||
private static int SCAN_CODE = 1;
|
||||
|
||||
|
||||
// State -----------------------------------------------------------
|
||||
|
||||
private boolean isInProgress = false;
|
||||
private CallbackContext scanCallbackContext;
|
||||
|
||||
|
||||
// Plugin API ------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean execute (String action, JSONArray args, CallbackContext callbackContext)
|
||||
throws JSONException
|
||||
{
|
||||
if(action.equals("scan")) {
|
||||
if(isInProgress) {
|
||||
callbackContext.error("A scan is already in progress!");
|
||||
} else {
|
||||
isInProgress = true;
|
||||
scanCallbackContext = callbackContext;
|
||||
JSONObject params = args.optJSONObject(0);
|
||||
|
||||
Context appCtx = cordova.getActivity().getApplicationContext();
|
||||
Intent scanIntent = new Intent(appCtx, ZBarScannerActivity.class);
|
||||
scanIntent.putExtra(ZBarScannerActivity.EXTRA_PARAMS, params.toString());
|
||||
cordova.startActivityForResult(this, scanIntent, SCAN_CODE);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// External results handler ----------------------------------------
|
||||
|
||||
@Override
|
||||
public void onActivityResult (int requestCode, int resultCode, Intent result)
|
||||
{
|
||||
if(requestCode == SCAN_CODE) {
|
||||
switch(resultCode) {
|
||||
case Activity.RESULT_OK:
|
||||
String barcodeValue = result.getStringExtra(ZBarScannerActivity.EXTRA_QRVALUE);
|
||||
scanCallbackContext.success(barcodeValue);
|
||||
break;
|
||||
case Activity.RESULT_CANCELED:
|
||||
scanCallbackContext.error("cancelled");
|
||||
break;
|
||||
case ZBarScannerActivity.RESULT_ERROR:
|
||||
scanCallbackContext.error("Scan failed due to an error");
|
||||
break;
|
||||
default:
|
||||
scanCallbackContext.error("Unknown error");
|
||||
}
|
||||
isInProgress = false;
|
||||
scanCallbackContext = null;
|
||||
}
|
||||
}
|
||||
}
|
392
android/ZBarScannerActivity.java
Normal file
392
android/ZBarScannerActivity.java
Normal file
@ -0,0 +1,392 @@
|
||||
package org.cloudsky.cordovaPlugins;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.RuntimeException;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.hardware.Camera;
|
||||
import android.hardware.Camera.CameraInfo;
|
||||
import android.hardware.Camera.PreviewCallback;
|
||||
import android.hardware.Camera.AutoFocusCallback;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.sourceforge.zbar.ImageScanner;
|
||||
import net.sourceforge.zbar.Image;
|
||||
import net.sourceforge.zbar.Symbol;
|
||||
import net.sourceforge.zbar.SymbolSet;
|
||||
import net.sourceforge.zbar.Config;
|
||||
|
||||
public class ZBarScannerActivity extends Activity
|
||||
implements SurfaceHolder.Callback {
|
||||
|
||||
private Collection<BarcodeFormat> mFormats = null;
|
||||
|
||||
// Config ----------------------------------------------------------
|
||||
|
||||
private static int autoFocusInterval = 500; // Interval between AFcallback and next AF attempt.
|
||||
|
||||
// Public Constants ------------------------------------------------
|
||||
|
||||
public static final String EXTRA_QRVALUE = "qrValue";
|
||||
public static final String EXTRA_PARAMS = "params";
|
||||
public static final int RESULT_ERROR = RESULT_FIRST_USER + 1;
|
||||
|
||||
// State -----------------------------------------------------------
|
||||
|
||||
private Camera camera;
|
||||
private Handler autoFocusHandler;
|
||||
private SurfaceView scannerSurface;
|
||||
private SurfaceHolder holder;
|
||||
private ImageScanner scanner;
|
||||
private int surfW, surfH;
|
||||
|
||||
// Customisable stuff
|
||||
String whichCamera;
|
||||
String flashMode;
|
||||
|
||||
// For retrieving R.* resources, from the actual app package
|
||||
// (we can't use actual.application.package.R.* in our code as we
|
||||
// don't know the applciation package name when writing this plugin).
|
||||
private String package_name;
|
||||
private Resources resources;
|
||||
|
||||
// Static initialisers (class) -------------------------------------
|
||||
|
||||
static {
|
||||
// Needed by ZBar??
|
||||
System.loadLibrary("iconv");
|
||||
}
|
||||
|
||||
// Activity Lifecycle ----------------------------------------------
|
||||
|
||||
@Override
|
||||
public void onCreate (Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// Get parameters from JS
|
||||
Intent startIntent = getIntent();
|
||||
String paramStr = startIntent.getStringExtra(EXTRA_PARAMS);
|
||||
JSONObject params;
|
||||
try { params = new JSONObject(paramStr); }
|
||||
catch (JSONException e) { params = new JSONObject(); }
|
||||
String textTitle = params.optString("text_title");
|
||||
String textInstructions = params.optString("text_instructions");
|
||||
Boolean drawSight = params.optBoolean("drawSight", true);
|
||||
whichCamera = params.optString("camera");
|
||||
flashMode = params.optString("flash");
|
||||
|
||||
// Initiate instance variables
|
||||
autoFocusHandler = new Handler();
|
||||
scanner = new ImageScanner();
|
||||
scanner.setConfig(0, Config.X_DENSITY, 3);
|
||||
scanner.setConfig(0, Config.Y_DENSITY, 3);
|
||||
|
||||
for(BarcodeFormat format : getFormats()) {
|
||||
scanner.setConfig(format.getId(), Config.ENABLE, 1);
|
||||
}
|
||||
|
||||
// Set content view
|
||||
setContentView(getResourceId("layout/cszbarscanner"));
|
||||
|
||||
// Update view with customisable strings
|
||||
//TextView view_textTitle = (TextView) findViewById(getResourceId("id/csZbarScannerTitle"));
|
||||
TextView view_textInstructions = (TextView) findViewById(getResourceId("id/csZbarScannerInstructions"));
|
||||
//view_textTitle.setText(textTitle);
|
||||
view_textInstructions.setText(textInstructions);
|
||||
|
||||
// Draw/hide the sight
|
||||
if(!drawSight) {
|
||||
findViewById(getResourceId("id/csZbarScannerSight")).setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
// Create preview SurfaceView
|
||||
scannerSurface = new SurfaceView (this) {
|
||||
@Override
|
||||
public void onSizeChanged (int w, int h, int oldW, int oldH) {
|
||||
surfW = w;
|
||||
surfH = h;
|
||||
matchSurfaceToPreviewRatio();
|
||||
}
|
||||
};
|
||||
scannerSurface.setLayoutParams(new FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
Gravity.CENTER
|
||||
));
|
||||
scannerSurface.getHolder().addCallback(this);
|
||||
|
||||
// Add preview SurfaceView to the screen
|
||||
FrameLayout scannerView = (FrameLayout) findViewById(getResourceId("id/csZbarScannerView"));
|
||||
scannerView.addView(scannerSurface);
|
||||
//findViewById(getResourceId("id/csZbarScannerTitle")).bringToFront();
|
||||
findViewById(getResourceId("id/csZbarScannerInstructions")).bringToFront();
|
||||
findViewById(getResourceId("id/csZbarScannerSightContainer")).bringToFront();
|
||||
findViewById(getResourceId("id/csZbarScannerSight")).bringToFront();
|
||||
scannerView.requestLayout();
|
||||
scannerView.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume ()
|
||||
{
|
||||
super.onResume();
|
||||
|
||||
try {
|
||||
if(whichCamera.equals("front")) {
|
||||
int numCams = Camera.getNumberOfCameras();
|
||||
CameraInfo cameraInfo = new CameraInfo();
|
||||
for(int i=0; i<numCams; i++) {
|
||||
Camera.getCameraInfo(i, cameraInfo);
|
||||
if(cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
|
||||
camera = Camera.open(i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
camera = Camera.open();
|
||||
}
|
||||
|
||||
if(camera == null) throw new Exception ("Error: No suitable camera found.");
|
||||
} catch (RuntimeException e) {
|
||||
die("Error: Could not open the camera.");
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
die(e.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
Camera.Parameters camParams = camera.getParameters();
|
||||
if(flashMode.equals("on")) {
|
||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
|
||||
} else if(flashMode.equals("off")) {
|
||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
|
||||
} else {
|
||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
|
||||
}
|
||||
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||
|
||||
try { camera.setParameters(camParams); }
|
||||
catch (RuntimeException e) {
|
||||
Log.d("csZBar", "Unsupported camera parameter reported for flash mode: "+flashMode);
|
||||
}
|
||||
|
||||
tryStartPreview();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause ()
|
||||
{
|
||||
releaseCamera();
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy ()
|
||||
{
|
||||
scanner.destroy();
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
// Event handlers --------------------------------------------------
|
||||
|
||||
@Override
|
||||
public void onBackPressed ()
|
||||
{
|
||||
setResult(RESULT_CANCELED);
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
// SurfaceHolder.Callback implementation ---------------------------
|
||||
|
||||
@Override
|
||||
public void surfaceCreated (SurfaceHolder hld)
|
||||
{
|
||||
tryStopPreview();
|
||||
holder = hld;
|
||||
tryStartPreview();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed (SurfaceHolder holder)
|
||||
{
|
||||
// No surface == no preview == no point being in this Activity.
|
||||
die("The camera surface was destroyed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceChanged (SurfaceHolder hld, int fmt, int w, int h)
|
||||
{
|
||||
// Sanity check - holder must have a surface...
|
||||
if(hld.getSurface() == null) die("There is no camera surface");
|
||||
|
||||
surfW = w;
|
||||
surfH = h;
|
||||
matchSurfaceToPreviewRatio();
|
||||
|
||||
tryStopPreview();
|
||||
holder = hld;
|
||||
tryStartPreview();
|
||||
}
|
||||
|
||||
// Continuously auto-focus -----------------------------------------
|
||||
|
||||
private AutoFocusCallback autoFocusCb = new AutoFocusCallback()
|
||||
{
|
||||
public void onAutoFocus(boolean success, Camera camera) {
|
||||
// some devices crash without this try/catch and cancelAutoFocus()... (#9)
|
||||
try {
|
||||
camera.cancelAutoFocus();
|
||||
autoFocusHandler.postDelayed(doAutoFocus, autoFocusInterval);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
};
|
||||
|
||||
private Runnable doAutoFocus = new Runnable()
|
||||
{
|
||||
public void run() {
|
||||
if(camera != null) camera.autoFocus(autoFocusCb);
|
||||
}
|
||||
};
|
||||
|
||||
// Camera callbacks ------------------------------------------------
|
||||
|
||||
// Receives frames from the camera and checks for barcodes.
|
||||
private PreviewCallback previewCb = new PreviewCallback()
|
||||
{
|
||||
public void onPreviewFrame(byte[] data, Camera camera) {
|
||||
Camera.Parameters parameters = camera.getParameters();
|
||||
Camera.Size size = parameters.getPreviewSize();
|
||||
|
||||
Image barcode = new Image(size.width, size.height, "Y800");
|
||||
barcode.setData(data);
|
||||
|
||||
if (scanner.scanImage(barcode) != 0) {
|
||||
String qrValue = "";
|
||||
|
||||
SymbolSet syms = scanner.getResults();
|
||||
for (Symbol sym : syms) {
|
||||
qrValue = sym.getData();
|
||||
|
||||
// Return 1st found QR code value to the calling Activity.
|
||||
Intent result = new Intent ();
|
||||
result.putExtra(EXTRA_QRVALUE, qrValue);
|
||||
setResult(Activity.RESULT_OK, result);
|
||||
finish();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Misc ------------------------------------------------------------
|
||||
|
||||
// finish() due to error
|
||||
private void die (String msg)
|
||||
{
|
||||
setResult(RESULT_ERROR);
|
||||
finish();
|
||||
}
|
||||
|
||||
private int getResourceId (String typeAndName)
|
||||
{
|
||||
if(package_name == null) package_name = getApplication().getPackageName();
|
||||
if(resources == null) resources = getApplication().getResources();
|
||||
return resources.getIdentifier(typeAndName, null, package_name);
|
||||
}
|
||||
|
||||
// Release the camera resources and state.
|
||||
private void releaseCamera ()
|
||||
{
|
||||
if (camera != null) {
|
||||
autoFocusHandler.removeCallbacks(doAutoFocus);
|
||||
camera.setPreviewCallback(null);
|
||||
camera.release();
|
||||
camera = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Match the aspect ratio of the preview SurfaceView with the camera's preview aspect ratio,
|
||||
// so that the displayed preview is not stretched/squashed.
|
||||
private void matchSurfaceToPreviewRatio () {
|
||||
if(camera == null) return;
|
||||
if(surfW == 0 || surfH == 0) return;
|
||||
|
||||
// Resize SurfaceView to match camera preview ratio (avoid stretching).
|
||||
Camera.Parameters params = camera.getParameters();
|
||||
Camera.Size size = params.getPreviewSize();
|
||||
float previewRatio = (float) size.height / size.width; // swap h and w as the preview is rotated 90 degrees
|
||||
float surfaceRatio = (float) surfW / surfH;
|
||||
|
||||
if(previewRatio > surfaceRatio) {
|
||||
scannerSurface.setLayoutParams(new FrameLayout.LayoutParams(
|
||||
surfW,
|
||||
Math.round((float) surfW / previewRatio),
|
||||
Gravity.CENTER
|
||||
));
|
||||
} else if(previewRatio < surfaceRatio) {
|
||||
scannerSurface.setLayoutParams(new FrameLayout.LayoutParams(
|
||||
Math.round((float) surfH * previewRatio),
|
||||
surfH,
|
||||
Gravity.CENTER
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// Stop the camera preview safely.
|
||||
private void tryStopPreview () {
|
||||
// Stop camera preview before making changes.
|
||||
try {
|
||||
camera.stopPreview();
|
||||
} catch (Exception e){
|
||||
// Preview was not running. Ignore the error.
|
||||
}
|
||||
}
|
||||
|
||||
public Collection<BarcodeFormat> getFormats() {
|
||||
if(mFormats == null) {
|
||||
return BarcodeFormat.ALL_FORMATS;
|
||||
}
|
||||
return mFormats;
|
||||
}
|
||||
|
||||
// Start the camera preview if possible.
|
||||
// If start is attempted but fails, exit with error message.
|
||||
private void tryStartPreview () {
|
||||
if(holder != null) {
|
||||
try {
|
||||
// 90 degrees rotation for Portrait orientation Activity.
|
||||
camera.setDisplayOrientation(90);
|
||||
|
||||
camera.setPreviewDisplay(holder);
|
||||
camera.setPreviewCallback(previewCb);
|
||||
camera.startPreview();
|
||||
//camera.autoFocus(autoFocusCb); // We are not using any of the
|
||||
// continuous autofocus modes as that does not seem to work
|
||||
// well with flash setting of "on"... At least with this
|
||||
// simple and stupid focus method, we get to turn the flash
|
||||
// on during autofocus.
|
||||
} catch (IOException e) {
|
||||
die("Could not start camera preview: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
BIN
android/libs/armeabi-v7a/libiconv.so
Normal file
BIN
android/libs/armeabi-v7a/libiconv.so
Normal file
Binary file not shown.
BIN
android/libs/armeabi-v7a/libzbarjni.so
Normal file
BIN
android/libs/armeabi-v7a/libzbarjni.so
Normal file
Binary file not shown.
BIN
android/libs/armeabi/libiconv.so
Normal file
BIN
android/libs/armeabi/libiconv.so
Normal file
Binary file not shown.
BIN
android/libs/armeabi/libzbarjni.so
Normal file
BIN
android/libs/armeabi/libzbarjni.so
Normal file
Binary file not shown.
BIN
android/libs/x86/libiconv.so
Normal file
BIN
android/libs/x86/libiconv.so
Normal file
Binary file not shown.
BIN
android/libs/x86/libzbarjni.so
Normal file
BIN
android/libs/x86/libzbarjni.so
Normal file
Binary file not shown.
BIN
android/libs/zbar.jar
Normal file
BIN
android/libs/zbar.jar
Normal file
Binary file not shown.
40
android/res/layout/cszbarscanner.xml
Normal file
40
android/res/layout/cszbarscanner.xml
Normal file
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/csZbarScannerView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/csZbarScannerBackground" >
|
||||
|
||||
|
||||
|
||||
<TextView android:id="@+id/csZbarScannerInstructions"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="15dp"
|
||||
android:paddingLeft="5dp"
|
||||
android:paddingRight="5dp"
|
||||
android:gravity="center"
|
||||
android:textSize="12pt"
|
||||
android:textColor="@color/csZbarScannerTextColor"
|
||||
android:background="@color/csZbarScannerTextBackground"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:text="@string/csZbarScannerInstructions" />
|
||||
|
||||
<RelativeLayout android:id="@+id/csZbarScannerSightContainer"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
|
||||
<View android:id="@+id/csZbarScannerSight"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_centerInParent="true"
|
||||
android:gravity="center_vertical"
|
||||
android:background="#ff0000" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</FrameLayout>
|
13
ios/AlmaZBarReaderViewController.h
Normal file
13
ios/AlmaZBarReaderViewController.h
Normal file
@ -0,0 +1,13 @@
|
||||
//
|
||||
// AlmaZBarReaderViewController.h
|
||||
// BarCodeMix
|
||||
//
|
||||
// Created by eCompliance on 23/01/15.
|
||||
//
|
||||
//
|
||||
|
||||
#import "ZBarReaderViewController.h"
|
||||
|
||||
@interface AlmaZBarReaderViewController : ZBarReaderViewController
|
||||
|
||||
@end
|
41
ios/AlmaZBarReaderViewController.m
Normal file
41
ios/AlmaZBarReaderViewController.m
Normal file
@ -0,0 +1,41 @@
|
||||
//
|
||||
// AlmaZBarReaderViewController.m
|
||||
// BarCodeMix
|
||||
//
|
||||
// Created by eCompliance on 23/01/15.
|
||||
//
|
||||
//
|
||||
|
||||
#import "AlmaZBarReaderViewController.h"
|
||||
|
||||
@interface AlmaZBarReaderViewController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation AlmaZBarReaderViewController
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning {
|
||||
[super didReceiveMemoryWarning];
|
||||
// Dispose of any resources that can be recreated.
|
||||
}
|
||||
|
||||
-(BOOL)shouldAutorotate{
|
||||
return NO;
|
||||
}
|
||||
|
||||
/*
|
||||
#pragma mark - Navigation
|
||||
|
||||
// In a storyboard-based application, you will often want to do a little preparation before navigation
|
||||
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
||||
// Get the new view controller using [segue destinationViewController].
|
||||
// Pass the selected object to the new view controller.
|
||||
}
|
||||
*/
|
||||
|
||||
@end
|
9
ios/CsZBar.h
Normal file
9
ios/CsZBar.h
Normal file
@ -0,0 +1,9 @@
|
||||
#import <Cordova/CDV.h>
|
||||
|
||||
#import "ZBarSDK.h"
|
||||
|
||||
@interface CsZBar : CDVPlugin <ZBarReaderDelegate>
|
||||
|
||||
- (void)scan: (CDVInvokedUrlCommand*)command;
|
||||
|
||||
@end
|
133
ios/CsZBar.m
Normal file
133
ios/CsZBar.m
Normal file
@ -0,0 +1,133 @@
|
||||
#import "CsZBar.h"
|
||||
#import "AlmaZBarReaderViewController.h"
|
||||
|
||||
#pragma mark - State
|
||||
|
||||
@interface CsZBar ()
|
||||
@property bool scanInProgress;
|
||||
@property NSString *scanCallbackId;
|
||||
@property AlmaZBarReaderViewController *scanReader;
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark - Synthesize
|
||||
|
||||
@implementation CsZBar
|
||||
|
||||
@synthesize scanInProgress;
|
||||
@synthesize scanCallbackId;
|
||||
@synthesize scanReader;
|
||||
|
||||
|
||||
#pragma mark - Cordova Plugin
|
||||
|
||||
- (void)pluginInitialize
|
||||
{
|
||||
self.scanInProgress = NO;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Plugin API
|
||||
|
||||
- (void)scan: (CDVInvokedUrlCommand*)command;
|
||||
{
|
||||
if(self.scanInProgress) {
|
||||
[self.commandDelegate
|
||||
sendPluginResult: [CDVPluginResult
|
||||
resultWithStatus: CDVCommandStatus_ERROR
|
||||
messageAsString:@"A scan is already in progress."]
|
||||
callbackId: [command callbackId]];
|
||||
} else {
|
||||
self.scanInProgress = YES;
|
||||
self.scanCallbackId = [command callbackId];
|
||||
self.scanReader = [AlmaZBarReaderViewController new];
|
||||
|
||||
self.scanReader.readerDelegate = self;
|
||||
self.scanReader.supportedOrientationsMask = ZBarOrientationMask(UIInterfaceOrientationPortrait);
|
||||
|
||||
// Get user parameters
|
||||
NSDictionary *params = (NSDictionary*) [command argumentAtIndex:0];
|
||||
NSString *camera = [params objectForKey:@"camera"];
|
||||
if([camera isEqualToString:@"front"]) {
|
||||
// We do not set any specific device for the default "back" setting,
|
||||
// as not all devices will have a rear-facing camera.
|
||||
self.scanReader.cameraDevice = UIImagePickerControllerCameraDeviceFront;
|
||||
}
|
||||
NSString *flash = [params objectForKey:@"flash"];
|
||||
if([flash isEqualToString:@"on"]) {
|
||||
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
|
||||
} else if([flash isEqualToString:@"off"]) {
|
||||
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
|
||||
}
|
||||
|
||||
// Hack to hide the bottom bar's Info button... originally based on http://stackoverflow.com/a/16353530
|
||||
UIView *infoButton = [[[[[self.scanReader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
|
||||
[infoButton setHidden:YES];
|
||||
|
||||
BOOL drawSight = [params objectForKey:@"drawSight"] ? [[params objectForKey:@"drawSight"] boolValue] : true;
|
||||
if(drawSight){
|
||||
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
||||
CGFloat screenWidth = screenRect.size.width;
|
||||
CGFloat screenHeight = screenRect.size.height;
|
||||
CGFloat dim = screenWidth < screenHeight ? screenWidth / 1.1 : screenHeight / 1.1;
|
||||
UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( (screenWidth/2) - (dim/2), (screenHeight/2) - (dim/2), dim, dim)];
|
||||
//polygonView.center = self.scanReader.view.center;
|
||||
//polygonView.layer.borderColor = [UIColor greenColor].CGColor;
|
||||
//polygonView.layer.borderWidth = 3.0f;
|
||||
|
||||
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(dim / 2, 0, 1, dim)];
|
||||
lineView.backgroundColor = [UIColor redColor];
|
||||
[polygonView addSubview:lineView];
|
||||
|
||||
self.scanReader.cameraOverlayView = polygonView;
|
||||
//[self.scanReader.view addSubview:polygonView];
|
||||
}
|
||||
|
||||
[self.viewController presentModalViewController: self.scanReader animated: YES];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Helpers
|
||||
|
||||
- (void)sendScanResult: (CDVPluginResult*)result
|
||||
{
|
||||
[self.commandDelegate sendPluginResult: result callbackId: self.scanCallbackId];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - ZBarReaderDelegate
|
||||
|
||||
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
|
||||
{
|
||||
id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
|
||||
ZBarSymbol *symbol = nil;
|
||||
for(symbol in results) break; // get the first result
|
||||
|
||||
[self.scanReader dismissModalViewControllerAnimated: YES];
|
||||
self.scanInProgress = NO;
|
||||
[self sendScanResult: [CDVPluginResult
|
||||
resultWithStatus: CDVCommandStatus_OK
|
||||
messageAsString: symbol.data]];
|
||||
}
|
||||
|
||||
- (void) imagePickerControllerDidCancel:(UIImagePickerController*)picker
|
||||
{
|
||||
[self.scanReader dismissModalViewControllerAnimated: YES];
|
||||
self.scanInProgress = NO;
|
||||
[self sendScanResult: [CDVPluginResult
|
||||
resultWithStatus: CDVCommandStatus_ERROR
|
||||
messageAsString: @"cancelled"]];
|
||||
}
|
||||
|
||||
- (void) readerControllerDidFailToRead:(ZBarReaderController*)reader withRetry:(BOOL)retry
|
||||
{
|
||||
[self.scanReader dismissModalViewControllerAnimated: YES];
|
||||
self.scanInProgress = NO;
|
||||
[self sendScanResult: [CDVPluginResult
|
||||
resultWithStatus: CDVCommandStatus_ERROR
|
||||
messageAsString: @"Failed"]];
|
||||
}
|
||||
|
||||
|
||||
@end
|
38
ios/Resources/CsZBarScanView.xib
Normal file
38
ios/Resources/CsZBarScanView.xib
Normal file
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1536" identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CsZBarScanViewController"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UeM-cf-0UF">
|
||||
<rect key="frame" x="20" y="514" width="280" height="34"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="34" id="bcw-DT-POo"/>
|
||||
<constraint firstAttribute="width" constant="280" id="w6m-nn-XXq"/>
|
||||
</constraints>
|
||||
<state key="normal" title="Cancel">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="onCancelButtonTap" destination="-1" eventType="touchUpInside" id="FKQ-EE-cRj"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="UeM-cf-0UF" secondAttribute="bottom" constant="20" id="EKk-2g-b6Y"/>
|
||||
<constraint firstAttribute="centerX" secondItem="UeM-cf-0UF" secondAttribute="centerX" id="JvR-9E-Mdj"/>
|
||||
</constraints>
|
||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
|
||||
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina4"/>
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
45
ios/ZBarSDK/ZBarCameraSimulator.h
Normal file
45
ios/ZBarSDK/ZBarCameraSimulator.h
Normal file
@ -0,0 +1,45 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2010-2011 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
@class ZBarReaderView;
|
||||
|
||||
// hack around missing simulator support for AVCapture interfaces
|
||||
|
||||
@interface ZBarCameraSimulator
|
||||
: NSObject
|
||||
< UINavigationControllerDelegate,
|
||||
UIImagePickerControllerDelegate,
|
||||
UIPopoverControllerDelegate >
|
||||
{
|
||||
UIViewController *viewController;
|
||||
ZBarReaderView *readerView;
|
||||
UIImagePickerController *picker;
|
||||
UIPopoverController *pickerPopover;
|
||||
}
|
||||
|
||||
- (id) initWithViewController: (UIViewController*) viewController;
|
||||
- (void) takePicture;
|
||||
|
||||
@property (nonatomic, assign) ZBarReaderView *readerView;
|
||||
|
||||
@end
|
111
ios/ZBarSDK/ZBarCaptureReader.h
Normal file
111
ios/ZBarSDK/ZBarCaptureReader.h
Normal file
@ -0,0 +1,111 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <CoreGraphics/CoreGraphics.h>
|
||||
#import "ZBarImageScanner.h"
|
||||
|
||||
@class AVCaptureVideoDataOutput, AVCaptureOutput;
|
||||
@class ZBarCaptureReader, ZBarCVImage;
|
||||
|
||||
@protocol ZBarCaptureDelegate <NSObject>
|
||||
|
||||
// called when a new barcode is detected. the image refers to the
|
||||
// video buffer and must not be retained for long
|
||||
- (void) captureReader: (ZBarCaptureReader*) captureReader
|
||||
didReadNewSymbolsFromImage: (ZBarImage*) image;
|
||||
|
||||
@optional
|
||||
// called when a potential/uncertain barcode is detected. will also
|
||||
// be called *after* captureReader:didReadNewSymbolsFromImage:
|
||||
// when good barcodes are detected
|
||||
- (void) captureReader: (ZBarCaptureReader*) captureReader
|
||||
didTrackSymbols: (ZBarSymbolSet*) symbols;
|
||||
|
||||
@end
|
||||
|
||||
@interface ZBarCaptureReader
|
||||
: NSObject
|
||||
{
|
||||
#if !TARGET_IPHONE_SIMULATOR
|
||||
AVCaptureVideoDataOutput *captureOutput;
|
||||
id<ZBarCaptureDelegate> captureDelegate;
|
||||
ZBarImageScanner *scanner;
|
||||
CGRect scanCrop;
|
||||
CGSize size;
|
||||
CGFloat framesPerSecond;
|
||||
BOOL enableCache;
|
||||
|
||||
dispatch_queue_t queue;
|
||||
ZBarImage *image;
|
||||
ZBarCVImage *result;
|
||||
volatile uint32_t state;
|
||||
int framecnt;
|
||||
unsigned width, height;
|
||||
uint64_t t_frame, t_fps, t_scan;
|
||||
CGFloat dt_frame;
|
||||
#endif
|
||||
}
|
||||
|
||||
// supply a pre-configured image scanner
|
||||
- (id) initWithImageScanner: (ZBarImageScanner*) imageScanner;
|
||||
|
||||
// this must be called before the session is started
|
||||
- (void) willStartRunning;
|
||||
|
||||
// this must be called *before* the session is stopped
|
||||
- (void) willStopRunning;
|
||||
|
||||
// clear the internal result cache
|
||||
- (void) flushCache;
|
||||
|
||||
// capture the next frame after processing. the captured image will
|
||||
// follow the same delegate path as an image with decoded symbols.
|
||||
- (void) captureFrame;
|
||||
|
||||
// the capture output. add this to an instance of AVCaptureSession
|
||||
@property (nonatomic, readonly) AVCaptureOutput *captureOutput;
|
||||
|
||||
// delegate is notified of decode results and symbol tracking.
|
||||
@property (nonatomic, assign) id<ZBarCaptureDelegate> captureDelegate;
|
||||
|
||||
// access to image scanner for configuration.
|
||||
@property (nonatomic, readonly) ZBarImageScanner *scanner;
|
||||
|
||||
// region of image to scan in normalized coordinates.
|
||||
// NB horizontal crop currently ignored...
|
||||
@property (nonatomic, assign) CGRect scanCrop;
|
||||
|
||||
// size of video frames.
|
||||
@property (nonatomic, readonly) CGSize size;
|
||||
|
||||
// (quickly) gate the reader function without interrupting the video
|
||||
// stream. also flushes the cache when enabled. defaults to *NO*
|
||||
@property (nonatomic) BOOL enableReader;
|
||||
|
||||
// current frame rate (for debug/optimization).
|
||||
// only valid when running
|
||||
@property (nonatomic, readonly) CGFloat framesPerSecond;
|
||||
|
||||
@property (nonatomic) BOOL enableCache;
|
||||
|
||||
@end
|
60
ios/ZBarSDK/ZBarHelpController.h
Normal file
60
ios/ZBarSDK/ZBarHelpController.h
Normal file
@ -0,0 +1,60 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2009-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class ZBarHelpController;
|
||||
|
||||
@protocol ZBarHelpDelegate
|
||||
@optional
|
||||
|
||||
- (void) helpControllerDidFinish: (ZBarHelpController*) help;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
// failure dialog w/a few useful tips
|
||||
|
||||
@interface ZBarHelpController : UIViewController
|
||||
< UIWebViewDelegate,
|
||||
UIAlertViewDelegate >
|
||||
{
|
||||
NSString *reason;
|
||||
id delegate;
|
||||
UIWebView *webView;
|
||||
UIToolbar *toolbar;
|
||||
UIBarButtonItem *doneBtn, *backBtn, *space;
|
||||
NSURL *linkURL;
|
||||
NSUInteger orientations;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) id<ZBarHelpDelegate> delegate;
|
||||
|
||||
// designated initializer
|
||||
- (id) initWithReason: (NSString*) reason;
|
||||
|
||||
- (BOOL) isInterfaceOrientationSupported: (UIInterfaceOrientation) orientation;
|
||||
- (void) setInterfaceOrientation: (UIInterfaceOrientation) orientation
|
||||
supported: (BOOL) supported;
|
||||
|
||||
@end
|
69
ios/ZBarSDK/ZBarImage.h
Normal file
69
ios/ZBarSDK/ZBarImage.h
Normal file
@ -0,0 +1,69 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "zbar.h"
|
||||
#import "ZBarSymbol.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
using namespace zbar;
|
||||
#endif
|
||||
|
||||
// Obj-C wrapper for ZBar image
|
||||
|
||||
@interface ZBarImage : NSObject
|
||||
{
|
||||
zbar_image_t *zimg;
|
||||
double t_convert;
|
||||
}
|
||||
|
||||
@property (nonatomic) unsigned long format;
|
||||
@property (nonatomic) unsigned sequence;
|
||||
@property (nonatomic) CGSize size;
|
||||
@property (nonatomic) CGRect crop;
|
||||
@property (readonly, nonatomic) const void *data;
|
||||
@property (readonly, nonatomic) unsigned long dataLength;
|
||||
@property (copy, nonatomic) ZBarSymbolSet *symbols;
|
||||
@property (readonly, nonatomic) zbar_image_t *zbarImage;
|
||||
@property (readonly, nonatomic) UIImage *UIImage;
|
||||
|
||||
- (id) initWithImage: (zbar_image_t*) image;
|
||||
- (id) initWithCGImage: (CGImageRef) image;
|
||||
- (id) initWithCGImage: (CGImageRef) image
|
||||
size: (CGSize) size;
|
||||
- (id) initWithCGImage: (CGImageRef) image
|
||||
crop: (CGRect) crop
|
||||
size: (CGSize) size;
|
||||
|
||||
- (void) setData: (const void*) data
|
||||
withLength: (unsigned long) length;
|
||||
- (UIImage*) UIImageWithOrientation: (UIImageOrientation) imageOrientation;
|
||||
- (void) cleanup;
|
||||
|
||||
+ (unsigned long) fourcc: (NSString*) format;
|
||||
|
||||
#if 0
|
||||
- convertToFormat: (unsigned long) format;
|
||||
#endif
|
||||
|
||||
@end
|
51
ios/ZBarSDK/ZBarImageScanner.h
Normal file
51
ios/ZBarSDK/ZBarImageScanner.h
Normal file
@ -0,0 +1,51 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "zbar.h"
|
||||
#import "ZBarImage.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
using namespace zbar;
|
||||
#endif
|
||||
|
||||
// Obj-C wrapper for ZBar image scanner
|
||||
|
||||
@interface ZBarImageScanner : NSObject
|
||||
{
|
||||
zbar_image_scanner_t *scanner;
|
||||
}
|
||||
|
||||
@property (nonatomic) BOOL enableCache;
|
||||
@property (readonly, nonatomic) ZBarSymbolSet *results;
|
||||
|
||||
// decoder configuration
|
||||
- (void) parseConfig: (NSString*) configStr;
|
||||
- (void) setSymbology: (zbar_symbol_type_t) symbology
|
||||
config: (zbar_config_t) config
|
||||
to: (int) value;
|
||||
|
||||
// image scanning interface
|
||||
- (NSInteger) scanImage: (ZBarImage*) image;
|
||||
|
||||
@end
|
142
ios/ZBarSDK/ZBarReaderController.h
Normal file
142
ios/ZBarSDK/ZBarReaderController.h
Normal file
@ -0,0 +1,142 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2009-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "ZBarImageScanner.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
using namespace zbar;
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
// default interface provided by UIImagePickerController - user manually
|
||||
// captures an image by pressing a button
|
||||
ZBarReaderControllerCameraModeDefault = 0,
|
||||
|
||||
// automatically scan by taking screenshots with UIGetScreenImage().
|
||||
// resolution is limited by the screen, so this is inappropriate for
|
||||
// longer codes
|
||||
ZBarReaderControllerCameraModeSampling,
|
||||
|
||||
// automatically scan by rapidly taking pictures with takePicture.
|
||||
// tradeoff resolution with frame rate by adjusting the crop, and size
|
||||
// properties of the reader along with the density configs of the image
|
||||
// scanner
|
||||
ZBarReaderControllerCameraModeSequence,
|
||||
|
||||
} ZBarReaderControllerCameraMode;
|
||||
|
||||
|
||||
@class ZBarReaderController, ZBarHelpController;
|
||||
|
||||
@protocol ZBarReaderDelegate <UIImagePickerControllerDelegate>
|
||||
@optional
|
||||
|
||||
// called when no barcode is found in an image selected by the user.
|
||||
// if retry is NO, the delegate *must* dismiss the controller
|
||||
- (void) readerControllerDidFailToRead: (ZBarReaderController*) reader
|
||||
withRetry: (BOOL) retry;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface ZBarReaderController
|
||||
: UIImagePickerController
|
||||
< UINavigationControllerDelegate,
|
||||
UIImagePickerControllerDelegate >
|
||||
{
|
||||
ZBarImageScanner *scanner;
|
||||
ZBarHelpController *help;
|
||||
UIView *overlay, *boxView;
|
||||
CALayer *boxLayer;
|
||||
|
||||
UIToolbar *toolbar;
|
||||
UIBarButtonItem *cancelBtn, *scanBtn, *space[3];
|
||||
UIButton *infoBtn;
|
||||
|
||||
id <ZBarReaderDelegate> readerDelegate;
|
||||
BOOL showsZBarControls, showsHelpOnFail, takesPicture, enableCache;
|
||||
ZBarReaderControllerCameraMode cameraMode;
|
||||
CGRect scanCrop;
|
||||
NSInteger maxScanDimension;
|
||||
|
||||
BOOL hasOverlay, sampling;
|
||||
uint64_t t_frame;
|
||||
double dt_frame;
|
||||
|
||||
ZBarSymbol *symbol;
|
||||
}
|
||||
|
||||
// access to configure image scanner
|
||||
@property (readonly, nonatomic) ZBarImageScanner *scanner;
|
||||
|
||||
// barcode result recipient (NB don't use delegate)
|
||||
@property (nonatomic, assign) id <ZBarReaderDelegate> readerDelegate;
|
||||
|
||||
// whether to use alternate control set
|
||||
@property (nonatomic) BOOL showsZBarControls;
|
||||
|
||||
// whether to display helpful information when decoding fails
|
||||
@property (nonatomic) BOOL showsHelpOnFail;
|
||||
|
||||
// how to use the camera (when sourceType == Camera)
|
||||
@property (nonatomic) ZBarReaderControllerCameraMode cameraMode;
|
||||
|
||||
// whether to outline symbols with the green tracking box.
|
||||
@property (nonatomic) BOOL tracksSymbols;
|
||||
|
||||
// whether to automatically take a full picture when a barcode is detected
|
||||
// (when cameraMode == Sampling)
|
||||
@property (nonatomic) BOOL takesPicture;
|
||||
|
||||
// whether to use the "cache" for realtime modes (default YES). this can be
|
||||
// used to safely disable the inter-frame consistency and duplicate checks,
|
||||
// speeding up recognition, iff:
|
||||
// 1. the controller is dismissed when a barcode is read and
|
||||
// 2. unreliable symbologies are disabled (all EAN/UPC variants and I2/5)
|
||||
@property (nonatomic) BOOL enableCache;
|
||||
|
||||
// crop images for scanning. the original image will be cropped to this
|
||||
// rectangle before scanning. the rectangle is normalized to the image size
|
||||
// and aspect ratio; useful values will place the rectangle between 0 and 1
|
||||
// on each axis, where the x-axis corresponds to the image major axis.
|
||||
// defaults to the full image (0, 0, 1, 1).
|
||||
@property (nonatomic) CGRect scanCrop;
|
||||
|
||||
// scale image to scan. after cropping, the image will be scaled if
|
||||
// necessary, such that neither of its dimensions exceed this value.
|
||||
// defaults to 640.
|
||||
@property (nonatomic) NSInteger maxScanDimension;
|
||||
|
||||
// display the built-in help browser. for use with custom overlays if
|
||||
// you don't also want to create your own help view. only send this
|
||||
// message when the reader is displayed. the argument will be passed
|
||||
// to the onZBarHelp() javascript function.
|
||||
- (void) showHelpWithReason: (NSString*) reason;
|
||||
|
||||
// direct scanner interface - scan UIImage and return something enumerable
|
||||
- (id <NSFastEnumeration>) scanImage: (CGImageRef) image;
|
||||
|
||||
@end
|
||||
|
||||
extern NSString* const ZBarReaderControllerResults;
|
135
ios/ZBarSDK/ZBarReaderView.h
Normal file
135
ios/ZBarSDK/ZBarReaderView.h
Normal file
@ -0,0 +1,135 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "ZBarImageScanner.h"
|
||||
|
||||
@class AVCaptureSession, AVCaptureDevice;
|
||||
@class CALayer;
|
||||
@class ZBarImageScanner, ZBarCaptureReader, ZBarReaderView;
|
||||
|
||||
// delegate is notified of decode results.
|
||||
|
||||
@protocol ZBarReaderViewDelegate < NSObject >
|
||||
|
||||
- (void) readerView: (ZBarReaderView*) readerView
|
||||
didReadSymbols: (ZBarSymbolSet*) symbols
|
||||
fromImage: (UIImage*) image;
|
||||
|
||||
@end
|
||||
|
||||
// read barcodes from the displayed video preview. the view maintains
|
||||
// a complete video capture session feeding a ZBarCaptureReader and
|
||||
// presents the associated preview with symbol tracking annotations.
|
||||
|
||||
@interface ZBarReaderView
|
||||
: UIView
|
||||
{
|
||||
id<ZBarReaderViewDelegate> readerDelegate;
|
||||
ZBarCaptureReader *captureReader;
|
||||
CGRect scanCrop, effectiveCrop;
|
||||
CGAffineTransform previewTransform;
|
||||
CGFloat zoom, zoom0, maxZoom;
|
||||
UIColor *trackingColor;
|
||||
BOOL tracksSymbols, showsFPS;
|
||||
NSInteger torchMode;
|
||||
UIInterfaceOrientation interfaceOrientation;
|
||||
NSTimeInterval animationDuration;
|
||||
|
||||
CALayer *preview, *overlay, *tracking, *cropLayer;
|
||||
UIView *fpsView;
|
||||
UILabel *fpsLabel;
|
||||
UIPinchGestureRecognizer *pinch;
|
||||
CGFloat imageScale;
|
||||
CGSize imageSize;
|
||||
BOOL started, running;
|
||||
}
|
||||
|
||||
// supply a pre-configured image scanner.
|
||||
- (id) initWithImageScanner: (ZBarImageScanner*) imageScanner;
|
||||
|
||||
// start the video stream and barcode reader.
|
||||
- (void) start;
|
||||
|
||||
// stop the video stream and barcode reader.
|
||||
- (void) stop;
|
||||
|
||||
// clear the internal result cache
|
||||
- (void) flushCache;
|
||||
|
||||
// compensate for device/camera/interface orientation
|
||||
- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) orient
|
||||
duration: (NSTimeInterval) duration;
|
||||
|
||||
// delegate is notified of decode results.
|
||||
@property (nonatomic, assign) id<ZBarReaderViewDelegate> readerDelegate;
|
||||
|
||||
// access to image scanner for configuration.
|
||||
@property (nonatomic, readonly) ZBarImageScanner *scanner;
|
||||
|
||||
// whether to display the tracking annotation for uncertain barcodes
|
||||
// (default YES).
|
||||
@property (nonatomic) BOOL tracksSymbols;
|
||||
|
||||
// color of the tracking box (default green)
|
||||
@property (nonatomic, retain) UIColor *trackingColor;
|
||||
|
||||
// enable pinch gesture recognition for zooming the preview/decode
|
||||
// (default YES).
|
||||
@property (nonatomic) BOOL allowsPinchZoom;
|
||||
|
||||
// torch mode to set automatically (default Auto).
|
||||
@property (nonatomic) NSInteger torchMode;
|
||||
|
||||
// whether to display the frame rate for debug/configuration
|
||||
// (default NO).
|
||||
@property (nonatomic) BOOL showsFPS;
|
||||
|
||||
// zoom scale factor applied to video preview *and* scanCrop.
|
||||
// also updated by pinch-zoom gesture. clipped to range [1,maxZoom],
|
||||
// defaults to 1.25
|
||||
@property (nonatomic) CGFloat zoom;
|
||||
- (void) setZoom: (CGFloat) zoom
|
||||
animated: (BOOL) animated;
|
||||
|
||||
// maximum settable zoom factor.
|
||||
@property (nonatomic) CGFloat maxZoom;
|
||||
|
||||
// the region of the image that will be scanned. normalized coordinates.
|
||||
@property (nonatomic) CGRect scanCrop;
|
||||
|
||||
// additional transform applied to video preview.
|
||||
// (NB *not* applied to scan crop)
|
||||
@property (nonatomic) CGAffineTransform previewTransform;
|
||||
|
||||
// specify an alternate capture device.
|
||||
@property (nonatomic, retain) AVCaptureDevice *device;
|
||||
|
||||
// direct access to the capture session. warranty void if opened...
|
||||
@property (nonatomic, readonly) AVCaptureSession *session;
|
||||
@property (nonatomic, readonly) ZBarCaptureReader *captureReader;
|
||||
|
||||
// this flag still works, but its use is deprecated
|
||||
@property (nonatomic) BOOL enableCache;
|
||||
|
||||
@end
|
130
ios/ZBarSDK/ZBarReaderViewController.h
Normal file
130
ios/ZBarSDK/ZBarReaderViewController.h
Normal file
@ -0,0 +1,130 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "ZBarReaderController.h"
|
||||
|
||||
// orientation set support
|
||||
#define ZBarOrientationMask(orient) (1 << orient)
|
||||
#define ZBarOrientationMaskAll \
|
||||
(ZBarOrientationMask(UIInterfaceOrientationPortrait) | \
|
||||
ZBarOrientationMask(UIInterfaceOrientationPortraitUpsideDown) | \
|
||||
ZBarOrientationMask(UIInterfaceOrientationLandscapeLeft) | \
|
||||
ZBarOrientationMask(UIInterfaceOrientationLandscapeRight))
|
||||
|
||||
@class ZBarReaderView, ZBarCameraSimulator;
|
||||
|
||||
// drop in video scanning replacement for ZBarReaderController.
|
||||
// this is a thin controller around a ZBarReaderView that adds the UI
|
||||
// controls and select functionality offered by ZBarReaderController.
|
||||
// Automatically falls back to a ZBarReaderController if video APIs
|
||||
// are unavailable (eg for OS < 4.0)
|
||||
|
||||
@interface ZBarReaderViewController
|
||||
: UIViewController
|
||||
{
|
||||
ZBarImageScanner *scanner;
|
||||
id <ZBarReaderDelegate> readerDelegate;
|
||||
ZBarReaderView *readerView;
|
||||
UIView *cameraOverlayView;
|
||||
CGAffineTransform cameraViewTransform;
|
||||
CGRect scanCrop;
|
||||
NSUInteger supportedOrientationsMask;
|
||||
UIImagePickerControllerCameraDevice cameraDevice;
|
||||
UIImagePickerControllerCameraFlashMode cameraFlashMode;
|
||||
UIImagePickerControllerQualityType videoQuality;
|
||||
BOOL showsZBarControls, tracksSymbols, enableCache;
|
||||
|
||||
ZBarHelpController *helpController;
|
||||
UIView *controls;
|
||||
BOOL didHideStatusBar, rotating;
|
||||
ZBarCameraSimulator *cameraSim;
|
||||
}
|
||||
|
||||
// access to configure image scanner
|
||||
@property (nonatomic, readonly) ZBarImageScanner *scanner;
|
||||
|
||||
// barcode result recipient
|
||||
@property (nonatomic, assign) id <ZBarReaderDelegate> readerDelegate;
|
||||
|
||||
// whether to use alternate control set
|
||||
@property (nonatomic) BOOL showsZBarControls;
|
||||
|
||||
// whether to show the green tracking box. note that, even when
|
||||
// enabled, the box will only be visible when scanning EAN and I2/5.
|
||||
@property (nonatomic) BOOL tracksSymbols;
|
||||
|
||||
// interface orientation support. bit-mask of accepted orientations.
|
||||
// see eg ZBarOrientationMask() and ZBarOrientationMaskAll
|
||||
@property (nonatomic) NSUInteger supportedOrientationsMask;
|
||||
|
||||
// crop images for scanning. the image will be cropped to this
|
||||
// rectangle before scanning. the rectangle is normalized to the
|
||||
// image size and aspect ratio; useful values will place the rectangle
|
||||
// between 0 and 1 on each axis, where the x-axis corresponds to the
|
||||
// image major axis. defaults to the full image (0, 0, 1, 1).
|
||||
@property (nonatomic) CGRect scanCrop;
|
||||
|
||||
// provide a custom overlay. note that this can be used with
|
||||
// showsZBarControls enabled (but not if you want backward compatibility)
|
||||
@property (nonatomic, retain) UIView *cameraOverlayView;
|
||||
|
||||
// transform applied to the preview image.
|
||||
@property (nonatomic) CGAffineTransform cameraViewTransform;
|
||||
|
||||
// display the built-in help browser. the argument will be passed to
|
||||
// the onZBarHelp() javascript function.
|
||||
- (void) showHelpWithReason: (NSString*) reason;
|
||||
|
||||
// capture the next frame and send it over the usual delegate path.
|
||||
- (void) takePicture;
|
||||
|
||||
// these attempt to emulate UIImagePickerController
|
||||
+ (BOOL) isCameraDeviceAvailable: (UIImagePickerControllerCameraDevice) cameraDevice;
|
||||
+ (BOOL) isFlashAvailableForCameraDevice: (UIImagePickerControllerCameraDevice) cameraDevice;
|
||||
+ (NSArray*) availableCaptureModesForCameraDevice: (UIImagePickerControllerCameraDevice) cameraDevice;
|
||||
@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice;
|
||||
@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode;
|
||||
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode;
|
||||
@property(nonatomic) UIImagePickerControllerQualityType videoQuality;
|
||||
|
||||
// direct access to the ZBarReaderView
|
||||
@property (nonatomic, readonly) ZBarReaderView *readerView;
|
||||
|
||||
// this flag still works, but its use is deprecated
|
||||
@property (nonatomic) BOOL enableCache;
|
||||
|
||||
// these are present only for backward compatibility.
|
||||
// they will error if inappropriate/unsupported values are set
|
||||
@property (nonatomic) UIImagePickerControllerSourceType sourceType; // Camera
|
||||
@property (nonatomic) BOOL allowsEditing; // NO
|
||||
@property (nonatomic) BOOL allowsImageEditing; // NO
|
||||
@property (nonatomic) BOOL showsCameraControls; // NO
|
||||
@property (nonatomic) BOOL showsHelpOnFail; // ignored
|
||||
@property (nonatomic) ZBarReaderControllerCameraMode cameraMode; // Sampling
|
||||
@property (nonatomic) BOOL takesPicture; // NO
|
||||
@property (nonatomic) NSInteger maxScanDimension; // ignored
|
||||
|
||||
+ (BOOL) isSourceTypeAvailable: (UIImagePickerControllerSourceType) sourceType;
|
||||
|
||||
@end
|
34
ios/ZBarSDK/ZBarSDK.h
Normal file
34
ios/ZBarSDK/ZBarSDK.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*------------------------------------------------------------------------
|
||||
* Copyright 2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
*
|
||||
* This file is part of the ZBar Bar Code Reader.
|
||||
*
|
||||
* The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
* and/or modify it under the terms of the GNU Lesser Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser Public License
|
||||
* along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
* Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*
|
||||
* http://sourceforge.net/projects/zbar
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
#import "zbar.h"
|
||||
|
||||
#import "ZBarSymbol.h"
|
||||
#import "ZBarImage.h"
|
||||
#import "ZBarImageScanner.h"
|
||||
#import "ZBarReaderView.h"
|
||||
#import "ZBarReaderViewController.h"
|
||||
#import "ZBarReaderController.h"
|
||||
#import "ZBarCaptureReader.h"
|
||||
#import "ZBarHelpController.h"
|
||||
#import "ZBarCameraSimulator.h"
|
71
ios/ZBarSDK/ZBarSymbol.h
Normal file
71
ios/ZBarSDK/ZBarSymbol.h
Normal file
@ -0,0 +1,71 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2009-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreGraphics/CoreGraphics.h>
|
||||
#import "zbar.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
using namespace zbar;
|
||||
#endif
|
||||
|
||||
// Obj-C wrapper for ZBar result types
|
||||
|
||||
@interface ZBarSymbolSet
|
||||
: NSObject <NSFastEnumeration>
|
||||
{
|
||||
const zbar_symbol_set_t *set;
|
||||
BOOL filterSymbols;
|
||||
}
|
||||
|
||||
@property (readonly, nonatomic) int count;
|
||||
@property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
|
||||
@property (nonatomic) BOOL filterSymbols;
|
||||
|
||||
- (id) initWithSymbolSet: (const zbar_symbol_set_t*) set;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface ZBarSymbol : NSObject
|
||||
{
|
||||
const zbar_symbol_t *symbol;
|
||||
}
|
||||
|
||||
@property (readonly, nonatomic) zbar_symbol_type_t type;
|
||||
@property (readonly, nonatomic) NSString *typeName;
|
||||
@property (readonly, nonatomic) NSUInteger configMask;
|
||||
@property (readonly, nonatomic) NSUInteger modifierMask;
|
||||
@property (readonly, nonatomic) NSString *data;
|
||||
@property (readonly, nonatomic) int quality;
|
||||
@property (readonly, nonatomic) int count;
|
||||
@property (readonly, nonatomic) zbar_orientation_t orientation;
|
||||
@property (readonly, nonatomic) ZBarSymbolSet *components;
|
||||
@property (readonly, nonatomic) const zbar_symbol_t *zbarSymbol;
|
||||
@property (readonly, nonatomic) CGRect bounds;
|
||||
|
||||
- (id) initWithSymbol: (const zbar_symbol_t*) symbol;
|
||||
|
||||
+ (NSString*) nameForType: (zbar_symbol_type_t) type;
|
||||
|
||||
@end
|
1497
ios/ZBarSDK/zbar.h
Normal file
1497
ios/ZBarSDK/zbar.h
Normal file
File diff suppressed because it is too large
Load Diff
202
ios/ZBarSDK/zbar/Decoder.h
Normal file
202
ios/ZBarSDK/zbar/Decoder.h
Normal file
@ -0,0 +1,202 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_DECODER_H_
|
||||
#define _ZBAR_DECODER_H_
|
||||
|
||||
/// @file
|
||||
/// Decoder C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Decoder.h"
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// low-level bar width stream decoder interface.
|
||||
/// identifies symbols and extracts encoded data
|
||||
|
||||
class Decoder {
|
||||
public:
|
||||
|
||||
/// Decoder result handler.
|
||||
/// applications should subtype this and pass an instance to
|
||||
/// set_handler() to implement result processing
|
||||
class Handler {
|
||||
public:
|
||||
virtual ~Handler() { }
|
||||
|
||||
/// invoked by the Decoder as decode results become available.
|
||||
virtual void decode_callback(Decoder &decoder) = 0;
|
||||
};
|
||||
|
||||
/// constructor.
|
||||
Decoder ()
|
||||
: _handler(NULL)
|
||||
{
|
||||
_decoder = zbar_decoder_create();
|
||||
}
|
||||
|
||||
~Decoder ()
|
||||
{
|
||||
zbar_decoder_destroy(_decoder);
|
||||
}
|
||||
|
||||
/// clear all decoder state.
|
||||
/// see zbar_decoder_reset()
|
||||
void reset ()
|
||||
{
|
||||
zbar_decoder_reset(_decoder);
|
||||
}
|
||||
|
||||
/// mark start of a new scan pass.
|
||||
/// see zbar_decoder_new_scan()
|
||||
void new_scan ()
|
||||
{
|
||||
zbar_decoder_new_scan(_decoder);
|
||||
}
|
||||
|
||||
/// process next bar/space width from input stream.
|
||||
/// see zbar_decode_width()
|
||||
zbar_symbol_type_t decode_width (unsigned width)
|
||||
{
|
||||
return(zbar_decode_width(_decoder, width));
|
||||
}
|
||||
|
||||
/// process next bar/space width from input stream.
|
||||
/// see zbar_decode_width()
|
||||
Decoder& operator<< (unsigned width)
|
||||
{
|
||||
zbar_decode_width(_decoder, width);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// retrieve color of @em next element passed to Decoder.
|
||||
/// see zbar_decoder_get_color()
|
||||
zbar_color_t get_color () const
|
||||
{
|
||||
return(zbar_decoder_get_color(_decoder));
|
||||
}
|
||||
|
||||
/// retrieve last decoded symbol type.
|
||||
/// see zbar_decoder_get_type()
|
||||
zbar_symbol_type_t get_type () const
|
||||
{
|
||||
return(zbar_decoder_get_type(_decoder));
|
||||
}
|
||||
|
||||
/// retrieve string name of last decoded symbol type.
|
||||
/// see zbar_get_symbol_name()
|
||||
const char *get_symbol_name () const
|
||||
{
|
||||
return(zbar_get_symbol_name(zbar_decoder_get_type(_decoder)));
|
||||
}
|
||||
|
||||
/// retrieve string name for last decode addon.
|
||||
/// see zbar_get_addon_name()
|
||||
/// @deprecated in 0.11
|
||||
const char *get_addon_name () const
|
||||
{
|
||||
return(zbar_get_addon_name(zbar_decoder_get_type(_decoder)));
|
||||
}
|
||||
|
||||
/// retrieve last decoded data in ASCII format as a char array.
|
||||
/// see zbar_decoder_get_data()
|
||||
const char *get_data_chars() const
|
||||
{
|
||||
return(zbar_decoder_get_data(_decoder));
|
||||
}
|
||||
|
||||
/// retrieve last decoded data as a std::string.
|
||||
/// see zbar_decoder_get_data()
|
||||
const std::string get_data_string() const
|
||||
{
|
||||
return(std::string(zbar_decoder_get_data(_decoder),
|
||||
zbar_decoder_get_data_length(_decoder)));
|
||||
}
|
||||
|
||||
/// retrieve last decoded data as a std::string.
|
||||
/// see zbar_decoder_get_data()
|
||||
const std::string get_data() const
|
||||
{
|
||||
return(get_data_string());
|
||||
}
|
||||
|
||||
/// retrieve length of decoded binary data.
|
||||
/// see zbar_decoder_get_data_length()
|
||||
int get_data_length() const
|
||||
{
|
||||
return(zbar_decoder_get_data_length(_decoder));
|
||||
}
|
||||
|
||||
/// retrieve last decode direction.
|
||||
/// see zbar_decoder_get_direction()
|
||||
/// @since 0.11
|
||||
int get_direction() const
|
||||
{
|
||||
return(zbar_decoder_get_direction(_decoder));
|
||||
}
|
||||
|
||||
/// setup callback to handle result data.
|
||||
void set_handler (Handler &handler)
|
||||
{
|
||||
_handler = &handler;
|
||||
zbar_decoder_set_handler(_decoder, _cb);
|
||||
zbar_decoder_set_userdata(_decoder, this);
|
||||
}
|
||||
|
||||
/// set config for indicated symbology (0 for all) to specified value.
|
||||
/// @see zbar_decoder_set_config()
|
||||
/// @since 0.4
|
||||
int set_config (zbar_symbol_type_t symbology,
|
||||
zbar_config_t config,
|
||||
int value)
|
||||
{
|
||||
return(zbar_decoder_set_config(_decoder, symbology, config, value));
|
||||
}
|
||||
|
||||
/// set config parsed from configuration string.
|
||||
/// @see zbar_decoder_parse_config()
|
||||
/// @since 0.4
|
||||
int set_config (std::string cfgstr)
|
||||
{
|
||||
return(zbar_decoder_parse_config(_decoder, cfgstr.c_str()));
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Scanner;
|
||||
zbar_decoder_t *_decoder;
|
||||
Handler *_handler;
|
||||
|
||||
static void _cb (zbar_decoder_t *cdcode)
|
||||
{
|
||||
Decoder *dcode = (Decoder*)zbar_decoder_get_userdata(cdcode);
|
||||
if(dcode && dcode->_handler)
|
||||
dcode->_handler->decode_callback(*dcode);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
187
ios/ZBarSDK/zbar/Exception.h
Normal file
187
ios/ZBarSDK/zbar/Exception.h
Normal file
@ -0,0 +1,187 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_EXCEPTION_H_
|
||||
#define _ZBAR_EXCEPTION_H_
|
||||
|
||||
/// @file
|
||||
/// C++ Exception definitions
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Exception.h"
|
||||
#endif
|
||||
|
||||
#include <exception>
|
||||
#include <new>
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// base class for exceptions defined by this API.
|
||||
class Exception : public std::exception {
|
||||
|
||||
public:
|
||||
/// create exception from C library error
|
||||
Exception (const void *obj = NULL)
|
||||
: std::exception(),
|
||||
_obj(obj)
|
||||
{ }
|
||||
|
||||
~Exception () throw() { }
|
||||
|
||||
/// retrieve error message
|
||||
virtual const char* what () const throw()
|
||||
{
|
||||
if(!_obj)
|
||||
return("zbar library unspecified generic error");
|
||||
return(_zbar_error_string(_obj, 0));
|
||||
}
|
||||
|
||||
private:
|
||||
const void *_obj;
|
||||
};
|
||||
|
||||
/// internal library error.
|
||||
class InternalError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
InternalError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// unsupported request.
|
||||
class UnsupportedError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
UnsupportedError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// invalid request.
|
||||
class InvalidError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
InvalidError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// failed system call.
|
||||
class SystemError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
SystemError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// locking error.
|
||||
class LockingError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
LockingError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// all resources busy.
|
||||
class BusyError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
BusyError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// X11 display error.
|
||||
class XDisplayError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
XDisplayError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// X11 protocol error.
|
||||
class XProtoError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
XProtoError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// output window is closed.
|
||||
class ClosedError : public Exception {
|
||||
public:
|
||||
/// create exception from C library error
|
||||
ClosedError (const void *obj)
|
||||
: Exception(obj)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// image format error
|
||||
class FormatError : public Exception {
|
||||
// FIXME needs c equivalent
|
||||
|
||||
virtual const char* what () const throw()
|
||||
{
|
||||
// FIXME what format?
|
||||
return("unsupported format");
|
||||
}
|
||||
};
|
||||
|
||||
/// @internal
|
||||
|
||||
/// extract error information and create exception.
|
||||
static inline std::exception throw_exception (const void *obj)
|
||||
{
|
||||
switch(_zbar_get_error_code(obj)) {
|
||||
case ZBAR_ERR_NOMEM:
|
||||
throw std::bad_alloc();
|
||||
case ZBAR_ERR_INTERNAL:
|
||||
throw InternalError(obj);
|
||||
case ZBAR_ERR_UNSUPPORTED:
|
||||
throw UnsupportedError(obj);
|
||||
case ZBAR_ERR_INVALID:
|
||||
throw InvalidError(obj);
|
||||
case ZBAR_ERR_SYSTEM:
|
||||
throw SystemError(obj);
|
||||
case ZBAR_ERR_LOCKING:
|
||||
throw LockingError(obj);
|
||||
case ZBAR_ERR_BUSY:
|
||||
throw BusyError(obj);
|
||||
case ZBAR_ERR_XDISPLAY:
|
||||
throw XDisplayError(obj);
|
||||
case ZBAR_ERR_XPROTO:
|
||||
throw XProtoError(obj);
|
||||
case ZBAR_ERR_CLOSED:
|
||||
throw ClosedError(obj);
|
||||
default:
|
||||
throw Exception(obj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
321
ios/ZBarSDK/zbar/Image.h
Normal file
321
ios/ZBarSDK/zbar/Image.h
Normal file
@ -0,0 +1,321 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_IMAGE_H_
|
||||
#define _ZBAR_IMAGE_H_
|
||||
|
||||
/// @file
|
||||
/// Image C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Image.h"
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <iterator>
|
||||
#include "Symbol.h"
|
||||
#include "Exception.h"
|
||||
|
||||
namespace zbar {
|
||||
|
||||
class Video;
|
||||
|
||||
/// stores image data samples along with associated format and size
|
||||
/// metadata
|
||||
|
||||
class Image {
|
||||
public:
|
||||
|
||||
/// general Image result handler.
|
||||
/// applications should subtype this and pass an instance to
|
||||
/// eg. ImageScanner::set_handler() to implement result processing
|
||||
class Handler {
|
||||
public:
|
||||
virtual ~Handler() { }
|
||||
|
||||
/// invoked by library when Image should be processed
|
||||
virtual void image_callback(Image &image) = 0;
|
||||
|
||||
/// cast this handler to the C handler
|
||||
operator zbar_image_data_handler_t* () const
|
||||
{
|
||||
return(_cb);
|
||||
}
|
||||
|
||||
private:
|
||||
static void _cb (zbar_image_t *zimg,
|
||||
const void *userdata)
|
||||
{
|
||||
if(userdata) {
|
||||
Image *image = (Image*)zbar_image_get_userdata(zimg);
|
||||
if(image)
|
||||
((Handler*)userdata)->image_callback(*image);
|
||||
else {
|
||||
Image tmp(zimg, 1);
|
||||
((Handler*)userdata)->image_callback(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class SymbolIterator : public zbar::SymbolIterator {
|
||||
public:
|
||||
/// default constructor.
|
||||
SymbolIterator ()
|
||||
: zbar::SymbolIterator()
|
||||
{ }
|
||||
|
||||
/// constructor.
|
||||
SymbolIterator (const SymbolSet &syms)
|
||||
: zbar::SymbolIterator(syms)
|
||||
{ }
|
||||
|
||||
/// copy constructor.
|
||||
SymbolIterator (const SymbolIterator& iter)
|
||||
: zbar::SymbolIterator(iter)
|
||||
{ }
|
||||
};
|
||||
|
||||
/// constructor.
|
||||
/// create a new Image with the specified parameters
|
||||
Image (unsigned width = 0,
|
||||
unsigned height = 0,
|
||||
const std::string& format = "",
|
||||
const void *data = NULL,
|
||||
unsigned long length = 0)
|
||||
: _img(zbar_image_create())
|
||||
{
|
||||
zbar_image_set_userdata(_img, this);
|
||||
if(width && height)
|
||||
set_size(width, height);
|
||||
if(format.length())
|
||||
set_format(format);
|
||||
if(data && length)
|
||||
set_data(data, length);
|
||||
}
|
||||
|
||||
~Image ()
|
||||
{
|
||||
set_data(NULL, 0);
|
||||
zbar_image_set_userdata(_img, NULL);
|
||||
zbar_image_ref(_img, -1);
|
||||
}
|
||||
|
||||
/// cast to C image object
|
||||
operator const zbar_image_t* () const
|
||||
{
|
||||
return(_img);
|
||||
}
|
||||
|
||||
/// cast to C image object
|
||||
operator zbar_image_t* ()
|
||||
{
|
||||
return(_img);
|
||||
}
|
||||
|
||||
/// retrieve the image format.
|
||||
/// see zbar_image_get_format()
|
||||
unsigned long get_format () const
|
||||
{
|
||||
return(zbar_image_get_format(_img));
|
||||
}
|
||||
|
||||
/// specify the fourcc image format code for image sample data.
|
||||
/// see zbar_image_set_format()
|
||||
void set_format (unsigned long format)
|
||||
{
|
||||
zbar_image_set_format(_img, format);
|
||||
}
|
||||
|
||||
/// specify the fourcc image format code for image sample data.
|
||||
/// see zbar_image_set_format()
|
||||
void set_format (const std::string& format)
|
||||
{
|
||||
unsigned long fourcc = zbar_fourcc_parse(format.c_str());
|
||||
zbar_image_set_format(_img, fourcc);
|
||||
}
|
||||
|
||||
/// retrieve a "sequence" (page/frame) number associated with this
|
||||
/// image.
|
||||
/// see zbar_image_get_sequence()
|
||||
/// @since 0.6
|
||||
unsigned get_sequence () const
|
||||
{
|
||||
return(zbar_image_get_sequence(_img));
|
||||
}
|
||||
|
||||
/// associate a "sequence" (page/frame) number with this image.
|
||||
/// see zbar_image_set_sequence()
|
||||
/// @since 0.6
|
||||
void set_sequence (unsigned sequence_num)
|
||||
{
|
||||
zbar_image_set_sequence(_img, sequence_num);
|
||||
}
|
||||
|
||||
/// retrieve the width of the image.
|
||||
/// see zbar_image_get_width()
|
||||
unsigned get_width () const
|
||||
{
|
||||
return(zbar_image_get_width(_img));
|
||||
}
|
||||
|
||||
/// retrieve the height of the image.
|
||||
/// see zbar_image_get_height()
|
||||
unsigned get_height () const
|
||||
{
|
||||
return(zbar_image_get_height(_img));
|
||||
}
|
||||
|
||||
/// retrieve both dimensions of the image.
|
||||
/// see zbar_image_get_size()
|
||||
/// @since 0.11
|
||||
void get_size (unsigned &width,
|
||||
unsigned &height) const
|
||||
{
|
||||
zbar_image_get_size(_img, &width, &height);
|
||||
}
|
||||
|
||||
/// specify the pixel size of the image.
|
||||
/// see zbar_image_set_size()
|
||||
void set_size (unsigned width,
|
||||
unsigned height)
|
||||
{
|
||||
zbar_image_set_size(_img, width, height);
|
||||
}
|
||||
|
||||
/// retrieve the scan crop rectangle.
|
||||
/// see zbar_image_get_crop()
|
||||
void get_crop (unsigned &x,
|
||||
unsigned &y,
|
||||
unsigned &width,
|
||||
unsigned &height) const
|
||||
{
|
||||
zbar_image_get_crop(_img, &x, &y, &width, &height);
|
||||
}
|
||||
|
||||
/// set the scan crop rectangle.
|
||||
/// see zbar_image_set_crop()
|
||||
void set_crop (unsigned x,
|
||||
unsigned y,
|
||||
unsigned width,
|
||||
unsigned height)
|
||||
{
|
||||
zbar_image_set_crop(_img, x, y, width, height);
|
||||
}
|
||||
|
||||
/// return the image sample data.
|
||||
/// see zbar_image_get_data()
|
||||
const void *get_data () const
|
||||
{
|
||||
return(zbar_image_get_data(_img));
|
||||
}
|
||||
|
||||
/// return the size of the image sample data.
|
||||
/// see zbar_image_get_data_length()
|
||||
/// @since 0.6
|
||||
unsigned long get_data_length () const
|
||||
{
|
||||
return(zbar_image_get_data_length(_img));
|
||||
}
|
||||
|
||||
/// specify image sample data.
|
||||
/// see zbar_image_set_data()
|
||||
void set_data (const void *data,
|
||||
unsigned long length)
|
||||
{
|
||||
zbar_image_set_data(_img, data, length, _cleanup);
|
||||
}
|
||||
|
||||
/// image format conversion.
|
||||
/// see zbar_image_convert()
|
||||
Image convert (unsigned long format) const
|
||||
{
|
||||
zbar_image_t *img = zbar_image_convert(_img, format);
|
||||
if(img)
|
||||
return(Image(img));
|
||||
throw FormatError();
|
||||
}
|
||||
|
||||
/// image format conversion with crop/pad.
|
||||
/// see zbar_image_convert_resize()
|
||||
/// @since 0.4
|
||||
Image convert (unsigned long format,
|
||||
unsigned width,
|
||||
unsigned height) const
|
||||
{
|
||||
zbar_image_t *img =
|
||||
zbar_image_convert_resize(_img, format, width, height);
|
||||
if(img)
|
||||
return(Image(img));
|
||||
throw FormatError();
|
||||
}
|
||||
|
||||
const SymbolSet get_symbols () const {
|
||||
return(SymbolSet(zbar_image_get_symbols(_img)));
|
||||
}
|
||||
|
||||
void set_symbols (const SymbolSet &syms) {
|
||||
zbar_image_set_symbols(_img, syms);
|
||||
}
|
||||
|
||||
/// create a new SymbolIterator over decoded results.
|
||||
SymbolIterator symbol_begin () const {
|
||||
return(SymbolIterator(get_symbols()));
|
||||
}
|
||||
|
||||
/// return a SymbolIterator suitable for ending iteration.
|
||||
SymbolIterator symbol_end () const {
|
||||
return(SymbolIterator());
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
friend class Video;
|
||||
|
||||
/// constructor.
|
||||
/// @internal
|
||||
/// create a new Image from a zbar_image_t C object
|
||||
Image (zbar_image_t *src,
|
||||
int refs = 0)
|
||||
: _img(src)
|
||||
{
|
||||
if(refs)
|
||||
zbar_image_ref(_img, refs);
|
||||
zbar_image_set_userdata(_img, this);
|
||||
}
|
||||
|
||||
/// default data cleanup (noop)
|
||||
/// @internal
|
||||
static void _cleanup (zbar_image_t *img)
|
||||
{
|
||||
// by default nothing is cleaned
|
||||
assert(img);
|
||||
assert(zbar_image_get_userdata(img));
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_image_t *_img;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
130
ios/ZBarSDK/zbar/ImageScanner.h
Normal file
130
ios/ZBarSDK/zbar/ImageScanner.h
Normal file
@ -0,0 +1,130 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_IMAGE_SCANNER_H_
|
||||
#define _ZBAR_IMAGE_SCANNER_H_
|
||||
|
||||
/// @file
|
||||
/// Image Scanner C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/ImageScanner.h"
|
||||
#endif
|
||||
|
||||
#include "Image.h"
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// mid-level image scanner interface.
|
||||
/// reads barcodes from a 2-D Image
|
||||
|
||||
class ImageScanner {
|
||||
public:
|
||||
/// constructor.
|
||||
ImageScanner (zbar_image_scanner_t *scanner = NULL)
|
||||
{
|
||||
if(scanner)
|
||||
_scanner = scanner;
|
||||
else
|
||||
_scanner = zbar_image_scanner_create();
|
||||
}
|
||||
|
||||
~ImageScanner ()
|
||||
{
|
||||
zbar_image_scanner_destroy(_scanner);
|
||||
}
|
||||
|
||||
/// cast to C image_scanner object
|
||||
operator zbar_image_scanner_t* () const
|
||||
{
|
||||
return(_scanner);
|
||||
}
|
||||
|
||||
/// setup result handler callback.
|
||||
void set_handler (Image::Handler &handler)
|
||||
{
|
||||
zbar_image_scanner_set_data_handler(_scanner, handler, &handler);
|
||||
}
|
||||
|
||||
/// set config for indicated symbology (0 for all) to specified value.
|
||||
/// @see zbar_image_scanner_set_config()
|
||||
/// @since 0.4
|
||||
int set_config (zbar_symbol_type_t symbology,
|
||||
zbar_config_t config,
|
||||
int value)
|
||||
{
|
||||
return(zbar_image_scanner_set_config(_scanner, symbology,
|
||||
config, value));
|
||||
}
|
||||
|
||||
/// set config parsed from configuration string.
|
||||
/// @see zbar_image_scanner_parse_config()
|
||||
/// @since 0.4
|
||||
int set_config (std::string cfgstr)
|
||||
{
|
||||
return(zbar_image_scanner_parse_config(_scanner, cfgstr.c_str()));
|
||||
}
|
||||
|
||||
/// enable or disable the inter-image result cache.
|
||||
/// see zbar_image_scanner_enable_cache()
|
||||
void enable_cache (bool enable = true)
|
||||
{
|
||||
zbar_image_scanner_enable_cache(_scanner, enable);
|
||||
}
|
||||
|
||||
/// remove previous results from scanner and image.
|
||||
/// @see zbar_image_scanner_recycle_image()
|
||||
/// @since 0.10
|
||||
void recycle_image (Image &image)
|
||||
{
|
||||
zbar_image_scanner_recycle_image(_scanner, image);
|
||||
}
|
||||
|
||||
/// retrieve decode results for last scanned image.
|
||||
/// @see zbar_image_scanner_get_results()
|
||||
/// @since 0.10
|
||||
const SymbolSet get_results () const {
|
||||
return(SymbolSet(zbar_image_scanner_get_results(_scanner)));
|
||||
}
|
||||
|
||||
/// scan for symbols in provided image.
|
||||
/// see zbar_scan_image()
|
||||
int scan (Image& image)
|
||||
{
|
||||
return(zbar_scan_image(_scanner, image));
|
||||
}
|
||||
|
||||
/// scan for symbols in provided image.
|
||||
/// see zbar_scan_image()
|
||||
ImageScanner& operator<< (Image& image)
|
||||
{
|
||||
scan(image);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_image_scanner_t *_scanner;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
223
ios/ZBarSDK/zbar/Processor.h
Normal file
223
ios/ZBarSDK/zbar/Processor.h
Normal file
@ -0,0 +1,223 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_PROCESSOR_H_
|
||||
#define _ZBAR_PROCESSOR_H_
|
||||
|
||||
/// @file
|
||||
/// Processor C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Processor.h"
|
||||
#endif
|
||||
|
||||
#include "Exception.h"
|
||||
#include "Image.h"
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// high-level self-contained image processor.
|
||||
/// processes video and images for barcodes, optionally displaying
|
||||
/// images to a library owned output window
|
||||
|
||||
class Processor {
|
||||
public:
|
||||
/// value to pass for no timeout.
|
||||
static const int FOREVER = -1;
|
||||
|
||||
/// constructor.
|
||||
Processor (bool threaded = true,
|
||||
const char *video_device = "",
|
||||
bool enable_display = true)
|
||||
{
|
||||
_processor = zbar_processor_create(threaded);
|
||||
if(!_processor)
|
||||
throw std::bad_alloc();
|
||||
init(video_device, enable_display);
|
||||
}
|
||||
|
||||
~Processor ()
|
||||
{
|
||||
zbar_processor_destroy(_processor);
|
||||
}
|
||||
|
||||
/// cast to C processor object.
|
||||
operator zbar_processor_t* ()
|
||||
{
|
||||
return(_processor);
|
||||
}
|
||||
|
||||
/// opens a video input device and/or prepares to display output.
|
||||
/// see zbar_processor_init()
|
||||
void init (const char *video_device = "",
|
||||
bool enable_display = true)
|
||||
{
|
||||
if(zbar_processor_init(_processor, video_device, enable_display))
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// setup result handler callback.
|
||||
/// see zbar_processor_set_data_handler()
|
||||
void set_handler (Image::Handler& handler)
|
||||
{
|
||||
zbar_processor_set_data_handler(_processor, handler, &handler);
|
||||
}
|
||||
|
||||
/// set config for indicated symbology (0 for all) to specified value.
|
||||
/// @see zbar_processor_set_config()
|
||||
/// @since 0.4
|
||||
int set_config (zbar_symbol_type_t symbology,
|
||||
zbar_config_t config,
|
||||
int value)
|
||||
{
|
||||
return(zbar_processor_set_config(_processor, symbology,
|
||||
config, value));
|
||||
}
|
||||
|
||||
/// set config parsed from configuration string.
|
||||
/// @see zbar_processor_parse_config()
|
||||
/// @since 0.4
|
||||
int set_config (std::string cfgstr)
|
||||
{
|
||||
return(zbar_processor_parse_config(_processor, cfgstr.c_str()));
|
||||
}
|
||||
|
||||
/// retrieve the current state of the ouput window.
|
||||
/// see zbar_processor_is_visible()
|
||||
bool is_visible ()
|
||||
{
|
||||
int rc = zbar_processor_is_visible(_processor);
|
||||
if(rc < 0)
|
||||
throw_exception(_processor);
|
||||
return(rc != 0);
|
||||
}
|
||||
|
||||
/// show or hide the display window owned by the library.
|
||||
/// see zbar_processor_set_visible()
|
||||
void set_visible (bool visible = true)
|
||||
{
|
||||
if(zbar_processor_set_visible(_processor, visible) < 0)
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// control the processor in free running video mode.
|
||||
/// see zbar_processor_set_active()
|
||||
void set_active (bool active = true)
|
||||
{
|
||||
if(zbar_processor_set_active(_processor, active) < 0)
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// retrieve decode results for last scanned image.
|
||||
/// @see zbar_processor_get_results()
|
||||
/// @since 0.10
|
||||
const SymbolSet get_results () const {
|
||||
return(SymbolSet(zbar_processor_get_results(_processor)));
|
||||
}
|
||||
|
||||
/// wait for input to the display window from the user.
|
||||
/// see zbar_processor_user_wait()
|
||||
int user_wait (int timeout = FOREVER)
|
||||
{
|
||||
int rc = zbar_processor_user_wait(_processor, timeout);
|
||||
if(rc < 0)
|
||||
throw_exception(_processor);
|
||||
return(rc);
|
||||
}
|
||||
|
||||
/// process from the video stream until a result is available.
|
||||
/// see zbar_process_one()
|
||||
void process_one (int timeout = FOREVER)
|
||||
{
|
||||
if(zbar_process_one(_processor, timeout) < 0)
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// process the provided image for barcodes.
|
||||
/// see zbar_process_image()
|
||||
void process_image (Image& image)
|
||||
{
|
||||
if(zbar_process_image(_processor, image) < 0)
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// process the provided image for barcodes.
|
||||
/// see zbar_process_image()
|
||||
Processor& operator<< (Image& image)
|
||||
{
|
||||
process_image(image);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// force specific input and output formats for debug/testing.
|
||||
/// see zbar_processor_force_format()
|
||||
void force_format (unsigned long input_format,
|
||||
unsigned long output_format)
|
||||
{
|
||||
if(zbar_processor_force_format(_processor, input_format,
|
||||
output_format))
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// force specific input and output formats for debug/testing.
|
||||
/// see zbar_processor_force_format()
|
||||
void force_format (std::string& input_format,
|
||||
std::string& output_format)
|
||||
{
|
||||
unsigned long ifourcc = zbar_fourcc_parse(input_format.c_str());
|
||||
unsigned long ofourcc = zbar_fourcc_parse(output_format.c_str());
|
||||
if(zbar_processor_force_format(_processor, ifourcc, ofourcc))
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
/// request a preferred size for the video image from the device.
|
||||
/// see zbar_processor_request_size()
|
||||
/// @since 0.6
|
||||
void request_size (int width, int height)
|
||||
{
|
||||
zbar_processor_request_size(_processor, width, height);
|
||||
}
|
||||
|
||||
/// request a preferred driver interface version for debug/testing.
|
||||
/// see zbar_processor_request_interface()
|
||||
/// @since 0.6
|
||||
void request_interface (int version)
|
||||
{
|
||||
zbar_processor_request_interface(_processor, version);
|
||||
}
|
||||
|
||||
/// request a preferred I/O mode for debug/testing.
|
||||
/// see zbar_processor_request_iomode()
|
||||
/// @since 0.7
|
||||
void request_iomode (int iomode)
|
||||
{
|
||||
if(zbar_processor_request_iomode(_processor, iomode))
|
||||
throw_exception(_processor);
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_processor_t *_processor;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
162
ios/ZBarSDK/zbar/Scanner.h
Normal file
162
ios/ZBarSDK/zbar/Scanner.h
Normal file
@ -0,0 +1,162 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_SCANNER_H_
|
||||
#define _ZBAR_SCANNER_H_
|
||||
|
||||
/// @file
|
||||
/// Scanner C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Scanner.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// low-level linear intensity sample stream scanner interface.
|
||||
/// identifies "bar" edges and measures width between them.
|
||||
/// optionally passes to bar width Decoder
|
||||
|
||||
class Scanner {
|
||||
public:
|
||||
|
||||
/// constructor.
|
||||
/// @param decoder reference to a Decoder instance which will
|
||||
/// be passed scan results automatically
|
||||
Scanner (Decoder& decoder)
|
||||
{
|
||||
_scanner = zbar_scanner_create(decoder._decoder);
|
||||
}
|
||||
|
||||
/// constructor.
|
||||
/// @param decoder pointer to a Decoder instance which will
|
||||
/// be passed scan results automatically
|
||||
Scanner (Decoder* decoder = NULL)
|
||||
{
|
||||
zbar_decoder_t *zdcode = NULL;
|
||||
if(decoder)
|
||||
zdcode = decoder->_decoder;
|
||||
_scanner = zbar_scanner_create(zdcode);
|
||||
}
|
||||
|
||||
~Scanner ()
|
||||
{
|
||||
zbar_scanner_destroy(_scanner);
|
||||
}
|
||||
|
||||
/// clear all scanner state.
|
||||
/// see zbar_scanner_reset()
|
||||
void reset ()
|
||||
{
|
||||
zbar_scanner_reset(_scanner);
|
||||
}
|
||||
|
||||
/// mark start of a new scan pass.
|
||||
/// see zbar_scanner_new_scan()
|
||||
zbar_symbol_type_t new_scan ()
|
||||
{
|
||||
_type = zbar_scanner_new_scan(_scanner);
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// flush scanner pipeline.
|
||||
/// see zbar_scanner_flush()
|
||||
zbar_symbol_type_t flush ()
|
||||
{
|
||||
_type = zbar_scanner_flush(_scanner);
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// process next sample intensity value.
|
||||
/// see zbar_scan_y()
|
||||
zbar_symbol_type_t scan_y (int y)
|
||||
{
|
||||
_type = zbar_scan_y(_scanner, y);
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// process next sample intensity value.
|
||||
/// see zbar_scan_y()
|
||||
Scanner& operator<< (int y)
|
||||
{
|
||||
_type = zbar_scan_y(_scanner, y);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// process next sample from RGB (or BGR) triple.
|
||||
/// see zbar_scan_rgb24()
|
||||
zbar_symbol_type_t scan_rgb24 (unsigned char *rgb)
|
||||
{
|
||||
_type = zbar_scan_rgb24(_scanner, rgb);
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// process next sample from RGB (or BGR) triple.
|
||||
/// see zbar_scan_rgb24()
|
||||
Scanner& operator<< (unsigned char *rgb)
|
||||
{
|
||||
_type = zbar_scan_rgb24(_scanner, rgb);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// retrieve last scanned width.
|
||||
/// see zbar_scanner_get_width()
|
||||
unsigned get_width () const
|
||||
{
|
||||
return(zbar_scanner_get_width(_scanner));
|
||||
}
|
||||
|
||||
/// retrieve last scanned color.
|
||||
/// see zbar_scanner_get_color()
|
||||
zbar_color_t get_color () const
|
||||
{
|
||||
return(zbar_scanner_get_color(_scanner));
|
||||
}
|
||||
|
||||
/// retrieve last scan result.
|
||||
zbar_symbol_type_t get_type () const
|
||||
{
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// cast to C scanner
|
||||
operator zbar_scanner_t* () const
|
||||
{
|
||||
return(_scanner);
|
||||
}
|
||||
|
||||
/// retrieve C scanner
|
||||
const zbar_scanner_t *get_c_scanner () const
|
||||
{
|
||||
return(_scanner);
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_scanner_t *_scanner;
|
||||
zbar_symbol_type_t _type;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
528
ios/ZBarSDK/zbar/Symbol.h
Normal file
528
ios/ZBarSDK/zbar/Symbol.h
Normal file
@ -0,0 +1,528 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_SYMBOL_H_
|
||||
#define _ZBAR_SYMBOL_H_
|
||||
|
||||
/// @file
|
||||
/// Symbol C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Symbol.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
#include <ostream>
|
||||
#include <assert.h>
|
||||
|
||||
namespace zbar {
|
||||
|
||||
class SymbolIterator;
|
||||
|
||||
/// container for decoded result symbols associated with an image
|
||||
/// or a composite symbol.
|
||||
|
||||
class SymbolSet {
|
||||
public:
|
||||
/// constructor.
|
||||
SymbolSet (const zbar_symbol_set_t *syms = NULL)
|
||||
: _syms(syms)
|
||||
{
|
||||
ref();
|
||||
}
|
||||
|
||||
/// copy constructor.
|
||||
SymbolSet (const SymbolSet& syms)
|
||||
: _syms(syms._syms)
|
||||
{
|
||||
ref();
|
||||
}
|
||||
|
||||
/// destructor.
|
||||
~SymbolSet ()
|
||||
{
|
||||
ref(-1);
|
||||
}
|
||||
|
||||
/// assignment.
|
||||
SymbolSet& operator= (const SymbolSet& syms)
|
||||
{
|
||||
syms.ref();
|
||||
ref(-1);
|
||||
_syms = syms._syms;
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// truth testing.
|
||||
bool operator! () const
|
||||
{
|
||||
return(!_syms || !get_size());
|
||||
}
|
||||
|
||||
/// manipulate reference count.
|
||||
void ref (int delta = 1) const
|
||||
{
|
||||
if(_syms)
|
||||
zbar_symbol_set_ref((zbar_symbol_set_t*)_syms, delta);
|
||||
}
|
||||
|
||||
/// cast to C symbol set.
|
||||
operator const zbar_symbol_set_t* () const
|
||||
{
|
||||
return(_syms);
|
||||
}
|
||||
|
||||
int get_size () const
|
||||
{
|
||||
return((_syms) ? zbar_symbol_set_get_size(_syms) : 0);
|
||||
}
|
||||
|
||||
/// create a new SymbolIterator over decoded results.
|
||||
SymbolIterator symbol_begin() const;
|
||||
|
||||
/// return a SymbolIterator suitable for ending iteration.
|
||||
const SymbolIterator symbol_end() const;
|
||||
|
||||
private:
|
||||
const zbar_symbol_set_t *_syms;
|
||||
};
|
||||
|
||||
/// decoded barcode symbol result object. stores type, data, and
|
||||
/// image location of decoded symbol
|
||||
|
||||
class Symbol {
|
||||
public:
|
||||
|
||||
/// image pixel location (x, y) coordinate tuple.
|
||||
class Point {
|
||||
public:
|
||||
int x; ///< x-coordinate.
|
||||
int y; ///< y-coordinate.
|
||||
|
||||
Point () { }
|
||||
|
||||
Point(int x, int y)
|
||||
: x(x), y(y)
|
||||
{ }
|
||||
|
||||
/// copy constructor.
|
||||
Point (const Point& pt)
|
||||
: x(pt.x),
|
||||
y(pt.y)
|
||||
{ }
|
||||
|
||||
/// assignment.
|
||||
Point& operator= (const Point& pt)
|
||||
{
|
||||
x = pt.x;
|
||||
y = pt.y;
|
||||
return(*this);
|
||||
}
|
||||
};
|
||||
|
||||
/// iteration over Point objects in a symbol location polygon.
|
||||
class PointIterator
|
||||
: public std::iterator<std::input_iterator_tag, Point> {
|
||||
|
||||
public:
|
||||
/// constructor.
|
||||
PointIterator (const Symbol *sym = NULL,
|
||||
int index = 0)
|
||||
: _sym(sym),
|
||||
_index(index)
|
||||
{
|
||||
sym->ref(1);
|
||||
if(!sym ||
|
||||
(unsigned)_index >= zbar_symbol_get_loc_size(*_sym))
|
||||
_index = -1;
|
||||
}
|
||||
|
||||
/// copy constructor.
|
||||
PointIterator (const PointIterator& iter)
|
||||
: _sym(iter._sym),
|
||||
_index(iter._index)
|
||||
{
|
||||
_sym->ref();
|
||||
}
|
||||
|
||||
/// destructor.
|
||||
~PointIterator ()
|
||||
{
|
||||
_sym->ref(-1);
|
||||
}
|
||||
|
||||
/// assignment.
|
||||
PointIterator& operator= (const PointIterator& iter)
|
||||
{
|
||||
iter._sym->ref();
|
||||
_sym->ref(-1);
|
||||
_sym = iter._sym;
|
||||
_index = iter._index;
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// truth testing.
|
||||
bool operator! () const
|
||||
{
|
||||
return(!_sym || _index < 0);
|
||||
}
|
||||
|
||||
/// advance iterator to next Point.
|
||||
PointIterator& operator++ ()
|
||||
{
|
||||
unsigned int i = ++_index;
|
||||
if(i >= zbar_symbol_get_loc_size(*_sym))
|
||||
_index = -1;
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// retrieve currently referenced Point.
|
||||
const Point operator* () const
|
||||
{
|
||||
assert(!!*this);
|
||||
if(!*this)
|
||||
return(Point());
|
||||
return(Point(zbar_symbol_get_loc_x(*_sym, _index),
|
||||
zbar_symbol_get_loc_y(*_sym, _index)));
|
||||
}
|
||||
|
||||
/// test if two iterators refer to the same Point in the same
|
||||
/// Symbol.
|
||||
bool operator== (const PointIterator& iter) const
|
||||
{
|
||||
return(_index == iter._index &&
|
||||
((_index < 0) || _sym == iter._sym));
|
||||
}
|
||||
|
||||
/// test if two iterators refer to the same Point in the same
|
||||
/// Symbol.
|
||||
bool operator!= (const PointIterator& iter) const
|
||||
{
|
||||
return(!(*this == iter));
|
||||
}
|
||||
|
||||
private:
|
||||
const Symbol *_sym;
|
||||
int _index;
|
||||
};
|
||||
|
||||
/// constructor.
|
||||
Symbol (const zbar_symbol_t *sym = NULL)
|
||||
: _xmlbuf(NULL),
|
||||
_xmllen(0)
|
||||
{
|
||||
init(sym);
|
||||
ref();
|
||||
}
|
||||
|
||||
/// copy constructor.
|
||||
Symbol (const Symbol& sym)
|
||||
: _sym(sym._sym),
|
||||
_type(sym._type),
|
||||
_data(sym._data),
|
||||
_xmlbuf(NULL),
|
||||
_xmllen(0)
|
||||
{
|
||||
ref();
|
||||
}
|
||||
|
||||
/// destructor.
|
||||
~Symbol () {
|
||||
if(_xmlbuf)
|
||||
free(_xmlbuf);
|
||||
ref(-1);
|
||||
}
|
||||
|
||||
/// assignment.
|
||||
Symbol& operator= (const Symbol& sym)
|
||||
{
|
||||
sym.ref(1);
|
||||
ref(-1);
|
||||
_sym = sym._sym;
|
||||
_type = sym._type;
|
||||
_data = sym._data;
|
||||
return(*this);
|
||||
}
|
||||
|
||||
Symbol& operator= (const zbar_symbol_t *sym)
|
||||
{
|
||||
if(sym)
|
||||
zbar_symbol_ref(sym, 1);
|
||||
ref(-1);
|
||||
init(sym);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// truth testing.
|
||||
bool operator! () const
|
||||
{
|
||||
return(!_sym);
|
||||
}
|
||||
|
||||
void ref (int delta = 1) const
|
||||
{
|
||||
if(_sym)
|
||||
zbar_symbol_ref((zbar_symbol_t*)_sym, delta);
|
||||
}
|
||||
|
||||
/// cast to C symbol.
|
||||
operator const zbar_symbol_t* () const
|
||||
{
|
||||
return(_sym);
|
||||
}
|
||||
|
||||
/// test if two Symbol objects refer to the same C symbol.
|
||||
bool operator== (const Symbol& sym) const
|
||||
{
|
||||
return(_sym == sym._sym);
|
||||
}
|
||||
|
||||
/// test if two Symbol objects refer to the same C symbol.
|
||||
bool operator!= (const Symbol& sym) const
|
||||
{
|
||||
return(!(*this == sym));
|
||||
}
|
||||
|
||||
/// retrieve type of decoded symbol.
|
||||
zbar_symbol_type_t get_type () const
|
||||
{
|
||||
return(_type);
|
||||
}
|
||||
|
||||
/// retrieve the string name of the symbol type.
|
||||
const std::string get_type_name () const
|
||||
{
|
||||
return(zbar_get_symbol_name(_type));
|
||||
}
|
||||
|
||||
/// retrieve the string name for any addon.
|
||||
/// @deprecated in 0.11
|
||||
const std::string get_addon_name () const
|
||||
{
|
||||
return(zbar_get_addon_name(_type));
|
||||
}
|
||||
|
||||
/// retrieve data decoded from symbol.
|
||||
const std::string get_data () const
|
||||
{
|
||||
return(_data);
|
||||
}
|
||||
|
||||
/// retrieve length of binary data
|
||||
unsigned get_data_length () const
|
||||
{
|
||||
return((_sym) ? zbar_symbol_get_data_length(_sym) : 0);
|
||||
}
|
||||
|
||||
/// retrieve inter-frame coherency count.
|
||||
/// see zbar_symbol_get_count()
|
||||
/// @since 1.5
|
||||
int get_count () const
|
||||
{
|
||||
return((_sym) ? zbar_symbol_get_count(_sym) : -1);
|
||||
}
|
||||
|
||||
SymbolSet get_components () const
|
||||
{
|
||||
return(SymbolSet((_sym) ? zbar_symbol_get_components(_sym) : NULL));
|
||||
}
|
||||
|
||||
/// create a new PointIterator at the start of the location
|
||||
/// polygon.
|
||||
PointIterator point_begin() const
|
||||
{
|
||||
return(PointIterator(this));
|
||||
}
|
||||
|
||||
/// return a PointIterator suitable for ending iteration.
|
||||
const PointIterator point_end() const
|
||||
{
|
||||
return(PointIterator());
|
||||
}
|
||||
|
||||
/// see zbar_symbol_get_loc_size().
|
||||
int get_location_size () const
|
||||
{
|
||||
return((_sym) ? zbar_symbol_get_loc_size(_sym) : 0);
|
||||
}
|
||||
|
||||
/// see zbar_symbol_get_loc_x().
|
||||
int get_location_x (unsigned index) const
|
||||
{
|
||||
return((_sym) ? zbar_symbol_get_loc_x(_sym, index) : -1);
|
||||
}
|
||||
|
||||
/// see zbar_symbol_get_loc_y().
|
||||
int get_location_y (unsigned index) const
|
||||
{
|
||||
return((_sym) ? zbar_symbol_get_loc_y(_sym, index) : -1);
|
||||
}
|
||||
|
||||
/// see zbar_symbol_get_orientation().
|
||||
/// @since 0.11
|
||||
int get_orientation () const
|
||||
{
|
||||
return(zbar_symbol_get_orientation(_sym));
|
||||
}
|
||||
|
||||
/// see zbar_symbol_xml().
|
||||
const std::string xml () const
|
||||
{
|
||||
if(!_sym)
|
||||
return("");
|
||||
return(zbar_symbol_xml(_sym, (char**)&_xmlbuf, (unsigned*)&_xmllen));
|
||||
}
|
||||
|
||||
protected:
|
||||
/// (re)initialize Symbol from C symbol object.
|
||||
void init (const zbar_symbol_t *sym = NULL)
|
||||
{
|
||||
_sym = sym;
|
||||
if(sym) {
|
||||
_type = zbar_symbol_get_type(sym);
|
||||
_data = std::string(zbar_symbol_get_data(sym),
|
||||
zbar_symbol_get_data_length(sym));
|
||||
}
|
||||
else {
|
||||
_type = ZBAR_NONE;
|
||||
_data = "";
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
const zbar_symbol_t *_sym;
|
||||
zbar_symbol_type_t _type;
|
||||
std::string _data;
|
||||
char *_xmlbuf;
|
||||
unsigned _xmllen;
|
||||
};
|
||||
|
||||
/// iteration over Symbol result objects in a scanned Image or SymbolSet.
|
||||
class SymbolIterator
|
||||
: public std::iterator<std::input_iterator_tag, Symbol> {
|
||||
|
||||
public:
|
||||
/// default constructor.
|
||||
SymbolIterator ()
|
||||
{ }
|
||||
|
||||
/// constructor.
|
||||
SymbolIterator (const SymbolSet &syms)
|
||||
: _syms(syms)
|
||||
{
|
||||
const zbar_symbol_set_t *zsyms = _syms;
|
||||
if(zsyms)
|
||||
_sym = zbar_symbol_set_first_symbol(zsyms);
|
||||
}
|
||||
|
||||
/// copy constructor.
|
||||
SymbolIterator (const SymbolIterator& iter)
|
||||
: _syms(iter._syms)
|
||||
{
|
||||
const zbar_symbol_set_t *zsyms = _syms;
|
||||
if(zsyms)
|
||||
_sym = zbar_symbol_set_first_symbol(zsyms);
|
||||
}
|
||||
|
||||
~SymbolIterator ()
|
||||
{
|
||||
}
|
||||
|
||||
/// assignment.
|
||||
SymbolIterator& operator= (const SymbolIterator& iter)
|
||||
{
|
||||
_syms = iter._syms;
|
||||
_sym = iter._sym;
|
||||
return(*this);
|
||||
}
|
||||
|
||||
bool operator! () const
|
||||
{
|
||||
return(!_syms || !_sym);
|
||||
}
|
||||
|
||||
/// advance iterator to next Symbol.
|
||||
SymbolIterator& operator++ ()
|
||||
{
|
||||
if(!!_sym)
|
||||
_sym = zbar_symbol_next(_sym);
|
||||
else if(!!_syms)
|
||||
_sym = zbar_symbol_set_first_symbol(_syms);
|
||||
return(*this);
|
||||
}
|
||||
|
||||
/// retrieve currently referenced Symbol.
|
||||
const Symbol operator* () const
|
||||
{
|
||||
return(_sym);
|
||||
}
|
||||
|
||||
/// access currently referenced Symbol.
|
||||
const Symbol* operator-> () const
|
||||
{
|
||||
return(&_sym);
|
||||
}
|
||||
|
||||
/// test if two iterators refer to the same Symbol
|
||||
bool operator== (const SymbolIterator& iter) const
|
||||
{
|
||||
// it is enough to test the symbols, as they belong
|
||||
// to only one set (also simplifies invalid case)
|
||||
return(_sym == iter._sym);
|
||||
}
|
||||
|
||||
/// test if two iterators refer to the same Symbol
|
||||
bool operator!= (const SymbolIterator& iter) const
|
||||
{
|
||||
return(!(*this == iter));
|
||||
}
|
||||
|
||||
const SymbolIterator end () const {
|
||||
return(SymbolIterator());
|
||||
}
|
||||
|
||||
private:
|
||||
SymbolSet _syms;
|
||||
Symbol _sym;
|
||||
};
|
||||
|
||||
inline SymbolIterator SymbolSet::symbol_begin () const {
|
||||
return(SymbolIterator(*this));
|
||||
}
|
||||
|
||||
inline const SymbolIterator SymbolSet::symbol_end () const {
|
||||
return(SymbolIterator());
|
||||
}
|
||||
|
||||
/// @relates Symbol
|
||||
/// stream the string representation of a Symbol.
|
||||
static inline std::ostream& operator<< (std::ostream& out,
|
||||
const Symbol& sym)
|
||||
{
|
||||
out << sym.get_type_name() << ":" << sym.get_data();
|
||||
return(out);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
170
ios/ZBarSDK/zbar/Video.h
Normal file
170
ios/ZBarSDK/zbar/Video.h
Normal file
@ -0,0 +1,170 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_VIDEO_H_
|
||||
#define _ZBAR_VIDEO_H_
|
||||
|
||||
/// @file
|
||||
/// Video Input C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Video.h"
|
||||
#endif
|
||||
|
||||
#include "Image.h"
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// mid-level video source abstraction.
|
||||
/// captures images from a video device
|
||||
|
||||
class Video {
|
||||
public:
|
||||
/// constructor.
|
||||
Video (zbar_video_t *video = NULL)
|
||||
{
|
||||
if(video)
|
||||
_video = video;
|
||||
else
|
||||
_video = zbar_video_create();
|
||||
}
|
||||
|
||||
/// constructor.
|
||||
Video (std::string& device)
|
||||
{
|
||||
_video = zbar_video_create();
|
||||
open(device);
|
||||
}
|
||||
|
||||
~Video ()
|
||||
{
|
||||
zbar_video_destroy(_video);
|
||||
}
|
||||
|
||||
/// cast to C video object.
|
||||
operator zbar_video_t* () const
|
||||
{
|
||||
return(_video);
|
||||
}
|
||||
|
||||
/// open and probe a video device.
|
||||
void open (std::string& device)
|
||||
{
|
||||
if(zbar_video_open(_video, device.c_str()))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
/// close video device if open.
|
||||
void close ()
|
||||
{
|
||||
if(zbar_video_open(_video, NULL))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
/// initialize video using a specific format for debug.
|
||||
/// see zbar_video_init()
|
||||
void init (unsigned long fourcc)
|
||||
{
|
||||
if(zbar_video_init(_video, fourcc))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
/// initialize video using a specific format for debug.
|
||||
/// see zbar_video_init()
|
||||
void init (std::string& format)
|
||||
{
|
||||
unsigned int fourcc = zbar_fourcc_parse(format.c_str());
|
||||
if(zbar_video_init(_video, fourcc))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
/// retrieve file descriptor associated with open *nix video device.
|
||||
/// see zbar_video_get_fd()
|
||||
int get_fd ()
|
||||
{
|
||||
return(zbar_video_get_fd(_video));
|
||||
}
|
||||
|
||||
/// retrieve current output image width.
|
||||
/// see zbar_video_get_width()
|
||||
int get_width ()
|
||||
{
|
||||
return(zbar_video_get_width(_video));
|
||||
}
|
||||
|
||||
/// retrieve current output image height.
|
||||
/// see zbar_video_get_height()
|
||||
int get_height ()
|
||||
{
|
||||
return(zbar_video_get_height(_video));
|
||||
}
|
||||
|
||||
/// start/stop video capture.
|
||||
/// see zbar_video_enable()
|
||||
void enable (bool enable = true)
|
||||
{
|
||||
if(zbar_video_enable(_video, enable))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
/// retrieve next captured image.
|
||||
/// see zbar_video_next_image()
|
||||
Image next_image ()
|
||||
{
|
||||
zbar_image_t *img = zbar_video_next_image(_video);
|
||||
if(!img)
|
||||
throw_exception(_video);
|
||||
return(Image(img));
|
||||
}
|
||||
|
||||
/// request a preferred size for the video image from the device.
|
||||
/// see zbar_video_request_size()
|
||||
/// @since 0.6
|
||||
void request_size (int width, int height)
|
||||
{
|
||||
zbar_video_request_size(_video, width, height);
|
||||
}
|
||||
|
||||
/// request a preferred driver interface version for debug/testing.
|
||||
/// see zbar_video_request_interface()
|
||||
/// @since 0.6
|
||||
void request_interface (int version)
|
||||
{
|
||||
zbar_video_request_interface(_video, version);
|
||||
}
|
||||
|
||||
/// request a preferred I/O mode for debug/testing.
|
||||
/// see zbar_video_request_iomode()
|
||||
/// @since 0.7
|
||||
void request_iomode (int iomode)
|
||||
{
|
||||
if(zbar_video_request_iomode(_video, iomode))
|
||||
throw_exception(_video);
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_video_t *_video;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
136
ios/ZBarSDK/zbar/Window.h
Normal file
136
ios/ZBarSDK/zbar/Window.h
Normal file
@ -0,0 +1,136 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
|
||||
//
|
||||
// This file is part of the ZBar Bar Code Reader.
|
||||
//
|
||||
// The ZBar Bar Code Reader is free software; you can redistribute it
|
||||
// and/or modify it under the terms of the GNU Lesser Public License as
|
||||
// published by the Free Software Foundation; either version 2.1 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// The ZBar Bar Code Reader is distributed in the hope that it will be
|
||||
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser Public License
|
||||
// along with the ZBar Bar Code Reader; if not, write to the Free
|
||||
// Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
// Boston, MA 02110-1301 USA
|
||||
//
|
||||
// http://sourceforge.net/projects/zbar
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef _ZBAR_WINDOW_H_
|
||||
#define _ZBAR_WINDOW_H_
|
||||
|
||||
/// @file
|
||||
/// Output Window C++ wrapper
|
||||
|
||||
#ifndef _ZBAR_H_
|
||||
# error "include zbar.h in your application, **not** zbar/Window.h"
|
||||
#endif
|
||||
|
||||
#include "Image.h"
|
||||
|
||||
namespace zbar {
|
||||
|
||||
/// mid-level output window abstraction.
|
||||
/// displays images to user-specified platform specific output window
|
||||
|
||||
class Window {
|
||||
public:
|
||||
/// constructor.
|
||||
Window (zbar_window_t *window = NULL)
|
||||
{
|
||||
if(window)
|
||||
_window = window;
|
||||
else
|
||||
_window = zbar_window_create();
|
||||
}
|
||||
|
||||
/// constructor.
|
||||
Window (void *x11_display_w32_hwnd,
|
||||
unsigned long x11_drawable)
|
||||
{
|
||||
_window = zbar_window_create();
|
||||
attach(x11_display_w32_hwnd, x11_drawable);
|
||||
}
|
||||
|
||||
~Window ()
|
||||
{
|
||||
zbar_window_destroy(_window);
|
||||
}
|
||||
|
||||
/// cast to C window object.
|
||||
operator zbar_window_t* () const
|
||||
{
|
||||
return(_window);
|
||||
}
|
||||
|
||||
/// associate reader with an existing platform window.
|
||||
/// see zbar_window_attach()
|
||||
void attach (void *x11_display_w32_hwnd,
|
||||
unsigned long x11_drawable = 0)
|
||||
{
|
||||
if(zbar_window_attach(_window,
|
||||
x11_display_w32_hwnd, x11_drawable) < 0)
|
||||
throw_exception(_window);
|
||||
}
|
||||
|
||||
/// control content level of the reader overlay.
|
||||
/// see zbar_window_set_overlay()
|
||||
void set_overlay (int level)
|
||||
{
|
||||
zbar_window_set_overlay(_window, level);
|
||||
}
|
||||
|
||||
/// retrieve current content level of reader overlay.
|
||||
/// see zbar_window_get_overlay()
|
||||
|
||||
/// draw a new image into the output window.
|
||||
/// see zbar_window_draw()
|
||||
void draw (Image& image)
|
||||
{
|
||||
if(zbar_window_draw(_window, image) < 0)
|
||||
throw_exception(_window);
|
||||
}
|
||||
|
||||
/// clear the image from the output window.
|
||||
/// see zbar_window_draw()
|
||||
void clear ()
|
||||
{
|
||||
if(zbar_window_draw(_window, NULL) < 0)
|
||||
throw_exception(_window);
|
||||
}
|
||||
|
||||
/// redraw the last image.
|
||||
/// zbar_window_redraw()
|
||||
void redraw ()
|
||||
{
|
||||
if(zbar_window_redraw(_window) < 0)
|
||||
throw_exception(_window);
|
||||
}
|
||||
|
||||
/// resize the image window.
|
||||
/// zbar_window_resize()
|
||||
void resize (unsigned width, unsigned height)
|
||||
{
|
||||
if(zbar_window_resize(_window, width, height) < 0)
|
||||
throw_exception(_window);
|
||||
}
|
||||
|
||||
private:
|
||||
zbar_window_t *_window;
|
||||
};
|
||||
|
||||
/// select a compatible format between video input and output window.
|
||||
/// see zbar_negotiate_format()
|
||||
static inline void negotiate_format (Video& video, Window& window)
|
||||
{
|
||||
if(zbar_negotiate_format(video, window) < 0)
|
||||
throw_exception(video);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
BIN
ios/libzbar.a
Normal file
BIN
ios/libzbar.a
Normal file
Binary file not shown.
25
package.json
Normal file
25
package.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"version": "1.3.0",
|
||||
"name": "org.cloudsky.cordovaplugins.zbar",
|
||||
"cordova_name": "ZBar barcode scanner",
|
||||
"description": "Plugin to integrate with the ZBar barcode scanning library.",
|
||||
"license": "Apache 2.0",
|
||||
"keywords": [
|
||||
"cszbar",
|
||||
"zbar",
|
||||
"barcode",
|
||||
"qr",
|
||||
"qr code",
|
||||
"scanner"
|
||||
],
|
||||
"platforms": [
|
||||
"android",
|
||||
"ios"
|
||||
],
|
||||
"engines": [
|
||||
{
|
||||
"name": "cordova",
|
||||
"version": ">=3.0.0"
|
||||
}
|
||||
]
|
||||
}
|
98
plugin.xml
Normal file
98
plugin.xml
Normal file
@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
||||
id="org.cloudsky.cordovaplugins.zbar" version="1.3.0">
|
||||
|
||||
<engines>
|
||||
<engine name="cordova" version=">=3.0.0" />
|
||||
</engines>
|
||||
|
||||
<name>ZBar barcode scanner</name>
|
||||
<author>TJ Woon (tj@cloudsky.org)</author>
|
||||
<description>Plugin to integrate with the ZBar barcode scanning library.</description>
|
||||
<license>Apache 2.0</license>
|
||||
<keywords>cszbar,zbar,barcode,qr,qr code,scanner</keywords>
|
||||
|
||||
<js-module src="www/zbar.js" name="zBar">
|
||||
<clobbers target="cloudSky.zBar" />
|
||||
</js-module>
|
||||
|
||||
<platform name="android">
|
||||
<config-file target="res/xml/config.xml" parent="/*">
|
||||
<feature name="CsZBar">
|
||||
<param name="android-package" value="org.cloudsky.cordovaPlugins.ZBar"/>
|
||||
</feature>
|
||||
</config-file>
|
||||
<config-file target="AndroidManifest.xml" parent="application">
|
||||
<activity
|
||||
android:name="org.cloudsky.cordovaPlugins.ZBarScannerActivity"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
|
||||
android:screenOrientation="portrait" >
|
||||
</activity>
|
||||
</config-file>
|
||||
<config-file target="AndroidManifest.xml" parent="/*">
|
||||
<uses-feature android:name="android.hardware.camera" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera.front" android:required="false" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
</config-file>
|
||||
<config-file target="res/values/strings.xml" parent="/*">
|
||||
<string name="csZbarScannerTitle">Scan QR Code</string>
|
||||
<string name="csZbarScannerInstructions">Please point your camera at the QR code.</string>
|
||||
<color name="csZbarScannerTextColor">#ffffff</color>
|
||||
<color name="csZbarScannerTextBackground">#88000000</color>
|
||||
<color name="csZbarScannerBackground">#000000</color>
|
||||
</config-file>
|
||||
<resource-file src="android/res/layout/cszbarscanner.xml" target="res/layout/cszbarscanner.xml" />
|
||||
<source-file src="android/BarcodeFormat.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
||||
<source-file src="android/ZBar.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
||||
<source-file src="android/ZBarScannerActivity.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
||||
<source-file src="android/libs/zbar.jar" target-dir="libs" />
|
||||
<source-file src="android/libs/armeabi/libiconv.so" target-dir="libs/armeabi" />
|
||||
<source-file src="android/libs/armeabi/libzbarjni.so" target-dir="libs/armeabi" />
|
||||
<source-file src="android/libs/armeabi-v7a/libiconv.so" target-dir="libs/armeabi-v7a" />
|
||||
<source-file src="android/libs/armeabi-v7a/libzbarjni.so" target-dir="libs/armeabi-v7a" />
|
||||
<source-file src="android/libs/x86/libiconv.so" target-dir="libs/x86" />
|
||||
<source-file src="android/libs/x86/libzbarjni.so" target-dir="libs/x86" />
|
||||
</platform>
|
||||
|
||||
<platform name="ios">
|
||||
<config-file target="config.xml" parent="/*">
|
||||
<feature name="CsZBar">
|
||||
<param name="ios-package" value="CsZBar"/>
|
||||
</feature>
|
||||
</config-file>
|
||||
<framework src="AVFoundation.framework" />
|
||||
<framework src="CoreMedia.framework" />
|
||||
<framework src="CoreVideo.framework" />
|
||||
<framework src="QuartzCore.framework" />
|
||||
<framework src="libiconv.dylib" />
|
||||
<source-file src="ios/libzbar.a" framework="true" />
|
||||
<source-file src="ios/CsZBar.m" />
|
||||
<header-file src="ios/CsZBar.h" />
|
||||
<source-file src="ios/AlmaZBarReaderViewController.m" />
|
||||
<header-file src="ios/AlmaZBarReaderViewController.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarCameraSimulator.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarCaptureReader.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarHelpController.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarImage.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarImageScanner.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarReaderController.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarReaderView.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarReaderViewController.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarSDK.h" />
|
||||
<header-file src="ios/ZBarSDK/ZBarSymbol.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Decoder.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Exception.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Image.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/ImageScanner.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Processor.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Scanner.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Symbol.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Video.h" />
|
||||
<header-file src="ios/ZBarSDK/zbar/Window.h" />
|
||||
<resource-file src="ios/Resources/CsZBarScanView.xib" />
|
||||
</platform>
|
||||
|
||||
</plugin>
|
23
www/zbar.js
Normal file
23
www/zbar.js
Normal file
@ -0,0 +1,23 @@
|
||||
var argscheck = require('cordova/argscheck'),
|
||||
exec = require('cordova/exec');
|
||||
|
||||
function ZBar () {};
|
||||
|
||||
ZBar.prototype = {
|
||||
|
||||
scan: function (params, success, failure)
|
||||
{
|
||||
argscheck.checkArgs('*fF', 'CsZBar.scan', arguments);
|
||||
|
||||
params = params || {};
|
||||
if(params.text_title === undefined) params.text_title = "Scan QR Code";
|
||||
if(params.text_instructions === undefined) params.text_instructions = "Please point your camera at the QR code.";
|
||||
if(params.camera != "front") params.camera = "back";
|
||||
if(params.flash != "on" && params.flash != "off") params.flash = "auto";
|
||||
|
||||
exec(success, failure, 'CsZBar', 'scan', [params]);
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
module.exports = new ZBar;
|
Loading…
Reference in New Issue
Block a user