1 /*
2 * Copyright 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "SurfaceTextureGLToGL_test"
18 //#define LOG_NDEBUG 0
19
20 #include "SurfaceTextureGLToGL.h"
21
22 namespace android {
23
TEST_F(SurfaceTextureGLToGLTest,TransformHintGetsRespected)24 TEST_F(SurfaceTextureGLToGLTest, TransformHintGetsRespected) {
25 const uint32_t texWidth = 32;
26 const uint32_t texHeight = 64;
27
28 mST->setDefaultBufferSize(texWidth, texHeight);
29 mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
30
31 // This test requires 3 buffers to avoid deadlock because we're
32 // both producer and consumer, and only using one thread.
33 mST->setDefaultMaxBufferCount(3);
34
35 // Do the producer side of things
36 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
37 mProducerEglSurface, mProducerEglContext));
38 ASSERT_EQ(EGL_SUCCESS, eglGetError());
39
40 // Start a buffer with our chosen size and transform hint moving
41 // through the system.
42 glClear(GL_COLOR_BUFFER_BIT); // give the driver something to do
43 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
44 mST->updateTexImage(); // consume it
45 // Swap again.
46 glClear(GL_COLOR_BUFFER_BIT);
47 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
48 mST->updateTexImage();
49
50 // The current buffer should either show the effects of the transform
51 // hint (in the form of an inverse transform), or show that the
52 // transform hint has been ignored.
53 sp<GraphicBuffer> buf = mST->getCurrentBuffer();
54 if (mST->getCurrentTransform() == NATIVE_WINDOW_TRANSFORM_ROT_270) {
55 ASSERT_EQ(texWidth, buf->getHeight());
56 ASSERT_EQ(texHeight, buf->getWidth());
57 } else {
58 ASSERT_EQ(texWidth, buf->getWidth());
59 ASSERT_EQ(texHeight, buf->getHeight());
60 }
61
62 // Reset the transform hint and confirm that it takes.
63 mST->setTransformHint(0);
64 glClear(GL_COLOR_BUFFER_BIT);
65 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
66 mST->updateTexImage();
67 glClear(GL_COLOR_BUFFER_BIT);
68 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
69 mST->updateTexImage();
70
71 buf = mST->getCurrentBuffer();
72 ASSERT_EQ((uint32_t) 0, mST->getCurrentTransform());
73 ASSERT_EQ(texWidth, buf->getWidth());
74 ASSERT_EQ(texHeight, buf->getHeight());
75 }
76
TEST_F(SurfaceTextureGLToGLTest,TexturingFromGLFilledRGBABufferPow2)77 TEST_F(SurfaceTextureGLToGLTest, TexturingFromGLFilledRGBABufferPow2) {
78 const int texWidth = 64;
79 const int texHeight = 64;
80
81 mST->setDefaultBufferSize(texWidth, texHeight);
82
83 // This test requires 3 buffers to complete run on a single thread.
84 mST->setDefaultMaxBufferCount(3);
85
86 // Do the producer side of things
87 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
88 mProducerEglSurface, mProducerEglContext));
89 ASSERT_EQ(EGL_SUCCESS, eglGetError());
90
91 // This is needed to ensure we pick up a buffer of the correct size.
92 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
93
94 glClearColor(0.6, 0.6, 0.6, 0.6);
95 glClear(GL_COLOR_BUFFER_BIT);
96
97 glEnable(GL_SCISSOR_TEST);
98 glScissor(4, 4, 4, 4);
99 glClearColor(1.0, 0.0, 0.0, 1.0);
100 glClear(GL_COLOR_BUFFER_BIT);
101
102 glScissor(24, 48, 4, 4);
103 glClearColor(0.0, 1.0, 0.0, 1.0);
104 glClear(GL_COLOR_BUFFER_BIT);
105
106 glScissor(37, 17, 4, 4);
107 glClearColor(0.0, 0.0, 1.0, 1.0);
108 glClear(GL_COLOR_BUFFER_BIT);
109
110 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
111
112 // Do the consumer side of things
113 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
114 mEglContext));
115 ASSERT_EQ(EGL_SUCCESS, eglGetError());
116
117 glDisable(GL_SCISSOR_TEST);
118
119 // Skip the first frame, which was empty
120 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
121 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
122
123 glClearColor(0.2, 0.2, 0.2, 0.2);
124 glClear(GL_COLOR_BUFFER_BIT);
125
126 glViewport(0, 0, texWidth, texHeight);
127 drawTexture();
128
129 EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153));
130 EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153));
131 EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
132 EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
133
134 EXPECT_TRUE(checkPixel( 4, 7, 255, 0, 0, 255));
135 EXPECT_TRUE(checkPixel(25, 51, 0, 255, 0, 255));
136 EXPECT_TRUE(checkPixel(40, 19, 0, 0, 255, 255));
137 EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153));
138 EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153));
139 EXPECT_TRUE(checkPixel(13, 8, 153, 153, 153, 153));
140 EXPECT_TRUE(checkPixel(46, 3, 153, 153, 153, 153));
141 EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153));
142 EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153));
143 EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153));
144 EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153));
145 EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153));
146 EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153));
147 EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153));
148 EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153));
149 EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153));
150 }
151
TEST_F(SurfaceTextureGLToGLTest,EglDestroySurfaceUnrefsBuffers)152 TEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceUnrefsBuffers) {
153 sp<GraphicBuffer> buffers[2];
154
155 // This test requires async mode to run on a single thread.
156 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
157 mProducerEglSurface, mProducerEglContext));
158 ASSERT_EQ(EGL_SUCCESS, eglGetError());
159 EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0));
160 ASSERT_EQ(EGL_SUCCESS, eglGetError());
161
162 for (int i = 0; i < 2; i++) {
163 // Produce a frame
164 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
165 mProducerEglSurface, mProducerEglContext));
166 ASSERT_EQ(EGL_SUCCESS, eglGetError());
167 glClear(GL_COLOR_BUFFER_BIT);
168 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
169
170 // Consume a frame
171 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
172 mEglContext));
173 ASSERT_EQ(EGL_SUCCESS, eglGetError());
174 mFW->waitForFrame();
175 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
176 buffers[i] = mST->getCurrentBuffer();
177 }
178
179 // Destroy the GL texture object to release its ref on buffers[2].
180 GLuint texID = TEX_ID;
181 glDeleteTextures(1, &texID);
182
183 // Destroy the EGLSurface
184 EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
185 ASSERT_EQ(EGL_SUCCESS, eglGetError());
186 mProducerEglSurface = EGL_NO_SURFACE;
187
188 // This test should have the only reference to buffer 0.
189 EXPECT_EQ(1, buffers[0]->getStrongCount());
190
191 // The GLConsumer should hold one reference to buffer 1 in its
192 // mCurrentTextureImage member and another reference in mEglSlots. The third
193 // reference is in this test.
194 EXPECT_EQ(3, buffers[1]->getStrongCount());
195 }
196
TEST_F(SurfaceTextureGLToGLTest,EglDestroySurfaceAfterAbandonUnrefsBuffers)197 TEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceAfterAbandonUnrefsBuffers) {
198 sp<GraphicBuffer> buffers[3];
199
200 // This test requires async mode to run on a single thread.
201 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
202 mProducerEglSurface, mProducerEglContext));
203 ASSERT_EQ(EGL_SUCCESS, eglGetError());
204 EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0));
205 ASSERT_EQ(EGL_SUCCESS, eglGetError());
206
207 for (int i = 0; i < 3; i++) {
208 // Produce a frame
209 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
210 mProducerEglSurface, mProducerEglContext));
211 ASSERT_EQ(EGL_SUCCESS, eglGetError());
212 glClear(GL_COLOR_BUFFER_BIT);
213 EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
214 ASSERT_EQ(EGL_SUCCESS, eglGetError());
215
216 // Consume a frame
217 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
218 mEglContext));
219 ASSERT_EQ(EGL_SUCCESS, eglGetError());
220 mFW->waitForFrame();
221 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
222 buffers[i] = mST->getCurrentBuffer();
223 }
224
225 // Abandon the GLConsumer, releasing the ref that the GLConsumer has
226 // on buffers[2].
227 mST->abandon();
228
229 // Destroy the GL texture object to release its ref on buffers[2].
230 GLuint texID = TEX_ID;
231 glDeleteTextures(1, &texID);
232
233 // Destroy the EGLSurface.
234 EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
235 ASSERT_EQ(EGL_SUCCESS, eglGetError());
236 mProducerEglSurface = EGL_NO_SURFACE;
237
238 EXPECT_EQ(1, buffers[1]->getStrongCount());
239
240 // Depending on how lazily the GL driver dequeues buffers, we may end up
241 // with either two or three total buffers. If there are three, each entry
242 // of the buffers array will be unique and there should only be one
243 // reference (the one in this test). If there are two the first and last
244 // element in the array will be equal meaning that buffer representing both
245 // 0 and 2 will have two references (one for 0 and one for 2).
246 if (buffers[2] != buffers[0]) {
247 EXPECT_EQ(1, buffers[0]->getStrongCount());
248 EXPECT_EQ(1, buffers[2]->getStrongCount());
249 } else {
250 EXPECT_EQ(2, buffers[0]->getStrongCount());
251 }
252 }
253
TEST_F(SurfaceTextureGLToGLTest,EglMakeCurrentBeforeConsumerDeathUnrefsBuffers)254 TEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentBeforeConsumerDeathUnrefsBuffers) {
255 sp<GraphicBuffer> buffer;
256
257 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
258 mProducerEglSurface, mProducerEglContext));
259
260 // Produce a frame
261 glClear(GL_COLOR_BUFFER_BIT);
262 EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
263 ASSERT_EQ(EGL_SUCCESS, eglGetError());
264
265 // Destroy the EGLSurface.
266 EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
267 ASSERT_EQ(EGL_SUCCESS, eglGetError());
268 mProducerEglSurface = EGL_NO_SURFACE;
269 mSTC.clear();
270 mANW.clear();
271 mTextureRenderer.clear();
272
273 // Consume a frame
274 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
275 buffer = mST->getCurrentBuffer();
276
277 // Destroy the GL texture object to release its ref
278 GLuint texID = TEX_ID;
279 glDeleteTextures(1, &texID);
280
281 // make un-current, all references to buffer should be gone
282 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE,
283 EGL_NO_SURFACE, EGL_NO_CONTEXT));
284
285 // Destroy consumer
286 mST.clear();
287
288 EXPECT_EQ(1, buffer->getStrongCount());
289 }
290
TEST_F(SurfaceTextureGLToGLTest,EglMakeCurrentAfterConsumerDeathUnrefsBuffers)291 TEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentAfterConsumerDeathUnrefsBuffers) {
292 sp<GraphicBuffer> buffer;
293
294 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
295 mProducerEglSurface, mProducerEglContext));
296
297 // Produce a frame
298 glClear(GL_COLOR_BUFFER_BIT);
299 EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
300 ASSERT_EQ(EGL_SUCCESS, eglGetError());
301
302 // Destroy the EGLSurface.
303 EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
304 ASSERT_EQ(EGL_SUCCESS, eglGetError());
305 mProducerEglSurface = EGL_NO_SURFACE;
306 mSTC.clear();
307 mANW.clear();
308 mTextureRenderer.clear();
309
310 // Consume a frame
311 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
312 buffer = mST->getCurrentBuffer();
313
314 // Destroy the GL texture object to release its ref
315 GLuint texID = TEX_ID;
316 glDeleteTextures(1, &texID);
317
318 // Destroy consumer
319 mST.clear();
320
321 // make un-current, all references to buffer should be gone
322 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE,
323 EGL_NO_SURFACE, EGL_NO_CONTEXT));
324
325 EXPECT_EQ(1, buffer->getStrongCount());
326 }
327
TEST_F(SurfaceTextureGLToGLTest,TexturingFromUserSizedGLFilledBuffer)328 TEST_F(SurfaceTextureGLToGLTest, TexturingFromUserSizedGLFilledBuffer) {
329 enum { texWidth = 64 };
330 enum { texHeight = 64 };
331
332 // This test requires 3 buffers to complete run on a single thread.
333 mST->setDefaultMaxBufferCount(3);
334
335 // Set the user buffer size.
336 native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight);
337
338 // Do the producer side of things
339 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
340 mProducerEglSurface, mProducerEglContext));
341 ASSERT_EQ(EGL_SUCCESS, eglGetError());
342
343 // This is needed to ensure we pick up a buffer of the correct size.
344 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
345
346 glClearColor(0.6, 0.6, 0.6, 0.6);
347 glClear(GL_COLOR_BUFFER_BIT);
348
349 glEnable(GL_SCISSOR_TEST);
350 glScissor(4, 4, 1, 1);
351 glClearColor(1.0, 0.0, 0.0, 1.0);
352 glClear(GL_COLOR_BUFFER_BIT);
353
354 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
355
356 // Do the consumer side of things
357 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
358 mEglContext));
359 ASSERT_EQ(EGL_SUCCESS, eglGetError());
360
361 glDisable(GL_SCISSOR_TEST);
362
363 // Skip the first frame, which was empty
364 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
365 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
366
367 glClearColor(0.2, 0.2, 0.2, 0.2);
368 glClear(GL_COLOR_BUFFER_BIT);
369
370 glViewport(0, 0, texWidth, texHeight);
371 drawTexture();
372
373 EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153));
374 EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153));
375 EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
376 EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
377
378 EXPECT_TRUE(checkPixel( 4, 4, 255, 0, 0, 255));
379 EXPECT_TRUE(checkPixel( 5, 5, 153, 153, 153, 153));
380 EXPECT_TRUE(checkPixel( 3, 3, 153, 153, 153, 153));
381 EXPECT_TRUE(checkPixel(45, 52, 153, 153, 153, 153));
382 EXPECT_TRUE(checkPixel(12, 36, 153, 153, 153, 153));
383 }
384
TEST_F(SurfaceTextureGLToGLTest,TexturingFromPreRotatedUserSizedGLFilledBuffer)385 TEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedUserSizedGLFilledBuffer) {
386 enum { texWidth = 64 };
387 enum { texHeight = 16 };
388
389 // This test requires 3 buffers to complete run on a single thread.
390 mST->setDefaultMaxBufferCount(3);
391
392 // Set the transform hint.
393 mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
394
395 // Set the user buffer size.
396 native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight);
397
398 // Do the producer side of things
399 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
400 mProducerEglSurface, mProducerEglContext));
401 ASSERT_EQ(EGL_SUCCESS, eglGetError());
402
403 // This is needed to ensure we pick up a buffer of the correct size and the
404 // new rotation hint.
405 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
406
407 glClearColor(0.6, 0.6, 0.6, 0.6);
408 glClear(GL_COLOR_BUFFER_BIT);
409
410 glEnable(GL_SCISSOR_TEST);
411 glScissor(24, 4, 1, 1);
412 glClearColor(1.0, 0.0, 0.0, 1.0);
413 glClear(GL_COLOR_BUFFER_BIT);
414
415 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
416
417 // Do the consumer side of things
418 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
419 mEglContext));
420 ASSERT_EQ(EGL_SUCCESS, eglGetError());
421
422 glDisable(GL_SCISSOR_TEST);
423
424 // Skip the first frame, which was empty
425 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
426 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
427
428 glClearColor(0.2, 0.2, 0.2, 0.2);
429 glClear(GL_COLOR_BUFFER_BIT);
430
431 glViewport(0, 0, texWidth, texHeight);
432 drawTexture();
433
434 EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153));
435 EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153));
436 EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153));
437 EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153));
438
439 EXPECT_TRUE(checkPixel(24, 4, 255, 0, 0, 255));
440 EXPECT_TRUE(checkPixel(25, 5, 153, 153, 153, 153));
441 EXPECT_TRUE(checkPixel(23, 3, 153, 153, 153, 153));
442 EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153));
443 EXPECT_TRUE(checkPixel(12, 8, 153, 153, 153, 153));
444 }
445
TEST_F(SurfaceTextureGLToGLTest,TexturingFromPreRotatedGLFilledBuffer)446 TEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedGLFilledBuffer) {
447 enum { texWidth = 64 };
448 enum { texHeight = 16 };
449
450 // This test requires 3 buffers to complete run on a single thread.
451 mST->setDefaultMaxBufferCount(3);
452
453 // Set the transform hint.
454 mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
455
456 // Set the default buffer size.
457 mST->setDefaultBufferSize(texWidth, texHeight);
458
459 // Do the producer side of things
460 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
461 mProducerEglSurface, mProducerEglContext));
462 ASSERT_EQ(EGL_SUCCESS, eglGetError());
463
464 // This is needed to ensure we pick up a buffer of the correct size and the
465 // new rotation hint.
466 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
467
468 glClearColor(0.6, 0.6, 0.6, 0.6);
469 glClear(GL_COLOR_BUFFER_BIT);
470
471 glEnable(GL_SCISSOR_TEST);
472 glScissor(24, 4, 1, 1);
473 glClearColor(1.0, 0.0, 0.0, 1.0);
474 glClear(GL_COLOR_BUFFER_BIT);
475
476 eglSwapBuffers(mEglDisplay, mProducerEglSurface);
477
478 // Do the consumer side of things
479 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
480 mEglContext));
481 ASSERT_EQ(EGL_SUCCESS, eglGetError());
482
483 glDisable(GL_SCISSOR_TEST);
484
485 // Skip the first frame, which was empty
486 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
487 ASSERT_EQ(NO_ERROR, mST->updateTexImage());
488
489 glClearColor(0.2, 0.2, 0.2, 0.2);
490 glClear(GL_COLOR_BUFFER_BIT);
491
492 glViewport(0, 0, texWidth, texHeight);
493 drawTexture();
494
495 EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153));
496 EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153));
497 EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153));
498 EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153));
499
500 EXPECT_TRUE(checkPixel(24, 4, 255, 0, 0, 255));
501 EXPECT_TRUE(checkPixel(25, 5, 153, 153, 153, 153));
502 EXPECT_TRUE(checkPixel(23, 3, 153, 153, 153, 153));
503 EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153));
504 EXPECT_TRUE(checkPixel(12, 8, 153, 153, 153, 153));
505 }
506
507 } // namespace android
508