#include "DispP.h" #include "etc.h" Display * Disp_GetDisplay(Disp disp) { return (disp->display); } Colormap Disp_GetColormap(Disp disp) { return (disp->colormap); } int Disp_GetWidth( Disp disp) { return (disp->width ); } int Disp_GetHeight(Disp disp) { return (disp->height); } /*===========================================================================*/ /* 色の取得 */ /*===========================================================================*/ unsigned long Disp_GetPixel(Disp disp, char * color_name) { XColor c0, c1; XAllocNamedColor(disp->display, disp->colormap, color_name, &c0, &c1); return (c0.pixel); } /*===========================================================================*/ /* GC の作成と解放 */ /*===========================================================================*/ GC Disp_CreateGC(Disp disp) { GC gc; gc = XCreateGC(disp->display, disp->root_window, 0, 0); return (gc); } int Disp_DestroyGC(Disp disp, GC gc) { XFreeGC(disp->display, gc); return (0); } /*===========================================================================*/ /* オブジェクトの生成と削除 */ /*===========================================================================*/ /*---------------------------------------------------------------------------*/ /* オブジェクトの生成 */ /*---------------------------------------------------------------------------*/ Disp Disp_Create(char * display_name, int direct_draw) { Disp disp; unsigned long int pixel; disp = (Disp)malloc(sizeof(_Disp)); if (!disp) Error("Disp_Create", "Cannot allocate memory."); disp->display = XOpenDisplay(display_name); if (disp->display == NULL) Error("Disp_Create", "Cannot open display."); disp->screen = DefaultScreen(disp->display); disp->root_window = RootWindow(disp->display, disp->screen); disp->colormap = DefaultColormap(disp->display, disp->screen); disp->width = DisplayWidth( disp->display, disp->screen); disp->height = DisplayHeight(disp->display, disp->screen); disp->depth = DefaultDepth(disp->display, disp->screen); disp->direct_draw = direct_draw; if (disp->direct_draw) { disp->pixmap = NULL; } else { disp->pixmap = XCreatePixmap(disp->display, disp->root_window, disp->width, disp->height, disp->depth); } return (disp); } /*---------------------------------------------------------------------------*/ /* オブジェクトの削除 */ /*---------------------------------------------------------------------------*/ Disp Disp_Destroy(Disp disp) { if (!disp) return (NULL); if (disp->pixmap) XFreePixmap(disp->display, disp->pixmap); if (disp->display) XCloseDisplay(disp->display); free(disp); return (NULL); } /*---------------------------------------------------------------------------*/ /* フラッシュ */ /*---------------------------------------------------------------------------*/ int Disp_Flush(Disp disp) { XEvent ev; if (!disp->direct_draw) { #if 0 XSetWindowBackgroundPixmap(disp->display, disp->root_window, disp->pixmap); #endif XClearWindow(disp->display, disp->root_window); } /* イベントのフラッシュ */ while (XPending(disp->display)) { XNextEvent(disp->display, &ev); } XFlush(disp->display); return (0); } /*---------------------------------------------------------------------------*/ /* X サーバとの Sync.(イベントキューを廃棄する) */ /*---------------------------------------------------------------------------*/ int Disp_Sync(Disp disp) { Disp_Flush(disp); /* リクエストのフラッシュ */ #if 1 XSync(disp->display, True); /* イベントキュー内のイベントを廃棄する */ #else XSync(disp->display, False); /* イベントキュー内のイベントを廃棄しない */ #endif return (0); } /*---------------------------------------------------------------------------*/ /* ピックスマップのクリア */ /*---------------------------------------------------------------------------*/ int Disp_ClearPixmap(Disp disp, GC gc) { if (disp->pixmap) XFillRectangle(disp->display, disp->pixmap, gc, 0, 0, disp->width, disp->height); return (0); } /*---------------------------------------------------------------------------*/ /* ディスプレイのクリア */ /*---------------------------------------------------------------------------*/ int Disp_ClearDisplay(Disp disp, unsigned long pixel) { if (disp->direct_draw) { XSetWindowBackground(disp->display, disp->root_window, pixel); } else { XSetWindowBackgroundPixmap(disp->display, disp->root_window, disp->pixmap); } XClearWindow(disp->display, disp->root_window); Disp_Flush(disp); return (0); } /*---------------------------------------------------------------------------*/ /* 円の描画 */ /*---------------------------------------------------------------------------*/ int Disp_DrawFilledCircle(Disp disp, GC gc, int x, int y, int r) { if (x + r < 0 || disp->width - 1 < x - r || y + r < 0 || disp->height - 1 < y - r) return (0); if (disp->direct_draw) XFillArc(disp->display, disp->root_window, gc, x - r, y - r, r * 2 + 1, r * 2 + 1, 0, 360 * 64); else XFillArc(disp->display, disp->pixmap, gc, x - r, y - r, r * 2 + 1, r * 2 + 1, 0, 360 * 64); return (0); } int Disp_DrawFilledCircles(Disp disp, GC gc, XArc * arcs, int n) { if (n > 0) { if (disp->direct_draw) XFillArcs(disp->display, disp->root_window, gc, arcs, n); else XFillArcs(disp->display, disp->pixmap, gc, arcs, n); } return (0); } /*****************************************************************************/ /* ここまで */ /*****************************************************************************/ /*****************************************************************************/ /* End of File. */ /*****************************************************************************/