📄 qimagescale.cpp
字号:
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 + -