bool platform_support::load_img_from_dc(unsigned idx, HDC hdc) { if(idx < max_images) { #ifndef _MG_MINIMALGRAF if(m_specific->m_surf_img[idx]) UnloadBitmap(m_specific->m_surf_img[idx]); else m_specific->m_surf_img[idx] = (PBITMAP)calloc(1, sizeof(BITMAP)); #endif #if 0 if (LoadBitmapFromMem(m_specific->m_surf_window, m_specific->m_surf_img[idx], (const void *)LockDC(hdc, NULL, NULL, NULL, NULL), 0, "bmp") != 0) #else HDC tmpdc = CreateCompatibleDC(m_specific->m_surf_window); if(tmpdc == HDC_INVALID) return false; BitBlt(hdc, 0, 0, 0, 0, tmpdc, 0, 0, 0); if ( !GetBitmapFromDC(tmpdc, 0, 0, 240, 320, m_specific->m_surf_img[idx]) ) #endif { DeleteCompatibleDC(tmpdc); return false; } DeleteCompatibleDC(tmpdc); #if 0 FillBoxWithBitmap(HDC_SCREEN, 350, 0, 0, 0, m_specific->m_surf_img[idx]); //BitBlt(hdc, 0, 0, 0, 0, HDC_SCREEN, 500, 0, true); #endif #if 0 printf("load img: w=%d, h=%d, pitch=%d, pixels=%x\n", m_specific->m_surf_img[idx]->bmWidth, m_specific->m_surf_img[idx]->bmHeight, m_specific->m_surf_img[idx]->bmPitch, m_specific->m_surf_img[idx]->bmBits); #endif m_rbuf_img[idx].attach(m_specific->m_surf_img[idx]->bmBits, m_specific->m_surf_img[idx]->bmWidth, m_specific->m_surf_img[idx]->bmHeight, m_flip_y?(-m_specific->m_surf_img[idx]->bmPitch): m_specific->m_surf_img[idx]->bmPitch); return true; } return false; }
static int PlatformProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { switch (message) { case MSG_CREATE: { if (!hmWnd) hmWnd = hWnd; unsigned char* pdr = 0; int w,h,p; RECT r; key_down = FALSE; GetClientRect(hWnd, &r); #if RGB555 sdc = CreateMemDC(width, height, 16, MEMDC_FLAG_SWSURFACE, 0x7C00, 0x3E0, 0x1F, 0x8000); #else sdc = CreateMemDC(width, height, 16, MEMDC_FLAG_SWSURFACE, 0xF800, 0x7E0, 0x1F, 0x00); #endif pdr = LockDC(sdc, &r, &w, &h, &p); UnlockDC(sdc); #if RGB555 fmt = COLOR_FORMAT_RGB555; #else fmt = COLOR_FORMAT_RGB565; #endif ps_initialize(); canvas = ps_canvas_create_with_data(pdr, fmt, w, h, p); context = ps_context_create(canvas, 0); on_init(context, width, height); } break; case MSG_TIMER: on_timer(); break; case MSG_PAINT: { HDC hdc = BeginPaint(hWnd); on_draw(context); BitBlt(sdc, 0, 0, width, height, hdc, 0, 0, 0); EndPaint(hWnd, hdc); } return 0; case MSG_ERASEBKGND: return 0; case MSG_LBUTTONDOWN: { key_down = TRUE; on_mouse_event(LEFT_BUTTON_DOWN, key_conv(wParam), LOSWORD(lParam), HISWORD(lParam)); } break; case MSG_LBUTTONUP: { key_down = FALSE; on_mouse_event(LEFT_BUTTON_UP, key_conv(wParam), LOSWORD(lParam), HISWORD(lParam)); } break; case MSG_MOUSEMOVE: { DWORD k = key_conv(wParam); if (key_down) k |= EVT_LBUTTON; on_mouse_event(MOUSE_MOVE, k, LOSWORD(lParam), HISWORD(lParam)); } break; case MSG_KEYDOWN: on_key_event(KEY_EVENT_DOWN, get_virtual_key(wParam)); break; case MSG_KEYUP: on_key_event(KEY_EVENT_UP, get_virtual_key(wParam)); break; case MSG_SIZECHANGED: { RECT r; int w,h,p; unsigned char* pdr = 0; ps_canvas* old_canvas = 0; RECT* rc = (RECT*)lParam; width = RECTWP(rc); height = RECTHP(rc); if (sdc) DeleteMemDC(sdc); if (width < 1) width = 1; if (height < 1) height = 1; #if RGB555 sdc = CreateMemDC(width, height, 16, MEMDC_FLAG_SWSURFACE, 0x7C00, 0x3E0, 0x1F, 0x8000); #else sdc = CreateMemDC(width, height, 16, MEMDC_FLAG_SWSURFACE, 0xF800, 0x7E0, 0x1F, 0x00); #endif GetClientRect(hWnd, &r); pdr = LockDC(sdc, &r, &w, &h, &p); UnlockDC(sdc); canvas = ps_canvas_create_with_data(pdr, fmt, w, h, p); old_canvas = ps_context_set_canvas(context, canvas); ps_canvas_unref(old_canvas); on_size(width, height); } break; case MSG_CLOSE: on_term(context); ps_context_unref(context); ps_canvas_unref(canvas); ps_shutdown(); DeleteMemDC(sdc); DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; } return DefaultMainWinProc(hWnd, message, wParam, lParam); }
//------------------------------------------------------------------------ bool platform_support::init(unsigned width, unsigned height, unsigned flags) { m_window_flags = flags; unsigned wflags = MEMDC_FLAG_SWSURFACE; if(m_window_flags & window_hw_buffer) { wflags = MEMDC_FLAG_HWSURFACE; } /* if(m_window_flags & window_resize) { wflags |= GAL_RESIZABLE; } */ //SDL_WM_SetCaption(m_caption, 0); if(m_specific->m_surf_window) DeleteMemDC(m_specific->m_surf_window); #if 0 printf("init memdc: w=%d, h=%d, m_bpp=%d, wflags=%d\n", width, height, m_bpp, wflags); printf("init memdc: m_rmask=%x, m_gmask=%x, m_bmask=%x, m_amask=%x\n", m_specific->m_rmask, m_specific->m_gmask, m_specific->m_bmask, m_specific->m_amask); #endif m_specific->m_surf_window = CreateMemDC( width, height, m_bpp, wflags, m_specific->m_rmask, m_specific->m_gmask, m_specific->m_bmask, m_specific->m_amask); if(m_specific->m_surf_window == 0) { fprintf(stderr, "Unable to create image buffer %dx%d %d bpp: %s\n", width, height, m_bpp, //SDL_GetError()); "failed"); return false; } int pitch = width * (m_bpp/8); //printf("init, pitch=%d\n", pitch); #if 0 m_rbuf_window.attach((unsigned char*)PIXEL(SURFACE(m_specific->m_surf_window)), width, height, m_flip_y ? -pitch:pitch); #else m_rbuf_window.attach((unsigned char*)LockDC(m_specific->m_surf_window, NULL, NULL, NULL, NULL), width, height, m_flip_y ? -pitch:pitch); #endif if(!m_specific->m_initialized) { m_initial_width = width; m_initial_height = height; on_init(); m_specific->m_initialized = true; } on_resize(m_rbuf_window.width(), m_rbuf_window.height()); m_specific->m_update_flag = true; return true; }