delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/02/04/14:07:08

From: "Gary Smith" <gary DOT smith3 AT virgin DOT net>
Newsgroups: comp.os.msdos.djgpp
Subject: Screen / Memory Pointers. HELP !!!
Date: Wed, 4 Feb 1998 18:16:13 -0000
Organization: Virgin Net Usenet Service
Lines: 175
Message-ID: <6bab3s$el1$1@nclient3-gui.server.virgin.net>
NNTP-Posting-Host: 194.168.58.178
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

The program below draws a rotating earth directly to the screen.

I want to know how to get the program to draw to a memory bitmap so that
I can transfer it to the screen using a BLIT.


From the main procedure the variable 'video_buffer' is set to point to the
screen memory.
               video_buffer = (char *)(__djgpp_conventional_base+0xA0000);

In proceure 'draw_big_earth', tl is set to point to a location in the screen
memory
  tl = video_buffer+(SCREEN_W-PIC_W)/2;

The memory location pointed to by tl is then loaded with a value
corresponding to a
pixel in a bitmap.
*tl++ = *(mtl + ofs); // display pixels to screen





//------------------------------------------------------------------
// This program is a modified version of :
//
// Rotating Earth screen saver  by David Lenhart   17 June 1997"
//
//------------------------------------------------------------------


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "c:/djgpp/include/sys/nearptr.h"
#include "allegro.h"

#define MAP_W 640             /* disk image dimensions */
#define MAP_H 320
#define MAP_W2 (MAP_W / 2)
#define MAP_H2 (MAP_H / 2)
#define PIC_W 240             /* large earth dimensions */
#define PIC_H 200
#define PIC_W2 (PIC_W / 2)
#define PIC_H2 (PIC_H / 2)
#define MIN_DELAY 2
#define INTERRUPT_MSEC 10

int xmap[PIC_H2][PIC_W2];
int ymap[PIC_H2];
int picpos=MAP_W2;
BITMAP *earth_map;
BITMAP *earth_map1;
BITMAP *page1;      // This is my memory bitmap <<<<<<<<<<<<<<<<<<<<<<

PALETTE earth_pal;
char *video_buffer;


void calculate_curvature(int *xmap, int *ymap, int w, int h) {
  int x, y, xx, yy;
  double q, hradius2, dist, disty, disty2, ang, xloc, yloc, angy;
  int w2, h2;
  w2 = w/2; h2 = h/2;
  for (y=0; y<h2; y++) {
    disty = ((double)(y - h2 + 0.5)) / h2;
    disty2 = disty * disty;
    hradius2 = 1.0 - disty2;
    for (x=0; x<w2; x++) {
      dist = ((double)(x - w2 + 0.5)) / w2;
      if ( (q=(hradius2 - dist * dist)) >= 0.0 ) {
        if (fabs(dist) > 0.00001) {
          ang = PI - atan2( sqrt( q ), dist );
        }
        else {
          ang = PI2;
        }
        xloc = ang / (2.0 * PI) ;
        xx = ((int)(xloc * MAP_W)) % MAP_W;
        angy = PI2 + atan2(disty , sqrt(1.0 - disty2));
        yloc = angy / PI;
        yy = ((int)(yloc * MAP_H)) % MAP_H;
        *(xmap+(y*w2)+x) = xx;
        if (x == (w2-1)) ymap[y] = yy;
      }
      else {
        *(xmap+(y*w2)+x) = -1;
      }
    }
  }
}


void draw_big_earth(int picpos) {
  char *tl, *tr, *bl, *br;
  char *mtl, *mtr, *mbl, *mbr;
  int x, y, ofs, *p_xmapy;
  tl = video_buffer+(SCREEN_W-PIC_W)/2;
  tr = tl + (PIC_W - 1);
  bl = tl + SCREEN_W*(PIC_H - 1);
  br = bl + (PIC_W - 1);
  for(y=0; y<PIC_H2; y++) {
    mtl = earth_map->line[ ymap[y] ] + picpos;
    mtr = mtl + (MAP_W2 - 1);
    mbl = earth_map->line[ (MAP_H-1) - ymap[y] ] + picpos;
    mbr = mbl + (MAP_W2 - 1);
    p_xmapy = &xmap[y][0];
    for (x=0; x<PIC_W2; x++) {
      if ((ofs = *(p_xmapy + x)) != -1) {
        *tl++ = *(mtl + ofs); // display pixels to screen
        *tr-- = *(mtr - ofs); // tl, tr, bl, br point to the
        *bl++ = *(mbl + ofs); // screen memory
        *br-- = *(mbr - ofs); //
      }
      else {
        tl++;
        tr--;
        bl++;
        br--;
      }
    }
    tl += SCREEN_W-PIC_W2;
    tr += SCREEN_W+PIC_W2;
    bl -= SCREEN_W+PIC_W2;
    br -= SCREEN_W-PIC_W2;
  }
}



void animate_earth(int picstep) {
__djgpp_nearptr_enable();   /* allow video access */
  draw_big_earth(picpos);
  picpos -= picstep;
  if (picpos < 0 || picpos >= MAP_W) {
    if (picpos < 0) picpos += MAP_W;
    if (picpos > MAP_W) picpos -= MAP_W;
  }
}




main(int argc, char *argv[]) {
  int n;

  allegro_init();
  install_timer();
  install_keyboard();
  install_mouse();

  i_love_bill = TRUE;
  video_buffer = (char *)(__djgpp_conventional_base+0xA0000);

  set_gfx_mode(GFX_VGA,320,200,0,0);
  earth_map=create_bitmap(MAP_W+MAP_W2,MAP_H);
  page1=create_bitmap(640,480);
  earth_map1 = load_bmp("earth.bmp",earth_pal);
  set_palette(earth_pal);

  blit(earth_map1, earth_map, 0, 0, 0, 0, MAP_W, MAP_H);
  blit(earth_map1, earth_map, 0, 0, MAP_W, 0, MAP_W2, MAP_H);
  destroy_bitmap(earth_map1);
  calculate_curvature((int *)xmap, (int *)ymap, PIC_W, PIC_H);
  for (n=0; n<400 ;n++) {
    animate_earth(-1);
  }
  exit(0);
}





- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019