Repository navigation
GIF saver 동작방식 #182
chae-dahee
started this conversation in
Blog
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
GIF saver는
Animation을 프레임별로 소프트웨어 렌더링한 뒤 하나의 애니메이션 GIF 파일로 인코딩한다. 일반Paint저장은 지원하지 않는다.전체 처리 흐름
Saver::save(Animation*, "*.gif")은 확장자로GifSaver를 선택하고 저장 작업을 TaskScheduler에 요청한다.SwCanvas에 배경과 애니메이션의 Picture를 추가한다.totalFrame / duration으로 계산한다.Saver::sync()에서 작업 완료를 기다리고 자원을 정리한다.프레임 렌더링과 encoder 전달은
GifSaver::run()의 다음 루프에서 수행한다.GIF saver는
Animation만 지원하며 일반Paint저장, 반복 횟수 설정과 대문자.GIF확장자를 지원하지 않는다.quality인자 사용하지 않는다.PNG saver를 구현한다면?
문제
core에는 PNG saver가 없어
Saver::save(Paint*, ...)로 정적 이미지를 저장할 수 없다.현재 loader용 LodePNG는 디코딩 기능만 포함하므로 PNG 인코딩 경로도 없다.
해결 방향
LodePNG를 공용 PNG codec으로 구성해 loader와 saver가 함께 사용한다.
common에 PNG codec을 두고 loader용 디코드와 saver용 인코드를 빌드 옵션으로 구분한다.PngSaver를SaveModule과Task기반으로 구현한다.Paint의 바운드로 출력 크기를 정하고 빈 영역을 검사한다.Paint를SwCanvas에 한 번 렌더링한다.Saver의.png분기를 추가한다.quality는 사용하지 않는다.#3874 에서 구현되었다.
All reactions