mirror of
https://github.com/vale981/tdesktop
synced 2025-03-06 10:11:41 -05:00
prepared win version sign, saving compress image checkbox state, not loaded images blur added
This commit is contained in:
parent
67e74e7aed
commit
da0df57563
8 changed files with 116 additions and 46 deletions
|
@ -1565,6 +1565,7 @@ namespace App {
|
|||
stream << quint32(dbiNotifyView) << qint32(cNotifyView());
|
||||
stream << quint32(dbiAskDownloadPath) << qint32(cAskDownloadPath());
|
||||
stream << quint32(dbiDownloadPath) << (cAskDownloadPath() ? QString() : cDownloadPath());
|
||||
stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage());
|
||||
stream << quint32(dbiEmojiTab) << qint32(cEmojiTab());
|
||||
|
||||
RecentEmojiPreload v;
|
||||
|
@ -1747,6 +1748,12 @@ namespace App {
|
|||
cSetDownloadPath(v);
|
||||
} break;
|
||||
|
||||
case dbiCompressPastedImage: {
|
||||
qint32 v;
|
||||
stream >> v;
|
||||
cSetCompressPastedImage(v == 1);
|
||||
} break;
|
||||
|
||||
case dbiEmojiTab: {
|
||||
qint32 v;
|
||||
stream >> v;
|
||||
|
|
|
@ -478,9 +478,6 @@ void ContactsBox::paintEvent(QPaintEvent *e) {
|
|||
// paint shadows
|
||||
p.fillRect(0, _addContact.height(), _width, st::scrollDef.topsh, st::scrollDef.shColor->b);
|
||||
|
||||
// paint button sep
|
||||
p.fillRect(st::btnSelectCancel.width, size().height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b);
|
||||
|
||||
// draw box title / text
|
||||
p.setPen(st::black->p);
|
||||
p.setFont(st::addContactTitleFont->f);
|
||||
|
|
|
@ -25,7 +25,7 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
|
|||
|
||||
PhotoSendBox::PhotoSendBox(const ReadyLocalMedia &img) : _img(new ReadyLocalMedia(img)),
|
||||
_thumbx(0), _thumby(0), _thumbw(0), _thumbh(0), _namew(0), _textw(0),
|
||||
_compressed(this, lang(lng_send_image_compressed), true),
|
||||
_compressed(this, lang(lng_send_image_compressed), cCompressPastedImage()),
|
||||
_sendButton(this, lang(lng_send_button), st::btnSelectDone),
|
||||
_cancelButton(this, lang(lng_cancel), st::btnSelectCancel),
|
||||
a_opacity(0, 1) {
|
||||
|
@ -203,10 +203,16 @@ void PhotoSendBox::animStep(float64 ms) {
|
|||
void PhotoSendBox::onSend() {
|
||||
if (!_img) {
|
||||
if (App::main()) App::main()->confirmShareContact(_phone, _fname, _lname);
|
||||
} else if (_compressed.isHidden() || _compressed.checked()) {
|
||||
if (App::main()) App::main()->confirmSendImage(*_img);
|
||||
} else {
|
||||
if (App::main()) App::main()->confirmSendImageUncompressed();
|
||||
if (!_compressed.isHidden()) {
|
||||
cSetCompressPastedImage(_compressed.checked());
|
||||
App::writeUserConfig();
|
||||
}
|
||||
if (_compressed.isHidden() || _compressed.checked()) {
|
||||
if (App::main()) App::main()->confirmSendImage(*_img);
|
||||
} else {
|
||||
if (App::main()) App::main()->confirmSendImageUncompressed();
|
||||
}
|
||||
}
|
||||
emit closed();
|
||||
}
|
||||
|
|
|
@ -121,7 +121,7 @@ static const BuiltInDc _builtInDcs[] = {
|
|||
{ 2, "149.154.167.50", 443 },
|
||||
{ 3, "174.140.142.6", 443 },
|
||||
{ 4, "149.154.167.90", 443 },
|
||||
{ 5, "116.51.22.2", 443 }
|
||||
{ 5, "149.154.171.5", 443 }
|
||||
};
|
||||
|
||||
static const BuiltInDc _builtInTestDcs[] = {
|
||||
|
|
|
@ -101,20 +101,20 @@ const QPixmap &Image::pixBlurred(int32 w, int32 h) const {
|
|||
return i.value();
|
||||
}
|
||||
|
||||
namespace {
|
||||
static inline uint64 _blurGetColors(const uchar *p) {
|
||||
return p[0] + (p[1] << 16) + ((uint64)p[2] << 32);
|
||||
}
|
||||
}
|
||||
|
||||
QPixmap Image::pixBlurredNoCache(int32 w, int32 h) const {
|
||||
return pixNoCache(w, h);
|
||||
restore();
|
||||
loaded();
|
||||
|
||||
const QPixmap &p(pixData());
|
||||
if (p.isNull()) return blank()->pix();
|
||||
|
||||
QImage img;
|
||||
if (h <= 0) {
|
||||
img = p.toImage().scaledToWidth(w, Qt::SmoothTransformation);
|
||||
} else {
|
||||
img = p.toImage().scaled(w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
}
|
||||
QImage img = p.toImage();
|
||||
QImage::Format fmt = img.format();
|
||||
if (fmt != QImage::Format_RGB32 && fmt != QImage::Format_ARGB32 && fmt != QImage::Format_ARGB32_Premultiplied) {
|
||||
QImage tmp(img.width(), img.height(), QImage::Format_ARGB32);
|
||||
|
@ -124,43 +124,100 @@ QPixmap Image::pixBlurredNoCache(int32 w, int32 h) const {
|
|||
}
|
||||
img = tmp;
|
||||
}
|
||||
QImage fromimg = img;
|
||||
|
||||
uchar *bits = img.bits();
|
||||
const uchar *from = fromimg.bits();
|
||||
if (bits && from) {
|
||||
int width = img.width(), height = img.height();
|
||||
for (int i = 0; i < width; ++i) {
|
||||
for (int j = 0; j < height; ++j) {
|
||||
uint32 a = 0, b = 0, c = 0;
|
||||
for (int index = i - 32; index < i + 32; ++index) {
|
||||
int fullindex = 4 * (j * width + ((index < 0) ? 0 : (index >= width ? (width - 1) : index))), coef = 4;
|
||||
a += from[fullindex + 1] * coef;
|
||||
b += from[fullindex + 2] * coef;
|
||||
c += from[fullindex + 3] * coef;
|
||||
uchar *pix = img.bits();
|
||||
if (pix) {
|
||||
const int w = img.width(), h = img.height(), stride = w * 4;
|
||||
const int radius = 7;
|
||||
const int r1 = radius + 1;
|
||||
const int div = radius * 2 + 1;
|
||||
|
||||
if (radius < 16 && div < w && div < h && stride <= w * 4) {
|
||||
uint64 *rgb = new uint64[w * h];
|
||||
|
||||
int x, y, i;
|
||||
|
||||
int yw = 0;
|
||||
const int we = w - r1;
|
||||
for (y = 0; y < h; y++) {
|
||||
uint64 cur = _blurGetColors(&pix[yw]);
|
||||
uint64 rgballsum = -radius * cur;
|
||||
uint64 rgbsum = cur * ((r1 * (r1 + 1)) >> 1);
|
||||
|
||||
for (i = 1; i <= radius; i++) {
|
||||
uint64 cur = _blurGetColors(&pix[yw + i * 4]);
|
||||
rgbsum += cur * (r1 - i);
|
||||
rgballsum += cur;
|
||||
}
|
||||
int fullindex = 4 * (j * width + i);
|
||||
bits[fullindex + 1] = uchar(a >> 8);
|
||||
bits[fullindex + 2] = uchar(b >> 8);
|
||||
bits[fullindex + 3] = uchar(c >> 8);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < width; ++i) {
|
||||
for (int j = 0; j < height; ++j) {
|
||||
uint32 a = 0, b = 0, c = 0;
|
||||
for (int index = j - 32; index < j + 32; ++index) {
|
||||
int fullindex = 4 * (((index < 0) ? 0 : (index >= height ? (height - 1) : index)) * width + i), coef = 4;
|
||||
a += from[fullindex + 1] * coef;
|
||||
b += from[fullindex + 2] * coef;
|
||||
c += from[fullindex + 3] * coef;
|
||||
|
||||
x = 0;
|
||||
|
||||
#define update(start, middle, end) \
|
||||
rgb[y * w + x] = (rgbsum >> 6) & 0x00FF00FF00FF00FFLL; \
|
||||
rgballsum += _blurGetColors(&pix[yw + (start) * 4]) - 2 * _blurGetColors(&pix[yw + (middle) * 4]) + _blurGetColors(&pix[yw + (end) * 4]); \
|
||||
rgbsum += rgballsum; \
|
||||
x++;
|
||||
|
||||
while (x < r1) {
|
||||
update(0, x, x + r1);
|
||||
}
|
||||
int fullindex = 4 * (j * width + i);
|
||||
bits[fullindex + 1] = uchar(a >> 8);
|
||||
bits[fullindex + 2] = uchar(b >> 8);
|
||||
bits[fullindex + 3] = uchar(c >> 8);
|
||||
while (x < we) {
|
||||
update(x - r1, x, x + r1);
|
||||
}
|
||||
while (x < w) {
|
||||
update(x - r1, x, w - 1);
|
||||
}
|
||||
|
||||
#undef update
|
||||
|
||||
yw += stride;
|
||||
}
|
||||
|
||||
const int he = h - r1;
|
||||
for (x = 0; x < w; x++) {
|
||||
uint64 rgballsum = -radius * rgb[x];
|
||||
uint64 rgbsum = rgb[x] * ((r1 * (r1 + 1)) >> 1);
|
||||
for (i = 1; i <= radius; i++) {
|
||||
rgbsum += rgb[i * w + x] * (r1 - i);
|
||||
rgballsum += rgb[i * w + x];
|
||||
}
|
||||
|
||||
y = 0;
|
||||
int yi = x * 4;
|
||||
|
||||
#define update(start, middle, end) \
|
||||
uint64 res = rgbsum >> 6; \
|
||||
pix[yi] = res & 0xFF; \
|
||||
pix[yi + 1] = (res >> 16) & 0xFF; \
|
||||
pix[yi + 2] = (res >> 32) & 0xFF; \
|
||||
rgballsum += rgb[x + (start) * w] - 2 * rgb[x + (middle) * w] + rgb[x + (end) * w]; \
|
||||
rgbsum += rgballsum; \
|
||||
y++; \
|
||||
yi += stride;
|
||||
|
||||
while (y < r1) {
|
||||
update(0, y, y + r1);
|
||||
}
|
||||
while (y < he) {
|
||||
update(y - r1, y, y + r1);
|
||||
}
|
||||
while (y < h) {
|
||||
update(y - r1, y, h - 1);
|
||||
}
|
||||
|
||||
#undef update
|
||||
}
|
||||
|
||||
delete[] rgb;
|
||||
}
|
||||
}
|
||||
|
||||
if (h <= 0) {
|
||||
img = img.scaledToWidth(w, Qt::SmoothTransformation);
|
||||
} else {
|
||||
img = img.scaled(w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
}
|
||||
|
||||
return QPixmap::fromImage(img);
|
||||
}
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ QString gLoggedPhoneNumber;
|
|||
|
||||
QByteArray gLocalSalt;
|
||||
DBIScale gRealScale = dbisAuto, gScreenScale = dbisOne, gConfigScale = dbisAuto;
|
||||
bool gCompressPastedImage = true;
|
||||
|
||||
DBIEmojiTab gEmojiTab = dbietPeople;
|
||||
RecentEmojiPack gRecentEmojis;
|
||||
|
|
|
@ -102,6 +102,7 @@ DeclareSetting(QByteArray, LocalSalt);
|
|||
DeclareSetting(DBIScale, RealScale);
|
||||
DeclareSetting(DBIScale, ScreenScale);
|
||||
DeclareSetting(DBIScale, ConfigScale);
|
||||
DeclareSetting(bool, CompressPastedImage);
|
||||
|
||||
inline DBIScale cEvalScale(DBIScale scale) {
|
||||
return (scale == dbisAuto) ? cScreenScale() : scale;
|
||||
|
|
|
@ -222,6 +222,7 @@ enum DataBlockId {
|
|||
// 27 reserved
|
||||
dbiNotifyView = 28,
|
||||
dbiSendToMenu = 29,
|
||||
dbiCompressPastedImage = 30,
|
||||
|
||||
dbiEncryptedWithSalt = 333,
|
||||
dbiEncrypted = 444,
|
||||
|
|
Loading…
Add table
Reference in a new issue