86 lines
2.4 KiB
C++
86 lines
2.4 KiB
C++
/***
|
|
|
|
Olive - Non-Linear Video Editor
|
|
Copyright (C) 2019 Olive Team
|
|
|
|
This program 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.
|
|
|
|
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
#include "blur.h"
|
|
|
|
void olive::ui::blur(QImage& result, const QRect& rect, int radius, bool alphaOnly) {
|
|
int tab[] = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 };
|
|
int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius-1];
|
|
|
|
int r1 = rect.top();
|
|
int r2 = rect.bottom();
|
|
int c1 = rect.left();
|
|
int c2 = rect.right();
|
|
|
|
int bpl = result.bytesPerLine();
|
|
int rgba[4];
|
|
unsigned char* p;
|
|
|
|
int i1 = 0;
|
|
int i2 = 3;
|
|
|
|
if (alphaOnly)
|
|
i1 = i2 = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3);
|
|
|
|
for (int col = c1; col <= c2; col++) {
|
|
p = result.scanLine(r1) + col * 4;
|
|
for (int i = i1; i <= i2; i++)
|
|
rgba[i] = p[i] << 4;
|
|
|
|
p += bpl;
|
|
for (int j = r1; j < r2; j++, p += bpl)
|
|
for (int i = i1; i <= i2; i++)
|
|
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
|
|
}
|
|
|
|
for (int row = r1; row <= r2; row++) {
|
|
p = result.scanLine(row) + c1 * 4;
|
|
for (int i = i1; i <= i2; i++)
|
|
rgba[i] = p[i] << 4;
|
|
|
|
p += 4;
|
|
for (int j = c1; j < c2; j++, p += 4)
|
|
for (int i = i1; i <= i2; i++)
|
|
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
|
|
}
|
|
|
|
for (int col = c1; col <= c2; col++) {
|
|
p = result.scanLine(r2) + col * 4;
|
|
for (int i = i1; i <= i2; i++)
|
|
rgba[i] = p[i] << 4;
|
|
|
|
p -= bpl;
|
|
for (int j = r1; j < r2; j++, p -= bpl)
|
|
for (int i = i1; i <= i2; i++)
|
|
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
|
|
}
|
|
|
|
for (int row = r1; row <= r2; row++) {
|
|
p = result.scanLine(row) + c2 * 4;
|
|
for (int i = i1; i <= i2; i++)
|
|
rgba[i] = p[i] << 4;
|
|
|
|
p -= 4;
|
|
for (int j = c1; j < c2; j++, p -= 4)
|
|
for (int i = i1; i <= i2; i++)
|
|
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
|
|
}
|
|
}
|