diff options
Diffstat (limited to 'public/js/mp/dye.js')
-rw-r--r-- | public/js/mp/dye.js | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/public/js/mp/dye.js b/public/js/mp/dye.js index 530b6c4..7cf8da5 100644 --- a/public/js/mp/dye.js +++ b/public/js/mp/dye.js @@ -28,11 +28,50 @@ var mp = function(mp) { return { channel: channel[idx], intensity: max }; } + /* + * Return a dye specification from a dye string. + */ function parseDyeString(dyeString) { /* TODO */ } + /* + * Dye the internal image data based on the specification provided by dyeData. + * The specification can be generated from a dyeString by parseDyeString. + * The array passed in will be modified. + */ function dyeImage(imageData, dyeData) { + for (var p = 0; p < imageData.length; p += 4) { + var pixel = [imageData[p], imageData[p + 1], imageData[p + 2]]; + var alpha = imageData[p + 3]; + if (!alpha) { + continue; + } + + var channel = getChannel(pixel); + var channelId = channel.channel; + + if (!channelId || !(channelId in dyeData) || !dyeData[channelId].length) { + continue; + } + + var intensity = channel.intensity; + var val = intensity * dyeData[channelId].length + var i = Math.floor(val / 255); + var t = val - i * 255; + if (!t) { + --i; + imageData[p ] = dyeData[channelId][i][0]; + imageData[p + 1] = dyeData[channelId][i][1]; + imageData[p + 2] = dyeData[channelId][i][2]; + continue; + } + + imageData[p ] = ((255 - t) * (i && dyeData[channelId][i - 1][0]) + t * dyeData[channelId][i][0]) / 255; + imageData[p + 1] = ((255 - t) * (i && dyeData[channelId][i - 1][1]) + t * dyeData[channelId][i][1]) / 255; + imageData[p + 2] = ((255 - t) * (i && dyeData[channelId][i - 1][2]) + t * dyeData[channelId][i][2]) / 255; + } /* TODO */ + return imageData; } return mp; }(mp || {}); |