freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2-demos] master 3e9e1a4: [ftinspect] A new Qt based variant for


From: Werner LEMBERG
Subject: [freetype2-demos] master 3e9e1a4: [ftinspect] A new Qt based variant for ftgrid. GUI draft only.
Date: Sat, 30 Apr 2016 05:57:19 +0000

branch: master
commit 3e9e1a44a3650a2d03ac63b2780b5745671cffad
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [ftinspect] A new Qt based variant for ftgrid.  GUI draft only.
    
    The idea is to eventually integrate the functionality of ftview,
    ftkern, and ftdiff also.
    
    The code compiles fine with both Qt4 and Qt5; it doesn't do anything
    yet beyond showing how the GUI looks like.
    
    * src/ftinspect.cpp, src/ftinspect.h: New source code files.
    
    * src/ftinspect.pro: New qmake input file.
---
 ChangeLog         |   14 ++
 src/ftinspect.cpp |  406 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/ftinspect.h   |  136 ++++++++++++++++++
 src/ftinspect.pro |    8 ++
 4 files changed, 564 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index a27fbb5..c23d442 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2016-04-30  Werner Lemberg  <address@hidden>
+
+       [ftinspect] A new Qt based variant for ftgrid.  GUI draft only.
+
+       The idea is to eventually integrate the functionality of ftview,
+       ftkern, and ftdiff also.
+
+       The code compiles fine with both Qt4 and Qt5; it doesn't do anything
+       yet beyond showing how the GUI looks like.
+
+       * src/ftinspect.cpp, src/ftinspect.h: New source code files.
+
+       * src/ftinspect.pro: New qmake input file.
+
 2016-04-08  Werner Lemberg  <address@hidden>
 
        [ftview] Avoid hangs with bitmap only fonts.
diff --git a/src/ftinspect.cpp b/src/ftinspect.cpp
new file mode 100644
index 0000000..6cdfbf4
--- /dev/null
+++ b/src/ftinspect.cpp
@@ -0,0 +1,406 @@
+// ftinspect.cpp
+
+// Copyright (C) 2016 by Werner Lemberg.
+
+#include "ftinspect.h"
+
+
+#define VERSION "X.Y.Z"
+
+
+MainGUI::MainGUI()
+{
+  createLayout();
+  createConnections();
+  createActions();
+  createMenus();
+  createStatusBar();
+
+  setDefaults();
+  readSettings();
+
+  setUnifiedTitleAndToolBarOnMac(true);
+}
+
+
+MainGUI::~MainGUI()
+{
+}
+
+
+// overloading
+
+void
+MainGUI::closeEvent(QCloseEvent* event)
+{
+  writeSettings();
+  event->accept();
+}
+
+
+void
+MainGUI::about()
+{
+  QMessageBox::about(
+    this,
+    tr("About ftinspect"),
+    tr("<p>This is <b>ftinspect</b> version %1<br>"
+       " Copyright %2 2016<br>"
+       " by Werner Lemberg <tt>&lt;address@hidden&gt;</tt></p>"
+       ""
+       "<p><b>ftinspect</b> shows how a font gets rendered"
+       " by FreeType, allowing control over virtually"
+       " all rendering parameters.</p>"
+       ""
+       "<p>License:"
+       " <a 
href='http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT'>FreeType"
+       " License (FTL)</a> or"
+       " <a 
href='http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/GPLv2.TXT'>GNU"
+       " GPLv2</a></p>")
+       .arg(VERSION)
+       .arg(QChar(0xA9)));
+}
+
+
+// XXX distances are specified in pixels,
+//     making the layout dependent on the output device resolution
+void
+MainGUI::createLayout()
+{
+  // left side
+  hintingModeLabel = new QLabel(tr("Hinting Mode"));
+  hintingModeLabel->setAlignment(Qt::AlignRight);
+  QStringList hintingModeStringList;
+  hintingModeStringList << tr("TrueType v35")
+                        << tr("TrueType v38")
+                        << tr("TrueType v40")
+                        << tr("Auto-Hinting");
+  hintingModeComboBox = new QComboBox;
+  hintingModeComboBox->insertItems(0, hintingModeStringList);
+  hintingModeLabel->setBuddy(hintingModeComboBox);
+
+  hortizontalHintingCheckBox = new QCheckBox(tr("Horizontal Hinting"));
+  verticalHintingCheckBox = new QCheckBox(tr("Vertical Hinting"));
+  blueZoneHintingCheckBox = new QCheckBox(tr("Blue-Zone Hinting"));
+  segmentDrawingCheckBox = new QCheckBox(tr("Segment Drawing"));
+  warpingCheckBox = new QCheckBox(tr("Warping"));
+
+  antiAliasingLabel = new QLabel(tr("Anti-Aliasing"));
+  antiAliasingLabel->setAlignment(Qt::AlignRight);
+  QStringList antiAliasingStringList;
+  antiAliasingStringList << tr("None")
+                         << tr("Normal")
+                         << tr("Slight")
+                         << tr("LCD (horiz. RGB)")
+                         << tr("LCD (horiz. BGR)")
+                         << tr("LCD (vert. RGB)")
+                         << tr("LCD (vert. BGR)");
+  antiAliasingComboBox = new QComboBox;
+  antiAliasingComboBox->insertItems(0, antiAliasingStringList);
+  antiAliasingLabel->setBuddy(antiAliasingComboBox);
+
+  lcdFilterLabel = new QLabel(tr("LCD Filter"));
+  lcdFilterLabel->setAlignment(Qt::AlignRight);
+  QStringList lcdFilterStringList;
+  lcdFilterStringList << tr("Default")
+                      << tr("Light")
+                      << tr("None")
+                      << tr("Legacy");
+  lcdFilterComboBox = new QComboBox;
+  lcdFilterComboBox->insertItems(0, lcdFilterStringList);
+  lcdFilterLabel->setBuddy(lcdFilterComboBox);
+
+  int width = 0;
+  // make all labels have the same width
+  width = qMax(hintingModeLabel->minimumSizeHint().width(), width);
+  width = qMax(antiAliasingLabel->minimumSizeHint().width(), width);
+  width = qMax(lcdFilterLabel->minimumSizeHint().width(), width);
+  hintingModeLabel->setMinimumWidth(width);
+  antiAliasingLabel->setMinimumWidth(width);
+  lcdFilterLabel->setMinimumWidth(width);
+
+  // ensure that all items in combo boxes fit completely;
+  // also make all combo boxes have the same width
+  QStringList dummyComboStringList;
+  dummyComboStringList << hintingModeStringList
+                       << antiAliasingStringList
+                       << lcdFilterStringList;
+  QComboBox *dummyComboBox = new QComboBox;
+  dummyComboBox->insertItems(0, dummyComboStringList);
+  width = dummyComboBox->minimumSizeHint().width();
+  hintingModeComboBox->setMinimumWidth(width);
+  antiAliasingComboBox->setMinimumWidth(width);
+  lcdFilterComboBox->setMinimumWidth(width);
+
+  gammaLabel = new QLabel(tr("Gamma"));
+  gammaLabel->setAlignment(Qt::AlignRight);
+  gammaSlider = new QSlider(Qt::Horizontal);
+  gammaSlider->setRange(0, 30); // in 1/10th
+  gammaSlider->setTickPosition(QSlider::TicksBelow);
+  gammaLabel->setBuddy(gammaSlider);
+
+  showBitmapsCheckBox = new QCheckBox(tr("Show Bitmaps"));
+  showPointsCheckBox = new QCheckBox(tr("Show Points"));
+  showPointIndicesCheckBox = new QCheckBox(tr("Show Point Indices"));
+  showOutlinesCheckBox = new QCheckBox(tr("Show Outlines"));
+
+  watchButton = new QPushButton(tr("Watch"));
+
+  hintingModeLayout = new QHBoxLayout;
+  hintingModeLayout->addWidget(hintingModeLabel);
+  hintingModeLayout->addWidget(hintingModeComboBox);
+
+  antiAliasingLayout = new QHBoxLayout;
+  antiAliasingLayout->addWidget(antiAliasingLabel);
+  antiAliasingLayout->addWidget(antiAliasingComboBox);
+
+  lcdFilterLayout = new QHBoxLayout;
+  lcdFilterLayout->addWidget(lcdFilterLabel);
+  lcdFilterLayout->addWidget(lcdFilterComboBox);
+
+  gammaLayout = new QHBoxLayout;
+  gammaLayout->addWidget(gammaLabel);
+  gammaLayout->addWidget(gammaSlider);
+
+  generalTabLayout = new QVBoxLayout;
+  generalTabLayout->addLayout(hintingModeLayout);
+  generalTabLayout->addWidget(hortizontalHintingCheckBox);
+  generalTabLayout->addWidget(verticalHintingCheckBox);
+  generalTabLayout->addWidget(blueZoneHintingCheckBox);
+  generalTabLayout->addWidget(segmentDrawingCheckBox);
+  generalTabLayout->addWidget(warpingCheckBox);
+  generalTabLayout->addSpacing(20); // XXX px
+  generalTabLayout->addStretch(1);
+  generalTabLayout->addLayout(antiAliasingLayout);
+  generalTabLayout->addLayout(lcdFilterLayout);
+  generalTabLayout->addSpacing(20); // XXX px
+  generalTabLayout->addStretch(1);
+  generalTabLayout->addLayout(gammaLayout);
+  generalTabLayout->addSpacing(20); // XXX px
+  generalTabLayout->addStretch(1);
+  generalTabLayout->addWidget(showBitmapsCheckBox);
+  generalTabLayout->addWidget(showPointsCheckBox);
+  generalTabLayout->addWidget(showPointIndicesCheckBox);
+  generalTabLayout->addWidget(showOutlinesCheckBox);
+
+  generalTabWidget = new QWidget;
+  generalTabWidget->setLayout(generalTabLayout);
+
+  mmgxTabWidget = new QWidget;
+
+  watchLayout = new QHBoxLayout;
+  watchLayout->addStretch(1);
+  watchLayout->addWidget(watchButton);
+  watchLayout->addStretch(1);
+
+  tabWidget = new QTabWidget;
+  tabWidget->addTab(generalTabWidget, tr("General"));
+  tabWidget->addTab(mmgxTabWidget, tr("MM/GX"));
+
+  leftLayout = new QVBoxLayout;
+  leftLayout->addWidget(tabWidget);
+  leftLayout->addSpacing(10); // XXX px
+  leftLayout->addLayout(watchLayout);
+
+  // we don't want to expand the left side horizontally;
+  // to change the policy we have to use a widget wrapper
+  leftWidget = new QWidget;
+  leftWidget->setLayout(leftLayout);
+
+  QSizePolicy leftWidgetPolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+  leftWidgetPolicy.setHorizontalStretch(0);
+  
leftWidgetPolicy.setVerticalPolicy(leftWidget->sizePolicy().verticalPolicy());
+  
leftWidgetPolicy.setHeightForWidth(leftWidget->sizePolicy().hasHeightForWidth());
+
+  leftWidget->setSizePolicy(leftWidgetPolicy);
+
+  // right side
+  glyphView = new QGraphicsView;
+
+  sizeLabel = new QLabel(tr("Size "));
+  sizeLabel->setAlignment(Qt::AlignRight);
+  sizeDoubleSpinBox = new QDoubleSpinBox;
+  sizeDoubleSpinBox->setAlignment(Qt::AlignRight);
+  sizeDoubleSpinBox->setDecimals(1);
+  sizeDoubleSpinBox->setRange(1, 500);
+  sizeDoubleSpinBox->setSuffix("px");
+  sizeDoubleSpinBox->setSingleStep(0.5);
+  sizeDoubleSpinBox->setValue(20); // XXX default
+  sizeLabel->setBuddy(sizeDoubleSpinBox);
+
+  toStartButton = new QPushButton("|<");
+  toStartButton->setFixedWidth(40);
+  toM1000Button = new QPushButton("-1000");
+  toM1000Button->setFixedWidth(65);
+  toM100Button = new QPushButton("-100");
+  toM100Button->setFixedWidth(55);
+  toM10Button = new QPushButton("-10");
+  toM10Button->setFixedWidth(50);
+  toM1Button = new QPushButton("-1");
+  toM1Button->setFixedWidth(50);
+  toP1Button = new QPushButton("+1");
+  toP1Button->setFixedWidth(50);
+  toP10Button = new QPushButton("+10");
+  toP10Button->setFixedWidth(50);
+  toP100Button = new QPushButton("+100");
+  toP100Button->setFixedWidth(55);
+  toP1000Button = new QPushButton("+1000");
+  toP1000Button->setFixedWidth(65);
+  toEndButton = new QPushButton(">|");
+  toEndButton->setFixedWidth(40);
+
+  zoomLabel = new QLabel(tr("Zoom "));
+  zoomLabel->setAlignment(Qt::AlignRight);
+  zoomSpinBox = new QSpinBox;
+  zoomSpinBox->setAlignment(Qt::AlignRight);
+  zoomSpinBox->setRange(1, 10000);
+  zoomSpinBox->setSuffix("%");
+  zoomSpinBox->setSingleStep(10);
+  zoomSpinBox->setValue(100); // XXX default
+  zoomLabel->setBuddy(zoomSpinBox);
+
+  previousFontButton = new QPushButton(tr("Previous Font"));
+  nextFontButton = new QPushButton(tr("Next Font"));
+
+  navigationLayout = new QHBoxLayout;
+  navigationLayout->setSpacing(0);
+  navigationLayout->addWidget(sizeLabel);
+  navigationLayout->addWidget(sizeDoubleSpinBox);
+  navigationLayout->addSpacing(10); // XXX px
+  navigationLayout->addStretch(1);
+  navigationLayout->addWidget(toStartButton);
+  navigationLayout->addWidget(toM1000Button);
+  navigationLayout->addWidget(toM100Button);
+  navigationLayout->addWidget(toM10Button);
+  navigationLayout->addWidget(toM1Button);
+  navigationLayout->addWidget(toP1Button);
+  navigationLayout->addWidget(toP10Button);
+  navigationLayout->addWidget(toP100Button);
+  navigationLayout->addWidget(toP1000Button);
+  navigationLayout->addWidget(toEndButton);
+  navigationLayout->addSpacing(10); // XXX px
+  navigationLayout->addStretch(1);
+  navigationLayout->addWidget(zoomLabel);
+  navigationLayout->addWidget(zoomSpinBox);
+
+  fontLayout = new QHBoxLayout;
+  fontLayout->addStretch(1);
+  fontLayout->addWidget(previousFontButton);
+  fontLayout->addStretch(1);
+  fontLayout->addWidget(nextFontButton);
+  fontLayout->addStretch(1);
+
+  rightLayout = new QVBoxLayout;
+  rightLayout->addWidget(glyphView);
+  rightLayout->addLayout(navigationLayout);
+  rightLayout->addSpacing(10); // XXX px
+  rightLayout->addLayout(fontLayout);
+
+  // for symmetry with the left side use a widget also
+  rightWidget = new QWidget;
+  rightWidget->setLayout(rightLayout);
+
+  // the whole thing
+  ftinspectLayout = new QHBoxLayout;
+  ftinspectLayout->addWidget(leftWidget);
+  ftinspectLayout->addWidget(rightWidget);
+
+  ftinspectWidget = new QWidget;
+  ftinspectWidget->setLayout(ftinspectLayout);
+  setCentralWidget(ftinspectWidget);
+  setWindowTitle("ftinspect");
+}
+
+
+void
+MainGUI::createConnections()
+{
+}
+
+
+void
+MainGUI::createActions()
+{
+  exitAct = new QAction(tr("E&xit"), this);
+  exitAct->setShortcuts(QKeySequence::Quit);
+  connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
+
+  aboutAct = new QAction(tr("&About"), this);
+  connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
+
+  aboutQtAct = new QAction(tr("About &Qt"), this);
+  connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+}
+
+
+void
+MainGUI::createMenus()
+{
+  menuFile = menuBar()->addMenu(tr("&File"));
+  menuFile->addAction(exitAct);
+
+  menuHelp = menuBar()->addMenu(tr("&Help"));
+  menuHelp->addAction(aboutAct);
+  menuHelp->addAction(aboutQtAct);
+}
+
+
+void
+MainGUI::createStatusBar()
+{
+  statusBar()->showMessage("");
+}
+
+
+void
+MainGUI::clearStatusBar()
+{
+  statusBar()->clearMessage();
+  statusBar()->setStyleSheet("");
+}
+
+
+void
+MainGUI::setDefaults()
+{
+}
+
+
+void
+MainGUI::readSettings()
+{
+  QSettings settings;
+//  QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
+//  QSize size = settings.value("size", QSize(400, 400)).toSize();
+//  resize(size);
+//  move(pos);
+}
+
+
+void
+MainGUI::writeSettings()
+{
+  QSettings settings;
+//  settings.setValue("pos", pos());
+//  settings.setValue("size", size());
+}
+
+
+int
+main(int argc,
+     char** argv)
+{
+  QApplication app(argc, argv);
+  app.setApplicationName("ftinspect");
+  app.setApplicationVersion(VERSION);
+  app.setOrganizationName("FreeType");
+  app.setOrganizationDomain("freetype.org");
+
+  MainGUI gui;
+  gui.show();
+
+  return app.exec();
+}
+
+
+// end of ftinspect.cpp
diff --git a/src/ftinspect.h b/src/ftinspect.h
new file mode 100644
index 0000000..5ab0ed6
--- /dev/null
+++ b/src/ftinspect.h
@@ -0,0 +1,136 @@
+// ftinspect.h
+
+#ifndef FTINSPECT_H_
+#define FTINSPECT_H_
+
+#include <QAction>
+#include <QApplication>
+#include <QButtonGroup>
+#include <QCheckBox>
+#include <QCloseEvent>
+#include <QComboBox>
+#include <QDesktopWidget>
+#include <QDoubleSpinBox>
+#include <QGraphicsView>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QMainWindow>
+#include <QMenu>
+#include <QMenuBar>
+#include <QMessageBox>
+#include <QPushButton>
+#include <QSettings>
+#include <QSizePolicy>
+#include <QSlider>
+#include <QSpinBox>
+#include <QStatusBar>
+#include <QTabWidget>
+#include <QVBoxLayout>
+#include <QWidget>
+
+
+class MainGUI
+: public QMainWindow
+{
+  Q_OBJECT
+
+public:
+  MainGUI();
+  ~MainGUI();
+
+protected:
+  void closeEvent(QCloseEvent*);
+
+private slots:
+  void about();
+
+private:
+  QAction *aboutAct;
+  QAction *aboutQtAct;
+  QAction *exitAct;
+
+  QCheckBox *blueZoneHintingCheckBox;
+  QCheckBox *hortizontalHintingCheckBox;
+  QCheckBox *segmentDrawingCheckBox;
+  QCheckBox *showBitmapsCheckBox;
+  QCheckBox *showOutlinesCheckBox;
+  QCheckBox *showPointIndicesCheckBox;
+  QCheckBox *showPointsCheckBox;
+  QCheckBox *verticalHintingCheckBox;
+  QCheckBox *warpingCheckBox;
+
+  QComboBox *antiAliasingComboBox;
+  QComboBox *hintingModeComboBox;
+  QComboBox *lcdFilterComboBox;
+
+  QDoubleSpinBox *sizeDoubleSpinBox;
+
+  QGraphicsView *glyphView;
+
+  QHBoxLayout *antiAliasingLayout;
+  QHBoxLayout *fontLayout;
+  QHBoxLayout *gammaLayout;
+  QHBoxLayout *hintingModeLayout;
+  QHBoxLayout *ftinspectLayout;
+  QHBoxLayout *lcdFilterLayout;
+  QHBoxLayout *navigationLayout;
+  QHBoxLayout *watchLayout;
+
+  QLabel *antiAliasingLabel;
+  QLabel *gammaLabel;
+  QLabel *hintingModeLabel;
+  QLabel *lcdFilterLabel;
+  QLabel *sizeLabel;
+  QLabel *zoomLabel;
+
+  QLocale *locale;
+
+  QMenu *menuFile;
+  QMenu *menuHelp;
+
+  QPushButton *nextFontButton;
+  QPushButton *previousFontButton;
+  QPushButton *toEndButton;
+  QPushButton *toM1000Button;
+  QPushButton *toM100Button;
+  QPushButton *toM10Button;
+  QPushButton *toM1Button;
+  QPushButton *toP1000Button;
+  QPushButton *toP100Button;
+  QPushButton *toP10Button;
+  QPushButton *toP1Button;
+  QPushButton *toStartButton;
+  QPushButton *watchButton;
+
+  QSlider *gammaSlider;
+
+  QSpinBox *zoomSpinBox;
+
+  QTabWidget *tabWidget;
+
+  QVBoxLayout *generalTabLayout;
+  QVBoxLayout *leftLayout;
+  QVBoxLayout *rightLayout;
+
+  QWidget *ftinspectWidget;
+  QWidget *generalTabWidget;
+  QWidget *leftWidget;
+  QWidget *rightWidget;
+  QWidget *mmgxTabWidget;
+
+  void createActions();
+  void createConnections();
+  void createLayout();
+  void createMenus();
+  void clearStatusBar();
+  void createStatusBar();
+  void readSettings();
+  void setDefaults();
+  void writeSettings();
+};
+
+
+#endif // FTINSPECT_H_
+
+
+// end of ftinspect.h
diff --git a/src/ftinspect.pro b/src/ftinspect.pro
new file mode 100644
index 0000000..63483a9
--- /dev/null
+++ b/src/ftinspect.pro
@@ -0,0 +1,8 @@
+CONFIG += qt debug
+
+SOURCES += ftinspect.cpp
+HEADERS += ftinspect.h
+
+TARGET = ftinspect
+
+QT += widgets



reply via email to

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