void YUV2RGB(RGB& in,RGB& out){ out[0]=(double)(1.0*in[0]+1.402*in[2]); out[1]=(double)(1.0*in[0]-0.34413*in[1]-0.71414*in[2]); out[2]=(double)(1.0*in[0]+1.772*in[1]); for(int c=0;c<3;c++) out[c]=lmt(out[c]); }
/* Update a single route segment lengths Also, compute total route length by summing segment distances. */ void Route::UpdateSegmentDistance( RoutePoint *prp0, RoutePoint *prp, double planspeed ) { double slat1 = prp0->m_lat, slon1 = prp0->m_lon; double slat2 = prp->m_lat, slon2 = prp->m_lon; // Calculate the absolute distance from 1->2 double dd; // why are we using mercator rather than great circle here?? [sean 8-11-2015] DistanceBearingMercator( slat1, slon1, slat2, slon2, 0, &dd ); // And store in Point 2 prp->m_seg_len = dd; m_route_length += dd; // If Point1 Description contains VMG, store it for Properties Dialog in Point2 // If Point1 Description contains ETD, store it in Point1 if( planspeed > 0. ) { double vmg = 0.0; wxDateTime etd; if( prp0->m_MarkDescription.Find( _T("VMG=") ) != wxNOT_FOUND ) { wxString s_vmg = ( prp0->m_MarkDescription.Mid( prp0->m_MarkDescription.Find( _T("VMG=") ) + 4 ) ).BeforeFirst( ';' ); if( !s_vmg.ToDouble( &vmg ) ) vmg = planspeed; } double legspeed = planspeed; if( vmg > 0.1 && vmg < 1000. ) legspeed = vmg; if( legspeed > 0.1 && legspeed < 1000. ) { m_route_time += 3600. * dd / legspeed; prp->m_seg_vmg = legspeed; } prp0->m_seg_etd = wxInvalidDateTime; if( prp0->m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) { wxString s_etd = ( prp0->m_MarkDescription.Mid( prp0->m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' ); const wxChar *parse_return = etd.ParseDateTime( s_etd ); if( parse_return ) { wxString tz( parse_return ); if( tz.Find( _T("UT") ) != wxNOT_FOUND ) prp0->m_seg_etd = etd; else if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) { prp0->m_seg_etd = etd; long lmt_offset = (long) ( ( prp0->m_lon * 3600. ) / 15. ); wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 ); prp0->m_seg_etd -= lmt; } else prp0->m_seg_etd = etd.ToUTC(); } } } }
wxString timestamp2s(wxDateTime ts, int tz_selection, long LMT_offset, int format) { wxString s = _T(""); wxString f; if (format == INPUT_FORMAT) f = _T("%m/%d/%Y %H:%M"); else if (format == TIMESTAMP_FORMAT) f = _T("%m/%d/%Y %H:%M:%S"); else f = _T(" %m/%d %H:%M"); switch (tz_selection) { case 0: s.Append(ts.Format(f)); if (format != INPUT_FORMAT) s.Append(_T(" UT")); break; case 1: s.Append(ts.FromUTC().Format(f)); break; case 2: wxTimeSpan lmt(0,0,(int)LMT_offset,0); s.Append(ts.Add(lmt).Format(f)); if (format != INPUT_FORMAT) s.Append(_T(" LMT")); } return(s); }
wxDateTime RoutePoint::GetETD() { if( m_seg_etd.IsValid() ) { if(!GetETA().IsValid() || m_seg_etd > GetETA()) { return m_seg_etd; } else { return GetETA(); } } else { if( m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) { wxDateTime etd = wxInvalidDateTime; wxString s_etd = ( m_MarkDescription.Mid(m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' ); const wxChar *parse_return = etd.ParseDateTime( s_etd ); if( parse_return ) { wxString tz( parse_return ); if( tz.Find( _T("UT") ) != wxNOT_FOUND ) { m_seg_etd = etd; } else { if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) { m_seg_etd = etd; long lmt_offset = (long) ( ( m_lon * 3600. ) / 15. ); wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 ); m_seg_etd -= lmt; } else { m_seg_etd = etd.ToUTC(); } } if( etd.IsValid() && (!GetETA().IsValid() || etd > GetETA()) ) { m_MarkDescription.Replace( s_etd, wxEmptyString); m_seg_etd = etd; return m_seg_etd; } else { return GetETA(); } } } } return wxInvalidDateTime; }
/* Update the route segment lengths, storing each segment length in <destination> point. Also, compute total route length by summing segment distances. */ void Route::UpdateSegmentDistances( double planspeed ) { wxPoint rpt, rptn; float slat1, slon1, slat2, slon2; double route_len = 0.0; double route_time = 0.0; wxRoutePointListNode *node = pRoutePointList->GetFirst(); if( node ) { RoutePoint *prp0 = node->GetData(); slat1 = prp0->m_lat; slon1 = prp0->m_lon; node = node->GetNext(); while( node ) { RoutePoint *prp = node->GetData(); slat2 = prp->m_lat; slon2 = prp->m_lon; // Calculate the absolute distance from 1->2 double brg, dd; DistanceBearingMercator( slat1, slon1, slat2, slon2, &brg, &dd ); // And store in Point 2 prp->m_seg_len = dd; route_len += dd; slat1 = slat2; slon1 = slon2; // If Point1 Description contains VMG, store it for Properties Dialog in Point2 // If Point1 Description contains ETD, store it in Point1 if( planspeed > 0. ) { double vmg = 0.0; wxDateTime etd; if( prp0->m_MarkDescription.Find( _T("VMG=") ) != wxNOT_FOUND ) { wxString s_vmg = ( prp0->m_MarkDescription.Mid( prp0->m_MarkDescription.Find( _T("VMG=") ) + 4 ) ).BeforeFirst( ';' ); if( !s_vmg.ToDouble( &vmg ) ) vmg = planspeed; } double legspeed = planspeed; if( vmg > 0.1 && vmg < 1000. ) legspeed = vmg; if( legspeed > 0.1 && legspeed < 1000. ) { route_time += dd / legspeed; prp->m_seg_vmg = legspeed; } prp0->m_seg_etd = wxInvalidDateTime; if( prp0->m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) { wxString s_etd = ( prp0->m_MarkDescription.Mid( prp0->m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' ); const wxChar *parse_return = etd.ParseDateTime( s_etd ); if( parse_return ) { wxString tz( parse_return ); if( tz.Find( _T("UT") ) != wxNOT_FOUND ) prp0->m_seg_etd = etd; else if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) { prp0->m_seg_etd = etd; long lmt_offset = (long) ( ( prp0->m_lon * 3600. ) / 15. ); wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 ); prp0->m_seg_etd -= lmt; } else prp0->m_seg_etd = etd.ToUTC(); } } } prp0 = prp; node = node->GetNext(); } } m_route_length = route_len; m_route_time = route_time * 3600.; }
int main(int argc,char** argv){ BMP fin (argv[1]); BMP fout;fout.init(fin.w,fin.h); double (*in )[8]; double (*out )[8]; double (*out2)[8]; fftw_plan p ; int i,j,idx; in = (double (*)[8])fftw_malloc( sizeof(double) * 8*8); out = (double (*)[8])fftw_malloc( sizeof(double) * 8*8); out2= (double (*)[8])fftw_malloc( sizeof(double) * 8*8); for(int c=0;c<3;c++){ for(int by=0;by<fin.h/8;by++) for(int bx=0;bx<fin.w/8;bx++){ for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; in[ dy][ dx]=fin(x,y)[c]; } p = fftw_plan_r2r_2d( 8,8, (double*)in, (double*)out, FFTW_REDFT10,FFTW_REDFT10, FFTW_ESTIMATE ); fftw_execute(p); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ out[ dy][ dx]/=8*8*4; } for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ // out[ dy][ dx]=round(out[ dy][ dx]/(qt[dy][dx]*quality)); out[ dy][ dx]=round(out[ dy][ dx]/2); } for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ // out[ dy][ dx]*=qt[dy][dx]*quality; out[ dy][ dx]*=2; } // for(int dy=0;dy<8;dy++) // for(int dx=0;dx<8;dx++){ // printf("%04d\n",(int)out[ dy][ dx]); // } p = fftw_plan_r2r_2d( 8,8, (double*)out, (double*)out2, FFTW_REDFT01,FFTW_REDFT01, FFTW_ESTIMATE ); fftw_execute(p); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; fout(x,y)[c]=lmt(out2[ dy][ dx]); } } } fout.write(argv[2]); fftw_destroy_plan(p); fftw_free(in); fftw_free(out); fftw_free(out2); return true; }