summaryrefslogtreecommitdiffstats
path: root/src/common/image.h
blob: e0e270a03f3e5f0fe7c005da778bfd704a3766ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * This file is part of the Colobot: Gold Edition source code
 * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
 * http://epsiteс.ch; http://colobot.info; http://github.com/colobot
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see http://gnu.org/licenses
 */

/**
 * \file common/image.h
 * \brief Class for loading and saving images
 */

#pragma once


#include "graphics/core/color.h"

#include "math/intpoint.h"

#include <stddef.h>
#include <string>


// Forward declaration without including headers to clutter the code
struct SDL_Surface;

//! Implementation-specific image data
/** Note that the struct has no destructor and the surface
    will not be freed at destruction. */
struct ImageData
{
    //! SDL surface with image data
    SDL_Surface* surface;

    ImageData() { surface = NULL; }
};

/**
  \class CImage
  \brief Image loaded from file

  Wrapper around SDL_Image library to load images. Also contains
  function for saving images to PNG.
  */
class CImage
{
private:
    //! Blocked!
    CImage(const CImage &other) {}
    //! Blocked!
    void operator=(const CImage &other) {}

public:
    //! Constructs empty image (with NULL data)
    CImage();
    //! Constructs a RGBA image of given size
    CImage(Math::IntPoint size);
    //! Destroys image, calling Free()
    virtual ~CImage();

    //! Frees the allocated image data
    void Free();

    //! Returns whether the image is empty (has null data)
    bool IsEmpty() const;

    //! Returns the image data; if empty - returns nullptr
    ImageData* GetData();

    //! Returns the image size
    Math::IntPoint GetSize() const;

    //! Fills the whole image with given color
    void Fill(Gfx::IntColor color);

    //! Sets the color at given pixel
    void SetPixel(Math::IntPoint pixel, Gfx::Color color);

    //! Sets the precise color at given pixel
    void SetPixelInt(Math::IntPoint pixel, Gfx::IntColor color);

    //! Returns the color at given pixel
    Gfx::Color GetPixel(Math::IntPoint pixel);

    //! Returns the precise color at given pixel
    Gfx::IntColor GetPixelInt(Math::IntPoint pixel);

    //! Pads the image to nearest power of 2 dimensions
    void PadToNearestPowerOfTwo();

    //! Convert the image to RGBA surface
    void ConvertToRGBA();

    //! Loads an image from the specified file
    bool Load(const std::string &fileName);

    //! Saves the image to the specified file in PNG format
    bool SavePNG(const std::string &fileName);

    //! Returns the last error
    std::string GetError();

    //! Flips the image vertically
    void flipVertically();
    
    //! sets/replaces the pixels from the surface 
    void SetDataPixels(void *pixels);

private:
    //! Blit to new RGBA surface with given size
    void BlitToNewRGBASurface(int width, int height);

    //! Last encountered error
    std::string m_error;
    //! Image data
    ImageData* m_data;
};