Add option to change X11 scaling filter

This commit is contained in:
kevin 2019-06-27 08:12:57 -04:00
parent ed7ba36704
commit 44ec8d98cf
4 changed files with 27 additions and 4 deletions

View File

@ -8,6 +8,7 @@ hgx11::hgx11(QHash<QString, QString> opts)
unsigned short port = 19444; unsigned short port = 19444;
unsigned short scale = 8; unsigned short scale = 8;
unsigned short frameskip = 0; unsigned short frameskip = 0;
const char * filter = FilterNearest;
QString redAdjust = "", greenAdjust = "", blueAdjust = ""; QString redAdjust = "", greenAdjust = "", blueAdjust = "";
QString temperature = "", threshold = "", transform = ""; QString temperature = "", threshold = "", transform = "";
QHashIterator<QString, QString> i(opts); QHashIterator<QString, QString> i(opts);
@ -37,6 +38,21 @@ hgx11::hgx11(QHash<QString, QString> opts)
threshold = _parseColorArr(i.value(), 0); threshold = _parseColorArr(i.value(), 0);
} else if ((i.key() == "l" || i.key() == "transform") && _parseColorArr(i.value(), 0) != "") { } else if ((i.key() == "l" || i.key() == "transform") && _parseColorArr(i.value(), 0) != "") {
transform = i.value(); 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<QString, QString> opts)
return; return;
} }
_grabber_p = new hgx11grab(_display_p, scale); _grabber_p = new hgx11grab(_display_p, scale, filter);
_hclient_p = new hgx11net(addr, port); _hclient_p = new hgx11net(addr, port);
_damage_p = new hgx11damage(&_grabbed_m, frameskip); _damage_p = new hgx11damage(&_grabbed_m, frameskip);
if (_inactiveXss_m) { if (_inactiveXss_m) {

View File

@ -2,8 +2,9 @@
// public // public
hgx11grab::hgx11grab(Display *display, unsigned short scaleDivisor) hgx11grab::hgx11grab(Display *display, unsigned short scaleDivisor, const char *filter)
{ {
_filter_p = filter;
_display_p = display; _display_p = display;
if (!XShmQueryExtension(_display_p)) { if (!XShmQueryExtension(_display_p)) {
@ -140,7 +141,7 @@ void hgx11grab::grabFrame()
_srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m); _srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m);
_dstPicture_m = XRenderCreatePicture(_display_p, _pixmap_m, _dstFormat_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); XRenderSetPictureTransform(_display_p, _srcPicture_m, &_mTransform_m);
XRenderComposite( XRenderComposite(

View File

@ -14,7 +14,7 @@ class hgx11grab : public QObject
public: public:
QString imgdata_m; QString imgdata_m;
hgx11grab(Display *, unsigned short); hgx11grab(Display *, unsigned short, const char *);
~hgx11grab(); ~hgx11grab();
int getDest_width() const; int getDest_width() const;
@ -40,6 +40,7 @@ private:
int _imgSize_m; int _imgSize_m;
double _scale_m; double _scale_m;
bool _freed_m = 0; bool _freed_m = 0;
const char *_filter_p;
bool _getWinAttr(); bool _getWinAttr();
void _freeResources(); void _freeResources();

View File

@ -86,6 +86,11 @@ int main(int argc, char *argv[])
QCoreApplication::translate("main", "adjusts luminance / saturation") QCoreApplication::translate("main", "adjusts luminance / saturation")
); );
parser.addOption(transform); 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); parser.process(*qapp);
if (!parser.isSet("address")) { if (!parser.isSet("address")) {