From 318b1afd1fa0b4d442a3540384741316725fb702 Mon Sep 17 00:00:00 2001 From: sidorares Date: Wed, 20 Jul 2011 16:58:33 +1000 Subject: [PATCH] PutImage example: load and display logo from bmp file --- lib/x11/corereqs.js | 11 ++++++ test/bmp.js | 45 +++++++++++++++++++++++++ test/nodejs-black.bmp | Bin 0 -> 3254 bytes test/pixmap.js | 9 +++++ test/putimage.js | 48 +++++++++++++++++++++++++++ test/query_pointer.js | 20 +++++++++++ test/query_pointer_benchmark_sync.js | 48 +++++++++++++++++++++++++++ 7 files changed, 181 insertions(+) create mode 100644 test/bmp.js create mode 100644 test/nodejs-black.bmp create mode 100644 test/pixmap.js create mode 100644 test/putimage.js create mode 100644 test/query_pointer.js create mode 100644 test/query_pointer_benchmark_sync.js diff --git a/lib/x11/corereqs.js b/lib/x11/corereqs.js index 96495fb..1dddafa 100644 --- a/lib/x11/corereqs.js +++ b/lib/x11/corereqs.js @@ -256,6 +256,17 @@ module.exports = { return [format, args]; } ], + + PutImage: [ + // format: 0 - Bitmap, 1 - XYPixmap, 2 - ZPixmap + function(format, drawable, gc, width, height, dstX, dstY, leftPad, depth, data) { + var padded = xutil.padded_length(data.length); + var reqLen = 6 + padded/4; // (length + 3) >> 2 ??? + var padLength = padded - data.length; + var pad = new Buffer(padLength); // TODO: new pack format 'X' - skip amount of bytes supplied in numerical argument + return [ 'CCSLLSSssCCxxaa', [72, format, reqLen, drawable, gc, width, height, dstX, dstY, leftPad, depth, data, pad]]; + } + ], PolyText8: [ function(drawable, gc, x, y, items) { diff --git a/test/bmp.js b/test/bmp.js new file mode 100644 index 0000000..96558ef --- /dev/null +++ b/test/bmp.js @@ -0,0 +1,45 @@ +// http://atlc.sourceforge.net/bmp.html +// Any better format documentation? + +var fs = require('fs'); +var Pixmap = require('./pixmap').Pixmap; +var Buffer = require('buffer').Buffer; +require('../lib/x11/unpackbuffer').addUnpack(Buffer); + +var reversed = new Buffer(256); +for (var i=0; i < 256; ++i) +{ + var res = 0; + for (b = 0; b < 8; ++b) + { + res += ((i & (1 << b) ) >> b) << (7-b); + } + reversed[i] = res; +} + +module.exports.decodeBuffer = function(buffer) +{ + var h = buffer.unpack('CCLxxxxLLLLSSLLLL'); + var header = {}; + header.filesize = h[2]; + header.data_offset = h[3]; + header.header_size = h[4]; + header.width = h[5]; + header.height = h[6]; + header.num_planes = h[7]; + header.bpp = h[8]; + header.compression = h[9]; + header.data_size = h[10]; + header.hresolution = h[11]; // pixels per METER! + header.vresolution = h[12]; + // skipped: num colors, num important colors, palette + var data = buffer.slice(header.data_offset, header.data_offset+header.data_size); + // TODO: decode compressed bitmap + //console.log(header); + + // mirror bits & invert + for (var i=0; i < data.length; ++i) + data[i] = 255 - reversed[data[i]]; + + return new Pixmap(header.bpp, header.width, header.height, data); +} \ No newline at end of file diff --git a/test/nodejs-black.bmp b/test/nodejs-black.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a9326922b412e15b547b2aa7c86e5c59d09c0540 GIT binary patch literal 3254 zcmeH{v5wR*5QZI6gaTdO0Jl8FS)%71cmxCu6%INHI__;~FDoHRYRaH1XcMKtpeVyP zcCxIzVJqn3J^SqWJRWD}Po6&e_{hX|&G>}=mHv`m@YD7h{^=_9XjldjG4#K+oo#1k z&&!^dJOh~~zMt}peY?Oqe*!bV&Rt;j1y=1WW+2b!Kg-K4$4{Q&XUCcM8myLZr}5^J zAy|g~Ijm(e74pj|3p%KWw1&}m-Q*MNb=4Fw1DlLxXYbPYx?wdNoF`?y`rgb401IZ_ z&4!?}&J+T3>{mDvx8mGjD63%hUJIJhrotb-jIKMv(` zmlHo_?OP$j}b<)3DYwM)(Q4?&i6u*|Kl!HV+FP)ECVuMc_ zt%MtKCf~5Y;miWMNE%e7Df@v8lXhplf7EVRwJX}V5gYWAr7DlF0e-0k%m4VPYnjB? k=g4>-V$s)kEXLFIW;^ 0) + benchmarkQP(wid); + else { + var end = +new Date(); + var delta = (end - start)/1000 + console.log( 'Finished ' + total + ' requests in ' + delta + ' sec, ' + total/delta + ' req/sec'); + X.terminate(); + } + }); +} + +X.on('connect', function(display) { + var screen = display.screen[0]; + var wid = X.AllocID(); + X.CreateWindow(wid, screen.root, 10, 10, 400, 300, 1, 1, 0, { backgroundPixel: screen.white_pixel }); + X.MapWindow(wid); + benchmarkQP(wid); +}); + +X.on('error', function(err) { + console.log(err); +});