//-------------------------------------------------------------------------- // Create a canvas //-------------------------------------------------------------------------- CNV_HANDLE APIENTRY CNVCreate( CONST INT hdcCompatable, CONST INT nWidth, CONST INT nHeight, CONST INT nUseDX ) { // Allocate a new canvas CCanvas *cnv = new CCanvas(); // Create the canvas cnv->CreateBlank(HDC(hdcCompatable), nWidth, nHeight, nUseDX); // Push the canvas onto the list m_canvases.push_back(cnv); // Return the canvas' address return reinterpret_cast<CNV_HANDLE>(cnv); }
/* * Run the cursor map and return the chose option, * with zero as the first index. */ int CCursorMap::run() { extern int g_resX, g_resY; extern CDirectDraw *g_pDirectDraw; extern CCanvas *g_cnvCursor; extern void closeSystems(); CCanvas cnv; cnv.CreateBlank(NULL, g_resX, g_resY, TRUE); g_pDirectDraw->CopyScreenToCanvas(&cnv); int toRet = 0, pos = -1; MSG message; while (true) { const DWORD time = GetTickCount() + 50; while (GetTickCount() < time) { if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { if (message.message == WM_QUIT) { closeSystems(); exit(message.wParam); } else { TranslateMessage(&message); DispatchMessage(&message); } } } BYTE keys[256]; extern IDirectInputDevice8A *g_lpdiKeyboard; if (FAILED(g_lpdiKeyboard->GetDeviceState(256, keys))) { continue; } if ((keys[DIK_UP] & 0x80) || (keys[DIK_LEFT] & 0x80)) { if (toRet) --toRet; else toRet = m_points.size() - 1; } else if ((keys[DIK_DOWN] & 0x80) || (keys[DIK_RIGHT] & 0x80)) { if (toRet != (m_points.size() - 1)) ++toRet; else toRet = 0; } else if ((keys[DIK_RETURN] & 0x80) || (keys[DIK_SPACE] & 0x80)) { break; } if (toRet != pos) { g_pDirectDraw->DrawCanvas(&cnv, 0, 0); g_pDirectDraw->DrawCanvasTransparent(g_cnvCursor, m_points[toRet].x - 40, m_points[toRet].y - 10, RGB(255, 0, 0)); g_pDirectDraw->Refresh(); Sleep(80); } pos = toRet; } g_pDirectDraw->DrawCanvas(&cnv, 0, 0); g_pDirectDraw->Refresh(); return toRet; }
/* * Render all frames of a file (not gif specific). */ bool CAnimation::renderFileFrame(CCanvas *, unsigned int) { extern STRING g_projectPath; if (m_data.filename.empty()) return false; const STRING file = resolve(g_projectPath + MISC_PATH + m_data.filename); FIMULTIBITMAP *mbmp = FreeImage_OpenMultiBitmap( FreeImage_GetFileType(getAsciiString(file).c_str(), 16), getAsciiString(file).c_str(), FALSE, TRUE, TRUE ); if (!mbmp) return false; // Create ambient level canvas. extern AMBIENT_LEVEL g_ambientLevel; CCanvas cnvAl; if (g_ambientLevel.color) { cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); } // Intermediate canvas. CCanvas cnv; cnv.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); freeCanvases(); m_canvases.clear(); for (int i = 0; i != m_data.frameCount; ++i) { CONST HDC hdc = cnv.OpenDC(); FIBITMAP *bmp = FreeImage_LockPage(mbmp, i); SetDIBitsToDevice( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, 0, FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS ); /* No need to stretch gif. StretchDIBits( hdc, 0, 0, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY );*/ FreeImage_UnlockPage(mbmp, bmp, FALSE); cnv.CloseDC(hdc); // Apply ambient level. if (g_ambientLevel.color) { cnvAl.BltAdditivePart(cnv.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[i]); } // Blt to the member canvas. CCanvas *pCnv = new CCanvas(); pCnv->CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); pCnv->ClearScreen(TRANSP_COLOR); cnv.BltTransparent(pCnv, 0, 0, m_data.transpColors[i]); m_canvases.push_back(pCnv); } FreeImage_CloseMultiBitmap(mbmp, 0); return true; }
/* * Render a particular frame to a canvas (not gif specific). */ bool CAnimation::renderFileFrame(CCanvas *cnv, unsigned int frame) { extern STRING g_projectPath; cnv->ClearScreen(TRANSP_COLOR); // Wrap around. frame %= m_data.frameCount; if (m_data.filename.empty()) return false; const STRING file = resolve(g_projectPath + MISC_PATH + m_data.filename); FIMULTIBITMAP *mbmp = FreeImage_OpenMultiBitmap( FreeImage_GetFileType(getAsciiString(file).c_str(), 16), getAsciiString(file).c_str(), FALSE, TRUE, TRUE ); if (!mbmp) return false; CCanvas cnvImg; cnvImg.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); const int pageCount = FreeImage_GetPageCount(mbmp); if (frame < pageCount) { CONST HDC hdc = cnvImg.OpenDC(); FIBITMAP *bmp = FreeImage_LockPage(mbmp, frame); SetDIBitsToDevice( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, 0, FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS ); /* No need to stretch gif. StretchDIBits( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY );*/ FreeImage_UnlockPage(mbmp, bmp, FALSE); cnvImg.CloseDC(hdc); } FreeImage_CloseMultiBitmap(mbmp, 0); // Apply ambient level. extern AMBIENT_LEVEL g_ambientLevel; if (g_ambientLevel.color) { CCanvas cnvAl; cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); cnvAl.BltAdditivePart(cnvImg.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[frame]); } cnvImg.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); return true; }
/* * Render a particular frame to a canvas. */ bool CAnimation::renderAnmFrame(CCanvas *cnv, unsigned int frame) { extern STRING g_projectPath; cnv->ClearScreen(TRANSP_COLOR); // Wrap around. frame %= m_data.frameCount; const STRING frameFile = m_data.frameFiles[frame]; if (frameFile.empty()) return false; const STRING ext = parser::uppercase(getExtension(frameFile)); if (ext == _T("TBM") || ext.substr(0, 3) == _T("TST") || ext == _T("GPH")) { TILE_BITMAP tbm; if (ext == _T("TBM")) { if (!tbm.open(g_projectPath + BMP_PATH + frameFile)) return false; } else { // Set up a 1x1 tile bitmap. tbm.resize(1, 1); tbm.tiles[0][0] = frameFile; } // Draw the tilebitmap and mask to new canvases. const int w = tbm.width * 32, h = tbm.height * 32; CCanvas cnvTbm, cnvMaskTbm; cnvTbm.CreateBlank(NULL, w, h, TRUE); cnvMaskTbm.CreateBlank(NULL, w, h, TRUE); if (tbm.draw(&cnvTbm, &cnvMaskTbm, 0, 0)) { // Stretch the canvas and mask to an intermediate canvas. CCanvas cnvInt; cnvInt.CreateBlank(NULL, w, h, TRUE); cnvInt.ClearScreen(m_data.transpColors[frame]); cnvTbm.BltStretchMask( &cnvMaskTbm, &cnvInt, 0, 0, 0, 0, w, h, m_data.pxWidth, m_data.pxHeight ); // Blt to the target canvas. cnvInt.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); } } else { // Image file. const STRING strFile = resolve(g_projectPath + BMP_PATH + frameFile); FIBITMAP *bmp = FreeImage_Load( FreeImage_GetFileType(getAsciiString(strFile).c_str(), 16), getAsciiString(strFile).c_str() ); CCanvas cnvImg; cnvImg.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); CONST HDC hdc = cnvImg.OpenDC(); StretchDIBits( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY ); FreeImage_Unload(bmp); cnvImg.CloseDC(hdc); // Apply ambient level. extern AMBIENT_LEVEL g_ambientLevel; if (g_ambientLevel.color) { CCanvas cnvAl; cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); cnvAl.BltAdditivePart(cnvImg.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[frame]); } cnvImg.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); } // if (ext == TBM) return true; }