سؤال

بدأت في ترميز مدير النوافذ الخاص بي ، وكنت أتساءل عن كيفية استخدام واجهة برمجة تطبيقات XORG للحصول على بيانات الصور الخام (مثل البيانات التي قدمتها LIBPNG) ، إلى pixmap xorg أو شيء يمكن رسمه بواسطة xorg؟

هل كانت مفيدة؟

المحلول

يجب أن تفعل XcReatePixMapFrombitMapData ذلك. تذكر أنك تحتاج إلى التغذية في البيانات ذات عمق البت الذي تستخدمه XServer.

نصائح أخرى

ربما اكتشفت هذا في مرحلة ما منذ عام 2008 ، ولكن لصالح القراء في المستقبل ...

سيتم تحميل XCreatePixMapFrombitMapData () بيانات النقطات الحرفية (أي 1 بت ، بالأبيض والأسود) في بيكسل. على الأرجح ليس ما تريد ، إذا كان الهدف هو التحميل من بابوا نيو غينيا.

طريقة أحدث للقيام بذلك هي استخدام القاهرة أو gdkpixbuf. يتم إهمال واجهات برمجة تطبيقات XLIB للمدرسة القديمة مثل XcReatePixMapFrombitMapdata () و XdrawwhateR () (لا يتم إزالتها بالفعل على الإطلاق ، لكنها عفا عليها الزمن وخارج متزامن مع كيفية عمل التطبيقات الحديثة).

الطريقة التي يوصي بها الناس عمومًا القيام بالأشياء هذه الأيام هي:

  • تفضل libxcb على libx11 ، libxcb هو مجرد غلاف رفيع للغاية حول بروتوكول x ويفتقر إلى المكالمات التي تقوم بطلبات بروتوكول X متعددة (على سبيل المثال createpixmapfrombitmapdata لا createpixmap ، creategc ، putimage ، freegc)
  • تفضل القاهرة (أو مكتبة قابلة للمقارنة ، Skia هي واحدة) إلى واجهات برمجة تطبيقات الرسم من جانب الخادم

يمكنك استخدام cairo_image_surface_create_from_png () لأغراض بسيطة أو gdkpixbuf إذا كنت بحاجة إلى دعم المزيد من التنسيقات ، إلخ.

هناك القليل من الرقص مع XcReatiMage و XcReatePixMap و Xcopyarea عليك القيام به. يذهب قليلا مثل هذا:

struct Image img = get_pixels_and_geometry_from_libpng("filename.png");
XImage *img = XCreateImage(/*5000 paremeters*/);
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24);
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height);
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top