C++: added GreyscaleLuminanceSource
authorflyashi <flyashi@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Mon, 19 Jul 2010 20:53:17 +0000 (20:53 +0000)
committerflyashi <flyashi@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Mon, 19 Jul 2010 20:53:17 +0000 (20:53 +0000)
It takes a block of greyscale data, width, height, and cropping parameters, and provides a LuminanceSource interface, with rotation (although only 1D is supported for the rotated object at the moment.)

git-svn-id: http://zxing.googlecode.com/svn/trunk@1488 59b500cc-1b3d-0410-9834-0bbf25fbcc57

cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp [new file with mode: 0644]
cpp/core/src/zxing/common/GreyscaleLuminanceSource.h [new file with mode: 0644]
cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp [new file with mode: 0644]
cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h [new file with mode: 0644]

diff --git a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp
new file mode 100644 (file)
index 0000000..4868003
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ *  GreyscaleLuminanceSource.cpp
+ *  zxing
+ *
+ *  Copyright 2010 ZXing authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <zxing/common/GreyscaleLuminanceSource.h>
+#include <zxing/common/GreyscaleRotatedLuminanceSource.h>
+#include <zxing/common/IllegalArgumentException.h>
+
+namespace zxing {
+
+GreyscaleLuminanceSource::GreyscaleLuminanceSource(unsigned char* greyData, int dataWidth, int dataHeight, int left, int top,
+      int width, int height) : greyData_(greyData), dataWidth_(dataWidth), dataHeight_(dataHeight),
+      left_(left), top_(top), width_(width), height_(height)  {
+
+  if (left + width > dataWidth || top + height > dataHeight || top < 0 || left < 0) {
+    throw IllegalArgumentException("Crop rectangle does not fit within image data.");
+  }
+}
+
+unsigned char* GreyscaleLuminanceSource::getRow(int y, unsigned char* row) {
+
+  if (y < 0 || y >= this->getHeight()) {
+    throw IllegalArgumentException("Requested row is outside the image: " + y);
+  }
+  int width = getWidth();
+  // TODO(flyashi): determine if row has enough size.
+  if (row == NULL) {
+    row = new unsigned char[width_];
+  }
+  int offset = (y + top_) * dataWidth_ + left_;
+  memcpy(row, &greyData_[offset], width);
+
+  return row;
+}
+
+
+unsigned char* GreyscaleLuminanceSource::getMatrix() {
+  return greyData_;
+}
+
+Ref<LuminanceSource> GreyscaleLuminanceSource::rotateCounterClockwise() {
+  // Intentionally flip the left, top, width, and height arguments as needed. dataWidth and
+  // dataHeight are always kept unrotated.
+  return Ref<LuminanceSource> (new GreyscaleRotatedLuminanceSource(greyData_, dataWidth_, dataHeight_,
+                               top_, left_, height_, width_));
+}
+
+
+} /* namespace */
+
diff --git a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h
new file mode 100644 (file)
index 0000000..cfc6285
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ *  GreyscaleLuminanceSource.h
+ *  zxing
+ *
+ *  Copyright 2010 ZXing authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GREYSCALE_LUMINANCE_SOURCE__
+#define __GREYSCALE_LUMINANCE_SOURCE__
+
+#include <zxing/LuminanceSource.h>
+
+namespace zxing {
+
+class GreyscaleLuminanceSource : public LuminanceSource {
+
+ private:
+  unsigned char* greyData_;
+  int dataWidth_;
+  int dataHeight_;
+  int left_;
+  int top_;
+  int width_;
+  int height_;
+
+ public:
+  GreyscaleLuminanceSource(unsigned char* greyData, int dataWidth, int dataHeight, int left, int top,
+      int width, int height);
+
+  unsigned char* getRow(int y, unsigned char* row);
+
+  unsigned char* getMatrix();
+
+  bool isRotateSupported() const {
+    return true;
+  }
+
+  int getWidth() const {
+    return width_;
+  }
+
+  int getHeight() const {
+    return height_;
+  }
+
+  Ref<LuminanceSource> rotateCounterClockwise();
+  
+};
+
+} /* namespace */
+
+#endif
diff --git a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp
new file mode 100644 (file)
index 0000000..2f5d236
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *  GreyscaleRotatedLuminanceSource.cpp
+ *  zxing
+ *
+ *  Copyright 2010 ZXing authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <zxing/common/GreyscaleRotatedLuminanceSource.h>
+#include <zxing/common/IllegalArgumentException.h>
+
+namespace zxing {
+
+// Note that dataWidth and dataHeight are not reversed, as we need to be able to traverse the
+// greyData correctly, which does not get rotated.
+GreyscaleRotatedLuminanceSource::GreyscaleRotatedLuminanceSource(unsigned char* greyData, int dataWidth, int dataHeight,
+      int left, int top, int width, int height) : greyData_(greyData), dataWidth_(dataWidth), dataHeight_(dataHeight),
+      left_(left), top_(top), width_(width), height_(height) {
+
+  // Intentionally comparing to the opposite dimension since we're rotated.
+  if (left + width > dataHeight || top + height > dataWidth) {
+    throw IllegalArgumentException("Crop rectangle does not fit within image data.");
+  }
+}
+
+// The API asks for rows, but we're rotated, so we return columns.
+unsigned char* GreyscaleRotatedLuminanceSource::getRow(int y, unsigned char* row) {
+  if (y < 0 || y >= getHeight()) {
+    throw IllegalArgumentException("Requested row is outside the image: " + y);
+  }
+  int width = getWidth();
+  // TODO(flyashi): determine if row has enough size.
+  if (row == NULL) {
+    row = new unsigned char[width];
+  }
+  int offset = (left_ * dataWidth_) + (dataWidth_ - (y + top_));
+  for (int x = 0; x < width; x++) {
+    row[x] = greyData_[offset];
+    offset += dataWidth_;
+  }
+  return row;
+}
+
+unsigned char* GreyscaleRotatedLuminanceSource::getMatrix() {
+  // FIXME(flyashi): fine for 1D scanning, need to implement for 2D scanning
+  return NULL;
+}
+
+} // namespace
diff --git a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h
new file mode 100644 (file)
index 0000000..d9896e4
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ *  GreyscaleRotatedLuminanceSource.h
+ *  zxing
+ *
+ *  Copyright 2010 ZXing authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __GREYSCALE_ROTATED_LUMINANCE_SOURCE__
+#define __GREYSCALE_ROTATED_LUMINANCE_SOURCE__
+
+#include <zxing/LuminanceSource.h>
+
+namespace zxing {
+
+class GreyscaleRotatedLuminanceSource : public LuminanceSource {
+ private:
+  unsigned char* greyData_;
+  int dataWidth_;
+  int dataHeight_;
+  int left_;
+  int top_;
+  int width_;
+  int height_;
+
+public:
+  GreyscaleRotatedLuminanceSource(unsigned char* greyData, int dataWidth, int dataHeight, int left, int top,
+      int width, int height);
+
+  unsigned char* getRow(int y, unsigned char* row);
+
+  unsigned char* getMatrix();
+
+  bool isRotateSupported() const {
+    return false;
+  }
+
+  int getWidth() const {
+    return width_;
+  }
+
+  int getHeight() const {
+    return height_;
+  }
+
+};
+} /* namespace */
+
+
+#endif