display-x11.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * x264: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 Tuukka Toivonen <tuukkat@ee.oulu.fi>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  19.  *****************************************************************************/
  20. #include <X11/Xlib.h>
  21. #include <X11/Xutil.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include "display.h"
  25. #ifdef _MSC_VER
  26. #define inline __inline
  27. #define snprintf _snprintf
  28. #endif
  29. static long event_mask = ConfigureNotify|ExposureMask|KeyPressMask|ButtonPressMask|StructureNotifyMask|ResizeRedirectMask;
  30. static Display *disp_display = NULL;
  31. static struct disp_window {
  32. int init;
  33. Window window;
  34. } disp_window[10];
  35. static inline void disp_chkerror(int cond, char *e) {
  36. if (!cond) return;
  37. fprintf(stderr, "error: %sn", e ? e : "?");
  38. abort();
  39. }
  40. static void disp_init_display(void) {
  41. Visual *visual;
  42. int dpy_class;
  43. int screen;
  44. int dpy_depth;
  45. if (disp_display != NULL) return;
  46. memset(&disp_window, 0, sizeof(disp_window));
  47. disp_display = XOpenDisplay("");
  48. disp_chkerror(!disp_display, "no display");
  49. screen = DefaultScreen(disp_display);
  50. visual = DefaultVisual(disp_display, screen);
  51. dpy_class = visual->class;
  52. dpy_depth = DefaultDepth(disp_display, screen);
  53. disp_chkerror(!((dpy_class == TrueColor && dpy_depth == 32)
  54. || (dpy_class == TrueColor && dpy_depth == 24)
  55. || (dpy_class == TrueColor && dpy_depth == 16)
  56. || (dpy_class == PseudoColor && dpy_depth == 8)),
  57. "requires 8 bit PseudoColor or 16/24/32 bit TrueColor display");
  58. }
  59. static void disp_init_window(int num, int width, int height, const unsigned char *tit) {
  60. XSizeHints *shint;
  61. XSetWindowAttributes xswa;
  62. XEvent xev;
  63. int screen = DefaultScreen(disp_display);
  64. Visual *visual = DefaultVisual (disp_display, screen);
  65. unsigned int fg, bg;
  66. unsigned int mask;
  67. char title[200];
  68. Window window;
  69. int dpy_depth;
  70. if (tit) {
  71. snprintf(title, 200, "%s: %i/disp", tit, num);
  72. } else {
  73. snprintf(title, 200, "%i/disp", num);
  74. }
  75. shint = XAllocSizeHints();
  76. disp_chkerror(!shint, "memerror");
  77. shint->min_width = shint->max_width = shint->width = width;
  78. shint->min_height = shint->max_height = shint->height = height;
  79. shint->flags = PSize | PMinSize | PMaxSize;
  80. disp_chkerror(num<0 || num>=10, "bad win num");
  81. if (!disp_window[num].init) {
  82. disp_window[num].init = 1;
  83. bg = WhitePixel(disp_display, screen);
  84. fg = BlackPixel(disp_display, screen);
  85. dpy_depth = DefaultDepth(disp_display, screen);
  86. if (dpy_depth==32 || dpy_depth==24 || dpy_depth==16) {
  87. mask |= CWColormap;
  88. xswa.colormap = XCreateColormap(disp_display, DefaultRootWindow(disp_display), visual, AllocNone);
  89. }
  90. xswa.background_pixel = bg;
  91. xswa.border_pixel = fg;
  92. xswa.backing_store = Always;
  93. xswa.backing_planes = -1;
  94. xswa.bit_gravity = NorthWestGravity;
  95. mask = CWBackPixel | CWBorderPixel | CWBackingStore | CWBackingPlanes | CWBitGravity;
  96. window = XCreateWindow(disp_display, DefaultRootWindow(disp_display),
  97. shint->x, shint->y, shint->width, shint->height,
  98. 1, dpy_depth, InputOutput, visual, mask, &xswa);
  99. disp_window[num].window = window;
  100. XSelectInput(disp_display, window, event_mask);
  101. XSetStandardProperties(disp_display, window, title, title, None, NULL, 0, shint); /* Tell other applications about this window */
  102. XMapWindow(disp_display, window); /* Map window. */
  103. do { /* Wait for map. */
  104. XNextEvent(disp_display, &xev);
  105. } while (xev.type!=MapNotify || xev.xmap.event!=window);
  106. //XSelectInput(disp_display, window, KeyPressMask); /*  XSelectInput(display, window, NoEventMask);*/
  107. }
  108. window = disp_window[num].window;
  109. XSetStandardProperties(disp_display, window, title, title, None, NULL, 0, shint); /* Tell other applications about this window */
  110. XResizeWindow(disp_display, window, width, height);
  111. XSync(disp_display, 1);
  112. XFree(shint);
  113. }
  114. void disp_sync(void) {
  115. XSync(disp_display, 1);
  116. }
  117. void disp_setcolor(unsigned char *name) {
  118. int screen;
  119. GC gc;
  120. XColor c_exact, c_nearest;
  121. Colormap cm;
  122. Status st;
  123. screen = DefaultScreen(disp_display);
  124. gc = DefaultGC(disp_display, screen); /* allocate colors */
  125. cm = DefaultColormap(disp_display, screen);
  126. st = XAllocNamedColor(disp_display, cm, name, &c_nearest, &c_exact);
  127. disp_chkerror(st!=1, "XAllocNamedColor error");
  128. XSetForeground(disp_display, gc, c_nearest.pixel);
  129. }
  130. void disp_gray(int num, char *data, int width, int height, int stride, const unsigned char *tit) {
  131. Visual *visual;
  132. XImage *ximage;
  133. unsigned char *image;
  134. int y,x,pixelsize;
  135. char dummy;
  136. int t = 1;
  137. int dpy_depth;
  138. int screen;
  139. GC gc;
  140. //XEvent xev;
  141. disp_init_display();
  142. disp_init_window(num, width, height, tit);
  143. screen = DefaultScreen(disp_display);
  144. visual = DefaultVisual(disp_display, screen);
  145. dpy_depth = DefaultDepth(disp_display, screen);
  146. ximage = XCreateImage(disp_display, visual, dpy_depth, ZPixmap, 0, &dummy, width, height, 8, 0);
  147. disp_chkerror(!ximage, "no ximage");
  148. if (*(char *)&t == 1) {
  149. ximage->byte_order = LSBFirst;
  150. ximage->bitmap_bit_order = LSBFirst;
  151. } else {
  152. ximage->byte_order = MSBFirst;
  153. ximage->bitmap_bit_order = MSBFirst;
  154. }
  155. pixelsize = dpy_depth>8 ? sizeof(int) : sizeof(unsigned char);
  156. image = malloc(width * height * pixelsize);
  157. disp_chkerror(!image, "malloc failed");
  158. for (y=0; y<height; y++) for (x=0; x<width; x++) {
  159. memset(&image[(width*y + x)*pixelsize], data[y*stride+x], pixelsize);
  160. }
  161. ximage->data = image;
  162. gc = DefaultGC(disp_display, screen); /* allocate colors */
  163. // XUnmapWindow(disp_display, disp_window[num].window); /* Map window. */
  164. // XMapWindow(disp_display, disp_window[num].window); /* Map window. */
  165. XPutImage(disp_display, disp_window[num].window, gc, ximage, 0, 0, 0, 0, width, height);
  166. // do { /* Wait for map. */
  167. // XNextEvent(disp_display, &xev);
  168. // } while (xev.type!=MapNotify || xev.xmap.event!=disp_window[num].window);
  169. XPutImage(disp_display, disp_window[num].window, gc, ximage, 0, 0, 0, 0, width, height);
  170. XDestroyImage(ximage);
  171. XSync(disp_display, 1);
  172. }
  173. void disp_gray_zoom(int num, char *data, int width, int height, int stride, const unsigned char *tit, int zoom) {
  174. unsigned char *dataz;
  175. int y,x,y0,x0;
  176. dataz = malloc(width*zoom * height*zoom);
  177. disp_chkerror(!dataz, "malloc");
  178. for (y=0; y<height; y++) for (x=0; x<width; x++) {
  179. for (y0=0; y0<zoom; y0++) for (x0=0; x0<zoom; x0++) {
  180. dataz[(y*zoom + y0)*width*zoom + x*zoom + x0] = data[y*stride+x];
  181. }
  182. }
  183. disp_gray(num, dataz, width*zoom, height*zoom, width*zoom, tit);
  184. free(dataz);
  185. }
  186. void disp_point(int num, int x1, int y1) {
  187. int screen;
  188. GC gc;
  189. screen = DefaultScreen(disp_display);
  190. gc = DefaultGC(disp_display, screen); /* allocate colors */
  191. XDrawPoint(disp_display, disp_window[num].window, gc, x1, y1);
  192. // XSync(disp_display, 1);
  193. }
  194. void disp_line(int num, int x1, int y1, int x2, int y2) {
  195. int screen;
  196. GC gc;
  197. screen = DefaultScreen(disp_display);
  198. gc = DefaultGC(disp_display, screen); /* allocate colors */
  199. XDrawLine(disp_display, disp_window[num].window, gc, x1, y1, x2, y2);
  200. // XSync(disp_display, 1);
  201. }
  202. void disp_rect(int num, int x1, int y1, int x2, int y2) {
  203. int screen;
  204. GC gc;
  205. screen = DefaultScreen(disp_display);
  206. gc = DefaultGC(disp_display, screen); /* allocate colors */
  207. XDrawRectangle(disp_display, disp_window[num].window, gc, x1, y1, x2-x1, y2-y1);
  208. // XSync(disp_display, 1);
  209. }