added the capability to crudely resize images by half in image.cc
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Thu, 8 Dec 2016 00:41:55 +0000 (02:41 +0200)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Thu, 8 Dec 2016 00:41:55 +0000 (02:41 +0200)
src/app.cc
src/image.cc
src/image.h
src/texture.cc

index ca750fa..e135ddf 100644 (file)
@@ -574,6 +574,7 @@ static void toggle_flight()
 
 static void calc_framerate()
 {
+       static int ncalc;
        static int nframes;
        static long prev_upd;
 
@@ -582,6 +583,11 @@ static void calc_framerate()
                framerate = (float)nframes / (float)(elapsed * 0.001);
                nframes = 1;
                prev_upd = time_msec;
+
+               if(++ncalc >= 5) {
+                       printf("fps: %f\n", framerate);
+                       ncalc = 0;
+               }
        } else {
                ++nframes;
        }
index c245212..e79073d 100644 (file)
@@ -143,6 +143,34 @@ void Image::rotate_180()
        flip_horizontal();
 }
 
+void Image::resize_half()
+{
+       int pixsz = pixel_size(fmt);
+       int newxsz = width / 2;
+       int newysz = height / 2;
+
+       if(!newxsz || !newysz) return;
+
+       unsigned char *newpix = new unsigned char[newxsz * newysz * pixsz];
+
+       unsigned char *sptr = (unsigned char*)pixels;
+       unsigned char *dptr = newpix;
+
+       for(int i=0; i<newysz; i++) {
+               if(i & 1) sptr += width * pixsz;
+               for(int j=0; j<newxsz; j++) {
+                       memcpy(dptr, sptr, pixsz);
+                       dptr += pixsz;
+                       sptr += pixsz * 2;
+               }
+       }
+
+       delete [] (char*)pixels;
+       pixels = newpix;
+       width = newxsz;
+       height = newysz;
+}
+
 bool Image::load(const char *fname)
 {
        struct img_pixmap pixmap;
index 9d66825..1d16979 100644 (file)
@@ -40,6 +40,8 @@ public:
        void flip_vertical();
        void rotate_180();
 
+       void resize_half();
+
        bool load(const char *fname);
        bool save(const char *fname) const;
 };
index dae0c7c..ff4d1b5 100644 (file)
@@ -245,6 +245,8 @@ void Texture::set_image_2d(const Image &img)
        glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
 #ifdef __GLEW_H__
        if(GLEW_SGIS_generate_mipmap) {
                glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
@@ -263,6 +265,7 @@ void Texture::set_image_2d(const Image &img)
 
 bool Texture::set_image_cube(const Image &img, int idx)
 {
+       unsigned int err;
        if(idx < 0 || idx >= 6) {
                return false;
        }
@@ -276,7 +279,10 @@ bool Texture::set_image_cube(const Image &img, int idx)
 
        target = GL_TEXTURE_CUBE_MAP;
        glBindTexture(target, id);
-       assert(glGetError() == GL_NO_ERROR);
+       if((err = glGetError()) == GL_INVALID_OPERATION) {
+               return false;   // probably not a cubemap
+       }
+       assert(err == GL_NO_ERROR);
        glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -301,15 +307,15 @@ bool Texture::set_image_cube(const Image &img)
        int xsz = img.get_width();
        int ysz = img.get_height();
 
-       if(xsz / 4 == ysz / 3) {
+       if((xsz << 8) / 4 == (ysz << 8) / 3) {
                // horizontal cross, assume the vertical bit is center-left
                return set_cube_multi(img, hcross[0], hcross[1], xsz / 4);
        }
-       if(xsz / 3 == ysz / 4) {
+       if((xsz << 8) / 3 == (ysz << 8) / 4) {
                // vertical cross, assume the horizontal bit is center-top (180-rotated image 5)
                return set_cube_multi(img, vcross[0], vcross[1], ysz / 4, (1 << 5));
        }
-       if(xsz / 3 == ysz / 2) {
+       if((xsz << 8) / 3 == (ysz << 8) / 2) {
                // horizontal sixpack
                return set_cube_multi(img, hsix[0], hsix[1], ysz / 2);
        }