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

📄 qimagescale.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                        aa += A_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;                        a = ((aa * YAP) + (a * INV_YAP)) >> 16;                        *dptr++ = qRgba(r, g, b, a);                    }                    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;                        a = A_VAL(pix) * INV_YAP;                        pix += sow;                        r += R_VAL(pix) * YAP;                        g += G_VAL(pix) * YAP;                        b += B_VAL(pix) * YAP;                        a += A_VAL(pix) * YAP;                        r >>= 8;                        g >>= 8;                        b >>= 8;                        a >>= 8;                        *dptr++ = qRgba(r, g, b, a);                    }                }            }            else{                for(x = dxx; x < end; x++){                    int r, g, b, a;                    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;                        a = A_VAL(pix) * INV_XAP;                        pix++;                        r += R_VAL(pix) * XAP;                        g += G_VAL(pix) * XAP;                        b += B_VAL(pix) * XAP;                        a += A_VAL(pix) * XAP;                        r >>= 8;                        g >>= 8;                        b >>= 8;                        a >>= 8;                        *dptr++ = qRgba(r, g, b, a);                    }                    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, a, rr, gg, bb, aa;        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;                a = (A_VAL(pix) * yap) >> 10;                for(j = (1 << 14) - yap; j > Cy; j -= Cy){                    pix += sow;                    r += (R_VAL(pix) * Cy) >> 10;                    g += (G_VAL(pix) * Cy) >> 10;                    b += (B_VAL(pix) * Cy) >> 10;                    a += (A_VAL(pix) * Cy) >> 10;                }                if(j > 0){                    pix += sow;                    r += (R_VAL(pix) * j) >> 10;                    g += (G_VAL(pix) * j) >> 10;                    b += (B_VAL(pix) * j) >> 10;                    a += (A_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;                    aa = (A_VAL(pix) * yap) >> 10;                    for(j = (1 << 14) - yap; j > Cy; j -= Cy){                        pix += sow;                        rr += (R_VAL(pix) * Cy) >> 10;                        gg += (G_VAL(pix) * Cy) >> 10;                        bb += (B_VAL(pix) * Cy) >> 10;                        aa += (A_VAL(pix) * Cy) >> 10;                    }                    if(j > 0){                        pix += sow;                        rr += (R_VAL(pix) * j) >> 10;                        gg += (G_VAL(pix) * j) >> 10;                        bb += (B_VAL(pix) * j) >> 10;                        aa += (A_VAL(pix) * j) >> 10;                    }                    r = r * INV_XAP;                    g = g * INV_XAP;                    b = b * INV_XAP;                    a = a * INV_XAP;                    r = (r + ((rr * XAP))) >> 12;                    g = (g + ((gg * XAP))) >> 12;                    b = (b + ((bb * XAP))) >> 12;                    a = (a + ((aa * XAP))) >> 12;                }                else{                    r >>= 4;                    g >>= 4;                    b >>= 4;                    a >>= 4;                }                *dptr = qRgba(r, g, b, a);                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, a, rr, gg, bb, aa;        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;                a = (A_VAL(pix) * xap) >> 10;                for(j = (1 << 14) - xap; j > Cx; j -= Cx){                    pix++;                    r += (R_VAL(pix) * Cx) >> 10;                    g += (G_VAL(pix) * Cx) >> 10;                    b += (B_VAL(pix) * Cx) >> 10;                    a += (A_VAL(pix) * Cx) >> 10;                }                if(j > 0){                    pix++;                    r += (R_VAL(pix) * j) >> 10;                    g += (G_VAL(pix) * j) >> 10;                    b += (B_VAL(pix) * j) >> 10;                    a += (A_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;                    aa = (A_VAL(pix) * xap) >> 10;                    for(j = (1 << 14) - xap; j > Cx; j -= Cx){                        pix++;                        rr += (R_VAL(pix) * Cx) >> 10;                        gg += (G_VAL(pix) * Cx) >> 10;                        bb += (B_VAL(pix) * Cx) >> 10;                        aa += (A_VAL(pix) * Cx) >> 10;                    }                    if(j > 0){                        pix++;                        rr += (R_VAL(pix) * j) >> 10;                        gg += (G_VAL(pix) * j) >> 10;                        bb += (B_VAL(pix) * j) >> 10;                        aa += (A_VAL(pix) * j) >> 10;                    }                    r = r * INV_YAP;                    g = g * INV_YAP;                    b = b * INV_YAP;                    a = a * INV_YAP;                    r = (r + ((rr * YAP))) >> 12;                    g = (g + ((gg * YAP))) >> 12;                    b = (b + ((bb * YAP))) >> 12;                    a = (a + ((aa * YAP))) >> 12;                }                else{                    r >>= 4;                    g >>= 4;                    b >>= 4;                    a >>= 4;                }                *dptr = qRgba(r, g, b, a);                dptr++;            }        }    }    /* if we're scaling down horizontally & vertically */    else{        /*\ 'Correct' version, with math units prepared for MMXification:         |*|  The operation 'b = (b * c) >> 16' translates to pmulhw,         |*|  so the operation 'b = (b * c) >> d' would translate to         |*|  psllw (16 - d), %mmb; pmulh %mmc, %mmb         \*/        int Cx, Cy, i, j;        unsigned int *pix;        int a, r, g, b, ax, 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;                ax = (A_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;                    ax += (A_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;                    ax += (A_VAL(pix) * i) >> 9;                }                r = (rx * yap) >> 14;                g = (gx * yap) >> 14;                b = (bx * yap) >> 14;                a = (ax * 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;                    ax = (A_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;                        ax += (A_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;                        ax += (A_VAL(pix) * i) >> 9;                    }                    r += (rx * Cy) >> 14;                    g += (gx * Cy) >> 14;                    b += (bx * Cy) >> 14;                    a += (ax * 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;                    ax = (A_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;                        ax += (A_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;                        ax += (A_VAL(pix) * i) >> 9;                    }                    r += (rx * j) >> 14;                    g += (gx * j) >> 14;                    b += (bx * j) >> 14;                    a += (ax * j) >> 14;                }                *dptr = qRgba(r >> 5, g >> 5, b >> 5, a >> 5);                dptr++;            }        }    }}/* scale by area sampling - IGNORE the ALPHA byte*/static void qt_qimageScaleAARGB(QImageScaleInfo *isi, unsigned int *dest,                                int dxx, int dyy, int dx, int dy, int dw,                                int dh, int dow, int sow){    unsigned int *sptr, *dptr;    int x, y, end;    unsigned int **ypoints = isi->ypoints;    int *xpoints = isi->xpoints;    int *xapoints = isi->xapoints;    int *yapoints = isi->yapoints;    end = dxx + dw;    /* scaling up both ways */    if(isi->xup_yup == 3){        /* go through every scanline in the output buffer */        for(y = 0; y < dh; y++){            /* calculate the source line we'll scan from */            dptr = dest + dx + ((y + dy) * dow);            sptr = ypoints[dyy + y];            if(YAP > 0){                for(x = dxx; x < end; x++){                    int r = 0, g = 0, b = 0;                    int rr = 0, gg = 0, bb = 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;

⌨️ 快捷键说明

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