// find all existing shmem regions and remove them. void springclean() { SimpleLogger().Write() << "spring-cleaning all shared memory regions"; delete_region(DATA_1); delete_region(LAYOUT_1); delete_region(DATA_2); delete_region(LAYOUT_2); delete_region(CURRENT_REGIONS); }
/*! \brief Replaces current process image with a new one. * * Given a current context, replaces all core and stack regions with ones * created from an ELF file image in memory, including the creation of a process * data section with the given environmental variables*/ int execve_elf (context_t * cur_process, void * elf_image, unsigned long length, const char * env) { bootvideo_printf ("elf image = %l\n", elf_image); if ((cur_process == 0) || (elf_image == 0)) return 0; if (length >= 0x20000000) { bootvideo_printf ("Unsupported Length: %x\n", length); return -1; } /*We need to make a fake segment before 0x40000000 and copy the elf image * there so we can safely destroy all the process's memory regions */ memory_region_t temp; temp.parent = cur_process->space; temp.type = MR_TYPE_KERNEL; temp.virtual_address = 0x20000000; temp.length = (length + PAGE_SIZE) / PAGE_SIZE; map_user_region_to_physical(&temp, 0); /*Make it be backed by mem*/ memcpy ( (void *)0x20000000, elf_image, length); elf_image = (void *) 0x20000000; memory_region_t * cur; for (cur = cur_process->space->first; cur->next != cur_process->space->last; cur = cur->next) { if (cur->next->type == MR_TYPE_CORE) { delete_region (cur->next); } } Elf32_Ehdr * elf_header = (Elf32_Ehdr *) elf_image; Elf32_Phdr * prg_header = (Elf32_Phdr *) ((unsigned long) elf_image + elf_header->e_phoff); uint16 cur_phdr; /*Verify the header*/ if ( !(elf_header->e_ident[EI_MAG0] == ELFMAG0) || !(elf_header->e_ident[EI_MAG1] == ELFMAG1) || !(elf_header->e_ident[EI_MAG2] == ELFMAG2) || !(elf_header->e_ident[EI_MAG3] == ELFMAG3) ) { bootvideo_printf ("Not passed a valid ELF image\n"); return -1; } for (cur_phdr = 0; cur_phdr < elf_header->e_phnum; ++cur_phdr, ++prg_header) { if (prg_header->p_type != PT_LOAD) continue; memory_region_t * mr = create_region (cur_process->space, prg_header->p_vaddr, ((prg_header->p_memsz + PAGE_SIZE) / PAGE_SIZE), MR_TYPE_CORE, 0, 0); map_user_region_to_physical (mr, 0); memcpy ( (char *)prg_header->p_vaddr,(char *) ((unsigned long)elf_image + prg_header->p_offset), prg_header->p_filesz); } cur_process->registers.eip = elf_header->e_entry; elf_header->e_ident[0] = *env; return 0; }
static cb_ret_t insert_char (WInput * in, int c_code) { int res; if (in->highlight) { long m1, m2; if (input_eval_marks (in, &m1, &m2)) delete_region (in, m1, m2); } if (c_code == -1) return MSG_NOT_HANDLED; if (in->charpoint >= MB_LEN_MAX) return MSG_HANDLED; in->charbuf[in->charpoint] = c_code; in->charpoint++; res = str_is_valid_char (in->charbuf, in->charpoint); if (res < 0) { if (res != -2) in->charpoint = 0; /* broken multibyte char, skip */ return MSG_HANDLED; } in->need_push = TRUE; if (strlen (in->buffer) + 1 + in->charpoint >= in->current_max_size) { /* Expand the buffer */ size_t new_length; char *narea; new_length = in->current_max_size + WIDGET (in)->cols + in->charpoint; narea = g_try_renew (char, in->buffer, new_length); if (narea != NULL) { in->buffer = narea; in->current_max_size = new_length; } }
tracking_window::tracking_window(QWidget *parent,ODFModel* new_handle,bool handle_release_) : QMainWindow(parent),handle(new_handle),handle_release(handle_release_), ui(new Ui::tracking_window),scene(*this,new_handle),slice(new_handle) { ODFModel* odf_model = (ODFModel*)handle; FibData& fib_data = odf_model->fib_data; odf_size = fib_data.fib.odf_table.size(); odf_face_size = fib_data.fib.odf_faces.size(); has_odfs = fib_data.fib.has_odfs() ? 1:0; // check whether first index is "fa0" is_dti = (fib_data.view_item[0].name[0] == 'f'); ui->setupUi(this); { setGeometry(10,10,800,600); ui->regionDockWidget->setMinimumWidth(0); ui->dockWidget->setMinimumWidth(0); ui->dockWidget_3->setMinimumWidth(0); ui->renderingLayout->addWidget(renderWidget = new RenderingTableWidget(*this,ui->renderingWidgetHolder,has_odfs)); ui->centralLayout->insertWidget(1,glWidget = new GLWidget(renderWidget->getData("anti_aliasing").toInt(), *this,renderWidget,ui->centralwidget)); ui->verticalLayout_3->addWidget(regionWidget = new RegionTableWidget(*this,ui->regionDockWidget)); ui->tractverticalLayout->addWidget(tractWidget = new TractTableWidget(*this,ui->TractWidgetHolder)); ui->graphicsView->setScene(&scene); ui->graphicsView->setCursor(Qt::CrossCursor); scene.statusbar = ui->statusbar; color_bar.reset(new color_bar_dialog(this)); } // setup fa threshold { for(int index = 0;index < fib_data.fib.index_name.size();++index) ui->tracking_index->addItem((fib_data.fib.index_name[index]+" threshold").c_str()); ui->tracking_index->setCurrentIndex(0); ui->step_size->setValue(fib_data.vs[0]/2.0); } // setup sliders { slice_no_update = true; ui->SagSlider->setRange(0,slice.geometry[0]-1); ui->CorSlider->setRange(0,slice.geometry[1]-1); ui->AxiSlider->setRange(0,slice.geometry[2]-1); ui->SagSlider->setValue(slice.slice_pos[0]); ui->CorSlider->setValue(slice.slice_pos[1]); ui->AxiSlider->setValue(slice.slice_pos[2]); ui->glSagBox->setRange(0,slice.geometry[0]-1); ui->glCorBox->setRange(0,slice.geometry[1]-1); ui->glAxiBox->setRange(0,slice.geometry[2]-1); ui->glSagBox->setValue(slice.slice_pos[0]); ui->glCorBox->setValue(slice.slice_pos[1]); ui->glAxiBox->setValue(slice.slice_pos[2]); slice_no_update = false; on_SliceModality_currentIndexChanged(0); for (unsigned int index = 0;index < fib_data.view_item.size(); ++index) { ui->sliceViewBox->addItem(fib_data.view_item[index].name.c_str()); if(fib_data.view_item[index].is_overlay) ui->overlay->addItem(fib_data.view_item[index].name.c_str()); } ui->sliceViewBox->setCurrentIndex(0); ui->overlay->setCurrentIndex(0); if(ui->overlay->count() == 1) ui->overlay->hide(); } is_qsdr = !handle->fib_data.trans_to_mni.empty(); // setup atlas if(!fa_template_imp.I.empty() && fib_data.vs[0] > 0.5 && !is_qsdr) { mi3_arg.scaling[0] = slice.voxel_size[0] / std::fabs(fa_template_imp.tran[0]); mi3_arg.scaling[1] = slice.voxel_size[1] / std::fabs(fa_template_imp.tran[5]); mi3_arg.scaling[2] = slice.voxel_size[2] / std::fabs(fa_template_imp.tran[10]); image::reg::align_center(slice.source_images,fa_template_imp.I,mi3_arg); mi3.reset(new manual_alignment(this,slice.source_images,fa_template_imp.I,mi3_arg)); is_qsdr = false; } else ui->actionManual_Registration->setEnabled(false); ui->actionConnectometry->setEnabled(handle->fib_data.fib.has_odfs() && is_qsdr); for(int index = 0;index < atlas_list.size();++index) ui->atlasListBox->addItem(atlas_list[index].name.c_str()); { if(is_dti) ui->actionQuantitative_anisotropy_QA->setText("Save FA..."); for (int index = fib_data.other_mapping_index; index < fib_data.view_item.size(); ++index) { std::string& name = fib_data.view_item[index].name; QAction* Item = new QAction(this); Item->setText(QString("Save %1...").arg(name.c_str())); Item->setData(QString(name.c_str())); Item->setVisible(true); connect(Item, SIGNAL(triggered()),tractWidget, SLOT(save_tracts_data_as())); ui->menuSave->addAction(Item); } } // opengl { connect(renderWidget->treemodel,SIGNAL(dataChanged(QModelIndex,QModelIndex)), glWidget,SLOT(updateGL())); connect(ui->tbDefaultParam,SIGNAL(clicked()),renderWidget,SLOT(setDefault())); connect(ui->tbDefaultParam,SIGNAL(clicked()),glWidget,SLOT(updateGL())); connect(ui->glSagSlider,SIGNAL(valueChanged(int)),this,SLOT(glSliderValueChanged())); connect(ui->glCorSlider,SIGNAL(valueChanged(int)),this,SLOT(glSliderValueChanged())); connect(ui->glAxiSlider,SIGNAL(valueChanged(int)),this,SLOT(glSliderValueChanged())); connect(ui->glSagCheck,SIGNAL(stateChanged(int)),glWidget,SLOT(updateGL())); connect(ui->glCorCheck,SIGNAL(stateChanged(int)),glWidget,SLOT(updateGL())); connect(ui->glAxiCheck,SIGNAL(stateChanged(int)),glWidget,SLOT(updateGL())); connect(ui->glSagView,SIGNAL(clicked()),this,SLOT(on_SagView_clicked())); connect(ui->glCorView,SIGNAL(clicked()),this,SLOT(on_CorView_clicked())); connect(ui->glAxiView,SIGNAL(clicked()),this,SLOT(on_AxiView_clicked())); connect(ui->addSlices,SIGNAL(clicked()),this,SLOT(on_actionInsert_T1_T2_triggered())); connect(ui->actionAdd_surface,SIGNAL(triggered()),glWidget,SLOT(addSurface())); connect(ui->SliceModality,SIGNAL(currentIndexChanged(int)),glWidget,SLOT(updateGL())); connect(ui->actionSave_Screen,SIGNAL(triggered()),glWidget,SLOT(catchScreen())); connect(ui->actionSave_3D_screen_in_high_resolution,SIGNAL(triggered()),glWidget,SLOT(catchScreen2())); connect(ui->actionLoad_Camera,SIGNAL(triggered()),glWidget,SLOT(loadCamera())); connect(ui->actionSave_Camera,SIGNAL(triggered()),glWidget,SLOT(saveCamera())); connect(ui->actionLoad_mapping,SIGNAL(triggered()),glWidget,SLOT(loadMapping())); connect(ui->actionSave_mapping,SIGNAL(triggered()),glWidget,SLOT(saveMapping())); connect(ui->actionSave_Rotation_Images,SIGNAL(triggered()),glWidget,SLOT(saveRotationSeries())); connect(ui->actionSave_Left_Right_3D_Image,SIGNAL(triggered()),glWidget,SLOT(saveLeftRight3DImage())); } // scene view { connect(ui->SagSlider,SIGNAL(valueChanged(int)),this,SLOT(SliderValueChanged())); connect(ui->CorSlider,SIGNAL(valueChanged(int)),this,SLOT(SliderValueChanged())); connect(ui->AxiSlider,SIGNAL(valueChanged(int)),this,SLOT(SliderValueChanged())); connect(&scene,SIGNAL(need_update()),&scene,SLOT(show_slice())); connect(&scene,SIGNAL(need_update()),glWidget,SLOT(updateGL())); connect(ui->fa_threshold,SIGNAL(valueChanged(double)),&scene,SLOT(show_slice())); connect(ui->contrast,SIGNAL(valueChanged(int)),&scene,SLOT(show_slice())); connect(ui->offset,SIGNAL(valueChanged(int)),&scene,SLOT(show_slice())); connect(ui->show_fiber,SIGNAL(clicked()),&scene,SLOT(show_slice())); connect(ui->show_pos,SIGNAL(clicked()),&scene,SLOT(show_slice())); connect(ui->show_lr,SIGNAL(clicked()),&scene,SLOT(show_slice())); connect(ui->zoom,SIGNAL(valueChanged(double)),&scene,SLOT(show_slice())); connect(ui->zoom,SIGNAL(valueChanged(double)),&scene,SLOT(center())); connect(ui->actionAxial_View,SIGNAL(triggered()),this,SLOT(on_AxiView_clicked())); connect(ui->actionCoronal_View,SIGNAL(triggered()),this,SLOT(on_CorView_clicked())); connect(ui->actionSagittal_view,SIGNAL(triggered()),this,SLOT(on_SagView_clicked())); connect(ui->actionSave_ROI_Screen,SIGNAL(triggered()),&scene,SLOT(catch_screen())); connect(ui->actionSave_Anisotrpy_Map_as,SIGNAL(triggered()),&scene,SLOT(save_slice_as())); connect(ui->overlay,SIGNAL(currentIndexChanged(int)),this,SLOT(on_sliceViewBox_currentIndexChanged(int))); } // regions { connect(regionWidget,SIGNAL(need_update()),&scene,SLOT(show_slice())); connect(regionWidget,SIGNAL(need_update()),glWidget,SLOT(updateGL())); connect(ui->whole_brain,SIGNAL(clicked()),regionWidget,SLOT(whole_brain())); connect(ui->view_style,SIGNAL(currentIndexChanged(int)),&scene,SLOT(show_slice())); //atlas connect(ui->addRegionFromAtlas,SIGNAL(clicked()),regionWidget,SLOT(add_atlas())); connect(ui->actionNewRegion,SIGNAL(triggered()),regionWidget,SLOT(new_region())); connect(ui->actionOpenRegion,SIGNAL(triggered()),regionWidget,SLOT(load_region())); connect(ui->actionSaveRegionAs,SIGNAL(triggered()),regionWidget,SLOT(save_region())); connect(ui->actionSave_Voxel_Data_As,SIGNAL(triggered()),regionWidget,SLOT(save_region_info())); connect(ui->actionDeleteRegion,SIGNAL(triggered()),regionWidget,SLOT(delete_region())); connect(ui->actionDeleteRegionAll,SIGNAL(triggered()),regionWidget,SLOT(delete_all_region())); // actions connect(ui->actionShift_X,SIGNAL(triggered()),regionWidget,SLOT(action_shiftx())); connect(ui->actionShift_X_2,SIGNAL(triggered()),regionWidget,SLOT(action_shiftnx())); connect(ui->actionShift_Y,SIGNAL(triggered()),regionWidget,SLOT(action_shifty())); connect(ui->actionShift_Y_2,SIGNAL(triggered()),regionWidget,SLOT(action_shiftny())); connect(ui->actionShift_Z,SIGNAL(triggered()),regionWidget,SLOT(action_shiftz())); connect(ui->actionShift_Z_2,SIGNAL(triggered()),regionWidget,SLOT(action_shiftnz())); connect(ui->actionFlip_X,SIGNAL(triggered()),regionWidget,SLOT(action_flipx())); connect(ui->actionFlip_Y,SIGNAL(triggered()),regionWidget,SLOT(action_flipy())); connect(ui->actionFlip_Z,SIGNAL(triggered()),regionWidget,SLOT(action_flipz())); connect(ui->actionThreshold,SIGNAL(triggered()),regionWidget,SLOT(action_threshold())); connect(ui->actionSmoothing,SIGNAL(triggered()),regionWidget,SLOT(action_smoothing())); connect(ui->actionErosion,SIGNAL(triggered()),regionWidget,SLOT(action_erosion())); connect(ui->actionDilation,SIGNAL(triggered()),regionWidget,SLOT(action_dilation())); connect(ui->actionNegate,SIGNAL(triggered()),regionWidget,SLOT(action_negate())); connect(ui->actionDefragment,SIGNAL(triggered()),regionWidget,SLOT(action_defragment())); connect(ui->actionCheck_all_regions,SIGNAL(triggered()),regionWidget,SLOT(check_all())); connect(ui->actionUnckech_all_regions,SIGNAL(triggered()),regionWidget,SLOT(uncheck_all())); connect(ui->actionWhole_brain_seeding,SIGNAL(triggered()),regionWidget,SLOT(whole_brain())); connect(ui->actionRegion_statistics,SIGNAL(triggered()),regionWidget,SLOT(show_statistics())); } // tracts { connect(ui->perform_tracking,SIGNAL(clicked()),tractWidget,SLOT(start_tracking())); connect(ui->stopTracking,SIGNAL(clicked()),tractWidget,SLOT(stop_tracking())); connect(tractWidget,SIGNAL(need_update()),glWidget,SLOT(makeTracts())); connect(tractWidget,SIGNAL(need_update()),glWidget,SLOT(updateGL())); connect(glWidget,SIGNAL(edited()),tractWidget,SLOT(edit_tracts())); connect(glWidget,SIGNAL(region_edited()),glWidget,SLOT(updateGL())); connect(glWidget,SIGNAL(region_edited()),&scene,SLOT(show_slice())); connect(ui->actionOpenTract,SIGNAL(triggered()),tractWidget,SLOT(load_tracts())); connect(ui->actionMerge_All,SIGNAL(triggered()),tractWidget,SLOT(merge_all())); connect(ui->actionCopyTrack,SIGNAL(triggered()),tractWidget,SLOT(copy_track())); connect(ui->actionDeleteTract,SIGNAL(triggered()),tractWidget,SLOT(delete_tract())); connect(ui->actionDeleteTractAll,SIGNAL(triggered()),tractWidget,SLOT(delete_all_tract())); connect(ui->actionOpen_Colors,SIGNAL(triggered()),tractWidget,SLOT(load_tracts_color())); connect(ui->actionSave_Tracts_Colors_As,SIGNAL(triggered()),tractWidget,SLOT(save_tracts_color_as())); connect(ui->actionUndo,SIGNAL(triggered()),tractWidget,SLOT(undo_tracts())); connect(ui->actionRedo,SIGNAL(triggered()),tractWidget,SLOT(redo_tracts())); connect(ui->actionTrim,SIGNAL(triggered()),tractWidget,SLOT(trim_tracts())); connect(ui->actionSet_Color,SIGNAL(triggered()),tractWidget,SLOT(set_color())); connect(ui->actionK_means,SIGNAL(triggered()),tractWidget,SLOT(clustering_kmeans())); connect(ui->actionEM,SIGNAL(triggered()),tractWidget,SLOT(clustering_EM())); connect(ui->actionHierarchical,SIGNAL(triggered()),tractWidget,SLOT(clustering_hie())); connect(ui->actionOpen_Cluster_Labels,SIGNAL(triggered()),tractWidget,SLOT(open_cluster_label())); //setup menu connect(ui->actionSaveTractAs,SIGNAL(triggered()),tractWidget,SLOT(save_tracts_as())); connect(ui->actionSave_All_Tracts_As,SIGNAL(triggered()),tractWidget,SLOT(save_all_tracts_as())); connect(ui->actionQuantitative_anisotropy_QA,SIGNAL(triggered()),tractWidget,SLOT(save_fa_as())); connect(ui->actionSave_End_Points_As,SIGNAL(triggered()),tractWidget,SLOT(save_end_point_as())); connect(ui->actionStatistics,SIGNAL(triggered()),tractWidget,SLOT(show_tracts_statistics())); connect(ui->track_up,SIGNAL(clicked()),tractWidget,SLOT(move_up())); connect(ui->track_down,SIGNAL(clicked()),tractWidget,SLOT(move_down())); } // recall the setting { QSettings settings; if(!default_geo.size()) default_geo = saveGeometry(); if(!default_state.size()) default_state = saveState(); restoreGeometry(settings.value("geometry").toByteArray()); restoreState(settings.value("state").toByteArray()); ui->turning_angle->setValue(settings.value("turning_angle",60).toDouble()); ui->smoothing->setValue(settings.value("smoothing",0.0).toDouble()); ui->min_length->setValue(settings.value("min_length",0.0).toDouble()); ui->max_length->setValue(settings.value("max_length",500).toDouble()); ui->tracking_method->setCurrentIndex(settings.value("tracking_method",0).toInt()); ui->seed_plan->setCurrentIndex(settings.value("seed_plan",0).toInt()); ui->initial_direction->setCurrentIndex(settings.value("initial_direction",0).toInt()); ui->interpolation->setCurrentIndex(settings.value("interpolation",0).toInt()); ui->tracking_plan->setCurrentIndex(settings.value("tracking_plan",0).toInt()); ui->track_count->setValue(settings.value("track_count",2000).toInt()); ui->thread_count->setCurrentIndex(settings.value("thread_count",0).toInt()); ui->glSagCheck->setChecked(settings.value("SagSlice",1).toBool()); ui->glCorCheck->setChecked(settings.value("CorSlice",1).toBool()); ui->glAxiCheck->setChecked(settings.value("AxiSlice",1).toBool()); ui->RenderingQualityBox->setCurrentIndex(settings.value("RenderingQuality",1).toInt()); ui->view_style->setCurrentIndex((settings.value("view_style",0).toInt())); ui->RAS->setChecked(settings.value("RAS",0).toBool()); } { scene.center(); slice_no_update = false; copy_target = 0; } on_glAxiView_clicked(); if(scene.neurology_convention) on_glAxiView_clicked(); qApp->installEventFilter(this); }
/* This is only complicated because it must deal with overlap, and it wants to be smart about copying empty space. . . */ void move_region (struct rng *fm, struct rng *to) { /* Delta {row,col} */ int dr, dc; int nr, nc; int ov, dn; struct rng del_to_1, del_to_2; int do_2, dirs[2]; int maxr, maxc; CELLREF cmax, rmax; int cdmax, rdmax; int must_repaint = 0; /* If this move changes cell widths/heights */ switch (set_to_region (fm, to)) { case 0: return; case 1: io_error_msg ("Can't move source to multiple targets"); return; case 2: del_to_1 = *to; do_2 = 0; dirs[0] = 1; dirs[1] = 1; /* del_fm_1= *fm; */ break; default: /* They overlap. There are eight ways that they can overlap. */ if (to->lc == fm->lc && to->lr < fm->lr) { /* State 1: 'from' on bottom */ del_to_1.lr = to->lr; del_to_1.lc = to->lc; del_to_1.hr = fm->lr - 1; del_to_1.hc = to->hc; do_2 = 0; dirs[0] = 1; dirs[1] = 1; /* del_fm_1.lr=to->hr+1; del_fm_1.lc=fm->lc; del_fm_1.hr=fm->hr; del_fm_1.hc=fm->hc; */ } else if (to->lc == fm->lc) { /* State 2: 'from' on top */ del_to_1.lr = fm->hr + 1; del_to_1.lc = to->lc; del_to_1.hr = to->hr; del_to_1.hc = to->hc; do_2 = 0; dirs[0] = -1; dirs[1] = 1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=fm->lc; del_fm_1.hr=to->lr-1; del_fm_1.hc=fm->hc; */ } else if (to->lr == fm->lr && to->lc < fm->lc) { /* State 3: 'from' on right */ del_to_1.lr = to->lr; del_to_1.lc = to->lc; del_to_1.hr = to->hr; del_to_1.hc = fm->lc - 1; do_2 = 0; dirs[0] = 1; dirs[1] = 1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=to->hc+1; del_fm_1.hr=fm->hr; del_fm_1.hc=fm->hc; */ } else if (to->lr == fm->lr) { /* State 4: 'from' on left */ del_to_1.lr = to->lr; del_to_1.lc = fm->hc + 1; del_to_1.hr = to->hr; del_to_1.hc = to->hc; do_2 = 0; dirs[0] = 1; dirs[1] = -1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=fm->lc; del_fm_1.hr=fm->hr; del_fm_1.hc=to->lc-1; */ } else if (fm->lr < to->lr && fm->lc < to->lc) { /* State 5: From on topleft */ del_to_1.lr = to->lr; del_to_1.lc = fm->hc + 1; del_to_1.hr = fm->hr; del_to_1.hc = to->hc; del_to_2.lr = fm->hr + 1; del_to_2.lc = to->lc; del_to_2.hr = to->hr; del_to_2.hc = to->hc; do_2 = 1; dirs[0] = -1; dirs[1] = -1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=fm->lc; del_fm_1.hr=to->lr-1; del_fm_1.hc=fm->hc; del_fm_2.lr=to->lr; del_fm_2.lc=fm->lc; del_fm_2.hr=fm->hr; del_fm_2.hc=to->lc-1; */ } else if (fm->lr < to->lr) { /* State 6: 'from' on topright */ del_to_1.lr = to->lr; del_to_1.lc = to->lc; del_to_1.hr = fm->hr; del_to_1.hc = fm->lc - 1; del_to_2.lr = fm->hr + 1; del_to_2.lc = to->lc; del_to_2.hr = to->hr; del_to_2.hc = to->hc; do_2 = 1; dirs[0] = -1; dirs[1] = 1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=fm->lc; del_fm_1.hr=to->lr-1; del_fm_1.hc=fm->hc; del_fm_2.lr=to->lr; del_fm_2.lc=to->hc+1; del_fm_2.hr=fm->hr; del_fm_2.hc=fm->hc; */ } else if (fm->lc < to->lc) { /* State 7: 'from on bottomleft */ del_to_1.lr = to->lr; del_to_1.lc = to->lc; del_to_1.hr = fm->lr - 1; del_to_1.hc = to->hc; del_to_2.lr = fm->lr; del_to_2.lc = fm->hc; del_to_2.hr = to->hr; del_to_2.hc = to->hc; do_2 = 1; dirs[0] = 1; dirs[1] = -1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=fm->lc; del_fm_1.hr=to->hr; del_fm_1.hc=to->lc-1; del_fm_2.lr=to->hr+1; del_fm_2.lc=fm->lc; del_fm_2.hr=to->hr+1; del_fm_2.hc=to->lc-1; */ } else { /* State 8: 'from' on bottomright */ del_to_1.lr = to->lr; del_to_1.lc = to->lc; del_to_1.hr = fm->lr - 1; del_to_1.hc = to->hc; del_to_2.lr = fm->lr; del_to_2.lc = to->lc; del_to_2.hr = to->hr; del_to_2.hc = fm->lc - 1; do_2 = 1; dirs[0] = 1; dirs[1] = 1; /* del_fm_1.lr=fm->lr; del_fm_1.lc=to->hc+1; del_fm_1.hr=to->hr; del_fm_1.hc=fm->hc; del_fm_2.lr=to->hr+1; del_fm_2.lc=fm->lc; del_fm_2.hr=fm->hr; del_fm_2.hc=fm->hc; */ } } dn = to->hr - fm->hr; ov = to->hc - fm->hc; dr = fm->hr - fm->lr; dc = fm->hc - fm->lc; delete_region (&del_to_1); if (do_2) delete_region (&del_to_2); if (to->lr == MIN_ROW && to->hr == MAX_ROW) { shift_widths (ov, fm->lc, fm->hc); must_repaint = 1; } if (to->lc == MIN_COL && to->hc == MAX_COL) { shift_heights (dn, fm->lr, fm->hr); must_repaint = 1; } shift_outside (fm, dn, ov); rmax = highest_row (); if (rmax < fm->lr) rdmax = -1; else if (rmax > fm->hr) rdmax = dr; else rdmax = rmax - fm->lr; nr = (dirs[0] > 0) ? 0 : rdmax; maxr = (dirs[0] > 0) ? rdmax + 1 : -1; for (; nr != maxr; nr += dirs[0]) { cmax = max_col (fm->lr + nr); if (cmax < fm->lc) cdmax = -1; else if (cmax > fm->hc) cdmax = dc; else { cdmax = cmax - fm->lc; } nc = (dirs[1] > 0) ? 0 : cdmax; maxc = (dirs[1] > 0) ? cdmax + 1 : -1; for (; nc != maxc; nc += dirs[1]) { CELLREF rf, cf, rt, ct; CELL *cpf; rf = fm->lr + nr; cf = fm->lc + nc; rt = to->lr + nr; ct = to->lc + nc; cpf = find_cell (rf, cf); cur_row = rt; cur_col = ct; my_cell = find_cell (cur_row, cur_col); if ((!cpf || (!cpf->cell_font && ((cpf->cell_flags.cell_format == 0) && (cpf->cell_flags.cell_precision == 0) && (cpf->cell_flags.cell_justify == 0) && (cpf->cell_flags.cell_type == 0)) && (cpf->cell_flags.cell_lock == 0) && !cpf->cell_formula)) && !my_cell) continue; if (!cpf) { bzero(&(my_cell->cell_flags), sizeof(my_cell->cell_flags)); my_cell->cell_font = 0; my_cell->cell_refs_to = 0; my_cell->cell_formula = 0; my_cell->cell_cycle = 0; my_cell = 0; continue; } if (!my_cell) { my_cell = find_or_make_cell (cur_row, cur_col); cpf = find_cell (rf, cf); } else flush_old_value (); my_cell->cell_flags = cpf->cell_flags; my_cell->cell_font = cpf->cell_font; my_cell->cell_refs_to = cpf->cell_refs_to; my_cell->cell_formula = cpf->cell_formula; my_cell->cell_cycle = cpf->cell_cycle; my_cell->c_z = cpf->c_z; bzero(&(cpf->cell_flags), sizeof(cpf->cell_flags)); cpf->cell_font = 0; cpf->cell_refs_to = 0; cpf->cell_formula = 0; cpf->cell_cycle = 0; push_cell (cur_row, cur_col); if (!must_repaint) { if (cpf) io_pr_cell (rf, cf, cpf); if (my_cell) io_pr_cell (rt, ct, my_cell); } my_cell = 0; } } if (must_repaint) io_repaint (); /* Perpetration of an interface change here. If we really * need to get back to the old region, we can do it by * wrapping the move-region command in macros that set * and return to a hardy mark. We might, however, want * to jump the moved text again, or reformat it in some * way, so the mark should travel with us. * * to->lr and to->lc give the lowest column and row (northwest * corner) in the destination region, to->hr and to->hc five the * highest, or southeast corner. The absolute value if their * difference tells us how far to move over and down from * northwest to mark the region just moved. This way the new * region can be operated on as a chunk immediately * * --FB 1997.12.17 */ if (mkrow != NON_ROW) { mkrow = to->lr + abs(to->lr - to->hr); mkcol = to->lc + abs(to->lc - to->hc); } goto_region (to); return; }