diff --git a/plugins/MatrixVisualizer/Common/Zooming.cpp b/plugins/MatrixVisualizer/Common/Zooming.cpp index 3bed8116a181a0d05d1c259125ee563c33a51d56..f46f98397e764b681c1091838facc9ba41206f57 100644 --- a/plugins/MatrixVisualizer/Common/Zooming.cpp +++ b/plugins/MatrixVisualizer/Common/Zooming.cpp @@ -3,17 +3,17 @@ #include "../Helper.hpp" Zooming::Zooming(symbol_matrix_t* matrix) - : m_matrix(matrix) + : m_matrix(matrix) { - // Fill correct colors - move(0.f, 1.f, 0.f, 1.f); + // Fill correct colors + move(0.f, 1.f, 0.f, 1.f); } Zooming::~Zooming() { - // Destroy quadtree - symbol_matrix_deinit(m_matrix); - delete m_matrix; + // Destroy quadtree + symbol_matrix_deinit(m_matrix); + delete m_matrix; } GLfloat Zooming::getColor(int x, int y) @@ -21,88 +21,111 @@ GLfloat Zooming::getColor(int x, int y) return m_colors[x][y]; } +void Zooming::clean_move( double *xbeg, double *xend, + double *ybeg, double *yend ) +{ + double tmp; + + // Cleanup postions + if ( *xbeg > *xend ) { + double tmp = *xend; + *xbeg = *xend; + *xend = tmp; + } + if ( *ybeg > *yend ) { + double tmp = *yend; + *ybeg = *yend; + *yend = tmp; + } + + *xbeg = ( *xbeg < 0. ) ? 0. : *xbeg; + *xend = ( *xend > 1. ) ? 1. : *xend; + *ybeg = ( *ybeg < 0. ) ? 0. : *ybeg; + *yend = ( *yend > 1. ) ? 1. : *yend; +} + void Zooming::move(double xStart, double xEnd, double yStart, double yEnd) { - int i, j, m, n; - - int startCol = xStart * m_matrix->m_colsnbr; - int endCol = xEnd * m_matrix->m_colsnbr; - - int diffCols = endCol - startCol; - - // Find first cblk - int startCblk = 0; - int endCblk = 0; - for (i = 0; i < m_matrix->m_cblknbr; ++i) - { - symbol_cblk_t* cblk = &(m_matrix->m_cblktab[i]); - if (cblk->m_fcolumn <= startCol && cblk->m_lcolnum >= startCol) - startCblk = i; - - if (cblk->m_fcolumn <= endCol && cblk->m_lcolnum >= endCol) - endCblk = i; - } - - int diffCblk = endCblk - startCblk; - - int startRow = yStart * m_matrix->m_rowsnbr; - int endRow = yEnd * m_matrix->m_rowsnbr; - - int diffRow = endRow - startRow; - - symbol_cblk_t* cblks = m_matrix->m_cblktab; - symbol_blok_t* bloks = m_matrix->m_bloktab; - - for (i = 0; i < DEFAULT_LEVEL_POWER_2; ++i) - { - for (j = 0; j < DEFAULT_LEVEL_POWER_2; ++j) - { - m_colors[i][j] = 0.f; - } - } - - float xCoeff = (float)DEFAULT_LEVEL_POWER_2 / ((float)diffCols + 1); - float yCoeff = (float)DEFAULT_LEVEL_POWER_2 / ((float)diffRow + 1); - - for (i = startCblk; i <= endCblk; ++i) - { - int firstBlokNum = cblks[i].m_bloknum; - int nextBlokNum = (i + 1 != m_matrix->m_cblknbr ? cblks[i + 1].m_bloknum : m_matrix->m_bloknbr); - - // Get first block size in col from x to xEnd - symbol_cblk_t* cblk = &(cblks[i]); - int startingCol = (cblk->m_fcolumn < startCol ? startCol : cblk->m_fcolumn); - int endingCol = (cblk->m_lcolnum > endCol ? endCol + 1 : cblk->m_lcolnum); - - int x = (startingCol - startCol) * xCoeff; - int xEnd = (endingCol - startCol) * xCoeff; - - for (j = firstBlokNum; j < nextBlokNum; ++j) - { - symbol_blok_t* blok = &(bloks[j]); - - if (blok->m_frownum >= startRow && blok->m_frownum <= endRow) - { - // Get first block size in row from y to yEnd - int startingRow = (blok->m_frownum < startRow ? startRow : blok->m_frownum); - int endingRow = (blok->m_lrownum > endRow ? endRow + 1 : blok->m_lrownum); - - int y = (startingRow - startRow) * yCoeff; - int yEnd = (endingRow - startRow) * yCoeff; - - m = x; - do - { - n = y; - do - { - m_colors[m][n] = 1.0f; - n++; - } while (n < yEnd); - - m++; - } while (m < xEnd); - } - } - } -} \ No newline at end of file + int i, j, m, n; + + clean_move( &xStart, &xEnd, &yStart, &yEnd ); + + int startCol = xStart * m_matrix->m_colsnbr; + int endCol = xEnd * m_matrix->m_colsnbr; + int startRow = yStart * m_matrix->m_rowsnbr; + int endRow = yEnd * m_matrix->m_rowsnbr; + + int diffCols = endCol - startCol; + int diffRow = endRow - startRow; + + // Find first cblk + int startCblk = 0; + int endCblk = 0; + for (i = 0; i < m_matrix->m_cblknbr; ++i) + { + symbol_cblk_t* cblk = &(m_matrix->m_cblktab[i]); + if (cblk->m_fcolumn <= startCol && cblk->m_lcolnum >= startCol) + startCblk = i; + + if (cblk->m_fcolumn <= endCol && cblk->m_lcolnum >= endCol) + endCblk = i; + } + + int diffCblk = endCblk - startCblk; + + symbol_cblk_t* cblks = m_matrix->m_cblktab; + symbol_blok_t* bloks = m_matrix->m_bloktab; + + for (i = 0; i < DEFAULT_LEVEL_POWER_2; ++i) + { + for (j = 0; j < DEFAULT_LEVEL_POWER_2; ++j) + { + m_colors[i][j] = 0.f; + } + } + + float xCoeff = (float)DEFAULT_LEVEL_POWER_2 / ((float)diffCols + 1); + float yCoeff = (float)DEFAULT_LEVEL_POWER_2 / ((float)diffRow + 1); + + for (i = startCblk; i <= endCblk; ++i) + { + int firstBlokNum = cblks[i].m_bloknum; + int nextBlokNum = (i + 1 != m_matrix->m_cblknbr ? cblks[i + 1].m_bloknum : m_matrix->m_bloknbr); + + // Get first block size in col from x to xEnd + symbol_cblk_t* cblk = &(cblks[i]); + int startingCol = (cblk->m_fcolumn < startCol ? startCol : cblk->m_fcolumn); + int endingCol = (cblk->m_lcolnum > endCol ? endCol + 1 : cblk->m_lcolnum); + + int x = (startingCol - startCol) * xCoeff; + int xEnd = (endingCol - startCol) * xCoeff; + + for (j = firstBlokNum; j < nextBlokNum; ++j) + { + symbol_blok_t* blok = &(bloks[j]); + + if (blok->m_frownum >= startRow && blok->m_frownum <= endRow) + { + // Get first block size in row from y to yEnd + int startingRow = (blok->m_frownum < startRow ? startRow : blok->m_frownum); + int endingRow = (blok->m_lrownum > endRow ? endRow + 1 : blok->m_lrownum); + + int y = (startingRow - startRow) * yCoeff; + int yEnd = (endingRow - startRow) * yCoeff; + + m = x; + do + { + n = y; + do + { + m_colors[m][n] = 1.0f; + n++; + } while (n < yEnd); + + m++; + } while (m < xEnd); + } + } + } +}