diff --git a/craftscripts/draw.js b/craftscripts/draw.js new file mode 100644 index 000000000..fbcb67eac --- /dev/null +++ b/craftscripts/draw.js @@ -0,0 +1,94 @@ +// $Id$ +/* + * Very bad image drawer + * Copyright (C) 2011 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +importPackage(Packages.java.io); +importPackage(Packages.java.awt); +importPackage(Packages.javax.imageio); +importPackage(Packages.com.sk89q.worldedit); +importPackage(Packages.com.sk89q.worldedit.blocks); + +function makeColor(r, g, b) { + return new Color(r / 255, g / 255, b / 255); +} + +var clothColors = [ + makeColor(0, 0, 0), // White + makeColor(255, 100, 0), // Orange + makeColor(200, 0, 200), // Magenta + makeColor(87, 132, 223), // Light blue + makeColor(255, 255, 0), // Yellow + makeColor(0, 255, 0), // Green + makeColor(255, 180, 200), // Pink + makeColor(72, 72, 72), // Gray + makeColor(173, 173, 173), // Light grey + makeColor(0, 100, 160), // Cyan + makeColor(120, 0, 200), // Purple + makeColor(0, 0, 175), // Blue + makeColor(100, 60, 0), // Brown + makeColor(48, 80, 0), // Cactus green + makeColor(255, 0, 0), // Red + makeColor(0, 0, 0), // Black +] + +// http://stackoverflow.com/questions/2103368/color-logic-algorithm/2103608#2103608 +function colorDistance(c1, c2) { + var rmean = (c1.getRed() + c2.getRed()) / 2; + var r = c1.getRed() - c2.getRed(); + var g = c1.getGreen() - c2.getGreen(); + var b = c1.getBlue() - c2.getBlue(); + var weightR = 2 + rmean/256; + var weightG = 4.0; + var weightB = 2 + (255-rmean)/256 + return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b); +} + +function findClosestWoolColor(col) { + var closestId = 0; + var closestDistance = colorDistance(col, clothColors[0]); + + for (var i = 1; i < clothColors.length; i++) { + var dist = colorDistance(col, clothColors[i]); + + if (dist < closestDistance) { + closestId = i; + closestDistance = dist; + } + } + + return closestId; +} + +var sess = context.remember(); + +context.checkArgs(1, 1, ""); + +var img = ImageIO.read(context.getSafeFile("drawings", argv[1])); + +var width = img.getWidth(); +var height = img.getHeight(); + +var origin = player.getBlockIn(); + +for (var x = 0; x < width; x++) { + for (var y = 0; y < height; y++) { + var c = new Color(img.getRGB(x, y)); + var data = findClosestWoolColor(c); + sess.setBlock(origin.add(x, 0, y), new BaseBlock(35, data)); + } +} \ No newline at end of file