#define EL_G(a,i,j,r) ((a)[(i+1)*(r+2)+(j+1)])
#define ITEMSPERLINE 10

#include "util.h"

void print_matrix( FILE * pgm_out, int * m, int x_min, int x_max, int y_min, int y_max, int width )
{
    int i, j;
    int newline = 0;
    for ( i = x_min; i <= x_max; i++ )
    {
        for ( j = y_min; j <= y_max; j++ )
        {
            fprintf( pgm_out,  "%i ", EL(m, i, j, width) );
            newline++;
            if ( newline >= ITEMSPERLINE )
            {
                newline = 0;
                fprintf( pgm_out, "\n" );
            }
        }
    }
}

void pack_array( int *to_array, int *from_array, int chunk_x, int chunk_y, int width, int height, int num )
{
    int i, j, m, n;
    int num_x = width / chunk_x;
    int num_y = height / chunk_y;
    int work_x = num / num_x, work_y = num % num_x;
    int start_i = chunk_y * work_x;
    int end_i = start_i + chunk_y;
    int start_j =  chunk_x * work_y;
    int end_j = start_j + chunk_x;

    for ( i = start_i-1, m=-1; i < end_i+1; i++, m++ )
    {
        for ( j = start_j-1, n=-1; j < end_j+1; j++, n++ )
        {
            EL_G( to_array, m, n, chunk_x) =  EL_G( from_array, i, j, width);
        }
    }
}

void unpack_array( int *to_array, int *from_array, int chunk_x, int chunk_y, int width, int height, int num )
{
    int i, j, k = 0, m, n;
    int num_x = width / chunk_x;
    int num_y = height / chunk_y;
    int work_x = num / num_x, work_y = num % num_x;
    int start_i = chunk_y * work_x;
    int end_i = start_i + chunk_y;
    int start_j =  chunk_x * work_y;
    int end_j = start_j + chunk_x;

    for ( i = start_i, m=0; i < end_i; i++, m++ )
    {
        for ( j = start_j, n=0; j < end_j; j++, n++ )
        {
            EL_G( to_array, i, j, width) = EL(from_array, m,n, chunk_x);
            k++;
        }
    }
}

