]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/bmploader.cpp
Split image loading into headers and pixels
[libs/gui.git] / source / graphics / bmploader.cpp
index 39629f714e776e3a8d1bfa954fe60007c1a3be3f..d88e2aa6435f36f3c908bf3c274a9799a5b2339e 100644 (file)
@@ -29,7 +29,8 @@ namespace Graphics {
 
 BmpLoader::BmpLoader(IO::Base &i, unsigned sb):
        io(i),
-       sig_bytes(sb)
+       sig_bytes(sb),
+       invert_row_order(false)
 {
        // Image data location is stored at offset 10 and can't be skipped
        if(sig_bytes>10)
@@ -44,7 +45,7 @@ bool BmpLoader::detect(const std::string &sig)
        return !sig.compare(0, sizeof(bmp_sig), bmp_sig, sizeof(bmp_sig));
 }
 
-void BmpLoader::load_(Image::Data &data)
+void BmpLoader::load_headers_(Image::Data &data)
 {
        char bm_header[14];
        read_full(io, bm_header+sig_bytes, sizeof(bm_header)-sig_bytes);
@@ -92,8 +93,13 @@ void BmpLoader::load_(Image::Data &data)
                skip -= size;
        }
 
+       invert_row_order = (height<0);
+}
+
+void BmpLoader::load_pixels_(Image::Data &data)
+{
        data.pixels = new char[data.stride*data.height];
-       if(height<0)
+       if(invert_row_order)
        {
                for(unsigned y=0; y<data.height; ++y)
                        read_full(io, data.pixels+(data.height-1-y)*data.stride, data.stride);