| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /*
- Ported to JavaScript by Lazar Laszlo 2011
- lazarsoft@gmail.com, www.lazarsoft.info
- */
- /*
- *
- * Copyright 2007 ZXing authors
- *
- * 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.
- */
- import BitMatrix from './bitmat';
- var GridSampler = {};
- GridSampler.checkAndNudgePoints = function(image, points) {
- var width = image.width;
- var height = image.height;
- // Check and nudge points from start until we see some that are OK:
- var nudged = true;
- for (var offset = 0; offset < points.length && nudged; offset += 2) {
- var x = Math.floor(points[offset]);
- var y = Math.floor(points[offset + 1]);
- if (x < -1 || x > width || y < -1 || y > height) {
- throw "Error.checkAndNudgePoints ";
- }
- nudged = false;
- if (x == -1) {
- points[offset] = 0.0;
- nudged = true;
- } else if (x == width) {
- points[offset] = width - 1;
- nudged = true;
- }
- if (y == -1) {
- points[offset + 1] = 0.0;
- nudged = true;
- } else if (y == height) {
- points[offset + 1] = height - 1;
- nudged = true;
- }
- }
- // Check and nudge points from end:
- nudged = true;
- for (var offset = points.length - 2; offset >= 0 && nudged; offset -= 2) {
- var x = Math.floor(points[offset]);
- var y = Math.floor(points[offset + 1]);
- if (x < -1 || x > width || y < -1 || y > height) {
- throw "Error.checkAndNudgePoints ";
- }
- nudged = false;
- if (x == -1) {
- points[offset] = 0.0;
- nudged = true;
- } else if (x == width) {
- points[offset] = width - 1;
- nudged = true;
- }
- if (y == -1) {
- points[offset + 1] = 0.0;
- nudged = true;
- } else if (y == height) {
- points[offset + 1] = height - 1;
- nudged = true;
- }
- }
- };
- GridSampler.sampleGrid3 = function(image, dimension, transform) {
- var bits = new BitMatrix(dimension);
- var points = new Array(dimension << 1);
- for (var y = 0; y < dimension; y++) {
- var max = points.length;
- var iValue = y + 0.5;
- for (var x = 0; x < max; x += 2) {
- points[x] = (x >> 1) + 0.5;
- points[x + 1] = iValue;
- }
- transform.transformPoints1(points);
- // Quick check to see if points transformed to something inside the image
- // sufficient to check the endpoints
- GridSampler.checkAndNudgePoints(image, points);
- try {
- for (var x = 0; x < max; x += 2) {
- var bit = image.data[Math.floor(points[x]) + image.width * Math.floor(points[x + 1])];
- if (bit)
- bits.set_Renamed(x >> 1, y);
- }
- } catch (aioobe) {
- // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting
- // transform gets "twisted" such that it maps a straight line of points to a set of points
- // whose endpoints are in bounds, but others are not. There is probably some mathematical
- // way to detect this about the transformation that I don't know yet.
- // This results in an ugly runtime exception despite our clever checks above -- can't have
- // that. We could check each point's coordinates but that feels duplicative. We settle for
- // catching and wrapping ArrayIndexOutOfBoundsException.
- throw "Error.checkAndNudgePoints";
- }
- }
- return bits;
- };
- export default GridSampler;
|