[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: gpcb-menu.res



On Wed, 2011-08-31 at 14:00 +0200, Kovacs Levente wrote:
> On Tue, 30 Aug 2011 12:01:00 -0700
> Andrew Poelstra <asp11@xxxxxx> wrote:
> 
> > Fixed in git head.
> 
> Thanks! Maybe I can see why the "automatic layer (group) change" doesn't work.
> Can you give me any clue where it is located in the code?

src/hid/gtkhid-main.c, SwapSides (...)

Approx line 1408:

  if ((active_group == comp_group   && comp_on   && !solder_on) ||
      (active_group == solder_group && solder_on && !comp_on))
    {
      bool new_comp_vis = Settings.ShowSolderSide && active_group == comp_group;

      ChangeGroupVisibility (PCB->LayerGroups.Entries[comp_group][0],
                             new_comp_vis, new_comp_vis);
      ChangeGroupVisibility (PCB->LayerGroups.Entries[solder_group][0],
                             !new_comp_vis, !new_comp_vis);
    }

The failure is probably in picking the correct groups..

at the top of that function:

  int active_group = GetLayerGroupNumberByNumber (LayerStack[0]);                 <-- Probably ok
  int comp_group = GetLayerGroupNumberByNumber (component_silk_layer);            <-- Probably ok
  int solder_group = GetLayerGroupNumberByNumber (solder_silk_layer);             <-- Probably ok
  bool comp_on = LAYER_PTR (PCB->LayerGroups.Entries[comp_group][0])->On;         <-- PROBABLY BAD
  bool solder_on = LAYER_PTR (PCB->LayerGroups.Entries[solder_group][0])->On;     <-- PROBABLY BAD

IIRC, there is no guarantee that the 0'th index in the group is the one
we should be testing here. The (PCB+GL) rendering code tests group
on/off-ness like this:

  int idx = group; /* idx is a group number here */

  if (idx >= 0 && idx < max_group)
    {
      int n = PCB->LayerGroups.Number[group];
      for (idx = 0; idx < n-1; idx ++)

	{  /* idx is a group entry index here */

	  int ni = PCB->LayerGroups.Entries[group][idx];  /* ni is a layer number */
	  if (ni >= 0 && ni < max_copper_layer + 2
	      && PCB->Data->Layer[ni].On)
	    break;
	}
      idx = PCB->LayerGroups.Entries[group][idx];  /* idx is now a layer number! */
  }
  if (idx >= 0 && idx < max_copper_layer + 2)
    {
      group_visible = PCB->Data->Layer[idx].On;
      ... /* idx is a layer number in this section */
    }
  else if (idx < 0)
    ... /* idx is a "magic" group number, created with SL() macros */

What that is doing, is looking for a copper (or silk) layer in the
appropriate group (which gets its number set in "idx", then testing if
that layer is on.

Note that the for-loop stops one-short, as the value left in idx can be
one greater than the termination criteria of the for loop (which IS the
last in the layer group).

idx is abused as both a group index, and a layer index. These are
completely different (boy this code sucks).

(Oh yea, that is ugly!)

I felt sure I'd re-written this because it was ugly before now. I really
shudder to think the above was what _I_ came up with to fix it being
ugly.

-- 
Peter Clifton

Electrical Engineering Division,
Engineering Department,
University of Cambridge,
9, JJ Thomson Avenue,
Cambridge
CB3 0FA

Tel: +44 (0)7729 980173 - (No signal in the lab!)
Tel: +44 (0)1223 748328 - (Shared lab phone, ask for me)

Attachment: signature.asc
Description: This is a digitally signed message part


_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user