Make distance field image width variable.
The distance field generator was always returning a 64x64 pixels image. It now returns an image with a variable width (width of the represented glyph) and always a height of 64px. Change-Id: Id5f11a50a8031ebca10cd4803adf179ccde6db26 Reviewed-by: Kim M. Kalland <kim.kalland@nokia.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
This commit is contained in:
parent
290655c8a2
commit
68c90dd9b3
@ -487,9 +487,9 @@ static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vert
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfScale, int offs)
|
static QImage makeDistanceField(int imgWidth, int imgHeight, const QPainterPath &path, int dfScale, int offs)
|
||||||
{
|
{
|
||||||
QImage image(imgSize, imgSize, QImage::Format_Indexed8);
|
QImage image(imgWidth, imgHeight, QImage::Format_Indexed8);
|
||||||
|
|
||||||
if (path.isEmpty()) {
|
if (path.isEmpty()) {
|
||||||
image.fill(0);
|
image.fill(0);
|
||||||
@ -507,8 +507,8 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
const qint32 interiorColor = -0x7f80; // 8:8 signed format, -127.5
|
const qint32 interiorColor = -0x7f80; // 8:8 signed format, -127.5
|
||||||
const qint32 exteriorColor = 0x7f80; // 8:8 signed format, 127.5
|
const qint32 exteriorColor = 0x7f80; // 8:8 signed format, 127.5
|
||||||
|
|
||||||
QScopedArrayPointer<qint32> bits(new qint32[imgSize * imgSize]);
|
QScopedArrayPointer<qint32> bits(new qint32[imgWidth * imgHeight]);
|
||||||
for (int i = 0; i < imgSize * imgSize; ++i)
|
for (int i = 0; i < imgWidth * imgHeight; ++i)
|
||||||
bits[i] = exteriorColor;
|
bits[i] = exteriorColor;
|
||||||
|
|
||||||
const qreal angleStep = qreal(15 * 3.141592653589793238 / 180);
|
const qreal angleStep = qreal(15 * 3.141592653589793238 / 180);
|
||||||
@ -521,7 +521,7 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
QVarLengthArray<bool> isConvex;
|
QVarLengthArray<bool> isConvex;
|
||||||
QVarLengthArray<bool> needsClipping;
|
QVarLengthArray<bool> needsClipping;
|
||||||
|
|
||||||
drawPolygons(bits.data(), imgSize, imgSize, pathVertices.data(), indices, pathIndices.size(),
|
drawPolygons(bits.data(), imgWidth, imgHeight, pathVertices.data(), indices, pathIndices.size(),
|
||||||
interiorColor);
|
interiorColor);
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
@ -553,8 +553,8 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
normals.append(n);
|
normals.append(n);
|
||||||
QPoint v(to.x() + 0x7f, to.y() + 0x7f);
|
QPoint v(to.x() + 0x7f, to.y() + 0x7f);
|
||||||
vertices.append(v);
|
vertices.append(v);
|
||||||
needsClipping.append((to.x() < offs << 8) || (to.x() >= (imgSize - offs) << 8)
|
needsClipping.append((to.x() < offs << 8) || (to.x() >= (imgWidth - offs) << 8)
|
||||||
|| (to.y() < offs << 8) || (to.y() >= (imgSize - offs) << 8));
|
|| (to.y() < offs << 8) || (to.y() >= (imgHeight - offs) << 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
isConvex.resize(normals.count());
|
isConvex.resize(normals.count());
|
||||||
@ -581,12 +581,12 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
intNext.ry() += n.y();
|
intNext.ry() += n.y();
|
||||||
|
|
||||||
if (needsClipping[prev] || needsClipping[next]) {
|
if (needsClipping[prev] || needsClipping[next]) {
|
||||||
drawRectangle<Clip>(bits.data(), imgSize, imgSize,
|
drawRectangle<Clip>(bits.data(), imgWidth, imgHeight,
|
||||||
&intPrev, &vertices.at(prev), &extPrev,
|
&intPrev, &vertices.at(prev), &extPrev,
|
||||||
&intNext, &vertices.at(next), &extNext,
|
&intNext, &vertices.at(next), &extNext,
|
||||||
exteriorColor);
|
exteriorColor);
|
||||||
} else {
|
} else {
|
||||||
drawRectangle<NoClip>(bits.data(), imgSize, imgSize,
|
drawRectangle<NoClip>(bits.data(), imgWidth, imgHeight,
|
||||||
&intPrev, &vertices.at(prev), &extPrev,
|
&intPrev, &vertices.at(prev), &extPrev,
|
||||||
&intNext, &vertices.at(next), &extNext,
|
&intNext, &vertices.at(next), &extNext,
|
||||||
exteriorColor);
|
exteriorColor);
|
||||||
@ -602,14 +602,14 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
|
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
|
||||||
p.rx() = vertices.at(prev).x() - normals.at(prev).x();
|
p.rx() = vertices.at(prev).x() - normals.at(prev).x();
|
||||||
p.ry() = vertices.at(prev).y() - normals.at(prev).y();
|
p.ry() = vertices.at(prev).y() - normals.at(prev).y();
|
||||||
drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<Clip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&extPrev, &p, exteriorColor);
|
&extPrev, &p, exteriorColor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.rx() = vertices.at(prev).x() - n.x();
|
p.rx() = vertices.at(prev).x() - n.x();
|
||||||
p.ry() = vertices.at(prev).y() - n.y();
|
p.ry() = vertices.at(prev).y() - n.y();
|
||||||
drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<Clip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&extPrev, &p, exteriorColor);
|
&extPrev, &p, exteriorColor);
|
||||||
extPrev = p;
|
extPrev = p;
|
||||||
}
|
}
|
||||||
@ -621,14 +621,14 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
|
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
|
||||||
p.rx() = vertices.at(prev).x() - normals.at(prev).x();
|
p.rx() = vertices.at(prev).x() - normals.at(prev).x();
|
||||||
p.ry() = vertices.at(prev).y() - normals.at(prev).y();
|
p.ry() = vertices.at(prev).y() - normals.at(prev).y();
|
||||||
drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<NoClip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&extPrev, &p, exteriorColor);
|
&extPrev, &p, exteriorColor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.rx() = vertices.at(prev).x() - n.x();
|
p.rx() = vertices.at(prev).x() - n.x();
|
||||||
p.ry() = vertices.at(prev).y() - n.y();
|
p.ry() = vertices.at(prev).y() - n.y();
|
||||||
drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<NoClip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&extPrev, &p, exteriorColor);
|
&extPrev, &p, exteriorColor);
|
||||||
extPrev = p;
|
extPrev = p;
|
||||||
}
|
}
|
||||||
@ -643,14 +643,14 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
|
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
|
||||||
p.rx() = vertices.at(prev).x() + normals.at(prev).x();
|
p.rx() = vertices.at(prev).x() + normals.at(prev).x();
|
||||||
p.ry() = vertices.at(prev).y() + normals.at(prev).y();
|
p.ry() = vertices.at(prev).y() + normals.at(prev).y();
|
||||||
drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<Clip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&p, &intPrev, interiorColor);
|
&p, &intPrev, interiorColor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.rx() = vertices.at(prev).x() + n.x();
|
p.rx() = vertices.at(prev).x() + n.x();
|
||||||
p.ry() = vertices.at(prev).y() + n.y();
|
p.ry() = vertices.at(prev).y() + n.y();
|
||||||
drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<Clip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&p, &intPrev, interiorColor);
|
&p, &intPrev, interiorColor);
|
||||||
intPrev = p;
|
intPrev = p;
|
||||||
}
|
}
|
||||||
@ -662,14 +662,14 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
|
if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
|
||||||
p.rx() = vertices.at(prev).x() + normals.at(prev).x();
|
p.rx() = vertices.at(prev).x() + normals.at(prev).x();
|
||||||
p.ry() = vertices.at(prev).y() + normals.at(prev).y();
|
p.ry() = vertices.at(prev).y() + normals.at(prev).y();
|
||||||
drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<NoClip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&p, &intPrev, interiorColor);
|
&p, &intPrev, interiorColor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.rx() = vertices.at(prev).x() + n.x();
|
p.rx() = vertices.at(prev).x() + n.x();
|
||||||
p.ry() = vertices.at(prev).y() + n.y();
|
p.ry() = vertices.at(prev).y() + n.y();
|
||||||
drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
|
drawTriangle<NoClip>(bits.data(), imgWidth, imgHeight, &vertices.at(prev),
|
||||||
&p, &intPrev, interiorColor);
|
&p, &intPrev, interiorColor);
|
||||||
intPrev = p;
|
intPrev = p;
|
||||||
}
|
}
|
||||||
@ -683,8 +683,8 @@ static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfSca
|
|||||||
const qint32 *inLine = bits.data();
|
const qint32 *inLine = bits.data();
|
||||||
uchar *outLine = image.bits();
|
uchar *outLine = image.bits();
|
||||||
int padding = image.bytesPerLine() - image.width();
|
int padding = image.bytesPerLine() - image.width();
|
||||||
for (int y = 0; y < imgSize; ++y) {
|
for (int y = 0; y < imgHeight; ++y) {
|
||||||
for (int x = 0; x < imgSize; ++x, ++inLine, ++outLine)
|
for (int x = 0; x < imgWidth; ++x, ++inLine, ++outLine)
|
||||||
*outLine = uchar((0x7f80 - *inLine) >> 8);
|
*outLine = uchar((0x7f80 - *inLine) >> 8);
|
||||||
outLine += padding;
|
outLine += padding;
|
||||||
}
|
}
|
||||||
@ -765,7 +765,11 @@ bool qt_fontHasNarrowOutlines(const QRawFont &f)
|
|||||||
|
|
||||||
static QImage renderDistanceFieldPath(const QPainterPath &path, bool doubleResolution)
|
static QImage renderDistanceFieldPath(const QPainterPath &path, bool doubleResolution)
|
||||||
{
|
{
|
||||||
QImage im = makeDistanceField(QT_DISTANCEFIELD_TILESIZE(doubleResolution),
|
int dfMargin = QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution);
|
||||||
|
int glyphWidth = qCeil(path.boundingRect().width() / QT_DISTANCEFIELD_SCALE(doubleResolution)) + dfMargin * 2;
|
||||||
|
|
||||||
|
QImage im = makeDistanceField(glyphWidth,
|
||||||
|
QT_DISTANCEFIELD_TILESIZE(doubleResolution),
|
||||||
path,
|
path,
|
||||||
QT_DISTANCEFIELD_SCALE(doubleResolution),
|
QT_DISTANCEFIELD_SCALE(doubleResolution),
|
||||||
QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution));
|
QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution));
|
||||||
|
Loading…
Reference in New Issue
Block a user