diff options
Diffstat (limited to 'src/iso/simgraph.c')
-rw-r--r-- | src/iso/simgraph.c | 1429 |
1 files changed, 0 insertions, 1429 deletions
diff --git a/src/iso/simgraph.c b/src/iso/simgraph.c deleted file mode 100644 index 1797f037..00000000 --- a/src/iso/simgraph.c +++ /dev/null @@ -1,1429 +0,0 @@ -/* simgraph.c - * - * Copyright (c) 2001 Hansjörg Malthaner - * hansjoerg.malthaner@gmx.de - * - * This file is part of the Simugraph graphics engine. - * - * - * This file may be copied and modified freely so long as the above credits, - * this paragraph, and the below disclaimer of warranty are retained; no - * financial profit is derived from said modification or copying; and all - * licensing rights to any modifications are granted to the original author, - * Hansjörg Malthaner. - * - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - - -/* simgraph.c - * - * Versuch einer Graphic fuer Simulationsspiele - * Hj. Malthaner, Aug. 1997 - * - * A try to create a graphics engine for simulation games. - * - * 3D, isometrische Darstellung - * - * 3D, isometric display - * - * - * 18.11.97 lineare Speicherung fuer Images -> hoehere Performance - * 22.03.00 run längen Speicherung fuer Images -> hoehere Performance - * 15.08.00 dirty tile verwaltung fuer effizientere updates - */ - -//#define DEBUG 1 - - -#if defined(MSDOS) || defined(__MINGW32__) -#define USE_SOFTPOINTER -#endif - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <math.h> - -#include "simgraph.h" -#include "simsys.h" - -extern unsigned int class; -extern unsigned int code; -extern int mx,my; /* es sind negative Koodinaten mgl */ - -#ifdef USE_SOFTPOINTER -static int softpointer = 261; -static int old_my = -1; // die icon leiste muss neu gezeichnet werden wenn der - // Mauszeiger darueber schwebt -#endif - -static unsigned char dr_fonttab[2048]; /* Unser Zeichensatz sitzt hier */ - -/* - * pixel value type, RGB 555 - */ -typedef unsigned short PIXVAL; - - -struct imd { - int y; // offset top - int h; // image height - int len; // data length in entities of PIXVAL size - PIXVAL * data; // iamge data -}; - - -static int anz_images = 0; - -static int disp_width = 640; -static int disp_height = 480; - -/** - * Tile size in pixels - * - * @author Hj. Malthaner - */ -static int tile_size = 32; - -static struct imd *images = NULL; -static struct imd *images1 = NULL; -static struct imd *images2 = NULL; - - -static PIXVAL *textur = NULL; - - -static struct clip_dimension clip_rect; - - -// dirty tile management strcutures - -#define DIRTY_TILE_SIZE 32 -#define DIRTY_TILE_SHIFT 5 - -static char *tile_dirty = NULL; -static char *tile_dirty_old = NULL; - -static int tiles_per_line = 0; -static int tile_lines = 0; - - -// colormap management structures - -static unsigned char day_pal[256*3]; -static unsigned char night_pal[256*3]; -static unsigned char base_pal[256*3]; - -static int light_level = 0; -static int color_level = 1; - - -// ------------ procedure like defines -------------------- - - -#define mark_tile_dirty(x,y) tile_dirty[(x) + (y)*tiles_per_line] = 1 -#define is_tile_dirty(x,y) ((tile_dirty[(x) + (y)*tiles_per_line]) || (tile_dirty_old[(x) + (y)*tiles_per_line]) ) - -// ----------------- procedures --------------------------- - - -/** - * Markiert ein Tile as schmutzig, ohne Clipping - * @author Hj. Malthaner - */ -static void mark_rect_dirty_nc(int x1, int y1, int x2, int y2) -{ - int x, y; - - // floor to tile size - - x1 >>= DIRTY_TILE_SHIFT; - y1 >>= DIRTY_TILE_SHIFT; - x2 >>= DIRTY_TILE_SHIFT; - y2 >>= DIRTY_TILE_SHIFT; - - for(y=y1; y<=y2; y++) { - for(x=x1; x<=x2; x++) { - mark_tile_dirty(x, y); - } - } -} - -/** - * Markiert ein Tile as schmutzig, mit Clipping - * @author Hj. Malthaner - */ -void mark_rect_dirty_wc(int x1, int y1, int x2, int y2) -{ - if(x1 < 0) x1 = 0; - if(x1 >= disp_width) x1 = disp_width-1; - - if(y1 < 0) y1 = 0; - if(y1 >= disp_height) y1 = disp_height-1; - - if(x2 < 0) x2 = 0; - if(x2 >= disp_width) x2 = disp_width-1; - - if(y2 < 0) y2 = 0; - if(y2 >= disp_height) y2 = disp_height-1; - - mark_rect_dirty_nc(x1, y1, x2, y2); -} - -/** - * Clipped einen Wert in Intervall - * @author Hj. Malthaner - */ -static int clip(int w, int u, int o) -{ - return w < u ? u : w > o ? o : w; -} - - -/** - * Laedt den Font - * @author Hj. Malthaner - */ -static void init_font() -{ - FILE *f = NULL; - - // suche in ./draw.fnt - - if(f==NULL ) { - f=fopen("./draw.fnt","rb"); - } - - if(f==NULL) { - printf("Cannot open draw.fnt!\n"); - exit(1); - } else { - int i; - for(i=0;i<2048;i++) dr_fonttab[i]=getc(f); - fclose(f); - } -} - -/** - * Laedt die Palette - * @author Hj. Malthaner - */ -static int -load_palette(const char *fname, unsigned char *palette) -{ - FILE *file = fopen(fname,"rb"); - - if(file) { - - int x; - int anzahl=256; - int r,g,b; - - fscanf(file, "%d", &anzahl); - - for(x=0; x<anzahl; x++) { - fscanf(file,"%d %d %d", &r, &g, &b); - - palette[x*3+0] = r; - palette[x*3+1] = g; - palette[x*3+2] = b; - } - dr_setRGB8multi(0, anzahl, palette); - - fclose(file); - - return TRUE; - } else { - fprintf(stderr, "Error: can't open file '%s' for reading\n", fname); - return FALSE; - } -} - - -/** - * Dims (darkens) a color. - * @return darkended color. - * @author Hj. Malthaner - */ -static inline int darken(const int dunkel, const PIXVAL farbe) -{ - int r,g,b; - - r = (farbe & 0x7C00) - (dunkel << 10); - - if(r < 0) { - r = 0; - } - - g = (farbe & 0x03E0) - (dunkel << 5); - - if(g < 0) { - g = 0; - } - - b = (farbe & 0x001F) - dunkel; - - if(b < 0) { - b = 0; - } - - return (r & 0x7C00) + (g & 0x03E0) + b; -} - - -int display_get_width() -{ - return disp_width; -} - -int display_get_height() -{ - return disp_height; -} - - -/** - * returns the currently used tile size in pixels - * - * @author Hj. Malthaner - */ -int display_get_tile_size() -{ - return tile_size; -} - - -/** - * selects a tile size - * - * @param n 0 means 64x64 tiles, 1 are 32x32 tiles - * @author Hj. Malthaner - */ -void display_select_tile_size(int n) -{ - switch(n) { - case 0: - tile_size = 64; - images = images1; - break; - - case 1: - tile_size = 32; - images = images2; - break; - - default: - tile_size = 64; - images = images1; - } - - printf("Switching to tile size %d\n", tile_size); -} - - -/** - * Holt Helligkeitseinstellungen - * @author Hj. Malthaner - */ -int display_get_light() -{ - return light_level; -} - - -/** - * Setzt Helligkeitseinstellungen - * @author Hj. Malthaner - */ -void display_set_light(int new_light_level) -{ - unsigned char palette[256*3]; - const double ll = 1.0 - light_level/20.0; - int i; - - light_level = new_light_level; - - for(i=0; i<256; i++) { - const int n = i*3; - palette[n+0] = clip(pow(base_pal[n+0]/255.0, ll)*255.0, 0, 255); - palette[n+1] = clip(pow(base_pal[n+1]/255.0, ll)*255.0, 0, 255); - palette[n+2] = clip(pow(base_pal[n+2]/255.0, ll)*255.0, 0, 255); - } - - dr_setRGB8multi(0, 256, palette); -} - -/** - * Holt Farbeinstellungen - * @author Hj. Malthaner - */ -int display_get_color() -{ - return color_level; -} - - -/** - * Setzt Farbeinstellungen - * @author Hj. Malthaner - */ -void display_set_color(int new_color_level) -{ - color_level = new_color_level; - - if(color_level < 0) { - color_level = 0; - } - - if(color_level > 3) { - color_level = 3; - } - - switch(color_level) { - case 0: - load_palette("./simud70.pal", day_pal); - load_palette("./simun70.pal", night_pal); - break; - case 1: - load_palette("./simud80.pal", day_pal); - load_palette("./simun80.pal", night_pal); - break; - case 2: - load_palette("./simud90.pal", day_pal); - load_palette("./simun90.pal", night_pal); - break; - case 3: - load_palette("./simud100.pal", day_pal); - load_palette("./simun100.pal", night_pal); - break; - } - - memcpy(base_pal, day_pal, 256*3); - display_set_light(display_get_light()); -} - - -static int night_shift = -1; - -static void calc_base_pal_from_night_shift(const int night) -{ - const int day = 4 - night; - int i; - - for(i=0; i<256; i++) { - base_pal[i*3+0] = (day_pal[i*3+0] * day + night_pal[i*3+0] * night) >> 2; - base_pal[i*3+1] = (day_pal[i*3+1] * day + night_pal[i*3+1] * night) >> 2; - base_pal[i*3+2] = (day_pal[i*3+2] * day + night_pal[i*3+2] * night) >> 2; - } -} - - -void display_day_night_shift(int night) -{ - if(night != night_shift) { - night_shift = night; - - calc_base_pal_from_night_shift(night); - - display_set_light(light_level); - mark_rect_dirty_nc(0,0, disp_width-1, disp_height-1); - } -} - - - -/** - * Setzt Farbeintrag - * @author Hj. Malthaner - */ -void display_set_player_colors(const unsigned char *day, const unsigned char *night) -{ - memcpy(day_pal, day, 12); - memcpy(night_pal, night, 12); - - calc_base_pal_from_night_shift(night_shift); - - display_set_light(light_level); - mark_rect_dirty_nc(0,0, disp_width-1, disp_height-1); -} - - -/** - * Liest 32Bit wert Plattfromunabhängig - * @author Hj. Malthaner - */ -static int fread_int(FILE *f) -{ - int i = 0; - - i += fgetc(f); - i += fgetc(f) << 8; - i += fgetc(f) << 16; - i += fgetc(f) << 24; - - return i; -} - - -/** - * Laedt daten.pak - * @author Hj. Malthaner - */ -static struct imd * init_images(const char *filename) -{ - FILE *f = fopen(filename, "rb"); - struct imd * images = NULL; - - if( f ) { - int i; - - anz_images = fread_int(f); - images = malloc(sizeof(struct imd)*anz_images); - - - for(i=0; i<anz_images; i++) { - images[i].y = fread_int(f); - images[i].h = fread_int(f); - images[i].len = fread_int(f); - -// printf("len = %d\n", images[i].len); - - if(images[i].h > 0) { - images[i].data = malloc(images[i].len*sizeof(PIXVAL)); - fread(images[i].data, images[i].len*sizeof(PIXVAL), 1, f); - - } else { - images[i].data = NULL; - } - } - - fclose(f); - } else { - printf("Kann '%s' nicht lesen.\n", filename); - exit(1); - } - - return images; -} - -/** - * Holt Maus X-Position - * @author Hj. Malthaner - */ -int gib_maus_x() -{ - return mx; -} - -/** - * Holt Maus y-Position - * @author Hj. Malthaner - */ -int gib_maus_y() -{ - return my; -} - - -/** - * this sets width < 0 if the range is out of bounds - * so check the value after calling and before displaying - * @author Hj. Malthaner - */ -static int clip_wh(int *x, int *width, const int min_width, const int max_width) -{ - // doesnt check "wider than image" case - - if(*x < min_width) { - const int xoff = min_width - (*x); - - *width += *x; - *x = min_width; - return xoff; - } else if(*x + *width >= max_width) { - *width = max_width - *x; - } - return 0; -} - - -/** - * Ermittelt Clipping Rechteck - * @author Hj. Malthaner - */ -struct clip_dimension display_gib_clip_wh(void) -{ - return clip_rect; -} - - -/** - * Setzt Clipping Rechteck - * @author Hj. Malthaner - */ -void display_setze_clip_wh(int x, int y, int w, int h) -{ - clip_wh(&x, &w, 0, disp_width); - clip_wh(&y, &h, 0, disp_height); - - clip_rect.x = x; - clip_rect.y = y; - clip_rect.w = w; - clip_rect.h = h; - - clip_rect.xx = x+w-1; - clip_rect.yy = y+h-1; -} - -// ----------------- basic painting procedures ---------------- - - -/** - * Kopiert Pixel von src nach dest - * @author Hj. Malthaner - */ -static void pixcopy(PIXVAL *dest, - const PIXVAL *src, - int len) -{ - memcpy(dest, src, len*sizeof(PIXVAL)); -} - - -/** - * Zeichnet Bild mit Clipping - * @author Hj. Malthaner - */ -static void -display_img_wc(const int n, const int xp, const int yp, const int dirty) -{ - if(n >= 0 && n < anz_images) { - - int h = images[n].h; - int y = yp + images[n].y; - - int yoff = clip_wh(&y, &h, 0, clip_rect.yy); - - if(h > 0) { - const int width = disp_width; - const PIXVAL *sp = images[n].data; - PIXVAL *tp = textur + y*width; - - if(dirty) { - mark_rect_dirty_wc(xp, y, xp+tile_size-1, y+h+1); - } - - // oben clippen - - while(yoff) { - yoff --; - do { - if(*(++sp)) { - sp += *sp + 1; - } - } while(*sp); - sp ++; - } - - do { // zeilen dekodieren - int xpos = xp; - - // bild darstellen - - int runlen = *sp++; - - do { - // wir starten mit einem clear run - - xpos += runlen; - - // jetzt kommen farbige pixel - runlen = *sp++; - - if(runlen) { - - if(xpos >= 0 && runlen+xpos < width) { -// pixcopy(tp+xpos, sp, runlen); - memcpy(tp+xpos, sp, runlen*sizeof(PIXVAL)); - } else if(xpos < 0) { - if(runlen+xpos > 0) { -// pixcopy(tp, sp-xpos, runlen+xpos); - memcpy(tp, sp-xpos, (runlen+xpos)*sizeof(PIXVAL)); - } - } else if(width > xpos) { -// pixcopy(tp+xpos, sp, width-xpos); - memcpy(tp+xpos, sp, (width-xpos)*sizeof(PIXVAL)); - } - sp += runlen; - xpos += runlen; - runlen = *sp ++; - } - } while(runlen); - - tp += width; - - } while(--h > 0); - } - } -} - -/** - * Zeichnet Bild ohne Clipping - * @author Hj. Malthaner - */ -static void -display_img_nc(const int n, const int xp, const int yp, const int dirty) -{ - if(n >= 0 && n < anz_images) { - - int h = images[n].h; - - if(h > 0) { - const PIXVAL *sp = images[n].data; - PIXVAL *tp = textur + (yp + images[n].y)*disp_width + xp; - - if(dirty) { - mark_rect_dirty_nc(xp, yp+images[n].y, xp+tile_size-1, yp+images[n].y+h-1); - } - - do { // zeilen dekodieren - - // bild darstellen - - int runlen = *sp++; - - do { - - // wir starten mit einem clear run - tp += runlen; - - // jetzt kommen farbige pixel - runlen = *sp++; - - if(runlen) { -// pixcopy(tp, sp, runlen); - memcpy(tp, sp, runlen*sizeof(PIXVAL)); - sp += runlen; - tp += runlen; - runlen = *sp++; - } - } while(runlen); - - tp += (disp_width-tile_size); - - } while(--h); - } - } -} - -/** - * Zeichnet Bild - * @author Hj. Malthaner - */ -void -display_img(const int n, const int xp, const int yp, const int dirty) -{ - if(xp>=0 && yp>=0 && xp < disp_width-tile_size-1 && yp < disp_height-tile_size-1) { - display_img_nc(n, xp, yp, dirty); - } else { - if(xp>-tile_size && yp>-tile_size && xp < disp_width && yp < disp_height) { - display_img_wc(n, xp, yp, dirty); - } - } -} - - - -/** - * Copies and shades colors - * @param shade the amount to darken the color - * @author Hj. Malthaner - */ -static void colorpixcpy(PIXVAL *dest, const PIXVAL *src, - const PIXVAL * const end, - const PIXVAL shade) -{ - while(src < end) { - *dest++ = darken(shade, *src++); - } -} - - -/** - * Zeichnet Bild, ersetzt Spielerfarben - * @author Hj. Malthaner - */ -static void -display_color_img_aux(const int n, const int xp, const int yp, const int color, const int dirty) -{ - if(n >= 0 && n < anz_images) { - - int h = images[n].h; - int y = yp + images[n].y; - - int yoff = clip_wh(&y, &h, 0, clip_rect.yy); - - if(h > 0) { - const int width = disp_width; - const PIXVAL *sp = images[n].data; - PIXVAL *tp = textur + y*width; - -// printf("textur = %p tp = %p\n", textur, tp); - - if(dirty) { - mark_rect_dirty_wc(xp, y+yoff, xp+tile_size-1, y+yoff+h-1); - } - - // oben clippen - - while(yoff) { - yoff --; - do { - if(*(++sp)) { - sp += *sp + 1; - } - } while(*sp); - sp ++; - } - - do { // zeilen dekodieren - int xpos = xp; - - // bild darstellen - - do { - // wir starten mit einem clear run - - xpos += *sp ++; - - // jetzt kommen farbige pixel - - if(*sp) { - const int runlen = *sp++; - - if(xpos >= 0 && runlen+xpos < width) { - colorpixcpy(tp+xpos, sp, sp+runlen, color); - } else if(xpos < 0) { - if(runlen+xpos > 0) { - colorpixcpy(tp, sp-xpos, sp+runlen, color); - } - } else if(width > xpos) { - colorpixcpy(tp+xpos, sp, sp+width-xpos, color); - } - - sp += runlen; - xpos += runlen; - } - } while(*sp); - - tp += width; - sp ++; - - } while(--h); - } - } -} - - -/** - * Zeichnet Bild, ersetzt Farben - * @author Hj. Malthaner - */ -void -display_color_img(const int n, const int xp, const int yp, const int color, const int dirty) -{ - // since the colors for player 0 are already right, - // only use the expensive replacement routine for colored images - // of other players - - // printf("color=%d\n", color); - - if(color) { - display_color_img_aux(n, xp, yp, color, dirty); - } else { - display_img_wc(n, xp, yp, dirty); - } -} - -/** - * Zeichnet ein Pixel - * @author Hj. Malthaner - */ -void -display_pixel(int x, int y, const int color) -{ - if(x >= clip_rect.x && x<=clip_rect.xx && - y >= clip_rect.y && y<clip_rect.yy) { - - PIXVAL * const p = textur + x + y*disp_width; - *p = color; - - mark_tile_dirty(x >> DIRTY_TILE_SHIFT, y >> DIRTY_TILE_SHIFT); - } -} - - -/** - * Zeichnet einen Text, lowlevel Funktion - * @author Hj. Malthaner - */ -static void -dr_textur_text(PIXVAL *textur,int x,int y,const char *txt, - const int chars, const int fgpen, const int dirty) -{ - int p; - - y+=4; /* Korektu amiga <-> pc */ - - if(y < 0 || y+8 >= disp_height) - return; /* out of clip */ - - - if(dirty) { - mark_rect_dirty_nc(x, y, x+chars*8-1, y+8-1); - } - - - for(p=0; p<chars; p++) { /* Zeichen fuer Zeichen ausgeben */ - int base=((unsigned char *)txt)[p] << 3; /* 8 Byte je Zeichen */ - const int end = base+8; - int screen_pos = x + (p << 3) + y*disp_width; - - - do { - const int c=dr_fonttab[base++]; /* Eine Zeile des Zeichens */ - int b; - - for(b=0; b<8; b++) { - if(c & (128 >> b)) { - textur[screen_pos+b] = fgpen; - } - } - screen_pos += disp_width; - }while(base < end); - } -} - - -/** - * Zeichnet Text, highlevel Funktion - * @author Hj. Malthaner - */ -void -display_text(int x, int y, const char *txt, const int color, int dirty) -{ - const int chars = strlen(txt); - const int text_width = chars*8; - - if(y >= 8 && y < disp_height-12) { - - if(x >= 0 && x+text_width < disp_width) { - dr_textur_text(textur, x, y, txt, chars, color, dirty); - } else { - if(x < 0 && x+text_width > 8) { - const int left_chars = (-x+7)/8; - - dr_textur_text(textur, (x & 7), y, txt+left_chars, chars-left_chars, color, dirty); - } else if(x > 0 && x < disp_width-7) { - const int rest_chars = (disp_width-x-1) / 8; - - dr_textur_text(textur, x, y, txt, rest_chars, color, dirty); - } - } - } -} - -/** - * Zeichnet gefuelltes Rechteck, ohne clipping - * @author Hj. Malthaner - */ -void display_fb_internal(int xp, int yp, int w, int h, - const int color, const int dirty, - int cL, int cR, int cT, int cB) -{ - clip_wh(&xp, &w, cL, cR); - clip_wh(&yp, &h, cT, cB); - - if(w > 0 && h > 0) { - PIXVAL *p = textur + xp + yp*disp_width; - - if(dirty) { - mark_rect_dirty_nc(xp, yp, xp+w-1, yp+h-1); - } - - do { - memset(p, color, w*sizeof(PIXVAL)); - p += disp_width; - } while(--h); - } -} - -void -display_fillbox_wh(int xp, int yp, int w, int h, - const int color, const int dirty) -{ - display_fb_internal(xp,yp,w,h,color,dirty, - 0,disp_width-1,0,disp_height-1); -} -void -display_fillbox_wh_clip(int xp, int yp, int w, int h, - const int color, const int dirty) -{ - display_fb_internal(xp,yp,w,h,color,dirty, - clip_rect.x, clip_rect.xx, clip_rect.y, clip_rect.yy); -} - -/** - * Zeichnet vertikale Linie - * @author Hj. Malthaner - */ -void -display_vl_internal(const int xp, int yp, int h, const int color, int dirty, - int cL, int cR, int cT, int cB) -{ - clip_wh(&yp, &h, cT, cB); - - if(xp >= cL && xp <= cR && h > 0) { - PIXVAL *p = textur + xp + yp*disp_width; - - if (dirty) { - mark_rect_dirty_nc(xp, yp, xp, yp+h-1); - } - - do { - *p = color; - p += disp_width; - } while(--h); - } -} - -void -display_vline_wh(int xp, int yp, int h, const int color, const int dirty) -{ - display_vl_internal(xp,yp,h,color,dirty, - 0,disp_width-1,0,disp_height-1); -} - -void -display_vline_wh_clip(int xp, int yp, int h, const int color, const int dirty) -{ - display_vl_internal(xp,yp,h,color,dirty, - clip_rect.x, clip_rect.xx, clip_rect.y, clip_rect.yy); -} - -/** - * Zeichnet rohe Pixeldaten - * @author Hj. Malthaner - */ -void -display_array_wh(int xp, int yp, int w, int h, const unsigned char *arr) -{ - const int arr_w = w; - - clip_wh(&xp, &w, 0, disp_width); - clip_wh(&yp, &h, 0, disp_height); - - if(w > 0 && h > 0) { - PIXVAL *p = textur + xp + yp*disp_width; - - mark_rect_dirty_nc(xp, yp, xp+w-1, yp+h-1); - - if(xp == 0) { - arr += arr_w - w; - } - - do { - // FIXME!!! - memcpy(p, arr, w); - p += disp_width; - arr += arr_w; - } while(--h); - } -} - - -// --------------- compound painting procedures --------------- - - -/** - * Zeichnet schattiertes Rechteck - * @author Hj. Malthaner - */ -void -display_ddd_box(int x1, int y1, int w, int h, int tl_color, int rd_color) -{ - display_fillbox_wh(x1, y1, w, 1, tl_color, TRUE); - display_fillbox_wh(x1, y1+h-1, w, 1, rd_color, TRUE); - - h-=2; - - display_vline_wh(x1, y1+1, h, tl_color, TRUE); - display_vline_wh(x1+w-1, y1+1, h, rd_color, TRUE); -} - -/** - * Zeichnet schattierten Text - * @author Hj. Malthaner - */ -void -display_ddd_text(int xpos, int ypos, int hgt, - int ddd_farbe, int text_farbe, - const char *text, int dirty) -{ - const int len = strlen(text)*4; - - display_fillbox_wh(xpos-2-len, - ypos-hgt-6, - 4 + len*2, 1, - ddd_farbe+1, - dirty); - display_fillbox_wh(xpos-2-len, - ypos-hgt-5, - 4 + len*2, 8, - ddd_farbe, - dirty); - display_fillbox_wh(xpos-2-len, - ypos-hgt+3, - 4 + len*2, 1, - ddd_farbe-1, - dirty); - - display_text(xpos - len, - ypos-hgt-9, - text, - text_farbe, - dirty); -} - - -/** - * Zaehlt Vorkommen eines Buchstabens in einem String - * @author Hj. Malthaner - */ -int -count_char(const char *str, const char c) -{ - int count = 0; - - while(*str) { - count += (*str++ == c); - } - return count; -} - -/** - * Zeichnet einen mehrzeiligen Text - * @author Hj. Malthaner - */ -void -display_multiline_text(int x, int y, const char *inbuf, int color) -{ - char tmp[4096]; - char *buf = tmp; - char *next; - int y_off = 0; - - // be sure not to copy more than buffer size - strncpy(buf, inbuf, 4095); - - // always close with a 0 byte - buf[4095] = 0; - - while( (*buf != 0) && (next = strchr(buf,'\n')) ) { - *next = 0; - display_text(x,y+y_off, buf, color, TRUE); - buf = next+1; - y_off += LINESPACE; - } -} - - -/** - * Loescht den Bildschirm - * @author Hj. Malthaner - */ -void -display_clear() -{ - memset(textur+32*disp_width, 32, disp_width*(disp_height-17-32)); - - mark_rect_dirty_nc(0, 0, disp_width-1, disp_height-1); -} - - -#if 0 -void display_flush_buffer() -{ - int x, y; - char * tmp; - -#ifdef USE_SOFTPOINTER - display_img(softpointer, mx, my, TRUE); - old_my = my; -#endif - -#ifdef DEBUG - // just for debugging - int tile_count = 0; -#endif - - for(y=0; y<tile_lines; y++) { -#ifdef DEBUG - - for(x=0; x<tiles_per_line; x++) { - if(is_tile_dirty(x, y)) { - display_fillbox_wh(x << DIRTY_TILE_SHIFT, - y << DIRTY_TILE_SHIFT, - DIRTY_TILE_SIZE/4, - DIRTY_TILE_SIZE/4, - 3, - FALSE); - - - - dr_textur(x << DIRTY_TILE_SHIFT, - y << DIRTY_TILE_SHIFT, - DIRTY_TILE_SIZE, - DIRTY_TILE_SIZE); - - tile_count ++; - } else { - display_fillbox_wh(x << DIRTY_TILE_SHIFT, - y << DIRTY_TILE_SHIFT, - DIRTY_TILE_SIZE/4, - DIRTY_TILE_SIZE/4, - 0, - FALSE); - - - - dr_textur(x << DIRTY_TILE_SHIFT, - y << DIRTY_TILE_SHIFT, - DIRTY_TILE_SIZE, - DIRTY_TILE_SIZE); - - } - } -#else - x = 0; - - do { - if(is_tile_dirty(x, y)) { - const int xl = x; - do { - x++; - } while(x < tiles_per_line && is_tile_dirty(x, y)); - - dr_textur(xl << DIRTY_TILE_SHIFT, - y << DIRTY_TILE_SHIFT, - (x-xl)<<DIRTY_TILE_SHIFT, - DIRTY_TILE_SIZE); - - } - x++; - } while(x < tiles_per_line); -#endif - } - -#ifdef DEBUG -// printf("%d von %d tiles wurden gezeichnet\n", tile_count, tile_lines*tiles_per_line); -#endif - - dr_flush(); - - // swap tile buffers - tmp = tile_dirty_old; - tile_dirty_old = tile_dirty; - - tile_dirty = tmp; - memset(tile_dirty, 0, tile_lines*tiles_per_line); -} -#endif /* 0 */ - -void display_flush_buffer() -{ - dr_textur(0, 0, disp_width, disp_height); -} - -/** - * Bewegt Mauszeiger - * @author Hj. Malthaner - */ -void display_move_pointer(int dx, int dy) -{ - move_pointer(dx, dy); -} - - -/** - * Schaltet Mauszeiger sichtbar/unsichtbar - * @author Hj. Malthaner - */ -void display_show_pointer(int yesno) -{ -#ifdef USE_SOFTPOINTER - if(yesno) { - softpointer = 261; - } else { - softpointer = 52; - } -#else - show_pointer(yesno); -#endif -} - -/** - * unbenutzt ? - * @author Hj. Malthaner - */ -void -my_save_exit() -{ - dr_os_close(); -} - - -/** - * Inits. Grafikmodul - * @author Hj. Malthaner - */ -int -simgraph_init(int width, int height) -{ - int parameter[2]; - int ok; - - dr_os_init(0, parameter); - - ok = dr_os_open(width, height); - - if(ok) { - - disp_width = dr_get_width(); - disp_height = dr_get_height(); - - textur = dr_textur_init(); - - // not needed for iso-band - // init_font(".drawrc"); - - -// display_set_color(1); - - - images1 = init_images("daten.pak"); - - images2 = init_images("daten2.pak"); - - display_select_tile_size(0); - - printf("Init. done.\n"); - -// dr_use_color(rp, SCHWARZ); -// dr_fillbox_wh(rp, 0, 0, disp_width, WIN_disp_height); - - } else { - puts("Error : can't open window!"); - exit(-1); - } - - - // allocate dirty tile flags - tiles_per_line = (disp_width + DIRTY_TILE_SIZE - 1) / DIRTY_TILE_SIZE; - tile_lines = (disp_height + DIRTY_TILE_SIZE - 1) / DIRTY_TILE_SIZE; - - tile_dirty = malloc( tile_lines*tiles_per_line ); - tile_dirty_old = malloc( tile_lines*tiles_per_line ); - - memset(tile_dirty, 1, tile_lines*tiles_per_line); - memset(tile_dirty_old, 1, tile_lines*tiles_per_line); - - display_setze_clip_wh(0, 0, disp_width, disp_height); - - return TRUE; -} - -/** - * Prueft ob das Grafikmodul schon init. wurde - * @author Hj. Malthaner - */ -int is_display_init() -{ - return textur != NULL; -} - -/** - * Schliest das Grafikmodul - * @author Hj. Malthaner - */ -int -simgraph_exit() -{ - free(tile_dirty); - free(tile_dirty_old); - - - return dr_os_close(); -} - - -/** - * Laedt Einstellungen - * @author Hj. Malthaner - */ -void display_laden(FILE* file) -{ - int i,r,g,b; - - unsigned char day[12]; - unsigned char night[12]; - - fscanf(file, "%d %d %d\n", &light_level, &color_level, &night_shift); - - display_set_light(light_level); - display_set_color(color_level); - - for(i=0; i<4; i++) { - fscanf(file, "%d %d %d\n", &r, &g, &b); - day[i*3+0] = r; - day[i*3+1] = g; - day[i*3+2] = b; - - fscanf(file, "%d %d %d\n", &r, &g, &b); - night[i*3+0] = r; - night[i*3+1] = g; - night[i*3+2] = b; - } - - display_set_player_colors(day, night); -} - - -/** - * Speichert Einstellungen - * @author Hj. Malthaner - */ -void display_speichern(FILE* file) -{ - int i; - fprintf(file, "%d %d %d\n", light_level, color_level, night_shift); - - for(i=0; i<4; i++) { - fprintf(file, "%d %d %d\n", day_pal[i*3+0], day_pal[i*3+1], day_pal[i*3+2]); - fprintf(file, "%d %d %d\n", night_pal[i*3+0], night_pal[i*3+1], night_pal[i*3+2]); - } -} - |