+++ /dev/null
-/*
- * GridSampler.cpp
- * zxing
- *
- * Created by Christian Brunschen on 18/05/2008.
- * Copyright 2008 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 "GridSampler.h"
-#include "PerspectiveTransform.h"
-#include "ReaderException.h"
-#include <iostream>
-#include <sstream>
-
-namespace common {
- GridSampler GridSampler::gridSampler;
-
- GridSampler::GridSampler() { }
-
- Ref<BitMatrix> GridSampler::sampleGrid(Ref<MonochromeBitmapSource> image,
- int dimension,
- float p1ToX, float p1ToY,
- float p2ToX, float p2ToY,
- float p3ToX, float p3ToY,
- float p4ToX, float p4ToY,
- float p1FromX, float p1FromY,
- float p2FromX, float p2FromY,
- float p3FromX, float p3FromY,
- float p4FromX, float p4FromY) {
- Ref<PerspectiveTransform> transform
- (PerspectiveTransform::quadrilateralToQuadrilateral
- (p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY,
- p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY));
-
- Ref<BitMatrix> bits(new BitMatrix(dimension));
- valarray<float> points((const float)0.0f, dimension << 1);
- for (int i = 0; i < dimension; i++) {
- int max = points.size();
- float iValue = (float) i + 0.5f;
- for (int j = 0; j < max; j+= 2) {
- points[j] = (float) (j >> 1) + 0.5f;
- points[j + 1] = iValue;
- }
- transform->transformPoints(points);
- checkAndNudgePoints(image, points);
- for (int j = 0; j < max; j += 2) {
- if (image->isBlack((int) points[j], (int) points[j + 1])) {
- bits->set(i, j >> 1);
- }
- }
- }
-
- return bits;
- }
-
- void GridSampler::checkAndNudgePoints(Ref<MonochromeBitmapSource> image,
- valarray<float> &points) {
- int width = image->getWidth();
- int height = image->getHeight();
- // Check and nudge points from start until we see some that are OK:
- bool nudged = true;
- for (size_t offset = 0; offset < points.size() && nudged; offset += 2) {
- int x = (int) points[offset];
- int y = (int) points[offset + 1];
- if (x < -1 || x > width || y < -1 || y > height) {
- ostringstream s;
- s << "Transformed point out of bounds at " << x << "," << y;
- throw ReaderException(s.str().c_str());
- }
- nudged = false;
- if (x == -1) {
- points[offset] = 0.0f;
- nudged = true;
- } else if (x == width) {
- points[offset] = width - 1;
- nudged = true;
- }
- if (y == -1) {
- points[offset + 1] = 0.0f;
- nudged = true;
- } else if (y == height) {
- points[offset + 1] = height - 1;
- nudged = true;
- }
- }
- // Check and nudge points from end:
- nudged = true;
- for (size_t offset = points.size() - 2; offset >= 0 && nudged; offset -= 2) {
- int x = (int) points[offset];
- int y = (int) points[offset + 1];
- if (x < -1 || x > width || y < -1 || y > height) {
- ostringstream s;
- s << "Transformed point out of bounds at " << x << "," << y;
- throw ReaderException(s.str().c_str());
- }
- nudged = false;
- if (x == -1) {
- points[offset] = 0.0f;
- nudged = true;
- } else if (x == width) {
- points[offset] = width - 1;
- nudged = true;
- }
- if (y == -1) {
- points[offset + 1] = 0.0f;
- nudged = true;
- } else if (y == height) {
- points[offset + 1] = height - 1;
- nudged = true;
- }
- }
- }
-
- GridSampler &GridSampler::getInstance() {
- return gridSampler;
- }
-}