From 44ec8d98cf24e81f0046a6ff092501167ecc66d1 Mon Sep 17 00:00:00 2001 From: kevin Date: Thu, 27 Jun 2019 08:12:57 -0400 Subject: [PATCH] Add option to change X11 scaling filter --- hgx11.cpp | 18 +++++++++++++++++- hgx11grab.cpp | 5 +++-- hgx11grab.h | 3 ++- main.cpp | 5 +++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/hgx11.cpp b/hgx11.cpp index 54aa81f..6ee69db 100644 --- a/hgx11.cpp +++ b/hgx11.cpp @@ -8,6 +8,7 @@ hgx11::hgx11(QHash opts) unsigned short port = 19444; unsigned short scale = 8; unsigned short frameskip = 0; + const char * filter = FilterNearest; QString redAdjust = "", greenAdjust = "", blueAdjust = ""; QString temperature = "", threshold = "", transform = ""; QHashIterator i(opts); @@ -37,6 +38,21 @@ hgx11::hgx11(QHash opts) threshold = _parseColorArr(i.value(), 0); } else if ((i.key() == "l" || i.key() == "transform") && _parseColorArr(i.value(), 0) != "") { transform = i.value(); + } else if ((i.key() == "x" || i.key() == "filter") && i.value().toInt()) { + switch (i.value().toInt()) { + case 1: + filter = FilterBilinear; + break; + case 2: + filter = FilterFast; + break; + case 3: + filter = FilterGood; + break; + case 4: + filter = FilterBest; + break; + } } } @@ -46,7 +62,7 @@ hgx11::hgx11(QHash opts) return; } - _grabber_p = new hgx11grab(_display_p, scale); + _grabber_p = new hgx11grab(_display_p, scale, filter); _hclient_p = new hgx11net(addr, port); _damage_p = new hgx11damage(&_grabbed_m, frameskip); if (_inactiveXss_m) { diff --git a/hgx11grab.cpp b/hgx11grab.cpp index ff4d79f..499178c 100644 --- a/hgx11grab.cpp +++ b/hgx11grab.cpp @@ -2,8 +2,9 @@ // public -hgx11grab::hgx11grab(Display *display, unsigned short scaleDivisor) +hgx11grab::hgx11grab(Display *display, unsigned short scaleDivisor, const char *filter) { + _filter_p = filter; _display_p = display; if (!XShmQueryExtension(_display_p)) { @@ -140,7 +141,7 @@ void hgx11grab::grabFrame() _srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m); _dstPicture_m = XRenderCreatePicture(_display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m); - XRenderSetPictureFilter(_display_p, _srcPicture_m, FilterFast, nullptr, 0); + XRenderSetPictureFilter(_display_p, _srcPicture_m, _filter_p, nullptr, 0); XRenderSetPictureTransform(_display_p, _srcPicture_m, &_mTransform_m); XRenderComposite( diff --git a/hgx11grab.h b/hgx11grab.h index fc45c7e..b4177a3 100644 --- a/hgx11grab.h +++ b/hgx11grab.h @@ -14,7 +14,7 @@ class hgx11grab : public QObject public: QString imgdata_m; - hgx11grab(Display *, unsigned short); + hgx11grab(Display *, unsigned short, const char *); ~hgx11grab(); int getDest_width() const; @@ -40,6 +40,7 @@ private: int _imgSize_m; double _scale_m; bool _freed_m = 0; + const char *_filter_p; bool _getWinAttr(); void _freeResources(); diff --git a/main.cpp b/main.cpp index a1760b7..f6e79d4 100644 --- a/main.cpp +++ b/main.cpp @@ -86,6 +86,11 @@ int main(int argc, char *argv[]) QCoreApplication::translate("main", "adjusts luminance / saturation") ); parser.addOption(transform); + QCommandLineOption filter(QStringList() << "x" << "scalefilter", + QCoreApplication::translate("main", "X11 scaling filter to use (see X11's render.h). 0 nearest (default), 1 bilinear, 2 fast, 3 good, 4 best"), + QCoreApplication::translate("main", "X11 scaling filter") + ); + parser.addOption(filter); parser.process(*qapp); if (!parser.isSet("address")) {