From 8266b61f17424d718f89f6bdf2a50e52a7e21c66 Mon Sep 17 00:00:00 2001 From: flyashi Date: Mon, 19 Jul 2010 20:53:17 +0000 Subject: [PATCH] C++: added GreyscaleLuminanceSource 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: https://zxing.googlecode.com/svn/trunk@1488 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../zxing/common/GreyscaleLuminanceSource.cpp | 65 +++++++++++++++++++ .../zxing/common/GreyscaleLuminanceSource.h | 64 ++++++++++++++++++ .../GreyscaleRotatedLuminanceSource.cpp | 61 +++++++++++++++++ .../common/GreyscaleRotatedLuminanceSource.h | 62 ++++++++++++++++++ 4 files changed, 252 insertions(+) create mode 100644 cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp create mode 100644 cpp/core/src/zxing/common/GreyscaleLuminanceSource.h create mode 100644 cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp create mode 100644 cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h diff --git a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp new file mode 100644 index 000000000..486800301 --- /dev/null +++ b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp @@ -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 +#include +#include + +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 GreyscaleLuminanceSource::rotateCounterClockwise() { + // Intentionally flip the left, top, width, and height arguments as needed. dataWidth and + // dataHeight are always kept unrotated. + return Ref (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 index 000000000..cfc6285d6 --- /dev/null +++ b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h @@ -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 + +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 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 index 000000000..2f5d236c9 --- /dev/null +++ b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp @@ -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 +#include + +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 index 000000000..d9896e4ff --- /dev/null +++ b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h @@ -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 + +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