blob: 1d1dc19c35ae7ee96dd00a5ab8be99cc4335acca [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.kie.lienzo.client;
import com.ait.lienzo.client.core.image.PictureLoadedHandler;
import com.ait.lienzo.client.core.image.filter.AbstractImageDataFilter;
import com.ait.lienzo.client.core.image.filter.AlphaScaleColorImageDataFilter;
import com.ait.lienzo.client.core.image.filter.AverageGrayScaleImageDataFilter;
import com.ait.lienzo.client.core.image.filter.BrightnessImageDataFilter;
import com.ait.lienzo.client.core.image.filter.BumpImageDataFilter;
import com.ait.lienzo.client.core.image.filter.ColorDeltaAlphaImageDataFilter;
import com.ait.lienzo.client.core.image.filter.ColorLuminosityImageDataFilter;
import com.ait.lienzo.client.core.image.filter.ContrastImageDataFilter;
import com.ait.lienzo.client.core.image.filter.DiffusionImageDataFilter;
import com.ait.lienzo.client.core.image.filter.EdgeDetectImageDataFilter;
import com.ait.lienzo.client.core.image.filter.EmbossImageDataFilter;
import com.ait.lienzo.client.core.image.filter.ExposureImageDataFilter;
import com.ait.lienzo.client.core.image.filter.GainImageDataFilter;
import com.ait.lienzo.client.core.image.filter.GammaImageDataFilter;
import com.ait.lienzo.client.core.image.filter.HueImageDataFilter;
import com.ait.lienzo.client.core.image.filter.ImageDataFilter;
import com.ait.lienzo.client.core.image.filter.InvertColorImageDataFilter;
import com.ait.lienzo.client.core.image.filter.LightnessGrayScaleImageDataFilter;
import com.ait.lienzo.client.core.image.filter.LuminosityGrayScaleImageDataFilter;
import com.ait.lienzo.client.core.image.filter.PosterizeImageDataFilter;
import com.ait.lienzo.client.core.image.filter.RGBIgnoreAlphaImageDataFilter;
import com.ait.lienzo.client.core.image.filter.SharpenImageDataFilter;
import com.ait.lienzo.client.core.image.filter.SolarizeImageDataFilter;
import com.ait.lienzo.client.core.image.filter.StackBlurImageDataFilter;
import com.ait.lienzo.client.core.shape.Picture;
import com.ait.lienzo.client.core.types.BoundingBox;
import com.ait.lienzo.client.widget.panel.LienzoPanel;
import com.ait.lienzo.shared.core.types.ColorName;
import com.google.gwt.dom.client.Style.Display;
import elemental2.core.JsArray;
import elemental2.dom.DomGlobal;
import elemental2.dom.HTMLDivElement;
import elemental2.dom.HTMLInputElement;
import elemental2.dom.HTMLOptionElement;
import elemental2.dom.HTMLSelectElement;
import org.kie.lienzo.client.util.Util;
import static elemental2.dom.DomGlobal.document;
public class DrawImageExample extends BaseExample implements Example {
private final String IMAGE_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Peach_poster_rodents.jpg/640px-Peach_poster_rodents.jpg";
private HTMLInputElement slider = (HTMLInputElement) DomGlobal.document.createElement("input");
private JsArray<Picture> pictures;
private HTMLSelectElement select;
public DrawImageExample(final String title) {
super(title);
}
@Override
public void init(final LienzoPanel panel, final HTMLDivElement topDiv) {
super.init(panel, topDiv);
topDiv.style.display = Display.INLINE_BLOCK.getCssName();
pictures = new JsArray<Picture>();
slider.type = "range";
slider.min = "25";
slider.max = "100";
slider.step = "5";
slider.value = "25";
slider.oninput = (e) -> {
double scale = Double.parseDouble(slider.value);
setScale(scale / 100);
console.log("scale " + slider.value + "%");
layer.batch();
return null;
};
topDiv.appendChild(slider);
select = (HTMLSelectElement) document.createElement("select");
HTMLOptionElement option = addOption("None", select);
option.selected = true;
addOption("Grey Scale", select);
addOption("Brightness", select);
addOption("Contrast", select);
addOption("Alpha Scale Color", select);
addOption("Color Delta Alpha", select);
addOption("Color Luminosity", select);
addOption("Bump", select);
addOption("Diffusion", select);
addOption("Edge Detection", select);
addOption("Emboss", select);
addOption("Exposure", select);
addOption("Gain", select);
addOption("Gamma", select);
addOption("Hue", select);
addOption("Invert Color", select);
addOption("Lightness Grey Scale", select);
addOption("Luminosity Grey Scale", select);
addOption("Posterize", select);
addOption("RGB Ignore", select);
addOption("Sharpen", select);
addOption("Solarize", select);
addOption("Stack Blur", select);
addOption("None", select);
topDiv.appendChild(select);
select.onchange = (e) -> {
AbstractImageDataFilter filter = null;
switch (select.value) {
case "Grey Scale":
filter = new AverageGrayScaleImageDataFilter();
break;
case "Alpha Scale Color":
filter = new AlphaScaleColorImageDataFilter(ColorName.RED);
break;
case "Color Delta Alpha":
filter = new ColorDeltaAlphaImageDataFilter(ColorName.RED, 50);
break;
case "Color Luminosity":
filter = new ColorLuminosityImageDataFilter(ColorName.RED);
break;
case "Brightness":
filter = new BrightnessImageDataFilter();
break;
case "Contrast":
filter = new ContrastImageDataFilter();
break;
case "Bump":
filter = new BumpImageDataFilter();
break;
case "Emboss":
filter = new EmbossImageDataFilter();
break;
case "Diffusion":
filter = new DiffusionImageDataFilter();
break;
case "Edge Detection":
filter = new EdgeDetectImageDataFilter();
break;
case "Exposure":
filter = new ExposureImageDataFilter();
break;
case "Gain":
filter = new GainImageDataFilter();
break;
case "Gamma":
filter = new GammaImageDataFilter();
break;
case "Hue":
filter = new HueImageDataFilter();
break;
case "Invert Color":
filter = new InvertColorImageDataFilter();
break;
case "Lightness Grey Scale":
filter = new LightnessGrayScaleImageDataFilter();
break;
case "Luminosity Grey Scale":
filter = new LuminosityGrayScaleImageDataFilter();
break;
case "Posterize":
filter = new PosterizeImageDataFilter();
break;
case "RGB Ignore":
filter = new RGBIgnoreAlphaImageDataFilter();
break;
case "Sharpen":
filter = new SharpenImageDataFilter();
break;
case "Solarize":
filter = new SolarizeImageDataFilter();
break;
case "Stack Blur":
filter = new StackBlurImageDataFilter();
break;
case "None":
clearImageDataFilter();
break;
}
if (filter != null) {
console.log("Filter Request Start: " + select.value);
setImageDataFilter(filter);
console.log("Filter Finished End: " + select.value);
}
layer.batch();
return null;
};
}
private HTMLOptionElement addOption(String filter, HTMLSelectElement select) {
HTMLOptionElement option = (HTMLOptionElement) document.createElement("option");
option.label = filter;
option.value = filter;
select.add(option);
return option;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
final int pos = i;
PictureLoadedHandler handler = (e) ->
{
Picture picture = pictures.getAt(pos);
picture.setScale(0.25);
BoundingBox box = picture.getBoundingBox();
Util.setLocation(picture, width, height, 5, 5, 5, 5);
console.log("Image Loaded");
layer.batch();
};
Picture picture = new Picture(IMAGE_URL, handler);
picture.setDraggable(true);
layer.add(picture);
pictures.push(picture);
}
}
public void setScale(double scale) {
for (Picture picture : pictures.asList()) {
picture.setScale(scale);
}
}
public void setImageDataFilter(ImageDataFilter filter) {
for (Picture picture : pictures.asList()) {
picture.getImageProxy().setFilters(filter);
picture.reFilter((e) -> {
});
}
}
public void clearImageDataFilter() {
for (Picture picture : pictures.asList()) {
picture.getImageProxy().clearFilters();
picture.reFilter((e) -> {
});
}
}
@Override
public void destroy() {
super.destroy();
select.remove();
slider.remove();
pictures = null;
console.log("Destroying Draw Image ->");
}
}