]> git.tdb.fi Git - libs/gl.git/blob - source/core/texture1d.cpp
Simplify Program by removing transient data
[libs/gl.git] / source / core / texture1d.cpp
1 #include "error.h"
2 #include "texture1d.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GL {
8
9 void Texture1D::storage(PixelFormat fmt, unsigned wd, unsigned lv)
10 {
11         if(width>0)
12         {
13                 if(fmt!=format || wd!=width || (lv && lv!=n_levels))
14                         throw incompatible_data("Texture1D::storage");
15                 return;
16         }
17         if(wd==0)
18                 throw invalid_argument("Texture1D::storage");
19
20         set_format(fmt);
21         width = wd;
22         n_levels = count_levels(width);
23         if(lv)
24                 n_levels = min(n_levels, lv);
25
26         allocate();
27 }
28
29 void Texture1D::image(unsigned level, const void *data)
30 {
31         return sub_image(level, 0, get_level_size(level), data);
32 }
33
34 void Texture1D::sub_image(unsigned level, unsigned x, unsigned wd, const void *data)
35 {
36         if(width==0)
37                 throw invalid_operation("Texture1D::sub_image");
38         if(level>=n_levels || x>width || x+wd>width)
39                 throw out_of_range("Texture1D::sub_image");
40
41         Texture1DBackend::sub_image(level, x, wd, data);
42 }
43
44 void Texture1D::image(const Graphics::Image &img, unsigned lv)
45 {
46         if(img.get_height()!=1)
47                 throw incompatible_data("Texture1D::image");
48
49         storage(pixelformat_from_image(img, use_srgb_format), img.get_width(), lv);
50         image(0, img.get_pixels());
51 }
52
53 unsigned Texture1D::get_level_size(unsigned level) const
54 {
55         return width>>level;
56 }
57
58
59 Texture1D::Loader::Loader(Texture1D &t):
60         DataFile::DerivedObjectLoader<Texture1D, Texture::Loader>(t)
61 {
62         init();
63 }
64
65 Texture1D::Loader::Loader(Texture1D &t, Collection &c):
66         DataFile::DerivedObjectLoader<Texture1D, Texture::Loader>(t, c)
67 {
68         init();
69 }
70
71 void Texture1D::Loader::init()
72 {
73         add("storage", &Loader::storage);
74         add("storage", &Loader::storage_levels);
75 }
76
77 void Texture1D::Loader::storage(PixelFormat fmt, unsigned w)
78 {
79         obj.storage(fmt, w);
80 }
81
82 void Texture1D::Loader::storage_levels(PixelFormat fmt, unsigned w, unsigned l)
83 {
84         obj.storage(fmt, w, l);
85 }
86
87 } // namespace GL
88 } // namespace Msp