+#include "bindable.h"
+#include "error.h"
+#include "texture1d.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+Texture1D::Texture1D():
+ Texture(GL_TEXTURE_1D),
+ width(0),
+ allocated(0)
+{ }
+
+void Texture1D::storage(PixelFormat fmt, unsigned wd)
+{
+ if(width>0)
+ throw invalid_operation("Texture1D::storage");
+ if(wd==0)
+ throw invalid_argument("Texture1D::storage");
+ require_pixelformat(fmt);
+
+ ifmt = fmt;
+ width = wd;
+}
+
+void Texture1D::allocate(unsigned level)
+{
+ if(allocated&(1<<level))
+ return;
+
+ image(level, get_base_pixelformat(ifmt), UNSIGNED_BYTE, 0);
+}
+
+void Texture1D::image(unsigned level, PixelFormat fmt, DataType type, const void *data)
+{
+ if(width==0)
+ throw invalid_operation("Texture1D::image");
+
+ unsigned w = get_level_size(level);
+
+ BindRestore _bind(this);
+ glTexImage1D(target, level, ifmt, w, 0, fmt, type, data);
+
+ allocated |= 1<<level;
+ if(gen_mipmap && level==0)
+ {
+ for(; w; w>>=1, ++level) ;
+ allocated |= (1<<level)-1;
+ }
+}
+
+unsigned Texture1D::get_level_size(unsigned level)
+{
+ return width>>level;
+}
+
+} // namespace GL
+} // namespace Msp