void ScrollView::scrollBy(int dx, int dy) { wxWindow* win = nativeWindow(); if (!win) return; wxPoint scrollOffset = m_data->viewStart; wxPoint orig(scrollOffset); wxPoint newScrollOffset = scrollOffset + wxPoint(dx, dy); wxRect vRect(win->GetVirtualSize()); wxRect cRect(win->GetClientSize()); // clamp to scroll area if (newScrollOffset.x < 0) newScrollOffset.x = 0; else if (newScrollOffset.x + cRect.width > vRect.width) newScrollOffset.x = max(0, vRect.width - cRect.width - 1); if (newScrollOffset.y < 0) newScrollOffset.y = 0; else if (newScrollOffset.y + cRect.height > vRect.height) newScrollOffset.y = max(0, vRect.height - cRect.height - 1); if (newScrollOffset == scrollOffset) return; m_data->viewStart = newScrollOffset; wxPoint delta(orig - newScrollOffset); if (m_data->hasStaticBackground) win->Refresh(); else win->ScrollWindow(delta.x, delta.y); adjustScrollbars(); }
// ----------------------------------------------------------------------------- // CTestPlatAlfVisual::TestAlfEnvNewDisplayL // ----------------------------------------------------------------------------- // TInt CTestPlatAlfVisual::TestAlfEnvNewDisplayL( CStifItemParser& /*aItem*/ ) { _LIT( KTestPlatAlfVisual, "TestPlatAlfVisual" ); _LIT( KTestAlfEnvNewDisplayL, "TestAlfEnvNewDisplayL" ); TestModuleIf().Printf( 0, KTestPlatAlfVisual, KTestAlfEnvNewDisplayL ); // Print to log file iLog->Log( KTestAlfEnvNewDisplayL ); TRect vRect( 0, 0, 1, 1 ); TUid vUid = { 0x00000001 }; STIF_ASSERT_EQUALS( 1, iAlfEnv->DisplayCount() ); STIF_ASSERT_SAME( iAlfDisplay, &iAlfEnv->PrimaryDisplay() ); TRAPD( err, iAlfEnv->NewDisplayL( vRect, CAlfEnv::ENewDisplayAsCoeControl, NULL, CAlfDisplay::EDisplayNormal, vUid ) ); if ( err != KErrNone ) { return KErrNone; } else { return KErrNone; } }
void ScrollView::platformSetScrollPosition(const IntPoint& scrollPoint) { wxWindow* win = platformWidget(); wxPoint scrollOffset = m_data->viewStart; wxPoint orig(scrollOffset); wxPoint newScrollOffset(scrollPoint); wxRect vRect(win->GetVirtualSize()); wxRect cRect(win->GetClientSize()); // clamp to scroll area if (newScrollOffset.x < 0) newScrollOffset.x = 0; else if (newScrollOffset.x + cRect.width > vRect.width) newScrollOffset.x = max(0, vRect.width - cRect.width); if (newScrollOffset.y < 0) newScrollOffset.y = 0; else if (newScrollOffset.y + cRect.height > vRect.height) newScrollOffset.y = max(0, vRect.height - cRect.height); if (newScrollOffset == scrollOffset) return; m_data->viewStart = newScrollOffset; wxPoint delta(orig - newScrollOffset); if (canBlitOnScroll()) win->ScrollWindow(delta.x, delta.y); else win->Refresh(); adjustScrollbars(); }
void MapView::draw(const Rect& rect) { // update visible tiles cache when needed if(m_mustUpdateVisibleTilesCache || m_updateTilesPos > 0) updateVisibleTilesCache(m_mustUpdateVisibleTilesCache ? 0 : m_updateTilesPos); float scaleFactor = m_tileSize/(float)Otc::TILE_PIXELS; Position cameraPosition = getCameraPosition(); int drawFlags = 0; if(m_viewMode == NEAR_VIEW) drawFlags = Otc::DrawGround | Otc::DrawGroundBorders | Otc::DrawWalls | Otc::DrawItems | Otc::DrawCreatures | Otc::DrawEffects | Otc::DrawMissiles | Otc::DrawAnimations; else drawFlags = Otc::DrawGround | Otc::DrawGroundBorders | Otc::DrawWalls | Otc::DrawItems; Size tileSize = Size(1,1) * m_tileSize; if(m_mustDrawVisibleTilesCache || (drawFlags & Otc::DrawAnimations)) { m_framebuffer->bind(); if(m_mustCleanFramebuffer) { Rect clearRect = Rect(0, 0, m_drawDimension * m_tileSize); g_painter->setColor(Color::black); g_painter->drawFilledRect(clearRect); } g_painter->setColor(Color::white); auto it = m_cachedVisibleTiles.begin(); auto end = m_cachedVisibleTiles.end(); for(int z=m_cachedLastVisibleFloor;z>=m_cachedFirstVisibleFloor;--z) { while(it != end) { const TilePtr& tile = *it; Position tilePos = tile->getPosition(); if(tilePos.z != z) break; else ++it; if(!m_drawMinimapColors) tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags); else { uint8 c = tile->getMinimapColorByte(); if(c == 0) continue; g_painter->setColor(Color::from8bit(c)); g_painter->drawFilledRect(Rect(transformPositionTo2D(tilePos, cameraPosition), tileSize)); } } if(drawFlags & Otc::DrawMissiles && !m_drawMinimapColors) { for(const MissilePtr& missile : g_map.getFloorMissiles(z)) { missile->draw(transformPositionTo2D(missile->getPosition(), cameraPosition), scaleFactor, drawFlags & Otc::DrawAnimations); } } } m_framebuffer->release(); // generating mipmaps each frame can be slow in older cards //m_framebuffer->getTexture()->buildHardwareMipmaps(); m_mustDrawVisibleTilesCache = false; } Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize; if(isFollowingCreature()) drawOffset += m_followingCreature->getWalkOffset() * scaleFactor; Size srcSize = rect.size(); Size srcVisible = m_visibleDimension * m_tileSize; srcSize.scale(srcVisible, Fw::KeepAspectRatio); drawOffset.x += (srcVisible.width() - srcSize.width()) / 2; drawOffset.y += (srcVisible.height() - srcSize.height()) / 2; Rect srcRect = Rect(drawOffset, srcSize); g_painter->setColor(Color::white); glDisable(GL_BLEND); g_painter->setShaderProgram(m_shader); #if 0 // debug source area g_painter->saveAndResetState(); m_framebuffer->bind(); g_painter->setColor(Color::green); g_painter->drawBoundingRect(srcRect, 2); m_framebuffer->release(); g_painter->restoreSavedState(); m_framebuffer->draw(rect); #else m_framebuffer->draw(rect, srcRect); #endif g_painter->resetShaderProgram(); glEnable(GL_BLEND); // this could happen if the player position is not known yet if(!cameraPosition.isValid()) return; float horizontalStretchFactor = rect.width() / (float)srcRect.width(); float verticalStretchFactor = rect.height() / (float)srcRect.height(); // avoid drawing texts on map in far zoom outs if(m_viewMode == NEAR_VIEW && m_drawTexts) { for(const CreaturePtr& creature : m_cachedFloorVisibleCreatures) { Point creatureOffset = Point(16 - creature->getDisplacementX(), -3 - creature->getDisplacementY()); Position pos = creature->getPosition(); Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset; p += (creature->getDrawOffset() + creatureOffset) * scaleFactor; p.x = p.x * horizontalStretchFactor; p.y = p.y * verticalStretchFactor; p += rect.topLeft(); creature->drawInformation(p, g_map.isCovered(pos, m_cachedFirstVisibleFloor), rect); } for(const StaticTextPtr& staticText : g_map.getStaticTexts()) { Position pos = staticText->getPosition(); // ony draw static texts from current camera floor, unless yells //if(pos.z != cameraPosition.z && !staticText->isYell()) // continue; Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset; p.x = p.x * horizontalStretchFactor; p.y = p.y * verticalStretchFactor; p += rect.topLeft(); staticText->drawText(p, rect); } for(const AnimatedTextPtr& animatedText : g_map.getAnimatedTexts()) { Position pos = animatedText->getPosition(); // only draw animated texts from visible floors if(pos.z < m_cachedFirstVisibleFloor || pos.z > m_cachedLastVisibleFloor) continue; // dont draw animated texts from covered tiles if(pos.z != cameraPosition.z && g_map.isCovered(pos, m_cachedFirstVisibleFloor)) continue; Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset; p.x = p.x * horizontalStretchFactor; p.y = p.y * verticalStretchFactor; p += rect.topLeft(); animatedText->drawText(p, rect); } } else if(m_viewMode > NEAR_VIEW) { // draw a cross in the center instead of our creature /* Known Issue: Changing Z axis causes the cross to go off a little bit. */ Rect vRect(0, 0, 2, 10); Rect hRect(0, 0, 10, 2); g_painter->setColor(Color::white); if(!m_follow && m_followingCreature) { Position pos = m_followingCreature->getPosition(); Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset; p.x = p.x * horizontalStretchFactor; p.y = p.y * verticalStretchFactor; p += rect.topLeft(); vRect.setX(p.x); vRect.setY(p.y - 4); hRect.setX(p.x - 4); hRect.setY(p.y); hRect.setWidth(10); hRect.setHeight(2); vRect.setWidth(2); vRect.setHeight(10); } else { vRect.moveCenter(rect.center()); hRect.moveCenter(rect.center()); } g_painter->drawFilledRect(vRect); g_painter->drawFilledRect(hRect); } }
bool wxListBox::OS2OnDraw ( WXDRAWITEMSTRUCT* pItem ) { POWNERITEM pDrawStruct = (POWNERITEM)pItem; LONG lItemID = pDrawStruct->idItem; int eAction = 0; int eStatus = 0; // // Only owner-drawn control should receive this message // wxCHECK(((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false); // // The item may be -1 for an empty listbox // if (lItemID == -1L) return false; wxListBoxItem* pData = (wxListBoxItem*)PVOIDFROMMR( ::WinSendMsg( GetHwnd() ,LM_QUERYITEMHANDLE ,MPFROMLONG(pDrawStruct->idItem) ,(MPARAM)0 ) ); wxCHECK(pData, false ); wxDC vDc; wxPoint pt1( pDrawStruct->rclItem.xLeft, pDrawStruct->rclItem.yTop ); wxPoint pt2( pDrawStruct->rclItem.xRight, pDrawStruct->rclItem.yBottom ); wxRect vRect( pt1, pt2 ); vDc.SetHPS(pDrawStruct->hps); if (pDrawStruct->fsAttribute == pDrawStruct->fsAttributeOld) { // // Entire Item needs to be redrawn (either it has reappeared from // behind another window or is being displayed for the first time // eAction = wxOwnerDrawn::wxODDrawAll; if (pDrawStruct->fsAttribute & MIA_HILITED) { // // If it is currently selected we let the system handle it // eStatus |= wxOwnerDrawn::wxODSelected; } if (pDrawStruct->fsAttribute & MIA_CHECKED) { // // If it is currently checked we draw our own // eStatus |= wxOwnerDrawn::wxODChecked; pDrawStruct->fsAttributeOld = pDrawStruct->fsAttribute &= ~MIA_CHECKED; } if (pDrawStruct->fsAttribute & MIA_DISABLED) { // // If it is currently disabled we let the system handle it // eStatus |= wxOwnerDrawn::wxODDisabled; } // // Don't really care about framed (indicationg focus) or NoDismiss // } else { if (pDrawStruct->fsAttribute & MIA_HILITED) { eAction = wxOwnerDrawn::wxODDrawAll; eStatus |= wxOwnerDrawn::wxODSelected; // // Keep the system from trying to highlight with its bogus colors // pDrawStruct->fsAttributeOld = pDrawStruct->fsAttribute &= ~MIA_HILITED; } else if (!(pDrawStruct->fsAttribute & MIA_HILITED)) { eAction = wxOwnerDrawn::wxODDrawAll; eStatus = 0; // // Keep the system from trying to highlight with its bogus colors // pDrawStruct->fsAttribute = pDrawStruct->fsAttributeOld &= ~MIA_HILITED; } else { // // For now we don't care about anything else // just ignore the entire message! // return true; } } return pData->OnDrawItem( vDc ,vRect ,(wxOwnerDrawn::wxODAction)eAction ,(wxOwnerDrawn::wxODStatus)eStatus ); } // end of wxListBox::OS2OnDraw