작품
퀵드로
QuickDraw
퀵드로(QuickDraw)는 클래식 맥 OS의 핵심 부분인 2D 그래픽스 라이브러리이자 관련 애플리케이션 프로그래밍 인터페이스(API)이다. 이 라이브러리는 처음에 빌 앳킨슨과 앤디 허츠펠드가 작성했다. 퀵드로는 맥 OS X의 라이브러리 일부로 여전히 존재했으나, 이후 더 현대적인 쿼츠 그래픽스 시스템으로 대체되었다.…
작품
QuickDraw
퀵드로(QuickDraw)는 클래식 맥 OS의 핵심 부분인 2D 그래픽스 라이브러리이자 관련 애플리케이션 프로그래밍 인터페이스(API)이다. 이 라이브러리는 처음에 빌 앳킨슨과 앤디 허츠펠드가 작성했다. 퀵드로는 맥 OS X의 라이브러리 일부로 여전히 존재했으나, 이후 더 현대적인 쿼츠 그래픽스 시스템으로 대체되었다.…
이 항목이 포함된 사건 파일에서 정보와 관계를 함께 살펴보세요.
이 항목이 포함된 사건 파일이 아직 없습니다.
이 항목으로 조사 시작하기아직 댓글이 없어요. 먼저 한마디 남겨 보세요.
퀵드로(QuickDraw)는 클래식 맥 OS의 핵심 부분인 2D 그래픽스 라이브러리이자 관련 애플리케이션 프로그래밍 인터페이스(API)이다. 이 라이브러리는 처음에 빌 앳킨슨과 앤디 허츠펠드가 작성했다.
퀵드로(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비트 값으로 제한하는 현재 구현 때문에 범용적인 그리기 구성 도구로는 실용적이지 않으며 고해상도에서의 사용도 제한적이다. 영역은 퀵드로의 나머지 부분을 뒷받침하며, 여러 겹치는 창을 구현하는 데 필수적인 임의의 모양으로의 클리핑을 허용한다. 빌 앳킨슨이 발명한 영역은 애플에 의해 별도의 발명으로 특허를 받았다.[1]
영역은 (초기 생성 후) 영역 열기, 다양한 퀵드로 도형 그리기, 영역 닫기 과정을 통해 지정된다. 퀵드로 명령이 실행됨에 따라 숨겨진 루틴이 영역을 구성한다. 비트맵은 영역으로 변환될 수 있으며, 영역을 그래픽 포트에 "칠하거나(painting)" "채움(filling)"으로써 영역으로부터 비트맵을 만들 수도 있다.
영역의 내부 구조는 저장 길이와 경계 직사각형 외에는 불투명하다. 애플이 발표한 문서는 없지만 메커니즘은 특허에 개략적으로 설명되어 있다. 영역은 수직 및 수평 데이터 압축을 모두 사용하여 구현된다. 영역은 수평 스캔 라인("래스터")의 연속으로 저장되며, 각 라인에는 수직 좌표와 그 뒤를 잇는 수평 반전 좌표 목록이 포함된다. 각 반전 지점은 그 뒤의 모든 지점에 대해 영역 포함 여부를 토글하는 것으로 생각할 수 있다. 첫 번째 지점은 영역을 켜고, 두 번째는 끄는 식이다. 추가 압축은 각 라인을 차분 방식으로 저장하여 이루어진다. 즉, 각 라인에는 전체 반전 지점 집합 대신 이전 라인과의 차이점만 포함된다. 마지막으로, 동일한 인접 스캔 라인은 단순히 건너뛰는 방식으로 효율적으로 인코딩된다. 이러한 방식으로 둥근 모서리 직사각형과 같이 흔히 사용되는 영역은 효율적으로 인코딩되며, 영역 구성 및 이미지 클리핑과 같은 복잡한 작업도 많은 프로세서 주기나 대량의 메모리 없이 수행할 수 있다. (퀵드로 코드를 실행하는 초기 시스템은 8메가헤르츠 클록 속도의 프로세서를 사용했으며 시스템에는 128킬로바이트의 쓰기 가능한 메모리밖에 없었다.)
퀵드로에 대한 모든 그래픽 호출 시리즈는 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비
출처: 퀵드로 (CC BY-SA)
확인된 구조화 정보, 사용자 의견, AI가 찾은 관계를 구분해 표시해요.
애플은 최근 (카본 API에서) 일부 프로그램 컴파일 옵션 하에서 영역을 불투명한 구조로 정의했다.