=> edf1c0bb8b112879433f2e31fd9750c30e2d5144
[1mdiff --git a/src/gmdocument.c b/src/gmdocument.c[m [1mindex 2f3a006f..1ff085c7 100644[m [1m--- a/src/gmdocument.c[m [1m+++ b/src/gmdocument.c[m [36m@@ -304,6 +304,7 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m iBool isPreformat = iFalse;[m iRangecc preAltText = iNullRange;[m int preFont = preformatted_FontId;[m [32m+[m[32m uint16_t preId = 0;[m iBool enableIndents = iFalse;[m iBool addSiteBanner = d->siteBannerEnabled;[m enum iGmLineType prevType = text_GmLineType;[m [36m@@ -313,12 +314,7 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m }[m while (nextSplit_Rangecc(content, "\n", &contentLine)) {[m iRangecc line = contentLine; /* `line` will be trimmed later; would confuse nextSplit */[m [31m- iGmRun run;[m [31m- run.flags = 0;[m [31m- run.color = white_ColorId;[m [31m- run.linkId = 0;[m [31m- run.imageId = 0;[m [31m- run.audioId = 0;[m [32m+[m[32m iGmRun run = { .color = white_ColorId };[m enum iGmLineType type;[m int indent = 0;[m /* Detect the type of the line. */[m [36m@@ -330,6 +326,7 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m indent = indents[type];[m if (type == preformatted_GmLineType) {[m isPreformat = iTrue;[m [32m+[m[32m preId++;[m preFont = preformatted_FontId;[m /* Use a smaller font if the block contents are wide. */[m if (measurePreformattedBlock_GmDocument_(d, line.start, preFont).x >[m [36m@@ -370,6 +367,7 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m addSiteBanner = iFalse; /* overrides the banner */[m continue;[m }[m [32m+[m[32m run.preId = preId;[m run.font = (d->format == plainText_GmDocumentFormat ? regularMonospace_FontId : preFont);[m indent = indents[type];[m }[m [36m@@ -509,8 +507,9 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m }[m run.bounds.pos = addX_I2(pos, indent * gap_Text);[m const char *contPos;[m [31m- const int avail = d->size.x - run.bounds.pos.x;[m [32m+[m[32m const int avail = isPreformat ? 0 : (d->size.x - run.bounds.pos.x);[m const iInt2 dims = tryAdvance_Text(run.font, runLine, avail, &contPos);[m [32m+[m[32m iChangeFlags(run.flags, wide_GmRunFlag, (isPreformat && dims.x > d->size.x));[m run.bounds.size.x = iMax(avail, dims.x); /* Extends to the right edge for selection. */[m run.bounds.size.y = dims.y;[m run.visBounds = run.bounds;[m [36m@@ -596,6 +595,19 @@[m [mstatic void doLayout_GmDocument_(iGmDocument *d) {[m prevType = type;[m }[m d->size.y = pos.y;[m [32m+[m[32m /* Go over the preformatted blocks and mark them wide if at least one run is wide. */ {[m [32m+[m[32m iForEach(Array, i, &d->layout) {[m [32m+[m[32m iGmRun *run = i.value;[m [32m+[m[32m if (run->preId && run->flags & wide_GmRunFlag) {[m [32m+[m[32m iGmRunRange block = findPreformattedRange_GmDocument(d, run);[m [32m+[m[32m for (const iGmRun *j = block.start; j != block.end; j++) {[m [32m+[m[32m iConstCast(iGmRun *, j)->flags |= wide_GmRunFlag;[m [32m+[m[32m }[m [32m+[m[32m /* Skip to the end of the block. */[m [32m+[m[32m i.pos = block.end - (const iGmRun *) constData_Array(&d->layout) - 1;[m [32m+[m[32m }[m [32m+[m[32m }[m [32m+[m[32m }[m }[m [m void init_GmDocument(iGmDocument *d) {[m [36m@@ -1237,6 +1249,23 @@[m [miRangecc findTextBefore_GmDocument(const iGmDocument *d, const iString *text, co[m return found;[m }[m [m [32m+[m[32miGmRunRange findPreformattedRange_GmDocument(const iGmDocument *d, const iGmRun *run) {[m [32m+[m[32m iAssert(run->preId);[m [32m+[m[32m iGmRunRange range = { run, run };[m [32m+[m[32m /* Find the beginning. */[m [32m+[m[32m while (range.start > (const iGmRun *) constData_Array(&d->layout)) {[m [32m+[m[32m const iGmRun *prev = range.start - 1;[m [32m+[m[32m if (prev->preId != run->preId) break;[m [32m+[m[32m range.start = prev;[m [32m+[m[32m }[m [32m+[m[32m /* Find the ending. */[m [32m+[m[32m while (range.end < (const iGmRun *) constEnd_Array(&d->layout)) {[m [32m+[m[32m if (range.end->preId != run->preId) break;[m [32m+[m[32m range.end++;[m [32m+[m[32m }[m [32m+[m[32m return range;[m [32m+[m[32m}[m [32m+[m const iGmRun *findRun_GmDocument(const iGmDocument *d, iInt2 pos) {[m /* TODO: Perf optimization likely needed; use a block map? */[m const iGmRun *last = NULL;[m [1mdiff --git a/src/gmdocument.h b/src/gmdocument.h[m [1mindex c2a4b272..6804d772 100644[m [1m--- a/src/gmdocument.h[m [1m+++ b/src/gmdocument.h[m [36m@@ -90,11 +90,19 @@[m [mstruct Impl_GmRun {[m uint8_t flags;[m iRect bounds; /* used for hit testing, may extend to edges */[m iRect visBounds; /* actual visual bounds */[m [32m+[m[32m uint16_t preId; /* preformatted block ID (sequential) */[m iGmLinkId linkId; /* zero for non-links */[m uint16_t imageId; /* zero if not an image */[m uint16_t audioId; /* zero if not audio */[m };[m [m [32m+[m[32miDeclareType(GmRunRange)[m [32m+[m [32m+[m[32mstruct Impl_GmRunRange {[m [32m+[m[32m const iGmRun *start;[m [32m+[m[32m const iGmRun *end;[m [32m+[m[32m};[m [32m+[m const char * findLoc_GmRun (const iGmRun *, iInt2 pos);[m [m iDeclareClass(GmDocument)[m [36m@@ -130,8 +138,9 @@[m [mconst iString * bannerText_GmDocument (const iGmDocument *);[m const iArray * headings_GmDocument (const iGmDocument *); /* array of GmHeadings */[m const iString * source_GmDocument (const iGmDocument *);[m [m [31m-iRangecc findText_GmDocument (const iGmDocument *, const iString *text, const char *start);[m [31m-iRangecc findTextBefore_GmDocument (const iGmDocument *, const iString *text, const char *before);[m [32m+[m[32miRangecc findText_GmDocument (const iGmDocument *, const iString *text, const char *start);[m [32m+[m[32miRangecc findTextBefore_GmDocument (const iGmDocument *, const iString *text, const char *before);[m [32m+[m[32miGmRunRange findPreformattedRange_GmDocument (const iGmDocument *, const iGmRun *run);[m [m enum iGmLinkPart {[m icon_GmLinkPart,[m [1mdiff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c[m [1mindex 4de25b58..a1b26e7f 100644[m [1m--- a/src/ui/documentwidget.c[m [1m+++ b/src/ui/documentwidget.c[m [36m@@ -157,6 +157,8 @@[m [mstruct Impl_DocumentWidget {[m iRangecc foundMark;[m int pageMargin;[m iPtrArray visibleLinks;[m [32m+[m[32m iPtrArray visibleWideRuns; /* scrollable blocks */[m [32m+[m[32m iArray wideRunOffsets;[m iPtrArray visiblePlayers; /* currently playing audio */[m const iGmRun * grabbedPlayer; /* currently adjusting volume in a player */[m float grabbedStartVolume;[m [36m@@ -218,6 +220,8 @@[m [mvoid init_DocumentWidget(iDocumentWidget *d) {[m init_Block(&d->sourceContent, 0);[m iZap(d->sourceTime);[m init_PtrArray(&d->visibleLinks);[m [32m+[m[32m init_PtrArray(&d->visibleWideRuns);[m [32m+[m[32m init_Array(&d->wideRunOffsets, sizeof(int));[m init_PtrArray(&d->visiblePlayers);[m d->grabbedPlayer = NULL;[m d->playerTimer = 0;[m [36m@@ -256,7 +260,9 @@[m [mvoid deinit_DocumentWidget(iDocumentWidget *d) {[m if (d->playerTimer) {[m SDL_RemoveTimer(d->playerTimer);[m }[m [32m+[m[32m deinit_Array(&d->wideRunOffsets);[m deinit_PtrArray(&d->visiblePlayers);[m [32m+[m[32m deinit_PtrArray(&d->visibleWideRuns);[m deinit_PtrArray(&d->visibleLinks);[m delete_Block(d->certFingerprint);[m delete_String(d->certSubject);[m [36m@@ -317,20 +323,6 @@[m [mstatic iRect siteBannerRect_DocumentWidget_(const iDocumentWidget *d) {[m return moved_Rect(banner->visBounds, origin);[m }[m [m [31m-#if 0[m [31m-static int forceBreakWidth_DocumentWidget_(const iDocumentWidget *d) {[m [31m- if (equalCase_Rangecc(urlScheme_String(d->mod.url), "gopher")) {[m [31m- return documentWidth_DocumentWidget_(d);[m [31m- }[m [31m- if (forceLineWrap_App()) {[m [31m- const iRect bounds = bounds_Widget(constAs_Widget(d));[m [31m- const iRect docBounds = documentBounds_DocumentWidget_(d);[m [31m- return right_Rect(bounds) - left_Rect(docBounds) - gap_UI * d->pageMargin;[m [31m- }[m [31m- return 0;[m [31m-}[m [31m-#endif[m [31m-[m static iInt2 documentPos_DocumentWidget_(const iDocumentWidget *d, iInt2 pos) {[m return addY_I2(sub_I2(pos, topLeft_Rect(documentBounds_DocumentWidget_(d))),[m value_Anim(&d->scrollY));[m [36m@@ -351,6 +343,9 @@[m [mstatic void addVisible_DocumentWidget_(void *context, const iGmRun *run) {[m }[m d->lastVisibleRun = run;[m }[m [32m+[m[32m if (run->preId && run->flags & wide_GmRunFlag) {[m [32m+[m[32m pushBack_PtrArray(&d->visibleWideRuns, run);[m [32m+[m[32m }[m if (run->audioId) {[m pushBack_PtrArray(&d->visiblePlayers, run);[m }[m [36m@@ -538,6 +533,7 @@[m [mstatic void updateVisible_DocumentWidget_(iDocumentWidget *d) {[m value_Anim(&d->scrollY),[m docSize > 0 ? height_Rect(bounds) * size_Range(&visRange) / docSize : 0);[m clear_PtrArray(&d->visibleLinks);[m [32m+[m[32m clear_PtrArray(&d->visibleWideRuns);[m clear_PtrArray(&d->visiblePlayers);[m const iRangecc oldHeading = currentHeading_DocumentWidget_(d);[m /* Scan for visible runs. */ {[m [36m@@ -766,6 +762,7 @@[m [mstatic void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode[m updateTheme_DocumentWidget_(d);[m init_Anim(&d->scrollY, 0);[m init_Anim(&d->sideOpacity, 0);[m [32m+[m[32m clear_Array(&d->wideRunOffsets);[m d->state = ready_RequestState;[m }[m [m [36m@@ -903,7 +900,6 @@[m [mstatic void fetch_DocumentWidget_(iDocumentWidget *d) {[m d->request = new_GmRequest(certs_App());[m setUrl_GmRequest(d->request, d->mod.url);[m iConnect(GmRequest, d->request, updated, d, requestUpdated_DocumentWidget_);[m [31m-// iConnect(GmRequest, d->request, timeout, d, requestTimedOut_DocumentWidget_);[m iConnect(GmRequest, d->request, finished, d, requestFinished_DocumentWidget_);[m submit_GmRequest(d->request);[m }[m [36m@@ -955,6 +951,7 @@[m [mstatic iBool updateFromHistory_DocumentWidget_(iDocumentWidget *d) {[m reset_GmDocument(d->doc);[m d->state = fetching_RequestState;[m d->initNormScrollY = recent->normScrollY;[m [32m+[m[32m clear_Array(&d->wideRunOffsets);[m /* Use the cached response data. */[m updateTrust_DocumentWidget_(d, resp);[m d->sourceTime = resp->when;[m [36m@@ -986,6 +983,9 @@[m [mstatic void refreshWhileScrolling_DocumentWidget_(iAny *ptr) {[m }[m [m static void smoothScroll_DocumentWidget_(iDocumentWidget *d, int offset, int duration) {[m [32m+[m[32m if (offset == 0) {[m [32m+[m[32m return;[m [32m+[m[32m }[m /* Get rid of link numbers when scrolling. */[m if (offset && d->flags & showLinkNumbers_DocumentWidgetFlag) {[m d->flags &= ~showLinkNumbers_DocumentWidgetFlag;[m [36m@@ -1030,6 +1030,39 @@[m [mstatic void scrollTo_DocumentWidget_(iDocumentWidget *d, int documentY, iBool ce[m scroll_DocumentWidget_(d, 0); /* clamp it */[m }[m [m [32m+[m[32mstatic void scrollWideBlock_DocumentWidget_(iDocumentWidget *d, iInt2 mousePos, int delta) {[m [32m+[m[32m if (delta == 0) {[m [32m+[m[32m return;[m [32m+[m[32m }[m [32m+[m[32m const iInt2 docPos = documentPos_DocumentWidget_(d, mousePos);[m [32m+[m[32m iConstForEach(PtrArray, i, &d->visibleWideRuns) {[m [32m+[m[32m const iGmRun *run = i.ptr;[m [32m+[m[32m if (docPos.y >= top_Rect(run->bounds) && docPos.y <= bottom_Rect(run->bounds)) {[m [32m+[m[32m /* We can scroll this run. First find out how much is allowed. */[m [32m+[m[32m const iGmRunRange range = findPreformattedRange_GmDocument(d->doc, run);[m [32m+[m[32m int maxWidth = 0;[m [32m+[m[32m for (const iGmRun *r = range.start; r != range.end; r++) {[m [32m+[m[32m maxWidth = iMax(maxWidth, width_Rect(r->visBounds));[m [32m+[m[32m }[m [32m+[m[32m const int maxOffset = maxWidth - documentWidth_DocumentWidget_(d) + d->pageMargin * gap_UI;[m [32m+[m[32m if (size_Array(&d->wideRunOffsets) <= run->preId) {[m [32m+[m[32m resize_Array(&d->wideRunOffsets, run->preId + 1);[m [32m+[m[32m }[m [32m+[m[32m int *offset = at_Array(&d->wideRunOffsets, run->preId - 1);[m [32m+[m[32m const int oldOffset = *offset;[m [32m+[m[32m *offset = iClamp(*offset + delta, 0, maxOffset);[m [32m+[m[32m /* Make sure the whole block gets redraw. */[m [32m+[m[32m if (oldOffset != *offset) {[m [32m+[m[32m for (const iGmRun *r = range.start; r != range.end; r++) {[m [32m+[m[32m insert_PtrSet(d->invalidRuns, r);[m [32m+[m[32m }[m [32m+[m[32m refresh_Widget(d);[m [32m+[m[32m }[m [32m+[m[32m break;[m [32m+[m[32m }[m [32m+[m[32m }[m [32m+[m[32m}[m [32m+[m static void checkResponse_DocumentWidget_(iDocumentWidget *d) {[m if (!d->request) {[m return;[m [36m@@ -1064,6 +1097,7 @@[m [mstatic void checkResponse_DocumentWidget_(iDocumentWidget *d) {[m case categorySuccess_GmStatusCode:[m init_Anim(&d->scrollY, 0);[m reset_GmDocument(d->doc); /* new content incoming */[m [32m+[m[32m clear_Array(&d->wideRunOffsets);[m updateDocument_DocumentWidget_(d, resp, iTrue);[m break;[m case categoryRedirect_GmStatusCode:[m [36m@@ -2015,8 +2049,9 @@[m [mstatic iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e[m }[m else if (ev->type == SDL_MOUSEWHEEL && isHover_Widget(w)) {[m float acceleration = 1.0f;[m [32m+[m[32m const iInt2 mouseCoord = mouseCoord_Window(get_Window());[m if (prefs_App()->hoverOutline &&[m [31m- contains_Widget(constAs_Widget(d->scroll), mouseCoord_Window(get_Window()))) {[m [32m+[m[32m contains_Widget(constAs_Widget(d->scroll), mouseCoord)) {[m const int outHeight = outlineHeight_DocumentWidget_(d);[m if (outHeight > height_Rect(bounds_Widget(w))) {[m acceleration = (float) size_GmDocument(d->doc).y / (float) outHeight;[m [36m@@ -2027,7 +2062,15 @@[m [mstatic iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e[m which device is sending the event. */[m if (ev->wheel.which == 0) { /* Trackpad with precise scrolling w/inertia. */[m stop_Anim(&d->scrollY);[m [31m- scroll_DocumentWidget_(d, -ev->wheel.y * get_Window()->pixelRatio * acceleration);[m [32m+[m[32m iInt2 wheel = init_I2(ev->wheel.x, ev->wheel.y);[m [32m+[m[32m if (iAbs(wheel.x) > iAbs(wheel.y)) {[m [32m+[m[32m wheel.y = 0;[m [32m+[m[32m }[m [32m+[m[32m else {[m [32m+[m[32m wheel.x = 0;[m [32m+[m[32m }[m [32m+[m[32m scroll_DocumentWidget_(d, -wheel.y * get_Window()->pixelRatio * acceleration);[m [32m+[m[32m scrollWideBlock_DocumentWidget_(d, mouseCoord, wheel.x * get_Window()->pixelRatio);[m }[m else[m #endif[m [36m@@ -2046,8 +2089,10 @@[m [mstatic iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e[m d,[m -3 * amount * lineHeight_Text(paragraph_FontId) * acceleration,[m smoothDuration_DocumentWidget_ *[m [32m+[m[32m /* accelerated speed for repeated wheelings */[m (!isFinished_Anim(&d->scrollY) && pos_Anim(&d->scrollY) < 0.25f ? 0.5f : 1.0f));[m [31m- /* accelerated speed for repeated wheelings */[m [32m+[m[32m scrollWideBlock_DocumentWidget_([m [32m+[m[32m d, mouseCoord, ev->wheel.x * lineHeight_Text(paragraph_FontId));[m }[m iChangeFlags(d->flags, noHoverWhileScrolling_DocumentWidgetFlag, iTrue);[m return iTrue;[m [36m@@ -2399,7 +2444,15 @@[m [mstatic void drawRun_DrawContext_(void *context, const iGmRun *run) {[m const iBool isHover =[m (run->linkId && d->widget->hoverLink && run->linkId == d->widget->hoverLink->linkId &&[m ~run->flags & decoration_GmRunFlag);[m [31m- const iInt2 visPos = add_I2(run->visBounds.pos, origin);[m [32m+[m[32m iInt2 visPos = add_I2(run->visBounds.pos, origin);[m [32m+[m[32m /* Preformatted runs can be scrolled. */[m [32m+[m[32m if (run->preId && run->flags & wide_GmRunFlag) {[m [32m+[m[32m const size_t numOffsets = size_Array(&d->widget->wideRunOffsets);[m [32m+[m[32m const int *offsets = constData_Array(&d->widget->wideRunOffsets);[m [32m+[m[32m if (run->preId <= numOffsets) {[m [32m+[m[32m visPos.x -= offsets[run->preId - 1];[m [32m+[m[32m }[m [32m+[m[32m }[m fillRect_Paint(&d->paint, (iRect){ visPos, run->visBounds.size }, tmBackground_ColorId);[m if (run->linkId && ~run->flags & decoration_GmRunFlag) {[m fg = linkColor_GmDocument(doc, run->linkId, isHover ? textHover_GmLinkPart : text_GmLinkPart);[m [36m@@ -2962,6 +3015,7 @@[m [miBool isRequestOngoing_DocumentWidget(const iDocumentWidget *d) {[m [m void updateSize_DocumentWidget(iDocumentWidget *d) {[m setWidth_GmDocument(d->doc, documentWidth_DocumentWidget_(d));[m [32m+[m[32m clear_Array(&d->wideRunOffsets);[m updateSideIconBuf_DocumentWidget_(d);[m updateOutline_DocumentWidget_(d);[m updateVisible_DocumentWidget_(d);[m [1mdiff --git a/src/ui/text.c b/src/ui/text.c[m [1mindex 0b8c98e7..e047bbce 100644[m [1m--- a/src/ui/text.c[m [1m+++ b/src/ui/text.c[m [36m@@ -165,6 +165,7 @@[m [mstatic iText text_;[m static void initFonts_Text_(iText *d) {[m const float textSize = fontSize_UI * d->contentFontSize;[m const float monoSize = fontSize_UI * d->contentFontSize / contentScale_Text_ * 0.866f;[m [32m+[m[32m const float smallMonoSize = monoSize * 0.866f;[m const iBlock *regularFont = &fontNunitoRegular_Embedded;[m const iBlock *italicFont = &fontNunitoLightItalic_Embedded;[m const iBlock *h12Font = &fontNunitoExtraBold_Embedded;[m [36m@@ -218,7 +219,7 @@[m [mstatic void initFonts_Text_(iText *d) {[m /* content fonts */[m { regularFont, textSize, scaling, symbols_FontId },[m { &fontFiraMonoRegular_Embedded, monoSize, 1.0f, monospaceSymbols_FontId },[m [31m- { &fontFiraMonoRegular_Embedded, monoSize * 0.750f, 1.0f, monospaceSmallSymbols_FontId },[m [32m+[m[32m { &fontFiraMonoRegular_Embedded, smallMonoSize, 1.0f, monospaceSmallSymbols_FontId },[m { regularFont, textSize * 1.200f, scaling, mediumSymbols_FontId },[m { h3Font, textSize * 1.333f, h123Scaling, bigSymbols_FontId },[m { italicFont, textSize, scaling, symbols_FontId },[m [36m@@ -237,7 +238,7 @@[m [mstatic void initFonts_Text_(iText *d) {[m { &fontSymbola_Embedded, textSize * 1.666f, 1.0f, largeSymbols_FontId },[m { &fontSymbola_Embedded, textSize * 2.000f, 1.0f, hugeSymbols_FontId },[m { &fontSymbola_Embedded, monoSize, 1.0f, monospaceSymbols_FontId },[m [31m- { &fontSymbola_Embedded, monoSize * 0.750f, 1.0f, monospaceSmallSymbols_FontId },[m [32m+[m[32m { &fontSymbola_Embedded, smallMonoSize, 1.0f, monospaceSmallSymbols_FontId },[m /* emoji fonts */[m { &fontNotoEmojiRegular_Embedded, fontSize_UI, 1.0f, defaultSymbols_FontId },[m { &fontNotoEmojiRegular_Embedded, fontSize_UI * 1.125f, 1.0f, defaultMediumSymbols_FontId },[m [36m@@ -248,10 +249,10 @@[m [mstatic void initFonts_Text_(iText *d) {[m { &fontNotoEmojiRegular_Embedded, textSize * 1.666f, 1.0f, largeSymbols_FontId },[m { &fontNotoEmojiRegular_Embedded, textSize * 2.000f, 1.0f, hugeSymbols_FontId },[m { &fontNotoEmojiRegular_Embedded, monoSize, 1.0f, monospaceSymbols_FontId },[m [31m- { &fontNotoEmojiRegular_Embedded, monoSize * 0.750f, 1.0f, monospaceSmallSymbols_FontId },[m [32m+[m[32m { &fontNotoEmojiRegular_Embedded, smallMonoSize, 1.0f, monospaceSmallSymbols_FontId },[m /* japanese fonts */[m { &fontNotoSansJPRegular_Embedded, fontSize_UI, 1.0f, defaultSymbols_FontId },[m [31m- { &fontNotoSansJPRegular_Embedded, monoSize * 0.750, 1.0f, monospaceSmallSymbols_FontId },[m [32m+[m[32m { &fontNotoSansJPRegular_Embedded, smallMonoSize, 1.0f, monospaceSmallSymbols_FontId },[m { &fontNotoSansJPRegular_Embedded, monoSize, 1.0f, monospaceSymbols_FontId },[m { &fontNotoSansJPRegular_Embedded, textSize, 1.0f, symbols_FontId },[m { &fontNotoSansJPRegular_Embedded, textSize * 1.200f, 1.0f, mediumSymbols_FontId },[m [36m@@ -260,7 +261,7 @@[m [mstatic void initFonts_Text_(iText *d) {[m { &fontNotoSansJPRegular_Embedded, textSize * 2.000f, 1.0f, hugeSymbols_FontId },[m /* korean fonts */[m { &fontNanumGothicRegular_Embedded, fontSize_UI, 1.0f, defaultSymbols_FontId },[m [31m- { &fontNanumGothicRegular_Embedded, monoSize * 0.750, 1.0f, monospaceSmallSymbols_FontId },[m [32m+[m[32m { &fontNanumGothicRegular_Embedded, smallMonoSize, 1.0f, monospaceSmallSymbols_FontId },[m { &fontNanumGothicRegular_Embedded, monoSize, 1.0f, monospaceSymbols_FontId },[m { &fontNanumGothicRegular_Embedded, textSize, 1.0f, symbols_FontId },[m { &fontNanumGothicRegular_Embedded, textSize * 1.200f, 1.0f, mediumSymbols_FontId },[m
text/gemini; charset=utf-8
This content has been proxied by September (ba2dc).