From ea740fd160ff20352dcb0e77b5817dfdf0e9f31a Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 14 Mar 2017 14:28:05 -0400 Subject: [PATCH] Fixes problems with icon overlays (#24530) * Fixes problems with icon overlays * Rename this to prevent confusion * Well somehow that fixed it --- .../subsystem/processing/overlays.dm | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/code/controllers/subsystem/processing/overlays.dm b/code/controllers/subsystem/processing/overlays.dm index 573c7b2a1de..16586a09e02 100644 --- a/code/controllers/subsystem/processing/overlays.dm +++ b/code/controllers/subsystem/processing/overlays.dm @@ -10,11 +10,13 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays stat_tag = "Ov" currentrun = null var/list/overlay_icon_state_caches + var/list/overlay_icon_cache var/initialized = FALSE /datum/controller/subsystem/processing/overlays/New() NEW_SS_GLOBAL(SSoverlays) LAZYINITLIST(overlay_icon_state_caches) + LAZYINITLIST(overlay_icon_cache) /datum/controller/subsystem/processing/overlays/Initialize() initialized = TRUE @@ -23,6 +25,7 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays /datum/controller/subsystem/processing/overlays/Recover() overlay_icon_state_caches = SSoverlays.overlay_icon_state_caches + overlay_icon_cache = SSoverlays.overlay_icon_cache processing = SSoverlays.processing /datum/controller/subsystem/processing/overlays/fire(resumed = FALSE, mc_check = TRUE) @@ -53,7 +56,7 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays overlays.Cut() flags &= ~OVERLAY_QUEUED -/atom/proc/iconstate2appearance(iconstate) +/proc/iconstate2appearance(icon, iconstate) var/static/image/stringbro = new() var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches var/list/cached_icon = icon_states_cache[icon] @@ -70,6 +73,33 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays cached_icon["[iconstate]"] = cached_appearance return cached_appearance +/proc/icon2appearance(icon) + var/static/image/iconbro = new() + var/list/icon_cache = SSoverlays.overlay_icon_cache + . = icon_cache[icon] + if (!.) + iconbro.icon = icon + . = iconbro.appearance + icon_cache[icon] = . + +/atom/proc/build_appearance_list(new_overlays) + var/static/image/appearance_bro = new() + if (!islist(new_overlays)) + new_overlays = list(new_overlays) + else + listclearnulls(new_overlays) + for (var/i in 1 to length(new_overlays)) + var/image/cached_overlay = new_overlays[i] + if (istext(cached_overlay)) + new_overlays[i] = iconstate2appearance(icon, cached_overlay) + else if(isicon(cached_overlay)) + new_overlays[i] = icon2appearance(cached_overlay) + else //image probable + appearance_bro.appearance = cached_overlay + appearance_bro.dir = cached_overlay.dir + new_overlays[i] = appearance_bro.appearance + return new_overlays + #define NOT_QUEUED_ALREADY (!(flags & OVERLAY_QUEUED)) #define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.processing += src; /atom/proc/cut_overlays(priority = FALSE) @@ -90,22 +120,10 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays QUEUE_FOR_COMPILE /atom/proc/cut_overlay(list/overlays, priority) - var/static/image/appearance_bro = new() if(!overlays) return - if (!islist(overlays)) - overlays = list(overlays) - else - listclearnulls(overlays) - for (var/i in 1 to length(overlays)) - if (istext(overlays[i])) - overlays[i] = iconstate2appearance(overlays[i]) - else - var/image/I = overlays[i] - appearance_bro.appearance = overlays[i] - appearance_bro.dir = I.dir - overlays[i] = appearance_bro.appearance + overlays = build_appearance_list(overlays) var/list/cached_overlays = our_overlays //sanic var/list/cached_priority = priority_overlays @@ -120,22 +138,10 @@ var/datum/controller/subsystem/processing/overlays/SSoverlays QUEUE_FOR_COMPILE /atom/proc/add_overlay(list/overlays, priority = FALSE) - var/static/image/appearance_bro = new() if(!overlays) return - if (!islist(overlays)) - overlays = list(overlays) - else - listclearnulls(overlays) - for (var/i in 1 to length(overlays)) - if (istext(overlays[i])) - overlays[i] = iconstate2appearance(overlays[i]) - else - var/image/I = overlays[i] - appearance_bro.appearance = overlays[i] - appearance_bro.dir = I.dir - overlays[i] = appearance_bro.appearance + overlays = build_appearance_list(overlays) LAZYINITLIST(our_overlays) //always initialized after this point LAZYINITLIST(priority_overlays)