summaryrefslogtreecommitdiff
path: root/src/gmdocument.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gmdocument.c')
-rw-r--r--src/gmdocument.c287
1 files changed, 152 insertions, 135 deletions
diff --git a/src/gmdocument.c b/src/gmdocument.c
index c943dfe9..83f94a39 100644
--- a/src/gmdocument.c
+++ b/src/gmdocument.c
@@ -583,8 +583,6 @@ void setThemeSeed_GmDocument(iGmDocument *d, const iBlock *seed) {
583 0x1f306, 0x1f308, 0x1f30a, 0x1f319, 0x1f31f, 0x1f320, 0x1f340, 0x1f4cd, 0x1f4e1, 0x1f531, 583 0x1f306, 0x1f308, 0x1f30a, 0x1f319, 0x1f31f, 0x1f320, 0x1f340, 0x1f4cd, 0x1f4e1, 0x1f531,
584 0x1f533, 0x1f657, 0x1f659, 0x1f665, 0x1f668, 0x1f66b, 0x1f78b, 0x1f796, 0x1f79c, 584 0x1f533, 0x1f657, 0x1f659, 0x1f665, 0x1f668, 0x1f66b, 0x1f78b, 0x1f796, 0x1f79c,
585 }; 585 };
586 d->themeSeed = 0;
587 d->siteIcon = 0;
588 /* Default colors. */ { 586 /* Default colors. */ {
589 if (!isLightMode) { 587 if (!isLightMode) {
590 const iHSLColor base = { 0, 0, 0.15f, 1.0f }; 588 const iHSLColor base = { 0, 0, 0.15f, 1.0f };
@@ -600,6 +598,24 @@ void setThemeSeed_GmDocument(iGmDocument *d, const iBlock *seed) {
600 set_Color(tmBannerTitle_ColorId, get_Color(white_ColorId)); 598 set_Color(tmBannerTitle_ColorId, get_Color(white_ColorId));
601 set_Color(tmBannerIcon_ColorId, get_Color(orange_ColorId)); 599 set_Color(tmBannerIcon_ColorId, get_Color(orange_ColorId));
602 set_Color(tmInlineContentMetadata_ColorId, get_Color(cyan_ColorId)); 600 set_Color(tmInlineContentMetadata_ColorId, get_Color(cyan_ColorId));
601 set_Color(tmLinkText_ColorId, get_Color(white_ColorId));
602 set_Color(tmLinkIcon_ColorId, get_Color(cyan_ColorId));
603 set_Color(tmLinkTextHover_ColorId, get_Color(cyan_ColorId));
604 set_Color(tmLinkIconVisited_ColorId, get_Color(teal_ColorId));
605 set_Color(tmLinkDomain_ColorId, get_Color(teal_ColorId));
606 set_Color(tmLinkLastVisitDate_ColorId, get_Color(cyan_ColorId));
607 set_Color(tmHypertextLinkText_ColorId, get_Color(white_ColorId));
608 set_Color(tmHypertextLinkIcon_ColorId, get_Color(orange_ColorId));
609 set_Color(tmHypertextLinkTextHover_ColorId, get_Color(orange_ColorId));
610 set_Color(tmHypertextLinkIconVisited_ColorId, get_Color(brown_ColorId));
611 set_Color(tmHypertextLinkDomain_ColorId, get_Color(brown_ColorId));
612 set_Color(tmHypertextLinkLastVisitDate_ColorId, get_Color(orange_ColorId));
613 set_Color(tmGopherLinkText_ColorId, get_Color(white_ColorId));
614 set_Color(tmGopherLinkIcon_ColorId, get_Color(blue_ColorId));
615 set_Color(tmGopherLinkTextHover_ColorId, get_Color(blue_ColorId));
616 set_Color(tmGopherLinkIconVisited_ColorId, get_Color(magenta_ColorId));
617 set_Color(tmGopherLinkDomain_ColorId, get_Color(magenta_ColorId));
618 set_Color(tmGopherLinkLastVisitDate_ColorId, get_Color(blue_ColorId));
603 } 619 }
604 else { 620 else {
605 const iHSLColor base = { 0, 0, 1.0f, 1.0f }; 621 const iHSLColor base = { 0, 0, 1.0f, 1.0f };
@@ -615,162 +631,164 @@ void setThemeSeed_GmDocument(iGmDocument *d, const iBlock *seed) {
615 set_Color(tmBannerTitle_ColorId, get_Color(gray50_ColorId)); 631 set_Color(tmBannerTitle_ColorId, get_Color(gray50_ColorId));
616 set_Color(tmBannerIcon_ColorId, get_Color(teal_ColorId)); 632 set_Color(tmBannerIcon_ColorId, get_Color(teal_ColorId));
617 set_Color(tmInlineContentMetadata_ColorId, get_Color(brown_ColorId)); 633 set_Color(tmInlineContentMetadata_ColorId, get_Color(brown_ColorId));
634
635 set_Color(tmLinkText_ColorId, get_Color(black_ColorId));
636 set_Color(tmLinkIcon_ColorId, get_Color(teal_ColorId));
637 set_Color(tmLinkTextHover_ColorId, get_Color(teal_ColorId));
638 set_Color(tmLinkIconVisited_ColorId, get_Color(cyan_ColorId));
639 set_Color(tmLinkDomain_ColorId, get_Color(cyan_ColorId));
640 set_Color(tmLinkLastVisitDate_ColorId, get_Color(teal_ColorId));
641 set_Color(tmHypertextLinkText_ColorId, get_Color(black_ColorId));
642 set_Color(tmHypertextLinkIcon_ColorId, get_Color(brown_ColorId));
643 set_Color(tmHypertextLinkTextHover_ColorId, get_Color(brown_ColorId));
644 set_Color(tmHypertextLinkIconVisited_ColorId, get_Color(orange_ColorId));
645 set_Color(tmHypertextLinkDomain_ColorId, get_Color(orange_ColorId));
646 set_Color(tmHypertextLinkLastVisitDate_ColorId, get_Color(brown_ColorId));
647 set_Color(tmGopherLinkText_ColorId, get_Color(black_ColorId));
648 set_Color(tmGopherLinkIcon_ColorId, get_Color(blue_ColorId));
649 set_Color(tmGopherLinkTextHover_ColorId, get_Color(blue_ColorId));
650 set_Color(tmGopherLinkIconVisited_ColorId, get_Color(magenta_ColorId));
651 set_Color(tmGopherLinkDomain_ColorId, get_Color(magenta_ColorId));
652 set_Color(tmGopherLinkLastVisitDate_ColorId, get_Color(blue_ColorId));
618 } 653 }
619 set_Color(tmBadLink_ColorId, get_Color(red_ColorId)); 654 set_Color(tmBadLink_ColorId, get_Color(red_ColorId));
620 set_Color(tmLinkText_ColorId, get_Color(white_ColorId));
621 set_Color(tmLinkIcon_ColorId, get_Color(cyan_ColorId));
622 set_Color(tmLinkTextHover_ColorId, get_Color(cyan_ColorId));
623 set_Color(tmLinkIconVisited_ColorId, get_Color(teal_ColorId));
624 set_Color(tmLinkDomain_ColorId, get_Color(teal_ColorId));
625 set_Color(tmLinkLastVisitDate_ColorId, get_Color(cyan_ColorId));
626 set_Color(tmHypertextLinkText_ColorId, get_Color(white_ColorId));
627 set_Color(tmHypertextLinkIcon_ColorId, get_Color(orange_ColorId));
628 set_Color(tmHypertextLinkTextHover_ColorId, get_Color(orange_ColorId));
629 set_Color(tmHypertextLinkIconVisited_ColorId, get_Color(brown_ColorId));
630 set_Color(tmHypertextLinkDomain_ColorId, get_Color(brown_ColorId));
631 set_Color(tmHypertextLinkLastVisitDate_ColorId, get_Color(orange_ColorId));
632 set_Color(tmGopherLinkText_ColorId, get_Color(white_ColorId));
633 set_Color(tmGopherLinkIcon_ColorId, get_Color(blue_ColorId));
634 set_Color(tmGopherLinkTextHover_ColorId, get_Color(blue_ColorId));
635 set_Color(tmGopherLinkIconVisited_ColorId, get_Color(magenta_ColorId));
636 set_Color(tmGopherLinkDomain_ColorId, get_Color(magenta_ColorId));
637 set_Color(tmGopherLinkLastVisitDate_ColorId, get_Color(blue_ColorId));
638 } 655 }
639 if (seed && !isEmpty_Block(seed)) { 656 if (seed && !isEmpty_Block(seed)) {
640 d->themeSeed = crc32_Block(seed); 657 d->themeSeed = crc32_Block(seed);
641 d->siteIcon = siteIcons[(d->themeSeed >> 7) % iElemCount(siteIcons)]; 658 d->siteIcon = siteIcons[(d->themeSeed >> 7) % iElemCount(siteIcons)];
642 /* Set up colors. */ { 659 }
643 static const float hues[] = { 5, 25, 40, 56, 80, 120, 160, 180, 208, 231, 270, 324 }; 660 else {
644 static const struct { 661 d->themeSeed = 0;
645 int index[2]; 662 d->siteIcon = 0x1f310; /* globe */
646 } altHues[iElemCount(hues)] = { 663 }
647 { 2, 4 }, /* red */ 664 /* Set up colors. */
648 { 8, 3 }, /* reddish orange */ 665 if (d->themeSeed) {
649 { 7, 9 }, /* yellowish orange */ 666 static const float hues[] = { 5, 25, 40, 56, 80, 120, 160, 180, 208, 231, 270, 324 };
650 { 5, 7 }, /* yellow */ 667 static const struct {
651 { 11, 2 }, /* greenish yellow */ 668 int index[2];
652 { 1, 3 }, /* green */ 669 } altHues[iElemCount(hues)] = {
653 { 2, 4 }, /* bluish green */ 670 { 2, 4 }, /* red */
654 { 2, 11 }, /* cyan */ 671 { 8, 3 }, /* reddish orange */
655 { 6, 10 }, /* sky blue */ 672 { 7, 9 }, /* yellowish orange */
656 { 3, 11 }, /* blue */ 673 { 5, 7 }, /* yellow */
657 { 8, 9 }, /* violet */ 674 { 11, 2 }, /* greenish yellow */
658 { 7, 8 }, /* pink */ 675 { 1, 3 }, /* green */
659 }; 676 { 2, 4 }, /* bluish green */
660 const float saturationLevel = 1.0f; /* TODO: user setting */ 677 { 2, 11 }, /* cyan */
661 const iBool isBannerLighter = (d->themeSeed & 0x4000) != 0; 678 { 6, 10 }, /* sky blue */
662 const size_t primIndex = (d->themeSeed & 0xff) % iElemCount(hues); 679 { 3, 11 }, /* blue */
663 const iBool isDarkBgSat = 680 { 8, 9 }, /* violet */
664 (d->themeSeed & 0x200000) != 0 && (primIndex < 1 || primIndex > 4); 681 { 7, 8 }, /* pink */
665 iHSLColor base = { hues[primIndex], 682 };
666 0.8f * (d->themeSeed >> 24) / 255.0f, 683 const float saturationLevel = 1.0f; /* TODO: user setting */
667 0.06f + 0.09f * ((d->themeSeed >> 5) & 0x7) / 7.0f, 684 const iBool isBannerLighter = (d->themeSeed & 0x4000) != 0;
668 1.0f }; 685 const size_t primIndex = d->themeSeed ? (d->themeSeed & 0xff) % iElemCount(hues) : 2;
669 // printf("background: %d %f %f\n", (int) base.hue, base.sat, base.lum); 686 const iBool isDarkBgSat =
670 // printf("isDarkBgSat: %d\n", isDarkBgSat); 687 (d->themeSeed & 0x200000) != 0 && (primIndex < 1 || primIndex > 4);
671 setHsl_Color(tmBackground_ColorId, base); 688 iHSLColor base = { hues[primIndex],
672 689 0.8f * (d->themeSeed >> 24) / 255.0f,
673 setHsl_Color(tmBannerBackground_ColorId, addSatLum_HSLColor(base, 0.1f, 0.04f * (isBannerLighter ? 1 : -1))); 690 0.06f + 0.09f * ((d->themeSeed >> 5) & 0x7) / 7.0f,
674 setHsl_Color(tmBannerTitle_ColorId, setLum_HSLColor(addSatLum_HSLColor(base, 0.1f, 0), 0.55f)); 691 1.0f };
675 setHsl_Color(tmBannerIcon_ColorId, setLum_HSLColor(addSatLum_HSLColor(base, 0.35f, 0), 0.65f)); 692 // printf("background: %d %f %f\n", (int) base.hue, base.sat, base.lum);
676 693 // printf("isDarkBgSat: %d\n", isDarkBgSat);
677 const int altIndex[2] = { (d->themeSeed & 0x4) != 0, 694 setHsl_Color(tmBackground_ColorId, base);
678 (d->themeSeed & 0x40) != 0 }; 695
696 setHsl_Color(tmBannerBackground_ColorId, addSatLum_HSLColor(base, 0.1f, 0.04f * (isBannerLighter ? 1 : -1)));
697 setHsl_Color(tmBannerTitle_ColorId, setLum_HSLColor(addSatLum_HSLColor(base, 0.1f, 0), 0.55f));
698 setHsl_Color(tmBannerIcon_ColorId, setLum_HSLColor(addSatLum_HSLColor(base, 0.35f, 0), 0.65f));
699
700 const int altIndex[2] = { (d->themeSeed & 0x4) != 0,
701 (d->themeSeed & 0x40) != 0 };
679 702
680// printf("primHue: %zu alts: %d %d\n", 703// printf("primHue: %zu alts: %d %d\n",
681// primIndex, 704// primIndex,
682// altHues[primIndex].index[altIndex[0]], 705// altHues[primIndex].index[altIndex[0]],
683// altHues[primIndex].index[altIndex[1]]); 706// altHues[primIndex].index[altIndex[1]]);
684 const float altHue = hues[altHues[primIndex].index[altIndex[0]]]; 707 const float altHue = hues[d->themeSeed ? altHues[primIndex].index[altIndex[0]] : 8];
685 const float altHue2 = hues[altHues[primIndex].index[altIndex[1]]]; 708 const float altHue2 = hues[d->themeSeed ? altHues[primIndex].index[altIndex[1]] : 8];
686 iHSLColor altBase = { altHue, base.sat, base.lum, 1 }; 709 iHSLColor altBase = { altHue, base.sat, base.lum, 1 };
687 const float titleLum = 0.2f * ((d->themeSeed >> 17) & 0x7) / 7.0f; 710 const float titleLum = 0.2f * ((d->themeSeed >> 17) & 0x7) / 7.0f;
688 setHsl_Color(tmHeading1_ColorId, setLum_HSLColor(altBase, titleLum + 0.80f)); 711 setHsl_Color(tmHeading1_ColorId, setLum_HSLColor(altBase, titleLum + 0.80f));
689 setHsl_Color(tmHeading2_ColorId, setLum_HSLColor(altBase, titleLum + 0.70f)); 712 setHsl_Color(tmHeading2_ColorId, setLum_HSLColor(altBase, titleLum + 0.70f));
690 setHsl_Color(tmHeading3_ColorId, setLum_HSLColor(altBase, titleLum + 0.60f)); 713 setHsl_Color(tmHeading3_ColorId, setLum_HSLColor(altBase, titleLum + 0.60f));
691 714
692 setHsl_Color(tmParagraph_ColorId, addSatLum_HSLColor(base, 0.1f, 0.6f)); 715 setHsl_Color(tmParagraph_ColorId, addSatLum_HSLColor(base, 0.1f, 0.6f));
693 setHsl_Color(tmFirstParagraph_ColorId, addSatLum_HSLColor(base, 0.2f, 0.8f)); 716 setHsl_Color(tmFirstParagraph_ColorId, addSatLum_HSLColor(base, 0.2f, 0.8f));
694 setHsl_Color(tmPreformatted_ColorId, (iHSLColor){ altHue2, 1.0f, 0.75f, 1.0f }); 717 setHsl_Color(tmPreformatted_ColorId, (iHSLColor){ altHue2, 1.0f, 0.75f, 1.0f });
695 set_Color(tmQuote_ColorId, get_Color(tmPreformatted_ColorId)); 718 set_Color(tmQuote_ColorId, get_Color(tmPreformatted_ColorId));
696 set_Color(tmInlineContentMetadata_ColorId, get_Color(tmHeading3_ColorId)); 719 set_Color(tmInlineContentMetadata_ColorId, get_Color(tmHeading3_ColorId));
697 720
698 /* Adjust colors based on light/dark mode. */ 721 /* Adjust colors based on light/dark mode. */
699 for (int i = tmFirst_ColorId; i < max_ColorId; i++) { 722 for (int i = tmFirst_ColorId; i < max_ColorId; i++) {
700 iHSLColor color = hsl_Color(get_Color(i)); 723 iHSLColor color = hsl_Color(get_Color(i));
701 if (isLightMode) { 724 if (isLightMode) {
702 color.lum = 1.0f - color.lum; /* All colors invert lightness. */ 725 color.lum = 1.0f - color.lum; /* All colors invert lightness. */
703 if (isRegularText_ColorId(i)) { 726 if (isRegularText_ColorId(i)) {
704 /* Darken paragraphs and default state link text. */ 727 /* Darken paragraphs and default state link text. */
705 color.lum *= 0.5f; 728 color.lum *= 0.5f;
729 }
730 else if (i == tmBackground_ColorId) {
731 color.sat = (color.sat + 1) / 2;
732 color.lum += 0.06f;
733 }
734 else if (i == tmHeading3_ColorId) {
735 color.lum *= 0.75f;
736 }
737 else if (isLink_ColorId(i)) {
738 /* Darken links generally to improve visibility against a
739 light background. */
740 color.lum *= 0.5f;
741 color.sat = 1.0f;
742 }
743 else if (i == tmBannerIcon_ColorId || i == tmBannerTitle_ColorId) {
744 if (isBannerLighter) {
745 color.lum *= 0.75f;
706 } 746 }
707 else if (i == tmBackground_ColorId) { 747 else {
708 color.sat = (color.sat + 1) / 2; 748 color.lum = 0.98f;
709 color.lum += 0.06f;
710 } 749 }
711 else if (i == tmHeading3_ColorId) { 750 }
712 color.lum *= 0.75f; 751 else if (i == tmBannerBackground_ColorId) {
752 if (isBannerLighter) {
753 color.lum = 1.0f;
713 } 754 }
714 else if (isLink_ColorId(i)) { 755 else {
715 /* Darken links generally to improve visibility against a 756 color.sat *= 0.8f;
716 light background. */ 757 color.lum = 0.4f;
717 color.lum *= 0.5f;
718 color.sat = 1.0f;
719 } 758 }
720 else if (i == tmBannerIcon_ColorId || i == tmBannerTitle_ColorId) { 759 }
721 if (isBannerLighter) { 760 else if (isText_ColorId(i)) {
761 color.sat = 0.9f;
762 color.lum = (9 * color.lum + 0.5f) / 10;
763 }
764 }
765 else { /* dark mode */
766 if (!isLink_ColorId(i)) {
767 if (isDarkBgSat) {
768 /* Saturate background, desaturate text. */
769 if (isBackground_ColorId(i)) {
770 color.sat = (color.sat + 1) / 2;
722 color.lum *= 0.75f; 771 color.lum *= 0.75f;
723 } 772 }
724 else { 773 else if (isText_ColorId(i)) {
725 color.lum = 0.98f; 774 color.lum = (color.lum + 1) / 2;
726 } 775 }
727 } 776 }
728 else if (i == tmBannerBackground_ColorId) { 777 else {
729 if (isBannerLighter) { 778 /* Desaturate background, saturate text. */
730 color.lum = 1.0f; 779 if (isBackground_ColorId(i)) {
731 } 780 color.sat *= 0.333f;
732 else {
733 color.sat *= 0.8f;
734 color.lum = 0.4f;
735 }
736 }
737 else if (isText_ColorId(i)) {
738 color.sat = 0.9f;
739 color.lum = (9 * color.lum + 0.5f) / 10;
740 }
741 }
742 else { /* dark mode */
743 if (!isLink_ColorId(i)) {
744 if (isDarkBgSat) {
745 /* Saturate background, desaturate text. */
746 if (isBackground_ColorId(i)) {
747 color.sat = (color.sat + 1) / 2;
748// color.lum = (color.lum + 2 * 0.5f) / 3;
749 color.lum *= 0.75f;
750 }
751 else if (isText_ColorId(i)) {
752// color.sat *= 0.85f;
753 color.lum = (color.lum + 1) / 2;
754 }
755 } 781 }
756 else { 782 else if (isText_ColorId(i)) {
757 /* Desaturate background, saturate text. */ 783 color.sat = (color.sat + 2) / 3;
758 if (isBackground_ColorId(i)) { 784 color.lum = (2 * color.lum + 1) / 3;
759 color.sat *= 0.333f;
760// color.lum *= 0.5f;
761 }
762 else if (isText_ColorId(i)) {
763 color.sat = (color.sat + 2) / 3;
764 color.lum = (2 * color.lum + 1) / 3;
765// color.lum = (color.lum + 0.5f) / 2;
766 }
767 } 785 }
768 } 786 }
769 } 787 }
770 /* Modify overall saturation. */
771 color.sat *= saturationLevel;
772 setHsl_Color(i, color);
773 } 788 }
789 /* Modify overall saturation. */
790 color.sat *= saturationLevel;
791 setHsl_Color(i, color);
774 } 792 }
775 } 793 }
776 /* Special exceptions. */ 794 /* Special exceptions. */
@@ -779,7 +797,6 @@ void setThemeSeed_GmDocument(iGmDocument *d, const iBlock *seed) {
779 d->siteIcon = 0x264a; /* gemini symbol */ 797 d->siteIcon = 0x264a; /* gemini symbol */
780 } 798 }
781 } 799 }
782 fflush(stdout);
783} 800}
784 801
785void setFormat_GmDocument(iGmDocument *d, enum iGmDocumentFormat format) { 802void setFormat_GmDocument(iGmDocument *d, enum iGmDocumentFormat format) {