summaryrefslogtreecommitdiff
path: root/public/js/mp/dye.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/js/mp/dye.js')
-rw-r--r--public/js/mp/dye.js41
1 files changed, 21 insertions, 20 deletions
diff --git a/public/js/mp/dye.js b/public/js/mp/dye.js
index 138e332..d9150e8 100644
--- a/public/js/mp/dye.js
+++ b/public/js/mp/dye.js
@@ -6,9 +6,9 @@ var mp = function(mp) {
asDyeString: asDyeString,
dyeImage: dyeImage
};
-
+
var channel = [null, "R", "G", "Y", "B", "M", "C", "W"];
-
+
/*
* Return the channel and intensity for the given RGB(A) array.
*/
@@ -29,46 +29,47 @@ var mp = function(mp) {
// Not pure
idx = 0;
} else {
+ // Either all components are the same (r == b == g), two components are 0, or two components are the same with one as 0.
idx = (r != 0) | ((g != 0) << 1) | ((b != 0) << 2);
}
return { channel: channel[idx], intensity: max };
}
-
+
/*
* Return a dye specification from a dye string.
*/
function parseDyeString(dyeString) {
var channelStrings = dyeString.split("|");
var dyeData = {};
-
+
for (var i = 0; i < channelStrings.length; i++) {
var channelStr = channelStrings[i];
if (channelStr[1] != ":" || channelStr[2] != "#") {
// TODO error
}
-
+
var channel = channelStr[0];
var parts = channelStr.substring(3).split(",");
-
+
var list = [];
-
+
for (var j = 0; j < parts.length; j++) {
list.push(mp.resource.parseColor(parts[j]));
}
-
+
dyeData[channel] = list;
}
-
+
return dyeData;
}
-
+
/*
* Return a dye string matching the given dye specification.
*/
function asDyeString(dye) {
var dyeString = "";
-
+
// skip null channel
for (var i = 1; i < channel.length; i++) {
var dyeChannel = channel[i];
@@ -76,26 +77,26 @@ var mp = function(mp) {
if (!dyeParts || dyeParts.length == 0) {
continue;
}
-
+
dyeString += dyeChannel + ":#";
-
+
for (var j = 0; j < dyeParts.length; j++) {
var color = dyeParts[j];
dyeString += color[0].toString(16) + color[1].toString(16) + color[2].toString(16) + ",";
}
-
+
dyeString = dyeString.slice(0, -1);
-
+
dyeString += "|";
}
-
+
if (dyeString.length > 0) {
dyeString = dyeString.slice(0, -1);
}
-
+
return dyeString;
}
-
+
/*
* Dye the internal image data based on the specification provided by dyeData.
* The specification can be generated from a dyeString by parseDyeString.
@@ -105,7 +106,7 @@ var mp = function(mp) {
for (var p = 0; p < imageData.length; p += 4) {
var pixel = [imageData[p], imageData[p + 1], imageData[p + 2]];
var alpha = imageData[p + 3];
-
+
// Skip fully transparent pixels
if (!alpha) {
continue;
@@ -124,7 +125,7 @@ var mp = function(mp) {
var val = intensity * dyeData[channelId].length
var i = Math.floor(val / 255);
var t = val - i * 255;
-
+
// If we exactly hit one of the palette colors, just use it
if (!t) {
--i;