fontLoaderIsolate function

void fontLoaderIsolate(
  1. SendPort sendPort
)

نقطة دخول 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, // إرجاع رقم الجيل
        });
      }
    }
  });
}