image element: fix shrink.

This commit is contained in:
Christopher Jeffrey 2015-02-09 01:43:16 -08:00
parent a4e6856901
commit 1729244db3
2 changed files with 147 additions and 69 deletions

View File

@ -6569,8 +6569,8 @@ function Image(options) {
} }
} }
if (this.options.img || this.options.file) { if (this.options.file || this.options.img) {
this.setImage(this.options.img || this.options.file); this.setImage(this.options.file || this.options.img);
} }
} }
@ -6583,24 +6583,14 @@ Image.w3mdisplay = '/usr/lib/w3m/w3mimgdisplay';
Image.prototype.render = function() { Image.prototype.render = function() {
var ret = this._render(); var ret = this._render();
if (!ret) return; if (!ret) return;
this.setImage(this.img); if (!this._noImage) {
if (this._renderImage) this._renderImage();
else if (this.file) this.setImage(this.file);
}
return ret; return ret;
}; };
Image.prototype.spawn = function(file, args, opt, callback) { Image.prototype.spawn = function(file, args, opt, callback) {
var self = this;
if (Image.hasW3MDisplay == null) {
return this._waitForW3MDisplay(function() {
return self.spawn(file, args, opt, callback);
});
}
if (Image.hasW3MDisplay === false) {
if (!callback) return;
return callback(new Error('W3M Image Display not available.'));
}
var screen = this.screen var screen = this.screen
, opt = opt || {} , opt = opt || {}
, spawn = require('child_process').spawn , spawn = require('child_process').spawn
@ -6625,7 +6615,18 @@ Image.prototype.spawn = function(file, args, opt, callback) {
Image.prototype.setImage = function(img, callback) { Image.prototype.setImage = function(img, callback) {
var self = this; var self = this;
this.img = img; if (Image.hasW3MDisplay == null) {
return this._waitForW3MDisplay(function() {
return self.setImage(img, callback);
});
}
if (Image.hasW3MDisplay === false) {
if (!callback) return;
return callback(new Error('W3M Image Display not available.'));
}
this.file = img;
if (!img) { if (!img) {
if (!callback) return; if (!callback) return;
@ -6634,43 +6635,27 @@ Image.prototype.setImage = function(img, callback) {
// NOTE: Fall back to screen.displayImage() instead of setImage()? // NOTE: Fall back to screen.displayImage() instead of setImage()?
this.termSize(function(err, dimensions) { var tw, th;
if (err) {
if (!callback) return;
return callback(err);
}
var tw = dimensions.width / self.screen.width; function renderImage(callback) {
var th = dimensions.height / self.screen.height; return self.clearImage(function() {
// XXX clearImage unsets this:
self.file = img;
self._renderImage = renderImage;
var file = Image.w3mdisplay; var opt = {
stdio: 'pipe',
env: process.env,
cwd: process.env.HOME
};
var opt = { var ps = self.spawn(Image.w3mdisplay, [], opt, function(err, success) {
stdio: 'pipe',
env: process.env,
cwd: process.env.HOME
};
self.clearImage(function() {
var ps = self.spawn(file, [], opt, function(err, success) {
if (!callback) return; if (!callback) return;
return err return err
? callback(err) ? callback(err)
: callback(null, success); : callback(null, success);
}); });
// XXX Move below code to callback.
if (self.shrink || self.options.autofit) {
delete self.shrink;
delete self.options.shrink;
self.options.autofit = true;
self.imageSize(function(err, size) {
if (err) return;
self.position.width = size.width / tw | 0;
self.position.height = size.height / th | 0;
});
}
var width = self.width * tw | 0 var width = self.width * tw | 0
, height = self.height * th | 0 , height = self.height * th | 0
, left = self.left * tw | 0 , left = self.left * tw | 0
@ -6694,38 +6679,104 @@ Image.prototype.setImage = function(img, callback) {
ps.stdin.write(input); ps.stdin.write(input);
ps.stdin.end(); ps.stdin.end();
}); });
}
this._renderImage = renderImage;
return this.termSize(function(err, dimensions) {
if (err) {
if (!callback) return;
return callback(err);
}
tw = dimensions.width / self.screen.width;
th = dimensions.height / self.screen.height;
return renderImage(function(err, success) {
if (err) {
if (!callback) return;
return callback(err);
}
if (self.shrink || self.options.autofit) {
delete self.shrink;
delete self.options.shrink;
self.options.autofit = true;
return self.imageSize(function(err, size) {
if (err) return;
if (self._lastSize
&& tw === self._lastSize.tw
&& th === self._lastSize.th
&& size.width === self._lastSize.width
&& size.height === self._lastSize.height
&& self.left === self._lastSize.left
&& self.top === self._lastSize.top) {
if (!callback) return;
return callback(null, success);
}
self._lastSize = {
tw: tw,
th: th,
width: size.width,
height: size.height,
left: self.left,
top: self.top
};
self.position.width = size.width / tw | 0;
self.position.height = size.height / th | 0;
self._noImage = true;
self.screen.render();
self._noImage = false;
return renderImage(callback);
});
}
if (!callback) return;
return callback(null, success);
});
}); });
}; };
Image.prototype.clearImage = function(callback) { Image.prototype.clearImage = function(callback) {
var self = this; var self = this;
if (Image.hasW3MDisplay == null) {
return this._waitForW3MDisplay(function() {
return self.clearImage(callback);
});
}
if (Image.hasW3MDisplay === false) {
if (!callback) return;
return callback(new Error('W3M Image Display not available.'));
}
if (!this._props) { if (!this._props) {
if (!callback) return; if (!callback) return;
return callback(null); return callback(null);
} }
var file = Image.w3mdisplay;
var opt = { var opt = {
stdio: 'pipe', stdio: 'pipe',
env: process.env, env: process.env,
cwd: process.env.HOME cwd: process.env.HOME
}; };
var ps = this.spawn(file, [], opt, function(err, success) { var ps = this.spawn(Image.w3mdisplay, [], opt, function(err, success) {
if (!callback) return; if (!callback) return;
return err return err
? callback(err) ? callback(err)
: callback(null, success); : callback(null, success);
}); });
if (!ps) {
if (!callback) return;
return callback(new Error('Spawn Failed.'));
}
var width = this._props.width var width = this._props.width + 2
, height = this._props.height , height = this._props.height + 2
, left = this._props.left , left = this._props.left
, top = this._props.top; , top = this._props.top;
@ -6737,7 +6788,9 @@ Image.prototype.clearImage = function(callback) {
+ '\n4;\n3;\n'; + '\n4;\n3;\n';
delete this._props; delete this._props;
delete this.img; delete this.file;
delete this._renderImage;
delete this._lastSize;
ps.stdin.write(input); ps.stdin.write(input);
ps.stdin.end(); ps.stdin.end();
@ -6745,8 +6798,18 @@ Image.prototype.clearImage = function(callback) {
Image.prototype.imageSize = function(callback) { Image.prototype.imageSize = function(callback) {
var self = this; var self = this;
var img = this.img; var img = this.file;
var file = Image.w3mdisplay;
if (Image.hasW3MDisplay == null) {
return this._waitForW3MDisplay(function() {
return self.imageSize(callback);
});
}
if (Image.hasW3MDisplay === false) {
if (!callback) return;
return callback(new Error('W3M Image Display not available.'));
}
if (!img) { if (!img) {
if (!callback) return; if (!callback) return;
@ -6759,11 +6822,7 @@ Image.prototype.imageSize = function(callback) {
cwd: process.env.HOME cwd: process.env.HOME
}; };
var ps = this.spawn(file, [], opt); var ps = this.spawn(Image.w3mdisplay, [], opt);
if (!ps) {
if (!callback) return;
return callback(new Error('Spawn Failed.'));
}
var buf = ''; var buf = '';
@ -6796,7 +6855,17 @@ Image.prototype.imageSize = function(callback) {
Image.prototype.termSize = function(callback) { Image.prototype.termSize = function(callback) {
var self = this; var self = this;
var file = Image.w3mdisplay;
if (Image.hasW3MDisplay == null) {
return this._waitForW3MDisplay(function() {
return self.termSize(callback);
});
}
if (Image.hasW3MDisplay === false) {
if (!callback) return;
return callback(new Error('W3M Image Display not available.'));
}
var opt = { var opt = {
stdio: 'pipe', stdio: 'pipe',
@ -6804,11 +6873,7 @@ Image.prototype.termSize = function(callback) {
cwd: process.env.HOME cwd: process.env.HOME
}; };
var ps = this.spawn(file, ['-test'], opt); var ps = this.spawn(Image.w3mdisplay, ['-test'], opt);
if (!ps) {
if (!callback) return;
return callback(new Error('Spawn Failed.'));
}
var buf = ''; var buf = '';
@ -6837,7 +6902,7 @@ Image.prototype.termSize = function(callback) {
}; };
Image.prototype.displayImage = function(callback) { Image.prototype.displayImage = function(callback) {
return this.screen.displayImage(this.img, callback); return this.screen.displayImage(this.file, callback);
}; };
Image.prototype._waitForW3MDisplay = function(callback) { Image.prototype._waitForW3MDisplay = function(callback) {

View File

@ -25,6 +25,19 @@ setTimeout(function() {
screen.render(); screen.render();
}, 1000); }, 1000);
//setTimeout(function() {
// image.setImage(file);
// image.rtop = 4;
// image.rleft = 10;
// screen.render();
// setTimeout(function() {
// image.setImage(file);
// image.rtop = 2;
// image.rleft = 7;
// screen.render();
// }, 1000);
//}, 5000);
image.focus(); image.focus();
screen.key('i', function() { screen.key('i', function() {