diff --git a/lib/ext/render.js b/lib/ext/render.js index cac22db..c16b60d 100644 --- a/lib/ext/render.js +++ b/lib/ext/render.js @@ -152,10 +152,10 @@ exports.requireExt = function(display, callback) } ext.FreePicture = function(pid) { - X.seq_num++; - X.pack_stream.pack('CCSL', [ext.majorOpcode, 7, 2, pid]); - X.pack_stream.flush(); - } + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 7, 2, pid]); + X.pack_stream.flush(); + }; function floatToFix(f) { @@ -163,23 +163,42 @@ exports.requireExt = function(display, callback) } // see example of blur filter here: https://github.com/richoH/rxvt-unicode/blob/master/src/background.C - // TODO: not ready yet. ext.SetPictureFilter = function(pid, name, filterParams) { + if (filterParams === 0) + filterParams = [0]; + if (!filterParams) + filterParams = []; + if (!Array.isArray(filterParams)) + filterParams = [filterParams]; + X.seq_num++; - var reqLen = 2; //header + params + 1xStopfix+2xColors - var format = 'CCSLa'; - var params = [ext.majorOpcode, 30, reqLen, pid]; - /* - if (name == 'convolution') - { - reqLen += 2; - format += 'L'; - params.push(floatToFix(filterParams)); + var reqLen = 2; + var format = 'CCSLSxxp'; + var params = [ext.majorOpcode, 30, reqLen, pid, name.length, name + '\0']; + reqLen += xutil.padded_length(name.length+3)/4 + filterParams.length; + + if (name == 'nearest' || name == 'bilinear' || name == 'fast' || name == 'good' || name == 'best') { + if (filterParams.length != 0) { + throw 'Render.SetPictureFilter: "' + name + '" - unexpected parameters for filters"; + } + } else if (name == 'convolution' || ) { + if (filterParams.length < 2 || filterParams[0]*filterParams[1] !== filterParams.length + 2) { + throw 'Render.SetPictureFilter: "convolution" - incorrect matrix dimensions. Must be flat array [ w, h, elem1, elem2, ... ]'; + } + for (var i=0; i < filterParams.length; ++i) { + format += 'L'; + params.push(floatToFix(filterParams[i])); + } + } else if (name == 'binomial' || name == 'gaussian') { + if (filterParams.length < 2) { + throw 'Render.SetPictureFilter: "' + name + '" - incorrect number of parameters, must be exactly 1 number, instead got: ' + filterParams; + } + format += 'L'; + params.push(floatToFix(filterParams[0])); } else { - throw 'Not implemented filter ' + name; + throw 'Render.SetPictureFilter: unknown filter "' + name + '"'; } - */ params[2] = reqLen; X.pack_stream.pack(format, params); X.pack_stream.flush();