コード例 #1
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 !!!
  }
コード例 #2
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 ;
  }
コード例 #3
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 ;
  }
コード例 #4
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 ;
  }
コード例 #5
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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) ;
  }
コード例 #6
0
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 ;
  }
コード例 #7
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) ;
	}
コード例 #8
0
ファイル: simulation.c プロジェクト: 60y0ung/qcadesigner-cuda
// 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++ ;
      }
    }
  }
コード例 #9
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 
  }
コード例 #10
0
// 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) ;
    }
  }
コード例 #11
0
// 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) ;
      }
  }
コード例 #12
0
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)) ;
        }
  }
コード例 #13
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
/*#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*/) ;
  }
コード例 #14
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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)) ;}
コード例 #15
0
ファイル: QCADLayer.c プロジェクト: 60y0ung/qcadesigner-cuda
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 ;
  }