]> git.tdb.fi Git - libs/gui.git/blob - source/graphics/image.cpp
Use FS::extpart for checking filename extension
[libs/gui.git] / source / graphics / image.cpp
1 #ifdef WITH_DEVIL
2 #include <IL/il.h>
3 #endif
4 #include <msp/fs/utils.h>
5 #include <msp/io/file.h>
6 #include <msp/io/memory.h>
7 #include "image.h"
8 #include "image_devil.h"
9 #include "image_png.h"
10 #include "image_private.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace Graphics {
16
17 Image::Private::Private()
18 {
19 #ifdef WITH_DEVIL
20         id = 0;
21 #endif
22         fmt = RGB;
23         width = 0;
24         height = 0;
25         data = 0;
26 }
27
28
29 Image::Image():
30         priv(new Private)
31 {
32 #if !defined(WITH_DEVIL) && !defined(WITH_LIBPNG)
33         throw runtime_error("no image support");
34 #endif
35 }
36
37 Image::~Image()
38 {
39 #ifdef WITH_DEVIL
40         if(priv->id)
41                 ilDeleteImages(1, &priv->id);
42         else
43 #endif
44         delete[] priv->data;
45         delete priv;
46 }
47
48 void Image::load_file(const string &fn)
49 {
50         string ext = FS::extpart(fn);
51 #ifdef WITH_LIBPNG
52         if(ext==".png")
53         {
54                 IO::BufferedFile file(fn);
55                 load_png(file, *priv);
56         }
57         else
58 #endif
59         {
60 #ifdef WITH_DEVIL
61                 load_devil_file(fn, *priv);
62 #else
63                 throw unsupported_image_format("DevIL needed for non-PNG images");
64 #endif
65         }
66         (void)fn;
67 }
68
69 void Image::load_memory(const void *data, unsigned size)
70 {
71 #ifdef WITH_LIBPNG
72         if(size>=8 && is_png(data, 8))
73         {
74                 IO::Memory mem(reinterpret_cast<const char *>(data), size);
75                 load_png(mem, *priv);
76         }
77         else
78 #endif
79         {
80 #ifdef WITH_DEVIL
81                 load_devil_mem(data, size, *priv);
82 #else
83                 throw unsupported_image_format("DevIL needed for non-PNG images");
84 #endif
85         }
86         (void)data;
87         (void)size;
88 }
89
90 PixelFormat Image::get_format() const
91 {
92         return priv->fmt;
93 }
94
95 unsigned Image::get_width() const
96 {
97         return priv->width;
98 }
99
100 unsigned Image::get_height() const
101 {
102         return priv->height;
103 }
104
105 const void *Image::get_data() const
106 {
107         return priv->data;
108 }
109
110 } // namespace Graphics
111 } // namespace Msp