[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freetype2-demos] master 98fec41 1/3: [ftinspect] Display rendered glyph
From: |
Werner LEMBERG |
Subject: |
[freetype2-demos] master 98fec41 1/3: [ftinspect] Display rendered glyph bitmaps. |
Date: |
Wed, 11 May 2016 10:43:48 +0000 (UTC) |
branch: master
commit 98fec41d92795880fe3dabe5c98b3988c15b1643
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>
[ftinspect] Display rendered glyph bitmaps.
* src/ftinspect.cpp (Engine::update): Updated.
(GlyphBitmap::GlyphBitmap, GlyphBitmap::~GlyphBitmap,
GlyphBitmap::boundRect, GlyphBitmap::paint): New methods
for constructing a rendered bitmap of the glyph.
(MainGUI::checkAntiAliasing): Updated.
(MainGUI::setGraphicsDefaults): Create color mapping tables for 8bit
and 1bit pixmaps as needed by Qt.
(MainGUI::drawGlyph): Honor `show bitmap' check box.
(MainGUI::createLayout, MainGUI::setDefaults): Updated.
(MainGUI::createConnections): Handle `showBitmapCheckBox'.
* src/ftinspect.h (GlyphBitmap): New class, derived from
`QGraphicsItem'.
(MainGUI): Mew member `currentGlyphBitmapItem'.
New members `grayColorTable' and `monoColorTable'.
Updated.
(Engine): Remove unused `showBitmap' member.
---
ChangeLog | 22 +++++++++
src/ftinspect.cpp | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++--
src/ftinspect.h | 31 ++++++++++++-
3 files changed, 182 insertions(+), 5 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ef9c951..9f8377c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
2016-05-10 Werner Lemberg <address@hidden>
+ [ftinspect] Display rendered glyph bitmaps.
+
+ * src/ftinspect.cpp (Engine::update): Updated.
+ (GlyphBitmap::GlyphBitmap, GlyphBitmap::~GlyphBitmap,
+ GlyphBitmap::boundRect, GlyphBitmap::paint): New methods
+ for constructing a rendered bitmap of the glyph.
+ (MainGUI::checkAntiAliasing): Updated.
+ (MainGUI::setGraphicsDefaults): Create color mapping tables for 8bit
+ and 1bit pixmaps as needed by Qt.
+ (MainGUI::drawGlyph): Honor `show bitmap' check box.
+ (MainGUI::createLayout, MainGUI::setDefaults): Updated.
+ (MainGUI::createConnections): Handle `showBitmapCheckBox'.
+
+ * src/ftinspect.h (GlyphBitmap): New class, derived from
+ `QGraphicsItem'.
+ (MainGUI): Mew member `currentGlyphBitmapItem'.
+ New members `grayColorTable' and `monoColorTable'.
+ Updated.
+ (Engine): Remove unused `showBitmap' member.
+
+2016-05-10 Werner Lemberg <address@hidden>
+
[ftinspect] Make hinting mode selection work.
* src/ftinspect.cpp (Engine::loadFont): Set font type.
diff --git a/src/ftinspect.cpp b/src/ftinspect.cpp
index 5713e72..5a782b6 100644
--- a/src/ftinspect.cpp
+++ b/src/ftinspect.cpp
@@ -448,8 +448,6 @@ Engine::update()
showSegments = gui->segmentDrawingCheckBox->isChecked();
doWarping = gui->warpingCheckBox->isChecked();
- showBitmap = gui->showBitmapCheckBox->isChecked();
-
gamma = gui->gammaSlider->value();
loadFlags = FT_LOAD_DEFAULT;
@@ -974,6 +972,97 @@ GlyphPointNumbers::paint(QPainter* painter,
}
+GlyphBitmap::GlyphBitmap(FT_Outline* outline,
+ FT_Library lib,
+ int pxlMode,
+ const QVector<QRgb>& monoColorTbl,
+ const QVector<QRgb>& grayColorTbl)
+: library(lib),
+ pixelMode(pxlMode),
+ monoColorTable(monoColorTbl),
+ grayColorTable(grayColorTbl)
+{
+ // make a copy of the outline since we are going to manipulate it
+ FT_Outline_New(library,
+ outline->n_points,
+ outline->n_contours,
+ &transformed);
+ FT_Outline_Copy(outline, &transformed);
+
+ FT_BBox cbox;
+ FT_Outline_Get_CBox(outline, &cbox);
+
+ cbox.xMin &= ~63;
+ cbox.yMin &= ~63;
+ cbox.xMax = (cbox.xMax + 63) & ~63;
+ cbox.yMax = (cbox.yMax + 63) & ~63;
+
+ // we shift the outline to the origin for rendering later on
+ FT_Outline_Translate(&transformed, -cbox.xMin, -cbox.yMin);
+
+ bRect.setCoords(cbox.xMin / 64, -cbox.yMax / 64,
+ cbox.xMax / 64, -cbox.yMin / 64);
+}
+
+
+GlyphBitmap::~GlyphBitmap()
+{
+ FT_Outline_Done(library, &transformed);
+}
+
+
+QRectF
+GlyphBitmap::boundingRect() const
+{
+ return bRect;
+}
+
+
+void
+GlyphBitmap::paint(QPainter* painter,
+ const QStyleOptionGraphicsItem*,
+ QWidget*)
+{
+ FT_Bitmap bitmap;
+
+ int height = bRect.height();
+ int width = bRect.width();
+ QImage::Format format = QImage::Format_Indexed8;
+
+ // XXX cover LCD and color
+ if (pixelMode == FT_PIXEL_MODE_MONO)
+ format = QImage::Format_Mono;
+
+ QImage image(QSize(width, height), format);
+
+ if (pixelMode == FT_PIXEL_MODE_MONO)
+ image.setColorTable(monoColorTable);
+ else
+ image.setColorTable(grayColorTable);
+
+ image.fill(0);
+
+ bitmap.rows = height;
+ bitmap.width = width;
+ bitmap.buffer = const_cast<uchar*>(image.constBits());
+ bitmap.pitch = image.bytesPerLine();
+ bitmap.pixel_mode = pixelMode;
+
+ FT_Error error = FT_Outline_Get_Bitmap(library,
+ &transformed,
+ &bitmap);
+ if (error)
+ {
+ // XXX error handling
+ return;
+ }
+
+ painter->drawImage(QPoint(bRect.left(), bRect.top()),
+ image.convertToFormat(
+ QImage::Format_ARGB32_Premultiplied));
+}
+
+
MainGUI::MainGUI()
{
engine = NULL;
@@ -1333,6 +1422,8 @@ MainGUI::checkAntiAliasing()
lcdFilterLabel->setEnabled(true);
lcdFilterComboBox->setEnabled(true);
}
+
+ drawGlyph();
}
@@ -1589,6 +1680,17 @@ MainGUI::zoom()
void
MainGUI::setGraphicsDefaults()
{
+ // color tables (with suitable opacity values) for converting
+ // FreeType's pixmaps to something Qt understands
+ monoColorTable.append(0x00FFFFFF);
+ monoColorTable.append(0xFF000000);
+
+ for (int i = 0xFF; i >= 0; i--)
+ grayColorTable.append((0xFF - i) << 24
+ | i << 16
+ | i << 8
+ | i);
+
// XXX make this user-configurable
axisPen.setColor(QColor(0, 0, 0, 255)); // black
@@ -1616,6 +1718,14 @@ MainGUI::drawGlyph()
if (!engine)
return;
+ if (currentGlyphBitmapItem)
+ {
+ glyphScene->removeItem(currentGlyphBitmapItem);
+ delete currentGlyphBitmapItem;
+
+ currentGlyphBitmapItem = NULL;
+ }
+
if (currentGlyphOutlineItem)
{
glyphScene->removeItem(currentGlyphOutlineItem);
@@ -1646,6 +1756,21 @@ MainGUI::drawGlyph()
FT_Outline* outline = engine->loadOutline(currentGlyphIndex);
if (outline)
{
+ if (showBitmapCheckBox->isChecked())
+ {
+ // XXX support LCD
+ int pixelMode = FT_PIXEL_MODE_GRAY;
+ if (antiAliasingComboBoxx->currentIndex() == AntiAliasing_None)
+ pixelMode = FT_PIXEL_MODE_MONO;
+
+ currentGlyphBitmapItem = new GlyphBitmap(outline,
+ engine->library,
+ pixelMode,
+ monoColorTable,
+ grayColorTable);
+ glyphScene->addItem(currentGlyphBitmapItem);
+ }
+
if (showOutlinesCheckBox->isChecked())
{
currentGlyphOutlineItem = new GlyphOutline(outlinePen, outline);
@@ -1861,6 +1986,7 @@ MainGUI::createLayout()
glyphScene = new QGraphicsScene;
glyphScene->addItem(new Grid(gridPen, axisPen));
+ currentGlyphBitmapItem = NULL;
currentGlyphOutlineItem = NULL;
currentGlyphPointsItem = NULL;
currentGlyphPointNumbersItem = NULL;
@@ -1999,6 +2125,8 @@ MainGUI::createConnections()
connect(autoHintingCheckBox, SIGNAL(clicked()),
SLOT(checkAutoHinting()));
+ connect(showBitmapCheckBox, SIGNAL(clicked()),
+ SLOT(drawGlyph()));
connect(showPointsCheckBox, SIGNAL(clicked()),
SLOT(checkShowPoints()));
connect(showPointNumbersCheckBox, SIGNAL(clicked()),
@@ -2176,7 +2304,7 @@ MainGUI::setDefaults()
hintingCheckBox->setChecked(true);
- antiAliasingComboBoxx->setCurrentIndex(AntiAliasing_LCD);
+ antiAliasingComboBoxx->setCurrentIndex(AntiAliasing_Normal);
lcdFilterComboBox->setCurrentIndex(LCDFilter_Light);
horizontalHintingCheckBox->setChecked(true);
diff --git a/src/ftinspect.h b/src/ftinspect.h
index ac4a12e..fe44790 100644
--- a/src/ftinspect.h
+++ b/src/ftinspect.h
@@ -162,8 +162,6 @@ private:
bool showSegments;
bool doWarping;
- bool showBitmap;
-
double gamma;
int loadFlags;
@@ -245,6 +243,31 @@ private:
};
+class GlyphBitmap
+: public QGraphicsItem
+{
+public:
+ GlyphBitmap(FT_Outline*,
+ FT_Library,
+ int,
+ const QVector<QRgb>&,
+ const QVector<QRgb>&);
+ ~GlyphBitmap();
+ QRectF boundingRect() const;
+ void paint(QPainter*,
+ const QStyleOptionGraphicsItem*,
+ QWidget*);
+
+private:
+ FT_Outline transformed;
+ FT_Library library;
+ int pixelMode;
+ const QVector<QRgb>& monoColorTable;
+ const QVector<QRgb>& grayColorTable;
+ QRectF bRect;
+};
+
+
// we want to grey out items in a combo box;
// since Qt doesn't provide a function for this we derive a class
class QComboBoxx
@@ -335,6 +358,7 @@ private:
GlyphOutline *currentGlyphOutlineItem;
GlyphPoints *currentGlyphPointsItem;
GlyphPointNumbers *currentGlyphPointNumbersItem;
+ GlyphBitmap *currentGlyphBitmapItem;
QAction *aboutAct;
QAction *aboutQtAct;
@@ -440,6 +464,9 @@ private:
QVBoxLayout *leftLayout;
QVBoxLayout *rightLayout;
+ QVector<QRgb> grayColorTable;
+ QVector<QRgb> monoColorTable;
+
QWidget *ftinspectWidget;
QWidget *generalTabWidget;
QWidget *leftWidget;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master 98fec41 1/3: [ftinspect] Display rendered glyph bitmaps.,
Werner LEMBERG <=