Как я могу отобразить файл изображения xmp в окне в xlib? (Я пишу на C) - PullRequest
0 голосов
/ 03 ноября 2019

Я создаю Шахматы на С, и мне нужно печатать доску после каждого хода. Мне удалось распечатать доску, используя строки как кусочки, но я хотел бы заменить строки изображениями реальных кусочков.

Мне не удалось найти решение для отображения изображения в окне X11.

for(i=0;i<8;i++){
for(j=0;j<8;j++){
    if(board[i][j]>0){
        if(board[i][j]==100)
            strcpy(text,"Pawn");
        else if(board[i][j]==300)
            strcpy(text,"Knight");
        else if(board[i][j]==400)
            strcpy(text,"Bishop");
        else if(board[i][j]==500)
            strcpy(text,"Rook");
        else if(board[i][j]==900)
            strcpy(text,"Queen");
        else if(board[i][j]==10000)
            strcpy(text,"King");
XSetForeground(dpy,gc,whiteColor);
XDrawString(dpy,w,gc,j*100+20,i*100+50, text, strlen(text));

В этом фрагменте белые фрагменты отображаются с использованием текста белого цвета.

1 Ответ

0 голосов
/ 03 ноября 2019

Рисование XMP-файла не поддерживается напрямую с X11. Имеется встроенная поддержка png, jpeg и более старого формата (растровое изображение, растровое изображение и т. Д.). Первым шагом будет преобразование XMP в изображение фиксированного размера (из кода выглядит как 20 * 50).

Как правило, вы хотите предварительно загрузить изображения (из файлов):

#include <Xm/Xm.h>

 static unsigned char data[] = {
                0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60

        } ;
Screen s = DefaultScreenOfDisplay(d) ;
Pixel fg = XWhitePixelOfScreen(s) ;
Pixel bg = XBlackPixelOfScreen(s) ;
// Pixmap king_pm = XmGetPixmap(s, "king.png", fg, bg) ;
// Pixmap queen_pm = XmGetPixmap(s, "queen.png", fg, bg) ;

Pixmap king_pm = XCreatePixmapFromBitmapData(d, RootWindowOfScreen(s), data, 8, 8, fg, bg, 8) ;

Тогда рисование основано на КОПИРОВАНИИ растрового изображения на дисплей (используя индексы, как указано выше). Например, чтобы нарисовать короля.

   XCopyArea(dpy, king_pm, gc, 0, 0, 20, 50, j*100+20,i*100+50) ;

Отказ от ответственности: у меня нет способа проверить этот код. Вам может потребоваться устранить неполадки / исправить при необходимости.

...