Performance Issue probably run out of Ram

It is quite possible but that's not proof either. Being too sure of hunches can have you locked onto false trails when debugging. For Sure Do Try Things Out but don't get stuck on "it must be this". It's never "that" until "that" fixes the code and even then you might have gotten the wrong "that". :grin:
With simple code the answers are easier to be sure of though.

-- You could try making a smaller version of your project to check the logic.

-- I notice that you make and fill that drawLeds array then have lightUpLeds() do the whole picture in one go, making yet another local array to do it. You could achieve major RAM savings by shrinking that to process 1 line at a time or even 1 led at a time. Do you really -need- to have everything in data at once? Does every led depend on every other led to determine ON or OFF?

I don't want to work out the what, how and why of lightUpLeds()... it's taking long enough to post this! If you can write it, you can trim it.

======================== some day, maybe now you will want to know what's below ====

-- You could try shifting the const arrays to PROGMEM (have to be compiled into flash, can't put them in at run-time) and copy an element at a time into RAM to process.

Here is a link to the AVR Libc modules page, it's the home of the C++ Arduino is based on:
http://www.nongnu.org/avr-libc/user-manual/modules.html
I have this and other pages bookmarked, couldn't get far without them.

Here is the Program Space module with PROGMEM access functions, etc, spelled out:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

You see it takes special functions and pointers to store and read constants in flash.
You can easily fit your const tables, bytesX and bytesY into PROGMEM. You will need to change how you use the data, a good bit of change for a beginner but you should learn as much too.

You need some #includes to use PROGMEM:

#include <avr/io.h>
#include <avr/pgmspace.h>

Here I have a 7 line menu (80 characters per line) stored to PROGMEM, and a special pointer to get the data with:

const char PROGMEM usageMsg[][80] = { // all this text stored in flash
  "          Piezo touch sensor tuner.",
  "Adjust vertical; enter W to subtract or X to add, and a number 0-255",
  "Adjust timescaler; enter A to subtract or D to add, and 0-16535",
  "to add 250 to vertical enter W250 in Serial Monitor and press enter",
  "seperate multiple commands with spaces; ex: W25 D240",
  "    ** this message stored in flash ram **",
  "    ** and printed with a 1 byte buffer ** :-P"
};

PGM_P Msg; // pointer into flash memory

The full program stores -every- const char string (not C++ String!) in PROGMEM. It has serial user I/O error messages, etc, as well as the menu.

I made this function to print the stored strings one char at a time:

void  printMsg( PGM_P FM )
{
  do 
  {
    B = pgm_read_byte( FM++ );    // FM++ is pointer math; look Ma, no indexes!
    if ( B )  Serial.print( B );
  }
  while ( B ); // when it reaches the terminating zero, it exits
}

And this function just to print the whole menu:

void printHelp(void)
{
  for ( byte i = 0; i < HELPLINES; i++ )
  {
    printMsg( usageMsg[ i ]);
    Serial.println();
  }
  Serial.println();
}