def build (self, parcel, rect, simplify=True): buffer = BufferStream() #### header #### # freme size buffer.writeDword(0) #< frame size buffer.writeDword(0) #< road offset buffer.writeDword(0) #< road size buffer.writeDword(0) #< road name offset buffer.writeDword(0) #< road name size buffer.writeDword(0) #< back offset buffer.writeDword(0) #< back size buffer.writeDword(0) #< back name offset buffer.writeDword(0) #< back name size #### road frame ##### road_offset = buffer.tell() road_name_builder = RoadNameBuilder() road_builder = RoadBuilder(road_name_builder) road_builder.build(parcel, rect, simplify) road_builder.save(buffer) road_size = buffer.tell() - road_offset road_name_offset = buffer.tell() road_name_builder.save(buffer) road_name_size = buffer.tell()-road_name_offset #### back frame ##### back_offset = buffer.tell() back_name_builder = BackNameBuilder() back_builder = BackBuilder(back_name_builder) back_builder.build(parcel, rect) back_builder.save(buffer) back_size = buffer.tell()-back_offset back_name_offset = buffer.tell() back_name_builder.save(buffer) back_name_size = buffer.tell()-back_name_offset #### rewrite header #### parcel_size = buffer.tell() buffer.seek(0) buffer.writeDword(parcel_size) buffer.writeDword(road_offset) buffer.writeDword(road_size) buffer.writeDword(road_name_offset) buffer.writeDword(road_name_size) buffer.writeDword(back_offset) buffer.writeDword(back_size) buffer.writeDword(back_name_offset) buffer.writeDword(back_name_size) ## return return buffer.getValue()
class RoadNameBuilder: def __init__ (self): self.__stream = BufferStream() self.__name_dict = {} def build (self, name): offset = self.__name_dict.get(name) if offset == None: offset = self.__stream.tell() self.__stream.writeWord(len(name)) self.__stream.write(name) self.__name_dict[name] = offset return offset def save (self, stream): stream.write(self.__stream.getValue())