QuickDraw
QuickDraw마코스 그래픽 모델 |
---|
렌더링 |
컴포지팅 |
QuickDraw는 2D 그래픽 라이브러리와 맥 OS 운영 체제의 핵심인 API(Application Programming Interface)이다.이 책은 처음에 빌 앳킨슨과 앤디 헤르츠펠트에 의해 쓰여졌다.[1]QuickDraw는 여전히 Mac OS X의 라이브러리의 일부로 존재했지만, 대체로 보다 현대적인 Quartz 그래픽 시스템으로 대체되었다.Mac OS X v10.4에서는 QuickDraw가 공식적으로 사용되지 않았다.Mac OS X v10.5 애플리케이션에서 QuickDraw를 사용하면 추가된 64비트 지원을 사용할 수 없다.Mac OS X v10.8에서는 QuickDraw 헤더 지원이 운영 체제에서 제거되었다.QuickDraw를 사용하는 애플리케이션은 OS X 10.8에서 MacOS 10.13까지 계속 실행되지만, 현재 버전의 Xcode와 MacOS SDK에는 이러한 프로그램을 컴파일하기 위한 헤더 파일이 포함되어 있지 않다.
QuickDraw의 원리
QuickDraw는 1980년대 초 애플 리사의 리사그래프에 기반을 두었으며, 초기 애플 시스템의 파스칼 기반 인터페이스와 개발 환경에 잘 맞도록 설계되었다.또한 QuickDraw는 화소를 그래픽 정보의 기본 단위로 정의하는 래스터 그래픽 시스템이었다.이는 벡터 그래픽 시스템과는 대조적인 것으로, 수학적 용어로 그래픽 원형이 정의되고 디스플레이 분해능에 필요한 대로 래스터화된다.그러나 래스터 시스템은 훨씬 적은 처리 능력을 필요로 하며, QuickDraw가 개발되었을 당시 지배적인 패러다임이었다.
QuickDraw는 주요 데이터 구조, 그래픽 포트 또는 GrafPort를 정의했다.이곳은 그래픽을 그릴 수 있는 논리적인 그리기 영역이었다.GrafPort에 해당하는 화면상 "개체"가 가장 뚜렷하게 나타난 것은 창이었지만 전체 데스크톱 뷰는 GrafPort가 될 수 있었고, 화면 밖 포트도 존재할 수 있었다.
GrafPort는 좌표계를 정의했다.QuickDraw에서 이것은 16비트의 분해능을 가지며 65,536개의 독특한 수직 및 수평 위치를 제공한다.이 번호들은 왼쪽(또는 위쪽)의 -32,767부터 오른쪽(또는 아래쪽)의 +32,767까지 번호가 매겨진다.창은 대개 내용 영역의 왼쪽 상단 모서리가 관련 GrafPort에서 0.0에 위치하도록 설정되었다.창의 내용 영역에는 창의 프레임, 드롭 섀도 또는 제목 표시줄(있는 경우)이 포함되지 않았다.
QuickDraw 좌표는 픽셀 위치 사이의 무한히 얇은 선을 가리킨다.좌표 바로 오른쪽과 아래 공간에 실제 픽셀이 그려졌다.이를 통해 프로그래머들은 1회 오류로 인한 그래픽 결함을 쉽게 피할 수 있었다.
매킨토시에서는 화소가 정사각형이었고, 그라프포트의 기본 해상도는 인치 당 72 픽셀이었는데, 인치 당 72 포인트를 갖는 인쇄 산업에 의해 확립된 규약과 일치하도록 선택되었다.
QuickDraw에는 스케일링과 매핑 기능도 다수 포함되어 있었다.
QuickDraw는 프로세스당 다수의 글로벌 변수를 유지했으며, 그중에서도 현재 포트가 가장 중요하다.이것은 원래 API를 단순화시켰는데, 모든 운영이 "현재 포트"에 관련되었기 때문이다. 하지만 OS가 발전함에 따라, Global 상태의 이러한 사용은 QuickDraw를 멀티스레딩 및 프리-프리미어 멀티태스킹과 같은 현대적인 설계 접근법과 통합하는 것을 훨씬 어렵게 만들었다.이러한 문제를 해결하기 위해 Carbon API(Mac OS 9와 Mac OS X 사이의 브리지)는 일부 루틴에 추가 파라미터를 추가하여 스레드 정보의 (불투명) 저장과 새로운 (비폴레이션) 이벤트 구조를 가능하게 했다.
그래픽 기본 요소
클래식한 맥 OS 화면에 보이는 모든 것이 QuickDraw에 의해 그려지지만 도서관 자체는 상당히 낮은 수준이다.그것이 그릴 수 있는 원시적인 물체는 다음과 같다.
- 줄들
- 직사각형
- 둥근(및 타원형) 모서리가 있는 직사각형
- 난형(원 및 타원 포함)
- 호(및 웨지), 원형 및 타원형 모두
- 다각형(선들이 결합된 점 리스트에서 작성된 임의의 닫힌 모양)
- 영역(임의 픽셀 집합—아래 참조)
- 비트맵과 픽스맵
- 텍스트
이러한 물체(텍스트 제외)는 직사각형 치수, 패턴 또는 색상을 가질 수 있는 "펜"을 사용하여 그릴 수 있다.펜은 직사각형이고 축 정렬이기 때문에 대각선은 수평선이나 수직선보다 두꺼워진다.모양은 어떤 패턴이나 색상을 사용하여 채우거나 액자에 넣을 수 있다.채워진 아크(Arc)는 쐐기를 형성한다.텍스트는 설치된 글꼴, 다양한 양식적 변화, 크기 및 색상으로 그릴 수 있다.선택한 글꼴을 저장하는 방법에 따라 텍스트의 크기를 다양하게 조정할 수 있음 - TrueType 글꼴은 어떤 크기로든 부드럽게 확장되는 반면 비트맵 글꼴은 일반적으로 잘 확장되지 않는다.
QuickDraw의 중요한 특징은 전달 모드에 대한 지원으로, 대상 픽셀 값이 이전 값과 어떻게 관련되는지, 그리고 그려지는 물체의 색상에 영향을 주었다.
펜 및 텍스트 도면의 속성 집합은 GrafPort와 연관되어 있다.
지역은 QuickDraw의 핵심 데이터 구조다.그들은 비트맵과 같은 임의의 픽셀 집합을 정의하지만 복잡한 방법으로 매우 빠르게 조작될 수 있는 압축된 형태로 정의한다.영역은 결합(조합), 감산(차이) 및 XORed를 통해 다른 영역을 형성할 수 있다.그들은 다른 모양과 마찬가지로 채우기 또는 액자를 그리기 위해 GrafPort 내에서 사용할 수 있다.일련의 프레임 모양과 연결된 선을 영역으로 결합할 수 있다.영역은 연속적인 픽셀 집합으로 구성될 필요가 없다 - 연결되지 않은 영역이 가능하고 공통적이다.지역이 강력한 그래픽 조작을 허용할 수 있지만, 최대 지역 데이터 저장 크기를 16비트 값으로 제한하는 현재의 구현에 의해 제한되므로 범용 도면 합성 도구로서 실용적이지 않으며 고해상도에서의 실용적 사용도 제한된다.지역은 QuickDraw의 나머지 부분을 지지하며, 여러 개의 겹치는 창을 구현하는 데 필수적인 임의의 모양을 클리핑할 수 있다.빌 앳킨슨에 의해 발명된 지역들은 애플에 의해 별도의 발명품으로 특허를 받았다.[1]
영역은 영역 개방으로 지정되며(초기 생성 후), 다양한 QuickDraw 형상을 그리고 영역을 닫는다.숨겨진 루틴은 QuickDraw 명령이 실행될 때 영역을 생성한다.비트맵은 또한 지역으로 변환될 수 있으며 비트맵은 지역을 그래픽 포트로 "도색"하거나 "충전"하여 지역에서 만들 수 있다.
저장 길이와 경계 직사각형을 제외한 지역의 내부 구조는 불투명하다. 특허에 메커니즘이 개략적으로 설명되어 있지만 Apple이 발행한 문서는 없다.영역은 수직 압축과 수평 압축을 모두 사용하여 구현된다.영역은 일련의 수평 스캔 라인("래스터")으로 저장되며, 각 라인은 수평 반전 좌표 목록 뒤에 이어지는 수직 좌표를 포함한다.각 반전 지점은 첫 번째 지점이 지역을 켜고, 두 번째 지점이 지역을 끄는 등의 모든 포인트에 대해 지역에 포함된다고 생각할 수 있다.추가 압축은 각 라인을 차등적으로 저장함으로써 달성된다. 각 라인은 전체 반전 포인트 집합이 아닌 이전 라인과의 차이만 포함한다.마지막으로 동일한 인접 스캔 라인은 건너뛰기만 하면 효율적으로 인코딩된다.이와 같이, 일반적으로 사용되는 지역인 둥근 모서리의 사각형은 효율적으로 인코딩되며, 지역 구성과 이미지 클리핑과 같은 복잡한 작업은 광범위한 프로세서 사이클이나 대량의 메모리를 요구하지 않고 수행할 수 있다.(QuickDraw 코드를 실행하는 원래 시스템은 8 MHz 클럭 랫드로 작동하는 프로세서를 사용했다.es 및 시스템에는 128킬로바이트의 쓰기 가능한 메모리가 있었다.)
지역은 특정한 방향에 구속되기 때문에, 지역의 90도 회전을 위해서는 구조의 상세한 역 엔지니어링과 광범위한 코딩이 필요할 것이다.일반적인 회전은 원래 소스 경계 설명을 회전시키고 단순히 새로운 영역을 생성하는 것과 비교할 때 비실용적이다.그러나 API에는 비트맵을 주고받는 변환 루틴이 포함되어 있다.(잘 알려진 방법을 사용하여 비트맵을 회전할 수도 있지만 선택한 각도에 따라 다양한 이미지 저하, 작업에 사용할 수 있는 스토리지 및 프로세서 사이클, 알고리즘의 복잡성)
애플은 최근 일부 프로그램 편성 옵션에서 지역을 불투명한 구조로 규정했다.
상위 레벨 작업
QuickDraw에 대한 모든 그래픽 호출 시리즈는 그림이라는 구조로 기록될 수 있다.그러면 이것은 메모리에 저장될 수 있고 그래픽 시퀀스를 재현하면서 언제든지 "재생"될 수 있다.재생 시 사진을 새로운 좌표에 배치하거나 비트맵 스케일링에서 흔히 볼 수 있는 해상도의 손실 없이 크기를 조정할 수 있다.그림은 Apple PICT 형식을 정의하는 디스크에 저장할 수 있다.
전체 비트맵(또는 색상 이미지를 참조할 때 픽스맵)은 확장 및 자르기 기능을 사용하여 한 GrafPort에서 다른 GrafPort로 복사할 수 있다.이 기능의 이름을 따서 블리팅, 즉 CopyBits로 알려진 이 작업은 Mac에 대한 대부분의 애니메이션과 스프라이트 같은 효과의 기초가 된다.
QuickDraw는 GrafPort 내에서 스크롤링을 구현하도록 설계된 유사한 블리팅 기능을 제공한다. 포트의 이미지는 스케일링 없이 새 위치로 이동할 수 있다(원하는 경우 클리핑).
각 그래픽 원시 연산은 GrafPort에 저장된 일련의 함수 포인터인 StdProcs를 통해 제어된다.이 제한된 다형성 때문에 개별 연산을 오버라이드하거나 사용자 지정 기능으로 대체할 수 있어 프린터 드라이버가 그래픽 명령을 가로채 적절한 프린터 연산으로 변환할 수 있다.이러한 방식으로 QuickDraw는 포스트스크립트를 사용하여 렌더링될 수 있는데, 이는 매킨토시가 실질적으로 데스크탑 퍼블리싱을 발명할 수 있게 한 사실이다.
하위 클래스와 유사하게, 윈도우 데이터 구조는 연관된 GrafPort에서 시작되었고, 따라서 기본적으로 어떤 GrafPort와도 교환이 가능하도록 만들었다.편리하지만, 이것은 화면 밖 그래픽 포트를 통과한 잘못된 코드를 완전한 창을 기대한 API에 쉽게 쓸 수 있게 했다.
역사
QuickDraw는 애플 리사 개발의 일환으로 리사 그라프로서의 삶을 시작했다.Macintosh의 경우 처음에는 단순화되었지만 나중에는 확장되었다.원래 QuickDraw GrafPorts는 픽셀당 1비트, 즉 흑백의 비트 깊이만 지원했다.이것은 512×342 픽셀의 고정 크기로 초기 매킨토시의 내장 화면에 적합했다.조잡한 평면 모델을 사용하여 제한된 색상을 지원하여 QuickDraw가 멀티 컬러 리본을 사용하는 일부 유형의 도트 매트릭스 프린터를 구동할 수 있었지만, 이 기능을 지원하는 애플리케이션은 거의 없었다.
1987년에, 매킨토시 II가 개발되고 출시되었는데, 이것은 전통적인 3박스 디자인인 컴퓨터, 모니터, 키보드가 모두 분리되어 디자인되었다.모니터는 분리되어 있었고, 원래의 Mac보다 더 컸기 때문에 비디오 아키텍처는 반드시 변경되어야 했다.게다가 맥 II는 매킨토시를 흑백에서 풀 컬러로 가져갔다.애플도 이 시기에 업계 최초로 다중 모니터에 이르는 원활한 데스크톱을 지원하기로 결정했다.따라서 원래의 QuickDraw의 중요한 확장인 Color QuickDraw가 만들어졌다.원래의 아키텍처는 확장성을 위한 많은 준비가 부족했지만, 일련의 해킹을 이용하여, 애플 개발자들은 개발자와 최종 사용자 모두에게 색상과 새로운 비디오 아키텍처를 사실상 완벽하게 추가할 수 있었다.
Color QuickDraw는 첨부된 각 비디오 카드/모니터를 나타내는 GDevices와 색상을 취급하는 새로운 컬러 GrafPort(CGRAFPort) 구조 등 새로운 데이터 구조와 픽셀당 복수의 비트맵 대신 픽스맵을 선보였다.여기서 사용된 호환성을 위한 해킹 중 하나는 새로운 구조물이 기존 구조와 정확히 같은 크기로 대부분의 데이터 구성원이 같은 장소에 있지만 비트맵 필드 대신 색상 구조에 핸들과 포인터를 추가했다는 것이다.RowBytes 필드의 위쪽 두 비트는 GrafPort와 CGrafPort를 구별하기 위해 플래그로 사용되도록 눌렀다(BitMap은 이러한 비트를 설정할 만큼 결코 넓을 수 없기 때문에 이전 스타일의 GrafPort에서는 항상 0이었다).이 두 개의 높은 비트를 사용한 것은 나중에 QuickDraw를 괴롭힐 것인데, 32비트 픽스맵에서 최대 행 폭 4,095를 강요했기 때문에 고해상도 그래픽 작업에 문제가 되었다.후기 개발(탄소)은 이러한 한계를 없앴지만 완전히 역호환되는 것은 아니었다.색인화된 비디오 장치의 색 중재를 관리하는 Color QuickDraw에도 Palette Manager가 추가되었다.대부분의 그래픽 원시 요소 작업은 변경되지 않았거나(그러나 컬러로 작동하거나), 또는 흑백 API의 새로운 색상 버전이 추가되었다.
당초 컬러 퀵드로는 당시 사용 가능했던 1, 2, 4, 8비트 비디오 카드만으로 조작이 가능했다.그러나 곧이어 24비트 비디오 카드(일명 참색)가 등장했고, QuickDraw는 다시 업데이트되어 픽셀당 최대 32비트(실제로는 24비트, 사용되지 않는 8비트)의 컬러 데이터("32비트 QuickDraw")를 지원하게 되었다.그러나 아키텍처는 항상 이것을 허용했기 때문에 새로운 API가 필요하지 않았다.색상 데이터 구조 자체는 1, 2, 2, 4, 8, 15, 24비트의 색상 깊이를 허용했고, 각각 2, 4, 16, 256, 32,768, 16,176색, 16, 16, 256척의 그레이를 산출했다.QuickDraw는 실제 비디오 하드웨어의 사용 가능한 색 깊이까지 색상 재샘플링을 관리하거나, 이미지 품질을 개선하기 위해 영상을 선택적으로 낮은 깊이까지 디더링하는 것을 포함하여 오프스크린 이미지 버퍼 간 전송을 관리했다.프로그래머가 인덱싱된 비디오 장치에 사용할 수 있는 최적의 색상 팔레트를 생성할 수 있도록 색상 샘플링 유틸리티 세트도 추가되었다.
QuickDraw의 아키텍처는 항상 GrafPorts와 그와 연관된 BitMaps 또는 PixMaps "오프스크린"을 만들 수 있도록 허용했다. 여기서 그래픽은 화면에 바로 보이지 않고 메모리로 구성될 수 있다.픽셀은 QuickDraw 블리팅 함수 CopyBits를 사용하여 오프스크린 포트와 화면 사이에서 전송될 수 있다.이러한 오프스크린 컴포지팅은 게임과 그래픽을 많이 사용하는 어플리케이션의 핵심이다.그러나 32비트 QuickDraw가 등장하기 전까지 그러한 오프스크린 월드는 애플리케이션 내의 프로그래머들에 의해 손으로 만들어져야만 했다.이는 3개 이상의 분리되고 상당히 복잡한 데이터 구조(CGRAFPort, PixMap 및 GDevice, 인덱스 장치의 경우 색상 조회 표와 그 역)를 포함했기 때문에 오류가 발생할 수 있다.32비트 QuickDraw를 통해 이를 처리하기 위한 OS 지원이 추가되었으며, "Offscreen Graphics World" 또는 GWorld가 추가되었다.GW롤드의 비디오 버퍼(픽스맵)는 메인 메모리에 저장하거나, 메인 메모리 버스를 통해 대량의 픽셀 데이터를 전송하지 않아도 되므로 화면에 복사하는 것이 속도에 최적화될 수 있는 비디오 램의 미사용 부분에 저장될 수 있다.
QuickTime의 등장으로 QuickDraw는 JPEG와 같은 압축 래스터 데이터를 처리할 수 있는 능력을 얻었다.QuickTime Image Compression Manager는 QuickDraw와 긴밀하게 통합됨: 특히, 이미지 압축 해제 호출은 QuickDraw 그리기 호출로, 그림이 기록되고 있다면 압축된 데이터를 그림의 일부로 저장하여 나중에 그림을 그릴 때 표시되도록 했다.Image Compression Manager는 ColorSync 색상 일치와의 통합도 추가했다.
그 후, 새로운 프로세서 아키텍처(PowerPC)에 최적화하기 위한 백엔드 변경과는 별도로, QuickDraw는 고전적인 Mac OS의 나머지 기간 동안 대체로 변경되지 않았다.QuickDraw GX와 QuickDraw 3D는 QuickDraw 이름을 공유했으며 QuickDraw PixMap 및 그림 데이터 구조와 상호 운용할 수 있었지만, 그 외에는 완전히 기능이 분리되어 있었다.
Mac OS X와 함께 QuickDraw는 Carbon API의 일부가 되었다.2005년 맥 OS X 10.4의 출시와 함께 QuickDraw는 공식적으로 사용되지 않았다.
2010년 컴퓨터 히스토리 박물관을 통해 MacPaint 1.3의 소스 코드를 공개하면서, QuickDraw 소스코드의 과거 버전도 이용할 수 있게 되었다.[2][3]
참고 항목
참조
- ^ "Folklore: -2000 Lines of Code". folklore.org.
- ^ "MacPaint and QuickDraw Source Code". Computer History Museum. July 20, 2010.
- ^ Hesseldahl, Erik (2010-07-20). "Apple Donates MacPaint Source Code To Computer History Museum". businessweek.com. Archived from the original on 2012-02-09. Retrieved 2014-08-23.
외부 링크
- Apple Computer, Inc. Imaging With QuickDraw (PDF). Archived from the original (PDF) on 2013-05-17. Retrieved 2018-03-09. - developer.apple.com의 원본 QuickDraw 문서
- Apple Computer, Inc. QuickDraw Reference (Legacy) (PDF). Archived from the original (PDF) on 2014-04-18. Retrieved 2018-03-09. - developer.apple.com의 이후 QuickDraw 설명서
- QuickDraw - developer.apple.com의 QuickDraw 리소스 목록
- Folklore.org: 매킨토시 스토리: 라운드 직장은 어디에나 있다! 1981년 5월, QuickDraw를 만든 이야기
- MacPaint 및 QuickDraw 소스 코드, 컴퓨터 히스토리
- -2000 라인 코드