Comment on ASCII characters are not pixels: a deep dive into ASCII rendering

<- View Parent
over_clox@lemmy.world ⁨1⁩ ⁨day⁩ 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

source
Sort:hotnewtop