1/*
2 * Copyright (C) 2017 Igalia S.L.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include <cmath>
27#include <memory>
28
29#if defined(USE_CAIRO) && USE_CAIRO
30typedef struct _cairo_surface cairo_surface_t;
31#else
32typedef struct CGImage *CGImageRef;
33#endif
34
35namespace ImageDiff {
36
37class PlatformImage {
38public:
39 static std::unique_ptr<PlatformImage> createFromStdin(size_t);
40 static std::unique_ptr<PlatformImage> createFromDiffData(void*, size_t width, size_t height);
41
42#if defined(USE_CAIRO) && USE_CAIRO
43 PlatformImage(cairo_surface_t*);
44#else
45 PlatformImage(CGImageRef);
46#endif
47 ~PlatformImage();
48
49 size_t width() const;
50 size_t height() const;
51 size_t rowBytes() const;
52 bool hasAlpha() const;
53 unsigned char* pixels() const;
54 bool isCompatible(const PlatformImage&) const;
55 std::unique_ptr<PlatformImage> difference(const PlatformImage&, float& percentageDifference);
56 void writeAsPNGToStdout();
57
58private:
59#if defined(USE_CAIRO) && USE_CAIRO
60 cairo_surface_t* m_image;
61#else
62 CGImageRef m_image;
63 mutable void* m_buffer { nullptr };
64#endif
65};
66
67} // namespace ImageDiff
68