2 Name: LibSharedMedia-3.0
3 Revision: $Revision: 87 $
4 Author: Elkano (elkano@gmx.de)
5 Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
6 Website: http://www.wowace.com/projects/libsharedmedia-3-0/
7 Description: Shared handling of media data (fonts, sounds, textures, ...) between addons.
8 Dependencies: LibStub, CallbackHandler-1.0
12 local MAJOR, MINOR = "LibSharedMedia-3.0", 5000404 -- 5.0.4 v4 / increase manually on changes
13 local lib = LibStub:NewLibrary(MAJOR, MINOR)
15 if not lib then return end
19 local pairs = _G.pairs
22 local band = _G.bit.band
24 local table_insert = _G.table.insert
25 local table_sort = _G.table.sort
27 local locale = GetLocale()
28 local locale_is_western
30 lib.LOCALE_BIT_koKR = 1
31 lib.LOCALE_BIT_ruRU = 2
32 lib.LOCALE_BIT_zhCN = 4
33 lib.LOCALE_BIT_zhTW = 8
34 lib.LOCALE_BIT_western = 128
36 local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
38 lib.callbacks = lib.callbacks or CallbackHandler:New(lib)
40 lib.DefaultMedia = lib.DefaultMedia or {}
41 lib.MediaList = lib.MediaList or {}
42 lib.MediaTable = lib.MediaTable or {}
43 lib.MediaType = lib.MediaType or {}
44 lib.OverrideMedia = lib.OverrideMedia or {}
46 local defaultMedia = lib.DefaultMedia
47 local mediaList = lib.MediaList
48 local mediaTable = lib.MediaTable
49 local overrideMedia = lib.OverrideMedia
52 -- create mediatype constants
53 lib.MediaType.BACKGROUND = "background" -- background textures
54 lib.MediaType.BORDER = "border" -- border textures
55 lib.MediaType.FONT = "font" -- fonts
56 lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures
57 lib.MediaType.SOUND = "sound" -- sound files
59 -- populate lib with default Blizzard data
61 if not lib.MediaTable.background then lib.MediaTable.background = {} end
62 lib.MediaTable.background["None"] = [[]]
63 lib.MediaTable.background["Blizzard Dialog Background"] = [[Interface\DialogFrame\UI-DialogBox-Background]]
64 lib.MediaTable.background["Blizzard Dialog Background Dark"] = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
65 lib.MediaTable.background["Blizzard Dialog Background Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
66 lib.MediaTable.background["Blizzard Low Health"] = [[Interface\FullScreenTextures\LowHealth]]
67 lib.MediaTable.background["Blizzard Marble"] = [[Interface\FrameGeneral\UI-Background-Marble]]
68 lib.MediaTable.background["Blizzard Out of Control"] = [[Interface\FullScreenTextures\OutOfControl]]
69 lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
70 lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]
71 lib.MediaTable.background["Blizzard Rock"] = [[Interface\FrameGeneral\UI-Background-Rock]]
72 lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]]
73 lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]]
74 lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]]
75 lib.DefaultMedia.background = "None"
78 if not lib.MediaTable.border then lib.MediaTable.border = {} end
79 lib.MediaTable.border["None"] = [[]]
80 lib.MediaTable.border["Blizzard Achievement Wood"] = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]]
81 lib.MediaTable.border["Blizzard Chat Bubble"] = [[Interface\Tooltips\ChatBubble-Backdrop]]
82 lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]]
83 lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
84 lib.MediaTable.border["Blizzard Party"] = [[Interface\CHARACTERFRAME\UI-Party-Border]]
85 lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]]
86 lib.DefaultMedia.border = "None"
89 if not lib.MediaTable.font then lib.MediaTable.font = {} end
90 local SML_MT_font = lib.MediaTable.font
92 All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
94 file name latin koKR ruRU zhCN zhTW
95 2002.ttf 2002 X X X - -
96 2002B.ttf 2002 Bold X X X - -
97 ARHei.ttf AR CrystalzcuheiGBK Demibold X - X X X
98 ARIALN.TTF Arial Narrow X - X - -
99 ARKai_C.ttf AR ZhongkaiGBK Medium (Combat) X - X X X
100 ARKai_T.ttf AR ZhongkaiGBK Medium X - X X X
101 bHEI00M.ttf AR Heiti2 Medium B5 - - - - X
102 bHEI01B.ttf AR Heiti2 Bold B5 - - - - X
103 bKAI00M.ttf AR Kaiti Medium B5 - - - - X
104 bLEI00D.ttf AR Leisu Demi B5 - - - - X
105 FRIZQT__.TTF Friz Quadrata TT X - - - -
106 FRIZQT___CYR.TTF FrizQuadrataCTT - - X - -
107 K_Damage.TTF YDIWingsM - X X - -
108 K_Pagetext.TTF MoK X X X - -
109 MORPHEUS.TTF Morpheus X - - - -
110 MORPHEUS_CYR.TTF Morpheus X - X - -
111 NIM_____.ttf Nimrod MT X - X - -
112 SKURRI.TTF Skurri X - - - -
113 SKURRI_CYR.TTF Skurri X - X - -
115 WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
116 Due to this, we cannot use it as a replacement for FRIZQT__.TTF
119 if locale == "koKR" then
120 LOCALE_MASK = lib.LOCALE_BIT_koKR
122 SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]]
123 SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]]
124 SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]]
125 SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]]
127 lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
129 elseif locale == "zhCN" then
130 LOCALE_MASK = lib.LOCALE_BIT_zhCN
132 SML_MT_font["伤害数字"] = [[Fonts\ARKai_C.ttf]]
133 SML_MT_font["默认"] = [[Fonts\ARKai_T.ttf]]
134 SML_MT_font["聊天"] = [[Fonts\ARHei.ttf]]
136 lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
138 elseif locale == "zhTW" then
139 LOCALE_MASK = lib.LOCALE_BIT_zhTW
141 SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]]
142 SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]]
143 SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]]
144 SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]]
146 lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
148 elseif locale == "ruRU" then
149 LOCALE_MASK = lib.LOCALE_BIT_ruRU
151 SML_MT_font["2002"] = [[Fonts\2002.TTF]]
152 SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]]
153 SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]]
154 SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]]
155 SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]]
156 SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]]
157 SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT___CYR.TTF]]
158 SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]]
159 SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]]
160 SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]]
161 SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]]
163 lib.DefaultMedia.font = "Friz Quadrata TT"
166 LOCALE_MASK = lib.LOCALE_BIT_western
167 locale_is_western = true
169 SML_MT_font["2002"] = [[Fonts\2002.TTF]]
170 SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]]
171 SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]]
172 SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]]
173 SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]]
174 SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]]
175 SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]]
176 SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]]
177 SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]]
178 SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]]
179 SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]]
181 lib.DefaultMedia.font = "Friz Quadrata TT"
186 if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
187 lib.MediaTable.statusbar["Blizzard"] = [[Interface\TargetingFrame\UI-StatusBar]]
188 lib.MediaTable.statusbar["Blizzard Character Skills Bar"] = [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
189 lib.MediaTable.statusbar["Blizzard Raid Bar"] = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
190 lib.DefaultMedia.statusbar = "Blizzard"
193 if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
194 lib.MediaTable.sound["None"] = [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
195 lib.DefaultMedia.sound = "None"
197 local function rebuildMediaList(mediatype)
198 local mtable = mediaTable[mediatype]
199 if not mtable then return end
200 if not mediaList[mediatype] then mediaList[mediatype] = {} end
201 local mlist = mediaList[mediatype]
202 -- list can only get larger, so simply overwrite it
204 for k in pairs(mtable) do
211 function lib:Register(mediatype, key, data, langmask)
212 if type(mediatype) ~= "string" then
213 error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
215 if type(key) ~= "string" then
216 error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
218 mediatype = mediatype:lower()
219 if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
220 if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
221 local mtable = mediaTable[mediatype]
222 if mtable[key] then return false end
225 rebuildMediaList(mediatype)
226 self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
230 function lib:Fetch(mediatype, key, noDefault)
231 local mtt = mediaTable[mediatype]
232 local overridekey = overrideMedia[mediatype]
233 local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil
234 return result ~= "" and result or nil
237 function lib:IsValid(mediatype, key)
238 return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
241 function lib:HashTable(mediatype)
242 return mediaTable[mediatype]
245 function lib:List(mediatype)
246 if not mediaTable[mediatype] then
249 if not mediaList[mediatype] then
250 rebuildMediaList(mediatype)
252 return mediaList[mediatype]
255 function lib:GetGlobal(mediatype)
256 return overrideMedia[mediatype]
259 function lib:SetGlobal(mediatype, key)
260 if not mediaTable[mediatype] then
263 overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
264 self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
268 function lib:GetDefault(mediatype)
269 return defaultMedia[mediatype]
272 function lib:SetDefault(mediatype, key)
273 if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
274 defaultMedia[mediatype] = key