質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2765閲覧

X11でモノクロビットマップに描画したい

katahiromz

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/08/08 04:00

こんにちは。X Window System (X11)で質問があります。

https://github.com/katahiromz/X11AppSample00/blob/master/X11AppSample00.cpp

X11AppSample00.cppの188行目、onExposeメソッドで、
0. モノクロビットマップを作成する。
0. 何か描画する。
0. ウィンドウにそのイメージをコピーする。
といったことをしてみたいのですが、

C++

1 void onExpose(XExposeEvent *pee) { 2 Pixmap pixmap = XCreatePixmap(m_disp, m_win, 3 WIN_WIDTH, WIN_HEIGHT, 1); 4 5 // draw lines 6 XSetForeground(m_disp, m_gc1, WhitePixel(m_disp, 0)); 7 XSetLineAttributes(m_disp, m_gc1, 1, LineSolid, CapRound, JoinRound); 8 XDrawLine(m_disp, pixmap, m_gc1, 0, 0, WIN_WIDTH, WIN_HEIGHT); 9 XDrawLine(m_disp, pixmap, m_gc1, WIN_WIDTH, 0, 0, WIN_HEIGHT); 10 11 // transfer bits from pixmap to m_win 12 XCopyPlane(m_disp, pixmap, m_win, m_gc1, 13 0, 0, WIN_WIDTH, WIN_HEIGHT, 14 0, 0, 1); 15 16 XFreePixmap(m_disp, pixmap); 17 }

BadMatchエラーが出てきます。

katahiromz@katahiromz-VirtualBox:~/aa/TypicalProjects/X11AppSample00$ ./X11AppSample00 X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 66 (X_PolySegment) Serial number of failed request: 141 Current serial number in output stream: 143 katahiromz@katahiromz-VirtualBox:~/aa/TypicalProjects/X11AppSample00$

どうすればいいでしょうか? よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

次のような方法で自己解決しました。

まず、bitmapFromXImageという次のような関数を用意しました。

C++

1 Pixmap bitmapFromXImage(XImage *image) { 2 Pixmap bitmap; 3 int rowbytes = (image->width + 7) / 8; 4 void *p = calloc(rowbytes, image->height); 5 char *data = reinterpret_cast<char *>(p); 6 for (int y = 0; y < image->height; ++y) { 7 for (int x = 0; x < image->width; ++x) { 8 int ib = (x & 7); 9 unsigned long pixel = XGetPixel(image, x, y); 10 if (pixel != 0) { 11 data[y * rowbytes + x / 8] |= (1 << ib); 12 } 13 } 14 } 15 bitmap = XCreateBitmapFromData(m_disp, m_root_win, data, 16 image->width, image->height); 17 free(data); 18 return bitmap; 19 }

さらに

C++

1 Pixmap pixmap = XCreatePixmap(m_disp, m_win, 2 WIN_WIDTH, WIN_HEIGHT, DefaultDepth(m_disp, 0)); 3 4 // draw lines 5 XSetForeground(m_disp, m_gc1, WhitePixel(m_disp, 0)); 6 XFillRectangle(m_disp, pixmap, m_gc1, 7 WIN_WIDTH / 4, WIN_HEIGHT / 4, 8 WIN_WIDTH / 2, WIN_HEIGHT / 2 9 ); 10 11 XImage *image = XGetImage(m_disp, pixmap, 12 0, 0, WIN_WIDTH, WIN_HEIGHT, 13 AllPlanes, XYPixmap 14 ); 15 Pixmap bitmap = bitmapFromXImage(image); 16 XDestroyImage(image);

のようにすると、カラーピックスマップからモノクロビットマップbitmapを作ることに成功しました。

投稿2015/08/09 02:21

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問