JunkBox_Lib  1.10.2
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.

◆ COLOR_NUM

#define COLOR_NUM   125

Definition at line 47 of file openX.h.

◆ 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.

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: