diff options
author | Jacques Lucke <jacques@blender.org> | 2020-10-30 17:59:34 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-10-30 18:01:26 +0300 |
commit | 12c92433d857311e4f4decb4794907a7c7938b36 (patch) | |
tree | ecd52452a5451f16fdf37ebeeae04ca49b330d02 /source/blender | |
parent | e6f61a4a379bbb80296131fae0cef178e2145e52 (diff) |
Refactor: move bScreen .blend I/O to IDTypeInfo callbacks
I could not easily move `direct_link_screen` yet, because it
has a return value. That has to be solved differently at some point.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/screen.c | 40 | ||||
-rw-r--r-- | source/blender/blenloader/BLO_read_write.h | 8 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 22 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 28 |
4 files changed, 55 insertions, 43 deletions
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index cfe52dd40e6..a357b5d98fb 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -56,6 +56,7 @@ #include "BKE_icons.h" #include "BKE_idprop.h" #include "BKE_idtype.h" +#include "BKE_lib_id.h" #include "BKE_lib_query.h" #include "BKE_node.h" #include "BKE_screen.h" @@ -236,6 +237,40 @@ static void screen_foreach_id(ID *id, LibraryForeachIDData *data) } } +static void screen_blend_write(BlendWriter *writer, ID *id, const void *id_address) +{ + bScreen *screen = (bScreen *)id; + /* Screens are reference counted, only saved if used by a workspace. */ + if (screen->id.us > 0 || BLO_write_is_undo(writer)) { + /* write LibData */ + /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ + BLO_write_struct_at_address_with_filecode(writer, ID_SCRN, bScreen, id_address, screen); + BKE_id_blend_write(writer, &screen->id); + + BKE_previewimg_blend_write(writer, screen->preview); + + /* direct data */ + BKE_screen_area_map_blend_write(writer, AREAMAP_FROM_SCREEN(screen)); + } +} + +/* note: file read without screens option G_FILE_NO_UI; + * check lib pointers in call below */ +static void screen_blend_read_lib(BlendLibReader *reader, ID *id) +{ + bScreen *screen = (bScreen *)id; + /* deprecated, but needed for versioning (will be NULL'ed then) */ + BLO_read_id_address(reader, screen->id.lib, &screen->scene); + + screen->animtimer = NULL; /* saved in rare cases */ + screen->tool_tip = NULL; + screen->scrubbing = false; + + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + BKE_screen_area_blend_read_lib(reader, &screen->id, area); + } +} + IDTypeInfo IDType_ID_SCR = { .id_code = ID_SCR, .id_filter = 0, @@ -253,9 +288,10 @@ IDTypeInfo IDType_ID_SCR = { .foreach_id = screen_foreach_id, .foreach_cache = NULL, - .blend_write = NULL, + .blend_write = screen_blend_write, + /* Cannot be used yet, because #direct_link_screen has a return value. */ .blend_read_data = NULL, - .blend_read_lib = NULL, + .blend_read_lib = screen_blend_read_lib, .blend_read_expand = NULL, }; diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h index 001b1c8b8a9..56b51bf3096 100644 --- a/source/blender/blenloader/BLO_read_write.h +++ b/source/blender/blenloader/BLO_read_write.h @@ -106,6 +106,14 @@ void BLO_write_struct_at_address_by_id(BlendWriter *writer, BLO_write_struct_at_address_by_id( \ writer, BLO_get_struct_id(writer, struct_name), address, data_ptr) +/* Write single struct at address and specify a filecode. */ +void BLO_write_struct_at_address_by_id_with_filecode( + BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr); +#define BLO_write_struct_at_address_with_filecode( \ + writer, filecode, struct_name, address, data_ptr) \ + BLO_write_struct_at_address_by_id_with_filecode( \ + writer, filecode, BLO_get_struct_id(writer, struct_name), address, data_ptr) + /* Write struct array. */ void BLO_write_struct_array_by_name(BlendWriter *writer, const char *struct_name, diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 466243d4e52..6f305a5613f 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4753,22 +4753,6 @@ static void lib_link_windowmanager(BlendLibReader *reader, wmWindowManager *wm) /** \name Read ID: Screen * \{ */ -/* note: file read without screens option G_FILE_NO_UI; - * check lib pointers in call below */ -static void lib_link_screen(BlendLibReader *reader, bScreen *screen) -{ - /* deprecated, but needed for versioning (will be NULL'ed then) */ - BLO_read_id_address(reader, screen->id.lib, &screen->scene); - - screen->animtimer = NULL; /* saved in rare cases */ - screen->tool_tip = NULL; - screen->scrubbing = false; - - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - BKE_screen_area_blend_read_lib(reader, &screen->id, area); - } -} - /* how to handle user count on pointer restore */ typedef enum ePointerUserMode { USER_IGNORE = 0, /* ignore user count */ @@ -6158,11 +6142,6 @@ static void lib_link_all(FileData *fd, Main *bmain) case ID_OB: lib_link_object(&reader, (Object *)id); break; - case ID_SCR: - /* DO NOT skip screens here, 3D viewport may contains pointers - * to other ID data (like #View3D.ob_center)! See T41411. */ - lib_link_screen(&reader, (bScreen *)id); - break; case ID_IP: /* XXX deprecated... still needs to be maintained for version patches still. */ lib_link_ipo(&reader, (Ipo *)id); @@ -6170,6 +6149,7 @@ static void lib_link_all(FileData *fd, Main *bmain) case ID_LI: lib_link_library(&reader, (Library *)id); /* Only init users. */ break; + case ID_SCR: case ID_PA: case ID_GR: case ID_ME: diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 1a5310b82ad..bcfc5778f1d 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1662,22 +1662,6 @@ static void write_windowmanager(BlendWriter *writer, wmWindowManager *wm, const } } -static void write_screen(BlendWriter *writer, bScreen *screen, const void *id_address) -{ - /* Screens are reference counted, only saved if used by a workspace. */ - if (screen->id.us > 0 || BLO_write_is_undo(writer)) { - /* write LibData */ - /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ - writestruct_at_address(writer->wd, ID_SCRN, bScreen, 1, id_address, screen); - BKE_id_blend_write(writer, &screen->id); - - BKE_previewimg_blend_write(writer, screen->preview); - - /* direct data */ - BKE_screen_area_map_blend_write(writer, AREAMAP_FROM_SCREEN(screen)); - } -} - static void write_workspace(BlendWriter *writer, WorkSpace *workspace, const void *id_address) { BLO_write_id_struct(writer, WorkSpace, id_address, &workspace->id); @@ -1957,15 +1941,13 @@ static bool write_file_handle(Main *mainvar, case ID_WS: write_workspace(&writer, (WorkSpace *)id_buffer, id); break; - case ID_SCR: - write_screen(&writer, (bScreen *)id_buffer, id); - break; case ID_SCE: write_scene(&writer, (Scene *)id_buffer, id); break; case ID_OB: write_object(&writer, (Object *)id_buffer, id); break; + case ID_SCR: case ID_PA: case ID_GR: case ID_ME: @@ -2302,7 +2284,13 @@ void BLO_write_struct_at_address_by_id(BlendWriter *writer, const void *address, const void *data_ptr) { - writestruct_at_address_nr(writer->wd, DATA, struct_id, 1, address, data_ptr); + BLO_write_struct_at_address_by_id_with_filecode(writer, DATA, struct_id, address, data_ptr); +} + +void BLO_write_struct_at_address_by_id_with_filecode( + BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr) +{ + writestruct_at_address_nr(writer->wd, filecode, struct_id, 1, address, data_ptr); } void BLO_write_struct_array_by_id(BlendWriter *writer, |