home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / b / bgi256-3.zip / SLINE.INC < prev    next >
Text File  |  1992-12-27  |  4KB  |  146 lines

  1. ;SLINE.INC - Copyright 1991,1992 Knight Software
  2. ;    History:
  3. ;        17 May 1991 - first release
  4. ;        22 Nov 1992 - adapted for protected mode operation
  5. ;
  6. ;--------------------------------------------------
  7. ;put a pixel on the screen in the indicated color for line type 
  8. ;drawing. Assumes that the address and segment have been preset
  9. ;Assume: DS = data segment
  10. ;Entry:  N/A
  11. ;Return: N/A
  12. DrawLinePixel PROC NEAR
  13.     PUSH    ES
  14.     PUSH    DI
  15.     PUSH    BX
  16.     PUSH    CX
  17.     PUSH    AX
  18.     MOV    DI,DS:[PixelAddress] ;get the address to write
  19.     MOV    ES,DS:[VideoSegment] ;video is at segment 0a000h
  20.     MOV    CL,DS:[LinePixelCount]
  21.     INC    BYTE PTR DS:[LinePixelCount]
  22.     AND    CL,0FH
  23.     MOV    BX,DS:[LinePattern]
  24.     SHR    BX,CL
  25.     MOV    AL,DS:[DrawForeColor] ;Get foreground color to plot
  26.     MOV    AH,DS:[DrawBackColor] ;Get background color to plot
  27.     AND    BL,01H           ;set zero flag for call
  28.     CALL    WORD PTR DS:[LinePixelProc] ;write to video memory
  29.     POP    AX
  30.     POP    CX
  31.     POP    BX
  32.     POP    SI
  33.     POP    ES
  34.     RET
  35. DrawLinePixel ENDP
  36.  
  37. ;-----------------------------------------------------
  38. ;line drawing procedure - draw a line from x1,y1 to x2,y2
  39. ;Assume: DS = data segment
  40. ;Entry:  AX = X1  start coordinate
  41. ;      BX = Y1  start coordinate
  42. ;     CX = X2  end coordinate
  43. ;     DX = Y2  end coordinate
  44. ;Return: N/A
  45.  
  46. PlotLine PROC NEAR
  47.     PUSH    AX
  48.     PUSH    BX
  49.     PUSH    CX
  50.     PUSH    DX
  51.     PUSH    SI
  52.     PUSH    DI
  53.     PUSH    ES
  54.     MOV    DS:[PixelX2],CX    ; save x2
  55.     MOV    DS:[PixelY2],DX    ; save y2
  56.     MOV    DS:[PixelX],AX    ; save    x
  57.     MOV    DS:[PixelY],BX    ; save    y
  58.     MOV    BYTE PTR DS:[LinePixelCount],0 ;clr pixel cnt
  59.     CALL    GetPixelAddress ; plot first point
  60.     CALL    DrawLinePixel    ; plot x,y,color
  61.  
  62.     MOV    DI,-1        ; if x1 = x2 then
  63.     CMP    AX,CX        ;   xstep = 0
  64.     JZ    Draw1        ; else
  65.     JG    Draw2        ;   if x1 > x2 then
  66.     INC    DI        ;    xstep = -1
  67. Draw1:    INC    DI        ;    else
  68. Draw2:    MOV    DS:[PlotStepX],DI    ;    xstep = 1
  69.  
  70.     MOV    SI,-1        ; if y1 = y2 then
  71.     CMP    BX,DX        ;   ystep = 0
  72.     JZ    Draw3        ; else
  73.     JG     Draw4        ;   if y1 > y2 then
  74.     INC    SI        ;       ystep = -1
  75. Draw3:    INC    SI        ;   else
  76. Draw4:    MOV    DS:[PlotStepY],SI    ;    ystep = 1
  77.  
  78. ; check for special case x1=x2 and y1=y2 => xstep = ystep = 0
  79.     OR    SI,DI        ; si or di <> 0
  80.     JZ    Plexit        ; and exit
  81.  
  82. Draw5:    SUB    DX,BX        ; deltay = abs(y2-y1)
  83.     JNS    Draw6
  84.     NEG    DX        ; dx = deltay
  85.  
  86. Draw6:    SUB    CX,AX        ; deltax = abs(x2-x1)
  87.     JNS    Draw7
  88.     NEG    CX        ; cx = deltax
  89.  
  90. Draw7:
  91. ;    mov    di,-1        ; di = direction
  92. ;    or    cx,cx        ; if deltax = 0
  93. ;    jz    draw8        ; then direction = -1
  94. ;    xor    di,di        ; else direction = 0
  95.  
  96.     XOR    DI,DI        ; assume vert slope to start
  97.     MOV    SI,DX
  98.     SUB    SI,CX        ; compute the angle
  99.     JNS    Draw8        ; positive = vertical
  100.     DEC    DI        ; negative = horizontal
  101.  
  102. Draw8:    MOV    DS:[PlotSlope],SI    ; save slope of line
  103.     MOV    DS:[PlotDeltaX],CX    ; save delx
  104.     MOV    DS:[PlotDeltaY],DX    ; and dely
  105.  
  106. Drawlp:    MOV    SI,DS:[PlotStyle]    ; get plot style
  107.     AND     SI,03H        ; strip off garbage
  108.     OR    DI,DI        ; if direction = 0
  109.     JNS    Drawld
  110.     ADD    BX,DS:[PlotStepY]    ; then y = y + ystep
  111.     ADD    DI,DS:[PlotDeltaX]    ;    dir := dir + deltax
  112.     JNS    Drawlx        ; if dir >= 0
  113.     CMP    SI,1        ;   or lines > 0
  114.     JGE    Drawlx        ; then plot x,y
  115.     JMP    Drawll
  116.  
  117. Drawld:    ADD    AX,DS:[PlotStepX]    ; else x = x + xstep
  118.     SUB    DI,DS:[PlotDeltaY]    ;     dir = dir - deltay
  119.     JNS    Drawlx        ; if dir >=0
  120.     CMP    SI,2        ;    or lines > 1
  121.     JGE    Drawlx        ; then plot x,y
  122.     JMP    Drawll
  123.  
  124. Drawlx:    PUSH    DI        ; save    dir
  125.     MOV    DS:[PixelX],AX    ; save    x
  126.     MOV    DS:[PixelY],BX    ; save    y
  127.     CALL    GetPixelAddress
  128.     CALL    DrawLinePixel    ; plot x,y,color
  129.     POP    DI        ; restore dir
  130.  
  131. Drawll:    CMP    BX,DS:[PixelY2]    ; if y <> y2 then goto drawlp
  132.     JNZ    Drawlp
  133.     CMP    AX,DS:[PixelX2]    ; if x <> x2 then goto drawlp
  134.     JNZ    Drawlp
  135. Plexit:    POP    ES
  136.     POP    DI
  137.     POP    SI
  138.     POP    DX
  139.     POP    CX
  140.     POP    BX
  141.     POP    AX
  142.     RET
  143.  
  144. PlotLine ENDP
  145.  
  146.