Graphic Screen Printing

Area:    Quik_Bas
  Msg:    #72
 Date:    07-23-92 06:46 (Public) 
 From:    Steve Gartrell           
 To:      All                      
 Subject: Graphic Screen Printing  
'$DYNAMIC
DEFINT A-Z
'$INCLUDE: 'qbx.bi'       'OR 'QB.BI'
DECLARE SUB LandScape ()
DECLARE SUB Portrait ()
DECLARE SUB VidConfig ()
CONST False% = 0, True% = NOT False%
CONST C$ = "Recreated 7/22/92 by Steve Gartrell."

DIM SHARED Rows%, Cols%, GrayScale%(1 TO 4, 0 TO 8)
DIM SHARED LandDPI%, PortDPI%

' These are the "IBM" standard codes as listed by my
' Tandy 9-pin printer manual

' 75  =   60 DPI density
' 76  =  120 DPI density half speed (better row alignment)
' 89  =  120 DPI density normal speed
' 90  =  240 DPI density

LandDPI% = 75
PortDPI% = 76

'Place the colors to print here!!
'(Remember, at least one mode only has four colors, which
' are returned by POINT as 0, 1, 2, and 3.  The two color
' [B&W] modes only have _1_ color and the background.)

GrayScale%(1, 8) = 1    'blue
GrayScale%(2, 8) = 2    'green
GrayScale%(3, 8) = 4    'red
GrayScale%(4, 8) = 14   'yellow

'Construct the dot patterns to emulate "newsphoto" grayscaling

FOR cnt% = 0 TO 7
  GrayScale%(1, cnt%) = &HFF
NEXT

GrayScale%(2, 0) = &HAA
FOR cnt% = 1 TO 7
  GrayScale%(2, cnt%) = NOT (GrayScale%(2, cnt% - 1)) MOD 256
NEXT

GrayScale%(3, 0) = &H88
GrayScale%(3, 1) = &H0
GrayScale%(3, 2) = &H22
GrayScale%(3, 3) = &H0
GrayScale%(3, 4) = &H88
GrayScale%(3, 5) = &H0
GrayScale%(3, 6) = &H22
GrayScale%(3, 7) = &H0

GrayScale%(4, 0) = &H0
GrayScale%(4, 1) = &H20
GrayScale%(4, 2) = &H0
GrayScale%(4, 3) = &H0
GrayScale%(4, 4) = &H0
GrayScale%(4, 5) = &H0
GrayScale%(4, 6) = &H2
GrayScale%(4, 7) = &H0

SCREEN 7

VidConfig

IF Rows% < 0 OR Cols% < 0 THEN  'bad mode?
  SCREEN 0
  WIDTH 80
  END
END IF

'Borrowed this random pattern generator from Rich Geldreich!!
'Perverted it to limit it to the four chosen colors!!

FOR A = 1 TO 400
  RANDOMIZE TIMER
  IF RND > .05 THEN
  LINE -(RND * Cols%, RND * Rows%), GrayScale%(CINT(RND * 3) + 1, 8)
  ELSE
  LINE -(RND * Cols%, RND * Rows%), GrayScale%(CINT(RND * 3) + 1, 8), BF
  END IF
NEXT


'Portrait
LandScape

DO: LOOP UNTIL LEN(INKEY$): SCREEN 0: WIDTH 80: END


SUB LandScape

'Ordinarily, unremark VidConfig so it's called immediately
'before printing

'VidConfig

DIM regs AS RegType
intnum% = &H17

one% = FREEFILE
OPEN "LPT1:BIN" FOR OUTPUT AS one%

'1/9" LF
PRINT #one%, CHR$(15); CHR$(27); CHR$(51); CHR$(24);

'CR/LF
PRINT #one%, CHR$(13); CHR$(10);

pixels% = 0
FOR x% = 0 TO Cols% STEP 8

  REDIM ColorArray%(x% TO x% + 7, 0 TO Rows%)
  FOR PixRow% = 0 TO Rows%
  FOR PixColumn% = x% TO x% + 7
  ColorArray%(PixColumn%, PixRow%) = POINT(PixColumn%, PixRow%)
  NEXT
  NEXT

  FOR Hue% = 1 TO 4
  PRINT #one%, CHR$(27); CHR$(LandDPI%);
  PRINT #one%, CHR$((Rows% + 1) MOD 256);
  PRINT #one%, CHR$((Rows% + 1) \ 256);
  FOR y% = Rows% TO 0 STEP -1
  cnt% = 7
  FOR PixelColumn% = x% TO x% + 7
    IF ColorArray%(PixelColumn%, y%) = GrayScale%(Hue%, 8) THEN
    pixels% = pixels% OR 2 ^ cnt%
    END IF
    cnt% = cnt% - 1
  NEXT PixelColumn%
  pixels% = pixels% AND GrayScale%(Hue%, y% MOD 8)
  regs.ax = pixels%
  regs.dx = 0
  CALL Interrupt(intnum%, regs, regs)
  pixels% = 0
  NEXT y%
  PRINT #one%, CHR$(13);
  NEXT Hue%
  PRINT #one%, CHR$(10);
NEXT x%

'back to 1/6" LF
PRINT #one%, CHR$(27); CHR$(50);

'select standard font
PRINT #one%, CHR$(27); CHR$(73), CHR$(1);

'select 10 CPI
PRINT #one%, CHR$(27); CHR$(77);

'select bidirectional printing
PRINT #one%, CHR$(27); CHR$(85); CHR$(0);

'form feed
PRINT #one%, CHR$(12);

CLOSE #one%

END SUB

REM $STATIC
SUB Portrait

'Ordinarily, unremark VidConfig so it's called immediately
'before printing

'VidConfig

DIM regs AS RegType
intnum% = &H17

one% = FREEFILE

OPEN "lpt1:BIN" FOR OUTPUT AS one%      'BIN stops auto CR/LF

'1/9" LF
PRINT #one%, CHR$(15); CHR$(27); CHR$(51); CHR$(24);

'CR/LF
PRINT #one%, CHR$(13); CHR$(10);

pixels% = 0
'
FOR y% = 0 TO Rows% - 8 STEP 8

  REDIM ColorArray%(y% TO y% + 7, 0 TO Cols%)
  FOR PixRow% = y% TO y% + 7
  FOR PixColumn% = 0 TO Cols%
  ColorArray%(PixRow%, PixColumn%) = POINT(PixColumn%, PixRow%)
  NEXT
  NEXT

  FOR Hue% = 1 TO 4

  PRINT #one%, CHR$(27); CHR$(PortDPI%);
  PRINT #one%, CHR$((Cols% + 1) MOD 256);
  PRINT #one%, CHR$((Cols% + 1) \ 256);
-end-

Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET