18#include "kis_global.h"
19#include "kis_background.h"
20#include "kis_integer_maths.h"
22KisBackground::KisBackground()
25 m_patternTile = TQImage(PATTERN_WIDTH, PATTERN_HEIGHT, 32);
26 m_patternTile.setAlphaBuffer(
false);
28 for (
int y = 0; y < PATTERN_HEIGHT; y++)
30 for (
int x = 0; x < PATTERN_WIDTH; x++)
32 TQ_UINT8 v = 128 + 63 * ((x / 16 + y / 16) % 2);
33 m_patternTile.setPixel(x, y, tqRgb(v, v, v));
38KisBackground::~KisBackground()
42const TQImage& KisBackground::patternTile()
const
47void KisBackground::paintBackground(TQImage image,
int imageLeftX,
int imageTopY)
51 if (imageLeftX >= 0) {
52 patternLeftX = imageLeftX % PATTERN_WIDTH;
54 patternLeftX = (PATTERN_WIDTH - (-imageLeftX % PATTERN_WIDTH)) % PATTERN_WIDTH;
60 patternTopY = imageTopY % PATTERN_HEIGHT;
62 patternTopY = (PATTERN_HEIGHT - (-imageTopY % PATTERN_HEIGHT)) % PATTERN_HEIGHT;
65 int imageWidth = image.width();
66 int imageHeight = image.height();
68 int patternY = patternTopY;
70 for (
int y = 0; y < imageHeight; y++)
72 TQRgb *imagePixelPtr =
reinterpret_cast<TQRgb *
>(image.scanLine(y));
73 const TQRgb *patternScanLine =
reinterpret_cast<const TQRgb *
>(m_patternTile.scanLine(patternY));
74 int patternX = patternLeftX;
76 for (
int x = 0; x < imageWidth; x++)
78 TQRgb imagePixel = *imagePixelPtr;
79 TQ_UINT8 imagePixelAlpha = tqAlpha(imagePixel);
81 if (imagePixelAlpha != 255) {
83 TQRgb patternPixel = patternScanLine[patternX];
84 TQ_UINT8 imageRed = UINT8_BLEND(tqRed(imagePixel), tqRed(patternPixel), imagePixelAlpha);
85 TQ_UINT8 imageGreen = UINT8_BLEND(tqGreen(imagePixel), tqGreen(patternPixel), imagePixelAlpha);
86 TQ_UINT8 imageBlue = UINT8_BLEND(tqBlue(imagePixel), tqBlue(patternPixel), imagePixelAlpha);
88 *imagePixelPtr = tqRgba(imageRed, imageGreen, imageBlue, 255);
94 if (patternX == PATTERN_WIDTH) {
101 if (patternY == PATTERN_HEIGHT) {
107void KisBackground::paintBackground(TQImage img,
const TQRect& scaledImageRect,
const TQSize& scaledImageSize,
const TQSize& imageSize)
109 if (scaledImageRect.isEmpty() || scaledImageSize.isEmpty() || imageSize.isEmpty()) {
113 Q_ASSERT(img.size() == scaledImageRect.size());
115 if (img.size() != scaledImageRect.size()) {
119 TQ_INT32 imageWidth = imageSize.width();
120 TQ_INT32 imageHeight = imageSize.height();
122 for (TQ_INT32 y = 0; y < scaledImageRect.height(); ++y) {
124 TQ_INT32 scaledY = scaledImageRect.y() + y;
125 TQ_INT32 srcY = (scaledY * imageHeight) / scaledImageSize.height();
126 TQ_INT32 patternY = srcY % PATTERN_HEIGHT;
128 TQRgb *imagePixelPtr =
reinterpret_cast<TQRgb *
>(img.scanLine(y));
129 const TQRgb *patternScanLine =
reinterpret_cast<const TQRgb *
>(m_patternTile.scanLine(patternY));
131 for (TQ_INT32 x = 0; x < scaledImageRect.width(); ++x) {
133 TQRgb imagePixel = *imagePixelPtr;
134 TQ_UINT8 imagePixelAlpha = tqAlpha(imagePixel);
136 if (imagePixelAlpha != 255) {
138 TQ_INT32 scaledX = scaledImageRect.x() + x;
139 TQ_INT32 srcX = (scaledX * imageWidth) / scaledImageSize.width();
140 TQ_INT32 patternX = srcX % PATTERN_WIDTH;
142 TQRgb patternPixel = patternScanLine[patternX];
143 TQ_UINT8 imageRed = UINT8_BLEND(tqRed(imagePixel), tqRed(patternPixel), imagePixelAlpha);
144 TQ_UINT8 imageGreen = UINT8_BLEND(tqGreen(imagePixel), tqGreen(patternPixel), imagePixelAlpha);
145 TQ_UINT8 imageBlue = UINT8_BLEND(tqBlue(imagePixel), tqBlue(patternPixel), imagePixelAlpha);
147 *imagePixelPtr = tqRgba(imageRed, imageGreen, imageBlue, 255);