1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski package graphical; 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski import helper.OSHelper; 26*b1cdbd2cSJim Jagielski import helper.ProcessHandler; 27*b1cdbd2cSJim Jagielski import java.io.File; 28*b1cdbd2cSJim Jagielski import java.io.IOException; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski /** 31*b1cdbd2cSJim Jagielski * Helper class to interpret a jpg filename 32*b1cdbd2cSJim Jagielski */ 33*b1cdbd2cSJim Jagielski class NameDPIPage 34*b1cdbd2cSJim Jagielski { 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski String Name; 37*b1cdbd2cSJim Jagielski int DPI; 38*b1cdbd2cSJim Jagielski int Page; 39*b1cdbd2cSJim Jagielski NameDPIPage(String _sName, int _nDPI, int _nPage)40*b1cdbd2cSJim Jagielski private NameDPIPage(String _sName, int _nDPI, int _nPage) 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski Name = _sName; 43*b1cdbd2cSJim Jagielski DPI = _nDPI; 44*b1cdbd2cSJim Jagielski Page = _nPage; 45*b1cdbd2cSJim Jagielski } 46*b1cdbd2cSJim Jagielski interpret(String _sFilename)47*b1cdbd2cSJim Jagielski public static NameDPIPage interpret(String _sFilename) 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski String sBasename = FileHelper.getBasename(_sFilename); // if exist a path, remove it 50*b1cdbd2cSJim Jagielski String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename); // remove extension (.jpg) 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski // check if there exist a 'DPI_' at specific position 53*b1cdbd2cSJim Jagielski String sDPICheck = sNameNoSuffix.substring(sNameNoSuffix.length() - 8, sNameNoSuffix.length() - 4); 54*b1cdbd2cSJim Jagielski String sName; 55*b1cdbd2cSJim Jagielski int nDPI = -1; 56*b1cdbd2cSJim Jagielski int nPage = -1; 57*b1cdbd2cSJim Jagielski if (sDPICheck.equals("DPI_")) 58*b1cdbd2cSJim Jagielski { 59*b1cdbd2cSJim Jagielski // seems to be a generated filename by us. 60*b1cdbd2cSJim Jagielski int nDPIStart = sNameNoSuffix.lastIndexOf("_", sNameNoSuffix.length() - 8); 61*b1cdbd2cSJim Jagielski sName = sNameNoSuffix.substring(0, nDPIStart); 62*b1cdbd2cSJim Jagielski if (nDPIStart > 0) 63*b1cdbd2cSJim Jagielski { 64*b1cdbd2cSJim Jagielski String sDPI = sNameNoSuffix.substring(nDPIStart + 1, sNameNoSuffix.length() - 8); 65*b1cdbd2cSJim Jagielski try 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski nDPI = Integer.valueOf(sDPI).intValue(); 68*b1cdbd2cSJim Jagielski } 69*b1cdbd2cSJim Jagielski catch (java.lang.NumberFormatException e) 70*b1cdbd2cSJim Jagielski { 71*b1cdbd2cSJim Jagielski GlobalLogWriter.println("DPI: Number format exception"); 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski String sPage = sNameNoSuffix.substring(sNameNoSuffix.length() - 4); 74*b1cdbd2cSJim Jagielski try 75*b1cdbd2cSJim Jagielski { 76*b1cdbd2cSJim Jagielski nPage = Integer.valueOf(sPage).intValue(); 77*b1cdbd2cSJim Jagielski } 78*b1cdbd2cSJim Jagielski catch (java.lang.NumberFormatException e) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Page: Number format exception"); 81*b1cdbd2cSJim Jagielski } 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski } 84*b1cdbd2cSJim Jagielski else 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski sName = sNameNoSuffix; 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski return new NameDPIPage(sName, nDPI, nPage); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski class CountNotXXXPixelsFromImage extends Thread 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski private String m_sFilename; 97*b1cdbd2cSJim Jagielski protected int m_nValue; 98*b1cdbd2cSJim Jagielski CountNotXXXPixelsFromImage(String _sFilename)99*b1cdbd2cSJim Jagielski CountNotXXXPixelsFromImage(String _sFilename) 100*b1cdbd2cSJim Jagielski { 101*b1cdbd2cSJim Jagielski m_sFilename = _sFilename; 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski getValue()104*b1cdbd2cSJim Jagielski public int getValue() 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski return m_nValue; 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski setValue(int _nValue)109*b1cdbd2cSJim Jagielski protected void setValue(int _nValue) 110*b1cdbd2cSJim Jagielski { 111*b1cdbd2cSJim Jagielski m_nValue = _nValue; 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski getFilename()114*b1cdbd2cSJim Jagielski protected String getFilename() 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski return m_sFilename; 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski } 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski class CountNotWhitePixelsFromImage extends CountNotXXXPixelsFromImage 121*b1cdbd2cSJim Jagielski { 122*b1cdbd2cSJim Jagielski CountNotWhitePixelsFromImage(String _sFilename)123*b1cdbd2cSJim Jagielski CountNotWhitePixelsFromImage(String _sFilename) 124*b1cdbd2cSJim Jagielski { 125*b1cdbd2cSJim Jagielski super(_sFilename); 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski run()128*b1cdbd2cSJim Jagielski public void run() 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski try 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski final int nNotWhiteCount = PixelCounter.countNotWhitePixelsFromImage(getFilename()); 133*b1cdbd2cSJim Jagielski setValue(nNotWhiteCount); 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski catch (java.io.IOException e) 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski m_nValue = -1; 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski class CountNotBlackPixelsFromImage extends CountNotXXXPixelsFromImage 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski CountNotBlackPixelsFromImage(String _sFilename)145*b1cdbd2cSJim Jagielski CountNotBlackPixelsFromImage(String _sFilename) 146*b1cdbd2cSJim Jagielski { 147*b1cdbd2cSJim Jagielski super(_sFilename); 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski run()150*b1cdbd2cSJim Jagielski public void run() 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski try 153*b1cdbd2cSJim Jagielski { 154*b1cdbd2cSJim Jagielski final int nNotBlackCount = PixelCounter.countNotBlackPixelsFromImage(getFilename()); 155*b1cdbd2cSJim Jagielski setValue(nNotBlackCount); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski catch (java.io.IOException e) 158*b1cdbd2cSJim Jagielski { 159*b1cdbd2cSJim Jagielski m_nValue = -1; 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski /** 165*b1cdbd2cSJim Jagielski * 166*b1cdbd2cSJim Jagielski * @author ll93751 167*b1cdbd2cSJim Jagielski */ 168*b1cdbd2cSJim Jagielski public class JPEGComparator extends EnhancedComplexTestCase 169*b1cdbd2cSJim Jagielski { 170*b1cdbd2cSJim Jagielski // @Override 171*b1cdbd2cSJim Jagielski getTestMethodNames()172*b1cdbd2cSJim Jagielski public String[] getTestMethodNames() 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski return new String[]{"CompareJPEGvsJPEG"}; 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski private Tolerance m_aTolerance; 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski /** 179*b1cdbd2cSJim Jagielski * test function. 180*b1cdbd2cSJim Jagielski */ CompareJPEGvsJPEG()181*b1cdbd2cSJim Jagielski public void CompareJPEGvsJPEG() 182*b1cdbd2cSJim Jagielski { 183*b1cdbd2cSJim Jagielski GlobalLogWriter.set(log); 184*b1cdbd2cSJim Jagielski ParameterHelper aParam = new ParameterHelper(param); 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski // run through all documents found in Inputpath 187*b1cdbd2cSJim Jagielski foreachJPEGcompareWithJPEG(aParam); 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski checkOneFile(String _sDocumentName, String _sResult, ParameterHelper _aParams)190*b1cdbd2cSJim Jagielski public void checkOneFile(String _sDocumentName, String _sResult, ParameterHelper _aParams) throws OfficeException 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski // private void callEveryPictureInIniFile(IniFile _aIniFile, String _sSectionName, ParameterHelper _aParam) 193*b1cdbd2cSJim Jagielski // { 194*b1cdbd2cSJim Jagielski String sPath = FileHelper.getPath(_sDocumentName); 195*b1cdbd2cSJim Jagielski String sSectionName = FileHelper.getBasename(_sDocumentName); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski // take the build id out of the ini file in the reference file and put it into the current parameter helper 198*b1cdbd2cSJim Jagielski String sIniFileForRefBuildID = FileHelper.appendPath(sPath, sSectionName + ".ini"); 199*b1cdbd2cSJim Jagielski IniFile aIniFileForRefBuildID = new IniFile(sIniFileForRefBuildID); 200*b1cdbd2cSJim Jagielski String sRefBuildID = aIniFileForRefBuildID.getValue("global", "buildid"); 201*b1cdbd2cSJim Jagielski aIniFileForRefBuildID.close(); 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski _aParams.getTestParameters().put("RefBuildId", sRefBuildID); 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski String sIniFile = FileHelper.appendPath(sPath, "index.ini"); 206*b1cdbd2cSJim Jagielski IniFile aIniFile = new IniFile(sIniFile); 207*b1cdbd2cSJim Jagielski if (aIniFile.hasValue(sSectionName, "pages")) 208*b1cdbd2cSJim Jagielski { 209*b1cdbd2cSJim Jagielski // only which has 'pages' has also pictures 210*b1cdbd2cSJim Jagielski int nPages = aIniFile.getIntValue(sSectionName, "pages", 0); 211*b1cdbd2cSJim Jagielski String sJPEGSchema = aIniFile.getValue(sSectionName, "jpegschema"); 212*b1cdbd2cSJim Jagielski int nTolerance = aIniFile.getIntValue(sSectionName, "tolerance", 0); 213*b1cdbd2cSJim Jagielski m_aTolerance = new Tolerance(nTolerance); 214*b1cdbd2cSJim Jagielski for (int i = 1; i <= nPages; i++) 215*b1cdbd2cSJim Jagielski { 216*b1cdbd2cSJim Jagielski String sJPEGFilename = JPEGCreator.getFilenameForJPEGSchema(sJPEGSchema, i); 217*b1cdbd2cSJim Jagielski // String sPath = FileHelper.getPath(_aParam.getInputPath()); 218*b1cdbd2cSJim Jagielski String sJPEGPath = FileHelper.getPath(sJPEGFilename); 219*b1cdbd2cSJim Jagielski if (!sPath.equals(sJPEGPath)) 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Path where to find the index and where to file the JPEG pictures are not the same."); 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski // String sEntry = FileHelper.appendPath(sPath, sSection); 225*b1cdbd2cSJim Jagielski File aFile = new File(sJPEGFilename); 226*b1cdbd2cSJim Jagielski assure("File '" + sJPEGFilename + "' doesn't exists.", aFile.exists(), true); 227*b1cdbd2cSJim Jagielski if (aFile.exists()) 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Page: " + i); 230*b1cdbd2cSJim Jagielski checkOnePicture(sJPEGFilename, _sResult, _aParams); 231*b1cdbd2cSJim Jagielski } 232*b1cdbd2cSJim Jagielski } 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski else 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski GlobalLogWriter.println("The document '" + sSectionName + "' seems to have no picture representation."); 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski String sResultIniFile = FileHelper.appendPath(_sResult, sSectionName); 240*b1cdbd2cSJim Jagielski evaluateResult(sResultIniFile, _aParams); 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski evaluateResult(String _sDocument, ParameterHelper _aParams)243*b1cdbd2cSJim Jagielski private void evaluateResult(String _sDocument, ParameterHelper _aParams) 244*b1cdbd2cSJim Jagielski { 245*b1cdbd2cSJim Jagielski String sResultIniFile = _sDocument + ".ini"; 246*b1cdbd2cSJim Jagielski File aFile = new File(sResultIniFile); 247*b1cdbd2cSJim Jagielski assure("Result file doesn't exists " + sResultIniFile, aFile.exists()); 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski int good = 0; 250*b1cdbd2cSJim Jagielski int bad = 0; 251*b1cdbd2cSJim Jagielski int ugly = 0; 252*b1cdbd2cSJim Jagielski int ok_status = 1; // 1=ok 2=bad 3=ugly 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski IniFile aResultIniFile = new IniFile(sResultIniFile); 255*b1cdbd2cSJim Jagielski int nPages = aResultIniFile.getIntValue("global", "pages", 0); 256*b1cdbd2cSJim Jagielski for (int i = 0; i < nPages; i++) 257*b1cdbd2cSJim Jagielski { 258*b1cdbd2cSJim Jagielski String sCurrentPage = "page" + String.valueOf(i + 1); 259*b1cdbd2cSJim Jagielski int nPercent = aResultIniFile.getIntValue(sCurrentPage, "percent", -1); 260*b1cdbd2cSJim Jagielski if (nPercent == 0) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski good++; 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski else if (nPercent <= 5) 265*b1cdbd2cSJim Jagielski { 266*b1cdbd2cSJim Jagielski bad++; 267*b1cdbd2cSJim Jagielski ok_status = 2; 268*b1cdbd2cSJim Jagielski } 269*b1cdbd2cSJim Jagielski else 270*b1cdbd2cSJim Jagielski { 271*b1cdbd2cSJim Jagielski ugly++; 272*b1cdbd2cSJim Jagielski ok_status = 3; 273*b1cdbd2cSJim Jagielski } 274*b1cdbd2cSJim Jagielski } 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski assure("Error: document doesn't contains pages", nPages > 0); 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski // TODO: this information has to come out of the ini files 279*b1cdbd2cSJim Jagielski String sStatusRunThrough = "PASSED, "; 280*b1cdbd2cSJim Jagielski String sPassed = "OK"; 281*b1cdbd2cSJim Jagielski 282*b1cdbd2cSJim Jagielski String sStatusMessage = "From " + nPages + " page(s) are: "; 283*b1cdbd2cSJim Jagielski String sGood = ""; 284*b1cdbd2cSJim Jagielski String sBad = ""; 285*b1cdbd2cSJim Jagielski String sUgly = ""; 286*b1cdbd2cSJim Jagielski 287*b1cdbd2cSJim Jagielski if (good > 0) 288*b1cdbd2cSJim Jagielski { 289*b1cdbd2cSJim Jagielski sGood = " good:=" + good; 290*b1cdbd2cSJim Jagielski sStatusMessage += sGood; 291*b1cdbd2cSJim Jagielski } 292*b1cdbd2cSJim Jagielski if (bad > 0) 293*b1cdbd2cSJim Jagielski { 294*b1cdbd2cSJim Jagielski sBad = " bad:=" + bad; 295*b1cdbd2cSJim Jagielski sStatusMessage += sBad; 296*b1cdbd2cSJim Jagielski } 297*b1cdbd2cSJim Jagielski if (ugly > 0) 298*b1cdbd2cSJim Jagielski { 299*b1cdbd2cSJim Jagielski sUgly = " ugly:=" + ugly; 300*b1cdbd2cSJim Jagielski sStatusMessage += sUgly; 301*b1cdbd2cSJim Jagielski } 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski // Failure matrix 304*b1cdbd2cSJim Jagielski // 0 1 305*b1cdbd2cSJim Jagielski // ugly OK FAILED 306*b1cdbd2cSJim Jagielski // bad OK 307*b1cdbd2cSJim Jagielski // good OK 308*b1cdbd2cSJim Jagielski 309*b1cdbd2cSJim Jagielski if (ugly > 0) 310*b1cdbd2cSJim Jagielski { 311*b1cdbd2cSJim Jagielski sPassed = "FAILED"; 312*b1cdbd2cSJim Jagielski } 313*b1cdbd2cSJim Jagielski else 314*b1cdbd2cSJim Jagielski { 315*b1cdbd2cSJim Jagielski if (bad > 0) 316*b1cdbd2cSJim Jagielski { 317*b1cdbd2cSJim Jagielski sPassed = "NEED A LOOK"; 318*b1cdbd2cSJim Jagielski } 319*b1cdbd2cSJim Jagielski else 320*b1cdbd2cSJim Jagielski { 321*b1cdbd2cSJim Jagielski sPassed = "OK"; 322*b1cdbd2cSJim Jagielski } 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski sStatusRunThrough += sPassed; 325*b1cdbd2cSJim Jagielski aResultIniFile.insertValue("global", "state", sStatusRunThrough); 326*b1cdbd2cSJim Jagielski aResultIniFile.insertValue("global", "info", sStatusMessage); 327*b1cdbd2cSJim Jagielski aResultIniFile.close(); 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim Jagielski _aParams.getTestParameters().put("current_state", sStatusRunThrough); 330*b1cdbd2cSJim Jagielski _aParams.getTestParameters().put("current_info", sStatusMessage); 331*b1cdbd2cSJim Jagielski _aParams.getTestParameters().put("current_ok_status", ok_status); 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski // if we have a ugly page, we must return this as a FAILED STATUS in Log file! 334*b1cdbd2cSJim Jagielski assure("There exist pages marked as ugly.", ugly == 0); 335*b1cdbd2cSJim Jagielski } 336*b1cdbd2cSJim Jagielski checkOnePicture(String _sDocumentName, String _sResult, ParameterHelper _aParams)337*b1cdbd2cSJim Jagielski private void checkOnePicture(String _sDocumentName, String _sResult, ParameterHelper _aParams) 338*b1cdbd2cSJim Jagielski { 339*b1cdbd2cSJim Jagielski GlobalLogWriter.println("JPEG: Compare difference between '" + _sDocumentName + "' and '" + _sResult + "'"); 340*b1cdbd2cSJim Jagielski File aResultFile = new File(_sResult); 341*b1cdbd2cSJim Jagielski if (aResultFile.isDirectory()) 342*b1cdbd2cSJim Jagielski { 343*b1cdbd2cSJim Jagielski // result is just a directory, so we search for the basename of the source and take this. 344*b1cdbd2cSJim Jagielski String sBasename = FileHelper.getBasename(_sDocumentName); 345*b1cdbd2cSJim Jagielski String sResultFilename = FileHelper.appendPath(_sResult, sBasename); 346*b1cdbd2cSJim Jagielski aResultFile = new File(sResultFilename); 347*b1cdbd2cSJim Jagielski if (aResultFile.exists()) 348*b1cdbd2cSJim Jagielski { 349*b1cdbd2cSJim Jagielski // Original and Result exists 350*b1cdbd2cSJim Jagielski String sInputPath = _aParams.getInputPath(); 351*b1cdbd2cSJim Jagielski if (sInputPath.toLowerCase().endsWith("index.ini")) 352*b1cdbd2cSJim Jagielski { 353*b1cdbd2cSJim Jagielski // special case 354*b1cdbd2cSJim Jagielski // we want to get the buildid from the info file. 355*b1cdbd2cSJim Jagielski } 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski compareJPEG(_sDocumentName, sResultFilename, _aParams); 358*b1cdbd2cSJim Jagielski 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski else 361*b1cdbd2cSJim Jagielski { 362*b1cdbd2cSJim Jagielski String sResultFilenamePDF = util.utils.replaceAll13(sResultFilename, ".ps_", ".pdf_"); 363*b1cdbd2cSJim Jagielski File aResultPDFFile = new File(sResultFilenamePDF); 364*b1cdbd2cSJim Jagielski if (aResultPDFFile.exists()) 365*b1cdbd2cSJim Jagielski { 366*b1cdbd2cSJim Jagielski // Original and Result exists 367*b1cdbd2cSJim Jagielski String sInputPath = _aParams.getInputPath(); 368*b1cdbd2cSJim Jagielski if (sInputPath.toLowerCase().endsWith("index.ini")) 369*b1cdbd2cSJim Jagielski { 370*b1cdbd2cSJim Jagielski // special case 371*b1cdbd2cSJim Jagielski // we want to get the buildid from the info file. 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski compareJPEG(_sDocumentName, sResultFilenamePDF, _aParams); 375*b1cdbd2cSJim Jagielski } 376*b1cdbd2cSJim Jagielski else 377*b1cdbd2cSJim Jagielski { 378*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Warning: Result JPEG doesn't exists '" + sResultFilename + "'"); 379*b1cdbd2cSJim Jagielski } 380*b1cdbd2cSJim Jagielski } 381*b1cdbd2cSJim Jagielski } 382*b1cdbd2cSJim Jagielski else 383*b1cdbd2cSJim Jagielski { 384*b1cdbd2cSJim Jagielski // result is also a file 385*b1cdbd2cSJim Jagielski if (aResultFile.exists()) 386*b1cdbd2cSJim Jagielski { 387*b1cdbd2cSJim Jagielski compareJPEG(_sDocumentName, _sResult, _aParams); 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski else 390*b1cdbd2cSJim Jagielski { 391*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Warning: Result JPEG doesn't exists '" + _sResult + "'"); 392*b1cdbd2cSJim Jagielski } 393*b1cdbd2cSJim Jagielski } 394*b1cdbd2cSJim Jagielski } 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski /** 397*b1cdbd2cSJim Jagielski * compare 2 JPEGs, it is a need, that both _sDocumentName and _sResultFilename exist. 398*b1cdbd2cSJim Jagielski * @param _sDocumentName 399*b1cdbd2cSJim Jagielski * @param _sResult 400*b1cdbd2cSJim Jagielski * @param _aParams 401*b1cdbd2cSJim Jagielski */ compareJPEG(String _sDocumentName, String _sResult, ParameterHelper _aParams)402*b1cdbd2cSJim Jagielski private void compareJPEG(String _sDocumentName, String _sResult, ParameterHelper _aParams) 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski NameDPIPage aNameDPIPage = NameDPIPage.interpret(_sDocumentName); 405*b1cdbd2cSJim Jagielski 406*b1cdbd2cSJim Jagielski String sSourceBasename = FileHelper.getBasename(_sDocumentName); 407*b1cdbd2cSJim Jagielski String sSourcePath = FileHelper.getPath(_sDocumentName); 408*b1cdbd2cSJim Jagielski String sDestinationBasename = FileHelper.getBasename(_sResult); 409*b1cdbd2cSJim Jagielski String sDestinationPath = FileHelper.getPath(_sResult); 410*b1cdbd2cSJim Jagielski 411*b1cdbd2cSJim Jagielski if (!sSourcePath.equals(sDestinationPath)) 412*b1cdbd2cSJim Jagielski { 413*b1cdbd2cSJim Jagielski // we want to have all in one Directory, Original, Reference and the Difference result. 414*b1cdbd2cSJim Jagielski // copy the original file to the reference path 415*b1cdbd2cSJim Jagielski String sNewSourceBasename = "Original_" + sSourceBasename; 416*b1cdbd2cSJim Jagielski // String sSource = FileHelper.appendPath(sSourcePath, sSourceBasename); 417*b1cdbd2cSJim Jagielski String sSource = _sDocumentName; 418*b1cdbd2cSJim Jagielski String sDestination = FileHelper.appendPath(sDestinationPath, sNewSourceBasename); 419*b1cdbd2cSJim Jagielski FileHelper.copy(sSource, sDestination); 420*b1cdbd2cSJim Jagielski sSourceBasename = sNewSourceBasename; 421*b1cdbd2cSJim Jagielski // 422*b1cdbd2cSJim Jagielski JPEGCreator.convertToNearSameFileWithWidth340(sDestination); 423*b1cdbd2cSJim Jagielski } 424*b1cdbd2cSJim Jagielski String sDifferenceBasename = "Difference_between_" + FileHelper.getNameNoSuffix(sSourceBasename) + "_and_" + FileHelper.getNameNoSuffix(sDestinationBasename) + ".jpg"; 425*b1cdbd2cSJim Jagielski // String sDifferencePath = sDestinationPath; 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski String sSource = FileHelper.appendPath(sDestinationPath, sSourceBasename); 428*b1cdbd2cSJim Jagielski String sDestination = FileHelper.appendPath(sDestinationPath, sDestinationBasename); 429*b1cdbd2cSJim Jagielski String sDifference = FileHelper.appendPath(sDestinationPath, sDifferenceBasename); 430*b1cdbd2cSJim Jagielski int nErr = compareJPEG(sSource, sDestination, sDifference); 431*b1cdbd2cSJim Jagielski if (nErr == 0 && FileHelper.exists(sDifference)) 432*b1cdbd2cSJim Jagielski { 433*b1cdbd2cSJim Jagielski // check the difference, returns the count of different colors 434*b1cdbd2cSJim Jagielski // this means, 1=only one color, no differences found. 435*b1cdbd2cSJim Jagielski int nResult = identify(sDifference); 436*b1cdbd2cSJim Jagielski int nPercentColorDiffer = 0; 437*b1cdbd2cSJim Jagielski 438*b1cdbd2cSJim Jagielski String sResult = "YES"; 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski if (m_aTolerance != null) 441*b1cdbd2cSJim Jagielski { 442*b1cdbd2cSJim Jagielski final int nAcceptedTolerance = m_aTolerance.getAccept(); 443*b1cdbd2cSJim Jagielski if (nResult <= nAcceptedTolerance) 444*b1cdbd2cSJim Jagielski { 445*b1cdbd2cSJim Jagielski nResult = 1; 446*b1cdbd2cSJim Jagielski sResult = "IN TOLERANCE"; 447*b1cdbd2cSJim Jagielski GlobalLogWriter.println("The differences are in tolerance."); 448*b1cdbd2cSJim Jagielski 449*b1cdbd2cSJim Jagielski } 450*b1cdbd2cSJim Jagielski } 451*b1cdbd2cSJim Jagielski if (nResult != 1) 452*b1cdbd2cSJim Jagielski { 453*b1cdbd2cSJim Jagielski sResult = "NO"; 454*b1cdbd2cSJim Jagielski try 455*b1cdbd2cSJim Jagielski { 456*b1cdbd2cSJim Jagielski nPercentColorDiffer = estimateGfx(sSource, sDestination, sDifference); 457*b1cdbd2cSJim Jagielski } 458*b1cdbd2cSJim Jagielski catch (java.io.IOException e) 459*b1cdbd2cSJim Jagielski { 460*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Can't estimate the different colors. " + e.getMessage()); 461*b1cdbd2cSJim Jagielski } 462*b1cdbd2cSJim Jagielski } 463*b1cdbd2cSJim Jagielski 464*b1cdbd2cSJim Jagielski // store the result in a result.ini file 465*b1cdbd2cSJim Jagielski String sResultFile = FileHelper.appendPath(sDestinationPath, aNameDPIPage.Name + ".ini"); 466*b1cdbd2cSJim Jagielski int nPage = aNameDPIPage.Page; 467*b1cdbd2cSJim Jagielski if (nPage < 0) 468*b1cdbd2cSJim Jagielski { 469*b1cdbd2cSJim Jagielski nPage = 0; 470*b1cdbd2cSJim Jagielski } 471*b1cdbd2cSJim Jagielski IniFile aResultIni = new IniFile(sResultFile); 472*b1cdbd2cSJim Jagielski 473*b1cdbd2cSJim Jagielski String[] aComment = 474*b1cdbd2cSJim Jagielski { 475*b1cdbd2cSJim Jagielski "; This file is automatically created by a graphical.JPEGComparator run", 476*b1cdbd2cSJim Jagielski "; ", 477*b1cdbd2cSJim Jagielski "; If you see this file in a browser you may have forgotten to set the follows in the property file", 478*b1cdbd2cSJim Jagielski "; " + PropertyName.DOC_COMPARATOR_HTML_OUTPUT_PREFIX + "=http://<computer>/gfxcmp_ui/cw.php?inifile=", 479*b1cdbd2cSJim Jagielski "; Please check the documentation if you got confused.", 480*b1cdbd2cSJim Jagielski "; ", 481*b1cdbd2cSJim Jagielski "; " 482*b1cdbd2cSJim Jagielski }; 483*b1cdbd2cSJim Jagielski aResultIni.insertFirstComment(aComment); 484*b1cdbd2cSJim Jagielski 485*b1cdbd2cSJim Jagielski // write down the global flags 486*b1cdbd2cSJim Jagielski int nMaxPage = Math.max(nPage, aResultIni.getIntValue("global", "pages", 0)); 487*b1cdbd2cSJim Jagielski aResultIni.insertValue("global", "pages", nMaxPage); 488*b1cdbd2cSJim Jagielski 489*b1cdbd2cSJim Jagielski // INIoutput.writeValue("buildid", _sBuildID); 490*b1cdbd2cSJim Jagielski // INIoutput.writeValue("refbuildid", _sRefBuildID); 491*b1cdbd2cSJim Jagielski String sRefBuildId = (String) _aParams.getTestParameters().get("RefBuildId"); 492*b1cdbd2cSJim Jagielski if (sRefBuildId == null) 493*b1cdbd2cSJim Jagielski { 494*b1cdbd2cSJim Jagielski sRefBuildId = ""; 495*b1cdbd2cSJim Jagielski } 496*b1cdbd2cSJim Jagielski aResultIni.insertValue("global", "refbuildid", sRefBuildId); 497*b1cdbd2cSJim Jagielski 498*b1cdbd2cSJim Jagielski aResultIni.insertValue("global", "diffdiff", "no"); 499*b1cdbd2cSJim Jagielski aResultIni.insertValue("global", "basename", aNameDPIPage.Name); 500*b1cdbd2cSJim Jagielski aResultIni.insertValue("global", "dpi", aNameDPIPage.DPI); 501*b1cdbd2cSJim Jagielski 502*b1cdbd2cSJim Jagielski // write down flags for each page 503*b1cdbd2cSJim Jagielski String sSection = "page" + String.valueOf(nPage); 504*b1cdbd2cSJim Jagielski 505*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "oldgfx", sSource); 506*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "newgfx", sDestination); 507*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "diffgfx", sDifference); 508*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "percent", nPercentColorDiffer); 509*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "BM", "false"); 510*b1cdbd2cSJim Jagielski aResultIni.insertValue(sSection, "result", sResult); 511*b1cdbd2cSJim Jagielski 512*b1cdbd2cSJim Jagielski aResultIni.close(); 513*b1cdbd2cSJim Jagielski } 514*b1cdbd2cSJim Jagielski } 515*b1cdbd2cSJim Jagielski 516*b1cdbd2cSJim Jagielski // // This creates a status for exact on document 517*b1cdbd2cSJim Jagielski // static boolean createINIStatus(StatusHelper[] aList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID, String _sRefBuildID) 518*b1cdbd2cSJim Jagielski // { 519*b1cdbd2cSJim Jagielski // // Status 520*b1cdbd2cSJim Jagielski // String fs = System.getProperty("file.separator"); 521*b1cdbd2cSJim Jagielski // String sBasename = FileHelper.getBasename(_sAbsoluteInputFile); 522*b1cdbd2cSJim Jagielski // String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename); 523*b1cdbd2cSJim Jagielski //// String sHTMLFile = _sFilenamePrefix + sNameNoSuffix + ".html"; 524*b1cdbd2cSJim Jagielski //// HTMLOutputter HTMLoutput = HTMLOutputter.create(_sOutputPath, sHTMLFile, "", ""); 525*b1cdbd2cSJim Jagielski //// HTMLoutput.header(sNameNoSuffix); 526*b1cdbd2cSJim Jagielski //// TODO: version info was fine 527*b1cdbd2cSJim Jagielski //// HTMLoutput.checkSection(sBasename); 528*b1cdbd2cSJim Jagielski // // Status end 529*b1cdbd2cSJim Jagielski // 530*b1cdbd2cSJim Jagielski // String sINIFile = _sFilenamePrefix + sNameNoSuffix + ".ini"; 531*b1cdbd2cSJim Jagielski // INIOutputter INIoutput = INIOutputter.create(_sOutputPath, sINIFile, "", ""); 532*b1cdbd2cSJim Jagielski // INIoutput.createHeader(); 533*b1cdbd2cSJim Jagielski //// TODO: version info was fine 534*b1cdbd2cSJim Jagielski // 535*b1cdbd2cSJim Jagielski // INIoutput.writeSection("global"); 536*b1cdbd2cSJim Jagielski // INIoutput.writeValue("pages", String.valueOf(aList.length)); 537*b1cdbd2cSJim Jagielski // INIoutput.writeValue("buildid", _sBuildID); 538*b1cdbd2cSJim Jagielski // INIoutput.writeValue("refbuildid", _sRefBuildID); 539*b1cdbd2cSJim Jagielski // INIoutput.writeValue("diffdiff", "no"); 540*b1cdbd2cSJim Jagielski // INIoutput.writeValue("basename", sBasename); 541*b1cdbd2cSJim Jagielski // 542*b1cdbd2cSJim Jagielski // boolean bResultIsOk = true; // result over all pages 543*b1cdbd2cSJim Jagielski // for (int i=0;i<aList.length; i++) 544*b1cdbd2cSJim Jagielski // { 545*b1cdbd2cSJim Jagielski // INIoutput.writeSection("page" + String.valueOf(i + 1)); // list start at point 0, but this is page 1 and so on... current_page = (i + 1) 546*b1cdbd2cSJim Jagielski // aList[i].printStatus(); 547*b1cdbd2cSJim Jagielski // 548*b1cdbd2cSJim Jagielski // boolean bCurrentResult = true; // result over exact one page 549*b1cdbd2cSJim Jagielski // 550*b1cdbd2cSJim Jagielski // int nCurrentDiffStatus = aList[i].nDiffStatus; 551*b1cdbd2cSJim Jagielski // 552*b1cdbd2cSJim Jagielski // // check if the status is in a defined range 553*b1cdbd2cSJim Jagielski // if (nCurrentDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES) 554*b1cdbd2cSJim Jagielski // { 555*b1cdbd2cSJim Jagielski // // ok. 556*b1cdbd2cSJim Jagielski // } 557*b1cdbd2cSJim Jagielski // else if (nCurrentDiffStatus == StatusHelper.DIFF_DIFFERENCES_FOUND && aList[i].nPercent < 5) 558*b1cdbd2cSJim Jagielski // { 559*b1cdbd2cSJim Jagielski // // ok. 560*b1cdbd2cSJim Jagielski // } 561*b1cdbd2cSJim Jagielski // else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_NO_PROBLEMS) 562*b1cdbd2cSJim Jagielski // { 563*b1cdbd2cSJim Jagielski // // ok. 564*b1cdbd2cSJim Jagielski // } 565*b1cdbd2cSJim Jagielski // else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_DIFFERENCES_FOUND && aList[i].nPercent2 < 5) 566*b1cdbd2cSJim Jagielski // { 567*b1cdbd2cSJim Jagielski // // ok. 568*b1cdbd2cSJim Jagielski // } 569*b1cdbd2cSJim Jagielski // else 570*b1cdbd2cSJim Jagielski // { 571*b1cdbd2cSJim Jagielski // // failed. 572*b1cdbd2cSJim Jagielski // bCurrentResult = false; // logic: nDiff==0 = true if there is no difference 573*b1cdbd2cSJim Jagielski // } 574*b1cdbd2cSJim Jagielski // 575*b1cdbd2cSJim Jagielski // // Status 576*b1cdbd2cSJim Jagielski //// HTMLoutput.checkLine(aList[i], bCurrentResult); 577*b1cdbd2cSJim Jagielski // INIoutput.checkLine(aList[i], bCurrentResult); 578*b1cdbd2cSJim Jagielski // bResultIsOk &= bCurrentResult; 579*b1cdbd2cSJim Jagielski // } 580*b1cdbd2cSJim Jagielski // // Status 581*b1cdbd2cSJim Jagielski //// HTMLoutput.close(); 582*b1cdbd2cSJim Jagielski // INIoutput.close(); 583*b1cdbd2cSJim Jagielski // return bResultIsOk; 584*b1cdbd2cSJim Jagielski // } 585*b1cdbd2cSJim Jagielski /** 586*b1cdbd2cSJim Jagielski * count how much pixel differ and between Old or New and the Difference graphics 587*b1cdbd2cSJim Jagielski * 588*b1cdbd2cSJim Jagielski * First, count the old graphics, then the new graphics due to the fact both should be equal 589*b1cdbd2cSJim Jagielski * it should be legal to take result from old or new. We take the graphics with less values. 590*b1cdbd2cSJim Jagielski * 591*b1cdbd2cSJim Jagielski * Second, count the difference graphics, now take the percent algorithm and 592*b1cdbd2cSJim Jagielski * build a percent value, which contain the number of different pixels as a percent value 593*b1cdbd2cSJim Jagielski * 594*b1cdbd2cSJim Jagielski * Interpretation: 595*b1cdbd2cSJim Jagielski * 0% there is no difference 596*b1cdbd2cSJim Jagielski * 597*b1cdbd2cSJim Jagielski * <100% Take a look into the difference graphics, maybe the difference graphics shows 598*b1cdbd2cSJim Jagielski * text like outlined or the text is little bit move left, right up or down. 599*b1cdbd2cSJim Jagielski * 600*b1cdbd2cSJim Jagielski * >>100% Yes it's possible that there is a difference more then 100%, maybe a font problem 601*b1cdbd2cSJim Jagielski * between old and new graphics. The font of the new graphics is little bit bigger, 602*b1cdbd2cSJim Jagielski * so the pixel count between old graphics and new graphics is twice the more. 603*b1cdbd2cSJim Jagielski * 604*b1cdbd2cSJim Jagielski * @param _sOldGfx path & name to the jpeg file (1) 605*b1cdbd2cSJim Jagielski * @param _sNewGfx path & name to the other jpeg file (2) 606*b1cdbd2cSJim Jagielski * @param _sDiffGfx path & name to the new difference file which shows the difference between (1) and (2) 607*b1cdbd2cSJim Jagielski * @return the count of different pixels 608*b1cdbd2cSJim Jagielski * @throws java.io.IOException if file access is not possible 609*b1cdbd2cSJim Jagielski */ estimateGfx(String _sOldGfx, String _sNewGfx, String _sDiffGfx)610*b1cdbd2cSJim Jagielski public static int estimateGfx(String _sOldGfx, String _sNewGfx, String _sDiffGfx) 611*b1cdbd2cSJim Jagielski throws java.io.IOException 612*b1cdbd2cSJim Jagielski { 613*b1cdbd2cSJim Jagielski TimeHelper a = new TimeHelper(); 614*b1cdbd2cSJim Jagielski a.start(); 615*b1cdbd2cSJim Jagielski // Count Pixels 616*b1cdbd2cSJim Jagielski final int nNotWhiteCount_OldGraphic = PixelCounter.countNotWhitePixelsFromImage(_sOldGfx); 617*b1cdbd2cSJim Jagielski final int nNotWhiteCount_NewGraphic = PixelCounter.countNotWhitePixelsFromImage(_sNewGfx); 618*b1cdbd2cSJim Jagielski final int nNotBlackCount_DiffGraphic = PixelCounter.countNotBlackPixelsFromImage(_sDiffGfx); 619*b1cdbd2cSJim Jagielski 620*b1cdbd2cSJim Jagielski // Count Pixels in different threads 621*b1cdbd2cSJim Jagielski // CountNotWhitePixelsFromImage t1 = new CountNotWhitePixelsFromImage(_sOldGfx); 622*b1cdbd2cSJim Jagielski // CountNotWhitePixelsFromImage t2 = new CountNotWhitePixelsFromImage(_sNewGfx); 623*b1cdbd2cSJim Jagielski // CountNotBlackPixelsFromImage t3 = new CountNotBlackPixelsFromImage(_sDiffGfx); 624*b1cdbd2cSJim Jagielski // t1.start(); 625*b1cdbd2cSJim Jagielski // t2.start(); 626*b1cdbd2cSJim Jagielski // t3.start(); 627*b1cdbd2cSJim Jagielski // try 628*b1cdbd2cSJim Jagielski // { 629*b1cdbd2cSJim Jagielski // t1.join(); 630*b1cdbd2cSJim Jagielski // } 631*b1cdbd2cSJim Jagielski // catch (InterruptedException ex) 632*b1cdbd2cSJim Jagielski // { 633*b1cdbd2cSJim Jagielski // GlobalLogWriter.get().println("Thread 1 failed: " + ex.getMessage()); 634*b1cdbd2cSJim Jagielski // } 635*b1cdbd2cSJim Jagielski // try 636*b1cdbd2cSJim Jagielski // { 637*b1cdbd2cSJim Jagielski // t2.join(); 638*b1cdbd2cSJim Jagielski // } 639*b1cdbd2cSJim Jagielski // catch (InterruptedException ex) 640*b1cdbd2cSJim Jagielski // { 641*b1cdbd2cSJim Jagielski // GlobalLogWriter.get().println("Thread 2 failed: " + ex.getMessage()); 642*b1cdbd2cSJim Jagielski // } 643*b1cdbd2cSJim Jagielski // try 644*b1cdbd2cSJim Jagielski // { 645*b1cdbd2cSJim Jagielski // t3.join(); 646*b1cdbd2cSJim Jagielski // } 647*b1cdbd2cSJim Jagielski // catch (InterruptedException ex) 648*b1cdbd2cSJim Jagielski // { 649*b1cdbd2cSJim Jagielski // GlobalLogWriter.get().println("Thread 3 failed: " + ex.getMessage()); 650*b1cdbd2cSJim Jagielski // } 651*b1cdbd2cSJim Jagielski // final int nNotWhiteCount_OldGraphic = t1.getValue(); 652*b1cdbd2cSJim Jagielski // final int nNotWhiteCount_NewGraphic = t2.getValue(); 653*b1cdbd2cSJim Jagielski // final int nNotBlackCount_DiffGraphic = t3.getValue(); 654*b1cdbd2cSJim Jagielski 655*b1cdbd2cSJim Jagielski a.stop(); 656*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Thread Time is: " + a.getTime()); 657*b1cdbd2cSJim Jagielski 658*b1cdbd2cSJim Jagielski int nMinNotWhiteCount = Math.min(nNotWhiteCount_NewGraphic, nNotWhiteCount_OldGraphic); 659*b1cdbd2cSJim Jagielski 660*b1cdbd2cSJim Jagielski // check if not zero 661*b1cdbd2cSJim Jagielski if (nMinNotWhiteCount == 0) 662*b1cdbd2cSJim Jagielski { 663*b1cdbd2cSJim Jagielski nMinNotWhiteCount = Math.max(nNotWhiteCount_NewGraphic, nNotWhiteCount_OldGraphic); 664*b1cdbd2cSJim Jagielski if (nMinNotWhiteCount == 0) 665*b1cdbd2cSJim Jagielski { 666*b1cdbd2cSJim Jagielski nMinNotWhiteCount = 1; 667*b1cdbd2cSJim Jagielski } 668*b1cdbd2cSJim Jagielski } 669*b1cdbd2cSJim Jagielski 670*b1cdbd2cSJim Jagielski int nPercent = Math.abs(nNotBlackCount_DiffGraphic * 100 / nMinNotWhiteCount); 671*b1cdbd2cSJim Jagielski GlobalLogWriter.println("Graphics check, pixel based:" + String.valueOf(nPercent) + "% pixel differ "); 672*b1cdbd2cSJim Jagielski return nPercent; 673*b1cdbd2cSJim Jagielski } 674*b1cdbd2cSJim Jagielski compareJPEG(String _sOldGfx, String _sNewGfx, String _sDiffGfx)675*b1cdbd2cSJim Jagielski private static int compareJPEG(String _sOldGfx, String _sNewGfx, String _sDiffGfx) 676*b1cdbd2cSJim Jagielski { 677*b1cdbd2cSJim Jagielski String sComposite = "composite"; 678*b1cdbd2cSJim Jagielski if (OSHelper.isWindows()) 679*b1cdbd2cSJim Jagielski { 680*b1cdbd2cSJim Jagielski sComposite = "composite.exe"; 681*b1cdbd2cSJim Jagielski String sIMPath = (String) param.get("imagemagick.path"); 682*b1cdbd2cSJim Jagielski if (sIMPath != null) 683*b1cdbd2cSJim Jagielski { 684*b1cdbd2cSJim Jagielski sComposite = FileHelper.appendPath(sIMPath, sComposite); 685*b1cdbd2cSJim Jagielski } 686*b1cdbd2cSJim Jagielski } 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielski // String sCommand = sComposite + " -compose difference " + 689*b1cdbd2cSJim Jagielski // StringHelper.doubleQuoteIfNeed(_sOldGfx) + " " + 690*b1cdbd2cSJim Jagielski // StringHelper.doubleQuoteIfNeed(_sNewGfx) + " " + 691*b1cdbd2cSJim Jagielski // StringHelper.doubleQuoteIfNeed(_sDiffGfx); 692*b1cdbd2cSJim Jagielski 693*b1cdbd2cSJim Jagielski String[] sCommandArray = 694*b1cdbd2cSJim Jagielski { 695*b1cdbd2cSJim Jagielski sComposite, 696*b1cdbd2cSJim Jagielski "-compose", 697*b1cdbd2cSJim Jagielski "difference", 698*b1cdbd2cSJim Jagielski _sOldGfx, 699*b1cdbd2cSJim Jagielski _sNewGfx, 700*b1cdbd2cSJim Jagielski _sDiffGfx 701*b1cdbd2cSJim Jagielski }; 702*b1cdbd2cSJim Jagielski 703*b1cdbd2cSJim Jagielski ProcessHandler aHandler = new ProcessHandler(sCommandArray); 704*b1cdbd2cSJim Jagielski boolean bBackValue = aHandler.executeSynchronously(); 705*b1cdbd2cSJim Jagielski int nExitCode = aHandler.getExitCode(); 706*b1cdbd2cSJim Jagielski if (nExitCode != 0) 707*b1cdbd2cSJim Jagielski { 708*b1cdbd2cSJim Jagielski GlobalLogWriter.println("'" + sComposite + "' return with "); 709*b1cdbd2cSJim Jagielski String sBack = aHandler.getOutputText(); 710*b1cdbd2cSJim Jagielski GlobalLogWriter.println("'" + sBack + "'"); 711*b1cdbd2cSJim Jagielski } 712*b1cdbd2cSJim Jagielski else 713*b1cdbd2cSJim Jagielski { 714*b1cdbd2cSJim Jagielski // creates an extra smaller difference picture 715*b1cdbd2cSJim Jagielski File aDiffFile = new File(_sDiffGfx); 716*b1cdbd2cSJim Jagielski if (aDiffFile.exists()) 717*b1cdbd2cSJim Jagielski { 718*b1cdbd2cSJim Jagielski JPEGCreator.convertToNearSameFileWithWidth340(_sDiffGfx); 719*b1cdbd2cSJim Jagielski } 720*b1cdbd2cSJim Jagielski } 721*b1cdbd2cSJim Jagielski return nExitCode; 722*b1cdbd2cSJim Jagielski } 723*b1cdbd2cSJim Jagielski 724*b1cdbd2cSJim Jagielski /** 725*b1cdbd2cSJim Jagielski * wrapper for ImageMagick identify, 726*b1cdbd2cSJim Jagielski * function checks how many different colors a picture contains. 727*b1cdbd2cSJim Jagielski * if it's only one color (nResult==1), like background color, there is no difference. 728*b1cdbd2cSJim Jagielski */ identify(String _sDiffGfx)729*b1cdbd2cSJim Jagielski int identify(String _sDiffGfx) 730*b1cdbd2cSJim Jagielski { 731*b1cdbd2cSJim Jagielski int nResult = 0; 732*b1cdbd2cSJim Jagielski // would like to know what the meaning of %k is for ImageMagick's 'identify' 733*b1cdbd2cSJim Jagielski String sIM_Format = "%k"; 734*b1cdbd2cSJim Jagielski // if (OSHelper.isWindows()) 735*b1cdbd2cSJim Jagielski // { 736*b1cdbd2cSJim Jagielski // sIM_Format = "%%k"; 737*b1cdbd2cSJim Jagielski // } 738*b1cdbd2cSJim Jagielski 739*b1cdbd2cSJim Jagielski String sIdentify = "identify"; 740*b1cdbd2cSJim Jagielski if (OSHelper.isWindows()) 741*b1cdbd2cSJim Jagielski { 742*b1cdbd2cSJim Jagielski sIdentify = "identify.exe"; 743*b1cdbd2cSJim Jagielski String sIMPath = (String) param.get("imagemagick.path"); 744*b1cdbd2cSJim Jagielski if (sIMPath != null) 745*b1cdbd2cSJim Jagielski { 746*b1cdbd2cSJim Jagielski sIdentify = FileHelper.appendPath(sIMPath, sIdentify); 747*b1cdbd2cSJim Jagielski } 748*b1cdbd2cSJim Jagielski } 749*b1cdbd2cSJim Jagielski 750*b1cdbd2cSJim Jagielski // String sCommand = sIdentify + " " + sIM_Format + " " + StringHelper.doubleQuoteIfNeed(_sDiffGfx); 751*b1cdbd2cSJim Jagielski 752*b1cdbd2cSJim Jagielski String[] sCommandArray = 753*b1cdbd2cSJim Jagielski { 754*b1cdbd2cSJim Jagielski sIdentify, 755*b1cdbd2cSJim Jagielski "-format", 756*b1cdbd2cSJim Jagielski sIM_Format, 757*b1cdbd2cSJim Jagielski _sDiffGfx 758*b1cdbd2cSJim Jagielski }; 759*b1cdbd2cSJim Jagielski ProcessHandler aHandler = new ProcessHandler(sCommandArray); 760*b1cdbd2cSJim Jagielski boolean bBackValue = aHandler.executeSynchronously(); 761*b1cdbd2cSJim Jagielski int nExitCode = aHandler.getExitCode(); 762*b1cdbd2cSJim Jagielski 763*b1cdbd2cSJim Jagielski String sBack = aHandler.getOutputText(); 764*b1cdbd2cSJim Jagielski GlobalLogWriter.println("'" + sBack + "'"); 765*b1cdbd2cSJim Jagielski 766*b1cdbd2cSJim Jagielski // try to interpret the result, which we get as a String 767*b1cdbd2cSJim Jagielski try 768*b1cdbd2cSJim Jagielski { 769*b1cdbd2cSJim Jagielski int nIdx = sBack.indexOf("\n"); 770*b1cdbd2cSJim Jagielski if (nIdx > 0) 771*b1cdbd2cSJim Jagielski { 772*b1cdbd2cSJim Jagielski sBack = sBack.substring(0, nIdx); 773*b1cdbd2cSJim Jagielski } 774*b1cdbd2cSJim Jagielski 775*b1cdbd2cSJim Jagielski nResult = Integer.valueOf(sBack).intValue(); 776*b1cdbd2cSJim Jagielski } 777*b1cdbd2cSJim Jagielski catch (java.lang.NumberFormatException e) 778*b1cdbd2cSJim Jagielski { 779*b1cdbd2cSJim Jagielski GlobalLogWriter.println("identify(): Number format exception"); 780*b1cdbd2cSJim Jagielski nResult = 0; 781*b1cdbd2cSJim Jagielski } 782*b1cdbd2cSJim Jagielski return nResult; 783*b1cdbd2cSJim Jagielski } 784*b1cdbd2cSJim Jagielski // public static void main(String [] _args) 785*b1cdbd2cSJim Jagielski // { 786*b1cdbd2cSJim Jagielski //// give an index.ini file, ok 787*b1cdbd2cSJim Jagielski //// give a directory, where exist jpeg files ok 788*b1cdbd2cSJim Jagielski //// inputpath (given file) doesn't exists 789*b1cdbd2cSJim Jagielski //// give a jpeg file. 790*b1cdbd2cSJim Jagielski // 791*b1cdbd2cSJim Jagielski // String args[] = { 792*b1cdbd2cSJim Jagielski // "-TimeOut", "3600000", 793*b1cdbd2cSJim Jagielski // "-tb", "java_complex", 794*b1cdbd2cSJim Jagielski // "-o", "graphical.JPEGComparator", 795*b1cdbd2cSJim Jagielski // "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\index.ini", 796*b1cdbd2cSJim Jagielski // "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output2", 797*b1cdbd2cSJim Jagielski //// "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\GroupReport.odt.pdf_180DPI_0001.jpg", 798*b1cdbd2cSJim Jagielski //// "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output2\\Report1.odt.pdf_180DPI_0001.jpg", 799*b1cdbd2cSJim Jagielski // "-DOC_COMPARATOR_HTML_OUTPUT_PREFIX", "http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/cw.php?inifile=", 800*b1cdbd2cSJim Jagielski //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "PDF", /* default: "OOo" */ 801*b1cdbd2cSJim Jagielski //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "msoffice", /* default: "OOo" */ 802*b1cdbd2cSJim Jagielski //// "-OFFICE_VIEWABLE", "false", 803*b1cdbd2cSJim Jagielski //// "-AppExecutionCommand", "\"C:/Programme/sun/staroffice 9/program/soffice.exe\" -norestore -nocrashreport -accept=pipe,name=ll93751;urp;", 804*b1cdbd2cSJim Jagielski // "-NoOffice" 805*b1cdbd2cSJim Jagielski // }; 806*b1cdbd2cSJim Jagielski // 807*b1cdbd2cSJim Jagielski // org.openoffice.Runner.main(args); 808*b1cdbd2cSJim Jagielski // } 809*b1cdbd2cSJim Jagielski } 810