scanned-image-extractor/scannerExtract/TargetImage.h
2024-01-30 00:24:37 +01:00

132 lines
3.1 KiB
C++

/***********************************************************************
* This file is part of Scanned Image Extract.
*
* Scanned Image Extract is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Scanned Image Extract is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Scanned Image Extract. If not, see <http://www.gnu.org/licenses/>
*
*
* Copyright (C) 2015, Dominik Rueß; info@dominik-ruess.de
**********************************************************************/
#ifndef TARGETIMAGE_H
#define TARGETIMAGE_H
#include "imageboundary.h"
#include <QPixmap>
#include <QDebug>
#include <QtCore/qmath.h>
#ifdef __GNUC__
#include <tr1/memory>
#endif
class BackMap
{
public:
BackMap(const double angle,
const QPointF translation,
const QSizeF size,
const double scale)
{
const double c = qCos(angle), s = qSin(angle);
rotation[0] = c;
rotation[1] = -s;
rotation[2] = s;
rotation[3] = c;
this->translation[0] = translation.x();
this->translation[1] = translation.y();
this->size[0] = size.width();
this->size[1] = size.height();
this->scale = scale;
}
inline void transform(const QPointF& input, float& x, float& y)
{
QPointF preTrans(input.x() - 0.5*size[0]*scale,
input.y() - 0.5*size[1]*scale);
x = rotation[0] * preTrans.x() + rotation[1] * preTrans.y() + translation[0]*scale;
y = rotation[2] * preTrans.x() + rotation[3] * preTrans.y() + translation[1]*scale;
}
private:
double scale;
double size[2];
double rotation[4];
double translation[2];
};
typedef std::tr1::shared_ptr<BackMap> BackMapPtr;
enum Rotation90
{
TargetRotation0 = 0,
TargetRotation90 = 1,
TargetRotation180 = 2,
TargetRotation270 = 3
};
struct TargetImage
{
ImageBoundaryPtr boundary;
QImage image;
Rotation90 rotation;
int determinedRotation;
TargetImage()
: boundary(new ImageBoundary)
, rotation(TargetRotation0)
, width(0)
, height(0)
, copyId(-1)
, workOnId(++nextId)
, aspect(-1.0)
{}
TargetImage(ImageBoundaryPtr newB)
: boundary(newB)
, rotation(TargetRotation0)
, width(0)
, height(0)
, copyId(-1)
, workOnId(++nextId)
, aspect(-1.0)
{}
~TargetImage()
{
backmap = BackMapPtr();
boundary = ImageBoundaryPtr();
}
BackMapPtr backmap;
int width;
int height;
int copyId;
long int workOnId;
float aspect;
static int nextCopyId;
private:
static int nextId;
};
typedef std::shared_ptr<TargetImage> TargetImagePtr;
#endif // TARGETIMAGE_H