def _transform_bounding_box(self, rotation=0, resolution=72, width=0, height=0, fit=False): bounds = self._bounding_box() scale = resolution / 72. transform = mupdf.Matrix() mupdf.pre_scale(mupdf.rotate(transform, rotation), scale, scale) tmp_bounds = mupdf.Rect() mupdf.copy_rect(tmp_bounds, bounds) ibounds = mupdf.IRect() mupdf.round_rect(ibounds, mupdf.transform_rect(tmp_bounds, transform)) # If a resolution is specified, check to see whether width/height are exceeded if not, unset them. if resolution != 72: actual_width = ibounds.x1 - ibounds.x0 actual_height = ibounds.y1 - ibounds.y0 if width and actual_width <= width: width = 0 if height and actual_height <= height: height = 0 # Now width or height will be 0 unless they need to be enforced. if width or height: scale_x = width / (tmp_bounds.x1 - tmp_bounds.x0) scale_y = height / (tmp_bounds.y1 - tmp_bounds.y0) if fit: # ignore aspect if not scale_x: scale_x = 1.0 # keep computed width elif not scale_y: scale_y = 1.0 # keep computed height else: if not scale_x: scale_x = scale_y elif not scale_y: scale_y = scale_x else: # take the smallest scale if scale_x > scale_y: scale_x = scale_y else: scale_y = scale_x scale_mat = mupdf.Matrix() mupdf.scale(scale_mat, scale_x, scale_y) mupdf.concat(transform, transform, scale_mat) mupdf.copy_rect(tmp_bounds, bounds) mupdf.transform_rect(tmp_bounds, transform) mupdf.round_rect(ibounds, tmp_bounds) return transform, ibounds
def _make_transform(self, scale=1, rotation=0): transform = mupdf.Matrix() # mupdf.rotate(transform, rotation) # mupdf.pre_scale(transform, scale, scale) mupdf.scale(transform, scale, scale) mupdf.pre_rotate(transform, rotation) return transform