freetype-commit
[Top][All Lists]
Advanced

[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;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]