... |
... |
@@ -7,9 +7,16 @@ |
7
|
7
|
#include "../uihelper.hpp"
|
8
|
8
|
#include "../engine/engine.hpp"
|
9
|
9
|
|
|
10
|
+#include <cstring>
|
10
|
11
|
#include <QStringList>
|
11
|
12
|
#include <QHeaderView>
|
12
|
13
|
|
|
14
|
+
|
|
15
|
+#define GL2CRow(l, w) gridLayout2ColAddWidget(l, \
|
|
16
|
+ w##PromptLabel_, \
|
|
17
|
+ w##Label_)
|
|
18
|
+
|
|
19
|
+
|
13
|
20
|
InfoTab::InfoTab(QWidget* parent,
|
14
|
21
|
Engine* engine)
|
15
|
22
|
: QWidget(parent), engine_(engine)
|
... |
... |
@@ -199,6 +206,10 @@ GeneralInfoTab::createLayout() |
199
|
206
|
setLabelSelectable( trademarkLabel_);
|
200
|
207
|
setLabelSelectable(manufacturerLabel_);
|
201
|
208
|
|
|
209
|
+ copyrightLabel_->setWordWrap(true);
|
|
210
|
+ trademarkLabel_->setWordWrap(true);
|
|
211
|
+ manufacturerLabel_->setWordWrap(true);
|
|
212
|
+
|
202
|
213
|
driverNamePromptLabel_ = new QLabel(tr("Driver:"), this);
|
203
|
214
|
sfntPromptLabel_ = new QLabel(tr("SFNT Wrapped:"), this);
|
204
|
215
|
fontTypePromptLabel_ = new QLabel(tr("Type:"), this);
|
... |
... |
@@ -290,9 +301,6 @@ GeneralInfoTab::createLayout() |
290
|
301
|
charMapLayout_ = new QHBoxLayout;
|
291
|
302
|
fixedSizesLayout_ = new QHBoxLayout;
|
292
|
303
|
|
293
|
|
-#define GL2CRow(l, w) gridLayout2ColAddWidget(l , \
|
294
|
|
- w##PromptLabel_, \
|
295
|
|
- w##Label_)
|
296
|
304
|
#define BasicRow(w) GL2CRow(basicLayout_, w)
|
297
|
305
|
#define FTERow(w) GL2CRow(typeEntriesLayout_, w)
|
298
|
306
|
|
... |
... |
@@ -322,6 +330,9 @@ GeneralInfoTab::createLayout() |
322
|
330
|
FTERow( ulPos);
|
323
|
331
|
FTERow( ulThickness);
|
324
|
332
|
|
|
333
|
+ basicLayout_->setColumnStretch(1, 1);
|
|
334
|
+ typeEntriesLayout_->setColumnStretch(1, 1);
|
|
335
|
+
|
325
|
336
|
charMapLayout_->addWidget(charMapsTable_);
|
326
|
337
|
fixedSizesLayout_->addWidget(fixedSizesTable_);
|
327
|
338
|
|
... |
... |
@@ -402,6 +413,11 @@ SFNTInfoTab::SFNTInfoTab(QWidget* parent, |
402
|
413
|
void
|
403
|
414
|
SFNTInfoTab::reloadFont()
|
404
|
415
|
{
|
|
416
|
+ engine_->reloadFont();
|
|
417
|
+ auto size = engine_->currentFtSize();
|
|
418
|
+ if (!size || !FT_IS_SFNT(size->face))
|
|
419
|
+ setEnabled(false);
|
|
420
|
+
|
405
|
421
|
if (engine_->currentFontSFNTNames() != sfntNamesModel_->storage())
|
406
|
422
|
{
|
407
|
423
|
sfntNamesModel_->beginModelUpdate();
|
... |
... |
@@ -480,12 +496,295 @@ PostScriptInfoTab::PostScriptInfoTab(QWidget* parent, |
480
|
496
|
Engine* engine)
|
481
|
497
|
: QWidget(parent), engine_(engine)
|
482
|
498
|
{
|
|
499
|
+ std::memset(&oldFontPrivate_, 0, sizeof(PS_PrivateRec));
|
|
500
|
+ createLayout();
|
|
501
|
+}
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+template<class T>
|
|
505
|
+QString genArrayString(T* arr, size_t size)
|
|
506
|
+{
|
|
507
|
+ // TODO: optimize
|
|
508
|
+ QString result = "[";
|
|
509
|
+ for (size_t i = 0; i < size; i++)
|
|
510
|
+ {
|
|
511
|
+ result += QString::number(arr[i]);
|
|
512
|
+ if (i < size - 1)
|
|
513
|
+ result += ", ";
|
|
514
|
+ }
|
|
515
|
+ return result + "]";
|
483
|
516
|
}
|
484
|
517
|
|
485
|
518
|
|
486
|
519
|
void
|
487
|
520
|
PostScriptInfoTab::reloadFont()
|
488
|
521
|
{
|
|
522
|
+ PS_FontInfoRec fontInfo;
|
|
523
|
+ auto hasInfo = engine_->currentFontPSInfo(fontInfo);
|
|
524
|
+ infoGroupBox_->setEnabled(hasInfo);
|
|
525
|
+ if (hasInfo)
|
|
526
|
+ {
|
|
527
|
+ versionLabel_->setText(QString::fromUtf8(fontInfo.version));
|
|
528
|
+ noticeLabel_->setText(QString::fromUtf8(fontInfo.notice));
|
|
529
|
+ fullNameLabel_->setText(QString::fromUtf8(fontInfo.full_name));
|
|
530
|
+ familyNameLabel_->setText(QString::fromUtf8(fontInfo.family_name));
|
|
531
|
+ weightLabel_->setText(QString::fromUtf8(fontInfo.weight));
|
|
532
|
+ italicAngleLabel_->setText(QString::number(fontInfo.italic_angle));
|
|
533
|
+ fixedPitchLabel_->setText(fontInfo.is_fixed_pitch ? "yes" : "no");
|
|
534
|
+ ulPosLabel_->setText(QString::number(fontInfo.underline_position));
|
|
535
|
+ ulThicknessLabel_->setText(QString::number(fontInfo.underline_thickness));
|
|
536
|
+ }
|
|
537
|
+ else
|
|
538
|
+ {
|
|
539
|
+ versionLabel_->clear();
|
|
540
|
+ noticeLabel_->clear();
|
|
541
|
+ fullNameLabel_->clear();
|
|
542
|
+ familyNameLabel_->clear();
|
|
543
|
+ weightLabel_->clear();
|
|
544
|
+ italicAngleLabel_->clear();
|
|
545
|
+ fixedPitchLabel_->clear();
|
|
546
|
+ ulPosLabel_->clear();
|
|
547
|
+ ulThicknessLabel_->clear();
|
|
548
|
+ }
|
|
549
|
+
|
|
550
|
+ PS_PrivateRec fontPrivate;
|
|
551
|
+ // Don't do zero-initialization since we need to zero out paddings
|
|
552
|
+ std::memset(&fontPrivate, 0, sizeof(PS_PrivateRec));
|
|
553
|
+ hasInfo = engine_->currentFontPSPrivateInfo(fontPrivate);
|
|
554
|
+ privateGroupBox_->setEnabled(hasInfo);
|
|
555
|
+ if (hasInfo)
|
|
556
|
+ {
|
|
557
|
+ if (std::memcmp(&fontPrivate, &oldFontPrivate_, sizeof(PS_PrivateRec)))
|
|
558
|
+ {
|
|
559
|
+ std::memcpy(&oldFontPrivate_, &fontPrivate, sizeof(PS_PrivateRec));
|
|
560
|
+
|
|
561
|
+ uniqueIDLabel_->setText(QString::number(fontPrivate.unique_id));
|
|
562
|
+ blueShiftLabel_->setText(QString::number(fontPrivate.blue_shift));
|
|
563
|
+ blueFuzzLabel_->setText(QString::number(fontPrivate.blue_fuzz));
|
|
564
|
+ forceBoldLabel_->setText(fontPrivate.force_bold ? "true" : "false");
|
|
565
|
+ languageGroupLabel_->setText(QString::number(fontPrivate.language_group));
|
|
566
|
+ passwordLabel_->setText(QString::number(fontPrivate.password));
|
|
567
|
+ lenIVLabel_->setText(QString::number(fontPrivate.lenIV));
|
|
568
|
+ roundStemUpLabel_->setText(fontPrivate.round_stem_up ? "true" : "false");
|
|
569
|
+
|
|
570
|
+ familyBluesLabel_->setText(
|
|
571
|
+ genArrayString(fontPrivate.family_blues, fontPrivate.num_family_blues));
|
|
572
|
+ blueValuesLabel_->setText(
|
|
573
|
+ genArrayString(fontPrivate.blue_values, fontPrivate.num_blue_values));
|
|
574
|
+ otherBluesLabel_->setText(
|
|
575
|
+ genArrayString(fontPrivate.other_blues, fontPrivate.num_other_blues));
|
|
576
|
+ familyOtherBluesLabel_->setText(
|
|
577
|
+ genArrayString(fontPrivate.family_other_blues,
|
|
578
|
+ fontPrivate.num_family_other_blues));
|
|
579
|
+ stdWidthsLabel_->setText(
|
|
580
|
+ genArrayString(fontPrivate.standard_width,
|
|
581
|
+ std::size(fontPrivate.standard_width)));
|
|
582
|
+ stdHeightsLabel_->setText(
|
|
583
|
+ genArrayString(fontPrivate.standard_height,
|
|
584
|
+ std::size(fontPrivate.standard_height)));
|
|
585
|
+ snapWidthsLabel_->setText(
|
|
586
|
+ genArrayString(fontPrivate.snap_widths, fontPrivate.num_snap_widths));
|
|
587
|
+ snapHeightsLabel_->setText(
|
|
588
|
+ genArrayString(fontPrivate.snap_heights, fontPrivate.num_snap_heights));
|
|
589
|
+ minFeatureLabel_->setText(
|
|
590
|
+ genArrayString(fontPrivate.min_feature,
|
|
591
|
+ std::size(fontPrivate.min_feature)));
|
|
592
|
+
|
|
593
|
+ blueScaleLabel_->setText(
|
|
594
|
+ QString::number(fontPrivate.blue_scale / 65536.0 / 1000.0, 'f', 6));
|
|
595
|
+ expansionFactorLabel_->setText(
|
|
596
|
+ QString::number(fontPrivate.expansion_factor / 65536.0, 'f', 4));
|
|
597
|
+ }
|
|
598
|
+ }
|
|
599
|
+ else
|
|
600
|
+ {
|
|
601
|
+ uniqueIDLabel_->clear();
|
|
602
|
+ blueValuesLabel_->clear();
|
|
603
|
+ otherBluesLabel_->clear();
|
|
604
|
+ familyBluesLabel_->clear();
|
|
605
|
+ familyOtherBluesLabel_->clear();
|
|
606
|
+ blueScaleLabel_->clear();
|
|
607
|
+ blueShiftLabel_->clear();
|
|
608
|
+ blueFuzzLabel_->clear();
|
|
609
|
+ stdWidthsLabel_->clear();
|
|
610
|
+ stdHeightsLabel_->clear();
|
|
611
|
+ snapWidthsLabel_->clear();
|
|
612
|
+ snapHeightsLabel_->clear();
|
|
613
|
+ forceBoldLabel_->clear();
|
|
614
|
+ languageGroupLabel_->clear();
|
|
615
|
+ passwordLabel_->clear();
|
|
616
|
+ lenIVLabel_->clear();
|
|
617
|
+ minFeatureLabel_->clear();
|
|
618
|
+ roundStemUpLabel_->clear();
|
|
619
|
+ expansionFactorLabel_->clear();
|
|
620
|
+ }
|
|
621
|
+}
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+void
|
|
625
|
+PostScriptInfoTab::createLayout()
|
|
626
|
+{
|
|
627
|
+ versionPromptLabel_ = new QLabel(tr("/version:"), this);
|
|
628
|
+ noticePromptLabel_ = new QLabel(tr("/Notice:"), this);
|
|
629
|
+ fullNamePromptLabel_ = new QLabel(tr("/FullName:"), this);
|
|
630
|
+ familyNamePromptLabel_ = new QLabel(tr("/FamilyName:"), this);
|
|
631
|
+ weightPromptLabel_ = new QLabel(tr("/Weight:"), this);
|
|
632
|
+ italicAnglePromptLabel_ = new QLabel(tr("/ItaticAngle:"), this);
|
|
633
|
+ fixedPitchPromptLabel_ = new QLabel(tr("/isFixedPitch:"), this);
|
|
634
|
+ ulPosPromptLabel_ = new QLabel(tr("/UnderlinePosition:"), this);
|
|
635
|
+ ulThicknessPromptLabel_ = new QLabel(tr("/UnderlineThickness:"), this);
|
|
636
|
+
|
|
637
|
+ versionLabel_ = new QLabel(this);
|
|
638
|
+ noticeLabel_ = new QLabel(this);
|
|
639
|
+ fullNameLabel_ = new QLabel(this);
|
|
640
|
+ familyNameLabel_ = new QLabel(this);
|
|
641
|
+ weightLabel_ = new QLabel(this);
|
|
642
|
+ italicAngleLabel_ = new QLabel(this);
|
|
643
|
+ fixedPitchLabel_ = new QLabel(this);
|
|
644
|
+ ulPosLabel_ = new QLabel(this);
|
|
645
|
+ ulThicknessLabel_ = new QLabel(this);
|
|
646
|
+
|
|
647
|
+ setLabelSelectable( versionLabel_);
|
|
648
|
+ setLabelSelectable( noticeLabel_);
|
|
649
|
+ setLabelSelectable( fullNameLabel_);
|
|
650
|
+ setLabelSelectable( familyNameLabel_);
|
|
651
|
+ setLabelSelectable( weightLabel_);
|
|
652
|
+ setLabelSelectable(italicAngleLabel_);
|
|
653
|
+ setLabelSelectable( fixedPitchLabel_);
|
|
654
|
+ setLabelSelectable( ulPosLabel_);
|
|
655
|
+ setLabelSelectable(ulThicknessLabel_);
|
|
656
|
+
|
|
657
|
+ uniqueIDPromptLabel_ = new QLabel(tr("/UniqueID:"), this);
|
|
658
|
+ blueValuesPromptLabel_ = new QLabel(tr("/BlueValues:"), this);
|
|
659
|
+ otherBluesPromptLabel_ = new QLabel(tr("/OtherBlues:"), this);
|
|
660
|
+ familyBluesPromptLabel_ = new QLabel(tr("/FamilyBlues:"), this);
|
|
661
|
+ familyOtherBluesPromptLabel_ = new QLabel(tr("/FamilyOtherBlues:"), this);
|
|
662
|
+ blueScalePromptLabel_ = new QLabel(tr("/BlueScale:"), this);
|
|
663
|
+ blueShiftPromptLabel_ = new QLabel(tr("/BlueShift:"), this);
|
|
664
|
+ blueFuzzPromptLabel_ = new QLabel(tr("/BlueFuzz:"), this);
|
|
665
|
+ stdWidthsPromptLabel_ = new QLabel(tr("/StdHW:"), this);
|
|
666
|
+ stdHeightsPromptLabel_ = new QLabel(tr("/StdVW:"), this);
|
|
667
|
+ snapWidthsPromptLabel_ = new QLabel(tr("/StemSnapH:"), this);
|
|
668
|
+ snapHeightsPromptLabel_ = new QLabel(tr("/StemSnapV:"), this);
|
|
669
|
+ forceBoldPromptLabel_ = new QLabel(tr("/ForceBold:"), this);
|
|
670
|
+ languageGroupPromptLabel_ = new QLabel(tr("/LanguageGroup:"), this);
|
|
671
|
+ passwordPromptLabel_ = new QLabel(tr("/password:"), this);
|
|
672
|
+ lenIVPromptLabel_ = new QLabel(tr("/lenIV:"), this);
|
|
673
|
+ minFeaturePromptLabel_ = new QLabel(tr("/MinFeature:"), this);
|
|
674
|
+ roundStemUpPromptLabel_ = new QLabel(tr("/RndStemUp:"), this);
|
|
675
|
+ expansionFactorPromptLabel_ = new QLabel(tr("/ExpansionFactor:"), this);
|
|
676
|
+
|
|
677
|
+ uniqueIDLabel_ = new QLabel(this);
|
|
678
|
+ blueValuesLabel_ = new QLabel(this);
|
|
679
|
+ otherBluesLabel_ = new QLabel(this);
|
|
680
|
+ familyBluesLabel_ = new QLabel(this);
|
|
681
|
+ familyOtherBluesLabel_ = new QLabel(this);
|
|
682
|
+ blueScaleLabel_ = new QLabel(this);
|
|
683
|
+ blueShiftLabel_ = new QLabel(this);
|
|
684
|
+ blueFuzzLabel_ = new QLabel(this);
|
|
685
|
+ stdWidthsLabel_ = new QLabel(this);
|
|
686
|
+ stdHeightsLabel_ = new QLabel(this);
|
|
687
|
+ snapWidthsLabel_ = new QLabel(this);
|
|
688
|
+ snapHeightsLabel_ = new QLabel(this);
|
|
689
|
+ forceBoldLabel_ = new QLabel(this);
|
|
690
|
+ languageGroupLabel_ = new QLabel(this);
|
|
691
|
+ passwordLabel_ = new QLabel(this);
|
|
692
|
+ lenIVLabel_ = new QLabel(this);
|
|
693
|
+ minFeatureLabel_ = new QLabel(this);
|
|
694
|
+ roundStemUpLabel_ = new QLabel(this);
|
|
695
|
+ expansionFactorLabel_ = new QLabel(this);
|
|
696
|
+
|
|
697
|
+ setLabelSelectable( uniqueIDLabel_);
|
|
698
|
+ setLabelSelectable( blueValuesLabel_);
|
|
699
|
+ setLabelSelectable( otherBluesLabel_);
|
|
700
|
+ setLabelSelectable( familyBluesLabel_);
|
|
701
|
+ setLabelSelectable(familyOtherBluesLabel_);
|
|
702
|
+ setLabelSelectable( blueScaleLabel_);
|
|
703
|
+ setLabelSelectable( blueShiftLabel_);
|
|
704
|
+ setLabelSelectable( blueFuzzLabel_);
|
|
705
|
+ setLabelSelectable( stdWidthsLabel_);
|
|
706
|
+ setLabelSelectable( stdHeightsLabel_);
|
|
707
|
+ setLabelSelectable( snapWidthsLabel_);
|
|
708
|
+ setLabelSelectable( snapHeightsLabel_);
|
|
709
|
+ setLabelSelectable( forceBoldLabel_);
|
|
710
|
+ setLabelSelectable( languageGroupLabel_);
|
|
711
|
+ setLabelSelectable( passwordLabel_);
|
|
712
|
+ setLabelSelectable( lenIVLabel_);
|
|
713
|
+ setLabelSelectable( minFeatureLabel_);
|
|
714
|
+ setLabelSelectable( roundStemUpLabel_);
|
|
715
|
+ setLabelSelectable( expansionFactorLabel_);
|
|
716
|
+
|
|
717
|
+ noticeLabel_->setWordWrap(true);
|
|
718
|
+ familyBluesLabel_->setWordWrap(true);
|
|
719
|
+ blueValuesLabel_->setWordWrap(true);
|
|
720
|
+ otherBluesLabel_->setWordWrap(true);
|
|
721
|
+ familyOtherBluesLabel_->setWordWrap(true);
|
|
722
|
+ stdWidthsLabel_->setWordWrap(true);
|
|
723
|
+ stdHeightsLabel_->setWordWrap(true);
|
|
724
|
+ snapWidthsLabel_->setWordWrap(true);
|
|
725
|
+ snapHeightsLabel_->setWordWrap(true);
|
|
726
|
+ minFeatureLabel_->setWordWrap(true);
|
|
727
|
+
|
|
728
|
+ infoGroupBox_ = new QGroupBox(tr("PostScript /FontInfo dictionary"), this);
|
|
729
|
+ privateGroupBox_ = new QGroupBox(tr("PostScript /Private dictionary"), this);
|
|
730
|
+
|
|
731
|
+ infoLayout_ = new QGridLayout;
|
|
732
|
+ privateLayout_ = new QGridLayout;
|
|
733
|
+
|
|
734
|
+#define PSI2Row(w) GL2CRow(infoLayout_, w)
|
|
735
|
+#define PSP2Row(w) GL2CRow(privateLayout_, w)
|
|
736
|
+
|
|
737
|
+ PSI2Row( version);
|
|
738
|
+ PSI2Row( notice);
|
|
739
|
+ PSI2Row( fullName);
|
|
740
|
+ PSI2Row( familyName);
|
|
741
|
+ PSI2Row( weight);
|
|
742
|
+ PSI2Row(italicAngle);
|
|
743
|
+ PSI2Row( fixedPitch);
|
|
744
|
+ PSI2Row( ulPos);
|
|
745
|
+ PSI2Row(ulThickness);
|
|
746
|
+
|
|
747
|
+ PSP2Row( uniqueID);
|
|
748
|
+ PSP2Row( blueValues);
|
|
749
|
+ PSP2Row( otherBlues);
|
|
750
|
+ PSP2Row( familyBlues);
|
|
751
|
+ PSP2Row(familyOtherBlues);
|
|
752
|
+ PSP2Row( blueScale);
|
|
753
|
+ PSP2Row( blueShift);
|
|
754
|
+ PSP2Row( blueFuzz);
|
|
755
|
+ PSP2Row( stdWidths);
|
|
756
|
+ PSP2Row( stdHeights);
|
|
757
|
+ PSP2Row( snapWidths);
|
|
758
|
+ PSP2Row( snapHeights);
|
|
759
|
+ PSP2Row( forceBold);
|
|
760
|
+ PSP2Row( languageGroup);
|
|
761
|
+ PSP2Row( password);
|
|
762
|
+ PSP2Row( lenIV);
|
|
763
|
+ PSP2Row( minFeature);
|
|
764
|
+ PSP2Row( roundStemUp);
|
|
765
|
+ PSP2Row( expansionFactor);
|
|
766
|
+
|
|
767
|
+ infoLayout_->addItem(new QSpacerItem(0, 0,
|
|
768
|
+ QSizePolicy::Preferred,
|
|
769
|
+ QSizePolicy::Expanding),
|
|
770
|
+ infoLayout_->rowCount(), 0, 1, 2);
|
|
771
|
+ privateLayout_->addItem(new QSpacerItem(0, 0,
|
|
772
|
+ QSizePolicy::Preferred,
|
|
773
|
+ QSizePolicy::Expanding),
|
|
774
|
+ privateLayout_->rowCount(), 0, 1, 2);
|
|
775
|
+
|
|
776
|
+ infoLayout_->setColumnStretch(1, 1);
|
|
777
|
+ privateLayout_->setColumnStretch(1, 1);
|
|
778
|
+
|
|
779
|
+ infoGroupBox_->setLayout(infoLayout_);
|
|
780
|
+ privateGroupBox_->setLayout(privateLayout_);
|
|
781
|
+ infoGroupBox_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
|
|
782
|
+ privateGroupBox_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
|
|
783
|
+
|
|
784
|
+ mainLayout_ = new QHBoxLayout;
|
|
785
|
+ mainLayout_->addWidget(infoGroupBox_);
|
|
786
|
+ mainLayout_->addWidget(privateGroupBox_);
|
|
787
|
+ setLayout(mainLayout_);
|
489
|
788
|
}
|
490
|
789
|
|
491
|
790
|
|