| # Copyright 2020 Project U-Ray Authors | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| import re | |
| import sys | |
| import json | |
| # Usage: frames.txt tiles.txt tilegrid.json | |
| frame_line_re = re.compile(r'0x([0-9A-Fa-f]+).*') | |
| frame_rc_height = {} | |
| with open(sys.argv[1], 'r') as f: | |
| for line in f: | |
| m = frame_line_re.match(line) | |
| if not m: | |
| continue | |
| frame = int(m.group(1), 16) | |
| bus = (frame >> 24) & 0x7 | |
| half = (frame >> 23) & 0x1 | |
| row = (frame >> 18) & 0x1F | |
| col = (frame >> 8) & 0x3FF | |
| minor = frame & 0xFF | |
| if bus != 0 or half != 0: | |
| continue | |
| if (row, col) not in frame_rc_height: | |
| frame_rc_height[(row, col, frame & ~0xFF)] = minor + 1 | |
| else: | |
| frame_rc_height[(row, col, frame & ~0xFF)] = max(frame_rc_height[(row, col)], minor + 1) | |
| tiles_to_xy = {} | |
| with open(sys.argv[2], 'r') as tilef: | |
| for line in tilef: | |
| sl = line.strip().split(",") | |
| if len(sl) < 4: | |
| continue | |
| x = int(sl[0]) | |
| y = int(sl[1]) | |
| name = sl[2] | |
| tiles_to_xy[name] = (x, y) | |
| with open(sys.argv[3]) as tb_f: | |
| tbj = json.load(tb_f) | |
| frames_to_tiles = {} | |
| for tilename, tiledata in tbj.items(): | |
| tile_offset = 0 | |
| for chunk in tiledata: | |
| frame, start, size = chunk | |
| if frame not in frames_to_tiles: | |
| frames_to_tiles[frame] = [] | |
| name = tilename.split(":")[0] | |
| frames_to_tiles[frame].append((start, tiles_to_xy[name][1], tiles_to_xy[name][0], name)) | |
| tile_offset += size | |
| for frame, tiles in frames_to_tiles.items(): | |
| tiles.sort() | |
| for rc, height in sorted(frame_rc_height.items()): | |
| row, col, frame = rc | |
| line = "%08x %6d %6d %6d" % (frame, row, col, height) | |
| print(line) | |
| frame = (row << 18) | (col << 8) | |
| last_start = 0; | |
| if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0: | |
| for tile in frames_to_tiles[frame]: | |
| start, ty, tx, tname = tile | |
| print(" %6d (%4d) %6d %6d %s" % (start, start - last_start, tx, ty, tname)) | |
| last_start = start | |