int FastZoom(FZOOM_DATA *data) { FZOOM_DATA fzdata ; MFDB std_src, std_dst ; MFDB *pstd_src, *pstd_dst ; int use_std_vdi = NeedStdVDI(data->src->fd_nplanes) ; if ( use_std_vdi ) { if ( data->std_src ) { std_src.fd_addr = NULL ; pstd_src = data->std_src ; } else { memcpy( &std_src, data->src, sizeof(MFDB) ) ; std_src.fd_addr = img_alloc( std_src.fd_w, std_src.fd_h, std_src.fd_nplanes ) ; if ( std_src.fd_addr == NULL ) return( -3 ) ; std_src.fd_stand = 1 ; pstd_src = &std_src ; } if ( data->std_dst ) { std_dst.fd_addr = NULL ; pstd_dst = data->std_dst ; } else { memcpy( &std_dst, data->dst, sizeof(MFDB) ) ; std_dst.fd_addr = img_alloc( std_dst.fd_w, std_dst.fd_h, std_dst.fd_nplanes ) ; if ( std_dst.fd_addr == NULL ) { if ( std_src.fd_addr ) free( std_src.fd_addr ) ; return( -3 ) ; } std_dst.fd_stand = 1 ; pstd_dst = &std_dst ; } vr_trnfm( handle, data->src, pstd_src ) ; StdVDI2ClassicAtari( pstd_src, data->src ) ; memcpy( &fzdata, data, sizeof(FZOOM_DATA) ) ; fzdata.std_src = pstd_src ; fzdata.std_dst = pstd_dst ; } else memcpy( &fzdata, data, sizeof(FZOOM_DATA) ) ; fast_zoom( &fzdata ) ; if ( use_std_vdi ) { ClassicAtari2StdVDI( fzdata.dst, pstd_dst ) ; vr_trnfm( handle, pstd_dst, fzdata.dst ) ; vr_trnfm( handle, pstd_src, data->src ) ; if ( std_dst.fd_addr ) free( std_dst.fd_addr ) ; if ( std_src.fd_addr ) free( std_src.fd_addr ) ; } return( 0 ) ; }
int convert(MFDB *image, long size) { int plane, mplanes; char *line_addr, *buf_addr, *new_addr, *new1_addr, *image_addr, *screen_addr; MFDB dev_form, tmp; long new_size; /* convert size from words to bytes */ size <<= 1; /* memory for the device raster */ new_size=size*(long)planes; if((new_addr=(char *) calloc(1,new_size)) == NULL) return(FALSE); /* initialize MFDBs */ tmp=*image; tmp.fd_nplanes=planes; tmp.fd_addr=new_addr; tmp.fd_stand=1; /* standard format */ dev_form=tmp; screen_addr=new_addr; dev_form.fd_stand=0; /* device format */ image_addr=(char *)image->fd_addr; /* initialize some variables and zero temp. line buffer */ mplanes=min(image->fd_nplanes, planes); /* convert image */ line_addr=image_addr; buf_addr=screen_addr; if(mplanes>1) { /* cut/pad color planes into temp buf */ for(plane=0; plane<mplanes; plane ++) { memcpy(buf_addr, line_addr, size); line_addr += size; buf_addr += size; } } else { /* fill temp line bitplanes with a b&w line */ for(plane=0; plane < planes; plane ++) { memcpy(buf_addr, line_addr, size); buf_addr += size; } } free(image->fd_addr); /* convert image line in temp into current device raster format */ if((new1_addr=(char *) calloc(1,new_size)) == NULL) return(FALSE); dev_form.fd_addr=new1_addr; vr_trnfm(x_handle, &tmp, &dev_form); free(new_addr); /* change image description */ image->fd_stand=0; /* device format */ image->fd_addr=new1_addr; image->fd_nplanes=planes; return(TRUE); }
VOID gsx_trans(LONG saddr, WORD swb, LONG daddr, WORD dwb, WORD h) { gsx_fix(&gl_src, saddr, swb, h); gl_src.fd_stand = TRUE; gl_src.fd_nplanes = 1; gsx_fix(&gl_dst, daddr, dwb, h); vr_trnfm(gl_handle, &gl_src, &gl_dst); }
/* ***Normale Grafik laden und ins aktuelle Format wandeln*** */ int loadpic(char *pname, MFDB *destfdb) { MFDB loadfdb; char alerttxt[64]; if( LoadImg(pname, &loadfdb) ) { strcpy(alerttxt, "[3][Could not load|<"); strcat(alerttxt, pname); strcat(alerttxt, ">][Cancel]"); form_alert(1, alerttxt); return(-1); } destfdb->fd_w=loadfdb.fd_w; destfdb->fd_h=loadfdb.fd_h; destfdb->fd_wdwidth=loadfdb.fd_wdwidth; destfdb->fd_stand=0; destfdb->fd_nplanes=bipp; destfdb->fd_addr=(void *)Malloc((long)destfdb->fd_w*destfdb->fd_h*bipp/8); if(destfdb->fd_addr<=0L) return((int)destfdb->fd_addr); vr_trnfm(vhndl, &loadfdb, destfdb); /* Ins aktuelle Format wandeln */ Mfree(loadfdb.fd_addr); return(0); }
short main(int argc, char *argv[]) { MFDB dest; short my_AppId, x, y, w, h; short work_in[11] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}; short work_out[57], msg[16], w_id1; short open_windows = 1, dummy; short wx, wy, ww, wh, clip[4], pnt[4]; char win1_name[20]; unsigned short logo_trnfrm[LOGO_DATASIZE]; GRECT dirty, walk; short e = 0, evx, evy, a, kc_shstate, kc_key, click_count; my_AppId = appl_init(); my_handle = graf_handle(&x, &y, &w, &h); /* Open a virtual workstation */ v_opnvwk(work_in, &my_handle, work_out); logo_bm.fd_w = LOGO_W; logo_bm.fd_h = LOGO_H; logo_bm.fd_wdwidth = 12; logo_bm.fd_nplanes = 4; logo_bm.fd_stand = 1; dest = logo_bm; dest.fd_stand = 0; logo_bm.fd_addr = (void *)x_logo; dest.fd_addr = (void *)logo_trnfrm; vr_trnfm(my_handle, &logo_bm, &dest); logo_bm.fd_addr = (void *)logo_trnfrm; w_id1 = wind_create(NAME|CLOSE|MOVER, 0, 0, LOGO_W + 40, LOGO_H + 40); if (argc > 1) sprintf(win1_name,"%s", argv[1]); else sprintf(win1_name,"Welcome to...", argv[1]); wind_set(w_id1, WF_NAME, ADDR(win1_name)); x = (work_out[0] - (LOGO_W + 40)) / 2; y = (work_out[1] - (LOGO_H + 40)) / 2; wind_open(w_id1, x, y, LOGO_W + 40, LOGO_H + 40); while((open_windows) && (!(e & MU_TIMER))) { e = evnt_multi(MU_MESAG|MU_TIMER, 258, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, msg, 15000, 0, &evx, &evy, &a, &kc_shstate, &kc_key, &click_count); if (e & MU_MESAG) { dummy = msg[0]; switch(dummy) { case WM_CLOSED: /* Did someone close one of our windows? */ wind_close(msg[3]); open_windows--; break; case WM_MOVED: wind_set(msg[3], WF_CURRXYWH, msg[4], msg[5], msg[6], msg[7]); break; case WM_REDRAW: dirty.g_x = msg[4]; dirty.g_y = msg[5]; dirty.g_w = msg[6]; dirty.g_h = msg[7]; wind_update(BEG_UPDATE); wind_get(msg[3], WF_WORKXYWH, &wx, &wy, &ww, &wh); walk.g_x = wx; walk.g_y = wy; walk.g_w = ww; walk.g_h = wh; pnt[0] = wx; pnt[1] = wy; pnt[2] = wx + ww; pnt[3] = wy + wh; wind_get(msg[3], WF_FIRSTXYWH, &x, &y, &w, &h); rc_intersect(&walk, &dirty); graf_mouse(M_OFF, NULL); while(h) { walk.g_x = x; walk.g_y = y; walk.g_w = w; walk.g_h = h; if (rc_intersect(&dirty, &walk)) { clip[0] = walk.g_x; clip[1] = walk.g_y; clip[2] = walk.g_x + walk.g_w; clip[3] = walk.g_y + walk.g_h; vs_clip(my_handle, 1, clip); vsf_color(my_handle, LWHITE); v_bar(my_handle, pnt); display_bitmap(wx, wy); } wind_get(msg[3], WF_NEXTXYWH, &x, &y, &w, &h); } vs_clip(my_handle, 0, clip); graf_mouse(M_ON, NULL); wind_update(END_UPDATE); break; case WM_TOPPED: wind_set(msg[3], WF_TOP, 0, 0, 0, 0); break; case WM_BOTTOMED: wind_set(msg[3], WF_BOTTOM, 0, 0, 0, 0); break; } } } v_clsvwk(my_handle); appl_exit(); return 0; }