diff options
| author | Denis Jacquerye | 2015-10-21 11:19:19 +0100 |
|---|---|---|
| committer | Denis Jacquerye | 2015-10-21 11:19:19 +0100 |
| commit | bdca3d55afa85fcf80fda07037fb0c0aa63c2df6 (patch) | |
| tree | 34958ec69fd2b95a6d62a1efee4c99d0aacc3ff1 /Lib | |
| parent | be72e9780959796ed0bd536edd4a34eb26f9ce35 (diff) | |
| download | trufont-bdca3d55afa85fcf80fda07037fb0c0aa63c2df6.tar.bz2 | |
fontInfo: Add OS/2 tab, from https://gist.github.com/adrientetar/6f3875da84896a0f3415
Diffstat (limited to 'Lib')
| -rw-r--r-- | Lib/defconQt/fontInfo.py | 408 |
1 files changed, 405 insertions, 3 deletions
diff --git a/Lib/defconQt/fontInfo.py b/Lib/defconQt/fontInfo.py index 45f954f..65ce276 100644 --- a/Lib/defconQt/fontInfo.py +++ b/Lib/defconQt/fontInfo.py @@ -1,9 +1,10 @@ from PyQt5.QtCore import QDate, QDateTime, QTime, Qt -from PyQt5.QtGui import QDoubleValidator, QIntValidator +from PyQt5.QtGui import ( + QDoubleValidator, QIntValidator, QStandardItem, QStandardItemModel) from PyQt5.QtWidgets import ( QCheckBox, QComboBox, QDateTimeEdit, QDialog, QDialogButtonBox, - QGridLayout, QGroupBox, QLabel, QLineEdit, QPlainTextEdit, QTabWidget, - QVBoxLayout, QWidget) + QGridLayout, QGroupBox, QLabel, QLineEdit, QListView, QPlainTextEdit, + QTabWidget, QVBoxLayout, QWidget) class InfoTabWidget(QTabWidget): @@ -22,6 +23,7 @@ class TabDialog(QDialog): self.tabWidget.addNamedTab(GeneralTab(self.font)) self.tabWidget.addNamedTab(MetricsTab(self.font)) self.tabWidget.addNamedTab(OpenTypeTab(self.font)) + self.tabWidget.addNamedTab(OS2Tab(self.font)) self.tabWidget.addNamedTab(PostScriptTab(self.font)) buttonBox = QDialogButtonBox( @@ -706,6 +708,406 @@ class OpenTypeTab(QWidget): font.info.openTypeVheaCaretOffset = None +class OS2Tab(QWidget): + name = "OS/2" + + def __init__(self, font, parent=None): + super(OS2Tab, self).__init__(parent) + + # OS2Group = QGroupBox("OS/2 table", self) + # OS2Group.setFlat(True) + OS2Layout = QGridLayout(self) + + usWidthClassLabel = QLabel("usWidthClass:", self) + self.usWidthClassDrop = QComboBox(self) + items = [ + "None", "Ultra-condensed", "Extra-condensed", "Condensed", + "Semi-Condensed", "Medium (normal)", "Semi-expanded", "Expanded", + "Extra-expanded", "Ultra-expanded"] + self.usWidthClassDrop.insertItems(0, items) + if font.info.openTypeOS2WidthClass is not None: + self.usWidthClassDrop.setCurrentIndex( + font.info.openTypeOS2WidthClass) + + usWeightClassLabel = QLabel("usWeightClass:", self) + if font.info.openTypeOS2WeightClass is not None: + usWeightClass = str(font.info.openTypeOS2WeightClass) + else: + usWeightClass = '' + self.usWeightClassEdit = QLineEdit(usWeightClass, self) + positiveValidator = QIntValidator(self) + positiveValidator.setBottom(0) + self.usWeightClassEdit.setValidator(positiveValidator) + + fsSelectionLabel = QLabel("fsSelection:", self) + fsSelection = font.info.openTypeOS2Selection + self.fsSelectionList = QListView(self) + items = [ + "1 UNDERSCORE", "2 NEGATIVE", "3 OUTLINED", "4 STRIKEOUT", + "7 USE_TYPO_METRICS", "8 WWS", "9 OBLIQUE"] + # http://stackoverflow.com/a/26613163 + model = QStandardItemModel(7, 1) + for index, elem in enumerate(items): + item = QStandardItem() + item.setText(elem) + item.setCheckable(True) + bit = index + 1 + if fsSelection is not None and bit in fsSelection: + # maybe default setting? if so, unneeded + item.setCheckState(Qt.Checked) + else: + item.setCheckState(Qt.Unchecked) + model.setItem(index, item) + self.fsSelectionList.setModel(model) + + achVendorIDLabel = QLabel("achVendorID:", self) + self.achVendorIDEdit = QLineEdit(font.info.openTypeOS2VendorID, self) + self.achVendorIDEdit.setMaxLength(4) + + fsTypeLabel = QLabel("fsType:", self) + fsType = font.info.openTypeOS2Type + self.fsTypeDrop = QComboBox(self) + items = [ + "No embedding restrictions", "Restricted embedding", + "Preview and print embedding allowed", + "Editable embedding allowed"] + self.allowSubsettingBox = QCheckBox("Allow subsetting", self) + self.allowBitmapEmbeddingBox = QCheckBox( + "Allow only bitmap embedding", self) + self.fsTypeDrop.currentIndexChanged[int].connect( + self._updateFsTypeVisibility) + self.fsTypeDrop.insertItems(0, items) + if fsType is not None: + for i in range(1, 4): + if i in fsType: + self.fsTypeDrop.setCurrentIndex(i) + break + self.allowSubsettingBox.setChecked(8 not in fsType) + self.allowBitmapEmbeddingBox.setChecked(9 in fsType) + + # XXX: ulUnicodeRange + + # XXX: ulCodePageRange + + sTypoAscenderLabel = QLabel("sTypoAscender:", self) + if font.info.openTypeOS2TypoAscender is not None: + sTypoAscender = str(font.info.openTypeOS2TypoAscender) + else: + sTypoAscender = '' + self.sTypoAscenderEdit = QLineEdit(sTypoAscender, self) + self.sTypoAscenderEdit.setValidator(QIntValidator(self)) + + sTypoDescenderLabel = QLabel("sTypoDescender:", self) + if font.info.openTypeOS2TypoDescender is not None: + sTypoDescender = str(font.info.openTypeOS2TypoDescender) + else: + sTypoDescender = '' + self.sTypoDescenderEdit = QLineEdit(sTypoDescender, self) + negativeValidator = QIntValidator(self) + negativeValidator.setTop(0) + self.sTypoDescenderEdit.setValidator(negativeValidator) + + sTypoLineGapLabel = QLabel("sTypoLineGap:", self) + if font.info.openTypeOS2TypoLineGap is not None: + sTypoLineGap = str(font.info.openTypeOS2TypoLineGap) + else: + sTypoLineGap = '' + self.sTypoLineGapEdit = QLineEdit(sTypoLineGap, self) + self.sTypoLineGapEdit.setValidator(QIntValidator(self)) + + usWinAscentLabel = QLabel("usWinAscent:", self) + if font.info.openTypeOS2WinAscent is not None: + usWinAscent = str(font.info.openTypeOS2WinAscent) + else: + usWinAscent = '' + self.usWinAscentEdit = QLineEdit(usWinAscent, self) + self.usWinAscentEdit.setValidator(QIntValidator(self)) + + usWinDescentLabel = QLabel("usWinDescent:", self) + if font.info.openTypeOS2WinDescent is not None: + usWinDescent = str(font.info.openTypeOS2WinDescent) + else: + usWinDescent = '' + self.usWinDescentEdit = QLineEdit(usWinDescent, self) + positiveValidator = QIntValidator(self) + positiveValidator.setBottom(0) + self.usWinDescentEdit.setValidator(positiveValidator) + + ySubscriptXSizeLabel = QLabel("ySubscriptXSize:", self) + if font.info.openTypeOS2SubscriptXSize is not None: + ySubscriptXSize = str(font.info.openTypeOS2SubscriptXSize) + else: + ySubscriptXSize = '' + self.ySubscriptXSizeEdit = QLineEdit(ySubscriptXSize, self) + self.ySubscriptXSizeEdit.setValidator(QIntValidator(self)) + + ySubscriptYSizeLabel = QLabel("ySubscriptYSize:", self) + if font.info.openTypeOS2SubscriptYSize is not None: + ySubscriptYSize = str(font.info.openTypeOS2SubscriptYSize) + else: + ySubscriptYSize = '' + self.ySubscriptYSizeEdit = QLineEdit(ySubscriptYSize, self) + self.ySubscriptYSizeEdit.setValidator(QIntValidator(self)) + + ySubscriptXOffsetLabel = QLabel("ySubscriptXOffset:", self) + if font.info.openTypeOS2SubscriptXOffset is not None: + ySubscriptXOffset = str(font.info.openTypeOS2SubscriptXOffset) + else: + ySubscriptXOffset = '' + self.ySubscriptXOffsetEdit = QLineEdit(ySubscriptXOffset, self) + self.ySubscriptXOffsetEdit.setValidator(QIntValidator(self)) + + ySubscriptYOffsetLabel = QLabel("ySubscriptYOffset:", self) + if font.info.openTypeOS2SubscriptYOffset is not None: + ySubscriptYOffset = str(font.info.openTypeOS2SubscriptYOffset) + else: + ySubscriptYOffset = '' + self.ySubscriptYOffsetEdit = QLineEdit(ySubscriptYOffset, self) + self.ySubscriptYOffsetEdit.setValidator(QIntValidator(self)) + + ySuperscriptXSizeLabel = QLabel("ySuperscriptXSize:", self) + if font.info.openTypeOS2SuperscriptXSize is not None: + ySuperscriptXSize = str(font.info.openTypeOS2SuperscriptXSize) + else: + ySuperscriptXSize = '' + self.ySuperscriptXSizeEdit = QLineEdit(ySuperscriptXSize, self) + self.ySuperscriptXSizeEdit.setValidator(QIntValidator(self)) + + ySuperscriptYSizeLabel = QLabel("ySuperscriptYSize:", self) + if font.info.openTypeOS2SuperscriptYSize is not None: + ySuperscriptYSize = str(font.info.openTypeOS2SuperscriptYSize) + else: + ySuperscriptYSize = '' + self.ySuperscriptYSizeEdit = QLineEdit(ySuperscriptYSize, self) + self.ySuperscriptYSizeEdit.setValidator(QIntValidator(self)) + + ySuperscriptXOffsetLabel = QLabel("ySuperscriptXOffset:", self) + if font.info.openTypeOS2SuperscriptXOffset is not None: + ySuperscriptXOffset = str(font.info.openTypeOS2SuperscriptXOffset) + else: + ySuperscriptXOffset = '' + self.ySuperscriptXOffsetEdit = QLineEdit(ySuperscriptXOffset, self) + self.ySuperscriptXOffsetEdit.setValidator(QIntValidator(self)) + + ySuperscriptYOffsetLabel = QLabel("ySuperscriptYOffset:", self) + if font.info.openTypeOS2SuperscriptYOffset is not None: + ySuperscriptYOffset = str(font.info.openTypeOS2SuperscriptYOffset) + else: + ySuperscriptYOffset = '' + self.ySuperscriptYOffsetEdit = QLineEdit(ySuperscriptYOffset, self) + self.ySuperscriptYOffsetEdit.setValidator(QIntValidator(self)) + + yStrikeoutSizeLabel = QLabel("yStrikeoutSize:", self) + if font.info.openTypeOS2StrikeoutSize is not None: + yStrikeoutSize = str(font.info.openTypeOS2StrikeoutSize) + else: + yStrikeoutSize = '' + self.yStrikeoutSizeEdit = QLineEdit(yStrikeoutSize, self) + self.yStrikeoutSizeEdit.setValidator(QIntValidator(self)) + + yStrikeoutPositionLabel = QLabel("yStrikeoutPosition:", self) + if font.info.openTypeOS2StrikeoutPosition is not None: + yStrikeoutPosition = str(font.info.openTypeOS2StrikeoutPosition) + else: + yStrikeoutPosition = '' + self.yStrikeoutPositionEdit = QLineEdit(yStrikeoutPosition, self) + self.yStrikeoutPositionEdit.setValidator(QIntValidator(self)) + + # XXX: panose + + l = 0 + OS2Layout.addWidget(usWidthClassLabel, l, 0) + OS2Layout.addWidget(self.usWidthClassDrop, l, 1, 1, 2) + OS2Layout.addWidget(achVendorIDLabel, l, 3) + OS2Layout.addWidget(self.achVendorIDEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(usWeightClassLabel, l, 0) + OS2Layout.addWidget(self.usWeightClassEdit, l, 1, 1, 2) + l += 1 + OS2Layout.addWidget(fsSelectionLabel, l, 0, 3, 1) + OS2Layout.addWidget(self.fsSelectionList, l, 1, 3, 2) + OS2Layout.addWidget(fsTypeLabel, l, 3, 3, 1) + OS2Layout.addWidget(self.fsTypeDrop, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(self.allowSubsettingBox, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(self.allowBitmapEmbeddingBox, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(sTypoAscenderLabel, l, 0) + OS2Layout.addWidget(self.sTypoAscenderEdit, l, 1, 1, 2) + OS2Layout.addWidget(usWinAscentLabel, l, 3) + OS2Layout.addWidget(self.usWinAscentEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(sTypoDescenderLabel, l, 0) + OS2Layout.addWidget(self.sTypoDescenderEdit, l, 1, 1, 2) + OS2Layout.addWidget(usWinDescentLabel, l, 3) + OS2Layout.addWidget(self.usWinDescentEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(sTypoLineGapLabel, l, 0) + OS2Layout.addWidget(self.sTypoLineGapEdit, l, 1, 1, 2) + l += 1 + OS2Layout.addWidget(ySubscriptXSizeLabel, l, 0) + OS2Layout.addWidget(self.ySubscriptXSizeEdit, l, 1, 1, 2) + OS2Layout.addWidget(ySubscriptXOffsetLabel, l, 3) + OS2Layout.addWidget(self.ySubscriptXOffsetEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(ySubscriptYSizeLabel, l, 0) + OS2Layout.addWidget(self.ySubscriptYSizeEdit, l, 1, 1, 2) + OS2Layout.addWidget(ySubscriptYOffsetLabel, l, 3) + OS2Layout.addWidget(self.ySubscriptYOffsetEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(ySuperscriptXSizeLabel, l, 0) + OS2Layout.addWidget(self.ySuperscriptXSizeEdit, l, 1, 1, 2) + OS2Layout.addWidget(ySuperscriptXOffsetLabel, l, 3) + OS2Layout.addWidget(self.ySuperscriptXOffsetEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(ySuperscriptYSizeLabel, l, 0) + OS2Layout.addWidget(self.ySuperscriptYSizeEdit, l, 1, 1, 2) + OS2Layout.addWidget(ySuperscriptYOffsetLabel, l, 3) + OS2Layout.addWidget(self.ySuperscriptYOffsetEdit, l, 4, 1, 2) + l += 1 + OS2Layout.addWidget(yStrikeoutSizeLabel, l, 0) + OS2Layout.addWidget(self.yStrikeoutSizeEdit, l, 1, 1, 2) + OS2Layout.addWidget(yStrikeoutPositionLabel, l, 3) + OS2Layout.addWidget(self.yStrikeoutPositionEdit, l, 4, 1, 2) + # OS2Group.setLayout(OS2Layout) + self.setLayout(OS2Layout) + + def _updateFsTypeVisibility(self, index): + if index == 0: + # TODO: maybe uncheck as well? + self.allowSubsettingBox.setEnabled(False) + self.allowBitmapEmbeddingBox.setEnabled(False) + else: + self.allowSubsettingBox.setEnabled(True) + self.allowBitmapEmbeddingBox.setEnabled(True) + + def writeValues(self, font): + usWidthClass = self.usWidthClassDrop.currentIndex() + if usWidthClass != 0: + font.info.openTypeOS2WidthClass = usWidthClass + else: + font.info.openTypeOS2WidthClass = None + usWeightClass = self.usWeightClassEdit.text() + if usWeightClass != '': + font.info.openTypeOS2WeightClass = int(usWeightClass) + else: + font.info.openTypeOS2WeightClass = None + + fsSelectionModel = self.fsSelectionList.model() + fsSelection = [] + for i in range(7): + item = fsSelectionModel.item(i) + if item.checkState() == Qt.Checked: + fsSelection.append(i) + if len(fsSelection): + font.info.openTypeOS2Selection = fsSelection + else: + # XXX: None or empty array? should distinct those cases + font.info.openTypeOS2Selection = None + + fsTypeIndex = self.fsTypeDrop.currentIndex() + fsType = [] + if fsTypeIndex > 0: + fsType.append(fsTypeIndex) + if not self.allowSubsettingBox.isChecked(): + fsType.append(8) + if self.allowBitmapEmbeddingBox.isChecked(): + fsType.append(9) + # TODO: provide a way to represent None w this? + font.info.openTypeOS2Type = fsType + + # TODO: see if data needs to be padded to 4 chars. + # I think that this is to be deferred to ufo2fdk(?) + font.info.openTypeOS2VendorID = self.achVendorIDEdit.text() + + # XXX: ulUnicodeRange + + # XXX: ulCodePageRange + + sTypoAscender = self.sTypoAscenderEdit.text() + if sTypoAscender != '': + font.info.openTypeOS2TypoAscender = int(sTypoAscender) + else: + font.info.openTypeOS2TypoAscender = None + sTypoDescender = self.sTypoDescenderEdit.text() + if sTypoDescender != '': + font.info.openTypeOS2TypoDescender = int(sTypoDescender) + else: + font.info.openTypeOS2TypoDescender = None + sTypoLineGap = self.sTypoLineGapEdit.text() + if sTypoLineGap != '': + font.info.openTypeOS2TypoLineGap = int(sTypoLineGap) + else: + font.info.openTypeOS2TypoLineGap = None + + usWinAscent = self.usWinAscentEdit.text() + if usWinAscent != '': + font.info.openTypeOS2WinAscent = int(usWinAscent) + else: + font.info.openTypeOS2WinAscent = None + usWinDescent = self.usWinDescentEdit.text() + if usWinDescent != '': + font.info.openTypeOS2WinDescent = int(usWinDescent) + else: + font.info.openTypeOS2WinDescent = None + + ySubscriptXSize = self.ySubscriptXSizeEdit.text() + if ySubscriptXSize != '': + font.info.openTypeOS2SubscriptXSize = int(ySubscriptXSize) + else: + font.info.openTypeOS2SubscriptXSize = None + ySubscriptYSize = self.ySubscriptYSizeEdit.text() + if ySubscriptYSize != '': + font.info.openTypeOS2SubscriptYSize = int(ySubscriptYSize) + else: + font.info.openTypeOS2SubscriptYSize = None + ySubscriptXOffset = self.ySubscriptXOffsetEdit.text() + if ySubscriptXOffset != '': + font.info.openTypeOS2SubscriptXOffset = int(ySubscriptXOffset) + else: + font.info.openTypeOS2SubscriptXOffset = None + ySubscriptYOffset = self.ySubscriptYOffsetEdit.text() + if ySubscriptYOffset != '': + font.info.openTypeOS2SubscriptYOffset = int(ySubscriptYOffset) + else: + font.info.openTypeOS2SubscriptYOffset = None + + ySuperscriptXSize = self.ySuperscriptXSizeEdit.text() + if ySuperscriptXSize != '': + font.info.openTypeOS2SuperscriptXSize = int(ySuperscriptXSize) + else: + font.info.openTypeOS2SuperscriptXSize = None + ySuperscriptYSize = self.ySuperscriptYSizeEdit.text() + if ySuperscriptYSize != '': + font.info.openTypeOS2SuperscriptYSize = int(ySuperscriptYSize) + else: + font.info.openTypeOS2SuperscriptYSize = None + ySuperscriptXOffset = self.ySuperscriptXOffsetEdit.text() + if ySuperscriptXOffset != '': + font.info.openTypeOS2SuperscriptXOffset = int(ySuperscriptXOffset) + else: + font.info.openTypeOS2SuperscriptXOffset = None + ySuperscriptYOffset = self.ySuperscriptYOffsetEdit.text() + if ySuperscriptYOffset != '': + font.info.openTypeOS2SuperscriptYOffset = int(ySuperscriptYOffset) + else: + font.info.openTypeOS2SuperscriptYOffset = None + + yStrikeoutSize = self.yStrikeoutSizeEdit.text() + if yStrikeoutSize != '': + font.info.openTypeOS2StrikeoutSize = int(yStrikeoutSize) + else: + font.info.openTypeOS2StrikeoutSize = None + yStrikeoutPosition = self.yStrikeoutPositionEdit.text() + if yStrikeoutPosition != '': + font.info.openTypeOS2StrikeoutPosition = int(yStrikeoutPosition) + else: + font.info.openTypeOS2StrikeoutPosition = None + + # XXX: panose + + class PostScriptTab(QWidget): name = "Postscript" |
