Index: src/libgnumeric.c =================================================================== --- src/libgnumeric.c (révision 16516) +++ src/libgnumeric.c (copie de travail) @@ -75,6 +75,9 @@ /* TODO : get rid of this monstrosity */ gboolean initial_workbook_open_complete = FALSE; +int gnm_sheet_max_rows = 0x10000; +int gnm_sheet_max_cols = 0x100; + static gboolean param_show_version = FALSE; static char *param_lib_dir = NULL; static char *param_data_dir = NULL; @@ -253,7 +256,7 @@ gnome_vfs_init (); #endif - libgoffice_init (); + libgoffice_init ("gnumeric"); plugin_service_define ("function_group", &plugin_service_function_group_get_type); plugin_service_define ("ui", Index: src/main-application.c =================================================================== --- src/main-application.c (révision 16516) +++ src/main-application.c (copie de travail) @@ -33,6 +33,7 @@ #include "gnumeric-paths.h" #include "session.h" #include "sheet.h" +#include "sheet-style.h" #include "gutils.h" #include "gnm-plugin.h" @@ -68,6 +69,8 @@ static gchar *func_state_file = NULL; static gchar *geometry = NULL; static gchar **startup_files; +static int rows = 0; +static int cols = 0; static const GOptionEntry gnumeric_options [] = { /********************************* @@ -82,6 +85,14 @@ N_("Don't display warning dialogs when importing"), NULL }, + { "rows", 'r', 0, G_OPTION_ARG_INT, &rows, + N_("Minimum number of rows"), + NULL + }, + { "cols", 'c', 0, G_OPTION_ARG_INT, &cols, + N_("Minimum number of columns"), + NULL + }, /********************************* * Hidden Actions */ @@ -388,6 +399,11 @@ return gnm_dump_func_defs (func_def_file, 1); if (split_funcdocs) return gnm_dump_func_defs (NULL, 2); + while (gnm_sheet_max_cols < cols) + gnm_sheet_max_cols <<= 1; + while (gnm_sheet_max_rows < rows) + gnm_sheet_max_rows <<= 1; + sheet_style_init_tiles (); /* Keep in sync with .desktop file */ g_set_application_name (_("Gnumeric Spreadsheet")); Index: src/sheet-style.c =================================================================== --- src/sheet-style.c (révision 16516) +++ src/sheet-style.c (copie de travail) @@ -186,31 +186,12 @@ */ #define TILE_TOP_LEVEL 3 -/* This is good until a million columns. */ -#if SHEET_MAX_COLS <= 4 * 4 * 4 * 4 -#define TILE_SIZE_COL 4 -#elif SHEET_MAX_COLS <= 5 * 5 * 5 * 5 -#define TILE_SIZE_COL 5 -#elif SHEET_MAX_COLS <= 8 * 8 * 8 * 8 -#define TILE_SIZE_COL 8 -#elif SHEET_MAX_COLS <= 16 * 16 * 16 * 16 -#define TILE_SIZE_COL 16 -#else -#define TILE_SIZE_COL 32 -#endif +static int gnm_tile_size_row = 16; +static int gnm_tile_size_col = 4; + +#define TILE_SIZE_COL gnm_tile_size_col +#define TILE_SIZE_ROW gnm_tile_size_row #define PARTIAL_TILE_COL (SHEET_MAX_COLS != TILE_SIZE_COL * TILE_SIZE_COL * TILE_SIZE_COL * TILE_SIZE_COL) - - -/* This is good until 16M rows. */ -#if SHEET_MAX_ROWS <= 16 * 16 * 16 * 16 -#define TILE_SIZE_ROW 16 -#elif SHEET_MAX_ROWS <= 20 * 20 * 20 * 20 -#define TILE_SIZE_ROW 20 -#elif SHEET_MAX_ROWS <= 32 * 32 * 32 * 32 -#define TILE_SIZE_ROW 32 -#else -#define TILE_SIZE_ROW 64 -#endif #define PARTIAL_TILE_ROW (SHEET_MAX_ROWS != TILE_SIZE_ROW * TILE_SIZE_ROW * TILE_SIZE_ROW * TILE_SIZE_ROW) typedef enum { @@ -221,25 +202,25 @@ TILE_MATRIX = 3, TILE_PTR_MATRIX = 4 } CellTileType; -static int const tile_size [] = { +static int tile_size [] = { 1, /* TILE_SIMPLE */ - TILE_SIZE_COL, /* TILE_COL */ - TILE_SIZE_ROW, /* TILE_ROW */ - TILE_SIZE_COL * TILE_SIZE_ROW /* TILE_MATRIX */ + 4, /* TILE_COL */ + 16, /* TILE_ROW */ + 4 * 16 /* TILE_MATRIX */ }; -static int const tile_widths [] = { +static int tile_widths [] = { 1, - TILE_SIZE_COL, - TILE_SIZE_COL * TILE_SIZE_COL, - TILE_SIZE_COL * TILE_SIZE_COL * TILE_SIZE_COL, - TILE_SIZE_COL * TILE_SIZE_COL * TILE_SIZE_COL * TILE_SIZE_COL + 4, + 4 * 4, + 4 * 4 * 4, + 4 * 4 * 4 * 4 }; -static int const tile_heights [] = { +static int tile_heights [] = { 1, - TILE_SIZE_ROW, - TILE_SIZE_ROW * TILE_SIZE_ROW, - TILE_SIZE_ROW * TILE_SIZE_ROW * TILE_SIZE_ROW, - TILE_SIZE_ROW * TILE_SIZE_ROW * TILE_SIZE_ROW * TILE_SIZE_ROW + 16, + 16 * 16, + 16 * 16 * 16, + 16 * 16 * 16 * 16 }; typedef struct { @@ -248,21 +229,67 @@ } CellTileStyleSimple; typedef struct { CellTileType const type; - GnmStyle *style [TILE_SIZE_COL]; + GnmStyle *style []; } CellTileStyleCol; typedef struct { CellTileType const type; - GnmStyle *style [TILE_SIZE_ROW]; + GnmStyle *style []; } CellTileStyleRow; typedef struct { CellTileType const type; - GnmStyle *style [TILE_SIZE_COL * TILE_SIZE_ROW]; + GnmStyle *style []; } CellTileStyleMatrix; typedef struct { CellTileType const type; - CellTile *ptr [TILE_SIZE_COL * TILE_SIZE_ROW]; + CellTile *ptr []; } CellTilePtrMatrix; +static int tile_simple_size = sizeof (CellTileStyleSimple); +static int tile_col_size = sizeof (CellTileStyleSimple) + sizeof (void*) * 3; +static int tile_row_size = sizeof (CellTileStyleSimple) + sizeof (void*) * 15; +static int tile_matrix_size = sizeof (CellTileStyleSimple) + sizeof (void*) * 63; + +void +sheet_style_init_tiles (void) +{ + /* This is good until a million columns. */ + if (gnm_sheet_max_cols > 4 * 4 * 4 * 4) { + if (gnm_sheet_max_cols <= 5 * 5 * 5 * 5) + gnm_tile_size_col = 5; + else if (gnm_sheet_max_cols <= 8 * 8 * 8 * 8) + gnm_tile_size_col = 8; + else if (gnm_sheet_max_cols <= 16 * 16 * 16 * 16) + gnm_tile_size_col = 16; + else + gnm_tile_size_col = 32; + } + /* This is good until 16M rows. */ + if (gnm_sheet_max_rows > 16 * 16 * 16 * 16) { + if (gnm_sheet_max_rows <= 20 * 20 * 20 * 20) + gnm_tile_size_row = 20; + else if (gnm_sheet_max_rows <= 32 * 32 * 32 * 32) + gnm_tile_size_row = 32; + else + gnm_tile_size_row = 64; + } + if (gnm_tile_size_col > 4 || gnm_tile_size_row > 16) { + tile_size[1] = gnm_tile_size_col; + tile_size[2] = gnm_tile_size_row; + tile_size[3] = gnm_tile_size_row * gnm_tile_size_col; + tile_widths[1] = gnm_tile_size_col; + tile_widths[2] = gnm_tile_size_col * gnm_tile_size_col; + tile_widths[3] = gnm_tile_size_col * gnm_tile_size_col * gnm_tile_size_col; + tile_widths[4] = gnm_tile_size_col * gnm_tile_size_col * gnm_tile_size_col * gnm_tile_size_col; + tile_heights[1] = gnm_tile_size_row; + tile_heights[2] = gnm_tile_size_row * gnm_tile_size_row; + tile_heights[3] = gnm_tile_size_row * gnm_tile_size_row * gnm_tile_size_row; + tile_heights[4] = gnm_tile_size_row * gnm_tile_size_row * gnm_tile_size_row * gnm_tile_size_row; + tile_col_size = sizeof (CellTileStyleSimple) + sizeof (void*) * (gnm_tile_size_col - 1); + tile_row_size = sizeof (CellTileStyleSimple) + sizeof (void*) * (gnm_tile_size_row - 1); + tile_matrix_size = sizeof (CellTileStyleSimple) + sizeof (void*) * (gnm_tile_size_row * gnm_tile_size_col - 1); + } +} + union _CellTile { CellTileType const type; CellTileStyleSimple style_any; @@ -276,10 +303,10 @@ #if USE_TILE_POOLS static int tile_pool_users; static GOMemChunk *tile_pools[5]; -#define CHUNK_ALLOC(T,p) ((T*)go_mem_chunk_alloc (p)) +#define CHUNK_ALLOC(T,p, s) ((T*)go_mem_chunk_alloc (p)) #define CHUNK_FREE(p,v) go_mem_chunk_free ((p), (v)) #else -#define CHUNK_ALLOC(T,c) g_new (T,1) +#define CHUNK_ALLOC(T,c, s) ((T*)g_malloc (s)) #define CHUNK_FREE(p,v) g_free ((v)) #endif @@ -318,16 +345,16 @@ CellTile *res; #if USE_TILE_POOLS - res = CHUNK_ALLOC (CellTile, tile_pools[t]); + res = CHUNK_ALLOC (CellTile, tile_pools[t], 1); #else switch (t) { - case TILE_SIMPLE : res = (CellTile *)g_new (CellTileStyleSimple, 1); + case TILE_SIMPLE : res = (CellTile *) g_malloc (tile_simple_size); break; - case TILE_COL : res = (CellTile *)g_new (CellTileStyleCol, 1); + case TILE_COL : res = (CellTile *) g_malloc (tile_col_size); break; - case TILE_ROW : res = (CellTile *)g_new (CellTileStyleRow, 1); + case TILE_ROW : res = (CellTile *) g_malloc (tile_row_size); break; - case TILE_MATRIX : res = (CellTile *)g_new (CellTileStyleMatrix, 1); + case TILE_MATRIX : res = (CellTile *) g_malloc (tile_matrix_size); break; default : g_return_val_if_fail (FALSE, NULL); return NULL; @@ -355,7 +382,7 @@ g_return_val_if_fail (TILE_SIMPLE <= t->type && TILE_MATRIX >= t->type, NULL); - res = CHUNK_ALLOC (CellTilePtrMatrix, tile_pools[TILE_PTR_MATRIX]); + res = CHUNK_ALLOC (CellTilePtrMatrix, tile_pools[TILE_PTR_MATRIX], tile_matrix_size); *((CellTileType *)&(res->type)) = TILE_PTR_MATRIX; /* TODO : @@ -472,21 +499,21 @@ if (tile_pool_users++ == 0) { tile_pools[TILE_SIMPLE] = go_mem_chunk_new ("simple tile pool", - sizeof (CellTileStyleSimple), + tile_simple_size, 16 * 1024 - 128); tile_pools[TILE_COL] = go_mem_chunk_new ("column tile pool", - sizeof (CellTileStyleCol), + tile_col_size, 16 * 1024 - 128); tile_pools[TILE_ROW] = go_mem_chunk_new ("row tile pool", - sizeof (CellTileStyleRow), + tile_row_size, 16 * 1024 - 128); tile_pools[TILE_MATRIX] = go_mem_chunk_new ("matrix tile pool", - sizeof (CellTileStyleMatrix), + tile_matrix_size, MAX (16 * 1024 - 128, - 100 * sizeof (CellTileStyleMatrix))); + 100 * tile_matrix_size)); /* If this fails one day, just make two pools. */ g_assert (sizeof (CellTileStyleMatrix) == sizeof (CellTilePtrMatrix)); Index: src/sheet-style.h =================================================================== --- src/sheet-style.h (révision 16516) +++ src/sheet-style.h (copie de travail) @@ -81,6 +81,7 @@ /* For internal use only */ void sheet_style_unlink (Sheet *sheet, GnmStyle *st); +void sheet_style_init_tiles (void); G_END_DECLS Index: src/colrow.h =================================================================== --- src/colrow.h (révision 16516) +++ src/colrow.h (copie de travail) @@ -131,7 +131,7 @@ ColRowVisList *list); /* Misc */ -#define colrow_max(is_cols) ((is_cols) ? SHEET_MAX_COLS : SHEET_MAX_ROWS) +#define colrow_max(is_cols) ((is_cols) ? gnm_sheet_max_cols : gnm_sheet_max_rows) void colrow_reset_defaults (Sheet *sheet, gboolean is_cols, int maxima); int colrow_find_adjacent_visible (Sheet *sheet, gboolean is_cols, int index, gboolean forward); Index: src/gnumeric.h =================================================================== --- src/gnumeric.h (révision 16516) +++ src/gnumeric.h (copie de travail) @@ -8,9 +8,9 @@ G_BEGIN_DECLS -#define SHEET_MAX_ROWS (16*16*16*16) /* 0, 1, ... */ -#define SHEET_MAX_COLS (4*4*4*4) /* 0, 1, ... */ - +extern int gnm_sheet_max_rows, gnm_sheet_max_cols; +#define SHEET_MAX_COLS gnm_sheet_max_cols +#define SHEET_MAX_ROWS gnm_sheet_max_rows /* * Note: more than 364238 columns will introduce a column named TRUE. */ @@ -175,6 +175,8 @@ typedef struct _PrintInformation PrintInformation; typedef struct _SolverParameters SolverParameters; +typedef struct _GnmCanvasRect GnmCanvasRect; + G_END_DECLS #endif /* _GNM_GNUMERIC_H_ */ Index: plugins/excel/ms-excel-write.c =================================================================== --- plugins/excel/ms-excel-write.c (révision 16516) +++ plugins/excel/ms-excel-write.c (copie de travail) @@ -4900,6 +4900,8 @@ g_return_val_if_fail (sheet, NULL); g_return_val_if_fail (ewb, NULL); + esheet->col_xf = g_new (guint16, gnm_sheet_max_cols); + esheet->col_style = g_new (GnmStyle*, gnm_sheet_max_cols); excel_sheet_extent (sheet, &extent, esheet->col_style, XLS_MaxCol, maxrows, ewb->io_context); @@ -4968,6 +4970,8 @@ style_list_free (esheet->conditions); style_list_free (esheet->hlinks); style_list_free (esheet->validations); + g_free (esheet->col_style); + g_free (esheet->col_xf); g_free (esheet); } Index: plugins/excel/ms-excel-write.h =================================================================== --- plugins/excel/ms-excel-write.h (révision 16516) +++ plugins/excel/ms-excel-write.h (copie de travail) @@ -45,8 +45,8 @@ unsigned streamPos; guint32 boundsheetPos; gint32 max_col, max_row; - guint16 col_xf [SHEET_MAX_COLS]; - GnmStyle *col_style [SHEET_MAX_COLS]; + guint16 *col_xf; + GnmStyle **col_style; GnmStyleList *conditions, *hlinks, *validations; GSList *blips, *textboxes; GHashTable *comments;