]> git.lizzy.rs Git - irrlicht.git/blob - tests/draw2DImage.cpp
Fix bug introduced in last merge from svn trunk
[irrlicht.git] / tests / draw2DImage.cpp
1 #include "testUtils.h"\r
2 \r
3 using namespace irr;\r
4 \r
5 namespace\r
6 {\r
7 \r
8 bool testWithRenderTarget(video::E_DRIVER_TYPE driverType)\r
9 {\r
10         // create device\r
11 \r
12         IrrlichtDevice *device = createDevice(driverType, core::dimension2d<u32>(160,120));\r
13 \r
14         if (device == 0)\r
15                 return true; // could not create selected driver.\r
16 \r
17         video::IVideoDriver* driver = device->getVideoDriver();\r
18 \r
19         if (!driver->queryFeature(video::EVDF_RENDER_TO_TARGET))\r
20         {\r
21                 device->closeDevice();\r
22                 device->run();\r
23                 device->drop();\r
24                 return true;\r
25         }\r
26 \r
27         stabilizeScreenBackground(driver);\r
28 \r
29         logTestString("Testing driver %ls\n", driver->getName());\r
30 \r
31         video::ITexture* renderTargetTex = driver->addRenderTargetTexture(core::dimension2d<u32>(64, 64), "BASEMAP");\r
32         video::ITexture* renderTargetDepth = driver->addRenderTargetTexture(core::dimension2d<u32>(64, 64), "rtd", video::ECF_D16);\r
33 \r
34         video::IRenderTarget* renderTarget = driver->addRenderTarget();\r
35         renderTarget->setTexture(renderTargetTex, renderTargetDepth);\r
36 \r
37         video::ITexture* tex=driver->getTexture("../media/water.jpg");\r
38 \r
39         driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,255,0,255));//Backbuffer background is pink\r
40 \r
41         //draw the 256x256 water image on the rendertarget:\r
42 \r
43 \r
44         driver->setRenderTargetEx(renderTarget,video::ECBF_COLOR|video::ECBF_DEPTH,video::SColor(255,0,0,255));//Rendertarget background is blue\r
45         driver->draw2DImage(tex, core::position2d<s32>(0,0), core::recti(0,0,32,32));\r
46         driver->setRenderTargetEx(0, 0);\r
47 \r
48         //draw the rendertarget on screen:\r
49         //this should normally draw a 64x64 image containing a 32x32 image in the top left corner\r
50         driver->draw2DImage(renderTargetTex, core::position2d<s32>(0,0));\r
51         driver->endScene();\r
52 \r
53         bool result = takeScreenshotAndCompareAgainstReference(driver, "-draw2DImageRTT.png");\r
54 \r
55         device->closeDevice();\r
56         device->run();\r
57         device->drop();\r
58 \r
59         return result;\r
60 }\r
61 \r
62 // Test various special destination rectangles\r
63 bool testRectangles(video::E_DRIVER_TYPE driverType)\r
64 {\r
65         // create device\r
66         IrrlichtDevice *device = createDevice(driverType, core::dimension2d<u32>(160,120));\r
67 \r
68         if (device == 0)\r
69                 return true; // could not create selected driver.\r
70 \r
71         video::IVideoDriver* driver = device->getVideoDriver();\r
72 \r
73         stabilizeScreenBackground(driver);\r
74 \r
75         logTestString("Testing driver %ls\n", driver->getName());\r
76 \r
77         video::ITexture *tex=driver->getTexture("../media/fireball.bmp");\r
78 \r
79         driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,255,0,255));//Backbuffer background is pink\r
80 \r
81         // draw normal, will be overdrwan in error case\r
82         driver->draw2DImage(tex, core::recti(68,32,132,96), core::recti(0,0,64,64));\r
83         //draw the image larger\r
84         driver->draw2DImage(tex, core::recti(0,0,64,64), core::recti(0,0,32,32));\r
85         //draw the image flipped horizontally\r
86         driver->draw2DImage(tex, core::recti(132,0,68,64), core::recti(0,0,64,64));\r
87         //draw the image smaller\r
88         driver->draw2DImage(tex, core::recti(0,64,32,96), core::recti(0,0,64,64));\r
89         //draw the image much smaller\r
90         driver->draw2DImage(tex, core::recti(36,64,44,72), core::recti(0,0,64,64));\r
91         //draw the image flipped horizontally\r
92         driver->draw2DImage(tex, core::recti(68,64,132,0), core::recti(0,0,64,64));\r
93         driver->endScene();\r
94 \r
95         bool result = takeScreenshotAndCompareAgainstReference(driver, "-draw2DImageRect.png");\r
96 \r
97         device->closeDevice();\r
98         device->run();\r
99         device->drop();\r
100 \r
101         return result;\r
102 }\r
103 \r
104 // draws a complex (interlaced, paletted, alpha) png image\r
105 bool testWithPNG(video::E_DRIVER_TYPE driverType)\r
106 {\r
107         // create device\r
108 \r
109         IrrlichtDevice *device = createDevice(driverType, core::dimension2d<u32>(160,120));\r
110 \r
111         if (device == 0)\r
112                 return true; // could not create selected driver.\r
113 \r
114         video::IVideoDriver* driver = device->getVideoDriver();\r
115 \r
116         stabilizeScreenBackground(driver);\r
117 \r
118         logTestString("Testing driver %ls\n", driver->getName());\r
119 \r
120         video::ITexture *tex=driver->getTexture("media/RedbrushAlpha-0.25.png");\r
121 \r
122         driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,40,40,255));//Backbuffer background is blue\r
123         driver->draw2DImage(tex, core::recti(0,0,160,120), core::recti(0,0,256,256), 0, 0, true);\r
124         driver->endScene();\r
125 \r
126         bool result = takeScreenshotAndCompareAgainstReference(driver, "-draw2DImagePNG.png", 98.f);\r
127 \r
128         device->closeDevice();\r
129         device->run();\r
130         device->drop();\r
131 \r
132         return result;\r
133 }\r
134 \r
135 // draws an image and checks if the written example equals the original image\r
136 bool testExactPlacement(video::E_DRIVER_TYPE driverType)\r
137 {\r
138         // create device\r
139 \r
140         IrrlichtDevice *device = createDevice(driverType, core::dimension2d<u32>(160,120), 32);\r
141 \r
142         if (device == 0)\r
143                 return true; // could not create selected driver.\r
144 \r
145         video::IVideoDriver* driver = device->getVideoDriver();\r
146 \r
147         if (driver->getColorFormat() != video::ECF_A8R8G8B8 || !driver->queryFeature(video::EVDF_RENDER_TO_TARGET))\r
148         {\r
149                 device->closeDevice();\r
150                 device->run();\r
151                 device->drop();\r
152                 return true;\r
153         }\r
154 \r
155         stabilizeScreenBackground(driver);\r
156 \r
157         logTestString("Testing driver %ls\n", driver->getName());\r
158 \r
159         video::ITexture* renderTargetTex = driver->addRenderTargetTexture(core::dimension2d<u32>(32, 32), "rt1");\r
160         video::ITexture* renderTargetDepth = driver->addRenderTargetTexture(core::dimension2d<u32>(32, 32), "rtd", video::ECF_D16);\r
161 \r
162         video::IRenderTarget* renderTarget = driver->addRenderTarget();\r
163         renderTarget->setTexture(renderTargetTex, renderTargetDepth);\r
164 \r
165         video::ITexture* tex=driver->getTexture("../media/fireball.bmp");\r
166 \r
167         driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,40,40,255));//Backbuffer background is blue\r
168         driver->setRenderTargetEx(renderTarget, 0, video::ECBF_COLOR | video::ECBF_DEPTH);\r
169         driver->draw2DImage(tex, core::recti(0,0,32,32), core::recti(0,0,64,64));\r
170         driver->setRenderTargetEx(0, 0, 0);\r
171         driver->endScene();\r
172 \r
173         video::IImage* img = driver->createImage(renderTargetTex, core::vector2di(), renderTargetTex->getSize());\r
174         driver->writeImageToFile(img, "results/fireball.png");\r
175         img->drop();\r
176         bool result = fuzzyCompareImages(driver, "media/fireball.png", "results/fireball.png")>98.25f;\r
177 \r
178         device->closeDevice();\r
179         device->run();\r
180         device->drop();\r
181 \r
182         return result;\r
183 }\r
184 \r
185 }\r
186 \r
187 bool draw2DImage()\r
188 {\r
189         bool result = true;\r
190         TestWithAllDrivers(testWithRenderTarget);\r
191         TestWithAllHWDrivers(testWithPNG);\r
192         // TODO D3D driver moves image 1 pixel top-left in case of down scaling\r
193         TestWithAllDrivers(testExactPlacement);\r
194         TestWithAllDrivers(testRectangles);\r
195         return result;\r
196 }\r