--- /dev/null
+/*
+ * 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 */
+
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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