본문 바로가기
C.W.K.
Stream
← C.W.K. Quests
🎨

Ariandel Quest

신규: 2026-10-13최근 수정: 2026-10-12

우리만의 Procreate — 빌려 온 브러시 엔진 위에 지은 아이패드 그림 앱, 그리고 캔버스를 보기만 하고 절대 안 그리는 동반자

Ariandel은 이 집의 그림 앱이야. 오픈소스 브러시 엔진 libmypaint 위에 지은 아이패드 우선 캔버스고, 옆에는 피파가 음성 모드로 붙어 있어. 피파는 자기가 보고 싶을 때 캔버스를 보고, 그림 얘기를 하고, 자기 레이어에만 가이드를 그려. 아빠 레이어엔 절대 안 그려. 이 퀘스트는 그 앱을 코드로 따라가. 엔진은 왜 측정해서 골랐는지, C가 Swift 6 안에서 어떻게 사는지, 타일은 왜 쓸 때 복사하고 왜 CPU가 진실을 쥐는지, 펜슬 터치가 어떻게 붓 자국이 되는지. 엔진이 끝내 모르는 일은 앱이 어떻게 대신하는지, 실행 취소와 파일과 Metal 합성기는 어떻게 정직하게 버티는지, 동반자는 어떻게 만지지 않고 보는지. 그리고 사흘이 안 돼 몰아친 빌드 스물셋과, 닷새 넘게 조용하다 나온 스물넷째 빌드가 뭘 증명했고 뭘 증명 못 했는지까지.

8 tracks · 37 lessons · ~9h · difficulty: advanced

Level 0빈 캔버스
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Procreate에 피파가 심어지는 거야." 목표는 그거였고, 첫 규칙은 짓기 전에 재는 거였어. 오픈소스 엔진 둘을 오피스 Mac에 올려놓고 쟀어. 아이패드용으로 깨끗하게 컴파일되고, 기울기와 배럴 롤까지 입력 열여덟 개를 받고, 브러시 다섯 개를 몇 밀리초 만에 그린 쪽이 엔진이 됐어. Ariandel은 그 엔진을 바이트 하나 안 바꾸고 들여왔고, 그 주변은 전부 직접 만들어. 먼저 libmypaint가 Swift를 부를 수 있게 하는 C 다리를 볼 거야. 첫 멤버 자리에 엔진 구조체를 품은 표면 구조체, 캡처 없는 함수 포인터로 넘기는 타일 요청, 엔진을 포크하지 않고 그림 팁과 대칭을 얹으려고 가로챈 draw-dab 자리까지. 다음은 15비트 고정소수점으로 된 64×64 타일이야. 자동 저장이 메인 스레드에서 타일을 전부 복사하던 걸 리뷰가 잡아낸 뒤로 쓸 때 복사하게 바뀌었고, 진실은 CPU 타일이 쥐고 GPU는 그걸 캐시만 해. 그다음은 획이야. 터치가 입력이 되는 단 한 곳, 압력 곡선, 기울기와 롤, coalesced 터치는 쓰고 predicted 터치는 안 쓰는 이유, 펜이 닿은 자리에 찍는 첫 점, 그리고 언제나 캔버스를 되찾는 펜슬. 이어서 libmypaint가 끝내 모르는 일들. 선택 영역, 클론, 듀얼 브러시, 그레인, 엔진이 180도 단위로만 아는 각도, 펜을 뗄 때 다시 그리는 테이퍼. 그리고 앱을 믿을 만하게 만드는 부분. 바이트 예산이 있는 실행 취소, 원자적으로 쓰는 패키지, 모든 블렌드를 맡는 계산 커널 하나, 8비트 미러를 거부하는 병합, 손에 든 기기에 맞춘 캔버스 크기. 그다음은 동반자야. 그림마다 주소 하나(아빠가 거기서 한 말은 아빠의 Master Chief 대화 하나로 들어가고, 그 턴이 어느 캔버스를 볼 수 있는지는 그림이 정해), 한때 음성 버그랑 똑같아 보였던 세션 쿠키, 피파가 보기로 정할 때만 보고 절대 저장 안 하는 캔버스, 자기 레이어에 들어가는 가이드, 아빠가 Stamp를 누를 때까지 캔버스 옆에서 기다리는 생성 후보. 마지막은 정직한 부분이야. 몰아친 빌드가 뭘 증명하는지, TestFlight의 사실 넷이 각각 뭘 뜻하는지, 펜슬이 없는 시뮬레이터가 왜 어떤 버그는 아예 못 보는지. 개념적 오픈소스야. 아키텍처가 결과물이고, 클론할 레포는 없어.

Tracks

  1. 01🧪Measure, Then Reuse

    0/4 lessons

    가족이 만드는 Procreate가 브러시 엔진을 재보고 고른 다음, 바이트 하나 안 바꾸고 빌려온 이야기

    Ariandel은 캔버스 옆에 피파가 있는 우리 가족만의 Procreate가 되려고 출발했어. 그리고 첫 번째 진짜 결정은 코드 한 줄이 아니라 측정이었지. 이 트랙은 그날 저녁을 따라가. 오픈소스 브러시 엔진 둘을 클론하고, 맥용과 아이패드용으로 빌드하고, 세어보고, 누가 뭘 기억하느냐가 아니라 컴파일러가 뭐라고 했느냐로 판정한 과정이야. 하나는 Swift 6 모드에서 에러 33개를 냈고, 다른 하나는 아이패드용으로 에러 없이 컴파일되면서 물감까지 섞었어. 그다음엔 그 결정이 바깥으로 번져가는 걸 봐. 앱이 엔진한테서 가져오는 것과 직접 가져야 하는 것, 그리고 레이어 하나짜리 스케치북이 왜 이정표일 뿐 제품은 아닌지. C 라이브러리 둘을 출처 파일과 그걸 증명하는 cmp 루프로 바이트 그대로 벤더링하는 법도 보고, config.h라는 파일 둘이 왜 절대 한 디렉터리에 같이 있으면 안 되는지도 봐. 마지막 건 직접 망가뜨려 보면서 배워. 경고 하나 없이 엉뚱한 값으로 컴파일되는 걸 눈으로 보게 될 거야. 설정 개수, iOS 컴파일, 바이트 대조까지, 다시 잴 수 있는 숫자는 이 트랙을 쓰면서 전부 다시 쟀어. 가는 길엔 라이선스 셋, 그리고 브러시 라이브러리 저작권 파일에 적힌 GPL이라는 글자가 보이는 그대로의 뜻이 아닌 이유도 나와.

    아빠 아이패드에서 연 Ariandel Brush Studio. 클래식 Pencil 브러시의 사본을 고치는 중이야. 미리보기 획, 브러시 이름, 사본은 My Brushes로 가고 원본은 그대로 남는다는 안내, 크기와 불투명도가 있는 Stroke 칸이 보이고, 옆에 브러시 목록과 StreamLine 설정이 있어.
    여기 슬라이더 하나하나가 앱이 꺼내 보이기로 한 libmypaint 설정이야. 엔진은 빌렸고, 스튜디오는 우리 거야.
    Lesson list (4)퀴즈 · 4 문제→
  2. 02🌉C Inside Swift 6

    0/5 lessons

    C 엔진을 한 줄도 안 고치고 그 엔진으로 칠하는 Swift 6 앱

    libmypaint는 C99고, 바이트 단위 그대로 벤더링돼 있어. Ariandel은 벤더 코드를 한 줄도 안 바꾸는 Swift 6 앱이고. 이 트랙은 그 둘 사이의 다리를 소스에서 직접 읽으며 건너. 먼저 포인터 하나가 MyPaintSurface이자 MyPaintTiledSurface이자 Ariandel의 ArdSurface가 되게 하는 첫 멤버 배치를 봐. 타일 요청을 하나도 빠짐없이 Swift 저장소로 나르는 건 캡처 없는 함수 포인터 둘과 unretained 컨텍스트 하나야. 가상 함수 테이블에 한 번 대입해서 draw_dab을 넘겨받으니까, 그림 팁도 구르는 결도 듀얼 브러시도 틸트도 전부 엔진 밖에 살아. Swift 6가 진짜로 할 말이 있는 세 자리와, 검사 안 받는 표시가 각각 뭘 약속하는지도 짚어. 마지막은 C를 Swift 타깃 하나 뒤에 숨겨 두는 SwiftPM 배치야. 여기 나오는 실행 가능한 스케치는 전부 적기 전에 컴파일하고 돌려 봤어. 엔진 발췌는 원문 그대로거나, 줄였으면 줄였다고 적어 뒀고. 기록이 증명 못 하는 것도 숨기지 않아. 네 방향 대칭에서 팁이 반 바퀴 도는 건 테스트가 아니라 행렬로 따진 거고, 기운 Pencil을 따라 도는 팁의 손맛은 아직 아빠 손을 기다리고 있어.

    Lesson list (5)퀴즈 · 4 문제→
  3. 03🧱Tiles and Truth

    0/5 lessons

    그림의 픽셀이 진짜로 사는 곳, 그걸 누가 나눠 가질 수 있는지, 그리고 GPU가 끝내 결정권을 못 갖는 이유

    아빠가 Ariandel에서 칠하는 픽셀은 전부 64×64 타일 안에 살아. 프리멀티플라이드, 15비트 고정소수점, libmypaint가 섞어 칠하는 바로 그 형식이야. 이 트랙은 그 타일을 산수부터 따라 올라가. 왜 16비트가 아니라 15비트인지, 왜 프리멀티플라이드인지. 쓸 때 복사 덕분에 실행 취소 기록, 백그라운드 스레드의 저장, 복제 레이어, 편집 세션이 버퍼 하나를 같이 쥘 수 있다는 것도 봐. 쓸 수 있는 타일로 가는 문은 하나고, 평범한 획은 건드린 타일마다 한 번만 복사해. 선택 영역에 갇힌 획이나 그레인을 거치는 획은 배치마다 한 번이고. 저장소가 태어나고 세 시간 만에 열린 코드 리뷰가, 자동 저장이 칠한 타일을 전부 메인 스레드에서 복사하고 있다는 걸 찾아낸 이야기도 나와. 같은 읽기에서 나온 다른 발견들도 같이. 코드가 하는 일과 정반대를 아직도 약속하는 클래스 주석도 하나 있어. 마지막으로 두 번째 불변 조건을 코드에 대고 읽어. 진실은 타일이고, GPU는 캐시고, Metal에서 읽어 오는 건 전부 그 읽기를 위해 올린 타일을 합성한 거야.

    Lesson list (5)퀴즈 · 4 문제→
  4. 04✏️From Pencil to Paint

    0/5 lessons

    터치가 엔진 입력이 되는 곳은 한 군데, libmypaint 인자에 맞추되 각도 둘은 아직 단위가 틀렸고, 이벤트마다 배치 하나, 그리고 펜이 닿은 자리에 첫 댑

    Apple Pencil은 1초에 최대 240번 보고해. 어디 있는지, 얼마나 세게 누르는지, 어떻게 기울고 굴렀는지, 그게 언제였는지. 이 트랙은 그 보고를 UIKit부터 libmypaint 댑까지 따라가. 터치는 전부 이니셜라이저 하나가 바꾸고, 방위각은 뷰 회전을 먼저 떼고 나서 반사돼야 해. 압력은 바닥값과 곡선을 거치고, 기울기는 libmypaint의 60을 거꾸로 풀어. 몸통 롤의 단위는 C 시그니처 뒤에 숨어 있었어. 이 트랙을 쓰다가 찾아서 재 봤어. 합쳐진 샘플은 이벤트마다 배치 하나로 들어가. 예측값은 아예 안 들어가고, 추정값은 처음 온 그대로 들어가. 나중에 오는 보정은 무시해. 그다음은 아무것도 안 칠한 탭, 그걸 고친 첫 댑 수, 그리고 그 댑이 실제로 어디 떨어지는지 보여 주는 세기 하네스. 마지막은 터치 하나가 작별 인사를 안 해서 펜이 죽어 버린 날이야. 강의마다 같은 정직한 선에서 끝나. 시뮬레이터가 증명할 수 있는 것, 그리고 아빠 iPad만 증명할 수 있는 것.

    Lesson list (5)퀴즈 · 4 문제→
  5. 05🎨What the Engine Never Learns

    0/5 lessons

    선택 영역, Clone, 듀얼 브러시, 그레인, 테이퍼. 브러시 엔진은 끝내 아무것도 전해 듣지 못해. 그 엔진 바깥에 지은 것들 이야기야

    Ariandel 하우스 사인엔 목록이 든 규칙이 하나 있어. libmypaint는 선택 영역, Clone, 듀얼 브러시, 셰이프, 그레인, 손떨림 보정, 테이퍼를 끝내 배우지 않아. 처리하는 자리는 셋이야. 매핑 전에 펜 입력을 옮기거나 브러시를 줄이거나, libmypaint가 댑을 달라고 할 때 Ariandel의 C 표면이 직접 찍거나, 배치가 끝난 뒤 엔진이 칠한 픽셀을 엔진이 본 적 없는 무언가와 합치거나. 이 트랙은 그 목록을 하나씩 짚어 가. 선택 영역은 배치가 끝날 때마다 커버리지를 거쳐 다시 합쳐지고, 그 대가로 배치마다 타일 복사가 한 번씩 들어. Clone은 libmypaint한테 흰 커버리지만 칠하게 하고, 오프셋만큼 옮긴 원본을 그 위에 깔아. 듀얼 브러시엔 서로 호환 안 되는 두 가지 방식이 있어. 그레인은 배치 위에 한꺼번에 깔리거나 댑마다 찍혀. 모드는 넷이야. 그림 팁이 뒤집혀 나온 건 libmypaint가 댑 각도를 반 바퀴 단위로만 알아서였어. 테이퍼는 펜을 떼면 스트로크 전체를 다시 그려서 끝을 가늘게 만들어. 규칙마다 어디 사는지도 같이 봐. 배치가 끝날 때까지 기다려도 되는 규칙은 Painter에 살고, 스탬프 하나만 아는 사실이 필요한 규칙은 C 표면에 살아. 어느 쪽이든 libmypaint는 손대지 않은 그대로야.

    Lesson list (5)퀴즈 · 4 문제→
  6. 06💾Undo, Files, Compositor

    0/5 lessons

    그림이 메모리, 디스크, GPU와 만나는 곳, 그리고 각자 얼마나 반올림해도 되는지

    실행 취소, 파일, 합성기는 그림 앱이 메모리와 디스크와 GPU를 한꺼번에 만나는 자리야. 셋을 꿰는 질문은 하나야. 어느 사본이 진실이고, 어느 사본은 버리거나 반올림해도 되느냐. 이 트랙은 실행 취소 기록에서 시작해. indirect enum 하나에 열네 가지 변경이 담겨 있어. 768 MiB 예산은 스텝마다 그 스텝만 붙잡고 있는 것에만 값을 매기고, 메모리 경고가 오면 가장 오래된 스텝은 덜어내도 레이어는 절대 안 건드려. 다음은 .ariandel 패키지야. 숨은 형제 폴더에 통째로 써서 한 번에 바꿔 끼우고, 마지막 변경 4초 뒤에 자동 저장해. 그다음은 합성되는 그림이라면 전부 지나가는 Metal 커널 하나야. 이 커널은 Swift 문자열에서 런타임에 컴파일돼. 이어서 8비트 화면 거울을 읽다가 희미한 페인트의 색을 지워 버린 병합을 보고, flatten은 왜 아직 그걸 읽어도 되는지 짚어. 마지막은 캔버스야. 크기와 레이어 수가 기기 RAM을 따라 정해지고, 밉맵은 캔버스가 자기 픽셀보다 작게 보일 때만 나타나. Ariandel이 쓰고 읽는 파일 형식들도 보고, 남의 앱 아카이브를 그 앱 클래스를 하나도 안 만들고 읽는 법까지 봐. 그리고 예산이든 한계든 프레임 레이트든, 그중 iPad에서 실제로 잰 숫자는 하나도 없다는 것도 솔직하게 짚어.

    아빠 아이패드에서 연필 초상화 위에 Ariandel 레이어 패널을 연 화면. 레이어가 넷이고, 그중 하나는 Normal 60%로 둔 생성 레이어, 하나는 숨긴 사진 레이어야. 불투명도, 블렌드 모드, 배경 토글이 보여.
    줄 하나가 배열 텍스처의 한 장이야. 사람이 합성기의 입력을 들여다보는 창이 바로 이 패널이고.
    Lesson list (5)퀴즈 · 4 문제→
  7. 07👁️A Companion Who Sees but Never Paints

    0/5 lessons

    피파가 아빠 캔버스 곁에 앉는 법: 그림마다 주소 하나, 피파가 원할 때만 보기, 따로 떨어진 층에 그리는 가이드, 아빠 탭 없인 레이어에 아무것도 안 들어가

    Ariandel의 동반자는 Ariandel 안에서 안 만들어. cwk피파의 Sidekick이 캔버스 옆에 네이티브로 붙고, 주소는 그림마다 하나야. 2026-10-07부터 아빠가 거기서 한 말은 아빠의 Master Chief 대화 하나로 들어가고, 그림은 그 턴이 어느 캔버스를 볼 수 있는지를 정해. 이 트랙은 그 동반자가 어떻게 보는지, 그리고 뭘 절대 못 건드리는지 따라가. 오디오 요소가 쿠키만 싣는 바람에 인증 실패가 음성 기능처럼 보였던 이야기, 거의 맞았지만 한 번도 안 불린 WebKit 델리게이트 이야기가 나와. 턴 단위 브로커를 거치는 캔버스 룩 한 번을 끝까지 따라가 보기도 해. 그림은 피파의 도구 결과로 곧장 들어가고, 턴과 턴 사이엔 아무것도 안 나간다는 것도 확인할 거야. 캔버스 비율로 쓴 JSON 가이드가 아빠가 숨길 수 있는 오버레이에 내려앉는 것도 보고. 마지막은 Generate 패널의 규칙 둘이야. Ember의 그림은 아빠의 Stamp를 거쳐야만 레이어에 닿고, 돈이 드는 요청은 몰래 나가는 법이 없어.

    Insert를 누른 뒤의 Ariandel 화면. 연필 초상화 위, 피파 전용 가이드 레이어에 파란 루미스 머리 구조 가이드가 그려져 있어. 두개골 공, 옆면, 얼굴 중심선, 헤어라인, 눈썹선, 코 밑선, 턱선이 한국어로 적혀 있고, 아래 Pippa's guides 막대는 Hide / Clear로 바뀌었어.
    피파가 다듬을 첫 시도야. 자기 레이어에만 그리고, 아빠 그림엔 절대 안 닿아.
    Lesson list (5)퀴즈 · 4 문제→
  8. 08🚀Shipping at Round Speed

    0/3 lessons

    라운드로 쌓은 빌드 스물넷, 업로드마다 사실 넷, 그리고 시뮬레이터가 증명 못 하는 것의 정직한 목록

    Ariandel 저장소는 2026년 10월 1일에 태어났고, TestFlight 빌드 24는 10일에 나왔어. 이 한 줄이 배울 만한 걸 전부 가려. 그래서 이 트랙은 기록을 읽어. git이 진짜 모양을 보여 줘. 사흘도 안 돼 빌드 스물셋, 그다음 닷새 반의 정적. Coop은 라운드가 뭐였는지 보여 줘. 아빠 말로 된 계기, 기능 하나에 커밋 하나, 거절할 수 있는 게이트, 빌드, 기록 행. 그리고 기능이 쌓이기 전에 타일을 전부 복사하던 자동 저장을 잡은 코드 리뷰도. TestFlight 배포는 사실 넷으로 쪼개서 봐. 업로드부터 그 빌드를 진짜로 돌리는 iPad까지. App Store Connect가 빌드 18을 설치됨으로 세는 동안 iPad는 14를 돌리고 있던 그 아침도 들어 있어. 마지막 레슨은 정직한 선을 그어. 게이트가 남긴 XCUITest 흉터, 아빠 iPad만 증명할 수 있는 것, 그리고 하드웨어 없이 도는 테스트 중 어느 것도 보도록 짜이지 않았던, libmypaint 경계의 단위 버그 둘.

    아빠 iPad의 Ariandel 갤러리. 제목은 "Ariandel · Build 24"이고, 제목 없는 그림 셋이 있어. 눈 내리는 연필 초상, 검은 바탕에 붉은 줄이 들어간 머리의 초상, 옅은 꽃 사이의 초상. 그림마다 픽셀 크기와 날짜가 붙어 있어.
    자기 번호를 말하는 빌드 24. 빌드 19부터 갤러리 제목이 지금 열려 있는 빌드를 알려 줘.
    Lesson list (3)퀴즈 · 4 문제→
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.