1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "nsThebesFontEnumerator.h"
7 #include <stdint.h> // for uint32_t
8 #include "gfxPlatform.h" // for gfxPlatform
9 #include "mozilla/Assertions.h" // for MOZ_ASSERT_HELPER2
10 #include "nsCOMPtr.h" // for nsCOMPtr
11 #include "nsDebug.h" // for NS_ENSURE_ARG_POINTER
12 #include "nsError.h" // for NS_OK, NS_FAILED, nsresult
13 #include "nsIAtom.h" // for nsIAtom, NS_Atomize
14 #include "nsID.h"
15 #include "nsMemory.h" // for nsMemory
16 #include "nsString.h" // for nsAutoCString, nsAutoString, etc
17 #include "nsTArray.h" // for nsTArray, nsTArray_Impl, etc
18 #include "nscore.h" // for char16_t, NS_IMETHODIMP
19
NS_IMPL_ISUPPORTS(nsThebesFontEnumerator,nsIFontEnumerator)20 NS_IMPL_ISUPPORTS(nsThebesFontEnumerator, nsIFontEnumerator)
21
22 nsThebesFontEnumerator::nsThebesFontEnumerator()
23 {
24 }
25
26 NS_IMETHODIMP
EnumerateAllFonts(uint32_t * aCount,char16_t *** aResult)27 nsThebesFontEnumerator::EnumerateAllFonts(uint32_t *aCount,
28 char16_t ***aResult)
29 {
30 return EnumerateFonts (nullptr, nullptr, aCount, aResult);
31 }
32
33 NS_IMETHODIMP
EnumerateFonts(const char * aLangGroup,const char * aGeneric,uint32_t * aCount,char16_t *** aResult)34 nsThebesFontEnumerator::EnumerateFonts(const char *aLangGroup,
35 const char *aGeneric,
36 uint32_t *aCount,
37 char16_t ***aResult)
38 {
39 NS_ENSURE_ARG_POINTER(aCount);
40 NS_ENSURE_ARG_POINTER(aResult);
41
42 nsTArray<nsString> fontList;
43
44 nsAutoCString generic;
45 if (aGeneric)
46 generic.Assign(aGeneric);
47 else
48 generic.SetIsVoid(true);
49
50 nsCOMPtr<nsIAtom> langGroupAtom;
51 if (aLangGroup) {
52 nsAutoCString lowered;
53 lowered.Assign(aLangGroup);
54 ToLowerCase(lowered);
55 langGroupAtom = NS_Atomize(lowered);
56 }
57
58 nsresult rv = gfxPlatform::GetPlatform()->GetFontList(langGroupAtom, generic, fontList);
59
60 if (NS_FAILED(rv)) {
61 *aCount = 0;
62 *aResult = nullptr;
63 /* XXX in this case, do we want to return the CSS generics? */
64 return NS_OK;
65 }
66
67 char16_t **fs = static_cast<char16_t **>
68 (moz_xmalloc(fontList.Length() * sizeof(char16_t*)));
69 for (uint32_t i = 0; i < fontList.Length(); i++) {
70 fs[i] = ToNewUnicode(fontList[i]);
71 }
72
73 *aResult = fs;
74 *aCount = fontList.Length();
75
76 return NS_OK;
77 }
78
79 NS_IMETHODIMP
HaveFontFor(const char * aLangGroup,bool * aResult)80 nsThebesFontEnumerator::HaveFontFor(const char *aLangGroup,
81 bool *aResult)
82 {
83 NS_ENSURE_ARG_POINTER(aResult);
84
85 *aResult = true;
86 return NS_OK;
87 }
88
89 NS_IMETHODIMP
GetDefaultFont(const char * aLangGroup,const char * aGeneric,char16_t ** aResult)90 nsThebesFontEnumerator::GetDefaultFont(const char *aLangGroup,
91 const char *aGeneric,
92 char16_t **aResult)
93 {
94 NS_ENSURE_ARG_POINTER(aResult);
95 *aResult = nullptr;
96 return NS_OK;
97 }
98
99 NS_IMETHODIMP
UpdateFontList(bool * _retval)100 nsThebesFontEnumerator::UpdateFontList(bool *_retval)
101 {
102 gfxPlatform::GetPlatform()->UpdateFontList();
103 *_retval = false; // always return false for now
104 return NS_OK;
105 }
106
107 NS_IMETHODIMP
GetStandardFamilyName(const char16_t * aName,char16_t ** aResult)108 nsThebesFontEnumerator::GetStandardFamilyName(const char16_t *aName,
109 char16_t **aResult)
110 {
111 NS_ENSURE_ARG_POINTER(aResult);
112 NS_ENSURE_ARG_POINTER(aName);
113
114 nsAutoString name(aName);
115 if (name.IsEmpty()) {
116 *aResult = nullptr;
117 return NS_OK;
118 }
119
120 nsAutoString family;
121 nsresult rv = gfxPlatform::GetPlatform()->
122 GetStandardFamilyName(nsDependentString(aName), family);
123 if (NS_FAILED(rv) || family.IsEmpty()) {
124 *aResult = nullptr;
125 return NS_OK;
126 }
127 *aResult = ToNewUnicode(family);
128 return NS_OK;
129 }
130