mirror of
https://github.com/zxing/zxing.git
synced 2025-01-13 04:07:27 -08:00
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
This commit is contained in:
parent
0b0c051d5f
commit
8266b61f17
65
cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp
Normal file
65
cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp
Normal file
|
@ -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 */
|
||||
|
64
cpp/core/src/zxing/common/GreyscaleLuminanceSource.h
Normal file
64
cpp/core/src/zxing/common/GreyscaleLuminanceSource.h
Normal file
|
@ -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
|
|
@ -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
|
62
cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h
Normal file
62
cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h
Normal file
|
@ -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
|
Loading…
Reference in a new issue