⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qimagescale.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                        pix += sow;                        rr = R_VAL(pix) * XAP;                        gg = G_VAL(pix) * XAP;                        bb = B_VAL(pix) * XAP;                        pix --;                        rr += R_VAL(pix) * INV_XAP;                        gg += G_VAL(pix) * INV_XAP;                        bb += B_VAL(pix) * INV_XAP;                        r = ((rr * YAP) + (r * INV_YAP)) >> 16;                        g = ((gg * YAP) + (g * INV_YAP)) >> 16;                        b = ((bb * YAP) + (b * INV_YAP)) >> 16;                        *dptr++ = qRgba(r, g, b, 0xff);                    }                    else{                        pix = ypoints[dyy + y] + xpoints[x];                        r = R_VAL(pix) * INV_YAP;                        g = G_VAL(pix) * INV_YAP;                        b = B_VAL(pix) * INV_YAP;                        pix += sow;                        r += R_VAL(pix) * YAP;                        g += G_VAL(pix) * YAP;                        b += B_VAL(pix) * YAP;                        r >>= 8;                        g >>= 8;                        b >>= 8;                        *dptr++ = qRgba(r, g, b, 0xff);                    }                }            }            else{                for(x = dxx; x < end; x++){                    int r = 0, g = 0, b = 0;                    unsigned int *pix;                    if(XAP > 0){                        pix = ypoints[dyy + y] + xpoints[x];                        r = R_VAL(pix) * INV_XAP;                        g = G_VAL(pix) * INV_XAP;                        b = B_VAL(pix) * INV_XAP;                        pix++;                        r += R_VAL(pix) * XAP;                        g += G_VAL(pix) * XAP;                        b += B_VAL(pix) * XAP;                        r >>= 8;                        g >>= 8;                        b >>= 8;                        *dptr++ = qRgba(r, g, b, 0xff);                    }                    else                        *dptr++ = sptr[xpoints[x] ];                }            }        }    }    /* if we're scaling down vertically */    else if(isi->xup_yup == 1){        /*\ 'Correct' version, with math units prepared for MMXification \*/        int Cy, j;        unsigned int *pix;        int r, g, b, rr, gg, bb;        int yap;        /* go through every scanline in the output buffer */        for(y = 0; y < dh; y++){            Cy = YAP >> 16;            yap = YAP & 0xffff;            dptr = dest + dx + ((y + dy) * dow);            for(x = dxx; x < end; x++){                pix = ypoints[dyy + y] + xpoints[x];                r = (R_VAL(pix) * yap) >> 10;                g = (G_VAL(pix) * yap) >> 10;                b = (B_VAL(pix) * yap) >> 10;                pix += sow;                for(j = (1 << 14) - yap; j > Cy; j -= Cy){                    r += (R_VAL(pix) * Cy) >> 10;                    g += (G_VAL(pix) * Cy) >> 10;                    b += (B_VAL(pix) * Cy) >> 10;                    pix += sow;                }                if(j > 0){                    r += (R_VAL(pix) * j) >> 10;                    g += (G_VAL(pix) * j) >> 10;                    b += (B_VAL(pix) * j) >> 10;                }                if(XAP > 0){                    pix = ypoints[dyy + y] + xpoints[x] + 1;                    rr = (R_VAL(pix) * yap) >> 10;                    gg = (G_VAL(pix) * yap) >> 10;                    bb = (B_VAL(pix) * yap) >> 10;                    pix += sow;                    for(j = (1 << 14) - yap; j > Cy; j -= Cy){                        rr += (R_VAL(pix) * Cy) >> 10;                        gg += (G_VAL(pix) * Cy) >> 10;                        bb += (B_VAL(pix) * Cy) >> 10;                        pix += sow;                    }                    if(j > 0){                        rr += (R_VAL(pix) * j) >> 10;                        gg += (G_VAL(pix) * j) >> 10;                        bb += (B_VAL(pix) * j) >> 10;                    }                    r = r * INV_XAP;                    g = g * INV_XAP;                    b = b * INV_XAP;                    r = (r + ((rr * XAP))) >> 12;                    g = (g + ((gg * XAP))) >> 12;                    b = (b + ((bb * XAP))) >> 12;                }                else{                    r >>= 4;                    g >>= 4;                    b >>= 4;                }                *dptr = qRgba(r, g, b, 0xff);                dptr++;            }        }    }    /* if we're scaling down horizontally */    else if(isi->xup_yup == 2){        /*\ 'Correct' version, with math units prepared for MMXification \*/        int Cx, j;        unsigned int *pix;        int r, g, b, rr, gg, bb;        int xap;        /* go through every scanline in the output buffer */        for(y = 0; y < dh; y++){            dptr = dest + dx + ((y + dy) * dow);            for(x = dxx; x < end; x++){                Cx = XAP >> 16;                xap = XAP & 0xffff;                pix = ypoints[dyy + y] + xpoints[x];                r = (R_VAL(pix) * xap) >> 10;                g = (G_VAL(pix) * xap) >> 10;                b = (B_VAL(pix) * xap) >> 10;                pix++;                for(j = (1 << 14) - xap; j > Cx; j -= Cx){                    r += (R_VAL(pix) * Cx) >> 10;                    g += (G_VAL(pix) * Cx) >> 10;                    b += (B_VAL(pix) * Cx) >> 10;                    pix++;                }                if(j > 0){                    r += (R_VAL(pix) * j) >> 10;                    g += (G_VAL(pix) * j) >> 10;                    b += (B_VAL(pix) * j) >> 10;                }                if(YAP > 0){                    pix = ypoints[dyy + y] + xpoints[x] + sow;                    rr = (R_VAL(pix) * xap) >> 10;                    gg = (G_VAL(pix) * xap) >> 10;                    bb = (B_VAL(pix) * xap) >> 10;                    pix++;                    for(j = (1 << 14) - xap; j > Cx; j -= Cx){                        rr += (R_VAL(pix) * Cx) >> 10;                        gg += (G_VAL(pix) * Cx) >> 10;                        bb += (B_VAL(pix) * Cx) >> 10;                        pix++;                    }                    if(j > 0){                        rr += (R_VAL(pix) * j) >> 10;                        gg += (G_VAL(pix) * j) >> 10;                        bb += (B_VAL(pix) * j) >> 10;                    }                    r = r * INV_YAP;                    g = g * INV_YAP;                    b = b * INV_YAP;                    r = (r + ((rr * YAP))) >> 12;                    g = (g + ((gg * YAP))) >> 12;                    b = (b + ((bb * YAP))) >> 12;                }                else{                    r >>= 4;                    g >>= 4;                    b >>= 4;                }                *dptr = qRgba(r, g, b, 0xff);                dptr++;            }        }    }    /* fully optimized (i think) - onyl change of algorithm can help */    /* if we're scaling down horizontally & vertically */    else{        /*\ 'Correct' version, with math units prepared for MMXification \*/        int Cx, Cy, i, j;        unsigned int *pix;        int r, g, b, rx, gx, bx;        int xap, yap;        for(y = 0; y < dh; y++){            Cy = YAP >> 16;            yap = YAP & 0xffff;            dptr = dest + dx + ((y + dy) * dow);            for(x = dxx; x < end; x++){                Cx = XAP >> 16;                xap = XAP & 0xffff;                sptr = ypoints[dyy + y] + xpoints[x];                pix = sptr;                sptr += sow;                rx = (R_VAL(pix) * xap) >> 9;                gx = (G_VAL(pix) * xap) >> 9;                bx = (B_VAL(pix) * xap) >> 9;                pix++;                for(i = (1 << 14) - xap; i > Cx; i -= Cx){                    rx += (R_VAL(pix) * Cx) >> 9;                    gx += (G_VAL(pix) * Cx) >> 9;                    bx += (B_VAL(pix) * Cx) >> 9;                    pix++;                }                if(i > 0){                    rx += (R_VAL(pix) * i) >> 9;                    gx += (G_VAL(pix) * i) >> 9;                    bx += (B_VAL(pix) * i) >> 9;                }                r = (rx * yap) >> 14;                g = (gx * yap) >> 14;                b = (bx * yap) >> 14;                for(j = (1 << 14) - yap; j > Cy; j -= Cy){                    pix = sptr;                    sptr += sow;                    rx = (R_VAL(pix) * xap) >> 9;                    gx = (G_VAL(pix) * xap) >> 9;                    bx = (B_VAL(pix) * xap) >> 9;                    pix++;                    for(i = (1 << 14) - xap; i > Cx; i -= Cx){                        rx += (R_VAL(pix) * Cx) >> 9;                        gx += (G_VAL(pix) * Cx) >> 9;                        bx += (B_VAL(pix) * Cx) >> 9;                        pix++;                    }                    if(i > 0){                        rx += (R_VAL(pix) * i) >> 9;                        gx += (G_VAL(pix) * i) >> 9;                        bx += (B_VAL(pix) * i) >> 9;                    }                    r += (rx * Cy) >> 14;                    g += (gx * Cy) >> 14;                    b += (bx * Cy) >> 14;                }                if(j > 0){                    pix = sptr;                    sptr += sow;                    rx = (R_VAL(pix) * xap) >> 9;                    gx = (G_VAL(pix) * xap) >> 9;                    bx = (B_VAL(pix) * xap) >> 9;                    pix++;                    for(i = (1 << 14) - xap; i > Cx; i -= Cx){                        rx += (R_VAL(pix) * Cx) >> 9;                        gx += (G_VAL(pix) * Cx) >> 9;                        bx += (B_VAL(pix) * Cx) >> 9;                        pix++;                    }                    if(i > 0){                        rx += (R_VAL(pix) * i) >> 9;                        gx += (G_VAL(pix) * i) >> 9;                        bx += (B_VAL(pix) * i) >> 9;                    }                    r += (rx * j) >> 14;                    g += (gx * j) >> 14;                    b += (bx * j) >> 14;                }                *dptr = qRgb(r >> 5, g >> 5, b >> 5);                dptr++;            }        }    }}#if 0static void qt_qimageScaleAARGBASetup(QImageScaleInfo *isi, unsigned int *dest,                                      int dxx, int dyy, int dx, int dy, int dw,                                      int dh, int dow, int sow){    qInitDrawhelperAsm();    qt_qimageScaleAARGBA(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow);}static void qt_qimageScaleAARGBSetup(QImageScaleInfo *isi, unsigned int *dest,                                 int dxx, int dyy, int dx, int dy, int dw,                                 int dh, int dow, int sow){    qInitDrawhelperAsm();    qt_qimageScaleAARGB(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow);}#endifQImage qSmoothScaleImageAutoConvert(QImage &src, int dw, int dh){    QImage buffer;    if (src.isNull())        return buffer;    if (src.format() == QImage::Format_ARGB32_Premultiplied)        src = src.convertToFormat(QImage::Format_ARGB32);    else if (src.depth() < 32) {        if (src.hasAlphaChannel())            src = src.convertToFormat(QImage::Format_ARGB32);        else            src = src.convertToFormat(QImage::Format_RGB32);    }    return qSmoothScaleImage(src, dw, dh);}QImage qSmoothScaleImage(const QImage &src, int dw, int dh){    QImage buffer;    if (src.isNull() || dw <= 0 || dh <= 0)        return buffer;    int w = src.width();    int h = src.height();    QImageScaleInfo *scaleinfo =        qimageCalcScaleInfo(src, w, h, dw, dh, true);    if (!scaleinfo)        return buffer;    buffer = QImage(dw, dh, src.format());    if (buffer.isNull()) {        qWarning("QImage: out of memory, returning null");        return QImage();    }    if (src.format() == QImage::Format_ARGB32)        qt_qimageScaleArgb(scaleinfo, (unsigned int *)buffer.scanLine(0),                           0, 0, 0, 0, dw, dh, dw, w);    else        qt_qimageScaleRgb(scaleinfo, (unsigned int *)buffer.scanLine(0),                          0, 0, 0, 0, dw, dh, dw, w);    qimageFreeScaleInfo(scaleinfo);    return buffer;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -