12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/gl_renderer.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/output/software_renderer.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/render_pass.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/pixel_comparator.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TEST_PIXEL_TEST_H_
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TEST_PIXEL_TEST_H_
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CopyOutputResult;
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DirectRenderer;
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SoftwareRenderer;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurface;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PixelTest : public testing::Test {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PixelTest();
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PixelTest();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool RunPixelTest(RenderPassList* pass_list,
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    const base::FilePath& ref_file,
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    const PixelComparator& comparator);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool RunPixelTestWithReadbackTarget(RenderPassList* pass_list,
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      RenderPass* target,
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      const base::FilePath& ref_file,
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      const PixelComparator& comparator);
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size device_viewport_size_;
3874e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias  bool disable_picture_quad_image_filtering_;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  class PixelTestRendererClient;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface_;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PixelTestRendererClient> fake_client_;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<DirectRenderer> renderer_;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SkBitmap> result_bitmap_;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetUpGLRenderer(bool use_skia_gpu_backend);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUpSoftwareRenderer();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ForceExpandedViewport(gfx::Size surface_expansion,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                             gfx::Vector2d viewport_offset);
51fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void EnableExternalStencilTest();
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ReadbackResult(base::Closure quit_run_loop,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      scoped_ptr<CopyOutputResult> result);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool PixelsMatchReference(const base::FilePath& ref_file,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const PixelComparator& comparator);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename RendererType>
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTest : public PixelTest {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RendererType* renderer() {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return static_cast<RendererType*>(renderer_.get());
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool UseSkiaGPUBackend() const;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool ExpandedViewport() const;
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// A simple wrapper to differentiate a renderer that should use ganesh
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// and one that shouldn't in templates.
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GLRendererWithSkiaGPUBackend : public GLRenderer {
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GLRendererWithSkiaGPUBackend(RendererClient* client,
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       OutputSurface* output_surface,
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       ResourceProvider* resource_provider,
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       int highp_threshold_min)
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : GLRenderer(client,
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   output_surface,
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   resource_provider,
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   highp_threshold_min) {}
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Wrappers to differentiate renderers where the the output surface and viewport
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// have an externally determined size and offset.
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class GLRendererWithExpandedViewport : public GLRenderer {
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLRendererWithExpandedViewport(RendererClient* client,
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       OutputSurface* output_surface,
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ResourceProvider* resource_provider,
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       int highp_threshold_min)
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : GLRenderer(client,
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   output_surface,
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   resource_provider,
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   highp_threshold_min) {}
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SoftwareRendererWithExpandedViewport : public SoftwareRenderer {
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SoftwareRendererWithExpandedViewport(RendererClient* client,
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       OutputSurface* output_surface,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ResourceProvider* resource_provider)
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : SoftwareRenderer(client,
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   output_surface,
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   resource_provider) {}
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<>
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<GLRenderer>::SetUp() {
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetUpGLRenderer(false);
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!renderer()->CanUseSkiaGPUBackend());
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<>
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::UseSkiaGPUBackend() const {
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return false;
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<>
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::ExpandedViewport() const {
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<>
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline void RendererPixelTest<GLRendererWithSkiaGPUBackend>::SetUp() {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetUpGLRenderer(true);
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(renderer()->CanUseSkiaGPUBackend());
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <>
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RendererPixelTest<GLRendererWithSkiaGPUBackend>::UseSkiaGPUBackend() const {
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRendererWithSkiaGPUBackend>::ExpandedViewport()
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const {
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<>
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() {
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUpGLRenderer(false);
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20));
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::UseSkiaGPUBackend() const {
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::ExpandedViewport() const {
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<>
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<SoftwareRenderer>::SetUp() {
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetUpSoftwareRenderer();
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<>
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::UseSkiaGPUBackend() const {
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return false;
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::ExpandedViewport() const {
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<>
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<SoftwareRendererWithExpandedViewport>::SetUp() {
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUpSoftwareRenderer();
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20));
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const {
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SoftwareRendererWithExpandedViewport>::ExpandedViewport() const {
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<GLRenderer> GLRendererPixelTest;
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef RendererPixelTest<GLRendererWithSkiaGPUBackend>
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GLRendererSkiaGPUBackendPixelTest;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<SoftwareRenderer> SoftwareRendererPixelTest;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_TEST_PIXEL_TEST_H_
207