Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 # HG changeset patch
2 # Parent 9ee29e4aace683ddf6cf8ddb2893cd34fcfc772c
3 # User James Willcox <jwillcox@mozilla.com>
4 diff --git a/gfx/skia/Makefile.in b/gfx/skia/Makefile.in
5 --- a/gfx/skia/Makefile.in
6 +++ b/gfx/skia/Makefile.in
7 @@ -305,21 +305,20 @@ CPPSRCS += \
8 SkFontHost_mac_coretext.cpp \
9 SkTime_Unix.cpp \
10 $(NULL)
11 endif
13 ifeq (android,$(MOZ_WIDGET_TOOLKIT))
14 CPPSRCS += \
15 SkFontHost_FreeType.cpp \
16 SkFontHost_android.cpp \
17 SkFontHost_gamma.cpp \
18 - FontHostConfiguration_android.cpp \
19 SkMMapStream.cpp \
20 SkTime_Unix.cpp \
21 $(NULL)
23 DEFINES += -DSK_BUILD_FOR_ANDROID_NDK
24 OS_CXXFLAGS += $(CAIRO_FT_CFLAGS)
25 endif
27 ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
28 CPPSRCS += \
29 diff --git a/gfx/skia/src/ports/SkFontHost_android.cpp b/gfx/skia/src/ports/SkFontHost_android.cpp
30 --- a/gfx/skia/src/ports/SkFontHost_android.cpp
31 +++ b/gfx/skia/src/ports/SkFontHost_android.cpp
32 @@ -1,38 +1,31 @@
33 +
34 /*
35 -**
36 -** Copyright 2006, The Android Open Source Project
37 -**
38 -** Licensed under the Apache License, Version 2.0 (the "License");
39 -** you may not use this file except in compliance with the License.
40 -** You may obtain a copy of the License at
41 -**
42 -** http://www.apache.org/licenses/LICENSE-2.0
43 -**
44 -** Unless required by applicable law or agreed to in writing, software
45 -** distributed under the License is distributed on an "AS IS" BASIS,
46 -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47 -** See the License for the specific language governing permissions and
48 -** limitations under the License.
49 -*/
50 + * Copyright 2006 The Android Open Source Project
51 + *
52 + * Use of this source code is governed by a BSD-style license that can be
53 + * found in the LICENSE file.
54 + */
55 +
57 #include "SkFontHost.h"
58 #include "SkDescriptor.h"
59 #include "SkMMapStream.h"
60 #include "SkPaint.h"
61 #include "SkString.h"
62 #include "SkStream.h"
63 #include "SkThread.h"
64 #include "SkTSearch.h"
65 -#include "FontHostConfiguration_android.h"
66 #include <stdio.h>
68 +#define FONT_CACHE_MEMORY_BUDGET (768 * 1024)
69 +
70 #ifndef SK_FONT_FILE_PREFIX
71 #define SK_FONT_FILE_PREFIX "/fonts/"
72 #endif
74 SkTypeface::Style find_name_and_attributes(SkStream* stream, SkString* name,
75 bool* isFixedWidth);
77 static void GetFullPathForSysFonts(SkString* full, const char name[]) {
78 full->set(getenv("ANDROID_ROOT"));
79 full->append(SK_FONT_FILE_PREFIX);
80 @@ -99,21 +92,21 @@ static SkTypeface* find_best_face(const
81 if (faces[SkTypeface::kNormal] != NULL) {
82 return faces[SkTypeface::kNormal];
83 }
84 // look for anything
85 for (int i = 0; i < 4; i++) {
86 if (faces[i] != NULL) {
87 return faces[i];
88 }
89 }
90 // should never get here, since the faces list should not be empty
91 - SkDEBUGFAIL("faces list is empty");
92 + SkASSERT(!"faces list is empty");
93 return NULL;
94 }
96 static FamilyRec* find_family(const SkTypeface* member) {
97 FamilyRec* curr = gFamilyHead;
98 while (curr != NULL) {
99 for (int i = 0; i < 4; i++) {
100 if (curr->fFaces[i] == member) {
101 return curr;
102 }
103 @@ -138,31 +131,27 @@ static SkTypeface* find_from_uniqueID(ui
104 curr = curr->fNext;
105 }
106 return NULL;
107 }
109 /* Remove reference to this face from its family. If the resulting family
110 is empty (has no faces), return that family, otherwise return NULL
111 */
112 static FamilyRec* remove_from_family(const SkTypeface* face) {
113 FamilyRec* family = find_family(face);
114 - if (family) {
115 - SkASSERT(family->fFaces[face->style()] == face);
116 - family->fFaces[face->style()] = NULL;
117 + SkASSERT(family->fFaces[face->style()] == face);
118 + family->fFaces[face->style()] = NULL;
120 - for (int i = 0; i < 4; i++) {
121 - if (family->fFaces[i] != NULL) { // family is non-empty
122 - return NULL;
123 - }
124 + for (int i = 0; i < 4; i++) {
125 + if (family->fFaces[i] != NULL) { // family is non-empty
126 + return NULL;
127 }
128 - } else {
129 -// SkDebugf("remove_from_family(%p) face not found", face);
130 }
131 return family; // return the empty family
132 }
134 // maybe we should make FamilyRec be doubly-linked
135 static void detach_and_delete_family(FamilyRec* family) {
136 FamilyRec* curr = gFamilyHead;
137 FamilyRec* prev = NULL;
139 while (curr != NULL) {
140 @@ -172,21 +161,21 @@ static void detach_and_delete_family(Fam
141 gFamilyHead = next;
142 } else {
143 prev->fNext = next;
144 }
145 SkDELETE(family);
146 return;
147 }
148 prev = curr;
149 curr = next;
150 }
151 - SkDEBUGFAIL("Yikes, couldn't find family in our list to remove/delete");
152 + SkASSERT(!"Yikes, couldn't find family in our list to remove/delete");
153 }
155 static SkTypeface* find_typeface(const char name[], SkTypeface::Style style) {
156 NameFamilyPair* list = gNameList.begin();
157 int count = gNameList.count();
159 int index = SkStrLCSearch(&list[0].fName, count, name, sizeof(list[0]));
161 if (index >= 0) {
162 return find_best_face(list[index].fFamily, style);
163 @@ -387,111 +376,90 @@ static bool get_name_and_style(const cha
164 }
165 return false;
166 }
168 // used to record our notion of the pre-existing fonts
169 struct FontInitRec {
170 const char* fFileName;
171 const char* const* fNames; // null-terminated list
172 };
174 +static const char* gSansNames[] = {
175 + "sans-serif", "arial", "helvetica", "tahoma", "verdana", NULL
176 +};
177 +
178 +static const char* gSerifNames[] = {
179 + "serif", "times", "times new roman", "palatino", "georgia", "baskerville",
180 + "goudy", "fantasy", "cursive", "ITC Stone Serif", NULL
181 +};
182 +
183 +static const char* gMonoNames[] = {
184 + "monospace", "courier", "courier new", "monaco", NULL
185 +};
186 +
187 // deliberately empty, but we use the address to identify fallback fonts
188 static const char* gFBNames[] = { NULL };
190 +/* Fonts must be grouped by family, with the first font in a family having the
191 + list of names (even if that list is empty), and the following members having
192 + null for the list. The names list must be NULL-terminated
193 +*/
194 +static const FontInitRec gSystemFonts[] = {
195 + { "DroidSans.ttf", gSansNames },
196 + { "DroidSans-Bold.ttf", NULL },
197 + { "DroidSerif-Regular.ttf", gSerifNames },
198 + { "DroidSerif-Bold.ttf", NULL },
199 + { "DroidSerif-Italic.ttf", NULL },
200 + { "DroidSerif-BoldItalic.ttf", NULL },
201 + { "DroidSansMono.ttf", gMonoNames },
202 + /* These are optional, and can be ignored if not found in the file system.
203 + These are appended to gFallbackFonts[] as they are seen, so we list
204 + them in the order we want them to be accessed by NextLogicalFont().
205 + */
206 + { "DroidSansArabic.ttf", gFBNames },
207 + { "DroidSansHebrew.ttf", gFBNames },
208 + { "DroidSansThai.ttf", gFBNames },
209 + { "MTLmr3m.ttf", gFBNames }, // Motoya Japanese Font
210 + { "MTLc3m.ttf", gFBNames }, // Motoya Japanese Font
211 + { "DroidSansJapanese.ttf", gFBNames },
212 + { "DroidSansFallback.ttf", gFBNames }
213 +};
215 -/* Fonts are grouped by family, with the first font in a family having the
216 - list of names (even if that list is empty), and the following members having
217 - null for the list. The names list must be NULL-terminated.
218 -*/
219 -static FontInitRec *gSystemFonts;
220 -static size_t gNumSystemFonts = 0;
221 -
222 -#define SYSTEM_FONTS_FILE "/system/etc/system_fonts.cfg"
223 +#define DEFAULT_NAMES gSansNames
225 // these globals are assigned (once) by load_system_fonts()
226 static FamilyRec* gDefaultFamily;
227 static SkTypeface* gDefaultNormal;
228 -static char** gDefaultNames = NULL;
229 -static uint32_t *gFallbackFonts;
231 -/* Load info from a configuration file that populates the system/fallback font structures
232 -*/
233 -static void load_font_info() {
234 -// load_font_info_xml("/system/etc/system_fonts.xml");
235 - SkTDArray<FontFamily*> fontFamilies;
236 - getFontFamilies(fontFamilies);
237 -
238 - SkTDArray<FontInitRec> fontInfo;
239 - bool firstInFamily = false;
240 - for (int i = 0; i < fontFamilies.count(); ++i) {
241 - FontFamily *family = fontFamilies[i];
242 - firstInFamily = true;
243 - for (int j = 0; j < family->fFileNames.count(); ++j) {
244 - FontInitRec fontInfoRecord;
245 - fontInfoRecord.fFileName = family->fFileNames[j];
246 - if (j == 0) {
247 - if (family->fNames.count() == 0) {
248 - // Fallback font
249 - fontInfoRecord.fNames = (char **)gFBNames;
250 - } else {
251 - SkTDArray<const char*> names = family->fNames;
252 - const char **nameList = (const char**)
253 - malloc((names.count() + 1) * sizeof(char*));
254 - if (nameList == NULL) {
255 - // shouldn't get here
256 - break;
257 - }
258 - if (gDefaultNames == NULL) {
259 - gDefaultNames = (char**) nameList;
260 - }
261 - for (int i = 0; i < names.count(); ++i) {
262 - nameList[i] = names[i];
263 - }
264 - nameList[names.count()] = NULL;
265 - fontInfoRecord.fNames = nameList;
266 - }
267 - } else {
268 - fontInfoRecord.fNames = NULL;
269 - }
270 - *fontInfo.append() = fontInfoRecord;
271 - }
272 - }
273 - gNumSystemFonts = fontInfo.count();
274 - gSystemFonts = (FontInitRec*) malloc(gNumSystemFonts * sizeof(FontInitRec));
275 - gFallbackFonts = (uint32_t*) malloc((gNumSystemFonts + 1) * sizeof(uint32_t));
276 - if (gSystemFonts == NULL) {
277 - // shouldn't get here
278 - gNumSystemFonts = 0;
279 - }
280 - for (size_t i = 0; i < gNumSystemFonts; ++i) {
281 - gSystemFonts[i].fFileName = fontInfo[i].fFileName;
282 - gSystemFonts[i].fNames = fontInfo[i].fNames;
283 - }
284 - fontFamilies.deleteAll();
285 -}
286 +/* This is sized conservatively, assuming that it will never be a size issue.
287 + It will be initialized in load_system_fonts(), and will be filled with the
288 + fontIDs that can be used for fallback consideration, in sorted order (sorted
289 + meaning element[0] should be used first, then element[1], etc. When we hit
290 + a fontID==0 in the array, the list is done, hence our allocation size is
291 + +1 the total number of possible system fonts. Also see NextLogicalFont().
292 + */
293 +static uint32_t gFallbackFonts[SK_ARRAY_COUNT(gSystemFonts)+1];
295 /* Called once (ensured by the sentinel check at the beginning of our body).
296 Initializes all the globals, and register the system fonts.
297 */
298 static void load_system_fonts() {
299 // check if we've already be called
300 if (NULL != gDefaultNormal) {
301 return;
302 }
304 - load_font_info();
305 -
306 const FontInitRec* rec = gSystemFonts;
307 SkTypeface* firstInFamily = NULL;
308 int fallbackCount = 0;
310 - for (size_t i = 0; i < gNumSystemFonts; i++) {
311 + for (size_t i = 0; i < SK_ARRAY_COUNT(gSystemFonts); i++) {
312 // if we're the first in a new family, clear firstInFamily
313 if (rec[i].fNames != NULL) {
314 firstInFamily = NULL;
315 }
317 bool isFixedWidth;
318 SkString name;
319 SkTypeface::Style style;
321 // we expect all the fonts, except the "fallback" fonts
322 @@ -515,120 +483,75 @@ static void load_system_fonts() {
323 // SkDebugf("---- adding %s as fallback[%d] fontID %d\n",
324 // rec[i].fFileName, fallbackCount, tf->uniqueID());
325 gFallbackFonts[fallbackCount++] = tf->uniqueID();
326 }
328 firstInFamily = tf;
329 FamilyRec* family = find_family(tf);
330 const char* const* names = rec[i].fNames;
332 // record the default family if this is it
333 - if (names == gDefaultNames) {
334 + if (names == DEFAULT_NAMES) {
335 gDefaultFamily = family;
336 }
337 // add the names to map to this family
338 while (*names) {
339 add_name(*names, family);
340 names += 1;
341 }
342 }
343 }
345 // do this after all fonts are loaded. This is our default font, and it
346 // acts as a sentinel so we only execute load_system_fonts() once
347 gDefaultNormal = find_best_face(gDefaultFamily, SkTypeface::kNormal);
348 // now terminate our fallback list with the sentinel value
349 gFallbackFonts[fallbackCount] = 0;
350 }
352 ///////////////////////////////////////////////////////////////////////////////
354 void SkFontHost::Serialize(const SkTypeface* face, SkWStream* stream) {
355 - // lookup and record if the font is custom (i.e. not a system font)
356 - bool isCustomFont = !((FamilyTypeface*)face)->isSysFont();
357 - stream->writeBool(isCustomFont);
358 + const char* name = ((FamilyTypeface*)face)->getUniqueString();
360 - if (isCustomFont) {
361 - SkStream* fontStream = ((FamilyTypeface*)face)->openStream();
362 + stream->write8((uint8_t)face->style());
364 - // store the length of the custom font
365 - uint32_t len = fontStream->getLength();
366 - stream->write32(len);
367 -
368 - // store the entire font in the serialized stream
369 - void* fontData = malloc(len);
370 -
371 - fontStream->read(fontData, len);
372 - stream->write(fontData, len);
373 -
374 - fontStream->unref();
375 - free(fontData);
376 -// SkDebugf("--- fonthost custom serialize %d %d\n", face->style(), len);
377 -
378 + if (NULL == name || 0 == *name) {
379 + stream->writePackedUInt(0);
380 +// SkDebugf("--- fonthost serialize null\n");
381 } else {
382 - const char* name = ((FamilyTypeface*)face)->getUniqueString();
383 -
384 - stream->write8((uint8_t)face->style());
385 -
386 - if (NULL == name || 0 == *name) {
387 - stream->writePackedUInt(0);
388 -// SkDebugf("--- fonthost serialize null\n");
389 - } else {
390 - uint32_t len = strlen(name);
391 - stream->writePackedUInt(len);
392 - stream->write(name, len);
393 -// SkDebugf("--- fonthost serialize <%s> %d\n", name, face->style());
394 - }
395 + uint32_t len = strlen(name);
396 + stream->writePackedUInt(len);
397 + stream->write(name, len);
398 +// SkDebugf("--- fonthost serialize <%s> %d\n", name, face->style());
399 }
400 }
402 SkTypeface* SkFontHost::Deserialize(SkStream* stream) {
403 load_system_fonts();
405 - // check if the font is a custom or system font
406 - bool isCustomFont = stream->readBool();
407 + int style = stream->readU8();
409 - if (isCustomFont) {
410 + int len = stream->readPackedUInt();
411 + if (len > 0) {
412 + SkString str;
413 + str.resize(len);
414 + stream->read(str.writable_str(), len);
416 - // read the length of the custom font from the stream
417 - uint32_t len = stream->readU32();
418 -
419 - // generate a new stream to store the custom typeface
420 - SkMemoryStream* fontStream = new SkMemoryStream(len);
421 - stream->read((void*)fontStream->getMemoryBase(), len);
422 -
423 - SkTypeface* face = CreateTypefaceFromStream(fontStream);
424 -
425 - fontStream->unref();
426 -
427 -// SkDebugf("--- fonthost custom deserialize %d %d\n", face->style(), len);
428 - return face;
429 -
430 - } else {
431 - int style = stream->readU8();
432 -
433 - int len = stream->readPackedUInt();
434 - if (len > 0) {
435 - SkString str;
436 - str.resize(len);
437 - stream->read(str.writable_str(), len);
438 -
439 - const FontInitRec* rec = gSystemFonts;
440 - for (size_t i = 0; i < gNumSystemFonts; i++) {
441 - if (strcmp(rec[i].fFileName, str.c_str()) == 0) {
442 - // backup until we hit the fNames
443 - for (int j = i; j >= 0; --j) {
444 - if (rec[j].fNames != NULL) {
445 - return SkFontHost::CreateTypeface(NULL,
446 - rec[j].fNames[0], NULL, 0,
447 - (SkTypeface::Style)style);
448 - }
449 + const FontInitRec* rec = gSystemFonts;
450 + for (size_t i = 0; i < SK_ARRAY_COUNT(gSystemFonts); i++) {
451 + if (strcmp(rec[i].fFileName, str.c_str()) == 0) {
452 + // backup until we hit the fNames
453 + for (int j = i; j >= 0; --j) {
454 + if (rec[j].fNames != NULL) {
455 + return SkFontHost::CreateTypeface(NULL,
456 + rec[j].fNames[0], NULL, 0, (SkTypeface::Style)style);
457 }
458 }
459 }
460 }
461 }
462 return NULL;
463 }
465 ///////////////////////////////////////////////////////////////////////////////
467 @@ -697,49 +620,32 @@ size_t SkFontHost::GetFileName(SkFontID
468 }
469 return size;
470 } else {
471 return 0;
472 }
473 }
475 SkFontID SkFontHost::NextLogicalFont(SkFontID currFontID, SkFontID origFontID) {
476 load_system_fonts();
478 - const SkTypeface* origTypeface = find_from_uniqueID(origFontID);
479 - const SkTypeface* currTypeface = find_from_uniqueID(currFontID);
480 -
481 - SkASSERT(origTypeface != 0);
482 - SkASSERT(currTypeface != 0);
483 -
484 - // Our fallback list always stores the id of the plain in each fallback
485 - // family, so we transform currFontID to its plain equivalent.
486 - currFontID = find_typeface(currTypeface, SkTypeface::kNormal)->uniqueID();
487 -
488 /* First see if fontID is already one of our fallbacks. If so, return
489 its successor. If fontID is not in our list, then return the first one
490 in our list. Note: list is zero-terminated, and returning zero means
491 we have no more fonts to use for fallbacks.
492 */
493 const uint32_t* list = gFallbackFonts;
494 for (int i = 0; list[i] != 0; i++) {
495 if (list[i] == currFontID) {
496 - if (list[i+1] == 0)
497 - return 0;
498 - const SkTypeface* nextTypeface = find_from_uniqueID(list[i+1]);
499 - return find_typeface(nextTypeface, origTypeface->style())->uniqueID();
500 + return list[i+1];
501 }
502 }
503 -
504 - // If we get here, currFontID was not a fallback, so we start at the
505 - // beginning of our list.
506 - const SkTypeface* firstTypeface = find_from_uniqueID(list[0]);
507 - return find_typeface(firstTypeface, origTypeface->style())->uniqueID();
508 + return list[0];
509 }
511 ///////////////////////////////////////////////////////////////////////////////
513 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
514 if (NULL == stream || stream->getLength() <= 0) {
515 return NULL;
516 }
518 bool isFixedWidth;
519 @@ -754,10 +660,11 @@ SkTypeface* SkFontHost::CreateTypefaceFr
520 }
522 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
523 SkStream* stream = SkNEW_ARGS(SkMMAPStream, (path));
524 SkTypeface* face = SkFontHost::CreateTypefaceFromStream(stream);
525 // since we created the stream, we let go of our ref() here
526 stream->unref();
527 return face;
528 }
530 +///////////////////////////////////////////////////////////////////////////////