2018 up to now | 2017 | 2016 | 2015 | 2014 | 2013 | 2012

Mailing List - Entries from 2018 up to now

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
h5
        {mso-style-priority:9;
        mso-style-link:"Heading 5 Char";
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:10.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        mso-fareast-language:RU;}
span.Heading5Char
        {mso-style-name:"Heading 5 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 5";
        font-family:"Cambria","serif";
        color:#243F60;
        mso-fareast-language:RU;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi all,
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Ivan thank you very much for your comments.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">  
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">But I have a problem with the implementation of your code:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">InternalError: java.lang. IllegalArgumentException: Argument cannot be null<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">In line:  image = iw.grabScreenshot(loc.x, loc.y, size.width, size.height)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">Can you help me understand this?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">My code:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from de.qfs.apps.qftest.shared.extensions.image import ImageRep, BaseImageHandler, ImageComparator<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from de.qfs.apps.qftest.shared.data.check import ImageCheckData<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from de.qfs.apps.qftest.extensions.checks import CheckerRegistry, Checker, DefaultCheckType, CheckDataType, CheckerHelper<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from de.qfs.lib.util import Pair<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from imagewrapper import ImageWrapper<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from javax.swing import SwingUtilities<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from java.awt import Point<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from java.awt.event import MouseEvent<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from java.awt import Toolkit<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">from java.lang import System<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import re<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import time<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import jarray<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import os<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import traceback<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">import sys<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"># Default checktype id<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">DEFAULT_ID = "GL_image"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">glImageCheckType = DefaultCheckType(<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    DEFAULT_ID,               # Identifier<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    CheckDataType.IMAGE,            # Data type<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    "GL Screenshot"       # Text for menu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"># Components which should use this Custom checker<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">targetcomps = [<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">"javax.media.opengl.awt.GLCanvas", # JOGL component<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">class GLImageChecker(Checker):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    def getSupportedCheckTypes(self, com, item):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">         return jarray.array([glImageCheckType], DefaultCheckType)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    def getCheckData(self, com, item, checkType):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        print "Start get image"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        id = checkType.getIdentifier()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        print "Going to check : " + id<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        size = com.getSize()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        if id == DEFAULT_ID:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            # parameters are no longer passed through but made available via the following method:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                   print "get params"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            params = CheckerHelper.instance().getCheckParameters()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            # params is now a Map<String,String><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                   print "get window ancestor"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            f = SwingUtilities.getWindowAncestor(com)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            f.setAlwaysOnTop(true)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            if params and params.containsKey("x") and params.containsKey("y"):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                print "\tCheck mode"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                # Replay mode (x and y are already set)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                x = int(params["x"])<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                y = int(params["y"])<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                f.setLocation(0, 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                doMouseMove(x, y, com)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                time.sleep(1)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            else:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                print "\tRecord mode"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                # Record mode (get and store custom x and y)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                # Determine current system cursor position relative to the component<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                p = com.getMousePosition()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                #x = p.x<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                #y = p.y<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">               x = 0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                y = 0
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                # As the current system cursor location can be != of software cursor location, simulate mouse move<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                doMouseMove(x, y, com)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                # Append the cursor information to the checktype id, separated with ';'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                id = "%s;x=%d;y=%d" % (glImageCheckType.getIdentifier(), x, y)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            # Grab the screenshot<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            iw = ImageWrapper(rc)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            loc = com.getLocationOnScreen()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                   print "Grab screenshot"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            image = iw.grabScreenshot(loc.x, loc.y, size.width, size.height)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                   print "set on top"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            f.setAlwaysOnTop(false)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">                   print "End get image"  
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            return ImageCheckData(id, image, -1, -1, -1, -1, -1, -1, False)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    def getCheckDataAndItem(self, com, item, checkType):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        data = self.getCheckData(com, item, checkType)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        if data is None:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            return None<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        return Pair(data, item)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"># Relative x,y values to component f<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"># Simulate mouse move using MouseEvent on EventQueue and force rendering update<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">def doMouseMove(x, y, comp):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    # Move cursor to stored x,y using EventQueue.dispatch as we are on AWT<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    q = Toolkit.getDefaultToolkit().getSystemEventQueue()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    evt = MouseEvent(comp,MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), 0, x, y, 0, false)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    q.dispatchEvent(evt)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">   # Force rendering update<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    doPaint(SwingUtilities.getWindowAncestor(comp))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">def doPaint(f):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    f.getRootPane().paintImmediately(f.getRootPane().getBounds())<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">   
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">def unregister():<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    try:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        print "Cleaning"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        i = 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        for s in targetcomps:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            resolvers.removeResolver("myCheckImage_" + str(i))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            CheckerRegistry.instance().unregisterChecker(s, glImageChecker)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">            i += 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        print "Clean done"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    except:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        print "Clean error"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        pass<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">def register():<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    global glImageChecker<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    unregister()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    glImageChecker = GLImageChecker()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    print "Registering GL Checker"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    i = 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    for s in targetcomps:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        CheckerRegistry.instance().registerChecker(s, glImageChecker)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">        i += 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">    print "Register done"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D">register()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:#17365D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#17365D">Vitaliy Unguryan</span></b><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Calibri","sans-serif";color:navy"><br>
</span></b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">Java Developer<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">Anaconda Workbench<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">LUXOFT UKRAINE<br>
Member of the IBS Group<br>
</span></i><span lang="EN-US" style="font-size:7.5pt;font-family:"Arial","sans-serif";color:navy">E-mail:<a href="mailto:vunguryan@luxoft.com" title="mailto:vursatiy@luxoft.com">
<span style="font-family:"Calibri","sans-serif"">vunguryan@luxoft.com</span></a><br>
Tel: + 380 (48) 720-70-01 (ext. 3175)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:7.5pt;font-family:"Arial","sans-serif";color:navy">Cell: + 380 (93) 120-86-08<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> ivan.boelle@gmail.com [mailto:ivan.boelle@gmail.com]
<b>On Behalf Of </b>Ivan Boelle<br>
<b>Sent:</b> Thursday, August 16, 2012 6:59 PM<br>
<b>To:</b> Unguryan, Vitaliy<br>
<b>Cc:</b> qftest-list@qfs.de; Samokhin, Viktor (Viktor.Samokhin@harman.com)<br>
<b>Subject:</b> Re: [QF-Test] Creating QFTest for visual components based on openGL (JOGL)<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hello,<br>
<br>
We are using OpenGL too, there is (at least) 2 way of dealing with that:<br>
<br>
- Use a procedure to take the screenshot.<br>
In that procedure you can setup a script like this:<br>
<br>
comp = rc.getComponent("$(COMP)", timeout=-1, hidden=False)<br>
iw = ImageWrapper(rc)<br>
loc = comp.getLocationOnScreen()<br>
size = comp.getSize()<br>
print "\t\tScreenshoting: "+comp.getClass().getSimpleName()+" ("+str(loc.x)+","+ str(loc.y)+","+ str(size.width)+","+ str(size.height)+")"<br>
image = iw.grabScreenshot(loc.x, loc.y, size.width, size.height)<br>
iw.savePng("$(targetFile)", image)<br>
<br>
And then compare png images.<br>
<br>
- Add a custom check, with that when you will try to record a check on a GLComponent you will have a special option to make a "hard screenshot":<br>
Below is our script that add this "option".<br>
It might be more complicated than whet you need, feel free to remove parts :)<br>
(I'm using QFTest 3.3, there might be some changes to do to be compatible with more recent versions)<br>
<br>
Here are some discussions on this: <br>
<a href="http://www.qfs.de/archive/qftest-list/msg00035.html">http://www.qfs.de/archive/qftest-list/msg00035.html</a><br>
<br>
Also, you will probably need to use a "special" algorithm for image comparison.<br>
Indeed GL rendering is not always "consistent" from one run to another.<br>
<br>
from de.qfs.apps.qftest.extensions.checks import CheckerRegistry, Checker, DefaultCheckType, CheckDataType, CheckerHelper<br>
from de.qfs.apps.qftest.shared.extensions.image import ImageRep, BaseImageHandler, ImageComparator<br>
from de.qfs.apps.qftest.shared.data.check import ImageCheckData<br>
from de.qfs.lib.util import Pair<br>
from imagewrapper import ImageWrapper<br>
from javax.swing import SwingUtilities<br>
from java.awt import Point<br>
from java.awt.event import MouseEvent<br>
from java.awt import Toolkit<br>
from java.lang import System<br>
<br>
import re<br>
import time<br>
import jarray<br>
import os<br>
import traceback<br>
import sys<br>
<br>
# Default checktype id<br>
DEFAULT_ID = "GL_image"<br>
<br>
glImageCheckType = DefaultCheckType(<br>
    DEFAULT_ID,               # Identifier<br>
    CheckDataType.IMAGE,            # Data type<br>
    "GL Screenshot"       # Text for menu<br>
)<br>
<br>
# Components which should use this Custom checker<br>
targetcomps = [<br>
 "javax.media.opengl.GLCanvas", # JOGL component<br>
 ]<br>
<br>
# This custom checker provides 2 functionnalities:<br>
# - Hard screenshot<br>
#    As we have some OpenGL rendering, the classic screenshot (using Java2D) would be empty<br>
#    This checker does a "screenshot" at the location of the targeted component.<br>
#    This suppose the component is visible AND on top of ANY othe window<br>
#<br>
# - Mouse location handling<br>
#    As we have a software cursor drawn in some Canvas we need it to be correctly positionned when screenshoting<br>
#<br>
#    Recording:<br>
#    This checker retrieve the system cursor location when the "Screenshot" MenuItem is pressed<br>
#    Then it simulates a cursor move to this location and update display<br>
#    And finally it stores the x,y coordinates in the checktype parameters<br>
#    => ID;x=#;y=#<br>
#<br>
#    Replaying:<br>
#    This checker retrieve the x,y litterals in the checktype parameters and simulate the mouse move to this coordinates<br>
#<br>
class GLImageChecker(Checker):<br>
<br>
    def getSupportedCheckTypes(self, com, item):<br>
         return jarray.array([glImageCheckType], DefaultCheckType)<br>
<br>
    def getCheckData(self, com, item, checkType):<br>
        id = checkType.getIdentifier()<br>
        print "Going to check : "+id<br>
<br>
        size = com.getSize()<br>
<br>
        if id == DEFAULT_ID:<br>
            # parameters are no longer passed through but made available via the following method:<br>
            params = CheckerHelper.instance().getCheckParameters()<br>
            # params is now a Map<String,String><br>
            f = SwingUtilities.getWindowAncestor(com)<br>
            f.setAlwaysOnTop(true)<br>
<br>
            if params and params.containsKey("x") and params.containsKey("y"):<br>
                print "\tCheck mode"<br>
                # Replay mode (x and y are already set)<br>
                x = int(params["x"])<br>
                y = int(params["y"])<br>
<br>
                f.setLocation(0, 0)<br>
<br>
                doMouseMove(x, y, com)<br>
                time.sleep(1)<br>
            else:<br>
                print "\tRecord mode"<br>
                # Record mode (get and store custom x and y)<br>
<br>
                # Determine current system cursor position relative to the component<br>
                p = com.getMousePosition()<br>
                x = p.x<br>
                y = p.y<br>
<br>
                # As the current system cursor location can be != of software cursor location, simulate mouse move<br>
                doMouseMove(x, y, com)<br>
<br>
                # Append the cursor information to the checktype id, separated with ';'<br>
                id = "%s;x=%d;y=%d" % (glImageCheckType.getIdentifier(), x, y)<br>
<br>
            # Grab the screenshot<br>
            iw = ImageWrapper(rc)<br>
            loc = com.getLocationOnScreen()<br>
            image = iw.grabScreenshot(loc.x, loc.y, size.width, size.height)<br>
<br>
            f.setAlwaysOnTop(false)<br>
            return ImageCheckData(id, image, -1, -1, -1, -1, -1, -1, False)<br>
<br>
    def getCheckDataAndItem(self, com, item, checkType):<br>
        data = self.getCheckData(com, item, checkType)<br>
        if data is None:<br>
            return None<br>
        return Pair(data, item)<br>
<br>
<br>
# Relative x,y values to component f<br>
# Simulate mouse move using MouseEvent on EventQueue and force rendering update<br>
def doMouseMove(x, y, comp):<br>
    # Move cursor to stored x,y using EventQueue.dispatch as we are on AWT<br>
    q = Toolkit.getDefaultToolkit().getSystemEventQueue()<br>
    evt = MouseEvent(comp,MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), 0, x, y, 0, false)<br>
    q.dispatchEvent(evt)<br>
    # Force rendering update<br>
    doPaint(SwingUtilities.getWindowAncestor(comp))<br>
<br>
def doPaint(f):<br>
    f.getRootPane().paintImmediately(f.getRootPane().getBounds())<br>
<br>
def unregister():<br>
    try:<br>
        print "Cleaning"<br>
        i = 1<br>
        for s in targetcomps:<br>
            resolvers.removeResolver("myCheckImage_"+str(i))<br>
            CheckerRegistry.instance().unregisterChecker(s, glImageChecker)<br>
            i += 1<br>
        print "Clean done"<br>
    except:<br>
        pass<br>
<br>
def register():<br>
    global glImageChecker<br>
    unregister()<br>
    glImageChecker = GLImageChecker()<br>
    print "Registering"<br>
    i = 1<br>
    for s in targetcomps:<br>
        resolvers.addImageComparison("myCheckImage_"+str(i), compareImages, s)<br>
        CheckerRegistry.instance().registerChecker(s,glImageChecker)<br>
        i += 1<br>
    print "Register done"<br>
<br>
register()<br>
<br>
<br>
<br clear="all">
<o:p></o:p></p>
<pre><span style="color:#999999">---<br>Ivan Boelle<br>INT, Interactive Network Technologies</span><br><br><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
<br>
<br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal">On Thu, Aug 16, 2012 at 3:30 PM, Unguryan, Vitaliy <<a href="mailto:VUnguryan@luxoft.com" target="_blank">VUnguryan@luxoft.com</a>> wrote:<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">Hello everyone!</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<h5><span lang="EN-US" style="font-weight:normal">Our application uses component GLCanvas (javax.media.opengl.awt) and it is not possible to make a screenshot of this component using standard procedure.</span><o:p></o:p></h5>
<h5><span lang="EN-US" style="font-weight:normal">Could you please consult me on how to implement custom screenshot maker, if possible step by step or  example.</span><o:p></o:p></h5>
<h5><span lang="EN-US" style="font-size:9.0pt;font-family:"Segoe UI","sans-serif""> </span><o:p></o:p></h5>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="color:#1F497D">Best regards,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:10.0pt;color:#17365D">  
</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span lang="EN-US" style="color:#17365D">Vitaliy Unguryan</span></b><b><span lang="EN-US" style="font-size:10.0pt;color:navy"><br>
</span></b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">Java Developer</span></i><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">Anaconda Workbench</span></i><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:navy">LUXOFT UKRAINE<br>
Member of the IBS Group</span></i><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="3" width="100%" align="center">
</div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Arial","sans-serif";color:gray">This e-mail and any attachment(s) are intended only for the recipient(s) named above and others who have been specifically authorized to receive them. They may contain
 confidential information. If you are not the intended recipient, please do not read this email or its attachment(s). Furthermore, you are hereby notified that any dissemination, distribution or copying of this e-mail and any attachment(s) is strictly prohibited.
 If you have received this e-mail in error, please immediately notify the sender by replying to this e-mail and then delete this e-mail and any attachment(s) or copies thereof from your system. Thank you.</span><o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
qftest-list mailing list<br>
<a href="mailto:qftest-list@qfs.de">qftest-list@qfs.de</a><br>
<a href="http://www.qfs.de/mailman/listinfo/qftest-list" target="_blank">http://www.qfs.de/mailman/listinfo/qftest-list</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<br>
<hr>
<font face="Arial" color="Gray" size="1">This e-mail and any attachment(s) are intended only for the recipient(s) named above and others who have been specifically authorized to receive them. They may contain confidential information. If you are not the intended
 recipient, please do not read this email or its attachment(s). Furthermore, you are hereby notified that any dissemination, distribution or copying of this e-mail and any attachment(s) is strictly prohibited. If you have received this e-mail in error, please
 immediately notify the sender by replying to this e-mail and then delete this e-mail and any attachment(s) or copies thereof from your system. Thank you.<br>
</font>
</body>
</html>