fontLoaderIsolate function
نقطة دخول Isolate لتحميل الخطوط
Implementation
void fontLoaderIsolate(SendPort sendPort) {
// استقبال رسالة من Isolate الرئيسي
final receivePort = ReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.listen((dynamic message) async {
if (message is FontLoadMessage) {
try {
ByteData fontBytes;
if (message.isWeb) {
// تحميل من الويب مع تجريب عدة مرايا عند الحاجة
final urls = (message.candidateUrls != null &&
message.candidateUrls!.isNotEmpty)
? message.candidateUrls!
: [message.url];
fontBytes = await _getWebFontBytesFromCandidatesIsolate(urls);
} else {
// تحميل من الملف المحلي أولاً، وفي حال عدم توفره جرّب الشبكي كملاذ أخير
final fontFile = File(message.fontPath);
if (await fontFile.exists()) {
final bytes = await fontFile.readAsBytes();
fontBytes = ByteData.view(Uint8List.fromList(bytes).buffer);
} else {
// fallback إلى الشبكة إذا توفرت مرايا
final urls = (message.candidateUrls != null &&
message.candidateUrls!.isNotEmpty)
? message.candidateUrls!
: [message.url];
fontBytes = await _getWebFontBytesFromCandidatesIsolate(urls);
}
}
// إرسال البيانات مرة أخرى إلى Isolate الرئيسي
sendPort.send({
'pageIndex': message.pageIndex,
'fontName': message.fontName,
'fontBytes': fontBytes,
'generation': message.generation, // إرجاع رقم الجيل
});
} catch (e) {
// إرسال خطأ إلى Isolate الرئيسي
sendPort.send({
'pageIndex': message.pageIndex,
'error': e.toString(),
'generation': message.generation, // إرجاع رقم الجيل
});
}
}
});
}