package zenproject.meditation.android.sketch.painting.flowers; import com.juankysoriano.rainbow.core.drawing.RainbowDrawer; import com.juankysoriano.rainbow.core.graphics.RainbowGraphics; import com.juankysoriano.rainbow.core.graphics.RainbowImage; import com.juankysoriano.rainbow.utils.RainbowMath; import java.util.ArrayList; import java.util.List; import zenproject.meditation.android.sketch.painting.flowers.branch.Branch; public class FlowerDrawer implements RainbowImage.LoadPictureListener { private static final RainbowImage NO_IMAGE = null; protected static final int WHITE = 255; public static final int NORMAL = 1; public static final int REVERSE = -1; private final Flower flower; private final List<RainbowImage> flowerImages; private final RainbowDrawer rainbowDrawer; protected FlowerDrawer(Flower flower, List<RainbowImage> flowerImages, RainbowDrawer rainbowDrawer) { this.flower = flower; this.flowerImages = flowerImages; this.rainbowDrawer = rainbowDrawer; } public static FlowerDrawer newInstance(Flower flower, RainbowDrawer rainbowDrawer) { List<Integer> flowerLeafsRes = flower.getFlowerLeafRes(); return new FlowerDrawer(flower, new ArrayList<RainbowImage>(flowerLeafsRes.size()), rainbowDrawer); } public void init() { for (Integer leafRes : flower.getFlowerLeafRes()) { rainbowDrawer.loadImage(leafRes, RainbowImage.LOAD_ORIGINAL_SIZE, this); } } @Override public void onLoadSucceed(RainbowImage imageLoaded) { flowerImages.add(imageLoaded); } @Override public void onLoadFail() { flowerImages.add(NO_IMAGE); } public void paintFlowerFor(Branch branch) { if (hasFlowersToPaint()) { float flowerSize = getFlowerSize(); float rotation = RainbowMath.random(RainbowMath.QUARTER_PI); rainbowDrawer.tint(WHITE); rainbowDrawer.imageMode(RainbowGraphics.CENTER); rainbowDrawer.pushMatrix(); rainbowDrawer.translate(branch.getX(), branch.getY()); rainbowDrawer.rotate(rotation); flipHorizontallyIfLuck(); rainbowDrawer.image(getRandomFlower(), 0, 0, flowerSize, flowerSize); rainbowDrawer.popMatrix(); } } private boolean hasFlowersToPaint() { return !flowerImages.isEmpty(); } private RainbowImage getRandomFlower() { return flowerImages.get((int) RainbowMath.random(flowerImages.size())); } private void flipHorizontallyIfLuck() { if (flipCoin()) { rainbowDrawer.scale(REVERSE, NORMAL); //Tricky, but this reverses image. } } private boolean flipCoin() { return RainbowMath.random(100) >= 50; } private float getFlowerSize() { return RainbowMath.random(flower.getMinSize(), flower.getMaxSize()); } }