퀵드로

등반 장비에 대해서는 퀵드로 (장비) 문서를 참고하십시오.

퀵드로(QuickDraw)는 클래식 맥 OS의 핵심 부분인 2D 그래픽스 라이브러리이자 관련 애플리케이션 프로그래밍 인터페이스(API)이다. 이 라이브러리는 처음에 빌 앳킨슨과 앤디 허츠펠드가 작성했다. 퀵드로는 맥 OS X의 라이브러리 일부로 여전히 존재했으나, 이후 더 현대적인 쿼츠 그래픽스 시스템으로 대체되었다. 맥 OS X 타이거에서 퀵드로는 공식적으로 deprecated(사용 중단)되었다. 맥 OS X 레퍼드부터는 퀵드로를 사용하는 애플리케이션이 추가된 64비트 지원을 활용할 수 없게 되었다. OS X 마운틴 라이언에서는 운영 체제에서 퀵드로 헤더 지원이 완전히 제거되었다. 퀵드로를 사용하는 애플리케이션은 OS X 마운틴 라이언부터 macOS 하이 시에라까지는 여전히 실행되었으나, 현재 버전의 Xcode와 macOS SDK에는 이러한 프로그램을 컴파일하기 위한 헤더 파일이 포함되어 있지 않다.

퀵드로의 원리

퀵드로는 1980년대 초 애플 리사의 LisaGraf에 기반을 두고 있으며, 초기 애플 시스템의 파스칼 기반 인터페이스 및 개발 환경에 잘 맞도록 설계되었다. 또한 퀵드로는 픽셀을 그래픽 정보의 기본 단위로 정의하는 래스터 그래픽스 시스템이었다. 이는 그래픽 기본 요소가 수학적 용어로 정의되고 디스플레이 해상도에 맞춰 필요한 경우 래스터화되는 벡터 그래픽스 시스템과는 대조적이다. 래스터 시스템은 처리 능력이 훨씬 덜 필요하며, 퀵드로가 개발되던 당시에는 지배적인 패러다임이었다.

퀵드로는 핵심 데이터 구조인 그래픽 포트, 즉 GrafPort를 정의했다. 이는 그래픽을 그릴 수 있는 논리적 그리기 영역이었다. GrafPort에 대응하는 가장 분명한 화면상의 "객체"는 창이었지만, 전체 데스크톱 화면이 GrafPort가 될 수도 있었고, 화면 밖 포트(off-screen port)도 존재할 수 있었다.

GrafPort는 좌표계를 정의했다. 퀵드로에서 이 좌표계는 16비트의 해상도를 가져 65,536개의 고유한 수직 및 수평 위치를 제공했다. 이 위치들은 맨 왼쪽(또는 상단)의 -32,767부터 맨 오른쪽(또는 하단)의 +32,767까지 번호가 매겨졌다. 창은 일반적으로 콘텐츠 영역의 왼쪽 상단 모서리가 관련 GrafPort의 0,0 위치에 오도록 설정되었다. 창의 콘텐츠 영역에는 창의 테두리, 드롭 섀도, 제목 표시줄(있는 경우)은 포함되지 않았다.

퀵드로 좌표는 픽셀 위치 사이의 무한히 얇은 선을 지칭했다. 실제 픽셀은 좌표의 바로 오른쪽과 아래 공간에 그려졌다. 이는 프로그래머가 오프 바이 원 오류로 인한 그래픽 결함을 방지하는 데 도움을 주었다.

매킨토시에서 픽셀은 정사각형이었고, GrafPort는 인쇄 업계에서 확립된 관례인 인치당 72포인트를 따르기 위해 기본 해상도를 인치당 72픽셀로 설정했다.

퀵드로는 또한 여러 확장 및 매핑 기능을 포함하고 있었다.

퀵드로는 프로세스당 여러 전역 변수를 유지했는데, 그중 가장 중요한 것은 현재 포트였다. 이는 모든 작업이 "현재 포트"와 관련되어 있었기 때문에 초기에는 API를 단순화했지만, 운영 체제가 발전함에 따라 이러한 전역 상태 사용은 멀티스레딩 및 선점형 멀티태스킹과 같은 현대적인 설계 방식과 퀵드로를 통합하기 어렵게 만들었다. 이러한 문제를 해결하기 위해 (맥 OS 9와 맥 OS X 사이의 가교인) 카본 API는 일부 루틴에 추가 매개변수를 추가하여 스레드 정보의 (불투명한) 저장과 새로운 (비폴링 방식의) 이벤트 구조를 허용했다.

그래픽 기본 요소

클래식 맥 OS 화면에 보이는 모든 것은 퀵드로에 의해 그려지지만, 라이브러리 자체는 상당히 저수준이다. 그릴 수 있는 기본 객체는 다음과 같다:

이러한 각 객체(텍스트 제외)는 직사각형 치수, 패턴 또는 색상을 가질 수 있는 "펜"을 사용하여 그릴 수 있다. 펜은 직사각형이고 축에 정렬되어 있으므로 대각선은 수평선이나 수직선보다 두껍게 그려진다는 점에 유의해야 한다. 도형은 패턴이나 색상을 사용하여 채우거나 테두리만 그릴 수 있다. 채워진 호는 부채꼴을 형성한다. 텍스트는 설치된 모든 글꼴로, 다양한 스타일 변형과 크기 및 색상으로 그릴 수 있다. 선택한 글꼴이 저장된 방식에 따라 텍스트는 다양한 방식으로 확대/축소될 수 있다. 트루타입 글꼴은 모든 크기로 부드럽게 확대/축소되지만, 비트맵 글꼴은 일반적으로 잘 확대되지 않는다.

퀵드로의 중요한 특징은 전송 모드에 대한 지원이었으며, 이는 대상 픽셀 값이 이전 값 및 그려지는 객체의 색상과 어떻게 관계되는지를 결정했다.

펜과 텍스트 그리기의 속성 집합은 GrafPort와 연결되어 있다.

영역(Regions)은 퀵드로의 핵심 데이터 구조이다. 이는 비트맵과 유사하게 임의의 픽셀 집합을 정의하지만, 매우 복잡한 방식으로 신속하게 조작할 수 있는 압축된 형태를 가진다. 영역은 결합(union), 빼기(difference), XOR 연산을 통해 다른 영역을 형성할 수 있다. 이는 GrafPort 내에서 클리핑을 위해 사용되거나, 다른 도형처럼 채워지거나 테두리가 그려질 수 있다. 테두리가 그려진 도형과 연결된 선들은 하나의 영역으로 결합될 수 있다. 영역은 반드시 연속적인 픽셀 집합으로 구성될 필요는 없으며, 연결되지 않은 영역도 가능하며 흔히 사용된다. 영역은 강력한 그래픽 조작을 가능하게 하지만, 최대 영역 데이터 저장 크기를 16비트 값으로 제한하는 현재 구현 때문에 범용적인 그리기 구성 도구로는 실용적이지 않으며 고해상도에서의 사용도 제한적이다. 영역은 퀵드로의 나머지 부분을 뒷받침하며, 여러 겹치는 창을 구현하는 데 필수적인 임의의 모양으로의 클리핑을 허용한다. 빌 앳킨슨이 발명한 영역은 애플에 의해 별도의 발명으로 특허를 받았다.

영역은 (초기 생성 후) 영역 열기, 다양한 퀵드로 도형 그리기, 영역 닫기 과정을 통해 지정된다. 퀵드로 명령이 실행됨에 따라 숨겨진 루틴이 영역을 구성한다. 비트맵은 영역으로 변환될 수 있으며, 영역을 그래픽 포트에 "칠하거나(painting)" "채움(filling)"으로써 영역으로부터 비트맵을 만들 수도 있다.

영역의 내부 구조는 저장 길이와 경계 직사각형 외에는 불투명하다. 애플이 발표한 문서는 없지만 메커니즘은 특허에 개략적으로 설명되어 있다. 영역은 수직 및 수평 데이터 압축을 모두 사용하여 구현된다. 영역은 수평 스캔 라인("래스터")의 연속으로 저장되며, 각 라인에는 수직 좌표와 그 뒤를 잇는 수평 반전 좌표 목록이 포함된다. 각 반전 지점은 그 뒤의 모든 지점에 대해 영역 포함 여부를 토글하는 것으로 생각할 수 있다. 첫 번째 지점은 영역을 켜고, 두 번째는 끄는 식이다. 추가 압축은 각 라인을 차분 방식으로 저장하여 이루어진다. 즉, 각 라인에는 전체 반전 지점 집합 대신 이전 라인과의 차이점만 포함된다. 마지막으로, 동일한 인접 스캔 라인은 단순히 건너뛰는 방식으로 효율적으로 인코딩된다. 이러한 방식으로 둥근 모서리 직사각형과 같이 흔히 사용되는 영역은 효율적으로 인코딩되며, 영역 구성 및 이미지 클리핑과 같은 복잡한 작업도 많은 프로세서 주기나 대량의 메모리 없이 수행할 수 있다. (퀵드로 코드를 실행하는 초기 시스템은 8메가헤르츠 클록 속도의 프로세서를 사용했으며 시스템에는 128킬로바이트의 쓰기 가능한 메모리밖에 없었다.)

영역은 특정 방향에 고정되어 있으므로, 영역을 90도 회전하려면 구조에 대한 상세한 역공학과 광범위한 코딩이 필요하다. 원본 소스 경계 설명을 회전하고 단순히 새로운 영역을 만드는 것에 비해 일반적인 회전은 비실용적이다. 그러나 API에는 비트맵 간의 변환 루틴이 포함되어 있다. (비트맵 또한 잘 알려진 방법을 사용하여 회전할 수 있지만, 선택한 각도, 작업에 사용할 수 있는 저장 공간 및 프로세서 주기, 알고리즘의 복잡성에 따라 이미지 저하 정도가 달라진다.)

애플은 최근 (카본 API에서) 일부 프로그램 컴파일 옵션 하에서 영역을 불투명한 구조로 정의했다.

고수준 작업

퀵드로에 대한 모든 그래픽 호출 시리즈는 Picture라는 구조에 기록될 수 있다. 이는 메모리에 저장되고 언제든지 "재생"되어 그래픽 시퀀스를 재현할 수 있다. 재생 시점에 그림은 비트맵 확대/축소에서 흔히 발생하는 해상도 손실 없이 새로운 좌표에 배치되거나 크기가 조정될 수 있다. 그림은 디스크에 저장될 수 있으며, 이 형태가 애플의 PICT 형식을 정의한다.

전체 비트맵(컬러 이미지의 경우 픽스맵)은 확대/축소 및 클리핑과 함께 한 GrafPort에서 다른 GrafPort로 복사될 수 있다. 함수 이름을 따서 블리팅(blitting) 또는 CopyBits라고 불리는 이 작업은 매킨토시에서 대부분의 애니메이션 및 스프라이트 효과의 기초가 된다.

퀵드로는 GrafPort 내에서 스크롤을 구현하기 위해 설계된 유사한 블리팅 기능을 제공한다. 포트의 이미지는 확대/축소 없이(그러나 원한다면 클리핑을 포함하여) 새로운 위치로 이동할 수 있다.

각 그래픽 기본 작업은 GrafPort에 저장된 일련의 함수 포인터인 StdProcs를 통해 벡터화된다. 이러한 제한된 다형성을 통해 개별 작업을 재정의하거나 사용자 지정 함수로 교체할 수 있으므로, 프린터 드라이버가 그래픽 명령을 가로채서 적절한 프린터 작업으로 변환할 수 있다. 이런 방식으로 퀵드로는 포스트스크립트를 사용하여 렌더링할 수 있었으며, 이는 매킨토시가 실질적으로 탁상출판을 발명하게 한 사실이다.

상속과 유사하게, 창 데이터 구조는 관련 GrafPort로 시작되었으므로 기본적으로 창을 모든 GrafPort와 교환 가능하게 만들었다. 편리하기는 했지만, 오프스크린 그래픽 포트를 완전한 창을 기대하는 API에 전달하는 잘못된 코드를 작성하기 쉬웠다.

역사

퀵드로는 애플 리사 개발의 일환으로 Lisa Graf로 시작되었다. 매킨토시를 위해 초기에는 단순화되었으나 이후 확장되었다. 원래 QuickDraw GrafPort는 1비트 깊이, 즉 픽셀당 1비트(흑백)만 지원했다. 이는 512×342 픽셀의 고정 크기를 가진 초기 매킨토시의 내장 화면에 적합했다. 제한된 색상은 조잡한 평면 모델을 사용하여 지원되었으며, 퀵드로가 다색 리본을 사용하는 일부 유형의 도트 매트릭스 프린터를 구동할 수 있게 했지만 이 기능을 지원하는 애플리케이션은 거의 없었다.

1987년, 컴퓨터, 모니터, 키보드가 모두 분리된 보다 전통적인 3박스 디자인으로 설계된 매킨토시 II가 출시되었다. 모니터가 분리되어 있고 원래의 맥보다 컸기 때문에 비디오 아키텍처는 필연적으로 변경되어야 했다. 또한 맥 II는 매킨토시를 흑백에서 풀 컬러로 전환했다. 애플은 이때 업계 최초로 여러 모니터에 걸쳐 매끄러운 데스크톱을 지원하기로 결정했다. 따라서 원래 퀵드로의 중요한 확장인 Color 퀵드로가 만들어졌다. 당시 빌 앳킨슨은 하이퍼카드로 바빴기 때문에 Color QuickDraw 작업은 (당시 23세였던) 어니 비어닝크(Ernie Beernink)가 수행했다: 애플의 데이브 앨런은 데이브 펑(Dave Fung)의 공로도 인정했다. 원래 아키텍처는 확장성에 대한 고려가 부족했지만, 일련의 해킹을 사용하여 애플 개발자들은 색상 추가와 새로운 비디오 아키텍처를 개발자와 최종 사용자 모두에게 거의 매끄럽게 만드는 데 성공했다.

Color 퀵드로는 연결된 각 비디오 카드/모니터를 나타내는 GDevice, 색상을 처리하기 위한 새로운 컬러 GrafPort(CGrafPort) 구조, 픽셀당 여러 비트 이미지를 위한 비트맵 대신 픽스맵을 포함한 새로운 데이터 구조를 도입했다. 호환성을 위해 사용된 해킹 중 하나는 새로운 구조가 이전 구조와 정확히 같은 크기이며 대부분의 데이터 멤버가 같은 위치에 있다는 것이었지만, 비트맵 필드 대신 컬러 구조에 대한 추가 핸들과 포인터가 있었다. rowBytes 필드의 상위 2비트는 GrafPort와 CGrafPort를 구분하는 플래그로 사용되었다(비트맵은 이 비트를 설정할 정도로 넓을 수 없었기 때문에 이전 스타일의 GrafPort에서는 항상 0이었다). 이 두 상위 비트의 사용은 나중에 퀵드로를 괴롭히게 되었는데, 32비트 픽스맵에서 최대 행 너비를 4,095로 제한했기 때문이며, 이는 고해상도 그래픽 작업에 문제가 되었다. 이후 개발(맥 OS 8.5/카본)에서 이 제한을 제거했지만 완전히 하위 호환되지는 않았다. Color 퀵드로에는 인덱스 비디오 장치에서 색상 조정을 관리하는 팔레트 관리자(Palette Manager)도 추가되었다. 대부분의 그래픽 기본 작업은 변경되지 않았거나(컬러로 작동하지만), 흑백 API의 새로운 컬러 버전이 추가되었다.

초기에 Color 퀵드로는 당시 사용할 수 있었던 1, 2, 4, 8비트 비디오 카드에서만 작동할 수 있었다. 그러나 곧 24비트 비디오 카드(이른바 트루 컬러)가 등장했고, 퀵드로는 픽셀당 최대 32비트(실제로는 24비트, 8비트는 사용되지 않음)의 컬러 데이터("32비트 퀵드로")를 지원하도록 다시 업데이트되었다. 아키텍처는 항상 이를 허용했으므로 새로운 API는 필요하지 않았다. 컬러 데이터 구조 자체는 1, 2, 4, 8, 15, 24비트의 색상 깊이를 허용하여 각각 2, 4, 16, 256, 32,768, 16,777,216가지 색상 또는 4, 16, 256단계의 회색조를 제공했다. 퀵드로는 실제 비디오 하드웨어의 사용 가능한 색상 깊이에 맞춰 색상을 다시 샘플링하거나, 오프스크린 이미지 버퍼 간의 전송을 관리하는 작업을 처리했으며, 이미지 품질을 향상시키기 위해 선택적으로 이미지를 낮은 깊이로 디더링하는 것도 포함되었다. 프로그래머가 인덱스 비디오 장치에서 사용할 최적의 색상 팔레트를 생성할 수 있도록 일련의 색상 샘플링 유틸리티도 추가되었다.

퀵드로의 아키텍처는 항상 GrafPort와 관련 비트맵 또는 픽스맵을 "오프스크린(offscreen)"으로 생성하는 것을 허용했으며, 여기서 그래픽은 화면에 즉시 표시되지 않고 메모리에서 구성될 수 있었다. 픽셀은 퀵드로 블리팅 함수인 CopyBits를 사용하여 이러한 오프스크린 포트와 화면 간에 전송될 수 있었다. 이러한 오프스크린 합성은 게임 및 그래픽 집약적 애플리케이션의 핵심이다. 그러나 32비트 퀵드로가 등장하기 전까지 이러한 오프스크린 환경은 프로그래머가 애플리케이션 내에서 직접 생성하고 설정해야 했다. 이는 3개 이상의 개별적이고 상당히 복잡한 데이터 구조(CGrafPort, PixMap 및 GDevice, 인덱스 장치의 경우 색상 조회표와 그 역)를 다루어야 했기 때문에 오류가 발생하기 쉬웠다. 32비트 퀵드로와 함께 이를 처리하기 위한 OS 지원이 추가되었으며, "오프스크린 그래픽 월드" 또는 GWorld가 도입되었다. GWorld의 비디오 버퍼(PixMap)는 메인 메모리에 저장되거나, 사용 가능한 경우 비디오 램의 미사용 부분에 저장될 수 있었으며, 여기서 화면으로 복사하는 속도는 메인 메모리 버스를 통해 대량의 픽셀 데이터를 전송할 필요가 없도록 최적화될 수 있었다.

퀵타임의 등장과 함께 퀵드로는 JPEG와 같은 압축된 래스터 데이터를 다룰 수 있는 능력을 얻었다. 퀵타임 이미지 압축 관리자는 퀵드로와 밀접하게 통합되었다. 특히, 이미지 압축 해제 호출은 본격적인 퀵드로 그리기 호출이었으며, 그림이 기록되는 중이라면 압축된 데이터는 나중에 그림이 그려질 때 표시하기 위해 그림의 일부로 저장되었다. 이미지 압축 관리자는 컬러싱크 색상 매칭과의 통합도 추가했다.

그 후, 새로운 프로세서 아키텍처(파워PC)에 최적화하기 위한 백엔드 변경을 제외하고 퀵드로는 클래식 맥 OS의 수명 동안 대체로 변경되지 않았다. 퀵드로 GX와 퀵드로 3D는 퀵드로라는 이름을 공유하고 퀵드로 픽스맵 및 그림 데이터 구조와 상호 운용될 수 있었지만, 기능적으로는 완전히 별개였다.

맥 OS X와 함께 퀵드로는 카본 API의 일부가 되었다. 2005년 맥 OS X 10.4 출시와 함께 퀵드로는 공식적으로 구식화(deprecated)되었다.

2010년 컴퓨터 역사 박물관을 통해 맥페인트 1.3의 소스 코드가 공개되면서, 퀵드로 소스 코드의 역사적 버전도 사용할 수 있게 되었다.

같이 보기

각주

  1. ↑ “Folklore: -2000 Lines of Code”. 《folklore.org》.
  2. ↑ Levy, Steven (May 1987). “The Making of the Macintosh II”. 《Macworld》 (San Francisco: PCW Communications). 55–63쪽. ISSN 0741-8647. 2024년 7월 31일에 확인함. A 23-year-old named Ernie Beernik [sic] brilliantly recrafted the QuickDraw graphics routines to accommodate color.
  3. ↑ Allen, Dan (Summer 1988). “An Introduction to HyperCard Programming”. 《Dr. Dobb's Macintosh Special》. 56–74쪽. ISSN 1044-789X. 2024년 8월 2일에 확인함. However, Bill was not involved with Color QuickDraw, which is found on the Mac II, because he was involved with HyperCard at the time. Ernie Beernink and Dave Fung did Color QuickDraw.
  4. ↑ “MacPaint and QuickDraw Source Code”. 《컴퓨터 역사 박물관》. 2010년 7월 20일.
  5. ↑ Hesseldahl, Erik (2010년 7월 20일). “Apple Donates MacPaint Source Code To Computer History Museum”. businessweek.com. 2012년 2월 9일에 원본 문서에서 보존된 문서. 2014년 8월 23일에 확인함.

외부 링크