void MyPositionController::NextMode(ScreenBase const & screen) { string const kAlohalyticsClickEvent = "$onClick"; // Skip switching to next mode while we are waiting for position. if (IsWaitingForLocation()) { alohalytics::LogEvent(kAlohalyticsClickEvent, LocationModeStatisticsName(location::PendingPosition)); return; } alohalytics::LogEvent(kAlohalyticsClickEvent, LocationModeStatisticsName(m_mode)); // Start looking for location. if (m_mode == location::NotFollowNoPosition) { m_pendingTimer.Reset(); ChangeMode(location::PendingPosition); return; } // Calculate preferred zoom level. int const currentZoom = GetZoomLevel(screen); int preferredZoomLevel = kDoNotChangeZoom; if (currentZoom < kZoomThreshold) preferredZoomLevel = min(GetZoomLevel(screen, m_position, m_errorRadius), kMaxScaleZoomLevel); // In routing not-follow -> follow-and-rotate, otherwise not-follow -> follow. if (m_mode == location::NotFollow) { ChangeMode(m_isInRouting ? location::FollowAndRotate : location::Follow); UpdateViewport(preferredZoomLevel); return; } // From follow mode we transit to follow-and-rotate if compass is available or // routing is enabled. if (m_mode == location::Follow) { if (IsRotationAvailable() || m_isInRouting) { ChangeMode(location::FollowAndRotate); UpdateViewport(preferredZoomLevel); } return; } // From follow-and-rotate mode we can transit to follow mode if routing is disabled. if (m_mode == location::FollowAndRotate) { if (!m_isInRouting) { ChangeMode(location::Follow); ChangeModelView(m_position, 0.0, m_pixelRect.Center(), preferredZoomLevel); } } }
void ImageDocument::ShrinkToFit() { if (!mImageContent) { return; } if (GetZoomLevel() != mOriginalZoomLevel && mImageIsResized && !nsContentUtils::IsChildOfSameType(this)) { return; } // Keep image content alive while changing the attributes. nsCOMPtr<nsIContent> imageContent = mImageContent; nsCOMPtr<nsIDOMHTMLImageElement> image = do_QueryInterface(mImageContent); image->SetWidth(std::max(1, NSToCoordFloor(GetRatio() * mImageWidth))); image->SetHeight(std::max(1, NSToCoordFloor(GetRatio() * mImageHeight))); // The view might have been scrolled when zooming in, scroll back to the // origin now that we're showing a shrunk-to-window version. ScrollImageTo(0, 0, false); if (!mImageContent) { // ScrollImageTo flush destroyed our content. return; } SetModeClass(eShrinkToFit); mImageIsResized = true; UpdateTitleAndCharset(); }
nsresult ImageDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, nsIStreamListener** aDocListener, bool aReset, nsIContentSink* aSink) { nsresult rv = MediaDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener, aReset, aSink); if (NS_FAILED(rv)) { return rv; } mOriginalZoomLevel = Preferences::GetBool(SITE_SPECIFIC_ZOOM, false) ? 1.0 : GetZoomLevel(); NS_ASSERTION(aDocListener, "null aDocListener"); *aDocListener = new ImageListener(this); NS_ADDREF(*aDocListener); return NS_OK; }
void ImageDocument::OnPageShow(bool aPersisted, EventTarget* aDispatchStartTarget) { if (aPersisted) { mOriginalZoomLevel = Preferences::GetBool(SITE_SPECIFIC_ZOOM, false) ? 1.0 : GetZoomLevel(); } MediaDocument::OnPageShow(aPersisted, aDispatchStartTarget); }
void ImageDocument::OnPageShow(bool aPersisted, EventTarget* aDispatchStartTarget) { if (aPersisted) { mOriginalZoomLevel = Preferences::GetBool(SITE_SPECIFIC_ZOOM, false) ? 1.0 : GetZoomLevel(); } RefPtr<ImageDocument> kungFuDeathGrip(this); UpdateSizeFromLayout(); MediaDocument::OnPageShow(aPersisted, aDispatchStartTarget); }
void ImageDocument::ShrinkToFit() { if (!mImageContent) { return; } if (GetZoomLevel() != mOriginalZoomLevel && mImageIsResized && !nsContentUtils::IsChildOfSameType(this)) { // If we're zoomed, so that we don't maintain the invariant that // mImageIsResized if and only if its displayed width/height fit in // mVisibleWidth/mVisibleHeight, then we may need to switch to/from the // overflowingVertical class here, because our viewport size may have // changed and we don't plan to adjust the image size to compensate. Since // mImageIsResized it has a "height" attribute set, and we can just get the // displayed image height by getting .height on the HTMLImageElement. HTMLImageElement* img = HTMLImageElement::FromContent(mImageContent); uint32_t imageHeight = img->Height(); nsDOMTokenList* classList = img->ClassList(); ErrorResult ignored; if (imageHeight > mVisibleHeight) { classList->Add(NS_LITERAL_STRING("overflowingVertical"), ignored); } else { classList->Remove(NS_LITERAL_STRING("overflowingVertical"), ignored); } ignored.SuppressException(); return; } // Keep image content alive while changing the attributes. nsCOMPtr<Element> imageContent = mImageContent; nsCOMPtr<nsIDOMHTMLImageElement> image = do_QueryInterface(imageContent); image->SetWidth(std::max(1, NSToCoordFloor(GetRatio() * mImageWidth))); image->SetHeight(std::max(1, NSToCoordFloor(GetRatio() * mImageHeight))); // The view might have been scrolled when zooming in, scroll back to the // origin now that we're showing a shrunk-to-window version. ScrollImageTo(0, 0, false); if (!mImageContent) { // ScrollImageTo flush destroyed our content. return; } SetModeClass(eShrinkToFit); mImageIsResized = true; UpdateTitleAndCharset(); }
void AccessibleCaret::SetSelectionBarElementStyle(const nsRect& aRect) { int32_t height = nsPresContext::AppUnitsToIntCSSPixels(aRect.height); nsAutoString barStyleStr; barStyleStr.AppendPrintf("margin-top: -%dpx; height: %dpx;", height, height); float zoomLevel = GetZoomLevel(); barStyleStr.AppendPrintf(" width: %.2fpx;", sBarWidth / zoomLevel); ErrorResult rv; SelectionBarElement()->SetAttribute(NS_LITERAL_STRING("style"), barStyleStr, rv); MOZ_ASSERT(!rv.Failed()); AC_LOG("Set bar style: %s", NS_ConvertUTF16toUTF8(barStyleStr).get()); }
AccessibleCaret::PositionChangedResult AccessibleCaret::SetPosition(nsIFrame* aFrame, int32_t aOffset) { if (!CustomContentContainerFrame()) { return PositionChangedResult::NotChanged; } nsRect imaginaryCaretRectInFrame = nsCaret::GetGeometryForFrame(aFrame, aOffset, nullptr); imaginaryCaretRectInFrame = nsLayoutUtils::ClampRectToScrollFrames(aFrame, imaginaryCaretRectInFrame); if (imaginaryCaretRectInFrame.IsEmpty()) { // Don't bother to set the caret position since it's invisible. mImaginaryCaretRect = nsRect(); mZoomLevel = 0.0f; return PositionChangedResult::Invisible; } nsRect imaginaryCaretRect = imaginaryCaretRectInFrame; nsLayoutUtils::TransformRect(aFrame, RootFrame(), imaginaryCaretRect); float zoomLevel = GetZoomLevel(); if (imaginaryCaretRect.IsEqualEdges(mImaginaryCaretRect) && FuzzyEqualsMultiplicative(zoomLevel, mZoomLevel)) { return PositionChangedResult::NotChanged; } mImaginaryCaretRect = imaginaryCaretRect; mZoomLevel = zoomLevel; // SetCaretElementStyle() and SetSelectionBarElementStyle() require the // input rect relative to container frame. nsRect imaginaryCaretRectInContainerFrame = imaginaryCaretRectInFrame; nsLayoutUtils::TransformRect(aFrame, CustomContentContainerFrame(), imaginaryCaretRectInContainerFrame); SetCaretElementStyle(imaginaryCaretRectInContainerFrame, mZoomLevel); SetSelectionBarElementStyle(imaginaryCaretRectInContainerFrame, mZoomLevel); return PositionChangedResult::Changed; }
void AccessibleCaret::SetCaretElementStyle(const nsRect& aRect) { nsPoint position = CaretElementPosition(aRect); nsAutoString styleStr; styleStr.AppendPrintf("left: %dpx; top: %dpx;", nsPresContext::AppUnitsToIntCSSPixels(position.x), nsPresContext::AppUnitsToIntCSSPixels(position.y)); float zoomLevel = GetZoomLevel(); styleStr.AppendPrintf(" width: %.2fpx; height: %.2fpx; margin-left: %.2fpx", sWidth / zoomLevel, sHeight / zoomLevel, sMarginLeft / zoomLevel); ErrorResult rv; CaretElement()->SetAttribute(NS_LITERAL_STRING("style"), styleStr, rv); MOZ_ASSERT(!rv.Failed()); AC_LOG("Set caret style: %s", NS_ConvertUTF16toUTF8(styleStr).get()); }
// Update the "looking around" behavior. void CCSBot::UpdateLookAround(bool updateNow) { // check if looking around has been inhibited // Moved inhibit to allow high priority enemy lookats to still occur if (gpGlobals->time < m_inhibitLookAroundTimestamp) return; const float recentThreatTime = 0.25f; // 1.0f; // Unless we can hear them moving, in which case look towards the noise if (!IsEnemyVisible()) { const float noiseStartleRange = 1000.0f; if (CanHearNearbyEnemyGunfire(noiseStartleRange)) { Vector spot = m_noisePosition; spot.z += HalfHumanHeight; SetLookAt("Check dangerous noise", &spot, PRIORITY_HIGH, recentThreatTime); InhibitLookAround(RANDOM_FLOAT(2.0f, 4.0f)); return; } } // If we recently saw an enemy, look towards where we last saw them if (!IsLookingAtSpot(PRIORITY_MEDIUM) && gpGlobals->time - m_lastSawEnemyTimestamp < recentThreatTime) { ClearLookAt(); Vector spot = m_lastEnemyPosition; // find enemy position on the ground if (GetSimpleGroundHeight(&m_lastEnemyPosition, &spot.z)) { spot.z += HalfHumanHeight; SetLookAt("Last Enemy Position", &spot, PRIORITY_MEDIUM, RANDOM_FLOAT(2.0f, 3.0f), true); return; } } // Look at nearby enemy noises if (UpdateLookAtNoise()) return; if (IsNotMoving()) { // if we're sniping, zoom in to watch our approach points if (IsUsingSniperRifle()) { // low skill bots don't pre-zoom if (GetProfile()->GetSkill() > 0.4f) { if (!IsViewMoving()) { float range = ComputeWeaponSightRange(); AdjustZoom(range); } else { // zoom out if (GetZoomLevel() != NO_ZOOM) SecondaryAttack(); } } } if (m_lastKnownArea == NULL) return; if (gpGlobals->time < m_lookAroundStateTimestamp) return; // if we're sniping, switch look-at spots less often if (IsUsingSniperRifle()) m_lookAroundStateTimestamp = gpGlobals->time + RANDOM_FLOAT(5.0f, 10.0f); else m_lookAroundStateTimestamp = gpGlobals->time + RANDOM_FLOAT(1.0f, 2.0f); if (m_approachPointCount == 0) { ClearLookAt(); return; } int which = RANDOM_LONG(0, m_approachPointCount - 1); Vector spot = m_approachPoint[ which ]; // don't look at the floor, look roughly at chest level // TODO: If this approach point is very near, this will cause us to aim up in the air if were crouching spot.z += HalfHumanHeight; SetLookAt("Approach Point (Hiding)", &spot, PRIORITY_LOW); return; } // Glance at "encouter spots" as we move past them if (m_spotEncounter) { // Check encounter spots if (!IsSafe() && !IsLookingAtSpot(PRIORITY_LOW)) { // allow a short time to look where we're going if (gpGlobals->time < m_spotCheckTimestamp) return; // TODO: Use skill parameter instead of accuracy // lower skills have exponentially longer delays float_precision asleep = (1.0f - GetProfile()->GetSkill()); asleep *= asleep; asleep *= asleep; m_spotCheckTimestamp = gpGlobals->time + asleep * RANDOM_FLOAT(10.0f, 30.0f); // figure out how far along the path segment we are Vector delta = m_spotEncounter->path.to - m_spotEncounter->path.from; float_precision length = delta.Length(); float adx = float(Q_abs(int64(delta.x))); float ady = float(Q_abs(int64(delta.y))); float_precision t; if (adx > ady) t = (pev->origin.x - m_spotEncounter->path.from.x) / delta.x; else t = (pev->origin.y - m_spotEncounter->path.from.y) / delta.y; // advance parameter a bit so we "lead" our checks const float leadCheckRange = 50.0f; t += leadCheckRange / length; if (t < 0.0f) t = 0.0f; else if (t > 1.0f) t = 1.0f; // collect the unchecked spots so far const int MAX_DANGER_SPOTS = 8; HidingSpot *dangerSpot[MAX_DANGER_SPOTS]; int dangerSpotCount = 0; int dangerIndex = 0; const float checkTime = 10.0f; const SpotOrder *spotOrder; for (SpotOrderList::iterator iter = m_spotEncounter->spotList.begin(); iter != m_spotEncounter->spotList.end(); ++iter) { spotOrder = &(*iter); // if we have seen this spot recently, we don't need to look at it if (gpGlobals->time - GetHidingSpotCheckTimestamp(spotOrder->spot) <= checkTime) continue; if (spotOrder->t > t) break; dangerSpot[ dangerIndex++ ] = spotOrder->spot; if (dangerIndex >= MAX_DANGER_SPOTS) dangerIndex = 0; if (dangerSpotCount < MAX_DANGER_SPOTS) ++dangerSpotCount; } if (dangerSpotCount) { // pick one of the spots at random int which = RANDOM_LONG(0, dangerSpotCount - 1); const Vector *checkSpot = dangerSpot[ which ]->GetPosition(); Vector pos = *checkSpot; pos.z += HalfHumanHeight; // glance at the spot for minimum time SetLookAt("Encounter Spot", &pos, PRIORITY_LOW, 0, true, 10.0f); // immediately mark it as "checked", so we don't check it again // if we get distracted before we check it - that's the way it goes SetHidingSpotCheckTimestamp(dangerSpot[which]); } } } }
void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, ScreenBase const & screen) { m2::PointD const oldPos = GetDrawablePosition(); double const oldAzimut = GetDrawableAzimut(); m2::RectD const rect = MercatorBounds::MetresToXY(info.m_longitude, info.m_latitude, info.m_horizontalAccuracy); // Use FromLatLon instead of rect.Center() since in case of large info.m_horizontalAccuracy // there is significant difference between the real location and the estimated one. m_position = MercatorBounds::FromLatLon(info.m_latitude, info.m_longitude); m_errorRadius = rect.SizeX() * 0.5; bool const hasBearing = info.HasBearing(); if ((isNavigable && hasBearing) || (!isNavigable && hasBearing && info.HasSpeed() && info.m_speed > kMinSpeedThresholdMps)) { SetDirection(my::DegToRad(info.m_bearing)); m_lastGPSBearing.Reset(); } if (m_listener) m_listener->PositionChanged(Position()); if (m_isPositionAssigned && (!AlmostCurrentPosition(oldPos) || !AlmostCurrentAzimut(oldAzimut))) { CreateAnim(oldPos, oldAzimut, screen); m_isDirtyViewport = true; } if (m_notFollowAfterPending && m_mode == location::PendingPosition) { ChangeMode(location::NotFollow); if (m_isInRouting) m_routingNotFollowTimer.Reset(); m_notFollowAfterPending = false; } else if (!m_isPositionAssigned) { ChangeMode(m_isFirstLaunch ? location::Follow : m_desiredInitMode); if (!m_isFirstLaunch || !AnimationSystem::Instance().AnimationExists(Animation::MapPlane)) { if (m_mode == location::Follow) ChangeModelView(m_position, kDoNotChangeZoom); else if (m_mode == location::FollowAndRotate) ChangeModelView(m_position, m_drawDirection, m_isInRouting ? GetRoutingRotationPixelCenter() : m_pixelRect.Center(), kDoNotChangeZoom); } } else if (m_mode == location::PendingPosition || m_mode == location::NotFollowNoPosition) { if (m_isInRouting) { ChangeMode(location::FollowAndRotate); UpdateViewport(kMaxScaleZoomLevel); } else { ChangeMode(location::Follow); if (!m_isFirstLaunch) { if (GetZoomLevel(screen, m_position, m_errorRadius) <= kMaxScaleZoomLevel) { m2::PointD const size(m_errorRadius, m_errorRadius); ChangeModelView(m2::RectD(m_position - size, m_position + size)); } else { ChangeModelView(m_position, kMaxScaleZoomLevel); } } else { if (!AnimationSystem::Instance().AnimationExists(Animation::MapPlane)) ChangeModelView(m_position, kDoNotChangeZoom); } } } m_isPositionAssigned = true; SetIsVisible(true); double const kEps = 1e-5; if (fabs(m_lastLocationTimestamp - info.m_timestamp) > kEps) { m_lastLocationTimestamp = info.m_timestamp; m_updateLocationTimer.Reset(); } }