示例#1
0
void
layout_resize(int winc, int hinc) {
    Win *w;
    List *l, *ll;
    Layout *lo;
    Laydata *ld;
    int x, y, width, height;
    unsigned int i, j;

    if(!data.current || !(lo = layout_get(var.layout)))
        return;
    i = win_index(data.tag, NORMAL, data.current);
    j = win_len(data.tag, NORMAL) - 1;
    x = y = width = height = 0;
    if(win_first(data.tag, NORMAL, &l, &w))
        for(;w;) {
            if(!(l = list_nth(lo->data, i)))
                l = list_last(lo->data);
            j = lo->tile ? MIN(list_len(l), j) : j;
            l = (List*)l->ptr;
            if(!(ll = list_nth(l, (j - i))))
                ll = list_last(l);
            ld = (Laydata*)ll->ptr;
            if(!x && !y && !width && !height) {
                x = ld->x;
                y = ld->y;
                width = ld->width;
                height = ld->height;
                if(height >= 100)
                    hinc = 0;
                if(width >= 100)
                    winc = 0;
                i = 0;
                continue;
            }
            resize(x, width, &ld->x, (int*)&ld->width, winc);
            resize(y, height, &ld->y, (int*)&ld->height, hinc);
            win_next(data.tag, NORMAL, &l, &w);
            ++i;
        }
    layout_arrange();
}
示例#2
0
/*=*/ int A_menos_x_contido_W (trv_struc * base, win_struc * win) {
  /* colocar win no formato de base->B se win esta contido */
  /* em base->win */

  win_struc win1, win2;
  int * A, tam_A, i, contido, ind;
  int nshifts, block, win_nshifts, section;
  int * winidx, * base_A, * base_B;

  if (base == NULL || win == NULL) {
    fprintf (stderr, "A_menos_x_contido_W () pointers to NULL\n");
    return 0;
  }

  if (base->size != 1) {
    fprintf (stderr, "The basis must represent just one interval\n");
    return 0;
  }

  copy_win (&base->win, &win1);
  copy_win (win, &win2);

  /* colocar win e base->win em um mesmo tamanho de retangulo */
  if (win1.hsize < win2.hsize) 
    transform_to_big_window (&win1, win2.hsize);
  else
    transform_to_big_window (&win2, win1.hsize);

  /* monta o lado esquerdo do intervalo no tamanho do retangulo da janela */
  tam_A = (win1.hsize*win1.wsize+NB1)/NB;
  A = (int *) node_allocation (sizeof (int)*tam_A);
  for (i=0; i<tam_A; i++) A[i] = 0;
  win_index (&win1, &winidx);
  ind = base->ind[0]; /* ind must be equal to zero */
  base_A = &base->A[ind];

  for (i=0; i<base->nv; i++) {
    nshifts = i%NB;
    block   = i/NB;
    if ((base_A[block] & mask[nshifts]) != 0) {
      win_nshifts = winidx[i]%NB;
      section     = winidx[i]/NB;
      A[section] |= mask[win_nshifts];
    }
  }

  /* A e' o lado esquerdo do intervalo no retangulo da janela */

  if (winidx) free (winidx);
  winidx = NULL;

  /* verifica se o lado esquerdo esta' contido na janela W */
  contido=1;
  for (i=0; i<tam_A && contido; i++) {
    if ((A[i] & win2.data[i]) != A[i]) {
      contido=0;
      break;
    }
  }

  /* liberando a base antiga */
  free_basis_by_ron (base);

  if (contido) {
    /* atualizando os novos parametros da base  */
    /* Esta base vai estar definida na janela W */
    base->nv = win2.size;
    base->nb = (win2.size+NB1)/NB;
    base->total = base->size = 1;
    base->A = (int *) node_allocation (sizeof(int)*base->total*base->nb);
    base->B = (int *) node_allocation (sizeof(int)*base->total*base->nb);
    base->ind = (int *) node_allocation (sizeof(int)*base->total);
    base->ind[0] = 0;
    copy_win (&win2, &base->win);
    base_A = &base->A[0];
    base_B = &base->B[0];

    /* novos indices da janela win */
    if (winidx) free (winidx);
    win_index (&win2, &winidx);

    /* montando o lado esquerdo e direito do intervalo da base */
    for (i=0; i<base->nb; i++) base_A[i] = base_B[i] = 0;

    for (i=0; i<base->nv; i++) {
      win_nshifts = winidx[i]%NB;
      section     = winidx[i]/NB;
      if (((~A[section]) & mask[win_nshifts]) != 0) {
        nshifts = i%NB;
        block   = i/NB;
        base_B[block] |= mask[nshifts];
      }
      if ((A[section] & mask[win_nshifts]) != 0) {
        nshifts = i%NB;
        block   = i/NB;
        base_A[block] |= mask[nshifts];
      }
    }
  }

  if (A) free (A);
  if (winidx) free (winidx);
  free_win_by_ron (&win1);
  free_win_by_ron (&win2);
  return 1;
}
示例#3
0
/*=*/ int B_menos_x_contido_W (trv_struc * base, win_struc * win) {
  /* colocar win no formato de base->B se win esta contido */
  /* em base->win */

  win_struc win1, win2;
  int * B, tam_B, i, contido, ind;
  int nshifts, block, win_nshifts, section;
  int * winidx, * base_A, * base_B;
  int j, tem;

  if (base == NULL || win == NULL) {
    fprintf (stderr, "A_menos_x_contido_W () pointers to NULL\n");
    return 0;
  }

  if (base->size != 1) {
    fprintf (stderr, "The basis must represent just one interval\n");
    return 0;
  }

  copy_win (&base->win, &win1);
  copy_win (win, &win2);

  /* colocar win e base->win em um mesmo tamanho de retangulo */
  if (win1.hsize < win2.hsize) 
    transform_to_big_window (&win1, win2.hsize);
  else
    transform_to_big_window (&win2, win1.hsize);

  /* monta o lado esquerdo do intervalo no tamanho do retangulo da janela */
  tam_B = (win1.hsize*win1.wsize+NB1)/NB;
  B = (int *) node_allocation (sizeof (int)*tam_B);
  for (i=0; i<tam_B; i++) B[i] = 0;
  win_index (&win1, &winidx);
  ind = base->ind[0]; /* ind must be equal to zero */
  base_B = &base->B[ind];

  for (i=0; i<base->nv; i++) {
    nshifts = i%NB;
    block   = i/NB;
    if ((base_B[block] & mask[nshifts]) != 0) {
      win_nshifts = winidx[i]%NB;
      section     = winidx[i]/NB;
      B[section] |= mask[win_nshifts];
    }
  }

  /* invertendo B */
  for (i=0; i<tam_B; i++) B[i] = ~B[i];

  /* B e' o lado direito do intervalo no retangulo da janela */

  if (winidx) free (winidx);
  win_index (&win2, &winidx);

  contido = 1; /* se terminar com 1, continua, senao cai fora */
  /* se W[i] == 0 entao B[i] == 1 */
  for (i=0; i<win->hsize*win->wsize; i++) {
    for (j=0, tem=0; j<win->size && !tem; j++) {
      if (i==winidx[j]) tem = 1;
    }
    /* neste caso, o valor de W no ponto e' zero */
    if (!tem) {
      win_nshifts = i%NB;
      section     = i/NB;
      if ( (B[section] & mask[win_nshifts]) == 0 ) {
        contido = 0;
        break;
      }
    }
  }

  /* liberando a base antiga */
  free_basis_by_ron (base);

  if (contido) {
    /* fazendo a interseccao */
    for (i=0; i<tam_B; i++) B[i] = (B[i] & win2.data[i]);
    /* faz a negacao do lado direito */
    for (i=0; i<tam_B; i++) B[i] = ~B[i];

    /* atualizando os novos parametros da base  */
    /* Esta base vai estar definida na janela W */
    base->nv = win2.size;
    base->nb = (win2.size+NB1)/NB;
    base->total = base->size = 1;
    base->A = (int *) node_allocation (sizeof(int)*base->total*base->nb);
    base->B = (int *) node_allocation (sizeof(int)*base->total*base->nb);
    base->ind = (int *) node_allocation (sizeof(int)*base->total);
    base->ind[0] = 0;
    copy_win (&win2, &base->win);
    base_A = &base->A[0];
    base_B = &base->B[0];

    /* novos indices da janela win */
    if (winidx) free (winidx);
    win_index (&win2, &winidx);

    /* montando o lado esquerdo e direito do intervalo da base */
    for (i=0; i<base->nb; i++) base_A[i] = base_B[i] = 0;

    for (i=0; i<base->nv; i++) {
      win_nshifts = winidx[i]%NB;
      section     = winidx[i]/NB;
      if (((B[section]) & mask[win_nshifts]) != 0) {
        nshifts = i%NB;
        block   = i/NB;
        base_B[block] |= mask[nshifts];
      }
      if ((~B[section] & mask[win_nshifts]) != 0) {
        nshifts = i%NB;
        block   = i/NB;
        base_A[block] |= mask[nshifts];
      }
    }
  }

  if (B) free (B);
  if (winidx) free (winidx);
  free_win_by_ron (&win1);
  free_win_by_ron (&win2);
  return 1;
}
示例#4
0
/*=*/ int search_increasing_all_direto (trv_struc * base, output_search * * sai) {
  trv_struc minimo;
  win_struc S, C;
  int * comb, num_comb, tam_idx, *winidx, i, j, k, tem;
  int section, nshifts, tam, invariante;
  mat_str str;
  trv_struc_list * lower;
  win_struc_list * Lista_C, * apt_Lista_C;
  int tam_Lista_C;
  output_search * apt_sai;
  trv_struc_list * apt_trv, * solucao;

  zera_basis_by_ron (&minimo);
  zera_win_by_ron (&S);
  zera_win_by_ron (&C);
  str.dat = NULL;
  Lista_C = NULL;
  *sai = NULL;

  // disp_basis_by_ron (base);

  minimo_lado_esquerdo (&minimo, base);

  // printf ("Base Total = %d\n", base->total);

  // disp_basis_by_ron (&minimo);

  esse_min_lado_esquerdo_min (&S, &minimo, base);

  // printf ("Menor Elemento Estruturante: N. de Pontos = %d\n", S.size);
  // disp_win_by_ron (&S);

  win_index (&S, &winidx);
  tam_idx = S.size;
  copy_win (&S, &C);
  tam = (S.hsize*S.wsize + NB1) / NB;
  tam_Lista_C = 0;
  for (i=1; i<=tam_idx; i++) {
    comb = NULL; num_comb = numero_de_combinacoes (tam_idx, i);
    for (j=0; j<num_comb; j++) {
      _combinacoes_ (tam_idx, i, &comb);
      if (i>1) {
        for (k=0; k<tam; k++) C.data[k] = 0;
        C.size = 0;
        for (k=0; k<i; k++) {
          section = winidx[comb[k]] / NB;
          nshifts = winidx[comb[k]] % NB;
          C.data[section] |= mask[nshifts];
          (C.size)++;
        }
        /* Neste ponto temos um C gerado */
        /* verifica se C e' invariante de S */
        invariante = invariante_window (&S, &C);
        if (invariante) {
          tem = 0;
          for (apt_Lista_C = Lista_C; apt_Lista_C && !tem; apt_Lista_C =
               apt_Lista_C->prox) {
            if (C.size == apt_Lista_C->win.size) {
              tem = invariante_window (&C, &apt_Lista_C->win);
            }
          }
          if (!tem) {
            apt_Lista_C = (win_struc_list *) 
                          node_allocation (sizeof(win_struc_list));
            copy_win (&C, &apt_Lista_C->win);
            apt_Lista_C->prox = Lista_C;
            Lista_C = apt_Lista_C;
            tam_Lista_C++;
          }
        }
      }
    }
    if (comb) free (comb);
  }


  /*
  printf ("Elementos Estruturantes\n");
  for (apt_Lista_C = Lista_C; apt_Lista_C; apt_Lista_C = apt_Lista_C->prox) {
      printf ("Structuring Element:\n");
      disp_win_by_ron (&apt_Lista_C->win);
      printf ("\n");
  }
  printf ("FIM: Elementos Estruturantes\n");
  */  

  // printf ("Base = %d\n", base->total);
  // printf ("Menor Elemento Estruturante: N. de Pontos = %d\n", S.size);
  // disp_win_by_ron (&S);
  // if (Lista_C) printf ("Lista_C nao vazia\n");
  // else printf ("Lista_C vazia\n");

  while (Lista_C) {
    apt_Lista_C = Lista_C;
    Lista_C = Lista_C->prox;
    if (str.dat) {free (str.dat); str.dat = NULL;}
    window_to_str (&apt_Lista_C->win, &str);
    if (beatriz) {
      printf ("Structuring Element:\n");
      disp_win_by_ron (&apt_Lista_C->win);
      printf ("\n");
    }
    if (leZ) 
      le_os_Z ("Z.txt", &lower);
    else
      gera_lower_bounds_crescente (&lower, base, &str);
    testa_equacao_dilatacao_crescente (base, &str, lower, &solucao);
    apt_sai = (output_search *) node_allocation (sizeof(output_search));
    copy_win (&apt_Lista_C->win, &apt_sai->C);
    apt_sai->list_base = solucao;
    apt_sai->prox = * sai;
    * sai = apt_sai;
    free_win_by_ron (&apt_Lista_C->win);
    free (apt_Lista_C);
  }

  free_basis_by_ron (&minimo);
  free_win_by_ron (&S);
  free_win_by_ron (&C);
  if (winidx) free (winidx);
  if (str.dat) free (str.dat);
  return 1;
}