1d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary/*
2d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * Copyright 2017 Google Inc.
3d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary *
4d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * Use of this source code is governed by a BSD-style license that can be
5d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * found in the LICENSE file.
6d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary */
7d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#ifndef gm_knowledge_DEFINED
8d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#define gm_knowledge_DEFINED
9d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
10d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#include <cstdint>
11d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
12d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarynamespace skqp {
13d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canaryclass AssetManager;
14d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}
15d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
16d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarynamespace gmkb {
17d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
18d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canaryenum class Error {
19d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    kNone,     /**< No error. */
20d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    kBadInput, /**< Error with the given image data. */
21d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    kBadData,  /**< Error with the given gmkb data directory. */
22d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
23d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
24d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary/**
25d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal CanaryCheck if the given test image matches the expected results.
26d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
27d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal CanaryEach pixel is an un-pre-multiplied RGBA color:
28d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    uint32_t make_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
29d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        return (r << 0) | (g << 8) | (b << 16) | (a << 24);
30d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
31d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
32d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal CanaryThe image's rowBytes is width*sizeof(uint32_t):
33d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    uint32_t* get_pixel_addr(uint32_t* pixels, int width, int height, int x, int y) {
34d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        assert(x >= 0 && x < width);
35d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        assert(y >= 0 && y < height);
36d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        return &pixels[x + (width * y)];
37d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
38d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
39d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param pixels, width, height  the image
40d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param gm_name                the name of the rendering test that produced the image
41d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param backend                (optional) name of the backend
42d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param asset_manager          GM KnowledgeBase data files
43d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param report_directory_path  (optional) locatation to write report to.
44d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@param error_out              (optional) error return code.
45d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
46d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary@return 0 if the test passes, otherwise a positive number representing how
47d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary         badly it failed.  Return FLT_MAX on error.
48d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary */
49d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
50d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canaryfloat Check(const uint32_t* pixels,
51d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            int width,
52d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            int height,
53d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            const char* name,
54d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            const char* backend,
55d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            skqp::AssetManager* asset_manager,
56d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            const char* report_directory_path,
57d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            Error* error_out);
58d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
59d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary/**
602a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal CanaryCall this after running all checks.
612a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary
622a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary@param report_directory_path  locatation to write report to.
632a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary*/
642a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canarybool MakeReport(const char* report_directory_path);
65d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}  // namespace gmkb
66d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
67d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#endif  // gm_knowledge_DEFINED
68