bool gvVisionImage_botcap_front::_insp_loc( Hobject image_src, Hobject *outRegion_loc) { // Local iconic variables Hobject ImageMean, region_thre, region_fillup; Hobject region_erosion, region_dilation, region_conn, region_sel; // Local control variables Hlong numRegions; gen_empty_obj(&(*outRegion_loc)); mean_image(image_src, &ImageMean, 31, 31); dyn_threshold(image_src, ImageMean, ®ion_thre, 5, "light"); fill_up(region_thre, ®ion_fillup); erosion_circle(region_fillup, ®ion_erosion, 5.5); dilation_circle(region_erosion, ®ion_dilation, 5.5); connection(region_dilation, ®ion_conn); select_shape(region_conn, ®ion_sel, "area", "and", m_minarea, 999999); count_obj(region_sel, &numRegions); if ( 1 == numRegions ) { disp_obj(ho_Image,hl_WindowID); disp_obj(region_sel,hl_WindowID); copy_obj(region_sel, &(*outRegion_loc), 1, 1); return true; } return false; }
/** ガーベジコレクションを行う。 コンパクションしながら、 envとprotectから辿れるオブジェクトを回収する。 */ void gc(void) { int i; init_gc_tag();//現在の領域のgcタグを初期化 init_symbol_table(); flip_offset();//次からのalloc_objでは新しい領域を使用 env = copy_obj(env); for(i = 0; i < protect.index; i++){ protect.stack[i] = copy_obj(protect.stack[i]); } return; }
/* *src is a tag tainted pointer */ void evacuate_small(void** src, struct s_gc* s_gc){ void** obj_ptr = (void**) PTR_BITS(*src); if(IS_FORWARDED(obj_ptr)){ debug("%s : pointer forwarded : %08x\n",__FUNCTION__,obj_ptr); void** new_ptr = FORWARDED_PTR(obj_ptr); /* UPDATING SOURCE (with tag) */ *(src) = (void*)((unsigned int) new_ptr | SAVED_BITS(*src)); } else{ void** new_ptr; size_t size_in_word = GET_SIZE(obj_ptr); check_to_space(size_in_word,s_gc); /* remember new_pointer points to preceding info area. */ new_ptr = copy_obj(obj_ptr,s_gc->to_space,size_in_word); /* FORWARDING POINTER (with forward tag) */ *((obj_ptr)-1) = (void*)(FORWARD_MASK | (unsigned int)(new_ptr)); /* UPDATING SOURCE (with tag) */ *(src) = (void*)((unsigned int) (new_ptr) | SAVED_BITS(*src)); debug("%s : evacuated. the old object is now as below:\n",__FUNCTION__); dump_small(obj_ptr,size_in_word); s_gc->small_evaced ++; } }
void bell_fall_scan(void) { long a0,a1,a2,a3,a4,a5,a6,a7; OBJECT *oa8,*oa0; OBJECT *obj=current_proc->pa8; if (distance_off_ground(current_proc,current_proc->pa8)<=224) return; // wait to get off screen stop_me(current_proc->pa8); obj->oxpos.u.intpos=0xb0; // SCX(600); process_sleep(0x50); // let scroller catch up! set_noedge(current_proc->pdata.p_otherguy); // dont allow otherguy to update position with neew world edges obj->oyvel.pos=SCY(0xc0000); obj->ograv.pos=0; set_x_vel(current_proc->pa8,0); /* bfall3 */ do { process_sleep(1); } while(distance_off_ground(current_proc,current_proc->pa8)>SCY(0x10)); dallprc(PID_BACKG); dallprc(PID_SCROLL); stop_scrolling(); a0=worldtlx.pos; a1=worldtlx1.pos; a2=worldtlx2.pos; a3=worldtlx3.pos; a4=worldtlx4.pos; a5=worldtlx5.pos; a6=worldtlx6.pos; a7=worldtlx7.pos; /* init */ init_background_module(bell2_module); worldtly.u.intpos-=SCY(0x50); multi_plane(); worldtly.u.intpos+=SCY(0x50); worldtlx.pos=a0; worldtlx1.pos=a1; worldtlx2.pos=a2; worldtlx3.pos=a3; worldtlx4.pos=a4; worldtlx5.pos=a5; worldtlx6.pos=a6; worldtlx7.pos=a7; (OBJECT *)a0=baklst8; a7=0; /* adj8 */ do { a1=((OBJECT *)a0)->oypos.u.intpos=((OBJECT *)a0)->oypos.u.intpos+ONE_FLOOR; a1+=((OBJECT *)a0)->osize.u.ypos; if (a1>=a7) a7=a1; // new lowest point (OBJECT *)a0=((OBJECT*)a0)->olink; } while((OBJECT *)a0!=NULL); /* tack on xtra pieces to bottom of floor */ (long)current_proc->a7=a7; (long)current_proc->a6=worldtlx.u.intpos; current_proc->a3=0; floor_piece(); broken_floor_a(); broken_floor_b(); current_proc->a3^=1; floor_piece(); CREATE(PID_FX,crash_fx)->pa8=(OBJECT *)(current_proc->pdata.p_store7); scrolly.pos=SCY(0xc0000); // dont fall 2 fast /* wait_old_offscreen */ do { process_sleep(1); } while(worldtly.u.intpos<SCRBOT); current_proc->pa8=(OBJECT*)current_proc->pdata.p_store7; clear_shadow_bit(current_proc->pdata.p_otherguy); set_inviso(current_proc->pdata.p_otherguy); /* get rid of bell tower #1 images */ f_skew=0; delolist(&baklst1); delolist(&baklst2); delolist(&baklst3); delolist(&baklst4); delolist(&baklst5); delolist(&baklst6); delolist(&baklst7); /* make another copy of bell2 on list 7 */ (short)current_proc->a10=worldtly.u.intpos; worldtlx7.pos=worldtlx8.pos; current_proc->pa8=oa8=baklst8; oa0=get_object(); copy_obj(oa8,oa0); baklst7=oa0; goto copy81; /* copy8 */ do { oa0=get_object(); copy_obj(oa8,oa0); ((OBJECT *)current_proc->pa9)->olink=oa0; copy81: oa0->oypos.u.intpos+=ONE_FLOOR; oa0->olink=NULL; (OBJECT *)current_proc->pa9=oa0; oa8=oa8->olink; } while(oa8!=NULL); scroll_down_1_floor(); baklst_down_2_floors(&baklst8); scroll_down_1_floor(); baklst_down_2_floors(&baklst7); /* speed up past the guy !! */ scrolly.pos=SCY(0x100000); // dont fall to fast scroll_down_1_floor(); /* fix borken pieces !!! */ fix_broken_pieces(baklst7); fix_broken_pieces(baklst8); baklst_down_2_floors(&baklst8); scroll_down_1_floor(); baklst_down_2_floors(&baklst7); scroll_down_1_floor(); current_proc->a10=14; (short)current_proc->a3=worldtlx.u.intpos; /* spike3 */ do { oa0=make_a_spike(); oa0->ozval=0; oa0=make_a_spike(); oa0->ozval=100; } while(--current_proc->a10>0 ); process_sleep(5); scrolly.pos=0; current_proc->pa8=oa8=(OBJECT*)current_proc->pdata.p_store7; /* falld3, fall till I meet my maker !!! */ do { process_sleep(1); } while(oa8->oypos.u.intpos<SCY(0xa40) ); rsnd_stab(); death_scream; find_ani_part2(ANIM_KDOWN); do_next_a9_frame(oa8); oa8->oyvel.pos=SCY(0xa0000); /* falld4 */ do { process_sleep(1); oa8->oyvel.pos>>=4; } while(oa8->oyvel.pos>SCY(0x10000) ); ground_y=oa8->oypos.u.intpos+SCY(0x100); create_blood_proc(BLOOD_PIT); process_sleep(10); death_blow_complete(); f_no_bonus=0; // allow bonus routine to do its thing stop_a8(oa8); wait_forever(); }
/****************************************************************************** Function: void stringer(void) By: David Schwartz Date: Jan 1995 Parameters: fnt_state - init state information fnt_buffer - set to text to print current_proc->pa8 - ptr to fnt_buffer str_flags - insert:justify bit 17 = set the "no_scroll" bit in oflags2 bit 16 = 1 insert on obj list bit 15 = 1 shadow the characters that get kicked out justify = 0 left justify 1 center justify 2 right justify Returns: None Description: read fnt_buffer and create an object lists of text to display ******************************************************************************/ void stringer(void) { LONG str_flags; short b2; // emul b2 register XYTYPE initpos; // a3 char cur_char; FNTTPAGE *fptr; OBJECT *obj,*tobj; // current object /* setup correct flag state */ switch (fnt_state.fnt_routine) { case STRCNRMOS: str_flags=0x18001; break; case STRCNRMOS_SCR: str_flags=0x18001|STR_SCROLL; break; case STRLNRMOS_SCR: str_flags=0x18000|STR_SCROLL; break; case STRRNRMOS_SCR: str_flags=0x18002|STR_SCROLL; break; case STRCNRMO_SCR: str_flags=0x10001|STR_SCROLL; break; case STRLNRMO_SCR: str_flags=0x10002|STR_SCROLL; break; case STRRNRMO_SCR: str_flags=0x10000|STR_SCROLL; break; } string_underline=0; // clear shadowing and underling flag (char *)current_proc->pa8=fnt_buffer; // set to start of string to display string_shadow=(str_flags & STR_SHADOW) ? 1:0; /* stringer_noshad */ spacing(); initpos.u.xpos=fnt_state.fnt_posx; initpos.u.ypos=fnt_state.fnt_posy; justify(str_flags & STR_JUSTIFY); /* stringr2 */ while (((short)*((char *)current_proc->pa8))!=0) { cur_char=*((char *)current_proc->pa8); ((char *)(current_proc->pa8))++; // next char b0=0; // not a space, yet if (cur_char<' ') { /* control character */ switch ((short)cur_char) { case NEW_XY: fnt_state.fnt_posx=(short)(*((char *)(current_proc->pa8))); ((char *)(current_proc->pa8))++; // next char fnt_state.fnt_posy=(short)(*((char *)(current_proc->pa8))); ((char *)(current_proc->pa8))++; // next char break; case NEW_SPACING: fnt_state.fnt_spacing=(WORD)(*((char *)(current_proc->pa8))); ((char *)(current_proc->pa8))++; // next char break; case ASCII_CR: fnt_state.fnt_posx=initpos.u.xpos; // get back to where we started fnt_state.fnt_posy=initpos.u.ypos+fnt_spacing.u.ypos; // move down 1 line initpos.u.xpos=fnt_state.fnt_posx; // store position initpos.u.ypos=fnt_state.fnt_posy; justify(str_flags & STR_JUSTIFY); break; case ADD_DYDX: fnt_state.fnt_posx+=((short)(*((char *)(current_proc->pa8)))); // add delta x ((char *)(current_proc->pa8))++; // next char fnt_state.fnt_posy+=((short)(*((char *)(current_proc->pa8)))); // add delta y ((char *)(current_proc->pa8))++; // next char break; } } else { if (cur_char==' ') { /* spacing info setup */ b2=fnt_state.fnt_posx; fnt_state.fnt_posx+=(fnt_spacing.u.xpos+fnt_state.fnt_spacing); if (string_underline==0) goto SKIP_DRAW; b0=b2; b2=fnt_state.fnt_posx; // swap locations fnt_state.fnt_posx=b0; b0=1; cur_char='a'; goto SKIP_DRAW; } /* strnchar, legal character draw time */ fptr=(font_lists[fnt_state.fnt_num].f_ptr)+((WORD)cur_char-0x21); // get ptr to correct character if (text_draw==1) { setXY4(cdb->curr_prim, \ fnt_state.fnt_posx,fnt_state.fnt_posy, \ fnt_state.fnt_posx+fptr->w,fnt_state.fnt_posy, \ fnt_state.fnt_posx,fnt_state.fnt_posy+fptr->h, \ fnt_state.fnt_posx+fptr->w,fnt_state.fnt_posy+fptr->h); SetUVWH(cdb->curr_prim,fptr->u0, \ fptr->v0, \ fptr->w, \ fptr->h); cdb->curr_prim->tpage=font_lists[fnt_state.fnt_num].f_tpage; cdb->curr_prim->clut=get_fore_pal(fnt_state.fnt_pal); DrawPrim(cdb->curr_prim); DrawSync(0); } else { if ((obj=get_object())!=NULL) { obj->oflags2=0; if (str_flags & STR_SCROLL) obj->oflags2|=M_NOSCROLL; // set no scroll bit obj->osag=fptr; obj->oxvel.pos=0; // clear out position & vel info obj->oyvel.pos=0; obj->oxpos.pos=0; obj->oypos.pos=0; #if CD_DEBUG if ( f_cdbug==1 ) { obj->oid=OID_CD; // stuff findable ID obj->opal=get_fore_pal(YELLOW_p); obj->ozval=1000; } else { obj->oid=OID_TEXT; // stuff findable ID obj->opal=get_fore_pal(fnt_state.fnt_pal); obj->ozval=1; } #else obj->oid=OID_TEXT; // stuff findable ID obj->opal=get_fore_pal(fnt_state.fnt_pal); obj->ozval=1; #endif obj->oxpos.u.intpos=fnt_state.fnt_posx; // eliminated anim point stuff obj->oypos.u.intpos=fnt_state.fnt_posy; /* setup header stuff */ obj->header.tpage=font_lists[fnt_state.fnt_num].f_tpage; obj->header.t_xoffset=(fptr->u0); obj->header.t_yoffset=fptr->v0; obj->header.t_width=fptr->w; obj->header.t_height=fptr->h; if (b0==0) insert_object(obj,&objlst2); /* check for underlining */ /* check for shadowing */ if (string_shadow!=0) { tobj=obj; if ((obj=get_object())!=NULL) { copy_obj(tobj,obj); if (fnt_state.fnt_num==FONT_15) { obj->oxpos.u.intpos+=1; obj->oypos.u.intpos+=1; } else { obj->oxpos.u.intpos+=1; obj->oypos.u.intpos+=1; } obj->ozval=0; // normal letters in front of shadows obj->opal=get_fore_pal(bpal_black_P); // shadow is done in black insert_object(obj,&objlst2); } } } } /* strngdun */ if (b0==0) { /* if characters is one need special spacing routine */ if (cur_char=='1') fptr++; fnt_state.fnt_posx+=(fnt_state.fnt_spacing+fptr->w); // pass character size and font spacing } else { fnt_state.fnt_posx=b2; } /* strng_bypass_1 */ if (fnt_state.fnt_sleep!=0) process_sleep(fnt_state.fnt_sleep); } SKIP_DRAW: } /* stringrx */ return; } /****************************************************************************** Function: void spacing(void) By: David Schwartz Date: Jan 1995 Parameters: None Returns: fnt_spacing - sets variables with correct spacing Description: set the spacing for the current font ******************************************************************************/ void spacing(void) { FNTTPAGE *fptr; if (fnt_state.fnt_num==FONT_15) { fnt_spacing.u.xpos=SCX(0x0a); fnt_spacing.u.ypos=SCY(0x13); } else { fptr=font_lists[fnt_state.fnt_num].f_ptr; // get pointer to font info fptr+='H'-0x21; // USE 'H' for space and newline stuff /* x sizing = (x size of 'H')/2 */ fnt_spacing.u.xpos=(fptr->w)>>1; /* x sizing = 3*(y size of 'H')/2 */ fnt_spacing.u.ypos=(fptr->h)+((fptr->h)>>1); } return; }