示例#1
0
 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()
示例#2
0
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())