void wxGISDisplay::SetDeviceFrame(wxRect &rc) { m_oDeviceFrameRect = rc; if(m_oDeviceFrameRect.GetWidth() % 2 != 0) m_oDeviceFrameRect.SetWidth(m_oDeviceFrameRect.GetWidth() + 1); if(m_oDeviceFrameRect.GetHeight() % 2 != 0) m_oDeviceFrameRect.SetHeight(m_oDeviceFrameRect.GetHeight() + 1); m_dFrameRatio = double(m_oDeviceFrameRect.GetWidth()) / m_oDeviceFrameRect.GetHeight(); m_CurrentBounds = m_RealBounds; SetEnvelopeRatio(m_CurrentBounds, m_dFrameRatio); m_dRotatedBoundsCenterX = m_CurrentBounds.MinX + (m_CurrentBounds.MaxX - m_CurrentBounds.MinX) / 2; m_dRotatedBoundsCenterY = m_CurrentBounds.MinY + (m_CurrentBounds.MaxY - m_CurrentBounds.MinY) / 2; m_CurrentBoundsRotated = m_CurrentBounds; if(!IsDoubleEquil(m_dAngleRad, 0.0)) { RotateEnvelope(m_CurrentBoundsRotated, m_dAngleRad, m_dRotatedBoundsCenterX, m_dRotatedBoundsCenterY); SetEnvelopeRatio(m_CurrentBoundsRotated, m_dFrameRatio);//test } m_CurrentBoundsX8 = m_CurrentBoundsRotated; IncreaseEnvelope(m_CurrentBoundsX8, 8); cairo_destroy (m_cr_tmp); cairo_surface_destroy (m_surface_tmp); m_surface_tmp = cairo_image_surface_create (CAIRO_FORMAT_RGB24, m_oDeviceFrameRect.GetWidth(), m_oDeviceFrameRect.GetHeight()); m_cr_tmp = cairo_create (m_surface_tmp); //compute current transform matrix InitTransformMatrix(); }
OGREnvelope wxGISMapView::GetFullExtent(void) { OGREnvelope OutputEnv; if(!IsDoubleEquil(m_dCurrentAngle, 0.0)) { OutputEnv = m_FullExtent; double dCenterX = m_FullExtent.MinX + (m_FullExtent.MaxX - m_FullExtent.MinX) / 2; double dCenterY = m_FullExtent.MinY + (m_FullExtent.MaxY - m_FullExtent.MinY) / 2; RotateEnvelope(OutputEnv, m_dCurrentAngle, dCenterX, dCenterY); IncreaseEnvelope(OutputEnv, 0.1); } else OutputEnv = wxGISMap::GetFullExtent(); return OutputEnv; }
void wxGISDisplay::Clear() { wxCriticalSectionLocker locker(m_CritSect); wxCHECK_RET(m_saLayerCaches.size() - m_nLastCacheID == m_nSysCacheCount, wxT("Draw caches inconsistent")); if (m_saLayerCaches.size() > m_nSysCacheCount) { for(size_t i = 1; i <= m_nLastCacheID; ++i) { cairo_destroy(m_saLayerCaches[i].pCairoContext); cairo_surface_destroy(m_saLayerCaches[i].pCairoSurface); } m_saLayerCaches.erase(m_saLayerCaches.begin() + 1, m_saLayerCaches.end() - (m_nSysCacheCount - 1)); } //default map bounds m_RealBounds.MinX = ENVMIN_X; m_RealBounds.MaxX = ENVMAX_X; m_RealBounds.MinY = ENVMIN_Y; m_RealBounds.MaxY = ENVMAX_Y; m_CurrentBounds = m_RealBounds; SetEnvelopeRatio(m_CurrentBounds, m_dFrameRatio); m_CurrentBoundsRotated = m_CurrentBounds; m_dRotatedBoundsCenterX = m_CurrentBoundsRotated.MinX + (m_CurrentBoundsRotated.MaxX - m_CurrentBoundsRotated.MinX) / 2; m_dRotatedBoundsCenterY = m_CurrentBoundsRotated.MinY + (m_CurrentBoundsRotated.MaxY - m_CurrentBoundsRotated.MinY) / 2; m_CurrentBoundsX8 = m_CurrentBounds; IncreaseEnvelope(m_CurrentBoundsX8, 8); m_nLastCacheID = 0; m_nCurrentLayer = 0; m_dAngleRad = 0; cairo_matrix_init(m_pMatrix, 1, 0, 0, 1, 0, 0); cairo_matrix_init(m_pDisplayMatrix, 1, 0, 0, 1, 0, 0); cairo_matrix_init(m_pDisplayMatrixNoRotate, 1, 0, 0, 1, 0, 0); m_bZeroCacheSet = false; InitTransformMatrix(); OnEraseBackground(); }
void wxGISDisplay::SetRotate(double dAngleRad) { m_dAngleRad = dAngleRad; //for rotate panning & zooming m_CurrentBoundsRotated = m_CurrentBounds; m_dRotatedBoundsCenterX = m_CurrentBoundsRotated.MinX + (m_CurrentBoundsRotated.MaxX - m_CurrentBoundsRotated.MinX) / 2; m_dRotatedBoundsCenterY = m_CurrentBoundsRotated.MinY + (m_CurrentBoundsRotated.MaxY - m_CurrentBoundsRotated.MinY) / 2; if(!IsDoubleEquil(m_dAngleRad, 0.0)) { RotateEnvelope(m_CurrentBoundsRotated, m_dAngleRad, m_dRotatedBoundsCenterX, m_dRotatedBoundsCenterY); SetEnvelopeRatio(m_CurrentBoundsRotated, m_dFrameRatio);//test } m_CurrentBoundsX8 = m_CurrentBoundsRotated; IncreaseEnvelope(m_CurrentBoundsX8, 8); //compute current transform matrix InitTransformMatrix(); SetAllCachesDerty(true); }
void wxGISDisplay::SetBounds(const OGREnvelope& Bounds) { //update bounds to frame ratio m_RealBounds = Bounds; m_CurrentBounds = m_RealBounds; SetEnvelopeRatio(m_CurrentBounds, m_dFrameRatio); m_dRotatedBoundsCenterX = m_CurrentBounds.MinX + (m_CurrentBounds.MaxX - m_CurrentBounds.MinX) / 2; m_dRotatedBoundsCenterY = m_CurrentBounds.MinY + (m_CurrentBounds.MaxY - m_CurrentBounds.MinY) / 2; m_CurrentBoundsRotated = m_CurrentBounds; if(!IsDoubleEquil(m_dAngleRad, 0.0)) { RotateEnvelope(m_CurrentBoundsRotated, m_dAngleRad, m_dRotatedBoundsCenterX, m_dRotatedBoundsCenterY); SetEnvelopeRatio(m_CurrentBoundsRotated, m_dFrameRatio);//test } m_CurrentBoundsX8 = m_CurrentBoundsRotated; IncreaseEnvelope(m_CurrentBoundsX8, 8); SetAllCachesDerty(true); //compute current transform matrix InitTransformMatrix(); }