42aacdfa47d664b4b6a501896e90ecdcee4314f4
[wowui.git] / libs / LibSharedMedia-3.0 / LibSharedMedia-3.0 / LibSharedMedia-3.0.lua
1 --[[
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
9 License: LGPL v2.1
10 ]]
11
12 local MAJOR, MINOR = "LibSharedMedia-3.0", 5000404 -- 5.0.4 v4 / increase manually on changes
13 local lib = LibStub:NewLibrary(MAJOR, MINOR)
14
15 if not lib then return end
16
17 local _G = getfenv(0)
18
19 local pairs             = _G.pairs
20 local type              = _G.type
21
22 local band                      = _G.bit.band
23
24 local table_insert      = _G.table.insert
25 local table_sort        = _G.table.sort
26
27 local locale = GetLocale()
28 local locale_is_western
29 local LOCALE_MASK = 0
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
35
36 local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
37
38 lib.callbacks           = lib.callbacks                 or CallbackHandler:New(lib)
39
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 {}
45
46 local defaultMedia = lib.DefaultMedia
47 local mediaList = lib.MediaList
48 local mediaTable = lib.MediaTable
49 local overrideMedia = lib.OverrideMedia
50
51
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
58
59 -- populate lib with default Blizzard data
60 -- BACKGROUND
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"
76
77 -- BORDER
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"
87
88 -- FONT
89 if not lib.MediaTable.font then lib.MediaTable.font = {} end
90 local SML_MT_font = lib.MediaTable.font
91 --[[
92 All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
93
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               -               -
114
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
117 ]]
118
119 if locale == "koKR" then
120         LOCALE_MASK = lib.LOCALE_BIT_koKR
121 --
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]]
126 --
127         lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
128 --
129 elseif locale == "zhCN" then
130         LOCALE_MASK = lib.LOCALE_BIT_zhCN
131 --
132         SML_MT_font["伤害数字"]             = [[Fonts\ARKai_C.ttf]]
133         SML_MT_font["默认"]                   = [[Fonts\ARKai_T.ttf]]
134         SML_MT_font["聊天"]                   = [[Fonts\ARHei.ttf]]
135 --
136         lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
137 --
138 elseif locale == "zhTW" then
139         LOCALE_MASK = lib.LOCALE_BIT_zhTW
140 --
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]]
145 --
146         lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
147
148 elseif locale == "ruRU" then
149         LOCALE_MASK = lib.LOCALE_BIT_ruRU
150 --
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]]
162 --
163         lib.DefaultMedia.font = "Friz Quadrata TT"
164 --
165 else
166         LOCALE_MASK = lib.LOCALE_BIT_western
167         locale_is_western = true
168 --
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]]
180 --
181         lib.DefaultMedia.font = "Friz Quadrata TT"
182 --
183 end
184
185 -- STATUSBAR
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"
191
192 -- SOUND
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"
196
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
203         local i = 0
204         for k in pairs(mtable) do
205                 i = i + 1
206                 mlist[i] = k
207         end
208         table_sort(mlist)
209 end
210
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))
214         end
215         if type(key) ~= "string" then
216                 error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
217         end
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
223
224         mtable[key] = data
225         rebuildMediaList(mediatype)
226         self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
227         return true
228 end
229
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
235 end
236
237 function lib:IsValid(mediatype, key)
238         return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
239 end
240
241 function lib:HashTable(mediatype)
242         return mediaTable[mediatype]
243 end
244
245 function lib:List(mediatype)
246         if not mediaTable[mediatype] then
247                 return nil
248         end
249         if not mediaList[mediatype] then
250                 rebuildMediaList(mediatype)
251         end
252         return mediaList[mediatype]
253 end
254
255 function lib:GetGlobal(mediatype)
256         return overrideMedia[mediatype]
257 end
258
259 function lib:SetGlobal(mediatype, key)
260         if not mediaTable[mediatype] then
261                 return false
262         end
263         overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
264         self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
265         return true
266 end
267
268 function lib:GetDefault(mediatype)
269         return defaultMedia[mediatype]
270 end
271
272 function lib:SetDefault(mediatype, key)
273         if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
274                 defaultMedia[mediatype] = key
275                 return true
276         else
277                 return false
278         end
279 end