/* * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "internal.h" #include "cursors.h" void GLUTAPIENTRY glutSetCursor( int type ) { const unsigned char *cursor; DFBSurfaceDescription dsc; IDirectFBSurface *shape; if (!g_current || !g_current->window) return; if (g_current->cursor == type) return; switch (type) { case GLUT_CURSOR_RIGHT_ARROW: cursor = &cur_right_arrow[0]; break; case GLUT_CURSOR_LEFT_ARROW: cursor = &cur_left_arrow[0]; break; case GLUT_CURSOR_INFO: cursor = &cur_info[0]; break; case GLUT_CURSOR_DESTROY: cursor = &cur_destroy[0]; break; case GLUT_CURSOR_HELP: cursor = &cur_help[0]; break; case GLUT_CURSOR_CYCLE: cursor = &cur_cycle[0]; break; case GLUT_CURSOR_SPRAY: cursor = &cur_spray[0]; break; case GLUT_CURSOR_WAIT: cursor = &cur_wait[0]; break; case GLUT_CURSOR_TEXT: cursor = &cur_text[0]; break; case GLUT_CURSOR_CROSSHAIR: cursor = &cur_crosshair[0]; break; case GLUT_CURSOR_UP_DOWN: cursor = &cur_up_down[0]; break; case GLUT_CURSOR_LEFT_RIGHT: cursor = &cur_left_right[0]; break; case GLUT_CURSOR_TOP_SIDE: cursor = &cur_top_side[0]; break; case GLUT_CURSOR_BOTTOM_SIDE: cursor = &cur_bottom_side[0]; break; case GLUT_CURSOR_LEFT_SIDE: cursor = &cur_left_side[0]; break; case GLUT_CURSOR_RIGHT_SIDE: cursor = &cur_right_side[0]; break; case GLUT_CURSOR_TOP_LEFT_CORNER: cursor = &cur_top_left[0]; break; case GLUT_CURSOR_TOP_RIGHT_CORNER: cursor = &cur_top_right[0]; break; case GLUT_CURSOR_BOTTOM_RIGHT_CORNER: cursor = &cur_bottom_right[0]; break; case GLUT_CURSOR_BOTTOM_LEFT_CORNER: cursor = &cur_bottom_left[0]; break; case GLUT_CURSOR_NONE: cursor = NULL; break; default: cursor = &cur_right_arrow[0]; break; } dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; dsc.width = dsc.height = cursor ? cursor[0] : 8; dsc.pixelformat = DSPF_ARGB; if (dfb->CreateSurface( dfb, &dsc, &shape )) return; if (cursor) { __u8 *src = (__u8*) &cursor[3]; __u8 *msk = src + cursor[0]*cursor[0]/8; void *dst; int pitch; int x, y; if (shape->Lock( shape, DSLF_WRITE, &dst, &pitch )) { shape->Release( shape ); return; } for (y = 0; y < cursor[0]; y++) { for (x = 0; x < cursor[0]; x++) { ((__u32*)dst)[x] = ((src[x>>3] & (0x80 >> (x&7))) ? 0 : 0x00ffffff) | ((msk[x>>3] & (0x80 >> (x&7))) ? 0xff000000 : 0); } dst += pitch; src += cursor[0]/8; msk += cursor[0]/8; } shape->Unlock( shape ); } else { /* Invisible cursor */ shape->Clear( shape, 0, 0, 0, 0 ); } g_current->window->SetCursorShape( g_current->window, shape, cursor ? cursor[1] : 0, cursor ? cursor[2] : 0 ); g_current->cursor = type; shape->Release( shape ); } void GLUTAPIENTRY glutWarpPointer( int x, int y ) { if (g_current) { if (!g_game) { int wx, wy; g_current->window->GetPosition( g_current->window, &wx, &wy ); primary->WarpCursor( primary, wx+x, wy+y ); } else { g_current->cx = x; g_current->cy = y; } } }