/*
 * O arquivo de uma imagem feita no editor (tirar fundo, borracha, trocar
 * cores) SEM perder nada: WebP sem perda (no Chrome, qualidade 1 é o WebP
 * "lossless": os pixels saem idênticos, com a transparência, e bem menor que
 * o PNG) ou PNG quando o navegador não faz WebP. Antes saía WebP com perda
 * (0,9 a 0,94): borda do recorte e degradê com blocos.
 */

/* O teto de pixels de uma imagem feita no navegador: 16,7 milhões (4096²) é o maior canvas do Safari do iPhone; acima disso ele devolve a tela vazia. */
export const PIXELS_NO_NAVEGADOR = 16_777_216;

/** O fator (até 1) que deixa uma imagem de `largura` × `altura` dentro do teto de pixels do navegador. */
export function fatorNoTeto(largura: number, altura: number, teto = PIXELS_NO_NAVEGADOR): number {
  return Math.min(1, Math.sqrt(teto / Math.max(1, largura * altura)));
}

export async function arquivoSemPerda(tela: HTMLCanvasElement): Promise<Blob> {
  const webp = await new Promise<Blob | null>((ok) => tela.toBlob(ok, "image/webp", 1));
  if (webp && webp.type === "image/webp") return webp;
  const png = await new Promise<Blob | null>((ok) => tela.toBlob(ok, "image/png"));
  if (!png) throw new Error("Não deu para gerar a imagem.");
  return png;
}
