All pastes #367500 Raw Edit

Something

public text v1 · immutable
#367500 ·published 2007-02-22 11:45 UTC
rendered paste body
void GLSingleView::loadImage()
{
    loadingImage = true;

    ThumbItem *item = m_itemList.at(m_pos);
    if (!item) {
        std::cerr << "GLSingleView: The impossible happened. No item at "
                  << m_pos << std::endl;
        return;
    }

    QImage image(item->path);
    if (!image.isNull()) {

        double scale_factor_w =  aspect_w / aspect_h;

        int a  = m_tex1First ? 0 : 1;
        TexItem& t = m_texItem[a];

        t.item     = item;
        t.angle    = 0;

        QString queryStr = "SELECT angle FROM gallerymetadata WHERE "
                           "image=\"" + item->path + "\";";
        QSqlQuery query = m_db->exec(queryStr);

        if (query.isActive()  && query.numRowsAffected() > 0)
        {
            query.next();
            t.angle = query.value(0).toInt();
        }

        t.width  = (int)round(image.width() * scale_factor_w);
        t.height = (int)round(image.height());

        printf("angle: %d, %d, %d\n", t.angle, t.width, t.height);
        /*if (t.angle%180 != 0) {
            int tmp  = t.width;
            t.width  = t.height;
            t.height = tmp;
        }*/
        printf("angle: %d, %d, %d\n", t.angle, t.width, t.height);

        QSize sz(t.width,t.height);
        sz.scale(screenwidth, screenheight, QSize::ScaleMin);

        t.cx = (float)sz.width()/(float)screenwidth;
        t.cy = (float)sz.height()/(float)screenheight;

        //image = image.smoothScale(m_w, m_h);
        QImage tex = convertToGLFormat(image);

        /*if (t.tex) {
            glDeleteTextures(1, &t.tex);
    }*/

        /* create the texture */
        if(!t.tex)
        {
            printf("Create texture\n");
            glGenTextures(1, &t.tex);
        }
        glMatrixMode(GL_TEXTURE);

#ifdef GL_ARB_texture_rectangle
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, t.tex);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_REPEAT);

        glTexImage2D(GL_PROXY_TEXTURE_RECTANGLE_ARB,
                     0,
                     3,
                     tex.width(),
                     tex.height(),
                     0,
                     GL_RGBA,
                     GL_UNSIGNED_BYTE, 0);

        GLint _width, _height;
        glGetTexLevelParameteriv(GL_PROXY_TEXTURE_RECTANGLE_ARB, 0, GL_TEXTURE_WIDTH,  &_width);
        glGetTexLevelParameteriv(GL_PROXY_TEXTURE_RECTANGLE_ARB, 0, GL_TEXTURE_HEIGHT, &_height);

        printf("w: %d, h: %d\n", (int)_width, (int)_height);

        if(_width && _height)
        {
            glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
                         0,
                         3,
                         tex.width(),
                         tex.height(),
                         0,
                         GL_RGBA,
                         GL_UNSIGNED_BYTE,
                         tex.bits());

            glError();
        }
        else
            fprintf(stderr, "Image too big\n");

#else
        glBindTexture(GL_TEXTURE_2D, t.tex);

        /* actually generate the texture */
        glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
                      GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
        /* enable linear filtering  */
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
#endif

        glFinish();
        glError();
    }

    loadingImage = false;
}



void GLSingleView::paintTexture()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(m_sx, m_sy, 0.0);
    glScalef(m_zoom, m_zoom, 1.0);

    TexItem& t = m_texItem[m_curr];

    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glRotatef(90, 0.0, 0.0, 1.0);
    
#ifdef GL_ARB_texture_rectangle
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, t.tex);
    glBegin(GL_QUADS);
    {
        glColor4f(1.0, 1.0, 1.0, 1.0);
        glTexCoord2f(0, 0);
        glVertex2f(-t.cx, -t.cy);

        glTexCoord2f(t.width, 0);
        glVertex2f(t.cx, -t.cy);

        glTexCoord2f(t.width, t.height);
        glVertex2f(t.cx, t.cy);

        glTexCoord2f(0, t.height);
        glVertex2f(-t.cx, t.cy);
    }
    
    glEnd();
#else
    glBindTexture(GL_TEXTURE_2D, t.tex);
    glBegin(GL_QUADS);
    {
        glColor4f(1.0, 1.0, 1.0, 1.0);
        glTexCoord2f(0, 0);
        glVertex3f(-t.cx, -t.cy, 0);

        glTexCoord2f(1, 0);
        glVertex3f(t.cx, -t.cy, 0);

        glTexCoord2f(1, 1);
        glVertex3f(t.cx, t.cy, 0);

        glTexCoord2f(0, 1);
        glVertex3f(-t.cx, t.cy, 0);
    }
    glEnd();
#endif

    if (m_showInfo) {

        createTexInfo();

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glMatrixMode(GL_TEXTURE);
        glLoadIdentity();

#ifdef GL_ARB_texture_rectangle
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_texInfo);
        glBegin(GL_QUADS);
        {
            glColor4f(1.0, 1.0, 1.0, 0.72);
            glTexCoord2f(0, 0);
            glVertex3f(-0.75, -0.75, 0);

            glTexCoord2f(512, 0);
            glVertex3f(0.75, -0.75, 0);

            glTexCoord2f(512, 512);
            glVertex3f(0.75, 0.75, 0);

            glTexCoord2f(0, 512);
            glVertex3f(-0.75, 0.75, 0);
        }
        glEnd();
#else
        glBindTexture(GL_TEXTURE_2D, m_texInfo);
        glBegin(GL_QUADS);
        {
            glColor4f(1.0, 1.0, 1.0, 0.72);
            glTexCoord2f(0, 0);
            glVertex3f(-0.75, -0.75, 0);

            glTexCoord2f(1, 0);
            glVertex3f(0.75, -0.75, 0);

            glTexCoord2f(1, 1);
            glVertex3f(0.75, 0.75, 0);

            glTexCoord2f(0, 1);
            glVertex3f(-0.75, 0.75, 0);
        }
        glEnd();
#endif
}

}