⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xwin.c.svn-base

📁 A Flash Player with ActionScript support. Write in C and C++. It have two part, one is Player and an
💻 SVN-BASE
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>#include <X11/Xlib.h>#include <X11/keysym.h>#include <X11/cursorfont.h>#include <X11/Xutil.h>#include <X11/extensions/XShm.h>#include <assert.h>#include "base_types.h"#include "swf_file_pub.h"#include "player_pub.h"#include "xwin_pub.h"//extern GraphicDevice gd;//extern void RenderPrepare(GraphicDevice *gd,FlashDisplay  *fd);long FlashGraphicInitX11(xwin_t *xwin_p) {    XPixmapFormatValues 	*pf;    long			bpl;	// Bytes per line    long			bpp;	// Bytes per pixel    long			pad;	// Scanline pad in byte    int 			n;    bpp = 0;    pad = 0;    // Get screen info    for(pf=XListPixmapFormats(xwin_p->dpy, &n); n--; pf++) {        if (pf->depth == DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy))) {            bpp = pf->bits_per_pixel/8;            pad = pf->scanline_pad/8;        }    }    xwin_p->win_ox = 0;    xwin_p->win_oy = 0;    if (bpp) {        bpl = (xwin_p->win_width*bpp + pad-1)/pad*pad;    } else {        bpl = (xwin_p->win_width/8 + pad-1)/pad*pad;    }    XSelectInput(xwin_p->dpy, xwin_p->movie, ExposureMask|ButtonReleaseMask|ButtonPressMask|PointerMotionMask);    // Prepare data for Direct Graphics    xwin_p->segInfo.readOnly = False;    //xwin_p->segInfo.shmid = shmget(IPC_PRIVATE,xwin_p->win_height*bpl,IPC_CREAT|0777);    xwin_p->segInfo.shmid = shmget(IPC_PRIVATE,4000*bpl,IPC_CREAT|0777);    assert(xwin_p->segInfo.shmid >=0);    xwin_p->segInfo.shmaddr = (unsigned char*)shmat(xwin_p->segInfo.shmid, 0, 0);    assert((long)xwin_p->segInfo.shmaddr != -1);    XShmAttach(xwin_p->dpy, &xwin_p->segInfo);    XSync(xwin_p->dpy, False);    xwin_p->fd.pixels = (unsigned char*)malloc(4000*bpl);    xwin_p->fd.pixels1 = (unsigned char*)xwin_p->segInfo.shmaddr;    xwin_p->fd.width = xwin_p->win_width;    xwin_p->fd.height = xwin_p->win_height;    xwin_p->fd.bpl = bpl;    printf("width=%d  height is %d  bpl is %d\n",xwin_p->fd.width,xwin_p->fd.height,xwin_p->fd.bpl);    xwin_p->fd.depth = DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy));    xwin_p->fd.bpp = bpp;    xwin_p->canvas = XShmCreatePixmap(xwin_p->dpy                                      ,xwin_p->movie                                      ,xwin_p->segInfo.shmaddr                                      ,&xwin_p->segInfo                                      ,xwin_p->fd.width                                      ,xwin_p->fd.height                                      ,DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy)));    xwin_p->gc = DefaultGC(xwin_p->dpy, DefaultScreen(xwin_p->dpy));    XSync(xwin_p->dpy, False);    //    buttonCursor = XCreateFontCursor(dpy, XC_hand2);    XFlush(xwin_p->dpy);    return 0;}void xwin_draw_frame(xwin_t *xwin_p,int all) {    XLockDisplay(xwin_p->dpy);    XSetFunction(xwin_p->dpy,xwin_p->gc,GXcopy);    //all=1;    unsigned char *test;    unsigned short *p1;    unsigned long *p;    int x,y;    if (all) {        for(y=0;y<=xwin_p->fd.height;y++) {            p1=(unsigned short *)((unsigned char*)(xwin_p->fd.pixels1)+(xwin_p->fd.bpl)*y);            p= (unsigned long *)((unsigned char*)(xwin_p->fd.pixels)+xwin_p->fd.bpl*y*2);            for(x=0;x<=xwin_p->fd.width;x++) {                *(p1+x)=(((*(p+x))>>8)&0x0000F800)|(((*(p+x))>>5)&0x000007E0)|(((*(p+x))>>3)&0x0000001F);            }        }        XCopyArea(xwin_p->dpy,xwin_p->canvas,xwin_p->movie,xwin_p->gc,                  0,0,                  xwin_p->fd.width,xwin_p->fd.height,                  xwin_p->win_ox, xwin_p->win_oy                 );    } else {        for(y=xwin_p->fd.clip_y;y<=(xwin_p->fd.clip_y+xwin_p->fd.clip_height);y++) {            p1=(unsigned short *)((unsigned char*)(xwin_p->fd.pixels1)+(xwin_p->fd.bpl)*y)+xwin_p->fd.clip_x;            p= (unsigned long *)((unsigned char*)(xwin_p->fd.pixels)+xwin_p->fd.bpl*y*2)+xwin_p->fd.clip_x;            for(x=0;x<=xwin_p->fd.width;x++) {                *(p1+x)=(((*(p+x))>>8)&0x0000F800)|(((*(p+x))>>5)&0x000007E0)|(((*(p+x))>>3)&0x0000001F);            }        }        XCopyArea(xwin_p->dpy,xwin_p->canvas,xwin_p->movie,xwin_p->gc,                  xwin_p->fd.clip_x,xwin_p->fd.clip_y,                  xwin_p->fd.clip_width,xwin_p->fd.clip_height,                  xwin_p->fd.clip_x + xwin_p->win_ox, xwin_p->fd.clip_y + xwin_p->win_oy                 );    }    XFlush(xwin_p->dpy);    XUnlockDisplay(xwin_p->dpy);}xwin_t* xwin_new(player_t *player_p) {    xwin_t		*xwin_p;    swf_file_t		*swf_p = (swf_file_t*)(player_p->_level0_p);    XTextProperty 	windowProp;    XInitThreads;    xwin_p 			= g_new0(xwin_t,1);    xwin_p->player_p 		= player_p;    xwin_p->twips_per_pixel	= 20;    xwin_p->win_width		= (swf_p->frame_size.Xmax - swf_p->frame_size.Xmin) / xwin_p->twips_per_pixel;    xwin_p->win_height		= (swf_p->frame_size.Ymax - swf_p->frame_size.Ymin) / xwin_p->twips_per_pixel;    xwin_p->win_visable		= 1;#ifdef WITH_RC    xwin_p->win_visable		= 0;    xwin_p->win_destory		= FALSE;#endif    pthread_mutex_init(&xwin_p->win_mutex,NULL);    xwin_p->dpy = XOpenDisplay(getenv("DISPLAY"));    if (xwin_p->dpy == 0) {        fprintf(stderr,"Can't open X display\n");        exit(1);    }    xwin_p->movie = XCreateSimpleWindow( xwin_p->dpy                                         , RootWindow(xwin_p->dpy, DefaultScreen(xwin_p->dpy))                                         , 0, 0                                         , xwin_p->win_width , xwin_p->win_height                                         , 0                                         , WhitePixel(xwin_p->dpy, DefaultScreen(xwin_p->dpy))                                         , BlackPixel(xwin_p->dpy, DefaultScreen(xwin_p->dpy))                                       );    XMapWindow(xwin_p->dpy, xwin_p->movie);#ifdef WITH_RC    XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1);#endif    FlashGraphicInitX11(xwin_p);    //XXX 屏蔽掉的 Exposure 消息是做什么用的?    XSetGraphicsExposures(xwin_p->dpy,xwin_p->gc,FALSE);    assert( XStringListToTextProperty( &player_p->play_filename_p, 1, &windowProp ) > 0 );    XSetWMName(xwin_p->dpy, xwin_p->movie, &windowProp);    XFree( windowProp.value );    //    RenderPrepare(&gd,&(xwin->fd));    //    setBackgroundColor(&gd,swf_p->BackgroundColor);    //    clearCanvas16(&gd);    //   setMovieDimension(&gd,swf_p->frame_size->Xmax - swf_p->frame_size->Xmin,swf_p->frame_size->Ymax - swf_p->frame_size->Ymin);    //    XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1);    return xwin_p;};void xwin_destory(xwin_t *xwin_p) {    //   XShmDetach (dpy, segInfo);    //    XDestroyImage (image);    //   shmdt (xwin_p->segInfo.shmaddr);    //  shmctl (xwin_p->segInfo.shmid, IPC_RMID, 0);    XLockDisplay(xwin_p->dpy);    XShmDetach(xwin_p->dpy, &xwin_p->segInfo);    //    XFreePixmap(xwin_p->dpy, xwin_p->canvas);    //    XSync(xwin_p->dpy,True);    assert(shmdt(xwin_p->segInfo.shmaddr)==0);    assert(shmctl(xwin_p->segInfo.shmid, IPC_RMID, 0)==0);    XUnmapWindow(xwin_p->dpy,xwin_p->movie);    XDestroyWindow(xwin_p->dpy,xwin_p->movie);    //    printf("p1\n");    //    XSync(xwin_p->dpy,False);    //   printf("p2\n");    XUnlockDisplay(xwin_p->dpy);    XCloseDisplay(xwin_p->dpy);    printf("p3\n");};/*int render_frame(void) {    if(clipRect.Xmin==LONG_MAX&&clipRect.Ymin == LONG_MAX&&clipRect.Xmax == LONG_MIN&&clipRect.Ymax == LONG_MIN)        return 0;    updateClippingRegion(&gd,&clipRect);    clearCanvas16(&gd);    DoRender(_root.ChildrenP);    FlashCopyX11(1);}  */void xwin_move_position(xwin_t *xwin_p) {#ifdef WITH_RC    if (xwin_p->win_dirty == 0)        return;    assert(pthread_mutex_lock(&xwin_p->win_mutex) == 0);    XLockDisplay(xwin_p->dpy);    if (xwin_p->win_visable == 0) {        XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1);        //XXX urlg hack 仅移动窗口还不能将图片隐藏,必须再画一次        //        clearCanvas16(&gd);        //        FlashCopyX11(1);    } else {        XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, xwin_p->win_x, xwin_p->win_y, xwin_p->win_width, xwin_p->win_height);    }    XFlush(xwin_p->dpy);    XUnlockDisplay(xwin_p->dpy);    xwin_p->win_dirty = 0;    assert(pthread_mutex_unlock(&xwin_p->win_mutex) == 0);#endif    return;};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -