Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Using QB's drawing primitives on a layer...
#1
Here's my dilema. I noticed that the LINE function from QB differs a little than most custom libs. I tried Cosmox, Rellib and Blast and they aren't as acurate as QB's LINE. Does QB use a different algorithm than bresenham's? So, since I need a layer for my current project, I need to use SCREEN 7 because it has more than one page. I want to use SCREEN 13, but if I do, I need to set up a layer for flickerless animation. But I can't, because the LINE routine only draws onto the screen. Anyways, is there a way to use QB's drawing primitives directly to a layer instead of to the screen. It's not that neccesary because I'm managing alright with screen 7, but if I want a speed increase from using screen 13 libs and a 256 color palette, I need a way to draw directly to a layer. Any suggestions?
Reply
#2
Yep, sure is. All you have to do is change QB's default drawing segment to your layer:

Code:
' VideoSeg by Plasma357
' Changes QB's active video segment for SCREEN 13
'
' (Works both compiled and in the IDE)
'
' Note: Text is still output to segment A000, but all graphics functions will
'       use the new segment specified.

DEFINT A-Z

DECLARE SUB SetVideoSeg (Segment)

' Here's a useless example that just shifts the segment 16 bytes. Not very
' useful, but you get the picture. ;) You can easily change the segment to
' the EMS pageframe or a buffer in conventional memory.

SCREEN 13
SetVideoSeg &HA000
PSET (0, 0), 15

SetVideoSeg &HA001
PSET (0, 0), 15

k$ = INPUT$(1)
END

SUB SetVideoSeg (Segment) STATIC

  DEF SEG

  IF VideoAddrOff& = 0 THEN   ' First time the sub is called

    ' We need to find the location of b$AddrC, which holds the graphics
    ' offset (b$OffC) and segment (b$SegC). Since b$AddrC is in the default
    ' segment, we can find it by setting it to a certain value, and then
    ' searching for that value.

    SCREEN 13                 ' Set b$SegC to A000 (00A0 in memory)
    PSET (160, 100), 0        ' Set b$OffC to 7DA0 (not needed in the IDE)

    FOR Offset& = 0 TO 32764                 ' Search for b$AddrC, which is
      IF PEEK(Offset&) = &HA0 THEN           ' in the default segment and
        IF PEEK(Offset& + 1) = &H7D THEN     ' should have a value of
          IF PEEK(Offset& + 2) = &H0 THEN    ' A0 7D 00 A0.
            IF PEEK(Offset& + 3) = &HA0 THEN
              VideoAddrOff& = Offset& + 2    ' If we found it, record the
              EXIT FOR                       ' offset of b$SegC and quit
            END IF                           ' looking. (Oddly, changing
          END IF                             ' the b$OffC doesn't seem to
        END IF                               ' do anything, so this is why
      END IF                                 ' this sub only changes b$SegC)
    NEXT

  END IF

  ' Change b$SegC to the specified Segment

  POKE VideoAddrOff&, Segment AND &HFF
  POKE VideoAddrOff& + 1, (Segment AND &HFF00&) \ &H100

END SUB

If your layer is a base layer, you have to get the segment of the layer (depends on the lib, I know there's a function in DQB at least). If your layer is an EMS layer, you have to get the EMS pageframe segment (the lib might have a function to do this, otherwise you can do it with an interrupt).

Then you just use:
SetVideoSeg layersegment%

To set the drawing segment back to the screen (video memory), use &HA000 for the segment.

Also, as stated in the code, this only works for graphics routines...text still goes to the screen.
Reply
#3
excellent, thanks a lot :bounce:
Reply
#4
That's whacked. I had no idea you could set QB's primatives to draw on other layers... crazy.
Reply
#5
Quote:That's whacked. I had no idea you could set QB's primatives to draw on other layers... crazy.

LOL. I've been spamming SetvideoSeg on this forum for almost a year by making some Effects. Look at my 3d rotator. :*)
y smiley is 24 bit.
[Image: anya2.jpg]

Genso's Junkyard:
http://rel.betterwebber.com/
Reply
#6
plasma only discovered that trick a few months ago, so i dont think it's a big deal if didnt know about it Smile
i]"I know what you're thinking. Did he fire six shots or only five? Well, to tell you the truth, in all this excitement, I've kinda lost track myself. But being as this is a .44 Magnum ... you've got to ask yourself one question: 'Do I feel lucky?' Well, do ya punk?"[/i] - Dirty Harry
Reply
#7
Heh, it was almost a year ago Smile
I still haven't used it for what it was originally intended...
Reply
#8
What do you wait for? A Toshi's demo contest? Big Grin
Antoni
Reply
#9
when will the 2003 contest begin, anyhow Wink
i]"I know what you're thinking. Did he fire six shots or only five? Well, to tell you the truth, in all this excitement, I've kinda lost track myself. But being as this is a .44 Magnum ... you've got to ask yourself one question: 'Do I feel lucky?' Well, do ya punk?"[/i] - Dirty Harry
Reply
#10
Actually, I didn't even enter the last one...I had too much crap going on.

Maybe I'll put something together this summer...

But yeah, that was the original plan 8)
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)