2018 bis heute | 2017 2016 2015 2014 | 2013 | 2012

Mailingliste - Einträge 2018 bis heute

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"><pre cols="72"><span style="color:rgb(153,153,153)">---<br>Ivan Boelle</span><br style="color:rgb(153,153,153)"><span style="color:rgb(153,153,153)"></span><span style="color:rgb(153,153,153)">INT, Interactive Network Technologies</span><br>
<br></pre><br><br><br>
<br><br><div class="gmail_quote">On Thu, Aug 16, 2012 at 3:30 PM, Unguryan, Vitaliy <span dir="ltr"><<a href="mailto:VUnguryan@luxoft.com" target="_blank">VUnguryan@luxoft.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">






<div link="blue" vlink="purple" lang="RU">
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"" lang="EN-US">Hello everyone!<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"" lang="EN-US"><u></u><u></u></span></p>
<h5><span style="color:windowtext;font-weight:normal" lang="EN-US">Our application uses component GLCanvas (javax.media.opengl.awt) and it is not possible to make a screenshot of this component using standard procedure.<u></u><u></u></span></h5>

<h5><span style="color:windowtext;font-weight:normal" lang="EN-US">Could you please consult me on how to implement custom screenshot maker, if possible step by step or example.<u></u><u></u></span></h5>
<h5><span style="font-size:9pt;font-family:"Segoe UI","sans-serif"" lang="EN-US"><u></u><u></u></span></h5>
<p class="MsoNormal"><span style="color:rgb(31,73,125)" lang="EN-US">Best regards,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:rgb(23,54,93)" lang="EN-US">
<u></u><u></u></span></p>
<p class="MsoNormal"><b><span style="color:rgb(23,54,93)" lang="EN-US">Vitaliy Unguryan</span></b><b><span style="font-size:10pt;color:navy" lang="EN-US"><br>
</span></b><i><span style="font-size:10pt;font-family:"Arial","sans-serif";color:navy" lang="EN-US">Java Developer<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="font-size:10pt;font-family:"Arial","sans-serif";color:navy" lang="EN-US">Anaconda Workbench<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="font-size:10pt;font-family:"Arial","sans-serif";color:navy" lang="EN-US">LUXOFT UKRAINE<br>
Member of the IBS Group<br>
<br>
</span></i><span style="font-size:7.5pt;font-family:"Arial","sans-serif";color:navy" lang="EN-US"><u></u><u></u></span></p>
<p class="MsoNormal"><u></u><u></u></p>
</div>
<br>
<hr>
<font color="Gray" face="Arial" 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>
</div>

<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><br>
<br></blockquote></div><br>