/* * Software Name : ATK * * Copyright (C) 2007 - 2012 France Télécom * * Licensed 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. * * ------------------------------------------------------------------ * File Name : MyDisplayJAI.java * * Created : 04/06/2009 * Author(s) : France Telecom */ package com.orange.atk.compUI; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.Observable; import java.util.Observer; import javax.imageio.ImageIO; import com.orange.atk.compModel.Boolean2D; import com.orange.atk.compModel.ComparaisonCouple; import com.orange.atk.compModel.Mask; import com.orange.atk.compModel.Model; import com.sun.media.jai.widget.DisplayJAI; public class MyDisplayJAI extends DisplayJAI implements Observer { /** * */ private static final long serialVersionUID = 1L; private MyDisplayJAI me; private BufferedImage bi; private boolean isTest =true; public static final Color colorSimilarPart = new Color(100,200,50); public static final Color colorMaskSelected = Color.YELLOW; public static final Color colorSumMask= Color.BLUE; int w; int h; private Mask mask; private Mask activeMask; ArrayList<Integer> listMask; private Boolean2D diff; private double zoom = 1.0; private BufferedImage img; private ComparatorFrame comparatorFrame; Model model; /** * constructor * @param model * @param index * @param isTest - if the display will paint mask and differences */ public MyDisplayJAI(ComparaisonCouple couple, Model model, boolean isTest) { super(); model.addObserver(this); mask=couple.getMaskSum(); this.isTest=isTest; me = this; this.model = model; try { if (isTest){ img = ImageIO.read(couple.getImgTest()); }else{ img = ImageIO.read(model.getRefImage(couple.getImgRefId()).getImage()); } w = img.getWidth(); h = img.getHeight(); bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics g = bi.getGraphics(); Dimension dim = new Dimension(w,h); setPreferredSize(dim); setMinimumSize(dim); g.drawImage(img, 0, 0, null); } catch (IOException e) { e.printStackTrace(); } diff = couple.getDifWithMask(); } public void setZoom(double zoom) { if (zoom != this.zoom) { this.zoom = zoom; w = (int) (img.getWidth() * zoom); h = (int) (img.getHeight() * zoom); bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics g = bi.getGraphics(); Dimension dim = new Dimension(w,h); setPreferredSize(dim); setMinimumSize(dim); if (zoom != 1.0) g.drawImage(img.getScaledInstance(w, h, Image.SCALE_DEFAULT), 0, 0, null); else g.drawImage(img, 0, 0, null); } } public int getWidth() { return w; } public int getHeight() { return h; } public void set(BufferedImage img, ComparaisonCouple cp) { //Logger.getLogger(this.getClass() ).debug("MyDisplay.set"); w = (int) (img.getWidth() * zoom); h = (int) (img.getHeight() * zoom); diff = cp.getDifWithMask(); mask = cp.getMaskSum(); listMask = cp.getImgRef().getMaskListId(); bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics g = bi.getGraphics(); setSize(w, h); setMinimumSize(new Dimension(w,h) ); if (zoom != 1.0) g.drawImage(img.getScaledInstance(w, h, Image.SCALE_DEFAULT), 0, 0, null); else g.drawImage(img, 0, 0, null); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; /** * Set to the active or to null if the active mask is not part of the active imageRef */ Mask activeMaskChecked = activeMask; g.clearRect(0, 0, w, h); g2d.drawImage(bi, null,0,0); g2d.setStroke(new BasicStroke(1.5f)); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.6f)); if(activeMask!=null){ if(!listMask.contains(activeMask.getId())) activeMaskChecked = null; } if(model!=null){ for (int x=0; x<model.getMaskWidth(); x++){ for (int y=0; y<model.getMaskHeight(); y++){ if(isTest && !diff.get(x, y)){ g2d.setColor(colorSimilarPart); g2d.fillRect( (int)((2*x)*Mask.getCELL_HALF_SIZE()*zoom), (int)((2*y)*Mask.getCELL_HALF_SIZE()*zoom), (int)(2*Mask.getCELL_HALF_SIZE()*zoom), (int)(2*Mask.getCELL_HALF_SIZE()*zoom)); } else if (mask.getCell(x, y)){ if(activeMaskChecked!= null){ if (activeMaskChecked.getCell(x, y)) g2d.setColor(colorMaskSelected); else g2d.setColor(colorSumMask); }else g2d.setColor(colorSumMask); g2d.fillRect( (int)((2*x)*Mask.getCELL_HALF_SIZE()*zoom), (int)((2*y)*Mask.getCELL_HALF_SIZE()*zoom), (int)(2*Mask.getCELL_HALF_SIZE()*zoom), (int)(2*Mask.getCELL_HALF_SIZE()*zoom)); } } } } } public void update(Observable arg0, java.lang.Object arg1) { repaint(); } public void setActiveMask(Mask selectedMask) { activeMask = selectedMask; } public void addListener(ComparatorFrame comparatorFrameArg){ comparatorFrame = comparatorFrameArg; this.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent arg0) { if(arg0.getButton()==MouseEvent.BUTTON1){ if(arg0.getClickCount() == 2) comparatorFrame.addLine(arg0); else comparatorFrame.addZone(arg0); } else if(arg0.getButton()==MouseEvent.BUTTON3){ comparatorFrame.showInfoZone(arg0,me); } } public void mousePressed(MouseEvent arg0) { comparatorFrame.refScDescChanged(); comparatorFrame.mousePressed(arg0); } public void mouseReleased(MouseEvent arg0) { comparatorFrame.mouseReleased(arg0); } }); this.addMouseMotionListener(new MouseMotionListener() { public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { comparatorFrame.addZoneDragged(e); } }); } }