| /******************************************************************************* |
| * Copyright (c) 2003, 2020 IBM Corporation and Others |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Junji MAEDA - initial API and implementation |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.actf.visualization.internal.engines.lowvision.problem; |
| |
| import java.io.PrintStream; |
| import java.io.PrintWriter; |
| |
| import org.eclipse.actf.visualization.engines.lowvision.LowVisionType; |
| import org.eclipse.actf.visualization.engines.lowvision.image.IPageImage; |
| import org.eclipse.actf.visualization.eval.problem.ILowvisionProblemSubtype; |
| import org.eclipse.actf.visualization.internal.engines.lowvision.PageElement; |
| import org.eclipse.actf.visualization.internal.engines.lowvision.image.ConnectedComponent; |
| import org.eclipse.actf.visualization.internal.engines.lowvision.image.Int2D; |
| import org.eclipse.actf.visualization.internal.engines.lowvision.image.PageComponent; |
| import org.w3c.dom.Element; |
| |
| |
| public abstract class LowVisionProblem implements ILowvisionProblemSubtype, ILowVisionProblem{ |
| IPageImage pageImage = null; |
| LowVisionType lowVisionType = null; |
| int problemType; |
| short componentType = PageComponent.UNDEFINED_TYPE; |
| PageComponent pageComponent = null; |
| PageElement pageElement = null; |
| String description; |
| int left = UNSET_POSITION; |
| int top = UNSET_POSITION; |
| int width = 0; |
| int height = 0; |
| int priority; |
| |
| double probability = 0.0; // |
| double characterScore = 0.0; // |
| //int numRecommendations = 0; // recommendations.length; |
| LowVisionRecommendation[] recommendations = null; |
| boolean isGroupFlag = false; // is LowVisionProblemGroup? |
| |
| Element element; |
| |
| protected LowVisionProblem(){ |
| } |
| |
| public LowVisionProblem( int _type, LowVisionType _lvType, String _description, PageComponent _com, double _proba ) throws LowVisionProblemException{ |
| problemType = _type; |
| lowVisionType = _lvType; |
| description = _description; |
| pageComponent = _com; |
| componentType = pageComponent.getType(); |
| pageImage = pageComponent.getPageImage(); |
| ConnectedComponent cc = pageComponent.getConnectedComponent(); |
| if( cc != null ){ |
| left = cc.getLeft(); |
| top = cc.getTop(); |
| width = cc.getWidth(); |
| height = cc.getHeight(); |
| } |
| setPriority(); |
| probability = _proba; |
| characterScore = probability * width * height; |
| } |
| |
| public LowVisionProblem( int _type, LowVisionType _lvType, String _description, PageElement _pe, double _proba ){ |
| problemType = _type; |
| lowVisionType = _lvType; |
| description = _description; |
| pageElement = _pe; |
| if( pageElement != null ){ |
| left = pageElement.getX(); |
| top = pageElement.getY(); |
| width = pageElement.getWidth(); |
| height = pageElement.getHeight(); |
| } |
| setPriority(); |
| probability = _proba; |
| } |
| |
| private void setPriority(){ |
| if( left == UNSET_POSITION || top == UNSET_POSITION ){ |
| priority = DEFAULT_PRIORITY; |
| }else{ |
| priority = 0x7fffffff - top * 0xffff - left; |
| } |
| /* |
| PageImage pi = component.getPageImage(); |
| if( pi != null ){ |
| int pageWidth = pi.getWidth(); |
| int pageHeight = pi.getHeight(); |
| priority = pageWidth*pageHeight - top*pageWidth - left; |
| } |
| else{ |
| priority = DEFAULT_PRIORITY; |
| } |
| */ |
| } |
| |
| protected abstract void setRecommendations() throws LowVisionProblemException; |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getType() |
| */ |
| @Override |
| public short getType() { |
| return( LOWVISION_PROBLEM ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getLowVisionType() |
| */ |
| @Override |
| public LowVisionType getLowVisionType(){ |
| return( lowVisionType ); |
| } |
| |
| // LowVision Error type (Color, Blur, etc.) |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getLowVisionProblemType() |
| */ |
| @Override |
| public int getLowVisionProblemType(){ |
| return( problemType ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getDescription() |
| */ |
| @Override |
| public String getDescription() throws LowVisionProblemException{ |
| return( description ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageImage() |
| */ |
| @Override |
| public IPageImage getPageImage(){ |
| return( pageImage ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getX() |
| */ |
| @Override |
| public int getX(){ |
| return( left ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getY() |
| */ |
| @Override |
| public int getY(){ |
| return( top ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getWidth() |
| */ |
| @Override |
| public int getWidth(){ |
| return( width ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getHeight() |
| */ |
| @Override |
| public int getHeight(){ |
| return( height ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPriority() |
| */ |
| @Override |
| public int getPriority(){ |
| return( priority ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getProbability() |
| */ |
| @Override |
| public double getProbability(){ |
| return( probability ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getIntProbability() |
| */ |
| @Override |
| public int getIntProbability(){ |
| return( (int)(Math.rint(probability*100.0)) ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getCharacterScore() |
| */ |
| @Override |
| public double getCharacterScore(){ |
| return( characterScore ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getRecommendations() |
| */ |
| @Override |
| public LowVisionRecommendation[] getRecommendations(){ |
| return( recommendations ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#isGroup() |
| */ |
| @Override |
| public boolean isGroup(){ |
| return( isGroupFlag ); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getComponentType() |
| */ |
| @Override |
| public short getComponentType() throws LowVisionProblemException{ |
| if( !isGroupFlag ){ |
| return( componentType ); |
| } |
| else{ |
| throw new LowVisionProblemException( "componentType cannot be gotten from a ProblemGroup." ); //$NON-NLS-1$ |
| } |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageComponent() |
| */ |
| @Override |
| public PageComponent getPageComponent() throws LowVisionProblemException{ |
| if( !isGroupFlag ){ |
| return( pageComponent ); |
| } |
| else{ |
| throw new LowVisionProblemException( "component cannot be gotten from a ProblemGroup." ); //$NON-NLS-1$ |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageElement() |
| */ |
| @Override |
| public PageElement getPageElement(){ |
| return( pageElement ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#toString() |
| */ |
| @Override |
| @SuppressWarnings("nls") |
| public String toString(){ |
| String compTypeString = null; |
| if( componentType == PageComponent.SS_CHARACTER_TYPE ){ |
| compTypeString = "(SS)"; |
| } |
| else if( componentType == PageComponent.MS_CHARACTER_TYPE ){ |
| compTypeString = "(MS)"; |
| } |
| else if( componentType == PageComponent.SM_CHARACTER_TYPE ){ |
| compTypeString = "(SM)"; |
| } |
| else{ |
| compTypeString = ""+componentType; |
| } |
| StringBuffer sb = new StringBuffer(); |
| sb.append( "Description=" + description ); |
| sb.append( compTypeString ); |
| sb.append( ", " ); |
| sb.append( "(x,y)=(" + left + "," + top + ")" ); |
| sb.append( ", " ); |
| sb.append( "[WIDTH x HEIGHT]=[" + width + " x " + height + "]" ); |
| sb.append( ", " ); |
| sb.append( "Probability=" + (int)(Math.rint(probability*100.0)) ); |
| sb.append( ", " ); |
| sb.append( "#Recommendations=" + recommendations.length ); |
| return( sb.toString() ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#dump(java.io.PrintStream, boolean) |
| */ |
| @Override |
| public void dump( PrintStream _ps, boolean _doRecommendations ) throws LowVisionProblemException{ |
| PrintWriter pw = new PrintWriter( _ps, true ); |
| dump( pw, _doRecommendations ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#dump(java.io.PrintWriter, boolean) |
| */ |
| @Override |
| @SuppressWarnings("nls") |
| public void dump( PrintWriter _pw, boolean _doRecommendations ) throws LowVisionProblemException{ |
| _pw.println( "----------" ); |
| _pw.println( "dumping a problem"); |
| _pw.println( "problemType = " + problemType ); |
| _pw.println( "componentType = " + componentType ); |
| _pw.println( "description = " + getDescription() ); |
| _pw.println( "(x,y) = ( " + getX() + ", " + getY() + ")" ); |
| _pw.println( "width, height = " + getWidth() + ", " + getHeight() ); |
| _pw.println( "priority = " + getPriority() ); |
| LowVisionRecommendation[] recs = getRecommendations(); |
| if( recs != null ){ |
| _pw.println( "# of Recommendations = " + recs.length ); |
| } |
| else{ |
| _pw.println( "Recommendations are null." ); |
| } |
| if( _doRecommendations && recs != null ){ |
| for( int i=0; i<recs.length; i++ ){ |
| _pw.println( "Recommendation #" + i ); |
| recs[i].dump(_pw); |
| } |
| } |
| _pw.println( "----------" ); |
| } |
| |
| private static final int[] PROBLEM_COLORS = { |
| 0x00ffffff, 0x00ff0000, 0x0000ff00 |
| }; |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#drawSurroundingBox(org.eclipse.actf.visualization.internal.engines.lowvision.image.Int2D) |
| */ |
| @Override |
| public void drawSurroundingBox( Int2D _img ){ |
| int x0 = getX(); |
| int y0 = getY(); |
| int x1 = x0+getWidth(); |
| int y1 = y0+getHeight(); |
| int color = PROBLEM_COLORS[problemType]; |
| for( int i=x0; i<x1; i++ ){ |
| _img.getData()[y0][i] = color; |
| _img.getData()[y1-1][i] = color; |
| } |
| for( int j=y0; j<y1; j++ ){ |
| _img.getData()[j][x0] = color; |
| _img.getData()[j][x1-1] = color; |
| } |
| } |
| |
| public static void drawAllSurroundingBoxes( ILowVisionProblem[] _problems, Int2D _img ){ |
| for( int k=0; k<_problems.length; k++ ){ |
| _problems[k].drawSurroundingBox( _img ); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getElement() |
| */ |
| @Override |
| public Element getElement() { |
| return element; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#setElement(org.w3c.dom.Element) |
| */ |
| @Override |
| public void setElement(Element element) { |
| this.element = element; |
| } |
| } |