diff --git a/tests/visual_tests/grids/lines-multi-layout-1-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-200-200-1.0-grid-reference.json
new file mode 100644
index 000000000..9ef7834cf
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-1-200-200-1.0-grid-reference.json
@@ -0,0 +1,74 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "6",
+ "16",
+ "12",
+ "10",
+ "2",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " !! ! ",
+ " !!!!! !!!! !!! ",
+ " !!!!!!!! !!!!!!! !!!!!! !!! ",
+ " !!!!!!!!!! !!!!!!!!! !!!!!!!! !!!! ",
+ " !!!! !!!!! !!!!! !!!!!!!!!!!!!!!!!!!!! ",
+ " !! # !!!!!!!!! # !!!!!!!!! !!!!!!!! ",
+ " #### !!!!!!! ### !!!!! ## !!!!!! ",
+ " ###### !!! ###### !!! ##### !! ## $$$ ",
+ " ########## ! ######### ######## ####$$$ ",
+ " #### ##### ############ ###############$$$ ",
+ " %%%## ########## ######### &##### $$$ ",
+ " %%%%% ####### & & #&&##&& &### $$$ ",
+ " %%%%%&&&& #####& &&&&&&&&& &&&& $$$ ",
+ " %%%&&&&&&& #&&&&&&&&&&& &&&&&&& $$$ ",
+ " %%&%&&&&&&&&&&&''&&&&&&&&&&&&&&&&&&&&& $$$ ",
+ " %%%%&& &&&&&&&&'&''''&& &&&&&&& &&&&&& $$$ ",
+ "%% %%%%% &&&&& &&'''& ' &&&&& & &&&&& ((($$ ",
+ " % %%% &&& '' ''&& ' '' & && ((((((($$ ",
+ " %%%%%''' ''''''' '''' && '&&'' ((((((($$ ",
+ "% %%%''''''' ''''''' ''''&&'&&&&&&&&&((((((($$ ",
+ "%% %%%'%''''''''''''''''''''&''&''&''&&&&' $$$ ",
+ "%% %%%%%'' '''''''' ''''''' ''''''' ''''' $$$ ",
+ " % %%%%%' ''''' ''))'''''''''''*''******** $$$ ",
+ "%% %%% % ''''+')'',''-'-''-'''*'********* $$$ ",
+ " % %%%% % +++++' )'),'''---'--''**.*********$$$ ",
+ " %%%%% +++++ ))),,,--------.... ****$$$ ",
+ "%%% %%%% +++++/// ))),.............. ***$$$ ",
+ " % %%% %++++//////)),,.............. ***$$$ ",
+ "% %%%%%++////////)),,.,... ..0000000 ***$$$ ",
+ "%% %%%+++//////////),,,........0000000 ***$$$ ",
+ " %%%%%+//// //,......... 0000000*******$$$ ",
+ " %%%% /// ///....... .*************$$$ ",
+ " %%%%% /// /// ....... ..*********** $$$ ",
+ " %%% % /// ///.............. *** $$$ ",
+ " %%% //// /// ............. $$$ ",
+ " %%% //// //// ............. $$$ ",
+ " ///// ////// ..... .. ....111 ",
+ " /////////// ..1.111..1.111 ",
+ " //////// 1111111111111 ",
+ " ///// 1111111111111 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-1-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-400-400-1.0-grid-reference.json
new file mode 100644
index 000000000..535c244f7
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-1-400-400-1.0-grid-reference.json
@@ -0,0 +1,124 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "6",
+ "16",
+ "2",
+ "10",
+ "12",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ! !! !!! ",
+ " !!!!!!!! !!! ",
+ " !!!!!!!! ! !! !!!!!! !!! ",
+ " !!!!!!!!!!!! ! !!!!!!!!!! !!!!! !! ",
+ " ! !!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!! !!! ",
+ " !!!!!! !!!!!! !!!!!! !!!!!!!! !!!!!!!!!!! !!!!! ",
+ " !!!!!! !!!!!!!!! !!!!!! !!!!!! ! !!!!!! !!!!!! !!!!!! ",
+ " !!!!! ! ! !!!!!!! !!!!!! !!!!!!!!! !!!!!! !!!!! !!!!! ",
+ " !!!! !!! ! !!!!!! !!!!!! !!!!!!!!! !!!!! # !!!!! !!!!!! ",
+ " ! !! !!!!!! !!!!!! ! ! !!!!!!!!!!! ## !!!!!!!!!!! ",
+ " !! ! !!!!!!!!! ## ! ! ! !!!!!!!!! #### !!!!!!! ",
+ " # !!! !!!!!!! ## ### ! ! ! !!!!!! ## # !!!!! ",
+ " #### !!! !!!!! ### #### !! !!! ## # # # !!! $$$ ",
+ " ####### !!! ! ### ######## !! ! #### # $$$ ",
+ " ########## ! ! ## ########### !!! ######## ### $$$ ",
+ " ####### ##### !! ######## ##### !!!! ######### # ##### $$$$ ",
+ " ###### ###### ######### ###### !! ###### ##### ## ##### $$$$ ",
+ " ##### ###### ####### ######### ############### # ###### $$$$ ",
+ " %%%%#### ##### ####### # ###### ##### ############ ###### $$$$ ",
+ " %%%% # ##### ##### ## ## ##### ###### # ############## $$$ ",
+ " %%%% ############## # ############ # ########### $$$ $",
+ " %%%% ############ ## ######## ######### # $$$ $$",
+ " %%%% ######### #### ####### $$$$ $$",
+ " %%%% &&& & ####### & && ## && ###### $$$$ $ $",
+ " %%%% &&&&&&&&& ####&&& & & &&&&&&&& &&&&&&& # $$$$ $ $",
+ " %%%% &&&&&&&&& & &&&&&&&& & & &&&&&&&&&& &&&&&&&&&& $$$$$$ $",
+ " %%%% &&&&&&&&&& & &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&& $$$$$$ ",
+ " %%%% &&&&&&&&&&&&&& &&&&&& &&&&&&&&&&&&&&&& &&&& &&&&&& &&&& & $$$$ $$",
+ " %%%% &&&&& &&&&& &&&&&&& &&&&& &&&&&& & &&&& &&&&& &&&&&&&&& $$$$$$$ ",
+ " %%%% &&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$$$ $ ",
+ " %%%% & &&&&&&&&&& &&&&&&&&&& &&&& &&&&&&&& &&&&&& $$$ $$$",
+ " %%%% &&&&&&&& &&&&&& & & &&&&& &&&& $$$ $ ",
+ " %%%%% & &&&&& & & & && '' ((((($$$$ $",
+ " %%%% &&& & &&&&&&& &&& &&& ''''' ((((( $$$ $",
+ " %%%%% & & && & && '''' ((((($$$$ ",
+ " %%%%% &&&&& ''' ' ' ' '''' ' ((((((((((((( $$$ ",
+ " %%%%% '' ''''' '''' ' '' ''''' ' ''''''''' (((((((((((($$$$$ ",
+ " % %%%%% ''''''' ''''''''' '''''''''' ' '''''''''' ((((((((((((( $$$ ",
+ " % %%%%% ''''''''' '''''''''' ' '''''''''''' '''''''''''' $$$ ",
+ " % %%%%% ''''''''''' '''''' '''' ''''''''' '''''' ''''''''''''' $$$ ",
+ " %%%%%%%'''''' ''''' '''''' '''' '''''''''' ''''' '''''' ''''''' '' $$$ ",
+ " % %%%%%''' ''''' ''''' ''''''''''''' '''''''''''' ' ''''''''''' $$$ ",
+ " %%%%%% ' ''''''''') '''''''''''' ' ''''''''''' '''''''''' $$$ ",
+ " %%%%%%% ''''''')) ''''''''''' '''''' *** ''''''' ** $$$ ",
+ " %%%%%% '''' )))) +++''' '' '' ' ''*********'**''''***** $$$$ ",
+ " % %%%%%% ) ) )))))) ++++ ',,' ' ********************** $$$$ ",
+ " % %%%%%% ) ))))))))))) +++ ,,, --------------- ********************* $$$$ ",
+ " % %%%%%% )) ) )))))))) +++ ,,, --------------- ***** * $$$$ ",
+ " % %%%% ))) )))))) ) +++ ,,, ----.-.--...... . . ****** $$$ ",
+ " %% %%%% )) ) )))))) +++ ,,, ... ................. ** ***** $$$ $$",
+ " % %%%% ) )) ))))) )) ++++ ,,, ....................... ** ** ******* $$$ $$",
+ " %%% ))))))) ++++ ,,,, ........................ ** *** $$$$ $$",
+ " %%%% ) ))))))) +++ ,,,, ....................... ** ***** $$$$ $ $",
+ " %%%% )))))))))) /////// +++ ,,, .... . ... . ** ***** $$$$ $ $",
+ " %%%% ))))))))) //////////// +++ ,,, ... . . . ** **** $$$$$$$$",
+ " %%%% ))))) ///////////////+++ ,,, ... .. . ... .. * **** $$$$$$ ",
+ " %%% )))))) ) ////// ///////++++,,, ... .. .. . 000000000000000 * **** $$$$ $$",
+ " %%%))))))) ) ///// ///+++,,,, ... 000000000000000 **** $$$$$$$$ ",
+ " %%% )))))) ///// //// ,,,, ... 000000000000000 *****$$$$$$ ",
+ " %%% ))))) ///// ////,,,, ...... *** * $$$ $$$",
+ " %%% ) //// /////,, ...... **** ****** $$$ $ ",
+ " %%% /// //// ......... ************************ $$$$ $",
+ " %%% /// /// ...... .. . ********************** $$$ $",
+ " %%% /// /// ..... . . ********************* $$$$ ",
+ " %%% /// /// ..... . $$$ ",
+ " %%% //// /// ........... . $$$$$ ",
+ " %%% //// /// ........................ $ $$$ ",
+ " %%% //// //// ....................... $$$ ",
+ " %%% //// //// ....................... $$$ ",
+ " %%% //// /// ............1..1.1.. $$$ ",
+ " //// //// . .. .... 11111 $$$ ",
+ " //// ////// ",
+ " //// ////// 1111 11 111111 ",
+ " ////////// ///// 11111111111111111111 ",
+ " ////////////// 11111111111111111111111111 ",
+ " //////////// 11111111111111111111111111 ",
+ " //// 1111111111111111111111 ",
+ " 111 1 11 111 11 111 ",
+ " 111 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-1-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-600-600-1.0-grid-reference.json
new file mode 100644
index 000000000..c8cb95950
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-1-600-600-1.0-grid-reference.json
@@ -0,0 +1,174 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "16",
+ "6",
+ "2",
+ "12",
+ "10",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!! ",
+ " !!!! ! !!! ! ",
+ " !!!!!!!! !!!!! ! ! ! ",
+ " !!!!!!!!!!! !! !!!!!! !!!!!! ",
+ " ! !!!!!!!!!!!! ! !!!!!!! ! ! !!!!! ! ",
+ " !!!!!!!!!! !!!!! !!!!!!!!!! ! !!!!!!!!!! ! !! ",
+ " ! !!!!!! ! !!!!! !!!!! !!!!!!! !!!!!!!!!!!! !!!!!! ",
+ " !!!!!!!!!! !!!!!! ! ! !!!!!! !!!!!!! !!!!!!!! !!!!! ! !!!!!!!! ",
+ " ! !!!!!! ! !!! !!!!! ! !!!!!!! !!!!!! ! !!!!!!!! ! !!!!!!!! ! !!!!! ",
+ " !!!!!!! ! !! ! !!!!!!! !!!!!!!! ! !!!!! ! ! !!!!!!!! !!!!!!!! !!!!!!! ",
+ " !!!!!! !!! ! !!!!!!!! ! !!!!!! !!!!!!!!! ! !!!!!!!! !!! !!!!! ! !!!!!!!! ",
+ " !!!!! ! !! !!!!!!! !!!!!!! !!! !!!!!!! !!!!!!!! ! ! ! !!! !!!!!!!! !!!!!!! ",
+ " !!! ! !!!!! !!!!!! !!!!!!! !!!!!!!! ! !!! !! !!!!!! !!!!!!!!! ",
+ " !!!!!!! ! !!!!!! # ! ! !!!!!! !!!!!! ! ! !!!!!!!!!!!!!! ! ",
+ " # !!!!! !!!!!! ### ! !!!!!! !!!!! ! ! !!!!!!!!!!!! !!! ",
+ " # # !!!!!!!!!!! ##### ! !!!!!!!!! !!!!!!!!!! !!! ",
+ " ### ## !!!!!!!! ! !!! # # # # ! ! !!!!!! !!!!!!!! !!! ",
+ " ## # ## # !!!!!!! !! ### # !!! !!!! !! ! !!! ",
+ " # ######### !!!!! !!! #### # !! ! # # !!!!! $$$$ ",
+ " # ######## !!! !!! ######## ### ##### !! ! $$$$ ",
+ " # ########## !!!! ########### ### ####### !! ## $$$$ ",
+ " ####### ####### !!! ! ###### ######## ### ######### ! #### $$$$$ ",
+ " ################ ###### ######### #### ############ # ###### $$$$$ ",
+ " ####### # ####### ########## ####### # ######## ##### # # # # ###### $$$$$ ",
+ " ######## # ######## ###### ###### # ######## ####### ##### # ###### $$$$$ ",
+ " ######## ######### ##### ####### ########## ## ##### # #### ########### $$$$ ",
+ " ######## ####### ###### ######## ########## ####### ########## $$$$$ $ ",
+ " %%% ### ####### ###### ######### ####### # ####### ######### $$$$$ $ ",
+ " %%% # ######## ###### # ##### ######## ############### $$$$ $$ ",
+ " %%% # ###### ###### ####### ####### ########### # $$$$$$ ",
+ " %%% ##### ##### ###### ######## ########## # $$$$$$ ",
+ " %%% ########### ############## ######## # $$$$$ $ ",
+ " %%% ######### ## ######### ####### $$$$$$ $ ",
+ " %%% ###### ## ##### # # # $$$$$$ $ ",
+ " %%% ### ## # && && ## $$$$$$ $ ",
+ " %%% &&& & && & &&& &&&& &&& &&&&&& $$$$$$ ",
+ " %%%%% &&& &&& && & &&&&&& & &&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
+ " %%% & &&&&&&&& & &&&&&&&&&&&& &&&&&&&&&&&&&& & &&&&&&&&&&&&& $$$$$ $$ ",
+ " %%%% & &&&&&&&&&&& & &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$ ",
+ " % %%%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&& &&&&&&& &&&&&& &&&&& & $$$$$ ",
+ " %% %%%% &&&&&& &&&& &&&&&& & &&&& &&&&&& &&&&&& & &&&&& &&&&&& $$$$$ ",
+ " %% %%% &&&&& &&&&&&&& &&&&& &&&&&&&& &&&&& &&&&&&& &&&&& & &&&&&&&& & $$$$$ ",
+ " %%%%%%% &&&&& & &&&&&& &&&&& && & &&&&& &&&&& &&&&&&&&&& &&&&&& && & &&&&&& &&&& $$$$$ ",
+ " %%%%%% &&& && &&&&&&&& &&&&&& & &&&&& &&&&&& &&&&&&&&&&&&&& & &&&&&&&&&&&&& $$$$$ ",
+ " %%%%%%%% & & &&&&&&&&&&&&& && &&&&&&&&&&& && &&&&&&&&&& & &&&&&&&&&& $$$$ ",
+ " %%% & &&&&&&&&&&& & &&&&&&&&& && & &&&&&&&& &&& &&&&&& $$$$ ",
+ " % %%%%%% && & &&&&&&& & &&&&&& && &&& &&& & $$$$ ",
+ " %%%%%%% & & && & &&& &&& $$$$ ",
+ " %%% %%%% & & && &&&&& &&& '''''' $$$$ ",
+ " %% %%%% && && & &&&& && '''''' $$$$ ",
+ " % %%%% &&&& ( ( ( && (((((( & ((( (( '''''' $$$$$ ",
+ " %% %%%% (((((((( ((((((( (( (( (( (((( '''''' $$$$$ ",
+ " %% %%% ((( (( ( ( ( ( ( ( ''''''''''''''''''' $$$$$ ",
+ " %%% % ((( ( ( ( (( ( ((( ((( ( ( ''''''''''''''''''' $$$$$ ",
+ " %%%%% ( ( ( (( ((((( (((((((( ((((((( ( ''''''''''''''''''' $$$$ ",
+ " %%%% ((((((( ((((((((((( ((((((((( ( (((((((((((( $$$$$ $ ",
+ " %%%% (((((((((((( ((((((((((((( (((((((((((( ((((((((((((((( $$$$$ $ ",
+ " %%%% ((((((((((((((( (((((((((((((( ((((((((((((((( ((((((((( (((((( $$$$ $$ ",
+ " %%% (((((((((((((((( (((((( ( (((((((( ((((( ( ( (((( ((((((((((( ((((( $$$$$$ ",
+ " %%% ((((( ( ((( (((( (((((((((( ( ((((( (((((( (( (((((( (((((( ( (( (((( ( $$$$$$ ",
+ " %%% (((((( ( (((((( ((((( (( ((((( ((((( ( (((((( (((((( ( ( ((((( ((( $$$$$ $ ",
+ " %%% (((( ( (((((( ((((( (((((( ((((( ((((((( (((((( (((((((((((((( $$$$$$ $ ",
+ " %%% (( (((((((( (((((( (((((((((((((( ((((((((((((( ((((((((((( $$$$$$ $ ",
+ " %%% (((((((((((( (((((((((((( (((((((((( ((((((((( $$$$$$ $ ",
+ " %%% (((((((((( )) ( (((((( (((((((( (((((((( $$$$$$ ",
+ " %%% ((((((((( )))) *** (((((( ( ((( +++++++ ( (((( $$$$$$ ",
+ " %%% ( (((( ))))) **** ( (((( ( +++++++++++++++++++++++++++ $$$$$ $$ ",
+ " %%% )))))) **** ,,,, +++++++++++++++++++++++++++++ $$$$$ ",
+ " %%% ))))) *** ,,,,,, -- +++++++++++++++++++++++++++++ $$$$$ ",
+ " %%% ))))) *** ,,,,, ---------------------- +++++++++ ++ $$$$$ ",
+ " %%% ) ) )))))) *** ,,,,, ---------------------- +++++++ $$$$$ ",
+ " %%% ) ) ))))))) ) *** ,,,, ---------------------- ++++++ $$$$$ ",
+ " %%% )) ) )))))))) **** ,,,,, ++++++ $$$$$ ",
+ " %%% % ))) )))))))) **** ,,,, , ........ ......... ... ++++ $$$ ",
+ " %%%% )) ))))))) **** ,,,,,,,,, .......................... ++++ $$$ ",
+ " %%%% ) ) )))))) )) *** ,,,,, ................................ ++++++ $$$ ",
+ " %%%%% ) )))))))) ***,, ,,,,,, . ................................ ++++++ $$$ ",
+ " %%%% ) )))))))) ***,, ,,,, , ........................ +++++ $$$ ",
+ " %% %%%%% )))))))))) ***,,,,,,,,, ..... ........ +++++++ $$$ ",
+ " %% %%% ))))))))) //// ***,, ,,,, , ...... ... . .. ++ ++++++ $$$$ ",
+ " %%%% ))))) ) /////////// ***, ,,,,,,, ... .. . . ...... ++ +++++ $$$$ ",
+ " % %%%%% ))))))) ) ///////////////// *,, ,,,,,,, .... + +++++ $$$$ ",
+ " %% %%%%% ))))))) //////////////////// *** ,,,,, . ... ++++++ + $$$$ ",
+ " % %%%%% )))))))) ////// //////// *** ,,,, .... .. + + +++++ $$$ ",
+ " %% %%%% ))))))))) ///// //// *** ,,,, , ..... . 00000000000000000000000 ++ ++++ $$$$ $ ",
+ " %% %%% )))))) ) ////// ////*** ,,,, ........ 00000000000000000000000 + +++++ $$$$ $ ",
+ " % %%%% ))))) ////// ///// ,,,,, ...... 00000000000000000000000 ++ +++++ $$$ $$ ",
+ " %% %%%% ))) ///// //// ,,, , ...... ++++++ ++++++ $$$$$$ ",
+ " %% %%%% )) //// //// ,,,,,, ...... . ++ +++ ++++++ $$$$$$ ",
+ " %% %%%% /// //// ,,,, .... . + + + ++++++ $$$$$ $ ",
+ " % %%% //// ///// ..... . ++ + + ++++++ +++++ $$$$$$ $ ",
+ " %%% % //// //// ...... . ++++++++++++++++++++++++++++++++++++ $$$$$$ $ ",
+ " %%%%% /// / /// ....... +++++++++++++++++++++++++++++++++ $$$$$$ $ ",
+ " %%%% /// //// ..... +++++++++++++++++++++++++++++++++ $$$ $$ ",
+ " %%% /// / /// ..... ... ++++++++ +++++++++++ $$$$$$ ",
+ " %%%% /// / /// .... . . ++++++ + +++ ++++ +++ $$$$ $$ ",
+ " %%% /// / /// ..... ..... $$$$ ",
+ " %%% //// /// /// ...... . . .... $$$$ ",
+ " %%% //// / /// . ..... . ....... $$$$ ",
+ " %%% /// / ////// ...... .. .... . . $$$$ ",
+ " %%% //// / ///// ............................... $$$$ ",
+ " %%% //// ///// .............................. $$$$ ",
+ " %%% //// //// / ............................ $$$ ",
+ " %%% //// / //// ... .. . ... .... ... $$$ ",
+ " //// / ////// ... .... .. . .. .. . $$$ ",
+ " //// //////// ",
+ " //// / //////// 111 1 ",
+ " //// ///////// 1 11 11 ",
+ " ///// / ////// // ",
+ " //////// /////// // 11 1111 11 1 ",
+ " ///////////// ////// / 11111111111111111111111111111111111111 ",
+ " ////////////////// / 11111111111111111111111111111111111111 ",
+ " /////////////// 11111111111111111111111111111111111111 ",
+ " //// / 111111111111111 11 11 1111 ",
+ " // 111 11 1 111 11 1 111 ",
+ " / ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json
new file mode 100644
index 000000000..662b25300
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json
@@ -0,0 +1,224 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "16",
+ "6",
+ "2",
+ "10",
+ "12",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!! ",
+ " !!!!! !! ! ",
+ " !!!!!!!!!! !!!!! !! ",
+ " !!!!!!!!!!!!!! !!!!! ! !!!!!! ",
+ " !!!!!!! !!!!!!! !!!!!!! !! ! !!!!!!! ",
+ " ! !!!!!! !!!!!! !!!!!!!!!!!!!!! !!!!!!!!!! ! ! ",
+ " ! !!!!!! !!!!! ! !!!!!!!!! !!!!!!! !!!!!!!!!!!! !!!!! ",
+ " ! !!!!!!!! ! !!!!! ! !!!!!!! !!!!! ! !!!!!!! !!!!!!!! !!!!!!!! ",
+ " ! !!!!!! !!!!!! !!!!!!! ! !!!!!! !!!!!!! !!!!!!!! !!!!! ! !!!!! ",
+ " !!!!!!!!!!! !!! !!!!!!! ! !!!!! !!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
+ " !!!!!!!!!!! !!! !!!!!!!! !!!!!!!! !!!!! ! ! !!!!! !!!!!! ! !!!!!!!! ",
+ " !!!!!!!!! !!! !!!!!!! !!!!!!!! !!!!!!! ! ! !!!!!!! !!!!!!!!!! !!!!!!! ",
+ " !!!!!! !! !!!!!!! !!!!!!!! ! !!!!!!!!!! !!!!!!!! !!!!!!!!! !!!!!!! ",
+ " !!!!! ! ! !!!!!! ! !!!!!!! !! !! !!!!!! !!!!!!! !!! ! !!!!!! !! !!!!!! ! ",
+ " !!!! !!! !!!!!!!!! ! !!!!!!! !!!! !! !!!!!!! ! !!!!!! ! !!! !!!!!! ! !!!!!! ! ! ",
+ " ! !!!!!!!!! !!!!!!!!! !! !!!!! !!!!!! ! !!!!!!!! !! ! !!!!!! ! !!!!!! ! !!! ",
+ " !!!!!!!!!!! !!!!!!!! ! !!! !!!!!!!! !!!!!!!!!! !! ! !!!!! !!! !!!!!!!! !!! ",
+ " !! !!!!!!! !!!!!!!!!! ! !! !!!!!!!!!!!!!!!! !!! !!! !!!!!!!!!!!!! ! ! ! ",
+ " ! ! !!!!! !!!!!! ! !!!!!!!!!!!!! ! ! !! !!!!!!!!!!! !!!!! ",
+ " !!! !!!!!!!!!!! ! ! # ! ! !!!!!!!!!! ! !! !!! !!!!!!!! ! ! ",
+ " ! !!!!!!!!! ! # # !! !!!!!!! !! ! ## !! !!!!! ! ",
+ " # ! !!!!!! !! ## !!!! !! #### ! !!! ",
+ " # # ##### !! !!! ### #### !! !! # ## $$$ ",
+ " # # ####### !!! ! ###### #### !! ## # # # $$$ ",
+ " ### ########## !! ####### # # ### # $$$ ",
+ " ### # ########### # ########## ##### # $$$$ ",
+ " ################# # ############# ######## # ### $$$$ ",
+ " # ########## ###### ## ##### ######## ########## ## ##### $$$$$ ",
+ " # ######### ######## # #### # ## ###### # ######## ############### # ##### $$$$$ ",
+ " ###### ## ######### ## # ########## ########## ################ # # # ######## $$$ ",
+ " ######### # ####### ## # ######## ######## ###### # ######## ## # ####### $ $$$ $$ ",
+ " ####### # ######## ### # ######### ## ##### ##### # ###### ### # ######## $$$ $$$ ",
+ " ######## # ######## ## # ##### ######## # # ##### ######### ## ######### # $$$$$ $$ ",
+ " ####### ######## # ######### # ##### ### ######### ####### # ######## ## $$$$$ $$ ",
+ " ###### # ######## # ######### # ###### ### ####### ## ###### ######### $$$$ $$ ",
+ " %%% ## # ########## ######## ######### #### ####### # # ###### # ######### $$$$$$ $$ ",
+ " %%% ######### ######### ######## # ######### ## ##### ####### # $$$$$$ $ ",
+ " %%% ## ###### ######### ## ##### ######## # # ###### ######### $$$$$$$ ",
+ " %%% ## ##### ####### # ###### ## ###### # ############# # $$$$$ $ ",
+ " %%% # ###### ####### # ######### # ###### # ## ######## # $$$$$$$ $ ",
+ " %%%%% ######### ####### ############# # ###### $ $$$ $ ",
+ " %%%%% ################ # ########### ##### $ $$$ $ ",
+ " %%%% ## ######## # ####### ## $$$$ $ ",
+ " %%%% ######## # ######## $ $$$ $ ",
+ " %%%% #### #### # $$$$$ ",
+ " %% %%%%% ### & #### & &&& $ $$$ ",
+ " % %%% &&& &&& &&&& & &&&&&&&& $$$$$ ",
+ " %%%%% && &&& && & &&&&&& & & &&&&&&&&&&& && &&&&&&&&&& & $$$ ",
+ " % %%% &&&&&&&&&&&& &&&&&&&&&&&& & &&&&&&&&&&&&& &&&&&&&&&&&&&&&& & $$$ ",
+ " %% %%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& & &&&&&&&& &&&&&& $$$ ",
+ " %% %%%%% & &&&&&&&&&&&&&& & &&&&&&& &&&&&& & &&&&&&&&&& &&&&&& &&&&&&&& &&&&& $$$$ ",
+ " % %%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&& &&&&&& & &&&&&&& & &&&&& &&&&&&& &&&&&& $$$$ ",
+ " %% %%% &&&&&&&& &&& && &&&& & &&&&&& &&&&& &&&&&& & & &&&&& &&&&&&& &&&& & $$$$ ",
+ " % %%%% &&&&&& & && &&&&& & &&&&& &&&&&& &&&&&& & &&& &&&& & &&&&&&& &&&& $$$$ ",
+ " % %%%%% &&&&& &&&&& &&&& &&&&&&& &&&&&& &&&&& && & &&&& & &&&&&&&& & &&&&& & && $$$$ ",
+ " %% %%%% &&&&& & & && &&&& & &&&&&&&& &&& &&&&&& & &&&&& && &&&&&&& && &&&&&&&& &&& &&&&&& &&&&&&&& $$$$$ ",
+ " %% %%%% &&& & & &&&&&& & &&&&&& &&&& &&&& & &&&&&&&& &&&&&&&& &&&&&&&& &&& &&&&&&&&&&&&&&& $$$$$ ",
+ " %% %%%% & && &&&&& & &&&&&&& && &&&&&& &&&&&& && &&&&&&&&&&&&&&& & &&&&&&&&&&&&& $$$$$ ",
+ " %% %%% && &&&&&&&&&&&&&&& &&& &&&&&&&&&&&&& & &&&&&&&&&& && &&& &&&&&&&&&& $$$$ ",
+ " %%%%% && &&&&&&&&&&&&& &&& & &&&&&&&&&& &&&&&& & & & &&&&&&& $$$$$ $ ",
+ " %%%% &&&&&&& &&&& && & &&&& & && & & & $$$$ $$ ",
+ " %%%% && && & && && & && & $$$$$ $ ",
+ " %%% && && & & & &&&&& & ' $$$$$ $ ",
+ " %%% & &&&&&&&& && $$$$ $ ",
+ " %%% && ' '''''''''' $$$$$$ $ ",
+ " %%% '''''''''' $$$$$$ ",
+ " %%% '''''''' $$$$$$$ ",
+ " %%% ( ( '''' '' '' ' ' '''' $$$$$ ",
+ " %%% ( ((( ( ''''''''''''''''''''''''''' $$$$$$$ ",
+ " %%% ((( (( ((((( (( ''''''''''''''''''''''''''' $$$$$ $ ",
+ " %%% ((((( ((( (( (( (((( (( ( ((( ''''''''''''''''''''''''' ' $$$$$ $ ",
+ " %%% ( ( ((((((( ((( (((((((((( (((((((((( ( '''''''''''''''''''''''''' $$$$$ $ ",
+ " %%% ( (((((((( (((((((( ((( ( ( ((((((((((( (((((((((((( ((( ( ''''' '' $$$$$ $ ",
+ " %%% (((((((((((( (((((((((((( (( ((((((((((((((( ( (((((((((((((( ( ( $$$$$ ",
+ " %%%%% (((((((((((((( ( ( ((((((((((((((( ( (((((((((( ((((( ( (((((((( (((((( $$$$$ ",
+ " %%%%% (((((((( (((((( (((( ( ((((((( (((( (( ((((((( ((( ((((( ( ( ( ((((((((( (((((( $$$$$ ",
+ " %%% (((((((((( (( (((( (( ((((((( ( ( ((((( ((((((((( (( (((( (((( ((((((( ((( (((((((( $$$$ ",
+ " %%%%% ((((((( ( (((( ( ( ((((((( (( (((((((( (((((((( ((((((( ( ( ((((((( ( ((((((( $$$$ ",
+ " %%%%% ((((( ( ( (((( ( (( ((((((( (((((((( ((((((((( ( (((( (( (((((((((( ((((((((( (( $$$$ ",
+ " % %%%%% (((((((( (( (((( ( ((((((( (( (((((((( (((((( ( ((((( (((((( (( (((((((( (((( $$$$ ",
+ " %% %%% % (((( ( (((( (( ((((((( (((((((( ((((( ( (((((( (( ((((((((( (( ((((( (((((( $$$$ ",
+ " %%%%% (( ( ( ((((( (( ((((((( ((((((( (((((( (((((((((((((((( ( ((((((((((((( $$$$ ",
+ " % %%%%% ( (((((((((((((((( ( ((((((((((((( (((((((((((((((( ((((((((((((( $$$$ ",
+ " % %%%%% (((((((((((((( (((((((((((((( ((((((((( ( ((((((((((( ( $$$$$ ",
+ " % %%%%%% (((((((( ( )) (((((((((( (( (((((((( * (((( (( $$$$$ ",
+ " % %%%%%% (((((( ( )))) +++ ((((((( ( ((((( ******** ** * * (( ( $$$$$ ",
+ " % %%%%% ( ( ))))) +++++ ((( (( ************** **** *** * $$$$$ ",
+ " %%%%%% ( )))))) +++++ ******************************** *** $$$$ ",
+ " %%%%%% )))))) +++++ ,,, **************************************** $$$$$ $ ",
+ " %% %%%% ))))) +++++ ,,, ************************************ $$$$ $$ ",
+ " % %%%%% )))))) ++++ ,,,,, ------ * **** *************** $$$$$ $ ",
+ " % %%%%% )))))) +++++ ,,,,, ----------------------------- ** * * ******** $$$$$$ $ ",
+ " %%%% ))))) ++ +++ ,,,,, ----------------------------- * **** ** * * * ******* $$$$$ $ ",
+ " %%%%% )))))) + +++++ ,,,,, ----------------------------- **** * * ******* $$$$$$ $ ",
+ " %%%%% ) ) )))))) +++++ ,,,, **** ******* $$$$$$ ",
+ " %%%%% ) ) )))))) ) +++++++ ,,,,,, ** ******* $$$$$$$ ",
+ " %%%%% ))) )))))))))) + ++++++ ,, ,,,,, .. .. * ******* $$$$$$ ",
+ " %%%% ))) )))))))))) + + ++++ ,,,,,,, .. . ... .. ... .. .... ** * **** $$$$$$$ ",
+ " %%%% ) )) ))))))) ++ ++++ ,, ,,,,,, .... ..................................... * **** $$$$$ $ ",
+ " %%%% ) ) )))))) )) ++ ++++ , ,,,,, ........................................... ** *** $$$$$ $ ",
+ " %%%% )) )))))))) +++++ ,, ,,,, , ............................................ *** * $$$$$ $ ",
+ " %%%% ) )))))))) +++++ , ,,,, , ................. ... . ***** $$$$$ $ ",
+ " %%%% )))))))))) + ++++ ,,,,,,,, ....... ... **** $$$$$ ",
+ " %%%% ))))))))) // + ++++ ,, ,,,, ...... .. . .. . . ..... **** $$$$$ ",
+ " %%%% )))))) ) //// ++ +++ + ,,,, . ... . ..... ... . . ..... **** $$$$$ ",
+ " %%%% ))))))) ) ///////// / / + +++++ ,,,,,, . .... .. .... *** $$$$ ",
+ " %%%% ))))))) ///////////////// / // +++++ ,,,,,, ...... .. *** $$$$ ",
+ " %%%% )))))))) //////////////////////// +++++ ,,,, ..... . 0 000000 *** $$$$ ",
+ " %%%%% )))))) )) //////// //////////////// +++++ ,,,,, .... 00000 00 *** $$$$ ",
+ " %%%%% )))))) )) /////// /////////// +++ ,,,,, .... .. 0 0 0 **** $$$$ ",
+ " %%%%% ))))) / ///// / // / ///// +++ ,,,,, .... .. 0 0000 0 00 ***** $$$$ ",
+ " %%%%% )))))) //////// / /// / /////////+++ ,,,, . ... 00000000000000000000000000000 ***** $$$$ ",
+ " %%%%% )))))) / //////// /// // // ///////+++ ,,,,, ... 00000000000000000000000000000 *** * $$$$$ ",
+ " %%%%% ))))) ////////// / // /////// ,,, ... 00000000000000000000000000000 **** $$$$$ ",
+ " %% %%%%% ))))) ///////// // // /////// ,,, ... 00000000 00000000 0000 **** $$$$$ ",
+ " %%%%%% ))) ////// / / ////// ,,, ... 000 0000 000 0 0 00 0 ***** $$$$$ ",
+ " %% %%% ) //// // // ////// ,,, ... ** * * ****** $$$$ ",
+ " % %%%%%% /// / /// ///// ,,, ... ** * ****** ****** $$$$$ $ ",
+ " % %%%%%% /// // /// ///// ,,, ... ****** ****** $$$$ $$ ",
+ " % %%%%%% /// // ///// ... **** ** ** ** * * ******** $$$$$ $ ",
+ " % %%%%% //// // //// ... ******************** * ** ***** $$$$$$ $ ",
+ " %%%%%% ///// /// . ... ********************************************* $$$$$ $ ",
+ " %%%%% //// /// ...... ********************************************* $$$$$$ $ ",
+ " %% %%% /// //// ...... . *** ********************************* * $$$$$$ ",
+ " % %%%% //// //// ..... . . **** * * ******* * * * ** * $$$$$$$ ",
+ " % %%%% //// // //// ..... .. * **** **** **** $$$$$$ ",
+ " %%% ///// / /// ..... ... $$$$$$$ ",
+ " %%%% ///// /// /// .......... $$$$$$$ ",
+ " %%%% ////// /// . ..... ... ........ $$$$$ $ ",
+ " %%%% ///// /// ........ . ........ $$$$$ $ ",
+ " %%% //// / //// . ....... .. . . $$$$$ $ ",
+ " %%% ////// / //// ........... ..... .... $$$$$ ",
+ " %%% / ///// // /// ........................................... $$$$$ ",
+ " %%% //// // / /// .. ........................................ $$$$$ ",
+ " %%% / //// / / /// .......................................... $$$$ ",
+ " %%% / //// // /// . ... .... .... ....... .... $$$$ ",
+ " %%% ///// / /// ..... .... ............ ... $$$$ ",
+ " ////// //// $$$$ ",
+ " ////// ///// $$$$ ",
+ " ///// ///// ",
+ " //// ////// ",
+ " //// ////// ",
+ " //// ///// 1111 11 ",
+ " ///// ////// 1 111 ",
+ " ///// ////// 1 1 1 1 ",
+ " /////////// ///// 11 1 1 111111 ",
+ " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
+ " //////////////////// 11111111111111111111111111111111111111111111111111 ",
+ " //////////// 11111111111111111111111111111111111111111111111111 ",
+ " //// 1111111111 111 1 1 11 1111111 1 11 ",
+ " 11 1 11 11111 1111 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-200-200-1.0-grid-reference.json
new file mode 100644
index 000000000..008e5987b
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-2-200-200-1.0-grid-reference.json
@@ -0,0 +1,74 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "7",
+ "5",
+ "6",
+ "16",
+ "12",
+ "10",
+ "2",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " !! ",
+ " !!!!! !! ",
+ " !!!!! !! ! ! ",
+ " !!!!!! !!!!!! !!!!!! ",
+ " !!!!!!!! !!!!!!!!! ! !!!!!! !!! ",
+ " !!!!!!!!!! !!!!!!!!! !!!!!!!!!! !!!! ",
+ " !!!!# !!!!! !!!!! !!!!!!!!!!!!!!!!!!!!! ",
+ " !! # ###!!!!!!! # !!!!!!##! !!!!!!!! ",
+ " #######!!!!!!!### !!!###### !!!!!! ",
+ " ###### # !!! !#!### !!# ####! !! ## $$$ ",
+ " ########## ! !!!###### # #######! !!###$$$ ",
+ " #### ##### ##!!#######% #######!#######$$$ ",
+ " &&#% ######!### ####%%%#% ######## $$$ ",
+ " &&& %%%%##### ## # #%##%%#%% ####### $$$ ",
+ " &&& %%%%%%%######## %%%##%%%%%%%%#### ## $$$ ",
+ " &&&%%%%%%% %%####%# %%%%%%#%%%%%%### ## # $$$ ",
+ " &&%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%#%#% # $$$ ",
+ " &&&%&& %%%%%%%% %%%%%%% %%%%%%% %%#%%# $$$ ",
+ " &&&&% %'%'% %%%%%%% ''%'%% % %%%%% ((($$$",
+ " &&& '%%'' % %% '''' %%%((((((($$ ",
+ " &&&& '''' ''''''%%%% ''''' ''%'% %(((((($$ ",
+ " &&&'''''''''''''%' %''''''' '''''''((((((($$ ",
+ " &&'''''''''''''''''''''''''''''''''''' $$$ ",
+ " &&&''' '''''''' ''''''' ''''''' ''''' $ $$$ ",
+ " &&&&' ''''' ))'''' ' ''''**''******* $$$ ",
+ " &&&&&& '''++ ))',,,'-'-----**'''*'****$ $$$ ",
+ " & &&& ++++++ ))''',''------**'''''''****$$$ ",
+ " &&&&&& +++++ ))),'''-------....'''' '*$*$$$ ",
+ " &&&&& +++++/// )))''''........... **$$$$ ",
+ " &&&& +++++//////)),,,,............ **$$$$ ",
+ " & &&&&++++////////)),,,,... .000000 $**$$$ ",
+ " &&&+++//////////),,,....... .000000 ***$$$ ",
+ " &&&+++//// //,,,.... . 0000000*******$$$ ",
+ " &&& /// /// .... *************$$$ ",
+ " &&& /// /// .... ************ $$$ ",
+ " &&& /// /// ............. *** $$$ ",
+ " &&& //// /// ............. $$$ ",
+ " &&& //// ////.............. $$$ ",
+ " ///// ////// ... 111 ",
+ " /////////// .. .1.11111111111 ",
+ " //////// .. 1.11111111111 ",
+ " ///// 1111111111111 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-400-400-1.0-grid-reference.json
new file mode 100644
index 000000000..f19451cac
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-2-400-400-1.0-grid-reference.json
@@ -0,0 +1,124 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "16",
+ "6",
+ "2",
+ "10",
+ "12",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ! ",
+ " ! ! !! !!! ",
+ " ! ! !!!! !!! !! ",
+ " !!!!!!!!!! ! !!!!!!! ! !!! ! ",
+ " !! !!!!!!!!!! !!!! !!!!!!!! !!!!!!!!! ! !! ",
+ " ! !!!!!!!!!!!!!!!! !!!!!!!!!! !! !!!!!!!! !! !!! ",
+ " !!!!!!!! !!!!!!!! !! !!!!! !!!!!! !!!!!!!!!!!!!!!! !! !!!!! ",
+ " !!!!!!! !!!!!!!! !!!!!! !!!!! !! !!!!!! !!!!!!!!!! !!!!!! ",
+ " !!!!! !!!!!!!!!! !! !!!!!! !!!!!! !!!!!!! ! !!!!! ! !!!!! ",
+ " !!!! !! !!!!!!! !!!!!! !!!!!! !!!!! ! ! !!!!! !!!!!!!!! ",
+ " ! !! !!!!! !!!!!! !!!!!!!!!!! !! !!!!!!!!!!! !!! ",
+ " # ! !!!!!!!!! !! # !!!!!!!!! ## !!!! !!!!!!! !! ",
+ " ## # !!!!!!! !! ! ## !!!!!! ## !!!!! ! !! ",
+ " ## #### !!!!! !! ######## ! !!! ### !!! ! $$$ ",
+ " ######### ! ! ! ######## #! !! ! # ##### # $$$ ",
+ " ############ ########## !!!! ######## # ### $$$ ",
+ " ####### ##### ###### ##### ! ! ######### ## ##### $$$ ",
+ " ###### ###### ###### ##### ###### ######### ##### $$$ ",
+ " ##### # ###### # ## ##### # ###### ##### ###### # ###### # $$$$$$ ",
+ " %%%%#### # # ###### ############## ###### ##### ####### ########## $$$ $ ",
+ " %%%% # ### ####### ######### ##### ###### ########### # # $$$ $$ ",
+ " %%%% ### ############# # # ########### # ########### # $$$ ",
+ " %%%% ## ## ######### ##### & ####### & & ## ##### ## # $$$$$$ ",
+ " %%%% && & ## ####&&& # &&&& ###### & && & # #### $ $$$ ",
+ " %%%%%% &&& & & &&&& & &&& & & #### # & & & && ##### $$$$$ ",
+ " %%%%%% &&&&&&&& & &&&&&&& & &&&&&## # ## &&&&&&&&&& ### $ $$$ ",
+ " %%%%%% &&&&&&&& &&&&&&&&&& & &&&&&&& ## &&&&&&&&&&& # $$$$$ ",
+ " %%%%% &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&# &&&&&&&&&&&& $ $$$ ",
+ " %%%%%%&&&&&&&&&&& &&&&&& &&&&& &&&&&& &&&& &&&&&& &&&& & $$$$$$ ",
+ " %%%%%%&&&& &&&& &&&&&& &&&& &&&&& &&&& &&&&& &&&&&&&&& $$$$$ ",
+ " %%%%%%&& &&&&&&&&&& &&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$$$ ",
+ " %%%%%%& &&&&&&&&& &&&&&&&& &&&&&&&& &&&&&& $$$ ",
+ " %%%% &&&&&&& &&&&&&& &&&&&& & &&&& $$$ ",
+ " %%%% &&&&& & && & &&&& & &&&& ''''' $$$ ",
+ " %%%%%% & &&&& & &&&& (( &&&&&& (( &&&&& ''''' $$$ ",
+ " %%%%% & & & (( &&&&& ((( &&&& ((( & & ''''' $$$ ",
+ " %%%%%% (( ( ((( ( (((( ( (( ''''''''''''' $$$ ",
+ " %%%%%% ( (((( (((((( ((((((( (((((((( ''''''''''''' $$$$ ",
+ " %%%% ((((((( (((((((( (((((((( ((((((((( ''''''''''''' $$$ ",
+ " %%%% ((((((((( (((((((((( ((((((((((( ((((((((((( $$$ ",
+ " %%%% ((((((((((( (((((( (((( (((((( ((((( (((((( (((( $$$ $$ ",
+ " %%%%(((((( ((((( (((((( (((( ((((( ((((( ((((( (((( (( $$$ ",
+ " %%%% ((( ((((( ((((( (((((((((( (((((((((( ((((((((( $ $$$ ",
+ " %%%% ( ((((((((() ((((((((( (((((((( (((((((( $ $$$ ",
+ " %%%% ((((((()) ((((((( (((((( *** (((((( $ $$$ ",
+ " %%% (((((())) +++( ( (( ( ((( ( ( ********(((**(((** $$$ ",
+ " %%% (((( ((())) +++(( ((((( (( ((( ((*********(*(*(**(*** $ $$$ ",
+ " %%% ((((()))) +++(((((, ----------(((-- ************(******** $$$$ ",
+ " %%% (())) +++ ((,,,,,------.-.-((-- ***** $$$$ ",
+ " %%% )))))))) +++ ,,, ,,-.--.-.-.----- **** $$$ ",
+ " %%% )) ))))))))) +++ ,,,,,, . .. .............. **** $$$ ",
+ " %%%%% ))))))))) )) ++++ ,,,,,, ...................... *** $$$ ",
+ " %%% ) ) )))))))) ) ++++ ,,,,,, ....................... *** *$$$ ",
+ " %%% % )))))))) )))) +++ ,,,, ,....................... *** **$$$ ",
+ " %%% ))))) ) )////// +++ ,,,,,,.... . .... *** $$$ ",
+ " %%% % )))))) //////////// +,, ,,,,,,... . . . .. *** * $$$ ",
+ " %%%%% ))))) ///////////////+,, ,,, ...... **** *$$$$$$ ",
+ " %%% %))))) ////// ///////++,,,,, ... .. 000000000000000 ***** $$$$$$ ",
+ " %%%%%%)))))) ///// ///++,,,,, ... .. 000000000000000 ****** $$$ $ ",
+ " %%% ))) ///// //// ,,,, ... . 00000000**00000 ** **** $$$ $$ ",
+ " %%% )) ///// //,,,,,,......... **** **** *** $$$ ",
+ " %% %%% //// /////,, . ... ******* * * **** $$$$$$ ",
+ " %%%% /// //// ...... *********************** $$$$$ ",
+ " %%% /// /// ..... . ********************** $$$$$ ",
+ " %%% /// /// ...... ********************* $$$$$$ ",
+ " %%% /// // /// ....... .... * * * $$$$$ ",
+ " %%% //// / //// ....... .. ** * * * $$$$$ ",
+ " %%% //// / /// .. ....................... * * * * $$$$$$ ",
+ " %%% //// // ///// ...................... * $$$$$ ",
+ " %%% //// // ////// ..................... $$$$$$ ",
+ " %%% //// / ///// .................. $$$ ",
+ " //// / //// / ........ $$$ ",
+ " //// ////// / ... ....1 11 ",
+ " //// //////// . 1 1111 ",
+ " ////////// ///// //// 11111111111111111111 ",
+ " ////////////// / 11111111111111111111111111 ",
+ " //////////// 11111111111111111111111111 ",
+ " //// 11111111111111111111 ",
+ " 1 111111 ",
+ " 1 1 1 1 ",
+ " 1 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-600-600-1.0-grid-reference.json
new file mode 100644
index 000000000..68b2db067
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-2-600-600-1.0-grid-reference.json
@@ -0,0 +1,174 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "16",
+ "6",
+ "10",
+ "2",
+ "12",
+ "14",
+ "13",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ! ! ",
+ " !! ! ! !! !!!! ",
+ " !!!!!!! !!!!!!! !! !!!!! ",
+ " !!!!!!!!! !! !!!!!! !!! !! ",
+ " ! !!!!!!!!!!!!!! !!!!!!! !!!!!! ! ",
+ " ! !!!!!!!!! !!!!! !! !!!!!!!!!! !!!!!!!! !! ",
+ " !! !!!!!! !! !!!!! !!!!! !!!!!! !!!!!!!!!!! !!!!! ",
+ " !!!!!!!!!!! !!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
+ " !!!!!!!!! ! !! !!!!! !!!!!! !!!!! !!!!! !!!!!! ! !!!!! ",
+ " !!!!!!! ! !!!!! !! !!!!!! !!!!! !!!!!! !!!!!! !!!!!!!!!!!! ",
+ " !!!!!! !!!!! ! !!!!!!!!! !!!!!! ! !! !!!!!! !!!!! !! !!!!!! !! ",
+ " !!!!! !!!!!! !!!!!!! ! ! !!!!!! !! !!!! !!!!!!! !!!!! !!! !!!!!! ! ! ",
+ " !!! !!!!! !!!!!!!!!! ! ! !!!!!! ! ! !!!!!! !! !!!!!! !!!!!!!!!! ! ",
+ " !!!!! ! !!!!!!! ! ! ! !!!!!! !!!!!! !! ! !!!!!! !!!!!!! !! ",
+ " !!!!! !!!!!! ! ! !!!!!!!!!!!!!!! ! ! !!!!!!!!!! ",
+ " !!!!!!!!!!!! # ! !!!!!!!!!!! !! !!!!!!!!!!!! ",
+ " ! !!!!!!! # !!! !!!!!! !!! !!!!! ",
+ " ## !!!!!!!!!! ##### ! !!!! # #### ! !! ",
+ " ##### !!! !!! #### # ! ###### $$$$ ",
+ " # ######## # ! ####### ### $$$$ ",
+ " ############# # ! ######### ##### ## $$$$ ",
+ " # ## ###### ####### # ###### ##### ######### #### $$$$ ",
+ " # ####### ######## ## ###### ##### ########### ###### $$$$ ",
+ " ####### ## ## ##### ###### ###### ##### ##### ###### $$$$$$ ",
+ " ####### # ## ## ##### # ###### # ###### ##### ###### ## ##### # $$$$$$ ",
+ " ###### # ###### ## ###### #### ##### ###### ##### # ########## $$$$$ ",
+ " ##### ###### # ###### # # ##### ##### ###### ############ $$$$$$ ",
+ " %%% ### ##### # ########### ###### # ## ##### # ###### ########## # $$$$ ",
+ " %%% ##### ###### ## # ###### ############# ## ##### ######## ## # $$$$$$ ",
+ " %%% ###### ###### ## ######## ######### # # ########## # $$$$$$ ",
+ " %%%%% ##### ##### ### ###### ###### # # ############ $$$$$$ ",
+ " %%% ########### # ############# ## # ########### $$$$$$ ",
+ " %%% % ########## ##### ####### # # ## ## $$$$$$ ",
+ " %%% ######### #### &&& # $$$$$$ ",
+ " %%% % ### ### && & ## &&&&&& $$$$$$ ",
+ " %%% % && # # # && && &&& &&&&&& & $$$$$$ ",
+ " %%% % && && ### # &&&&&&&& & && &&&&&&&& &&&&&&&&&&&& $$$$$$ ",
+ " %%%%%% &&&&&&&&&&&& # #&&&&&&&&&& & & &&&&&&&&&&& &&&&&&&&&&& $$$$ ",
+ " %%% && &&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&& $$$$ ",
+ " %%% &&&&&&&&&&&&&&&& &&&&&&& &&&&& &&&&&& &&&&& && &&&&&& &&&&& $$$$ ",
+ " % %%% &&&&&&& &&&& & & &&&&&& &&&& &&&&&& & &&&& &&& & &&&&&&& &&&& $$$$ ",
+ " %%%% &&&&& & &&&& && & &&&&&&& &&&& &&&&& & &&&& &&& &&&&&&& & &&&& & $$$$ ",
+ " %%% &&&&& & &&&&&&&&&&&&&&&& && &&&& &&&&& &&& &&&& &&&&&&&&&&&& &&&& &&&& $$$$ ",
+ " %%% &&& && &&&&&&& &&&&&& &&& &&&&& &&&&&& &&&&&&&&&&&&&&&& & & &&&&&&&&&&&& $$$$ ",
+ " %%% & & &&&&&&&&&&&&&&& && &&&&&&&&&&& & &&&&&&&&&& & &&&&&&&&& $$$$$ ",
+ " %%% &&& &&&&&&&&& && &&&&&&&&& & &&&&&&&& &&&&&& $$$$$$ ",
+ " %%% & &&&&&&& &&&&&& &&& & & $$$$$$ ",
+ " %%% && & && & &&&& $$$$$ ",
+ " %%% % & & & &&& & '''''' $$$$$$ ",
+ " %%%%% &&& & ' '' '''''' $$$$ ",
+ " %%%%%% ' '''' '''''' $ $$$$ ",
+ " %%% % ( ' ' '' '''''' $$$$$$ ",
+ " %%%%% ( ( ( ''''''''''''''''''' $ $$$$ ",
+ " %%% % (( (( (( ((((( ''''''''''''''''''' $$$$$$ ",
+ " %%%%% (( (((( ((( (((((((((( (((((((((( ''''''''''''''''''' $ $$$$ ",
+ " %%% % (((((((((( (((((((( ( ((((((((((( ((((((((((( ''' ' $$$$$ ",
+ " %%%%%% ( ((((((((((( (((((((((((( ((((((((((((( ((((((((((((( ''' '''' $$$$ ",
+ " % %%% ((((((((((((( ((((((((((((( ((((((( ((((( (((((( (((( '''' '' $$$$$ ",
+ " % %%% ((((((( ((((( ( (((((( ( ((((( ((((( (((((( ( ((((( (( (((( ' $$$$$$ ",
+ " %% %%% ((((( ((((( (( (((((( ((( ((((( (((((( ((((((((( ((( ((((( ((( (((( ( $$$$ ",
+ " %%%% ((((( ((((((( ( (((((((((((( (((( ((((( (( ((((( ((((((((( (( ((((( ((( $$$$ ",
+ " % %%% (((( ( (((( ( (((((((( ( ( (((( ((((( ( ((((((((((((( ( (((((((((((( $$$$ ",
+ " %%% (( (((((((((((((((( ((( ((((((((((( (((( (((((((((( ( ( (((((((((( $$$$ ",
+ " %%% ((((((((((((((( ( ((((((((( ( (((((((((( ( ))) ((((((((( $$$$ ",
+ " %%% ( ((((((((( ** (((((( ( ((( ((((( ))) ))) (((( (( ) $$$$ ",
+ " %%% ( (((( **** +++ ((( (( ( ))))))))))) ) (((((((( )) $$$$ ",
+ " %%% ***** ++++ ((( ( ( ,, , , )))))))))))))))))(((((()))))) $$$$$ ",
+ " %%% %% ****** ++++ ( ((((- ,, , , , )))))))))))))))))))))()))))))))) $$$$$ ",
+ " %%%%% * ***** * +++ -((- ,,,,,, ,, ))))))))))))))))))))))))))))))) $$$$$ ",
+ " %%%%%% ******** * ** +++ ---- ,,,,,,,,,,,,,,,,,,,,,, )) ))))))))) )) $$$$$ ",
+ " %%%% * ****** *** +++ --- ,,,,,,,,,,,,,,,,,,,,,, ) )))) )))))) $$$$ ",
+ " %%%%% * *********** +++ ------ ,,,,,,,,,,,,,,,,,,,,,, )))))) )))) $$$$$$ ",
+ " %%% % ****** ***** ++++ --- -- ,, . ... ) )))) $ $$$$ ",
+ " %%%%% ****** * ++++ ------ , ,,,, . . )))) $$$$$ ",
+ " %%% ***** ++++ ------ ,,,,,,.................... ))) ))) $ $$$ ",
+ " %%%%%% ***** +++ ------ ................................ )))))) $$$ ",
+ " % %%% ****** +++ ---- - . ................................ ))))) $ $$$ ",
+ " %% %%% ***** / // +++ ------ .................... . .. ) ))) $$$ ",
+ " %% %%% ****** / / /// +++ -- ------ . .... . .. . .... ))) $$$$$ ",
+ " %%%% ** ****** * /////// ////// ++++-- --- ...... . .... . . .. ))) $$$ ",
+ " % %%% ******** ****/ //////////// // / ++++ ----- ... .... ))) $$$ ",
+ " %%% ****** * * ///////////////////// +++ ----- ...... 0 0 ))) $$$ ",
+ " %%% *********** //////////////////// +++ ---- . .... 0 00 ))) $$$ ",
+ " %%% ******* ** * ////// //////// +++------ ...... 0 0000 ))) $$$ ",
+ " %%% ****** ///// / // //// +++ --- .... 00000000000000000000000 ))))) $$$ ",
+ " %%% ****** ////// // // ////+++ --- .... 00000000000000000000000 )))))) $$$ ",
+ " %%%%%%**** ////// ///// --- ... 00000000000000000000000 ))) )) $$$ ",
+ " %%%%%%*** ///// ///// --- ... 00 0 0 )))))) $$$ ",
+ " %%%%%%** //// //// ---- ... ) ) 00000000 ))) ) $$$ $ ",
+ " %%%% /// /// //// ---- ... ) )))0 000000 ) )))) )))) )) $$$$$$ ",
+ " %%%%% //// //////// ... ) ) )) )))))) $$$ $ ",
+ " %%% % //// /////// ... ))))))))))))))))))))))))))))))))))))) $$$ $ ",
+ " %%%%% /// /// .... ))))))))))))))))))))))))))))))))) ) $$$ ",
+ " %%%% ///// //// ..... ))))))))))))))))))))))))))))))))) $$$$$$ ",
+ " %%%%%% /// /// ... . ) ) ))))))))))) $ $$$ ",
+ " % %%% ///// /// ... . )))))) ) $$$$$ ",
+ " %%%%%% ///// ////// ...... )) ) ) $ $$$ ",
+ " %% %%% ////// /// / ..... . .. ) $$$$$ ",
+ " %%%%%% ////// ////// ..... . .... $ $$$ ",
+ " %%%%%% /// /////// ....... ...... $$$$$ ",
+ " %%% //// /////// . ................................ $$$$$ ",
+ " %%% //// ///// / .. .............................. $$$$$ ",
+ " %%% /////// //////// . . ............................ $$$ ",
+ " %%% / ///// // ////// ... . ..... . $$$ ",
+ " /// //// / / //// ..... ... . . $$$ ",
+ " /// //// /////// . . ... .. ",
+ " // //// ////// ",
+ " // //// / ////// 1 ",
+ " / ///// // // ///// 1 11 1 1111 ",
+ " ////////// ////// 1 1111 1 11 ",
+ " ///////////// ////// 11111111111111111111111111111111111111 ",
+ " ///////////////// 11111111111111111111111111111111111111 ",
+ " //////////// 11111111111111111111111111111111111111 ",
+ " ///// / 111111111111111 11 1 1 ",
+ " //// 1 111111 11 111 1 ",
+ " / / / 1 1 1 1 1 111 11 ",
+ " / 11 11 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json
new file mode 100644
index 000000000..cc3316f0e
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json
@@ -0,0 +1,224 @@
+{
+ "keys": [
+ "",
+ "9",
+ "8",
+ "4",
+ "5",
+ "7",
+ "16",
+ "6",
+ "2",
+ "10",
+ "12",
+ "13",
+ "14",
+ "11",
+ "3",
+ "15",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !! !! ",
+ " ! !! !! ",
+ " ! !!!! ! ! ",
+ " !!!!!!! ! !!!! !!! ",
+ " !!!!!!!!! !!!!!!!! ! !!! ",
+ " !!!!!! !!!!! !!!!!!!!!!!! ! !!!!!! ",
+ " !!!!!! !!!!!! !!!!!!!!!!!!!! ! !! !!!!!!!! ! ",
+ " !!!!!! !!!!! !!!!!!! !!!!! !! !!!!!!!!!! !!!! ",
+ " ! !!!!!! !!!!! !! !!!!!! !!!!! ! !!!!! !!!!!! !! !!!!!! ",
+ " !!!!!!!!!!! !!!!!!!! !!!!!! !!!!!!! ! !!!!!! !!!!!!!!! !!!!! ",
+ " !! !!!!!!! !! !!!!!! !! !!!!! ! !!!!!!!!!! !!!!!! !!!!!!!! ! !!!!!! ",
+ " ! !!!!!!!!! !! ! !!!!!!!! !!!!!! !!! !!!!!! !! !!!!! ! !!!!! !! !!!!!!!!!!! ",
+ " !!!!!!!!! ! !! ! !!!!!! !! !!!!!! !!! !!!!!! !!!!!! !!!!!!! ! !!! !!!!! !!! ",
+ " !!!!!! !! !!!!!!!!!!! ! !!!!!! !!!!!! !! !!!!!! !!!!!!!!!!!!! !!! !!!!!! !!! ",
+ " !!!!! !!!!!!!!!! ! !!!!!!! ! !!!!! !!!!!!!!!!!! !!!! !!!!!! ! !!!!!!!!! !! ",
+ " !!!! !!!!! ! ! !!!!! !!!! !!!!! !! !!!!!! !! ! !!!!!! ! !!!!! !! ",
+ " ! !!!!! !!!!!!!!!! !!!! !!!!!! ! ! !!!!!! ! !!!!!! !!!!!! ",
+ " !!!!!! !!!!!!!! ! ! !!!!!! !!!!!!!! ! !!!!! !!!!! ",
+ " !!!!!! !!!!!! ! !!!!! ! !!!!!! !! !!!!! !!!!!! ",
+ " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
+ " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
+ " !!!!!!!!! ! !!!!!!! !!!!! ",
+ " # # !!!!!! ## ! !!!! !!!! ",
+ " ### ### ! !!! #### !!! !! ! !! $$$ ",
+ " ######## !!! ! ## #### !!! ## ! !!! $$$ ",
+ " ######### !!!! ######## ! ##### ! $$$ ",
+ " ########### ! ! ########### ###### # $$$ ",
+ " ###### ###### ###### ##### # ######### ### $$$$ $ ",
+ " ## ######## ##### ##### ##### # ########### ##### $$$$$ ",
+ " ############# ##### ###### ####### ##### ##### # ##### $$$ $ ",
+ " # # ########## ###### ###### ############ ###### ####### ## ######## $$$$$$ ",
+ " ########## ###### ##### # # ######## ###### # ########### ## ###### ### $$$ $ ",
+ " ###### #### # ##### # ###### ######### ##### ## ###### # # ##### ## # $$$$$$ ",
+ " ####### # ###### ## ## ##### # ########### ##### ## ####### ###### ## $$$$ ",
+ " ###### ######## ### # ######### # ## ##### ###### ########## ####### #### $$$$$ ",
+ " #### # # ###### # ######### ### # ##### ####### # ## ##### ###### # # $$$ ",
+ " %%% ## ### ###### # ####### ## ###### ## ##### ## # ###### ###### $$$$$ ",
+ " %%% ### ###### ######## # # ###### ## ###### # ##### ##### $$$$ ",
+ " %%% % ## ######## ###### # ##### # ###### ## ###### ###### $$$$$$ ",
+ " %%%%% ## ##### ###### ##### # ########### ########### $$$$$$ ",
+ " %%%%%% # ##### ###### ###### ###### ### # ####### $$$$$$ ",
+ " %%% % ###### ##### ############# # ###### $$$ ",
+ " %%%%% ########### ############ ###### $$$ ",
+ " %%% % ######## ### ###### ## ### $$$ ",
+ " %%%%% ##### ###### #### $$$ ",
+ " %%% # ### # ### # # # $$$ ",
+ " %%%%%% # #### ##&& && &&&& ## & & $$$$ $ ",
+ " % %%% && # && & &&& &&&&& && # & &&&&&&&&& & $$$$ ",
+ " %% %%% && # &&&&&&& & &&&&&&&&& &&& &&&&&&&&&&& & $$$$ ",
+ " %% %%% && &&&&&&&&& & &&&&&&&&&& &&&&&&&&&&&& && &&&&&&&&&&&&&& && $$$$$$ ",
+ " %%%%%% &&& &&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&& &&&&&&&& $$$ $ ",
+ " % %%% &&&&&&&&&&&&&&&&& && &&&&&&& &&&&&& &&&&&&& &&&&& &&&&&& & &&&&& && $$$$ ",
+ " %%% && &&&&&&&& & &&&&&& & &&&&&&& &&&&& &&&&&& &&&&& && &&&&& &&&&&&&&& $$$$ ",
+ " %%% & &&&&&&& & &&&& &&&& & &&&&&&& && &&&& &&&&& &&&&&&&& &&&&& & &&&&&& && $$$$ ",
+ " %%% & &&&&&& &&& &&&&& &&&&&&&& &&&&& &&&&& & &&&&&& &&&&&& &&&&&& &&& &&&&& $$$$ ",
+ " %%% &&&&& &&&& &&&&&&&&&&& & & &&&& & &&&&&&&& && && &&&&& & &&&&& &&&& && $$$$ ",
+ " %%% &&&&& &&&& &&&&&&&&& && &&&& && && &&&&& &&&& & &&&&&&&& & &&&&& &&&&& &&&&& $$$$ ",
+ " %%% &&& &&&& &&&&&&& &&&&& &&&&&& && && &&&&& &&&&&&&&&&& &&&&&&&&&&&&&& $$$$$ ",
+ " %%%%%% & &&&&& &&&&&&& &&&&&& &&&&&& & & &&&&&&&&&&&&&&& &&& &&&&&&&&&&& $$$$ ",
+ " %%% %% &&&&&&&&&&&&& & &&&&&&&&&&&& & & &&&&&&&&&& & & &&&&&&&&&& $$$$$ ",
+ " %%%%%% &&&&&&&&&&& & &&&&&&&& & &&&&&& & && &&&& & $$$$ ",
+ " %%%%% &&&&&&& &&&& &&&& & && & &&& $$$$ ",
+ " %%%%% & && &&& & && $$$$ ",
+ " %%%%%% & && & $$$$ ",
+ " %%%%% && & $$$$ ",
+ " %%%%%% '''''''' $$$$ ",
+ " %%% '''''''' $$$$$$ ",
+ " % %%% '''' '''''''' $$$$$$ ",
+ " % %%% '''' ''' $$$$$$ ",
+ " %%%%%% ( ''''''''''''''''''''''''' ' $$$$$$ ",
+ " %%%%%% ( (((( (( ''''''''''''''''''''''''' '' $$$$ ",
+ " %%%%%% ( (((( ( ( ( (( '''''''''''''''''''''''''' $$$$$$ ",
+ " %%% ( ((( ( (((((((( ( ((((((((( '''''''''''''''''''''''''' $$$$$$ ",
+ " %%% (((((( ( ((((((((( (((((((((( ( (((((((((((( '' ' $$$$$ ",
+ " %%% (( ((((((((((((( (((((((((((( ((((((((((((( (((((((((((((( ( '' ' $$$$$$ ",
+ " %%% (( ((((((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( ( ((((( ( $$$$$ ",
+ " %%% (((((((((( (((((((( ( ((((((( ( (((( (((((( (((( (((((( ((((((((( $$$$$ ",
+ " %%% ( ((((((((((((( ((((( (((((((( (( (((( (((((( (((( ((((( (((( (((( (( $$$$$ ",
+ " %%% (((((( (( (( (((((( (((((((((((( (((( ( ((((( ( ((((( ( ((((( ( (((((((( $$$$$$ ",
+ " %%% %% ((((( ((((( (((( ( (((((((( ((( (((( ( ((((((((((( (((((( (((((( (((((((( (( $$$$$$ ",
+ " %%%% ((((( ( (((( (((((( (((( (((( ( (((((((((( ( ((((((((((( ((((( ( (((((( (((( $$$$ ",
+ " %%% % (((( (((( (((((( ( (((( ( ((((((((( ( ((((( ( (((((((((( ( ((((( (((((( $$$$ ",
+ " %%%% (( ((((( (((((( ((((( ((((((( ((( (((((((((((((((( (( (((((((((((((( $$$$ ",
+ " %%% (((((( (((((( ((((((((((((( ( (( ((((((((((((((( ( ((((((((( (( $$$$ ",
+ " %%% ((((((((((( (( (((((((((( ((( ((((((((( ((( (((((( ( ( $$$$ ",
+ " %%% (((((((( )) ( ((((((( ((( ( ***** *** * (( (( $$$$$ ",
+ " %%%% ((((( ( )))) +++ (( ((( ( ** * * ******** ((((( $$$$$ ",
+ " %%%% (( (((( ))))) +++ (((( ************ ******** ( $$$$$$ ",
+ " % %%%% ( ( ( )))))) +++ (( ******************************** $$$$$$ ",
+ " %%%%%%% ( )))))) ++++ ,,, -- - - ************************************* $$$$ ",
+ " %%%%%% ))))) ++++ ,,, -- - - - ********************************* $$$$$$ ",
+ " %%%%% )) )))))) ) ++++ ,,, ------ - ---- - **** *************** ** $$$$ ",
+ " %%%%% ) ))))))) ))) +++++ ,,,, ----------------------------- **** ***** ****** * $$$$$ ",
+ " %%%% )))))))))))) +++++ ,,,, ----------------------------- *** * ** ****** $$$$ ",
+ " %%%% ) )))))))) ) ) ++++ ,,, ----------------------------- ***** $$$$$ ",
+ " %%%% ))))))) ))) +++++ ,,, -- ******* $ $$$$ ",
+ " %%%% ))))) ) ++++ + ,,, , - ---- ***** $$$$$ ",
+ " %%%% )))))) +++++ ,,, ,, . . .------ . ... ****** $$$$$$ ",
+ " %%%% )))))) +++ + ,,,, ........ .. *** * $$$$$ ",
+ " %%%%%% ))))) +++ ,,,, , . ..................................... ****** $$$$ ",
+ " %%%%%% )))))) ++ +++ ,,,,, , .......................................... *** $$$$ ",
+ " %%%%%% )))))) + ++++ ,,,,,,, ........................................... ** *** $$$$ ",
+ " %%%% % ))))) ++++++ ,,, .................. .. ** *** $$$$ ",
+ " %%%%%% )))))) / + +++ ,,,,, ..... . .... .. ****** $$$$ ",
+ " %%%%% )))))) / / /// ++++ ,,,,,, , .... .. . .. ... . ****** $$$$$ ",
+ " %%%%% ))))) /// / + +++ ,,,,,, ... ... *** $$$$$ ",
+ " %%%%%% )) )))))) ) ///////// / +++ ,,,,,, ... .. *** $$$$$ ",
+ " %%%%%% ) ))))))) )) /////////////// / / +++ ,,,,,, ...... *** $$$$$$ ",
+ " %%%% )))))))) ))) //////////////////////// ++++ ,,, ........ *** $$$$ $ ",
+ " %%%%%% ) )))))))))) ) ////// ///////////////// ++++ ,,,, ..... 00 *** $$$$ ",
+ " %%%%% )))))))))))) ////// ////////// // +++ ,,, ..... 0 00 ****** $ $$$$ ",
+ " %%%%%% ))))) ) ///// / //// ///// +++ ,,, ..... 0 00 ****** $ $$$$ ",
+ " %%%%%% )))))) ////// ////// ///////+++ ,,,, ..... 00000000000000000000000000000 ***** $ $$$$ ",
+ " %%%% )))))) // /////// ///// +++ ,,,, .. ... 00000000000000000000000000000 *** ** $$$$ ",
+ " %%%% ))))) // ///// // //// ,,, ...... 00000000000000000000000000000 *** *** $ $$$$ ",
+ " %%%% ))))) / ////// / //// ,,, ... 0 ****** $$$$$ ",
+ " %%%% ))) //////// // ///// ,,, ... 0 0 0 0 ****** $$$$ ",
+ " %%% ) ////// / / //// ,,, ... 0000 00 ******** $$$$$ ",
+ " %%% //// / //// ,,, ... * ****** $$$$ ",
+ " %%%%% // /// / / //// ,,, ... * **** * ** ** *** $$$$ ",
+ " %%%% ////// // ///// ..... * **** ****** $$$$ ",
+ " %%% /// ////// ... **************** ****** ****** $$$$ ",
+ " %%%%% //// // /// ... . ******************************************** $$$$ ",
+ " %%% % //// / /// .... ******************************************* $$$$ ",
+ " %%%%% /// //// ... . ********************************* $$$$$$ ",
+ " %%% % /// ///// .... ***** * *** * * $$$$$$ ",
+ " %%%%% /// ////// .... ** * * ******** $$$$$ ",
+ " %%% % /// /// .... * ** * *** * $$$$$$ ",
+ " %%% ///// /// / ....... ** $$$$ ",
+ " %% %%% ////// /// / ....... $$$$$$ ",
+ " % %%% ////// ///// . .... . .. . $$$$$$ ",
+ " %%%%%% ////// / ///// / . ..... . .... . $$$$$$ ",
+ " %%%%%% /// / //// .... ...... . . .. . $$$$$$ ",
+ " %%% /// /// ............................................ $$$$$$ ",
+ " %%% ///// / /// . ........................................ $$$$$$ ",
+ " %%% /////// /// ...................................... $$$$$$ ",
+ " %%% // //// ////// .. . . ... $$$$$$ ",
+ " %%% /////// /// .. . . . ... . . $$$$$$ ",
+ " ////// //// . .... .. ..... .. $$$$ ",
+ " //// //// ///// . . $$$$ ",
+ " /////// / ///// ",
+ " / //// / ////// ",
+ " //// / ////// ",
+ " /////// // ///// ",
+ " ///// / ////// / 1 ",
+ " ///// / / ////////// // 111 1 1 ",
+ " /////////// / /////// /// 1111 1 1 ",
+ " /////////////////////////// 11111111111111111111111111111111111111111111111111 ",
+ " //////////////////// ///// 11111111111111111111111111111111111111111111111111 ",
+ " // //////////// / 11111111111111111111111111111111111111111111111111 ",
+ " / / /// //// 1111111111 1 1 1 1 ",
+ " //// / 111 1 1 ",
+ " // / 1 1111 11 ",
+ " 1 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-3-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-3-200-200-1.0-grid-reference.json
new file mode 100644
index 000000000..e4e6b0405
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-3-200-200-1.0-grid-reference.json
@@ -0,0 +1,67 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "1",
+ "4",
+ "2",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!###!!#!#!#!!!!!!!!!!!!!!!!!!!!! ",
+ " ###### # # ",
+ " ############################################# ",
+ " ############################################# ",
+ " ############################################# ",
+ " ## # ## ",
+ " ### ##### ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$ ",
+ " %%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " &&&&&&&&&&&&%%&%%&%%%%%%%&%%&&%%%&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&%%%%%%%%%%&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&%%&&%%%%%&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " '' '' (((((((((( ))))))) ",
+ " ''''''' (((((((((( )))))))) ",
+ " ''''''''' (((((((((( )))))))) ",
+ " '''' '''' )))) )))) ",
+ " ''' ''' ))) )))) ",
+ " '''' '''' )))))))) ",
+ " '''''''' ********** )))))))) ",
+ " ''''''' ********** )))))) ",
+ " ''' ********** ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-3-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-3-400-400-1.0-grid-reference.json
new file mode 100644
index 000000000..58a033065
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-3-400-400-1.0-grid-reference.json
@@ -0,0 +1,117 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "2",
+ "1",
+ "4",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !! ! !!! !! ! !!! !! ! !!! ",
+ " !! !! !! !! !! !! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!! ! !!!! !!!! ! !!!! !!!! ! !!!! ",
+ " !!!!! ! !!!! !!!!! ! !!!! !!!!! ! !!!! ",
+ " ",
+ " ## # #### ## # #### ## # #### ",
+ " ########################################################################################## ",
+ " ########################################################################################## ",
+ " ########################################################################################## ",
+ " ########################################################################################## ",
+ " #### # #### #### # #### #### # #### ",
+ " ##### # #### ##### # #### ##### # #### ",
+ " ",
+ " ",
+ " $ $ $ $ $ $ $ $ $ $ $ $ ",
+ " $ $$$$$$ $ $ $$$$$$ $ $ $$$$$$ $ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$ $$$ $$ $$$$$ $$$ $$ $$$$$ $$$ $$ ",
+ " $$$$$ $$ $$$ $$$$$ $$ $$$ $$$$$ $$ $$$ ",
+ " %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% ",
+ " %% %%%%% %% %%%%% %% %%%%% ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " ",
+ " ",
+ " ",
+ " '''''' ",
+ " ((((( ))))))))))))))))))) ''''''''''' ",
+ " ((((((((((( ))))))))))))))))))) '''''''''''' ",
+ " (((((((((((( ))))))))))))))))))) ''''' ''''' ",
+ " ((((( ((((( '''' '''' ",
+ " ((( ((( ''' '''' ",
+ " (((( (((( '''' ''' ",
+ " ((( ((( '''' '''' ",
+ " ((( ((( ''' ''' ",
+ " (((( (((( ''' '''' ",
+ " ((( (((( '''' '''' ",
+ " (((( (((( '''''''''''' ",
+ " ((((((((((((( ''''''''''' ",
+ " ((((((((((( ******************* '''''''' ",
+ " (((((((( ******************* ''' ",
+ " ((( ******************* ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-3-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-3-600-600-1.0-grid-reference.json
new file mode 100644
index 000000000..189a8e051
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-3-600-600-1.0-grid-reference.json
@@ -0,0 +1,167 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "4",
+ "2",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!! ! !!! ! ! ! !!! !! ! !!! ! ! ! ",
+ " !!!!!!!!!! ! !!!!!!!! !! ! ! !!!!!!!! ! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " ! !! ! !! !! !! ! ! ! ",
+ " ! ! !! !! !!!!! !! !! !!!! !!!!! !! !!!!! ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ########## ###### ## ## ###### ### ##### ",
+ " ######## # ######## ## # # # ###### # # ",
+ " ######################################################################################################################################## ",
+ " ######################################################################################################################################## ",
+ " ######################################################################################################################################## ",
+ " # ##### #### # ### # ### #### # #### #### #### ",
+ " # # # # # ## # # # ## #### # ### ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $$$$$$$$ $ $$ $$$ $ $ $$$ $$$$$ $$$$$$$$$$ ",
+ " $$$$$$$$$ $$ $ $$$ $$$$ $ $ $$$$$$$$ $ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $ $$$$$ $$ $ $ $$$ $ $$$$ $$$$ $$$$$$ $$$$$ $$$$ ",
+ " $ $$$ $ $$ $$ $$$$$ $$$$ $$$$$ $$ $$$$$ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " %% %%%%% %%% %%%%% %%%%%%%% % %%%%%%% % ",
+ " %% % % % %%%%%% % %%%%%%%% % %%%%%%% % ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%% % %%%% %%%% %%%%% % %%%%% %%%% % %%% % %%% ",
+ " % %% %%%%% %% % %%%% % % %%%%% % %% %% % ",
+ " && & &&& & & & & & & & & & & ",
+ " && &&&&& & &&&&&&&&& &&&&&&&&&& &&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&& &&&&&& && &&&&&& & && && && & &&& && && ",
+ " &&&&& & &&& &&& & &&&&& &&& &&&&&&& &&&& && & & ",
+ " ",
+ " ",
+ " ",
+ " ''' ' ' ' (((( ",
+ " ) '''''''''' ((((((((( ",
+ " ))))))) '''''''''''''''''''''''''''' (((((((((((((( ",
+ " ))))))))))) '''''''''''''''''''''''''''' ((((((( (((((((( ",
+ " ))))))))))))))) '''''''''''''''''''''''''''' ((((( ((((( ",
+ " )))))) )))))) ' ''''' '' ' ((( ((( ",
+ " )))) )))) ' ' ' '' '' (((( (((( ",
+ " ))) )))) ((( ((( ",
+ " )))) ))) (((( (((( ",
+ " ))) ))) (((( (((( ",
+ " )))) )))) ((( ((( ",
+ " ))) ))) (((( ((( ",
+ " ))) )))) (((( (((( ",
+ " )))) ))) ((( ((( ",
+ " ))) )))) (((( (((( ",
+ " )))) ))) ((( ((( ",
+ " )))) )))) ((((( ((((( ",
+ " )))) ))) ((((((( ((((((( ",
+ " )))))) )))))) ********* ((((((((((((((( ",
+ " )))))))))))))))) ******* * (((((((((( ",
+ " )))))))))))) **************************** ((((( ",
+ " )))))))) **************************** ",
+ " ))) **************************** ",
+ " * *** * *** ",
+ " * ** ** * ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-3-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-3-800-800-1.0-grid-reference.json
new file mode 100644
index 000000000..85bea82ff
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-3-800-800-1.0-grid-reference.json
@@ -0,0 +1,217 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "2",
+ "4",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
+ " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " ! !! ! !!! ! !! ! !!! ! !! ! !!! ! !! ! !!! ! !! ! !!! ! !! ! !!! ",
+ " !!!!! !! !!! !!!!! !! !!! !!!!! !! !!! !!!!! !! !!! !!!!! !! !!! !!!!! !! !!! ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " # # # ## # # # ## # # # ## # # # ## # # # ## # # # ## ",
+ " ######## ######## ######## ######## ######## ######## ",
+ " #################################################################################################################################################################################### ",
+ " #################################################################################################################################################################################### ",
+ " #################################################################################################################################################################################### ",
+ " # ## #### # # ## #### # # ## #### # # ## #### # # ## #### # # ## #### # ",
+ " # # # # ## # # # # ## # # # # ## # # # # ## # # # # ## # # # # ## ",
+ " # # # # # # # # # # # # # # # # # # ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ ",
+ " $$ $$$$ $$ $$$$ $$ $$$$ $$ $$$$ $$ $$$$ $$ $$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $ $$$ $$ $ $ $$$ $$ $ $ $$$ $$ $ $ $$$ $$ $ $ $$$ $$ $ $ $$$ $$ $ ",
+ " $$$$$ $$ $$ $$$$$ $$ $$ $$$$$ $$ $$ $$$$$ $$ $$ $$$$$ $$ $$ $$$$$ $$ $$ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% ",
+ " %% %%%%% %% %%%%% %% %%%%% %% %%%%% %% %%%%% %% %%%%% ",
+ " ",
+ " ",
+ " ",
+ " &&& & &&& &&& & &&& &&& & &&& &&& & &&& &&& & &&& &&& & &&& ",
+ " &&&&&&&& & &&&&&&&& & &&&&&&&& & &&&&&&&& & &&&&&&&& & &&&&&&&& & ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " & &&& &&&& & &&& &&&& & &&& &&&& & &&& &&&& & &&& &&&& & &&& &&&& ",
+ " & &&& & &&& & &&& & &&& & &&& & &&& ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " '' ",
+ " (( ( ''''''' ",
+ " ) (( ( '''''''''''' ",
+ " ))))))) (((((((((((((((((((((((((((((((((((((( ''''''''''''''''' ",
+ " )))))))))))) (((((((((((((((((((((((((((((((((((((( '''''''' '''''''' ",
+ " ))))))))))))))))) (((((((((((((((((((((((((((((((((((((( '''''' '''''' ",
+ " )))))))) )))))))) (( ( '''' '''' ",
+ " )))))) )))))) (((( ((((( '''' ''''' ",
+ " )))) ))))) ''' ' ''''' ",
+ " )))) )))) '''' ' ''''''' ",
+ " )))) )))))) ''''' ' ''''' ",
+ " ))))) ))))))) '''''' '''''' ",
+ " )))))) ))))))) ' ''''' ''''' ",
+ " ))) )))))) '''''' ''''''' ",
+ " )))))) ) ) ))))) '''' ' '''' ",
+ " )))))))) )))))) '''''' '''''''' ",
+ " ))))) ) ) ))))) ''''''' ''''' '' ",
+ " )))))) )) ))))) ''''''' '''''' ",
+ " )))))) )))))))) '''''' ' ''''' ",
+ " ))))))) ))))) '''''' '''' ",
+ " ))))) ))))) '''''' '''' ",
+ " ))))))) )))) '''' '''' ",
+ " )))))) )))) '''''' '''''' ",
+ " )))) )))) '''''''' ''''''' ",
+ " )))))) ))))) ''''''''''''''''' ",
+ " )))))))) )))))))) *** ***** ''''''''''''' ",
+ " )))))))))))))))))) ****** * '''''''' ",
+ " )))))))))))) ************************************** ''' ",
+ " )))))))) ************************************** ",
+ " ))) ************************************** ",
+ " **** ****** ",
+ " **** ***** ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-200-200-1.0-grid-reference.json
new file mode 100644
index 000000000..2815b1bda
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-shield-200-200-1.0-grid-reference.json
@@ -0,0 +1,67 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "1",
+ "4",
+ "2",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!! !!!! !!!! !!!! ",
+ " !!!! !!!! !!!! !!!! ",
+ " !!!!! !!! !!!!! !!! ",
+ " !!!!! !!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!! !!!!! ",
+ " !!!! !!!! ",
+ " #####!!!!###########!!!!##################### ",
+ " #####!#!!###########!#!!#########$$$$#$$$$### ",
+ " $$$$$$$$$ ",
+ " $$$$$ $$$ ",
+ " $$$$$ ",
+ " $$$%%%%%%%%%$$$$$$%%%%%%%%%$$$$$$$$$$$$$$$$$$ ",
+ " $$$%%%%%$%%%$$$$$$%%%%%$%%%$$$$$$$$$$$$$$$$$$ ",
+ " %%%%% %%%%% $$$$$ ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$%%%%%% ",
+ " %%%%% %%%%% $ $$ ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&%%%%%&&&&&&&&&&%%%%%&&&&&&&&&&&&&&&&&&&& ",
+ " %%%% %%%% ",
+ " ' ' (((((((((( ))))) ",
+ " ''''''' (((((((((( ))))))) ",
+ " ''''''' (((((((((( )))))))) ",
+ " ''''''''' ******** )))))))) ",
+ " ''''''''' ******** )))))))) ",
+ " ''''''' ****** )))))))) ",
+ " ''''''' ********** )))))) ",
+ " ''''' ********** )))))) ",
+ " ''''' ********** )))))) ",
+ " ****** )))) ",
+ " ''''' **** )) ) ",
+ " '''' **** )))) ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-400-400-1.0-grid-reference.json
new file mode 100644
index 000000000..260ba355d
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-shield-400-400-1.0-grid-reference.json
@@ -0,0 +1,117 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "4",
+ "2",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " ",
+ " ",
+ " ####### # ####### # ####### # ####### # ####### # ####### # ",
+ " ######### ######### ######### ######### ######### ######### ",
+ " ####### # ####### # ####### # ####### # ####### # ####### # ",
+ " ###### ###### ###### ###### ###### ###### ",
+ " ########################################################################################## ",
+ " ########################################################################################## ",
+ " ###### ###### ###### ###### ###### ###### ",
+ " #### #### #### #### #### #### ",
+ " #### #### #### #### #### #### ",
+ " #### #### #### #### #### #### ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " ",
+ " ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
+ " ",
+ " %%%% %%%% %%%% %%%% %%%% %%%% ",
+ " &&&&&&%%%%&&&&&&&&&&&%%%%&&&&&&&&&&&%%%%&&&&&&&&&&&%%%%&&&&&&&&&&&%%%%&&&&&&&&&&&%%%%&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " ",
+ " '''' '''' ",
+ " ''''''''' ",
+ " ''''' (((( ",
+ " ))) ''''''''''''''''''' (((((((( ",
+ " )))))))) ''''''''''''''''''' (((((((((((((((( ",
+ " )))) ))))) ))))) ''''''''''''''''''' ((((((((( (((((((( ",
+ " )))) )))) ))))))))) ''''' ((((((((( (((((((( ",
+ " ))))))))) ))))))))) '''' ((((( (((((( ",
+ " ))))) ))))) '''' ((((( (((((( ",
+ " ))))) ))))) ((((( (((((( ",
+ " ))))) ))))) ((((( (((((( ",
+ " ))))) ))))) (((( (((((( ",
+ " )))) ))))) **** **** (((( ((((( ",
+ " ))))) ))))) ********* ( ((((( ((((((( ",
+ " ))))))) )))))) ***** (((((((((( ",
+ " )))))))))) ******************* ((((( ",
+ " ))))) ******************* ( ",
+ " ******************* ",
+ " ***** ",
+ " **** ",
+ " **** ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-600-600-1.0-grid-reference.json
new file mode 100644
index 000000000..ffd2ea754
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-shield-600-600-1.0-grid-reference.json
@@ -0,0 +1,167 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "4",
+ "2",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
+ " !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!! ",
+ " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
+ " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
+ " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
+ " !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! ",
+ " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
+ " ",
+ " ",
+ " ######## ######## ######## ######## ######## ######## ######## ######## ######## ",
+ " ######## ######## ######## ######## ######## ######## ######## ######## ######## ",
+ " ###### ###### ###### ###### ###### ###### ###### ###### ###### ",
+ " ######################################################################################################################################## ",
+ " ######################################################################################################################################## ",
+ " ######################################################################################################################################## ",
+ " ###### ###### ###### ###### ###### ###### ###### ###### ###### ",
+ " #### #### #### #### #### #### #### #### #### ",
+ " #### #### #### #### #### #### #### #### #### ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
+ " %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% %%%%% %%% ",
+ " %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% ",
+ " ",
+ " %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% ",
+ " %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% ",
+ " ",
+ " ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " '''''''' ",
+ " '''''''' (( ",
+ " '''''''' ((((((((((((((( ",
+ " )))) '''''' ((((( (((((((((((((((( ( ",
+ " )))) ))))))))))))))))) ) '''''''''''''''''''''''''''' (((((((((( (((((((((( ",
+ " ))))))))))) ))))))))))) '''''''''''''''''''''''''''' ((((( ((((((( ",
+ " )))))) ))))))) ) '''''' ((((( (((((( ",
+ " ))))) )))))) ''''' ((((( (((((( ",
+ " ))))) )))))) '' ' ((((( (((((( ",
+ " ))))) )))))) '''' ((((( (((((( ",
+ " ))))) )))))) ((((( ((((( ",
+ " ))))) )))) ((((( ((((( ",
+ " ))))) ))))) (( ((((( ",
+ " ))) ))))) (( (( ",
+ " )) ))) ((( ((( ",
+ " ))) )) (( (( ",
+ " )) ))) ((( ((((((( ( ((( ",
+ " )) )) (((((( (((((( (( ",
+ " ))) ))))))))) ))) ******** ((((((((((((((( ",
+ " )))))))))) )))) ******** (((((((((((( ",
+ " )))))))))))))) ****** ((((((( ",
+ " )))))))))) **************************** (((((( ",
+ " )))))) **************************** (((((( ",
+ " )))))) **************************** ((((( ",
+ " ****** (( ( ",
+ " ))))) **** (((( ",
+ " )))) **** ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json
new file mode 100644
index 000000000..5df2f94c0
--- /dev/null
+++ b/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json
@@ -0,0 +1,217 @@
+{
+ "keys": [
+ "",
+ "8",
+ "7",
+ "6",
+ "5",
+ "9",
+ "4",
+ "2",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
+ " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
+ " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
+ " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
+ " ",
+ " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
+ " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
+ " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
+ " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
+ " ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ",
+ " #################################################################################################################################################################################### ",
+ " #################################################################################################################################################################################### ",
+ " ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ",
+ " #### #### #### #### #### #### #### #### #### #### #### #### ",
+ " #### #### #### #### #### #### #### #### #### #### #### #### ",
+ " # ## # ## # ## # ## # ## # ## # ## # ## # ## # ## # ## # ## ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ ",
+ " $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ ",
+ " $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ $$$$$$ $$ ",
+ " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
+ " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
+ " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
+ " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
+ " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% ",
+ " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
+ " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
+ " ",
+ " %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% ",
+ " %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ''''''' ' '''''''' (((((((( ",
+ " '' '''''' '' ''''' (((((((( ((((( ((((((((( ",
+ " )))) )))) ''''''' ' '''''''' ((((((((((((((((((((((( (( ",
+ " )))) )))) )))) ))))))))) '''''' '''''' ((((((((((( ((((((((( (( ",
+ " )))))))))))))))))))))))))) '''''''''''''''''''''''''''''''''''''' (((((((( (((((((( ",
+ " )))))))))) )))))))))))) '''''''''''''''''''''''''''''''''''''' (((((( (((((( ",
+ " ))))))) ))))))))) '''''' '''''' (((((( ((((( ",
+ " ))))) ))))))) ''''' ''''' (((( ((((( ",
+ " ))))) )))))) '''' '' ' ((( ( (((( ",
+ " ))))) )))))) '''' '''' ((((( ((((( ",
+ " )))) )))) ((( ((((( ",
+ " ))))) )))) (( ((( ",
+ " )) ) )))) ((( (( ",
+ " ))) )) (( (( ",
+ " )) )) ((( ((( ",
+ " ))) ))) (( (( ",
+ " )) )) (( ((( ",
+ " )) ))) ((( (( ",
+ " ))) )) ((((((((( (((( (((( ",
+ " )) ))) ((((((( ( (((( (((( ",
+ " ))))))))) )))))))) (((((( ((((((((( ",
+ " ))))))))) )))))))) (((((( ((((( ",
+ " ))))) )))))))) (((((( ((((( ",
+ " ))))) )))))) ((((((((( ((((((( ",
+ " )))))) )))))) ******** ******** (((((( (((((((((( ",
+ " )))))))) ))))))) ******* ******** ((((( (((((((((( (((( ",
+ " ))))) )))))))))) ****** ****** (((( ((((( (((( ",
+ " )))) )))))))))) )))) ************************************** (((( ",
+ " )))) ))))) )) ) ************************************** ",
+ " )))) ************************************** ",
+ " ****** ****** ",
+ " ***** **** ",
+ " **** **** ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json
new file mode 100644
index 000000000..ba345cd38
--- /dev/null
+++ b/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json
@@ -0,0 +1,140 @@
+{
+ "keys": [
+ "",
+ "2",
+ "4",
+ "1",
+ "3"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!!!! ! ## # ### # ",
+ " !!!!! ! ##### ## ",
+ " !!!!!!! !! ##### # # ",
+ " ",
+ " ",
+ " ! # ",
+ " ",
+ " ! # # ",
+ " ! ! !!!!!!!! ! ### ## ## ",
+ " !! !!!! ! ### # # ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " $ $ % %% ",
+ " $$$ $ % % % % ",
+ " $ $$$ % % %% ",
+ " ",
+ " ",
+ " $ % ",
+ " ",
+ " $$ % ",
+ " $$$$$$$$ %%%% %%% ",
+ " $$ $ % % ",
+ " $$$$ $ %% % ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json
new file mode 100644
index 000000000..1fa57cb0a
--- /dev/null
+++ b/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json
@@ -0,0 +1,137 @@
+{
+ "keys": [
+ "",
+ "1"
+ ],
+ "data": {},
+ "grid": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " !!!!!! ",
+ " !!!!! ",
+ " ! ",
+ " ! ",
+ " !!! ",
+ " ",
+ " ",
+ " ! !!!!!!! ",
+ " !!!!!!!! ",
+ " !!!! ",
+ " ! !!!!!!!!!!! ",
+ " !!!! !!!!!!!!!!!!!!!! ",
+ " ! !!!!!!!!!!!!!! ",
+ " ! !!!!!!! !!! ! ",
+ " !!!!!! !!! ! !!! ! ! ",
+ " !!!! !! ! !!! ",
+ " !!!!!! !! !! !! !!!!! ",
+ " !!!! ! ! ",
+ " ! ",
+ " ! ! ! ",
+ " !!! ! !!!! ",
+ " !!!!! !!! ! ",
+ " ",
+ " ",
+ " !!! ",
+ " !! !!! ",
+ " !!!!! ",
+ " !! ! !! ! ",
+ " !!!! !! ",
+ " !!!!! ",
+ " ! ",
+ " !! !! ",
+ " ! !!! ",
+ " ! ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ]
+}
\ No newline at end of file
diff --git a/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-agg-reference.png
new file mode 100644
index 000000000..116cdb25f
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-cairo-reference.png
new file mode 100644
index 000000000..2adc23db3
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-200-200-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-agg-reference.png
new file mode 100644
index 000000000..e39a08ee8
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-cairo-reference.png
new file mode 100644
index 000000000..476e6a52e
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-200-200-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-agg-reference.png
new file mode 100644
index 000000000..77812bf4b
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-cairo-reference.png
new file mode 100644
index 000000000..115467c2c
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-400-400-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-agg-reference.png
new file mode 100644
index 000000000..9cde4b58a
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-cairo-reference.png
new file mode 100644
index 000000000..c831a0dde
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-400-400-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-agg-reference.png
new file mode 100644
index 000000000..1d59b1ffe
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-cairo-reference.png
new file mode 100644
index 000000000..44963a89e
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-600-600-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-agg-reference.png
new file mode 100644
index 000000000..aa676ddb9
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-cairo-reference.png
new file mode 100644
index 000000000..94b728fd6
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-600-600-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png
new file mode 100644
index 000000000..32bab8840
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png
new file mode 100644
index 000000000..53629e126
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png
new file mode 100644
index 000000000..875a4e1e1
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png
new file mode 100644
index 000000000..92e49621c
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-agg-reference.png
new file mode 100644
index 000000000..ff369d5f1
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-cairo-reference.png
new file mode 100644
index 000000000..1053eb692
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-200-200-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-agg-reference.png
new file mode 100644
index 000000000..e1c823aa8
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-cairo-reference.png
new file mode 100644
index 000000000..1252a8dba
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-200-200-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-agg-reference.png
new file mode 100644
index 000000000..1ff1a2596
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-cairo-reference.png
new file mode 100644
index 000000000..4f704f232
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-400-400-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-agg-reference.png
new file mode 100644
index 000000000..3763edc33
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-cairo-reference.png
new file mode 100644
index 000000000..98545895d
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-400-400-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-agg-reference.png
new file mode 100644
index 000000000..86d509130
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-cairo-reference.png
new file mode 100644
index 000000000..76f58ef89
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-600-600-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-agg-reference.png
new file mode 100644
index 000000000..27b5b7040
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-cairo-reference.png
new file mode 100644
index 000000000..549b6b48d
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-600-600-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png
new file mode 100644
index 000000000..bdef368df
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png
new file mode 100644
index 000000000..a4ff47b19
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png
new file mode 100644
index 000000000..368254b57
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png
new file mode 100644
index 000000000..8984b4dc2
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-agg-reference.png
new file mode 100644
index 000000000..af67dbc5a
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-cairo-reference.png
new file mode 100644
index 000000000..35d0e93ae
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-200-200-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-agg-reference.png
new file mode 100644
index 000000000..65e2fd97d
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-cairo-reference.png
new file mode 100644
index 000000000..f3f0de0d6
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-200-200-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-agg-reference.png
new file mode 100644
index 000000000..ec3a2e3be
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-cairo-reference.png
new file mode 100644
index 000000000..717242d22
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-400-400-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-agg-reference.png
new file mode 100644
index 000000000..a8ae9556b
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-cairo-reference.png
new file mode 100644
index 000000000..904fe4ea9
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-400-400-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-agg-reference.png
new file mode 100644
index 000000000..b6c6144c2
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-cairo-reference.png
new file mode 100644
index 000000000..e7f2a8ced
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-600-600-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-agg-reference.png
new file mode 100644
index 000000000..d209f3c56
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-cairo-reference.png
new file mode 100644
index 000000000..2d518dd23
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-600-600-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-agg-reference.png
new file mode 100644
index 000000000..fae12f1c6
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-cairo-reference.png
new file mode 100644
index 000000000..cd27f5943
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-800-800-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-agg-reference.png
new file mode 100644
index 000000000..330b22eba
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-cairo-reference.png
new file mode 100644
index 000000000..5a9b5d58c
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-3-800-800-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-agg-reference.png
new file mode 100644
index 000000000..b9668a8b4
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-cairo-reference.png
new file mode 100644
index 000000000..99078afd5
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-200-200-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-agg-reference.png
new file mode 100644
index 000000000..3d9da34e0
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-cairo-reference.png
new file mode 100644
index 000000000..0d4fcb067
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-200-200-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-agg-reference.png
new file mode 100644
index 000000000..3165a8bd2
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-cairo-reference.png
new file mode 100644
index 000000000..e79dd52c6
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-400-400-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-agg-reference.png
new file mode 100644
index 000000000..31d538015
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-cairo-reference.png
new file mode 100644
index 000000000..7d4eda4b3
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-400-400-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-agg-reference.png
new file mode 100644
index 000000000..cb070f5ef
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-cairo-reference.png
new file mode 100644
index 000000000..4f8b88411
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-600-600-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-agg-reference.png
new file mode 100644
index 000000000..2b4dec16d
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-cairo-reference.png
new file mode 100644
index 000000000..00f46b058
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-600-600-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png
new file mode 100644
index 000000000..57393156e
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png
new file mode 100644
index 000000000..eb825e5b4
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png
new file mode 100644
index 000000000..c21e464f2
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png
new file mode 100644
index 000000000..880e4b7fc
Binary files /dev/null and b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png
new file mode 100644
index 000000000..543e1a0bb
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png
new file mode 100644
index 000000000..dc1834b5d
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png
new file mode 100644
index 000000000..6ea92513a
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png
new file mode 100644
index 000000000..c2a222919
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png
new file mode 100644
index 000000000..bb887fa58
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png
new file mode 100644
index 000000000..c6d74c830
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png
new file mode 100644
index 000000000..caa5b8303
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png
new file mode 100644
index 000000000..01c331268
Binary files /dev/null and b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png differ
diff --git a/tests/visual_tests/styles/lines-multi-layout-1.xml b/tests/visual_tests/styles/lines-multi-layout-1.xml
new file mode 100644
index 000000000..dc3674aad
--- /dev/null
+++ b/tests/visual_tests/styles/lines-multi-layout-1.xml
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/tests/visual_tests/styles/lines-multi-layout-2.xml b/tests/visual_tests/styles/lines-multi-layout-2.xml
new file mode 100644
index 000000000..5ad9cd9b2
--- /dev/null
+++ b/tests/visual_tests/styles/lines-multi-layout-2.xml
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/tests/visual_tests/styles/lines-multi-layout-3.xml b/tests/visual_tests/styles/lines-multi-layout-3.xml
new file mode 100644
index 000000000..02b28fd87
--- /dev/null
+++ b/tests/visual_tests/styles/lines-multi-layout-3.xml
@@ -0,0 +1,36 @@
+
+
+
+
diff --git a/tests/visual_tests/styles/lines-multi-layout-shield.xml b/tests/visual_tests/styles/lines-multi-layout-shield.xml
new file mode 100644
index 000000000..dd4970482
--- /dev/null
+++ b/tests/visual_tests/styles/lines-multi-layout-shield.xml
@@ -0,0 +1,33 @@
+
+
+
+
diff --git a/tests/visual_tests/styles/text-multi-layout-1.xml b/tests/visual_tests/styles/text-multi-layout-1.xml
new file mode 100644
index 000000000..8b49c3f3b
--- /dev/null
+++ b/tests/visual_tests/styles/text-multi-layout-1.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/tests/visual_tests/styles/text-multi-layout-2.xml b/tests/visual_tests/styles/text-multi-layout-2.xml
new file mode 100644
index 000000000..b68127872
--- /dev/null
+++ b/tests/visual_tests/styles/text-multi-layout-2.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py
index e3693c300..e5e545aef 100755
--- a/tests/visual_tests/test.py
+++ b/tests/visual_tests/test.py
@@ -3,6 +3,7 @@
import mapnik
mapnik.logger.set_severity(mapnik.severity_type.None)
+#mapnik.logger.set_severity(mapnik.severity_type.Debug)
import shutil
import sys
@@ -95,6 +96,10 @@ files = {
'lines-4': {'sizes': sizes_few_square,'bbox':default_text_box},
'lines-5': {'sizes': sizes_few_square,'bbox':default_text_box},
'lines-6': {'sizes': sizes_few_square,'bbox':default_text_box},
+ 'lines-multi-layout-1': {'sizes': sizes_few_square,'bbox':default_text_box},
+ 'lines-multi-layout-2': {'sizes': sizes_few_square,'bbox':default_text_box},
+ 'lines-multi-layout-3': {'sizes': sizes_few_square,'bbox':default_text_box},
+ 'lines-multi-layout-shield': {'sizes': sizes_few_square,'bbox':default_text_box},
'lines-shield': {'sizes': sizes_few_square,'bbox':default_text_box},
'collision': {'sizes':[(600,400)]},
'shield-on-polygon': {'sizes':[(600,400)]},
@@ -155,6 +160,8 @@ files = {
'text-halign': {'sizes': [(800,800)], 'bbox': default_text_box},
'text-malayalam': {'sizes': [(800, 100)], 'bbox': default_text_box},
'text-bengali': {'sizes': [(800, 100)], 'bbox': default_text_box},
+ 'text-multi-layout-1': {'sizes': [(512,512)]},
+ 'text-multi-layout-2': {'sizes': [(512,512)]},
'line-pattern-symbolizer': {'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)},
'tiff-alpha-gdal': {'sizes':[(600,400)]},
'tiff-alpha-broken-assoc-alpha-gdal': {'sizes':[(600,400)]},