4#ifndef QBLENDFUNCTIONS_P_H
5#define QBLENDFUNCTIONS_P_H
7#include <QtGui/private/qtguiglobal_p.h>
24template <
typename SRC,
typename T>
25void qt_scale_image_16bit(uchar *destPixels,
int dbpl,
26 const uchar *srcPixels,
int sbpl,
int srch,
27 const QRectF &targetRect,
28 const QRectF &srcRect,
32 qreal sx = srcRect.width() / (qreal) targetRect.width();
33 qreal sy = srcRect.height() / (qreal) targetRect.height();
35 const int ix = 0x00010000 * sx;
36 const int iy = 0x00010000 * sy;
44 QRect tr = targetRect.normalized().toRect();
45 tr = tr.intersected(clip);
48 const int tx1 = tr.left();
49 const int ty1 = tr.top();
57 int dstx = qFloor((tx1 + qreal(0.5) - targetRect.right()) * sx * 65536) + 1;
58 basex = quint32(srcRect.right() * 65536) + dstx;
60 int dstx = qCeil((tx1 + qreal(0.5) - targetRect.left()) * sx * 65536) - 1;
61 basex = quint32(srcRect.left() * 65536) + dstx;
64 int dsty = qFloor((ty1 + qreal(0.5) - targetRect.bottom()) * sy * 65536) + 1;
65 srcy = quint32(srcRect.bottom() * 65536) + dsty;
67 int dsty = qCeil((ty1 + qreal(0.5) - targetRect.top()) * sy * 65536) - 1;
68 srcy = quint32(srcRect.top() * 65536) + dsty;
71 quint16 *dst = ((quint16 *) (destPixels + ty1 * dbpl)) + tx1;
75 const int ystart = srcy >> 16;
76 if (ystart >= srch && iy < 0) {
80 const int xstart = basex >> 16;
81 if (xstart >= (
int)(sbpl/
sizeof(SRC)) && ix < 0) {
85 int yend = (srcy + iy * (h - 1)) >> 16;
86 if (yend < 0 || yend >= srch)
88 int xend = (basex + ix * (w - 1)) >> 16;
89 if (xend < 0 || xend >= (
int)(sbpl/
sizeof(SRC)))
93 const SRC *src = (
const SRC *) (srcPixels + (srcy >> 16) * sbpl);
97 blender.write(&dst[x], src[srcx >> 16]); srcx += ix;
98 blender.write(&dst[x+1], src[srcx >> 16]); srcx += ix;
99 blender.write(&dst[x+2], src[srcx >> 16]); srcx += ix;
100 blender.write(&dst[x+3], src[srcx >> 16]); srcx += ix;
101 blender.write(&dst[x+4], src[srcx >> 16]); srcx += ix;
102 blender.write(&dst[x+5], src[srcx >> 16]); srcx += ix;
103 blender.write(&dst[x+6], src[srcx >> 16]); srcx += ix;
104 blender.write(&dst[x+7], src[srcx >> 16]); srcx += ix;
107 blender.write(&dst[x], src[srcx >> 16]);
110 blender.flush(&dst[x]);
111 dst = (quint16 *)(((uchar *) dst) + dbpl);
117 const uchar *srcPixels,
int sbpl,
int srch,
118 const QRectF &targetRect,
119 const QRectF &srcRect,
123 qreal sx = srcRect.width() / (qreal) targetRect.width();
124 qreal sy = srcRect.height() / (qreal) targetRect.height();
126 const int ix = 0x00010000 * sx;
127 const int iy = 0x00010000 * sy;
135 QRect tr = targetRect.normalized().toRect();
136 tr = tr.intersected(clip);
139 const int tx1 = tr.left();
140 const int ty1 = tr.top();
148 int dstx = qFloor((tx1 + qreal(0.5) - targetRect.right()) * sx * 65536) + 1;
149 basex = quint32(srcRect.right() * 65536) + dstx;
151 int dstx = qCeil((tx1 + qreal(0.5) - targetRect.left()) * sx * 65536) - 1;
152 basex = quint32(srcRect.left() * 65536) + dstx;
155 int dsty = qFloor((ty1 + qreal(0.5) - targetRect.bottom()) * sy * 65536) + 1;
156 srcy = quint32(srcRect.bottom() * 65536) + dsty;
158 int dsty = qCeil((ty1 + qreal(0.5) - targetRect.top()) * sy * 65536) - 1;
159 srcy = quint32(srcRect.top() * 65536) + dsty;
162 quint32 *dst = ((quint32 *) (destPixels + ty1 * dbpl)) + tx1;
166 const int ystart = srcy >> 16;
167 if (ystart >= srch && iy < 0) {
171 const int xstart = basex >> 16;
172 if (xstart >= (
int)(sbpl/
sizeof(quint32)) && ix < 0) {
176 int yend = (srcy + iy * (h - 1)) >> 16;
177 if (yend < 0 || yend >= srch)
179 int xend = (basex + ix * (w - 1)) >> 16;
180 if (xend < 0 || xend >= (
int)(sbpl/
sizeof(quint32)))
184 const uint *src = (
const quint32 *) (srcPixels + (srcy >> 16) * sbpl);
185 quint32 srcx = basex;
188 blender.write(&dst[x], src[srcx >> 16]);
191 blender.flush(&dst[x]);
192 dst = (quint32 *)(((uchar *) dst) + dbpl);
202template <
class SrcT,
class DestT,
class Blender>
204 const SrcT *srcPixels,
int sbpl,
207 const QRect &sourceRect,
209 qreal topY, qreal bottomY,
210 int dudx,
int dvdx,
int dudy,
int dvdy,
int u0,
int v0,
213 qint64 fromY = qMax(qRound(topY), clip.top());
214 qint64 toY = qMin(qRound(bottomY), clip.top() + clip.height());
218 qreal leftSlope = (bottomLeft.x - topLeft.x) / (bottomLeft.y - topLeft.y);
219 qreal rightSlope = (bottomRight.x - topRight.x) / (bottomRight.y - topRight.y);
220 qint64 dx_l = qint64(leftSlope * 0x10000);
221 qint64 dx_r = qint64(rightSlope * 0x10000);
222 qint64 x_l = qint64((topLeft.x + (qreal(0.5) + fromY - topLeft.y) * leftSlope + qreal(0.5)) * 0x10000);
223 qint64 x_r = qint64((topRight.x + (qreal(0.5) + fromY - topRight.y) * rightSlope + qreal(0.5)) * 0x10000);
225 qint64 sourceRectTop = qint64(sourceRect.top());
226 qint64 sourceRectLeft = qint64(sourceRect.left());
227 qint64 sourceRectWidth = qint64(sourceRect.width());
228 qint64 sourceRectHeight = qint64(sourceRect.height());
229 qint64 clipLeft = qint64(clip.left());
230 qint64 clipWidth = qint64(clip.width());
232 qint64 fromX, toX, x1, x2, u, v, i, ii;
234 for (qint64 y = fromY; y < toY; ++y) {
235 line =
reinterpret_cast<DestT *>(
reinterpret_cast<uchar *>(destPixels) + y * dbpl);
237 fromX = qMax(x_l >> 16, clipLeft);
238 toX = qMin(x_r >> 16, clipLeft + clipWidth);
246 u = x1 * dudx + y * dudy + u0;
247 v = x1 * dvdx + y * dvdy + v0;
248 for (; x1 < toX; ++x1) {
251 if (uu >= sourceRectLeft && uu < sourceRectLeft + sourceRectWidth
252 && vv >= sourceRectTop && vv < sourceRectTop + sourceRectHeight) {
261 u = (x2 - 1) * dudx + y * dudy + u0;
262 v = (x2 - 1) * dvdx + y * dvdy + v0;
263 for (; x2 > x1; --x2) {
266 if (uu >= sourceRectLeft && uu < sourceRectLeft + sourceRectWidth
267 && vv >= sourceRectTop && vv < sourceRectTop + sourceRectHeight) {
275 u = fromX * dudx + y * dudy + u0;
276 v = fromX * dvdx + y * dvdy + v0;
282 qint64 uu = qBound(sourceRectLeft, u >> 16, sourceRectLeft + sourceRectWidth - 1);
283 qint64 vv = qBound(sourceRectTop, v >> 16, sourceRectTop + sourceRectHeight - 1);
284 blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + vv * sbpl)[uu]);
296 blender.write(&line[0],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
297 blender.write(&line[1],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
298 blender.write(&line[2],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
299 blender.write(&line[3],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
300 blender.write(&line[4],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
301 blender.write(&line[5],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
302 blender.write(&line[6],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
303 blender.write(&line[7],
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx;
310 case 7: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
311 case 6: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
312 case 5: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
313 case 4: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
314 case 3: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
315 case 2: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line; Q_FALLTHROUGH();
316 case 1: blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + (v >> 16) * sbpl)[u >> 16]); u += dudx; v += dvdx; ++line;
322 qint64 uu = qBound(sourceRectLeft, u >> 16, sourceRectLeft + sourceRectWidth - 1);
323 qint64 vv = qBound(sourceRectTop, v >> 16, sourceRectTop + sourceRectHeight - 1);
324 blender.write(line,
reinterpret_cast<
const SrcT *>(
reinterpret_cast<
const uchar *>(srcPixels) + vv * sbpl)[uu]);
338template <
class SrcT,
class DestT,
class Blender>
340 const SrcT *srcPixels,
int sbpl,
341 const QRectF &targetRect,
342 const QRectF &sourceRect,
344 const QTransform &targetRectTransform,
357 v[TopLeft].u = v[BottomLeft].u = sourceRect.left();
358 v[TopLeft].v = v[TopRight].v = sourceRect.top();
359 v[TopRight].u = v[BottomRight].u = sourceRect.right();
360 v[BottomLeft].v = v[BottomRight].v = sourceRect.bottom();
361 targetRectTransform.map(targetRect.left(), targetRect.top(), &v[TopLeft].x, &v[TopLeft].y);
362 targetRectTransform.map(targetRect.right(), targetRect.top(), &v[TopRight].x, &v[TopRight].y);
363 targetRectTransform.map(targetRect.left(), targetRect.bottom(), &v[BottomLeft].x, &v[BottomLeft].y);
364 targetRectTransform.map(targetRect.right(), targetRect.bottom(), &v[BottomRight].x, &v[BottomRight].y);
368 for (
int i = 1; i < 4; ++i) {
369 if (v[i].y < v[topmost].y)
377 for (
int i = 0; i < 3; ++i)
389 for (
int i = 3; i > 0; --i)
397 qreal dx1 = v[1].x - v[0].x;
398 qreal dy1 = v[1].y - v[0].y;
399 qreal dx2 = v[3].x - v[0].x;
400 qreal dy2 = v[3].y - v[0].y;
401 if (dx1 * dy2 - dx2 * dy1 > 0)
407 qreal det = u.x * w.y - u.y * w.x;
411 qreal invDet = 1.0 / det;
412 qreal m11, m12, m21, m22, mdx, mdy;
414 m11 = (u.u * w.y - u.y * w.u) * invDet;
415 m12 = (u.x * w.u - u.u * w.x) * invDet;
416 m21 = (u.v * w.y - u.y * w.v) * invDet;
417 m22 = (u.x * w.v - u.v * w.x) * invDet;
418 mdx = v[0].u - m11 * v[0].x - m12 * v[0].y;
419 mdy = v[0].v - m21 * v[0].x - m22 * v[0].y;
421 int dudx =
int(m11 * 0x10000);
422 int dvdx =
int(m21 * 0x10000);
423 int dudy =
int(m12 * 0x10000);
424 int dvdy =
int(m22 * 0x10000);
425 int u0 = qCeil((qreal(0.5) * m11 + qreal(0.5) * m12 + mdx) * 0x10000) - 1;
426 int v0 = qCeil((qreal(0.5) * m21 + qreal(0.5) * m22 + mdy) * 0x10000) - 1;
428 int x1 = qFloor(sourceRect.left());
429 int y1 = qFloor(sourceRect.top());
430 int x2 = qCeil(sourceRect.right());
431 int y2 = qCeil(sourceRect.bottom());
432 QRect sourceRectI(x1, y1, x2 - x1, y2 - y1);
435 if (v[1].y < v[3].y) {
436 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[0], v[1], v[0], v[3], sourceRectI, clip, v[0].y, v[1].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
437 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[1], v[2], v[0], v[3], sourceRectI, clip, v[1].y, v[3].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
438 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[1], v[2], v[3], v[2], sourceRectI, clip, v[3].y, v[2].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
440 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[0], v[1], v[0], v[3], sourceRectI, clip, v[0].y, v[3].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
441 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[0], v[1], v[3], v[2], sourceRectI, clip, v[3].y, v[1].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
442 qt_transform_image_rasterize(destPixels, dbpl, srcPixels, sbpl, v[1], v[2], v[3], v[2], sourceRectI, clip, v[1].y, v[2].y, dudx, dvdx, dudy, dvdy, u0, v0, blender);
Combined button and popup list for selecting options.
SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats]
void qt_scale_image_argb32_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int srch, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, int const_alpha)
static void qt_blend_argb32_on_argb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha)
void qInitBlendFunctions()
void qt_blend_argb32_on_rgb16_const_alpha(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha)
static void qt_blend_rgb32_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha)
SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFormats]
void qt_transform_image_rgb32_on_rgb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, const QTransform &targetRectTransform, int const_alpha)
void qt_scale_image_argb32_on_argb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int srch, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, int const_alpha)
void qt_transform_image_argb32_on_argb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, const QTransform &targetRectTransform, int const_alpha)
void qt_transform_image_rgb16_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, const QTransform &targetRectTransform, int const_alpha)
void qt_transform_image_argb32_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, const QTransform &targetRectTransform, int const_alpha)
void qt_blend_rgb32_on_rgb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha)
void qt_scale_image_rgb16_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int srch, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, int const_alpha)
void qt_scale_image_rgb32_on_rgb32(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int srch, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, int const_alpha)
SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats]
void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl, const uchar *src, int sbpl, int w, int h, int const_alpha)
static void qt_blend_argb32_on_rgb16(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha)
void qt_transform_image_rasterize(DestT *destPixels, int dbpl, const SrcT *srcPixels, int sbpl, const QTransformImageVertex &topLeft, const QTransformImageVertex &bottomLeft, const QTransformImageVertex &topRight, const QTransformImageVertex &bottomRight, const QRect &sourceRect, const QRect &clip, qreal topY, qreal bottomY, int dudx, int dvdx, int dudy, int dvdy, int u0, int v0, Blender blender)
void qt_transform_image(DestT *destPixels, int dbpl, const SrcT *srcPixels, int sbpl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clip, const QTransform &targetRectTransform, Blender blender)
void qt_scale_image_32bit(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int srch, const QRectF &targetRect, const QRectF &srcRect, const QRect &clip, T blender)
void(* SrcOverBlendFunc)(uchar *destPixels, int dbpl, const uchar *src, int spbl, int w, int h, int const_alpha)
void(* SrcOverScaleFunc)(uchar *destPixels, int dbpl, const uchar *src, int spbl, int srch, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clipRect, int const_alpha)
void(* SrcOverTransformFunc)(uchar *destPixels, int dbpl, const uchar *src, int spbl, const QRectF &targetRect, const QRectF &sourceRect, const QRect &clipRect, const QTransform &targetRectTransform, int const_alpha)
void write(quint32 *dst, quint32 src)
Blend_ARGB32_on_ARGB32_SourceAndConstAlpha(quint32 alpha)
void write(quint32 *dst, quint32 src)
void write(quint16 *dst, quint32 src)
Blend_ARGB32_on_RGB16_SourceAndConstAlpha(quint32 alpha)
void write(quint16 *dst, quint32 src)
void write(quint16 *dst, quint16 src)
Blend_RGB16_on_RGB16_ConstAlpha(quint32 alpha)
void write(quint16 *dst, quint16 src)
Blend_RGB32_on_RGB32_ConstAlpha(quint32 alpha)
void write(quint32 *dst, quint32 src)
void write(quint32 *dst, quint32 src)
quint16 bytemul(quint16 x) const
uchar alpha(uchar src) const
SourceAndConstAlpha(int a)
quint16 bytemul(quint16 spix) const
uchar alpha(uchar src) const