JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
openX.h File Reference

X-Winow 表示用関数ヘッダ More...

#include "gdata.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
Include dependency graph for openX.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  openX
 

Macros

#define COLOR_DEPTH   32
 
#define MONOC   0
 
#define COLOR   1
 
#define COLOR_NUM   125
 
#define disp_close(xd)   displayClose(xd)
 
#define check_image(vp)   {openX x;x=disp_image((vp),0,0,0);getchar();displayClose(x);}
 

Functions

openX disp_image (WSGraph gd, int lc, int hc, int cflg)
 
void displayClose (openX xid)
 
void set_color (openX xid, double r, double g, double b)
 
openX displayOpen (int xs, int ys, int cflg)
 

Detailed Description

Version
2.0
Author
Fumi.Iseki (C)

Definition in file openX.h.

Macro Definition Documentation

◆ check_image

#define check_image ( vp)    {openX x;x=disp_image((vp),0,0,0);getchar();displayClose(x);}

Definition at line 56 of file openX.h.

◆ COLOR

#define COLOR   1

Definition at line 46 of file openX.h.

◆ COLOR_DEPTH

#define COLOR_DEPTH   32

Definition at line 33 of file openX.h.

Referenced by disp_image().

◆ COLOR_NUM

#define COLOR_NUM   125

Definition at line 47 of file openX.h.

Referenced by disp_image(), and displayOpen().

◆ disp_close

#define disp_close ( xd)    displayClose(xd)

Definition at line 55 of file openX.h.

◆ MONOC

#define MONOC   0

Definition at line 45 of file openX.h.

Referenced by disp_image(), disp_img(), and displayOpen().

Function Documentation

◆ disp_image()

openX disp_image ( WSGraph gd,
int lc,
int hc,
int cflg )

openX disp_image(WSGraph gd, int lc, int hc, int cflg)

グラフィックデータ gdをディスプレイ上に表示する.

Parameters
gd表示するグラフィックデータ.
lcコントラスト調整.これより小さい輝度値は表示しない.0より小さい(-1以下の)場合は自動調整する.
hcコントラスト調整.これより大きい輝度値は表示しない.0以下の場合は自動調整する.
cflg表示モード MONOC: グレースケール表示.COLOR: カラー表示 (未サポート)
Returns
表示したウィンドウの識別子.
Attention
正しく表示されない場合は,openX.h の COLOR_DEPTH を変更する.
Bug
カラーデプスが8bitでは正しく表示されない. 表示モードの COLORは完全にサポートされていないので表示がおかしくなる.

Definition at line 32 of file openX.c.

33{
34 int i, j, sl, sh;
35 char *image;
36 int nc = COLOR_NUM;
37 int width, height, dpth, dpb;
38 int tmp, col;
39 unsigned short int* pnt;
40
41 sWord *imagewk;
42 XImage *ximg;
43 Visual *visl;
44 Pixmap pmap;
45 openX xid;
46
47 width = gd.xs;
48 height = gd.ys;
49 imagewk = gd.gp;
50
51 xid = displayOpen(gd.xs, gd.ys, cflg);
52
53 sl = sh = 1;
54 if (hc<=0) sh = -1;
55 if (lc<0) {
56 sl = -1;
57 lc = SINTMAX;
58 }
59 if (sl<0 || sh<0) {
60 for(i=0; i<width*height; i++){
61 tmp = *(imagewk + i);
62 if (sl<0) lc = Min(lc, tmp);
63 if (sh<0) hc = Max(hc, tmp);
64 }
65 }
66 hc = Max(hc, lc+2);
67
68 visl = DefaultVisual(xid.display, xid.screen);
69 dpth = DefaultDepth (xid.display, xid.screen);
70 dpb = dpth/8;
71 if (dpb==3 && COLOR_DEPTH>=32) dpb = 4;
72
73 image = (char*)malloc(width*height*dpb);
74 if (image!=NULL) memset(image, 0, width*height*dpb);
75
76 for(i=0; i<width*height; i++){
77 tmp = *(imagewk + i);
78 if (tmp>hc) tmp = hc;
79 if (tmp<lc) tmp = lc;
80 if (cflg==MONOC) tmp = (int)((double)(tmp-lc)*(nc-1)/(double)(hc-lc));
81 else tmp = (int)(nc-(double)(tmp-lc)*(nc-1)/(double)(hc-lc)-1);
82
83 col = xid.color_index[tmp];
84 if (dpb>=3) {
85 for (j=0; j<dpb; j++) image[dpb*i+j] = col; // 24,32bit
86 }
87 else { // 16bit
88 pnt = (unsigned short int*)&(image[dpb*i]);
89 *pnt = col;
90 }
91 }
92
93 pmap = XCreatePixmap(xid.display, xid.window, width, height, dpth);
94 ximg = XCreateImage(xid.display,visl,dpth,ZPixmap,0,(char*)image,width,height,8,0);
95 XPutImage(xid.display, pmap, xid.gc, ximg, 0, 0, 0, 0, width, height);
96 XSetWindowBackgroundPixmap(xid.display, xid.window, pmap);
97 XMapWindow (xid.display, xid.window);
98 XClearWindow(xid.display, xid.window);
99 XFlush(xid.display);
100
101 xid.id = 1;
102 return xid;
103}
#define Min(x, y)
Definition common.h:250
#define Max(x, y)
Definition common.h:247
short sWord
2Byte
Definition common.h:335
#define SINTMAX
Definition common.h:204
openX displayOpen(int xs, int ys, int cflg)
Definition openX.c:125
#define COLOR_DEPTH
Definition openX.h:33
#define COLOR_NUM
Definition openX.h:47
#define MONOC
Definition openX.h:45
int xs
xサイズ. 4Byte.
Definition gdata.h:43
sWord * gp
グラフィックデータへのポインタ. xs*ys*zs*2Byte.
Definition gdata.h:47
int ys
yサイズ. 4Byte.
Definition gdata.h:44
Definition openX.h:35
int screen
Definition openX.h:40
GC gc
Definition openX.h:39
int id
Definition openX.h:36
Display * display
Definition openX.h:37
unsigned long * color_index
Definition openX.h:41
Window window
Definition openX.h:38

References COLOR_DEPTH, openX::color_index, COLOR_NUM, openX::display, displayOpen(), openX::gc, WSGraph::gp, openX::id, Max, Min, MONOC, openX::screen, SINTMAX, openX::window, WSGraph::xs, and WSGraph::ys.

Referenced by disp_img().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ displayClose()

void displayClose ( openX xid)

void displayClose(openX xid)

表示したウィンドウを閉じる.

Parameters
xid閉じたいウィンドウの識別子.

Definition at line 113 of file openX.c.

114{
115 if (xid.id >= 0) {
116 free(xid.color_index);
117 XFreeGC(xid.display, xid.gc);
118 XDestroyWindow(xid.display, xid.window);
119 XCloseDisplay(xid.display);
120 xid.id = -1;
121 }
122}

References openX::color_index, openX::display, openX::gc, openX::id, and openX::window.

Referenced by disp_img().

Here is the caller graph for this function:

◆ displayOpen()

openX displayOpen ( int xs,
int ys,
int cflg )

Definition at line 125 of file openX.c.

126{
127 Window root_window;
128 XSizeHints hint;
129 XColor color;
130 Colormap cmap;
131 XSetWindowAttributes at;
132 openX xid;
133
134 int ir, ig, ib;
135 unsigned long foreground, background;
136 unsigned short values[] = {0x0, 0x4444, 0x8888, 0xcccc, 0xffff};
137
138 hint.x = 0;
139 hint.y = 0;
140 hint.width = xs;
141 hint.height = ys;
142 hint.flags = PPosition|PSize;
143
144 xid.display = XOpenDisplay(NULL);
145 root_window = DefaultRootWindow(xid.display);
146
147 xid.screen = DefaultScreen(xid.display);
148 foreground = WhitePixel(xid.display, xid.screen);
149 background = BlackPixel(xid.display, xid.screen);
150
151 xid.window = XCreateSimpleWindow(xid.display, root_window, hint.x, hint.y,
152 hint.width, hint.height, 5, foreground, background);
153 XSetStandardProperties(xid.display,xid.window,"openX","openX",None,NULL,0,&hint);
154
155 xid.gc = XCreateGC(xid.display, xid.window, 0, 0);
156 XSetBackground(xid.display, xid.gc, background);
157 XSetForeground(xid.display, xid.gc, foreground);
158
159 at.backing_store = WhenMapped;
160 at.bit_gravity = CenterGravity;
161 XChangeWindowAttributes(xid.display, xid.window, CWBackingStore, &at);
162 XChangeWindowAttributes(xid.display, xid.window, CWBitGravity, &at);
163
164 XSelectInput(xid.display, xid.window, ButtonPressMask|KeyPressMask|ExposureMask);
165 XMapRaised(xid.display, xid.window);
166
167 cmap = DefaultColormap(xid.display, xid.screen);
168 xid.color_index = (long unsigned int*)malloc(COLOR_NUM*sizeof(long));
169 if (xid.color_index!=NULL) memset(xid.color_index, 0, COLOR_NUM*sizeof(long));
170
171 for (ir = 0; ir < 5; ir++) {
172 for (ig = 0; ig < 5; ig++) {
173 for (ib = 0; ib < 5; ib++) {
174 if (cflg==MONOC) { // MONO
175 color.red = (int)((ir+5.*ig+ib*25.)/(double)COLOR_NUM*65532.);
176 color.green = color.blue = color.red;
177 }
178 else {
179 color.red = values[ir];
180 color.green = values[ig];
181 color.blue = values[ib];
182 }
183 XAllocColor(xid.display, cmap, &color);
184 xid.color_index[ir+5*ig+25*ib] = color.pixel;
185 }
186 }
187 }
188
189 xid.id = 0;
190 set_color(xid, 0.0, 0.0, 0.0);
191 return xid;
192}
void set_color(openX xid, double r, double g, double b)
Definition openX.c:195

References openX::color_index, COLOR_NUM, openX::display, openX::gc, openX::id, MONOC, openX::screen, set_color(), and openX::window.

Referenced by disp_image().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_color()

void set_color ( openX xid,
double r,
double g,
double b )

Definition at line 195 of file openX.c.

196{
197 int ir, ig, ib;
198
199 r = Max(0.0, Min(r, 1.0));
200 g = Max(0.0, Min(g, 1.0));
201 b = Max(0.0, Min(b, 1.0));
202
203 ir = (int)(4*r + 0.5);
204 ig = (int)(4*g + 0.5);
205 ib = (int)(4*b + 0.5);
206
207 XSetForeground(xid.display, xid.gc, xid.color_index[ir+5*ig+25*ib]);
208}

References openX::color_index, openX::display, openX::gc, Max, and Min.

Referenced by displayOpen().

Here is the caller graph for this function: