• over_clox@lemmy.world
    link
    fedilink
    English
    arrow-up
    6
    ·
    7 hours ago

    I made one myself many years ago for DOS, but mine renders in 512 pseudo halftone colors from a base palette of 16 colors. Results look pretty nice for whatever it’s worth, but yeah mine doesn’t focus on their efforts to get more crisp edges.

    Still neat though, food for my thoughts even, should I ever revisit my old project.

      • over_clox@lemmy.world
        link
        fedilink
        English
        arrow-up
        4
        ·
        6 hours ago

        Sure, have at it!

        Sorry it’s not a full complete dump with examples, but it’s programmed in QBasic 1.1 and converts raw RGB pixel data into equivalent closest matching color halftone onscreen characters. I designed it in mind with DOS text modes of either 80x25, 80x43, or 80x50 text modes, but I’m sure the technique can work with any text mode that can properly render the old DOS block characters. But, I’m betting that whatever device you’re using right now is almost certainly not configured to display the old DOS block characters as they were back in the day.

        Good luck!

        REM TEXTPSET.BAS
        REM over_clox - February 26, 2008
        
        DECLARE SUB DisplayRAW (FileName$, W%, H%)
        DECLARE SUB TextPSet (X%, Y%, R%, G%, B%)
        DECLARE SUB TextPixel (Red%, Green%, Blue%, Char$, FGround%, BGround%)
        DECLARE SUB HTMtoRGB (HTMColor$, Red%, Green%, Blue%)
        
        TYPE PaletteType
            R AS INTEGER
            G AS INTEGER
            B AS INTEGER
        END TYPE
        
        REDIM SHARED DOSPalette(15) AS PaletteType
        REDIM SHARED FakePalette(15, 7, 1 TO 3) AS PaletteType
        
        RESTORE
        FOR I% = 0 TO 15
            READ HTMColor$
            HTMtoRGB HTMColor$, R%, G%, B%
            DOSPalette(I%).R = R%
            DOSPalette(I%).G = G%
            DOSPalette(I%).B = B%
        NEXT
        
        FOR C% = 1 TO 3
            C2% = 4 - C%
            FOR B% = 0 TO 7
                FOR F% = 0 TO 15
                    R1% = DOSPalette(F%).R: R2% = DOSPalette(B%).R
                    G1% = DOSPalette(F%).G: G2% = DOSPalette(B%).G
                    B1% = DOSPalette(F%).B: B2% = DOSPalette(B%).B
                    FakePalette(F%, B%, C%).R = (R1% * C% + R2% * C2%) \ 4
                    FakePalette(F%, B%, C%).G = (G1% * C% + G2% * C2%) \ 4
                    FakePalette(F%, B%, C%).B = (B1% * C% + B2% * C2%) \ 4
                NEXT
            NEXT
        NEXT
        
        'MS-DOS Text Mode 16 Color Palette
        DATA 000000,0000AA,00AA00,00AAAA,AA0000,AA00AA,AA5500,AAAAAA
        DATA 555555,5555FF,55FF55,55FFFF,FF5555,FF55FF,FFFF55,FFFFFF
        
        CMD$ = COMMAND$
        IF CMD$ <> "" THEN
            DisplayRAW CMD$, 80, 25
        ELSE
            DisplayRAW "LOGO.RAW", 80, 25
        END IF
        
        'DEF SEG = &HB800: BSAVE "LOGO.BSV", 0, 4000
        
        COLOR 7, 0
        
        DO: Hit$ = UCASE$(INKEY$): LOOP WHILE Hit$ = ""
        
        SUB DisplayRAW (FileName$, W%, H%)
        
            FileNum% = FREEFILE
            OPEN FileName$ FOR BINARY AS FileNum%
            CLS : WIDTH W%, H%
            ScanLine$ = SPACE$(W% * 3)
            FOR Y% = 0 TO H% - 1
                GET #1, , ScanLine$
                FOR X% = 0 TO W% - 1
                    R% = ASC(MID$(ScanLine$, X% * 3 + 1, 1))
                    G% = ASC(MID$(ScanLine$, X% * 3 + 2, 1))
                    B% = ASC(MID$(ScanLine$, X% * 3 + 3, 1))
                    TextPSet X%, Y%, R%, G%, B%
                NEXT
            NEXT
            CLOSE FileNum%
        
        END SUB
        
        SUB HTMtoRGB (HTMColor$, Red%, Green%, Blue%)
            Red% = VAL("&H" + MID$(HTMColor$, 1, 2))
            Green% = VAL("&H" + MID$(HTMColor$, 3, 2))
            Blue% = VAL("&H" + MID$(HTMColor$, 5, 2))
        END SUB
        
        SUB TextPixel (Red%, Green%, Blue%, Char$, FGround%, BGround%)
            ' °±²Û (32,176,177,178,219)
           
            Diff% = 768: BGround% = 0
            FOR F% = 0 TO 15
                RDiff% = ABS(DOSPalette(F%).R - Red%)
                GDiff% = ABS(DOSPalette(F%).G - Green%)
                BDiff% = ABS(DOSPalette(F%).B - Blue%)
                NewDiff% = RDiff% + GDiff% + BDiff%
                IF NewDiff% < Diff% THEN
                    Diff% = NewDiff%: Char$ = "Û": FGround% = F%
                END IF
            NEXT
        
            FOR C% = 1 TO 3
                C2% = 4 - C%
                FOR B% = 0 TO 7
                    FOR F% = 0 TO 15
                        RDiff% = ABS(FakePalette(F%, B%, C%).R - Red%)
                        GDiff% = ABS(FakePalette(F%, B%, C%).G - Green%)
                        BDiff% = ABS(FakePalette(F%, B%, C%).B - Blue%)
                        NewDiff% = RDiff% + GDiff% + BDiff%
                        IF NewDiff% < Diff% THEN
                            Diff% = NewDiff%: Char$ = CHR$(175 + C%)
                            FGround% = F%: BGround% = B%
                        END IF
                    NEXT
                NEXT
            NEXT
        
        END SUB
        
        SUB TextPSet (X%, Y%, Red%, Green%, Blue%)
            TextPixel Red%, Green%, Blue%, Char$, FGround%, BGround%
            LOCATE Y% + 1, X% + 1: COLOR FGround%, BGround%: PRINT Char$;
        END SUB
        
        • kora@sh.itjust.works
          link
          fedilink
          English
          arrow-up
          3
          ·
          6 hours ago

          You are amazing. Thank you very much for delivering! Half of the fun is discovering how it works without examples so no need to apologise :^)

          I need to look into running QBasic on my M4. Unsure about my options for now. Worst case scenario I spin up a VM tomorrow.

          • over_clox@lemmy.world
            link
            fedilink
            English
            arrow-up
            2
            ·
            6 hours ago

            Meh, DOSBox is plenty suitable enough, and QBasic is easy enough to find…

            https://winworldpc.com/product/qbasic/1x

            I can’t promise that DOSBox emulated results will give the exact color results as original old-school hardware on an old CRT, but results should still be mighty close.

            The raw input data files are pretty simple to generate with most graphics software, just downsample down to potato 80x25, then export to raw 888 RGB format.

      • over_clox@lemmy.world
        link
        fedilink
        English
        arrow-up
        0
        ·
        edit-2
        7 hours ago

        I’m not exactly sure how I’d incorporate both techniques into the same rendering system though.

        My method doesn’t use letters, numbers or punctuation characters, mine uses the DOS mode block characters, blank space, 25%, 50%, 75% halftone characters, and the 100% solid block character.

        I could probably get a little closer to sharper shape edges with my method if I add in the upper half block and lower half block characters, but when using those characters I’m no longer able to use the halftone dithering and would be limited to 8 background and 16 foreground colors…

        I dunno where I’d really even start (over) again to use alphanumeric characters with my text rendering method…

        • Alb@sh.itjust.works
          link
          fedilink
          English
          arrow-up
          1
          ·
          7 hours ago

          Maybe converting the DOS blocks to ANSI blocks. But i don’t know if this is feasible with your coding…