crafatar/modules/skins.js
2015-01-29 20:39:18 -06:00

127 lines
3.5 KiB
JavaScript

var logging = require("./logging");
var lwip = require("lwip");
var fs = require("fs");
var exp = {};
// extracts the face from an image +buffer+
// result is saved to a file called +outname+
// +callback+ contains error
exp.extract_face = function(buffer, outname, callback) {
lwip.open(buffer, "png", function(err, image) {
if (err) {
callback(err);
} else {
image.batch()
.crop(8, 8, 15, 15) // face
.writeFile(outname, function(err) {
if (err) {
callback(err);
} else {
callback(null);
}
});
}
});
};
// extracts the helm from an image +buffer+ and lays it over a +facefile+
// +facefile+ is the filename of an image produced by extract_face
// result is saved to a file called +outname+
// +callback+ contains error
exp.extract_helm = function(id, facefile, buffer, outname, callback) {
lwip.open(buffer, "png", function(err, skin_img) {
if (err) {
callback(err);
} else {
lwip.open(facefile, function(err, face_img) {
if (err) {
callback(err);
} else {
face_img.toBuffer("png", { compression: "none" }, function(err, face_buffer) {
skin_img.crop(40, 8, 47, 15, function(err, helm_img) {
if (err) {
callback(err);
} else {
face_img.paste(0, 0, helm_img, function(err, face_helm_img) {
if (err) {
callback(err);
} else {
face_helm_img.toBuffer("png", {compression: "none"}, function(err, face_helm_buffer) {
if (face_helm_buffer.toString() !== face_buffer.toString()) {
face_helm_img.writeFile(outname, function(err) {
callback(err);
});
} else {
logging.log(id + " helm image is the same as face image, not storing!");
callback(null);
}
});
}
});
}
});
});
}
});
}
});
};
// resizes the image file +inname+ to +size+ by +size+ pixels
// +callback+ contains error, image buffer
exp.resize_img = function(inname, size, callback) {
lwip.open(inname, function(err, image) {
if (err) {
callback(err, null);
} else {
image.batch()
.resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
.toBuffer("png", function(err, buffer) {
callback(null, buffer);
});
}
});
};
// returns "alex" or "steve" calculated by the +id+
// this method is only accurate when +id+ is a uuid
exp.default_skin = function(id) {
if (Number("0x" + id[31]) % 2 === 0) {
return "alex";
} else {
return "steve";
}
};
// helper method for opening a skin file from +skinpath+
// callback contains error, image buffer
exp.open_skin = function(id, skinpath, callback) {
fs.readFile(skinpath, function(err, buf) {
if (err) {
logging.error(id + " error while opening skin file: " + err);
callback(err, null);
} else {
callback(null, buf);
}
});
};
exp.save_image = function(buffer, outpath, callback) {
lwip.open(buffer, "png", function(err, image) {
if (err) {
callback(err);
} else {
image.batch()
.writeFile(outpath, function(err) {
if (err) {
callback(err);
} else {
callback(null);
}
});
}
});
};
module.exports = exp;