bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char* line = aLine.Line(); if( strncasecmp( line, "$Bitmap", 7 ) != 0 ) { aErrorMsg.Printf( wxT( "Eeschema file bitmap image load error at line %d, aborted" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } for( ; ; ) { if( !aLine.ReadLine() ) return false; line = aLine.Line(); if( strncasecmp( line, "Pos", 3 ) == 0 ) { sscanf( line + 3, "%d %d", &m_pos.x, &m_pos.y ); continue; } if( strncasecmp( line, "Scale", 5 ) == 0 ) { double scale = 1.0; sscanf( line + 5, "%lf", &scale ); m_image->SetScale( scale ); continue; } if( strncasecmp( line, "Data", 4 ) == 0 ) { m_image->LoadData( aLine, aErrorMsg ); } if( strncasecmp( line, "$EndBitmap", 4 ) == 0 ) break; } return true; }
bool BITMAP_BASE::LoadData( LINE_READER& aLine, wxString& aErrorMsg ) { wxMemoryOutputStream stream; char* line; while( true ) { if( !aLine.ReadLine() ) { aErrorMsg = wxT("Unexpected end of data"); return false; } line = aLine.Line(); if( strncasecmp( line, "EndData", 4 ) == 0 ) { // all the PNG date is read. // We expect here m_image and m_bitmap are void m_image = new wxImage(); wxMemoryInputStream istream( stream ); m_image->LoadFile( istream, wxBITMAP_TYPE_PNG ); m_bitmap = new wxBitmap( *m_image ); break; } // Read PNG data, stored in hexadecimal, // each byte = 2 hexadecimal digits and a space between 2 bytes // and put it in memory stream buffer int len = strlen( line ); for( ; len > 0; len -= 3, line += 3 ) { int value = 0; if( sscanf( line, "%X", &value ) == 1 ) stream.PutC( (char) value ); else break; } } return true; }
bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg ) { int size; char number[256]; char name[256]; char connectType[256]; char sheetSide[256]; char* line = aLine.Line(); char* cp; static const char delims[] = " \t"; // Read coordinates. // D( printf( "line: \"%s\"\n", line );) cp = strtok( line, delims ); strncpy( number, cp, sizeof(number) ); number[sizeof(number)-1] = 0; cp += strlen( number ) + 1; cp += ReadDelimitedText( name, cp, sizeof(name) ); cp = strtok( cp, delims ); strncpy( connectType, cp, sizeof(connectType) ); connectType[sizeof(connectType)-1] = 0; cp = strtok( NULL, delims ); strncpy( sheetSide, cp, sizeof(sheetSide) ); sheetSide[sizeof(sheetSide)-1] = 0; cp += strlen( sheetSide ) + 1; int r = sscanf( cp, "%d %d %d", &m_Pos.x, &m_Pos.y, &size ); if( r != 3 ) { aErrorMsg.Printf( wxT( "Eeschema file sheet hierarchical label error at line %d.\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( line ); return false; } m_Text = FROM_UTF8( name ); if( size == 0 ) size = GetDefaultTextSize(); m_Size.x = m_Size.y = size; switch( connectType[0] ) { case 'I': m_shape = NET_INPUT; break; case 'O': m_shape = NET_OUTPUT; break; case 'B': m_shape = NET_BIDI; break; case 'T': m_shape = NET_TRISTATE; break; case 'U': m_shape = NET_UNSPECIFIED; break; } switch( sheetSide[0] ) { case 'R' : /* pin on right side */ SetEdge( 1 ); break; case 'T' : /* pin on top side */ SetEdge( 2 ); break; case 'B' : /* pin on bottom side */ SetEdge( 3 ); break; case 'L' : /* pin on left side */ default : SetEdge( 0 ); break; } return true; }