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      * &lt;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      * &gt;>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