Skip to content

Commit faf679b

Browse files
committed
refactor: dynamic font created in downloader to allow override the implementation
1 parent dc263b8 commit faf679b

File tree

3 files changed

+55
-52
lines changed

3 files changed

+55
-52
lines changed
+3-50
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,9 @@
1-
import { ILaya } from "../../ILaya";
2-
import { LayaEnv } from "../../LayaEnv";
3-
import { IResourceLoader, ILoadTask, Loader } from "../net/Loader";
4-
import { URL } from "../net/URL";
5-
import { Browser } from "../utils/Browser";
6-
import { Utils } from "../utils/Utils";
7-
8-
const testString = "LayaTTFFont";
9-
1+
import { ILoadTask, IResourceLoader, Loader } from "../net/Loader";
102
class TTFFontLoader implements IResourceLoader {
113

124
load(task: ILoadTask) {
13-
let fontName = Utils.replaceFileExtension(Utils.getBaseName(task.url), "");
14-
if (LayaEnv.isConch) {
15-
return task.loader.fetch(task.url, "arraybuffer").then(data => {
16-
if (data)
17-
(window as any)["conch"].registerFont(fontName, data);
18-
return { family: fontName };
19-
});
20-
}
21-
else if ((window as any).FontFace) {
22-
let fontFace: any = new (window as any).FontFace(fontName, "url('" + URL.postFormatURL(URL.formatURL(task.url)) + "')");
23-
(document as any).fonts.add(fontFace);
24-
return fontFace.load().then(() => {
25-
return fontFace;
26-
});
27-
}
28-
else {
29-
let fontTxt = "40px " + fontName;
30-
let txtWidth = Browser.measureText(testString, fontTxt).width;
31-
32-
let fontStyle: any = Browser.createElement("style");
33-
fontStyle.type = "text/css";
34-
document.body.appendChild(fontStyle);
35-
fontStyle.textContent = "@font-face { font-family:'" + fontName + "'; src:url('" + URL.postFormatURL(URL.formatURL(task.url)) + "');}";
36-
37-
return new Promise((resolve) => {
38-
let checkComplete = () => {
39-
if (Browser.measureText(testString, fontTxt).width != txtWidth)
40-
complete();
41-
};
42-
let complete = () => {
43-
ILaya.systemTimer.clear(this, checkComplete);
44-
ILaya.systemTimer.clear(this, complete);
45-
46-
resolve({ family: fontName });
47-
};
48-
49-
ILaya.systemTimer.once(10000, this, complete);
50-
ILaya.systemTimer.loop(20, this, checkComplete);
51-
});
52-
}
5+
return task.loader.fetch(task.url, "font", task.progress.createCallback(), task.options);
536
}
547
}
558

56-
Loader.registerLoader(["ttf", "woff", "woff2", "otf"], TTFFontLoader, Loader.TTF);
9+
Loader.registerLoader(["ttf", "woff", "woff2", "otf"], TTFFontLoader, Loader.TTF);

src/layaAir/laya/net/Downloader.ts

+45
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import { ILaya } from '../../ILaya';
12
import { Event } from "../events/Event";
23
import { Browser } from "../utils/Browser";
34
import { ImgUtils } from "../utils/ImgUtils";
5+
import { Utils } from '../utils/Utils';
46
import { HttpRequest } from "./HttpRequest";
57
import { WorkerLoader } from "./WorkerLoader";
68

@@ -150,6 +152,49 @@ export class Downloader {
150152
owner.$ref = audio; //保持引用避免gc掉
151153
}
152154

155+
font(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void {
156+
let fontName = Utils.replaceFileExtension(Utils.getBaseName(url), "");
157+
if ((window as any).conch) {
158+
this.common(owner, url, originalUrl, "arraybuffer", onProgress, (data, error) => {
159+
if (error || !data) {
160+
onComplete(null, error);
161+
return;
162+
}
163+
(window as any).conch.registerFont(fontName, data);
164+
onComplete({ family: fontName });
165+
});
166+
} else if ((window as any).FontFace) {
167+
let fontFace: any = new (window as any).FontFace(fontName, "url('" + url + "')");
168+
fontFace.load()
169+
.catch((err: Error) => onComplete(null, err.message))
170+
.then(() => {
171+
(document as any).fonts.add(fontFace);
172+
onComplete(fontFace);
173+
});
174+
} else {
175+
const testString = "LayaTTFFont";
176+
let fontTxt = "40px " + fontName;
177+
let txtWidth = Browser.measureText(testString, fontTxt).width;
178+
179+
let fontStyle: any = Browser.createElement("style");
180+
fontStyle.type = "text/css";
181+
document.body.appendChild(fontStyle);
182+
fontStyle.textContent = "@font-face { font-family:'" + fontName + "'; src:url('" + url + "');}";
183+
184+
let checkComplete = () => {
185+
if (Browser.measureText(testString, fontTxt).width != txtWidth)
186+
complete();
187+
};
188+
let complete = () => {
189+
ILaya.systemTimer.clear(this, checkComplete);
190+
ILaya.systemTimer.clear(this, complete);
191+
onComplete({ family: fontName });
192+
};
193+
ILaya.systemTimer.once(10000, this, complete);
194+
ILaya.systemTimer.loop(20, this, checkComplete);
195+
}
196+
}
197+
153198
/**
154199
* @en Pool of HttpRequest instances.
155200
* @zh HttpRequest实例池。

src/layaAir/laya/net/Loader.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ interface ContentTypeMap {
6262
"xml": XML,
6363
"arraybuffer": ArrayBuffer,
6464
"image": HTMLImageElement | ImageBitmap,
65-
"sound": HTMLAudioElement
65+
"sound": HTMLAudioElement,
66+
"font": FontFace,
6667
}
6768

6869
var typeIdCounter = 0;
@@ -735,6 +736,10 @@ export class Loader extends EventDispatcher {
735736
Loader.downloader.audio(item, url, item.originalUrl, item.onProgress, (data: any, error: string) =>
736737
this.completeItem(item, data, error));
737738
}
739+
else if (item.contentType == "font") {
740+
Loader.downloader.font(item, url, item.originalUrl, item.onProgress, (data: any, error: string) =>
741+
this.completeItem(item, data, error));
742+
}
738743
else {
739744
let preloadedContent = Loader.preLoadedMap[item.url];
740745
if (preloadedContent) {
@@ -1471,4 +1476,4 @@ interface DownloadItem {
14711476
startTime?: number;
14721477
onComplete: (content: any) => void;
14731478
onProgress: ProgressCallback;
1474-
}
1479+
}

0 commit comments

Comments
 (0)