INLINE void pan_display(void) { int pan_changed = 0; /* horizontal panning */ if (input_ui_pressed_repeat(IPT_UI_PAN_LEFT,1)) if (skipcolumns < skipcolumnsmax) { skipcolumns++; osd_mark_dirty (0,0,Machine->scrbitmap->width-1,Machine->scrbitmap->height-1,1); pan_changed = 1; } if (input_ui_pressed_repeat(IPT_UI_PAN_RIGHT,1)) if (skipcolumns > skipcolumnsmin) { skipcolumns--; osd_mark_dirty (0,0,Machine->scrbitmap->width-1,Machine->scrbitmap->height-1,1); pan_changed = 1; } if (input_ui_pressed_repeat(IPT_UI_PAN_DOWN,1)) if (skiplines < skiplinesmax) { skiplines++; osd_mark_dirty (0,0,Machine->scrbitmap->width-1,Machine->scrbitmap->height-1,1); pan_changed = 1; } if (input_ui_pressed_repeat(IPT_UI_PAN_UP,1)) if (skiplines > skiplinesmin) { skiplines--; osd_mark_dirty (0,0,Machine->scrbitmap->width-1,Machine->scrbitmap->height-1,1); pan_changed = 1; } if (pan_changed) { if (use_dirty) init_dirty(1); set_ui_visarea (skipcolumns, skiplines, skipcolumns+gfx_display_columns-1, skiplines+gfx_display_lines-1); } }
/* center image inside the display based on the visual area */ void osd_set_visible_area(int min_x,int max_x,int min_y,int max_y) { int act_width; logerror("set visible area %d-%d %d-%d\n",min_x,max_x,min_y,max_y); act_width = gfx_width; viswidth = max_x - min_x + 1; visheight = max_y - min_y + 1; /* setup xmultiply to handle SVGA driver's (possible) double width */ xmultiply = 1; ymultiply = 1; gfx_display_lines = visheight; gfx_display_columns = viswidth; gfx_xoffset = (act_width - viswidth * xmultiply) / 2; if (gfx_display_columns > act_width / xmultiply) gfx_display_columns = act_width / xmultiply; gfx_yoffset = (gfx_height - visheight * ymultiply) / 2; if (gfx_display_lines > gfx_height / ymultiply) gfx_display_lines = gfx_height / ymultiply; skiplinesmin = min_y; skiplinesmax = visheight - gfx_display_lines + min_y; skipcolumnsmin = min_x; skipcolumnsmax = viswidth - gfx_display_columns + min_x; /* Align on a quadword !*/ gfx_xoffset &= ~7; /* the skipcolumns from mame.cfg/cmdline is relative to the visible area */ skipcolumns = min_x + skipcolumns; skiplines = min_y + skiplines; /* Just in case the visual area doesn't fit */ if (gfx_xoffset < 0) { skipcolumns -= gfx_xoffset; gfx_xoffset = 0; } if (gfx_yoffset < 0) { skiplines -= gfx_yoffset; gfx_yoffset = 0; } /* Failsafe against silly parameters */ if (skiplines < skiplinesmin) skiplines = skiplinesmin; if (skipcolumns < skipcolumnsmin) skipcolumns = skipcolumnsmin; if (skiplines > skiplinesmax) skiplines = skiplinesmax; if (skipcolumns > skipcolumnsmax) skipcolumns = skipcolumnsmax; logerror("gfx_width = %d gfx_height = %d\n" "gfx_xoffset = %d gfx_yoffset = %d\n" "xmin %d ymin %d xmax %d ymax %d\n" "skiplines %d skipcolumns %d\n" "gfx_display_lines %d gfx_display_columns %d\n" "xmultiply %d ymultiply %d\n", gfx_width,gfx_height, gfx_xoffset,gfx_yoffset, min_x, min_y, max_x, max_y, skiplines, skipcolumns,gfx_display_lines,gfx_display_columns,xmultiply,ymultiply); set_ui_visarea(skipcolumns, skiplines, skipcolumns+gfx_display_columns-1, skiplines+gfx_display_lines-1); /* round to a multiple of 4 to avoid missing pixels on the right side */ gfx_display_columns = (gfx_display_columns + 3) & ~3; }
/* Create a display screen, or window, large enough to accomodate a bitmap of the given dimensions. Return a osd_bitmap pointer or 0 in case of error. */ static struct osd_bitmap *GDI_create_display(int width, int height, int depth, int attributes) { unsigned int i; RECT Rect; HMENU hMenu; LOGPALETTE LogPalette; char TitleBuf[256]; This.m_nDepth = depth; if (attributes & VIDEO_TYPE_VECTOR) { if (This.m_bVectorDouble == TRUE) { width *= 2; height *= 2; } /* padding to a DWORD value */ width -= width % 4; height -= height % 4; AdjustVisibleRect(0, 0, width - 1, height - 1); } else { AdjustVisibleRect(Machine->drv->visible_area.min_x, Machine->drv->visible_area.min_y, Machine->drv->visible_area.max_x, Machine->drv->visible_area.max_y); } This.m_nClientWidth = This.m_VisibleRect.m_Width; This.m_nClientHeight = This.m_VisibleRect.m_Height; if ((attributes & VIDEO_PIXEL_ASPECT_RATIO_MASK) == VIDEO_PIXEL_ASPECT_RATIO_1_2) { if (Machine->orientation & ORIENTATION_SWAP_XY) This.m_nClientWidth *= 2; else This.m_nClientHeight *= 2; This.m_bDouble = FALSE; } if (This.m_bDouble == TRUE) { This.m_nClientWidth *= 2; This.m_nClientHeight *= 2; } if (This.m_bUseDirty == TRUE) { if (Machine->orientation & ORIENTATION_SWAP_XY) InitDirty(height, width, NO_DIRTY); else InitDirty(width, height, NO_DIRTY); } /* osd_create_bitmap will swap width and height if neccesary. */ This.m_pMAMEBitmap = osd_new_bitmap(width, height, This.m_nDepth); This.m_pTempBitmap = osd_new_bitmap(width, height, This.m_nDepth); /* Palette */ if (This.m_nDepth == 8) { LogPalette.palVersion = 0x0300; LogPalette.palNumEntries = 1; This.m_hPalette = CreatePalette(&LogPalette); ResizePalette(This.m_hPalette, OSD_NUMPENS); } /* Create BitmapInfo */ This.m_pInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * OSD_NUMPENS); This.m_pInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); This.m_pInfo->bmiHeader.biWidth = (This.m_pMAMEBitmap->line[1] - This.m_pMAMEBitmap->line[0]) / (This.m_nDepth / 8); This.m_pInfo->bmiHeader.biHeight = -(int)(This.m_VisibleRect.m_Height); /* Negative means "top down" */ This.m_pInfo->bmiHeader.biPlanes = 1; This.m_pInfo->bmiHeader.biBitCount = This.m_nDepth; This.m_pInfo->bmiHeader.biCompression = BI_RGB; This.m_pInfo->bmiHeader.biSizeImage = 0; This.m_pInfo->bmiHeader.biXPelsPerMeter = 0; This.m_pInfo->bmiHeader.biYPelsPerMeter = 0; This.m_pInfo->bmiHeader.biClrUsed = 0; This.m_pInfo->bmiHeader.biClrImportant = 0; if (This.m_nDepth == 8) { /* Map image values to palette index */ for (i = 0; i < OSD_NUMPENS; i++) ((WORD*)(This.m_pInfo->bmiColors))[i] = i; } /* Modify the main window to suit our needs. */ hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAIN_MENU)); SetMenu(MAME32App.m_hWnd, hMenu); SetWindowLong(MAME32App.m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME | WS_BORDER); sprintf(TitleBuf, "%s - %s", Machine->gamedrv->description, MAME32App.m_Name); SetWindowText(MAME32App.m_hWnd, TitleBuf); StatusCreate(); This.m_ClientRect.left = 0; This.m_ClientRect.top = 0; This.m_ClientRect.right = This.m_nClientWidth; This.m_ClientRect.bottom = This.m_nClientHeight; /* Calculate size of window based on desired client area. */ Rect.left = This.m_ClientRect.left; Rect.top = This.m_ClientRect.top; Rect.right = This.m_ClientRect.right; Rect.bottom = This.m_ClientRect.bottom + GetStatusHeight(); AdjustWindowRect(&Rect, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME | WS_BORDER, hMenu != NULL); This.m_nWindowWidth = RECT_WIDTH(Rect); This.m_nWindowHeight = RECT_HEIGHT(Rect); SetWindowPos(MAME32App.m_hWnd, HWND_NOTOPMOST, 0, 0, This.m_nWindowWidth, This.m_nWindowHeight, SWP_NOMOVE); This.m_hWndAbout = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), MAME32App.m_hWnd, AboutDialogProc); ShowWindow(MAME32App.m_hWnd, SW_SHOW); SetForegroundWindow(MAME32App.m_hWnd); set_ui_visarea(This.m_VisibleRect.m_Left, This.m_VisibleRect.m_Top, This.m_VisibleRect.m_Left + This.m_VisibleRect.m_Width - 1, This.m_VisibleRect.m_Top + This.m_VisibleRect.m_Height - 1); return This.m_pMAMEBitmap; }