first commit
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
@tool
|
||||
class_name McpScreenshotEncode
|
||||
extends RefCounted
|
||||
|
||||
## Shared downscale + PNG + base64 block for the screenshot paths (#716).
|
||||
##
|
||||
## Two call sites straddle the editor/game process boundary — the editor's
|
||||
## take_screenshot (editor_handler) and the game-process autoload
|
||||
## (runtime/game_helper) — and were maintained as manually synchronized
|
||||
## copies. Pure static, no editor APIs, so it loads safely in the game
|
||||
## process too.
|
||||
|
||||
|
||||
## Downscale `image` in place so its longest edge is at most
|
||||
## `max_resolution` (0 = no cap), then PNG-encode. Returns
|
||||
## {base64, width, height, original_width, original_height}.
|
||||
static func downscale_and_encode(image: Image, max_resolution: int) -> Dictionary:
|
||||
var original_width := image.get_width()
|
||||
var original_height := image.get_height()
|
||||
|
||||
if max_resolution > 0:
|
||||
var longest := maxi(original_width, original_height)
|
||||
if longest > max_resolution:
|
||||
var scale := float(max_resolution) / float(longest)
|
||||
## Clamp to 1px min: extreme aspect ratios at very small
|
||||
## max_resolution could otherwise compute a zero dimension and
|
||||
## crash image.resize().
|
||||
var new_w := maxi(1, int(original_width * scale))
|
||||
var new_h := maxi(1, int(original_height * scale))
|
||||
image.resize(new_w, new_h, Image.INTERPOLATE_LANCZOS)
|
||||
|
||||
return {
|
||||
"base64": Marshalls.raw_to_base64(image.save_png_to_buffer()),
|
||||
"width": image.get_width(),
|
||||
"height": image.get_height(),
|
||||
"original_width": original_width,
|
||||
"original_height": original_height,
|
||||
}
|
||||
Reference in New Issue
Block a user