« À vérifier » : drawPortrait, et un test qui échoue si la marque repasse sous la découpe du cadre

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
IliesAllaliandClaude Opus 5.5 committed 2026-10-25 16:57:10 +01:00
1 parent 230ec2ae05
commit befe8fe19a
2 files changed
+34 -8

No files matched your search

+11 -7
View File
@@ -602,13 +602,7 @@ function drawPersonNode(ctx, node, pos, nodeProgress, {
ctx.shadowOffsetY = shadowY
}
// Le cadre découpe le canvas à sa forme : save/restore autour, sinon la marque ci-dessous est rognée
// (sur un cadre rond, elle tombe presque entière hors du cercle)
ctx.save()
drawFrame(ctx, frameType, person, img)
ctx.restore()
// « À vérifier » : petit rond terracotta avec un « ? » en haut à droite du cadre, absent au dézoom
if (person.toVerify && withDetail) drawToVerifyMark(ctx)
drawPortrait(ctx, frameType, person, img, person.toVerify && withDetail)
ctx.restore()
// --- Labels (estompés puis absents en dézoom) ---
@@ -935,6 +929,16 @@ function resolveFrameType(person, img) {
return resolveFrameKind(person.frameType || 'round', ratio, cropShape(person.avatarCrop))
}
// Cadre et portrait, puis la marque « À vérifier » (petit rond terracotta avec un « ? » en haut à droite du cadre,
// absente au dézoom). Le cadre découpe le canvas à sa forme : save/restore autour, sinon la marque est rognée
// (sur un cadre rond, elle tombe presque entière hors du cercle)
export function drawPortrait(ctx, frameType, person, img, withMark) {
ctx.save()
drawFrame(ctx, frameType, person, img)
ctx.restore()
if (withMark) drawToVerifyMark(ctx)
}
function drawToVerifyMark(ctx) {
const r = 9
const x = PERSON_R * 0.74, y = -PERSON_R * 0.74
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest'
import { traceSibship } from './renderers'
import { drawPortrait, traceSibship } from './renderers'
// Contexte canvas minimal qui enregistre les appels de tracé
const recorder = () => {
@@ -49,3 +49,25 @@ describe('traceSibship (accolade franche)', () => {
expect(curve.slice(5)).toEqual([515, 480])
})
})
describe('drawPortrait, marque « À vérifier »', () => {
const person = { firstName: 'Marie', lastName: 'Martin', isAlive: true }
for (const frame of ['round', 'square', 'polaroid', 'rect']) {
it(`cadre ${frame} : la marque est dessinée hors de la découpe du cadre`, () => {
const { ctx, calls } = recorder()
drawPortrait(ctx, frame, person, null, true)
const clip = calls.findIndex(c => c[0] === 'clip')
const restore = calls.findIndex((c, i) => i > clip && c[0] === 'restore')
const markText = calls.findIndex(c => c[0] === 'fillText' && c[1] === '?')
expect(clip).toBeGreaterThan(-1)
expect(restore).toBeGreaterThan(clip)
expect(markText).toBeGreaterThan(restore)
})
}
it('sans « À vérifier », pas de marque', () => {
const { ctx, calls } = recorder()
drawPortrait(ctx, 'round', person, null, false)
expect(calls.some(c => c[0] === 'fillText' && c[1] === '?')).toBe(false)
})
})