Add option to change X11 scaling filter
This commit is contained in:
parent
ed7ba36704
commit
44ec8d98cf
18
hgx11.cpp
18
hgx11.cpp
@ -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) {
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
5
main.cpp
5
main.cpp
@ -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")) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user