From 4586135d18124af69ff66fea6cfcc3098fb27e1c Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 5 Oct 2024 00:17:11 +0100 Subject: [PATCH] done for the moment with text rendering --- fcore/buffer.sml | 78 +++++++++++++++++++++++++++++++++++------------ shf | Bin 837640 -> 837640 bytes 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/fcore/buffer.sml b/fcore/buffer.sml index 61cd986..117bbb5 100644 --- a/fcore/buffer.sml +++ b/fcore/buffer.sml @@ -4,14 +4,12 @@ struct * char-wrap is a similar concept to word-wrap, * but it breaks on character in the middle of a word. * Todo: - * - Let caller know which termination case was reached. - * Did we reach the end of the string or did we exhaust the screen space? * - Possibly add visual horizontal indentation when char-wrap occurs * on an indented line *) fun buildTextString ( pos, str, acc, posX, posY, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) = if pos < String.size str then case String.sub (str, pos) of @@ -19,18 +17,18 @@ struct (* if space, then proceed forward one char * without adding to acc *) buildTextString - ( pos + 1, str, acc, posX + 25, posY, startX - , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b - ) + ( pos + 1, str, acc, posX + 25, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) | #"\t" => (* if tab, proceed forward one char, * and jump visually forwards three chars *) buildTextString - ( pos + 1, str, acc, posX + 75, posY, startX - , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b - ) + ( pos + 1, str, acc, posX + 75, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) | #"\n" => (* if \n, move down vertically, and move to start horizontally * assuming we have not exceeded the window's height. @@ -39,9 +37,10 @@ struct buildTextString ( pos + 1, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) else + (* return if there is no more vertical space after line break *) acc | #"\r" => (* same as \n, except we also check if we are in a \r\n pair, @@ -50,19 +49,20 @@ struct if pos < String.size str - 1 andalso String.sub (str, pos + 1) = #"\n" - then + then buildTextString ( pos + 2, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) - else + else buildTextString ( pos + 1, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) else + (* return if there is no more vertical space after line break *) acc | chr => (* for any other character, add it to acc if there is space, @@ -80,7 +80,7 @@ struct buildTextString ( pos + 1, str, acc, posX + 25, posY, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) end else if posY + 25 < windowHeight then @@ -96,13 +96,51 @@ struct buildTextString ( pos + 1, str, acc, startX + 25, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) end else - (* if no space horizontally or vertically, just return *) + (* return if no space horizontally or vertically *) acc end else - acc + (* if we reached the end of the string, + * call function to build next string *) + continueBuildTextLineGap + ( tl, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowWidth + , r, g, b + ) + + and continueBuildTextLineGap + ( strList, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b + ) = + case strList of + hd :: tl => + buildTextString + ( 0, hd, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) + | [] => acc + + (* todo: + * before calling continueBuildTextLineGap, + * find start position inside LineGap + * to start building from *) + fun startBuildTextLineGap (startLine, lineGap: LineGap.t, windowWidth, windowHeight) = + let + val acc = + continueBuildTextLineGap + ( #rightStrings lineGap, [], 10, 10, 10 + , windowWidth, windowHeight + , Real32.fromInt windowWidth + , Real32.fromInt windowHeight + , 0.0, 0.0, 0.0 + ) + in + Vector.concat acc + end end diff --git a/shf b/shf index e008281ca0ee690b7a28e52acc3d219869ff1841..130723756cf557faec12f6c7cfc4b7395e3d2faa 100755 GIT binary patch delta 16265 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 delta 16152 zcmeHud03QX_y2Pq)|o+NSY%OT0KqMBLq&5La0A?RG&7e0)Lbf4Gqq9&T(VMgOg&^u zpr(kL&^BV(3zoT*CYENsX(MfBSz>R=^bPoZo^5)h_qu-H>-zoCKR>Pu59j{e=iKK$ z%e~FGZc~qSn|hReDuy-mn-O>U&W@J$SraQ7-nc&JRL^<+R$Uie*F|!hD3DJ#r&eOI zAAi@J+C&vCA={hrf-~ON>d9#?c;W`G*$tQp`Mq5Vj~?sCIOBT(J8Ko~@$b0q=alD0p(YIG8#acF!l< zz(1+>9=;e%E5mz3VhJRE^$9O^i`I }>3Md5)Rpi4g|A8b--}r}D_Qiwz;vgU)dO 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