static void copy (QCADDesignObject *src, QCADDesignObject *dst) { GList *llItr = NULL ; QCADLayer *srcLayer = NULL, *dstLayer = NULL ; if (NULL == src || NULL == dst) return ; if (!(QCAD_IS_LAYER (src) && QCAD_IS_LAYER (dst))) return ; srcLayer = QCAD_LAYER (src) ; dstLayer = QCAD_LAYER (dst) ; dstLayer->type = srcLayer->type ; /* dstLayer->status = srcLayer->status ;*/ dstLayer->pszDescription = (NULL == srcLayer->pszDescription ? NULL : g_strdup (srcLayer->pszDescription)) ; for (llItr = g_list_last (srcLayer->lstObjs) ; llItr != NULL ; llItr = llItr->prev) { if (NULL != llItr->data) qcad_do_container_add (QCAD_DO_CONTAINER (dstLayer), qcad_design_object_new_from_object (QCAD_DESIGN_OBJECT (llItr->data))) ; if (llItr == srcLayer->llContainerIter) dstLayer->llContainerIter = dstLayer->lstObjs ; } /*#ifdef GTK_GUI*/ /* // SHALLOW COPY of combo item*/ /* dstLayer->combo_item = srcLayer->combo_item ;*/ //#endif /* def GTK_GUI */ // NOT COPYING THE DEFAULT PROPERTIES HASH TABLE !!! }
static QCADDesignObject *qcad_layer_compound_do_first (QCADCompoundDO *cdo) { if (NULL == cdo) return NULL ; if (!QCAD_IS_LAYER (cdo)) return NULL ; return NULL == ((QCAD_LAYER (cdo)->llContainerIter = QCAD_LAYER (cdo)->lstObjs)) ? NULL : (QCAD_LAYER (cdo)->llContainerIter)->data ; }
static gboolean qcad_layer_compound_do_last (QCADCompoundDO *cdo) { if (NULL == cdo) return TRUE ; if (!QCAD_IS_LAYER (cdo)) return TRUE ; if (NULL == QCAD_LAYER (cdo)->llContainerIter) return TRUE ; if (NULL == (QCAD_LAYER (cdo)->llContainerIter)->next) return TRUE ; return FALSE ; }
static QCADDesignObject *qcad_layer_compound_do_next (QCADCompoundDO *cdo) { if (NULL == cdo) return NULL ; if (!QCAD_IS_LAYER (cdo)) return NULL ; if (NULL == QCAD_LAYER (cdo)->llContainerIter) return NULL ; QCAD_LAYER (cdo)->llContainerIter = (QCAD_LAYER (cdo)->llContainerIter)->next ; if (NULL == QCAD_LAYER (cdo)->llContainerIter) return NULL ; return (QCAD_LAYER (cdo)->llContainerIter)->data ; }
static void qcad_layer_instance_finalize (GObject *object) { GList *llItr = NULL, *llNext = NULL ; QCADLayer *layer = QCAD_LAYER (object) ; void (*parent_finalize) (GObject *object) ; /* DBG_OO (fprintf (stderr, "QCADLayer::instance_finalize:Layer %s:destroying lstObjs\n", layer->pszDescription)) ;*/ for (llItr = layer->lstObjs ; llItr != NULL ; ) { llNext = llItr->next ; if (NULL != llItr->data) { /* DBG_REFS (fprintf (stderr, "QCADLayer::instance_finalize:unref-ing object 0x%08X\n", (int)(llItr->data))) ;*/ g_object_unref (G_OBJECT (llItr->data)) ; } llItr = llNext ; } g_free (layer->pszDescription) ; g_list_free (layer->lstObjs) ; g_list_free (layer->lstSelObjs) ; /* DBG_OO (fprintf (stderr, "QCADLayer::instance_finalize: Calling parent\n")) ;*/ if (NULL != (parent_finalize = G_OBJECT_CLASS (g_type_class_peek (g_type_parent (QCAD_TYPE_LAYER)))->finalize)) (*parent_finalize) (object) ; }
static void qcad_clocking_layer_instance_init (QCADDesignObject *object, gpointer data) { QCADLayer *layer = QCAD_LAYER (object) ; QCAD_CLOCKING_LAYER (layer)->bDrawPotential = FALSE ; QCAD_CLOCKING_LAYER (layer)->z_to_draw = 1 ; QCAD_CLOCKING_LAYER (layer)->tile_size = 16 ; QCAD_CLOCKING_LAYER (layer)->time_coord = 0.0 ; QCAD_CLOCKING_LAYER (layer)->dExtremePotential = 0 ; }
static void draw (QCADDesignObject *obj, GdkDrawable *dst, GdkFunction rop, GdkRectangle *rcClip) { int Nix, Nix1 ; QCADClockingLayer *clocking_layer = QCAD_CLOCKING_LAYER (obj) ; QCADLayer *layer = QCAD_LAYER (obj) ; GdkGC *gc = NULL ; double potential ; GList *llItr = NULL ; double x, y; QCAD_DESIGN_OBJECT_CLASS (g_type_class_peek (g_type_parent (QCAD_TYPE_CLOCKING_LAYER)))->draw (obj, dst, rop, rcClip) ; gc = gdk_gc_new (dst) ; gdk_gc_set_foreground (gc, clr_idx_to_clr_struct (RED)) ; gdk_gc_set_background (gc, clr_idx_to_clr_struct (RED)) ; gdk_gc_set_clip_rectangle (gc, rcClip) ; if (NULL != layer->lstObjs && clocking_layer->bDrawPotential) { GdkPixbuf *pb = NULL ; pb = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, clocking_layer->tile_size, clocking_layer->tile_size) ; for (Nix = 0; Nix < Nx; Nix++) { x = xmin+dx*Nix; for (Nix1 = 0; Nix1 < Ny; Nix1++) { y = ymin+dy*Nix1; potential = get_potential (x, y, clocking_layer->z_to_draw, Nx, Ny, Nz, dx, dy, dz, xmin, ymin) ; /* if (fabs (potential) < clocking_layer->dExtremePotential / 100.0) { fprintf (stderr, "Potential too small - breaking out\n") ; // continue ; } */ gdk_pixbuf_fill (pb, ((potential > 0) ? 0xFF000000 : 0x0000FF00) | (((int)((fabs (potential) / clocking_layer->dExtremePotential) * 128.0)) & 0xFF)) ; // fprintf (stderr, "opacity = %lf/%lf * 255\n", potential, clocking_layer->dExtremePotential) ; gdk_draw_pixbuf (dst, gc, pb, 0, 0, Nix * clocking_layer->tile_size, Nix1 * clocking_layer->tile_size, clocking_layer->tile_size, clocking_layer->tile_size, GDK_RGB_DITHER_NONE, 0, 0) ; //gdk_draw_pixbuf (dst, gc, pb, 0, 0, Nix * clocking_layer->tile_size, Nix1 * clocking_layer->tile_size, clocking_layer->tile_size, clocking_layer->tile_size, GDK_RGB_DITHER_NONE, 0, 0) ; // gdk_draw_rectangle (dst, gc, TRUE, // Nix * clocking_layer->tile_size + (clocking_layer->tile_size >> 1) - 2, // Nix1 * clocking_layer->tile_size + (clocking_layer->tile_size >> 1) - 2, // 5, 5) ; } } g_object_unref (pb) ; } g_object_unref (gc) ; }
// Used by all simulation engines (so far) to assemble design into desirable structures void simulation_inproc_data_new (DESIGN *design, int *p_number_of_cell_layers, int **p_number_of_cells_in_layer, QCADCell ****p_sorted_cells) { int Nix, Nix1 ; GList *llItr = NULL, *llItrObj = NULL ; if (NULL == design) return ; (*p_number_of_cell_layers) = 0 ; // Count number of cell layers for (llItr = design->lstLayers ; llItr != NULL ; llItr = llItr->next) if (LAYER_TYPE_CELLS == QCAD_LAYER (llItr->data)->type) (*p_number_of_cell_layers)++ ; (*p_number_of_cells_in_layer) = g_malloc0 ((*p_number_of_cell_layers) * sizeof (int)) ; (*p_sorted_cells) = g_malloc0 ((*p_number_of_cell_layers) * sizeof (QCADCell **)) ; // Count number of cells in each layer for (Nix = 0, llItr = design->lstLayers ; llItr != NULL ; llItr = llItr->next) { if (LAYER_TYPE_CELLS == QCAD_LAYER (llItr->data)->type) { (*p_number_of_cells_in_layer)[Nix] = 0 ; for (llItrObj = QCAD_LAYER (llItr->data)->lstObjs ; llItrObj != NULL ; llItrObj = llItrObj->next) if (NULL != llItrObj->data) ((*p_number_of_cells_in_layer)[Nix])++ ; if ((*p_number_of_cells_in_layer)[Nix] > 0) { // ... and create and fill out the array to hold all the cells for said layer (*p_sorted_cells)[Nix] = g_malloc0 ((*p_number_of_cells_in_layer)[Nix] * sizeof (QCADCell *)) ; ; for (Nix1 = 0, llItrObj = QCAD_LAYER (llItr->data)->lstObjs ; llItrObj != NULL ; llItrObj = llItrObj->next) if (NULL != llItrObj->data) (*p_sorted_cells)[Nix][Nix1++] = llItrObj->data ; } else (*p_sorted_cells)[Nix] = NULL ; Nix++ ; } } }
static void qcad_layer_instance_init (QCADDesignObject *object, gpointer data) { QCADLayer *layer = QCAD_LAYER (object) ; layer->type = LAYER_TYPE_CELLS ; /* layer->status = LAYER_STATUS_ACTIVE ;*/ layer->pszDescription = g_strdup ("Untitled Layer") ; layer->lstObjs = layer->lstSelObjs = NULL ; layer->default_properties = qcad_layer_create_default_properties (LAYER_TYPE_CELLS) ; /* #ifdef ALLOW_UNSERIALIZE_OVERLAP*/ /* layer->bAllowOverlap = FALSE ;*/ // #endif def ALLOW_UNSERIALIZE_OVERLAP }
// So far, there are only 3 hardcoded layers void fill_printed_objects_list (GtkWidget *ls, print_properties_D *dialog, DESIGN *design) { gboolean bPrintLayer = TRUE ; int Nix ; GList *lstItr = NULL ; if (NULL != dialog->ppPrintedObjs) g_free (dialog->ppPrintedObjs) ; dialog->icPrintedObjs = 0 ; // Count the layers in the design for (lstItr = design->lstLayers ; lstItr != NULL ; lstItr = lstItr->next) dialog->icPrintedObjs++ ; dialog->ppPrintedObjs = g_malloc0 (dialog->icPrintedObjs * sizeof (GtkWidget *)) ; for (lstItr = design->lstLayers, Nix = 0 ; lstItr != NULL ; lstItr = lstItr->next, Nix++) { dialog->ppPrintedObjs[Nix] = gtk_check_button_new_with_label ((QCAD_LAYER (lstItr->data))->pszDescription) ; g_object_set_data (G_OBJECT (dialog->ppPrintedObjs[Nix]), "layer", lstItr->data) ; if (!(gboolean)g_object_get_data (G_OBJECT (lstItr->data), "set_printed")) { g_object_set_data (G_OBJECT (lstItr->data), "set_printed", (gpointer)TRUE) ; g_object_set_data (G_OBJECT (lstItr->data), "print_layer", (gpointer)TRUE) ; } else bPrintLayer = (gboolean)g_object_get_data (G_OBJECT (lstItr->data), "print_layer") ; gtk_widget_show (dialog->ppPrintedObjs[Nix]) ; gtk_box_pack_start (GTK_BOX (dialog->vbPrintedObjs), dialog->ppPrintedObjs[Nix], FALSE, FALSE, 2) ; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->ppPrintedObjs[Nix]), (LAYER_STATUS_ACTIVE == (QCAD_LAYER (lstItr->data))->status || LAYER_STATUS_VISIBLE == (QCAD_LAYER (lstItr->data))->status) && bPrintLayer) ; g_signal_connect (G_OBJECT (dialog->ppPrintedObjs[Nix]), "toggled", (GCallback)chkPrintedObj_toggled, dialog->dlgPrintProps) ; } }
// Calculate the world size (in nanos) static void calc_world_size (int *piCX, int *piCY, print_properties_D *dialog) { int Nix ; WorldRectangle layer_extents = {0.0} ; (*piCX) = (*piCY) = 0 ; for (Nix = 0 ; Nix < dialog->icPrintedObjs ; Nix++) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->ppPrintedObjs[Nix]))) { qcad_layer_get_extents (QCAD_LAYER (g_object_get_data (G_OBJECT (dialog->ppPrintedObjs[Nix]), "layer")), &layer_extents, FALSE) ; (*piCX) = MAX ((*piCX), layer_extents.cxWorld) ; (*piCY) = MAX ((*piCY), layer_extents.cyWorld) ; } }
static void qcad_clocking_layer_calculate_extreme_potentials (QCADClockingLayer *clocking_layer) { GList *llItr = NULL ; EXTREME_POTENTIALS dElectrodeExtremePotential = {0, 0} ; // fprintf (stderr, "QCADClockingLayer::calculate_extreme_potentials:Entering\n") ; clocking_layer->dExtremePotential = 0 ; for (llItr = QCAD_LAYER (clocking_layer)->lstObjs ; llItr != NULL ; llItr = llItr->next) if (NULL != llItr->data) if (QCAD_IS_ELECTRODE (llItr->data)) { dElectrodeExtremePotential = qcad_electrode_get_extreme_potential (QCAD_ELECTRODE (llItr->data), clocking_layer->z_to_draw) ; dElectrodeExtremePotential.min = fabs (dElectrodeExtremePotential.min) ; dElectrodeExtremePotential.max = fabs (dElectrodeExtremePotential.max) ; clocking_layer->dExtremePotential = MAX (dElectrodeExtremePotential.min, MAX (dElectrodeExtremePotential.max, clocking_layer->dExtremePotential)) ; } }
/*#ifdef STDIO_FILEIO*/ static gboolean unserialize (QCADDesignObject *obj, FILE *pfile) { char *pszLine = NULL, *pszValue = NULL ; QCADLayer *layer = NULL ; /* int iShowProgress = -1 ;*/ layer = QCAD_LAYER (obj) ; /*#ifdef ALLOW_UNSERIALIZE_OVERLAP*/ /* layer->bAllowOverlap = TRUE ;*/ //#endif def ALLOW_UNSERIALIZE_OVERLAP if (!SkipPast (pfile, '\0', "[TYPE:" QCAD_TYPE_STRING_LAYER "]", NULL)) return FALSE ; while (TRUE) { //peek the next line if (NULL == (pszLine = ReadLine (pfile, '\0', TRUE))) break ; if (!strcmp (pszLine, "[#TYPE:" QCAD_TYPE_STRING_LAYER "]")) { g_free (pszLine) ; break ; } tokenize_line (pszLine, strlen (pszLine), &pszValue, '=') ; if (!strcmp (pszLine, "type")) { layer->type = atoi (pszValue) ; if (NULL != layer->default_properties) qcad_layer_free_default_properties (layer->default_properties) ; layer->default_properties = qcad_layer_create_default_properties (layer->type) ; } /* else*/ /* if (!strcmp (pszLine, "status"))*/ /* layer->status = atoi (pszValue) ;*/ if (!strcmp (pszLine, "pszDescription")) { if (NULL != layer->pszDescription) g_free (layer->pszDescription) ; layer->pszDescription = g_strdup_printf ("%s", pszValue) ; } else if (!strncmp (pszLine, "[TYPE:", 6)) { if (NULL != (obj = qcad_design_object_new_from_stream (pfile))) { qcad_layer_do_container_add (QCAD_DO_CONTAINER (layer), obj) ; /* DBG_REFS (fprintf (stderr, "QCADLayer::unserialize:After adding object 0x%08X to layer 0x%08X, unref-ing object\n", (int)obj, (int)layer)) ;*/ g_object_unref (G_OBJECT (obj)) ; /* if (!(iShowProgress = (iShowProgress + 1) % 1000))*/ /* set_progress_bar_fraction (get_file_percent (pfile)) ;*/ } } g_free (pszLine) ; //having peeked the line, consume it g_free (ReadLine (pfile, '\0', FALSE)) ; } /*#ifdef ALLOW_UNSERIALIZE_OVERLAP*/ /* layer->bAllowOverlap = FALSE ;*/ //#endif /* def ALLOW_UNSERIALIZE_OVERLAP */ return (layer->type >= 0 && layer->type < LAYER_TYPE_LAST_TYPE /*&& layer->status >= 0 && layer->status < LAYER_STATUS_LAST_STATUS*/) ; }
static void qcad_layer_compound_do_added (QCADCompoundDO *cdo, QCADDesignObject *obj, gpointer data) {qcad_layer_track_new_object (QCAD_LAYER (data), obj, NULL, QCAD_DESIGN_OBJECT (cdo)) ;}
static gboolean qcad_layer_do_container_add (QCADDOContainer *container, QCADDesignObject *obj) { GList *lstIter = NULL ; OBJECT_TRACK_STRUCT *ots = NULL ; QCADLayer *layer = NULL ; QCADDesignObject *obj_child = NULL ; if (!QCAD_IS_LAYER (container)) return FALSE ; layer = QCAD_LAYER (container) ; if (NULL == obj) return FALSE ; ots = g_object_get_data (G_OBJECT (obj), "ots") ; if (NULL != ots) { if (NULL != ots->parent) if (QCAD_IS_DO_CONTAINER (ots->parent)) return qcad_do_container_add (QCAD_DO_CONTAINER (ots->parent), obj) ; // If the layers don't match, we need to move the object to this layer if (ots->layer == layer) { // If we're re-adding the object to its layer, then we merely simulate its (de)selection if (NULL != ots->layer) { /* DBG_REFS (fprintf (stderr, "qcad_layer_add_object:refin-inf object 0x%08X so as to re-add to layer\n", (int)obj)) ;*/ g_object_ref (G_OBJECT (obj)) ; if (NULL != ots->llDeSel) ots->llDeSel->data = obj ; /* qcad_design_object_selected (obj, ots) ;*/ return TRUE ; } } } // Rules for cells if (QCAD_IS_CELL (obj)) { if (layer->type != LAYER_TYPE_CELLS) return FALSE ; /* else*/ // If the object is selected, we don't care that it overlaps, because it's floating /* if (!(obj->bSelected))*/ /* {*/ /*#ifdef ALLOW_UNSERIALIZE_OVERLAP*/ /* if (!(layer->bAllowOverlap))*/ //#endif def ALLOW_UNSERIALIZE_OVERLAP /* for (lstIter = layer->lstObjs ; lstIter != NULL ; lstIter = lstIter->next)*/ /* if (qcad_design_object_overlaps (obj, QCAD_DESIGN_OBJECT (lstIter->data)))*/ /* return FALSE ;*/ /* }*/ } else if (QCAD_IS_SUBSTRATE (obj)) { if (layer->type != LAYER_TYPE_SUBSTRATE) return FALSE ; /* else*/ // If the object is selected, we don't care that it overlaps, because it's floating /* if (!(obj->bSelected))*/ /* {*/ /* for (lstIter = layer->lstObjs ; lstIter != NULL ; lstIter = lstIter->next)*/ /* if (qcad_design_object_overlaps (obj, QCAD_DESIGN_OBJECT (lstIter->data)))*/ /* return FALSE ;*/ /* }*/ } else if (IS_QCAD_LABEL (obj) && (!(LAYER_TYPE_DRAWING == layer->type && obj->bounding_box.cxWorld > 10 && obj->bounding_box.cyWorld > 10))) return FALSE ; qcad_layer_track_new_object (layer, obj, layer->lstObjs = g_list_prepend (layer->lstObjs, obj), NULL) ; if (QCAD_IS_COMPOUND_DO (obj)) { g_signal_connect (G_OBJECT (obj), "added", (GCallback)qcad_layer_compound_do_added, layer) ; g_signal_connect (G_OBJECT (obj), "removed", (GCallback)qcad_layer_compound_do_removed, layer) ; for (obj_child = qcad_compound_do_first (QCAD_COMPOUND_DO (obj)) ; ; obj_child = qcad_compound_do_next (QCAD_COMPOUND_DO (obj))) { if (NULL != obj_child) qcad_layer_track_new_object (layer, obj_child, NULL, obj) ; if (qcad_compound_do_last (QCAD_COMPOUND_DO (obj))) break ; } } return TRUE ; }