|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// YOMBParam.h: interface for the CYOMBParam class.
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//////////////////////////////////////////////////////////////////////
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#if !defined(AFX_YOMBPARAM_H__41D42152_F2EE_11D5_B92D_0040F674BE6A__INCLUDED_)
|
|
Toshihiro Shimizu |
890ddd |
#define AFX_YOMBPARAM_H__41D42152_F2EE_11D5_B92D_0040F674BE6A__INCLUDED_
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <vector></vector>
|
|
Toshihiro Shimizu |
890ddd |
#include "STColSelPic.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "SDef.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "InputParam.h"
|
|
Campbell Barton |
d0e335 |
#include "YOMBInputParam.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "BlurMatrix.h"
|
|
Toshihiro Shimizu |
890ddd |
//#pragma warning(disable: 4786)
|
|
Toshihiro Shimizu |
890ddd |
//#include "tmsg.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#define P(d) tmsg_info(" - %d -\n", d)
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class CYOMBParam {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
bool m_isRandomSampling;
|
|
Shinya Kitaoka |
120a6e |
bool m_isShowSelection;
|
|
Shinya Kitaoka |
120a6e |
bool m_isStopAtContour;
|
|
Shinya Kitaoka |
120a6e |
bool m_isBlurOnPair;
|
|
Shinya Kitaoka |
120a6e |
double m_dSample;
|
|
Shinya Kitaoka |
120a6e |
int m_nbSample;
|
|
Shinya Kitaoka |
120a6e |
double m_dA, m_dAB;
|
|
Shinya Kitaoka |
120a6e |
std::string m_name;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool m_isCM;
|
|
Shinya Kitaoka |
120a6e |
// for RGBM color groups
|
|
Shinya Kitaoka |
120a6e |
std::vector<i_pixel> m_color;</i_pixel>
|
|
Shinya Kitaoka |
120a6e |
// for CMAP color indides
|
|
Shinya Kitaoka |
120a6e |
COLOR_INDEX_LIST m_ink, m_paint;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CYOMBParam()
|
|
Shinya Kitaoka |
120a6e |
: m_isRandomSampling(false)
|
|
Shinya Kitaoka |
120a6e |
, m_isShowSelection(false)
|
|
Shinya Kitaoka |
120a6e |
, m_isStopAtContour(false)
|
|
Shinya Kitaoka |
120a6e |
, m_isBlurOnPair(false)
|
|
Shinya Kitaoka |
120a6e |
, m_dSample(0.0)
|
|
Shinya Kitaoka |
120a6e |
, m_nbSample(0)
|
|
Shinya Kitaoka |
120a6e |
, m_dA(0.0)
|
|
Shinya Kitaoka |
120a6e |
, m_dAB(0.0)
|
|
Shinya Kitaoka |
120a6e |
, m_name("")
|
|
Shinya Kitaoka |
120a6e |
, m_isCM(false)
|
|
Shinya Kitaoka |
120a6e |
, m_color(0) {
|
|
Shinya Kitaoka |
120a6e |
m_ink.nb = m_paint.nb = 0;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CYOMBParam(const CYOMBParam &bp)
|
|
Shinya Kitaoka |
120a6e |
: m_color(bp.m_color)
|
|
Shinya Kitaoka |
120a6e |
, m_isRandomSampling(bp.m_isRandomSampling)
|
|
Shinya Kitaoka |
120a6e |
, m_isShowSelection(bp.m_isShowSelection)
|
|
Shinya Kitaoka |
120a6e |
, m_isStopAtContour(bp.m_isStopAtContour)
|
|
Shinya Kitaoka |
120a6e |
, m_isBlurOnPair(bp.m_isBlurOnPair)
|
|
Shinya Kitaoka |
120a6e |
, m_dSample(bp.m_dSample)
|
|
Shinya Kitaoka |
120a6e |
, m_nbSample(bp.m_nbSample)
|
|
Shinya Kitaoka |
120a6e |
, m_dA(bp.m_dA)
|
|
Shinya Kitaoka |
120a6e |
, m_dAB(bp.m_dAB)
|
|
Shinya Kitaoka |
120a6e |
, m_name(bp.m_name)
|
|
Shinya Kitaoka |
120a6e |
, m_isCM(bp.m_isCM) {
|
|
Shinya Kitaoka |
120a6e |
if (m_isCM) {
|
|
Shinya Kitaoka |
120a6e |
m_ink.nb = bp.m_ink.nb;
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_ink.nb; i++) m_ink.ci[i] = bp.m_ink.ci[i];
|
|
Shinya Kitaoka |
120a6e |
m_paint.nb = bp.m_paint.nb;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_paint.nb; i++) m_paint.ci[i] = bp.m_paint.ci[i];
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual ~CYOMBParam(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void print();
|
|
Shinya Kitaoka |
120a6e |
void null();
|
|
Shinya Kitaoka |
120a6e |
void read(const CInputParam &ip);
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Shinya Kitaoka |
120a6e |
bool read(std::basic_ifstream<char> &in);</char>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Shinya Kitaoka |
120a6e |
void makeColorsUS();
|
|
Shinya Kitaoka |
120a6e |
void makeItUS();
|
|
Shinya Kitaoka |
120a6e |
static void adjustToMatte(I_PIXEL &p);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// void blurPixel(CSTColSelPic<uc_pixel>& pic, const int xx, const int yy,</uc_pixel>
|
|
Shinya Kitaoka |
38fd86 |
// const CBlurMatrix& bm, UC_PIXEL& col,const
|
|
Shinya Kitaoka |
d1f6c4 |
// UCHAR
|
|
Shinya Kitaoka |
38fd86 |
// osel);
|
|
Shinya Kitaoka |
120a6e |
// bool isContourOnPath(const int xx, const int yy,
|
|
Shinya Kitaoka |
120a6e |
// std::vector<blursection>::const_iterator</blursection>
|
|
Shinya Kitaoka |
38fd86 |
// pBS,
|
|
Shinya Kitaoka |
120a6e |
// CSTColSelPic<uc_pixel>& pic);</uc_pixel>
|
|
Shinya Kitaoka |
120a6e |
// void addPixel(I_PIXEL& p, const UC_PIXEL* pic);
|
|
Shinya Kitaoka |
120a6e |
// void addPixel(I_PIXEL& p, const CSTColSelPic<uc_pixel>& pic,</uc_pixel>
|
|
Shinya Kitaoka |
120a6e |
// const int xxyy, const int xy );
|
|
Shinya Kitaoka |
120a6e |
void addPixel(I_PIXEL &p, const I_PIXEL &pp);
|
|
Shinya Kitaoka |
120a6e |
int getColorIndex(const UCHAR c);
|
|
Shinya Kitaoka |
120a6e |
void scale(const double d);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
void addPixel(I_PIXEL &p, const P *pic) {
|
|
Shinya Kitaoka |
120a6e |
p.r += ((int)pic->r);
|
|
Shinya Kitaoka |
120a6e |
p.g += ((int)pic->g);
|
|
Shinya Kitaoka |
120a6e |
p.b += ((int)pic->b);
|
|
Shinya Kitaoka |
120a6e |
p.m += ((int)pic->m);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Checks the path from blurred pixel to the sample pixel.
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
bool isContourOnPath(const int xx, const int yy,
|
|
Shinya Kitaoka |
120a6e |
std::vector<blursection>::const_iterator pBS,</blursection>
|
|
Shinya Kitaoka |
120a6e |
CSTColSelPic &pic) {
|
|
Shinya Kitaoka |
120a6e |
for (std::vector<sxyd>::const_iterator p = pBS->begin(); p != pBS->end();</sxyd>
|
|
Shinya Kitaoka |
120a6e |
++p) {
|
|
Shinya Kitaoka |
120a6e |
int x = xx + p->x;
|
|
Shinya Kitaoka |
120a6e |
int y = yy + p->y;
|
|
Shinya Kitaoka |
120a6e |
int xy = y * pic.m_lX + x;
|
|
Shinya Kitaoka |
120a6e |
if (x >= 0 && y >= 0 && x < pic.m_lX && y < pic.m_lY)
|
|
Shinya Kitaoka |
120a6e |
if (*(pic.m_sel + xy) == (UCHAR)0) return true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
void addPixel(I_PIXEL &ip, const CSTColSelPic &pic, const int xxyy,
|
|
Shinya Kitaoka |
120a6e |
const int xy) {
|
|
Shinya Kitaoka |
120a6e |
if (!m_isBlurOnPair) {
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, pic.m_pic + xy);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
int i = getColorIndex(*(pic.m_sel + xy));
|
|
Shinya Kitaoka |
120a6e |
int ii = getColorIndex(*(pic.m_sel + xxyy));
|
|
Shinya Kitaoka |
120a6e |
int l = m_color.size() / 2;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (i == ii || abs(ii - i) == l) {
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, pic.m_pic + xy);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (ii < l) {
|
|
Shinya Kitaoka |
120a6e |
if (i < l) {
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, m_color[ii]);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, m_color[ii + l]);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (i < l) {
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, m_color[ii - l]);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
addPixel(ip, m_color[ii]);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
void blurPixel(CSTColSelPic &pic, const int xx, const int yy,
|
|
Shinya Kitaoka |
120a6e |
const CBlurMatrix &bm, I_PIXEL &col, const int iBm) {
|
|
Shinya Kitaoka |
120a6e |
I_PIXEL p = {0, 0, 0, 0};
|
|
Shinya Kitaoka |
120a6e |
int nb = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int xxyy = yy * pic.m_lX + xx;
|
|
Shinya Kitaoka |
120a6e |
for (std::vector<blursection>::const_iterator pBS = bm.m_m[iBm].begin();</blursection>
|
|
Shinya Kitaoka |
120a6e |
pBS != bm.m_m[iBm].end(); ++pBS) {
|
|
Shinya Kitaoka |
120a6e |
// const SXYD* xyd=pBS->begin();
|
|
Shinya Kitaoka |
120a6e |
BLURSECTION::const_iterator xyd = pBS->begin();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int x = xx + xyd->x;
|
|
Shinya Kitaoka |
120a6e |
int y = yy + xyd->y;
|
|
Shinya Kitaoka |
120a6e |
if (x >= 0 && y >= 0 && x < pic.m_lX && y < pic.m_lY) {
|
|
Shinya Kitaoka |
120a6e |
int xy = y * pic.m_lX + x;
|
|
Rozhuk Ivan |
823a31 |
if (*(pic.m_sel + xy) > (UCHAR)0) {
|
|
Shinya Kitaoka |
120a6e |
if (bm.m_isSAC) {
|
|
Shinya Kitaoka |
120a6e |
if (!isContourOnPath(xx, yy, pBS, pic)) {
|
|
Shinya Kitaoka |
120a6e |
addPixel(p, pic, xxyy, xy);
|
|
Shinya Kitaoka |
120a6e |
nb++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
addPixel(p, pic, xxyy, xy);
|
|
Shinya Kitaoka |
120a6e |
nb++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Rozhuk Ivan |
823a31 |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (nb > 0) {
|
|
Shinya Kitaoka |
120a6e |
double r = (double)p.r / (double)nb;
|
|
Shinya Kitaoka |
120a6e |
double g = (double)p.g / (double)nb;
|
|
Shinya Kitaoka |
120a6e |
double b = (double)p.b / (double)nb;
|
|
Shinya Kitaoka |
120a6e |
double m = (double)p.m / (double)nb;
|
|
Shinya Kitaoka |
120a6e |
col.r = I_ROUND(r);
|
|
Shinya Kitaoka |
120a6e |
col.g = I_ROUND(g);
|
|
Shinya Kitaoka |
120a6e |
col.b = I_ROUND(b);
|
|
Shinya Kitaoka |
120a6e |
col.m = I_ROUND(m);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
P *pPic = pic.m_pic + yy * pic.m_lX + xx;
|
|
Shinya Kitaoka |
120a6e |
col.r = (int)(pPic->r);
|
|
Shinya Kitaoka |
120a6e |
col.g = (int)(pPic->g);
|
|
Shinya Kitaoka |
120a6e |
col.b = (int)(pPic->b);
|
|
Shinya Kitaoka |
120a6e |
col.m = (int)(pPic->m);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
bool isRealMixture(CSTColSelPic &pic, const int xx, const int yy,
|
|
Shinya Kitaoka |
120a6e |
const CBlurMatrix &bm, const int iBm,
|
|
Shinya Kitaoka |
120a6e |
const UCHAR osel) const {
|
|
Shinya Kitaoka |
120a6e |
for (std::vector<blursection>::const_iterator pBS = bm.m_m[iBm].begin();</blursection>
|
|
Shinya Kitaoka |
120a6e |
pBS != bm.m_m[iBm].end(); ++pBS) {
|
|
Shinya Kitaoka |
120a6e |
// const SXYD* xyd= pBS->begin();
|
|
Shinya Kitaoka |
120a6e |
BLURSECTION::const_iterator xyd = pBS->begin();
|
|
Shinya Kitaoka |
120a6e |
int x = xx + xyd->x;
|
|
Shinya Kitaoka |
120a6e |
int y = yy + xyd->y;
|
|
Shinya Kitaoka |
120a6e |
if (x >= 0 && x < pic.m_lX && y >= 0 && y < pic.m_lY) {
|
|
Shinya Kitaoka |
120a6e |
int xy = y * pic.m_lX + x;
|
|
Shinya Kitaoka |
120a6e |
UCHAR *pSel = pic.m_sel + xy;
|
|
Shinya Kitaoka |
120a6e |
if (*pSel > (UCHAR)0 && *pSel != osel) return true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
template <class p=""></class>
|
|
Shinya Kitaoka |
120a6e |
void doIt(CSTColSelPic &ipic, CSTColSelPic &opic) {
|
|
Shinya Kitaoka |
120a6e |
CBlurMatrix bm(m_dSample, m_nbSample, m_isStopAtContour,
|
|
Shinya Kitaoka |
120a6e |
m_isRandomSampling);
|
|
Shinya Kitaoka |
120a6e |
UCHAR *pSel = ipic.m_sel;
|
|
Shinya Kitaoka |
120a6e |
for (int y = 0; y < ipic.m_lY; y++)
|
|
Shinya Kitaoka |
120a6e |
for (int x = 0; x < ipic.m_lX; x++, pSel++)
|
|
Shinya Kitaoka |
120a6e |
if (*pSel > (UCHAR)0) {
|
|
Shinya Kitaoka |
120a6e |
I_PIXEL col;
|
|
Shinya Kitaoka |
120a6e |
int iBm = bm.m_isRS ? rand() % NBRS : 0;
|
|
Shinya Kitaoka |
120a6e |
if (isRealMixture(ipic, x, y, bm, iBm, *pSel))
|
|
Shinya Kitaoka |
120a6e |
blurPixel(ipic, x, y, bm, col, iBm);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
ipic.getPixel(x, y, col);
|
|
Shinya Kitaoka |
120a6e |
opic.setRGBM(x, y, col);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
#endif // !defined(AFX_YOMBPARAM_H__41D42152_F2EE_11D5_B92D_0040F674BE6A__INCLUDED_)
|