간단하게, 본 발명은 엘리먼트 오브젝트 모델, 및 프로그램 코드 개발자가 장면 그래프 데이터와 지속적으로 인터페이스하여 그래픽을 생성할 수 있도록 상기 엘리먼트 오브젝트 모델에 액세스하기 위한 벡터 그래픽 마크업 언어를 제공한다. 벡터 그래픽 마크업 언어는 엘리먼트 오브젝트 모델을 통해 벡터 그래픽을 표현하기 위한 교환 포맷을 포함한다. 해석시, 마크업은 장면 그래프 데이터 구조의 오브젝트로 번역되는 엘리먼트 트리 내의 엘리먼트를 포함하는 데이터로 구문 분석(parse)된다. 엘리먼트 트리 레벨에서, 전승 특성(inheritance characteristics) 및 이벤팅(eventing)을 포함한 풍부한 프로그램 가능성 특징을 제공하기 위해, 속성 시스템(property system) 및 프리젠터 시스템(presenter system)이 제공되어, 장면 설계자가 복잡한 장면을 간단히 설계할 수 있게 한다. 일반적으로, 벡터 그래픽 엘리먼트는, 형상 엘리먼트, 및 장면 그래프 오브젝트 모델의 장면 그래프 오브젝트와 상관되는 이미지 및 비디오 엘리먼트를 포함하는 다른 엘리먼트들에 대응한다. 또한, 벡터 그래픽 엘리먼트의 속성 및 다른 자원들은 장면 그래프 오브젝트 모델의 유사한 속성 및 자원과 상관된다.
따라서, 벡터 그래픽 시스템은 엘리먼트 레벨로 프로그램할 수 있고, 여기에서 각각의 드로잉 형상은 페이지/스크린 내의 나머지 프로그래밍 가능한 엘리먼트들과 동일한 레벨에서 엘리먼트로서 표현되어, 프리젠터 시스템, 이벤트 및 속성과의 상호 작용을 허용한다. 또한, 벡터 그래픽 시스템은 자원 레벨로의 프로그래밍하기 위한 메커니즘을 제공하며, 이에 의해 장면 설계자는 엘리먼트 트리 및 프리젠터 시스템을 본질적으로 쇼트컷고, 장면 그래프 데이터와 인터페이스하는 시각 API 계층으로 직접 프로그래밍할 수 있다. 이는 엘리먼트 레벨의 프로그래밍 가능성의 일부를 상실하게 하긴 하지만, 적합한 오브젝트를 출력하기 위한 보다 효율적이고 간단한 방법을 제공한다. 한 구현예에서, "비주얼 브러쉬(visual brush)" 타입의 채움(fill)이 프로그래밍되는 경우, 구문 분석자(parser)는 자원 레벨 데이터와 함께 API 계층을 직접적으로 호출하여, 대응하는 비주얼 페인트 오브젝트(엘리먼트 오브젝트 모델과 장면 그래프 오브젝트 모델 간의 상관 관계임)를 생성할 수 있다. 이러한 2 계층 시스템에서, 자원 레벨 벡터 그래픽은 효율적인 방식으로 구문 분석되고 직접 저장되는 데에 반해, 엘리먼트 레벨 벡터 그래픽은 생성된 엘리먼트로 구문 분석되며, 이는 나중에 오브젝트로 번역되어야 한다. 동시에, 자원 레벨 데이터 또는 그에 의해 생성된 오브젝트는 엘리먼트 및 엘리먼트 트리의 부분에 의해 참조될 수 있다. 결국, 비주얼 페인트 엘리먼트를 포함하는 엘리먼트가 명칭 부여(naming)될 수 있다. 따라서, 장면 설계자는 필요에 따라 프로그래밍 가능성과 효율의 균형을 조절할 수 있는 능력을 갖는다.
엘리먼트 클래스 계층 구조는, 형상 클래스, 이미지 클래스, 비디오 클래스 및 캔버스 클래스(canvas class)를 포함한다. 형상 클래스의 엘리먼트로는, 직사각형, 다중선(polyline), 다각형, 경로, 선 및 타원이 있다. 각각의 엘리먼트는 채움(속성) 데이터, 스트로크 데이터, 클립핑 데이터, 변환 데이터, 필터 효과 데이터 및 마스크 데이터를 포함하거나 그들에 연관될 수 있다. 형상은, 그것을 드로잉하는 데에 필요한 펜 및 브러쉬를 구성하기 위해 이용된 전승 및 캐스캐이드된 프리젠테이션 속성으로 드로잉된 (장면 그래프 오브젝트 모델의) 기하학에 대응한다. 이미지 클래스는 형상보다 특수하고, 더 많은 래스터 그래픽 데이터를 포함할 수 있는 한편, 비디오 클래스는 표시되는 엘리먼트 내에서 비디오(또는 유사한 멀티미디어)가 재생될 수 있게 한다. 캔버스 클래스는 형상을 위한 컨테이너의 역할을 하여, 형상을 경량으로 유지할 수 있다.
일 구현예에서, 마크업 코드는 구문 분석자/번역자에 의해 해석되며, 구문 분석자/번역자는 일반적으로 엘리먼트 트리/속성 시스템에 엘리먼트-레벨 엘리먼트를 더하고 이들 엘리먼트에 프리젠터를 부착한다. 그러면, 프리젠터 시스템은, 엘리먼트 트리를 부착된 프리젠터와 함께 취득하고, (빌더를 통해) 데이터를 오브젝트로 번역하고, 장면 그래프와 인터페이스하고 장면 그래프 오브젝트를 생성하는 비주얼 API 계층을 호출한다.
마크업 언어는, 간단한 스트링 포맷 또는 복잡한 오브젝트 표기법(복합 속성 신택스)을 포함하여, 엘리먼트를 기술하기 위한 독특한 방법을 제공한다. 단순한스트링 포맷에 대하여, 구문 분석자/번역자 및/또는 프리젠터 시스템은 스트링을 적절한 비주얼 API 오브젝트로 변환하는 타입 변환기를 이용한다. 채움 속성이 단일 스트링에 피팅될 수 없을 정도로 복잡한 경우에는, 마크업 내에서 인라인일 수 있는 복합 속성 신택스가 속성 세트를 기술하는 데에 이용된다. 엘리먼트 레벨과 API 레벨 간에 동일한 렌더링 모델이 공유되기 때문에, 다수의 오브젝트가 동일하고, 그 결과 구문 분석/번역이 매우 효율적으로 되며, 다른 이점들이 제공된다. 또한, 자원 인스턴스는 어디든지 (예를 들면, 마크업 또는 파일 내) 위치될 수 있으며, 명칭에 의해 참조될 수 있다. 이러한 방식으로, 장면 설계자는 복합 속성 신택스에 의해 기술된 엘리먼트를 포함하여, 장면 전체를 통해 엘리먼트 트리 내의 엘리먼트를 재사용할 수 있다.
다른 이점 및 특성들은 이하의 상세한 설명 및 첨부된 도면으로부터 명백해질 것이다.
예시적인 운영 환경
도 1은 본 발명이 구현될 수 있는 적합한 컴퓨팅 시스템 환경(100)의 일례를 도시하고 있다. 컴퓨팅 시스템 환경(100)은 적합한 컴퓨팅 환경의 일례일 뿐이며, 본 발명의 이용 및 기능성의 범위에 대한 한계를 제시하기 위한 것은 아니다. 또한, 컴퓨팅 환경(100)은, 예시적인 운영 환경(100) 내에 도시되어 있는 컴포넌트 중 하나 또는 그 조합에 관련된 의존성 또는 요구 사항을 갖고 있는 것으로 해석되어서는 안 된다.
본 발명은 다른 수많은 범용 또는 전용 컴퓨팅 시스템 환경 또는 구성에서 동작할 수 있다. 본 발명에 이용되기에 적합할 수 있는 공지된 컴퓨팅 시스템, 환경 및/또는 구성의 예로는, 개인용 컴퓨터, 서버 컴퓨터, 휴대형 또는 랩탑 디바이스, 타블렛 디바이스, 멀티프로세서 시스템, 마이크로프로세서 기반 시스템, 셋톱 박스, 프로그래밍 가능한 가전 기기, 네트워크 PC, 미니 컴퓨터, 메인프레임 컴퓨터, 및 상기의 시스템 또는 디바이스 중 일부를 포함하는 분산된 컴퓨팅 환경 등을 들 수 있지만, 이들로 제한되는 것은 아니다.
본 발명은, 컴퓨터에 의해 실행되는 프로그램 모듈과 같이, 컴퓨터 실행 가능 명령의 일반적인 컨텍스트로 기술될 수 있다. 일반적으로, 프로그램 모듈은 특정 태스크를 수행하거나 특정 추상 데이터 타입을 구현하는 루틴, 프로그램, 오브젝트, 컴포넌트, 데이터 구조 등을 포함한다. 본 발명은 통신 네트워크를 통해 링크된 원격 처리 디바이스들에 의해 태스크가 수행되는 분산된 컴퓨팅 환경에서도 실현될 수 있다. 분산된 컴퓨팅 환경에서, 프로그램 모듈은 메모리 저장 디바이스를 포함하는 로컬 및 원격 컴퓨터 저장 매체 내에 위치될 수 있다.
도 1을 참조하면, 본 발명을 구현하기 위한 예시적인 시스템은 컴퓨터(110) 형태의 범용 컴퓨팅 디바이스를 포함한다. 컴퓨터(110)의 컴포넌트는 처리 유닛(120), 시스템 메모리(130), 및 시스템 메모리를 포함한 다양한 시스템 컴포넌트들을 처리 유닛(120)에 결합시키는 시스템 버스(121)를 포함할 수 있지만, 이들로 제한되는 것은 아니다. 시스템 버스(121)는 메모리 버스 또는 메모리 제어기, 주변 버스, 및 다양한 버스 아키텍쳐 중 어느 하나를 이용하는 로컬 버스를 포함하는 몇몇 타입의 버스 구조 중 어느 하나일 수 있다. 예를 들어, 이러한 아키텍쳐는 ISA(Industry Standard Architecture) 버스, MCA(Micro Channel Architecture) 버스, EISA(Enhanced ISA) 버스, VESA(Video Electronics Standards Association) 로컬 버스, AGP(Accelerated Graphics Port) 버스, 및 메자닌 버스(Mezzanine bus)로도 공지되어 있는 PCI(Peripheral Component Interconnect) 버스를 포함하지만, 이들로 제한되는 것은 아니다.
컴퓨터(110)는 전형적으로 다양한 컴퓨터 판독 가능 매체를 포함한다. 컴퓨터 판독 가능 매체는 컴퓨터(110)에 의해 액세스될 수 있는 어떠한 매체라도 가능하며, 휘발성 및 비휘발성 매체, 착탈 가능 및 착탈 불가능 매체를 모두 포함한다. 예를 들어, 컴퓨터 판독 가능 매체는 컴퓨터 저장 매체 및 통신 매체를 포함할 수 있지만, 이들로 제한되는 것을 아니다. 컴퓨터 저장 매체는 컴퓨터 판독 가능 명령, 데이터 구조, 프로그램 모듈 또는 다른 데이터과 같은 정보의 저장을 위한 임의의 방법 또는 기술로 구현된 휘발성 및 비휘발성, 착탈 가능 및 착탈 불가능 매체를 모두 포함한다. 컴퓨터 저장 매체는 RAM, ROM, EEPROM, 플래시 메모리 또는 다른 메모리 기술, CD-ROM, DVD 또는 다른 광디스크 저장 장치, 자기 카세트, 자기 테입, 자기 디스크 저장 장치 또는 다른 자기 저장 장치, 또는 원하는 정보를 저장하는 데에 이용될 수 있고 컴퓨터(110)에 의해 액세스될 수 있는 임의의 다른 매체를 포함하지만, 이들로 제한되는 것은 아니다. 전형적으로, 통신 매체는 반송파 또는 다른 전송 매커니즘 등의 변조된 데이터 신호 내의 컴퓨터 판독 가능 명령, 데이터 구조, 프로그램 모듈, 또는 다른 데이터를 구체화하며, 임의의 정보 배달매체를 포함한다. "변조된 데이터 신호"라는 용어는 신호 내의 정보를 인코딩하는 것과 같은 방식으로 설정 또는 변경된 하나 이상의 특성을 갖는 신호를 의미한다. 예를 들어, 통신 매체는 유선 네트워크 또는 직접 유선 접속 등과 같은 유선 매체, 및 음향, RF, 적외선 및 다른 무선 매체 등과 같은 무선 매체를 포함하지만, 이들로 제한되는 것은 아니다. 상술한 것들 중 일부의 조합은 컴퓨터 판독 가능 매체의 범위 내에 포함될 수 있다.
시스템 메모리(130)는 리드 온리 메모리(ROM, 131) 및 랜덤 액세스 메모리(RAM, 132)와 같은 휘발성 및/또는 비휘발성 메모리 형태의 컴퓨터 저장 매체를 포함한다. 스타트업동안 등에서 컴퓨터(110) 내의 엘리먼트들 간의 정보 전송을 돕는 기본 루틴을 포함하는 기본 입출력 시스템(133, BIOS)은, 전형적으로 ROM(131) 내에 저장된다. 전형적으로, RAM(132)은 즉각적으로 액세스될 수 있고/있거나 처리 유닛(120)에 의해 현재 동작중인 데이터 및/또는 프로그램 모듈을 포함한다. 예를 들어, 도 1은 운영 시스템(134), 응용 프로그램(135), 다른 프로그램 모듈(136) 및 프로그램 데이터(137)를 도시하고 있지만, 이들로 제한되는 것은 아니다.
또한, 컴퓨터(110)는 다른 착탈 가능/착탈 불가능, 휘발성/비휘발성 컴퓨터 저장 매체를 포함할 수 있다. 예를 들어, 도 1은 비착탈식 비휘발성 자기 매체의 판독 및 기입을 행하는 하드디스크 드라이브(141), 착탈식 비휘발성 자기 디스크(152)의 판독 및 기입을 행하는 자기 디스크 드라이브(151), 및 CD-ROM 또는 다른 광매체와 같은 착탈식 비휘발성 광디스크(156)의 판독 및 기입을 행하는 광디스크드라이브(155)를 도시하고 있지만, 이에 제한되는 것은 아니다. 예시적인 운영 환경에서 이용될 수 있는 다른 착탈식/비착탈식 휘발성/비휘발성 컴퓨터 저장 매체는, 자기 테이프 카세트, 플래시 메모리 카드, DVD, 디지탈 비디오 테입, 고체 상태 RAM, 고체 상태 ROM 등을 포함하며, 이들로 제한되는 것은 아니다. 하드 디스크 드라이브(141)는 통상적으로 인터페이스(140) 등의 착탈 불가능 메모리 인터페이스를 통해 시스템 버스(121)에 접속되며, 자기 디스크 드라이브(151) 및 광학 디스크 드라이브(155)는 통상적으로 인터페이스(150) 등의 착탈 가능 메모리 인터페이스를 통해 시스템 버스(121)에 접속된다.
도 1에서 전술되고 예시된, 상기 드라이브 및 이 드라이브와 관련된 컴퓨터 기억 매체는 컴퓨터(110)에 대한 컴퓨터 판독 가능 명령, 데이터 구조, 프로그램 모듈 및 다른 데이터의 저장을 제공한다. 도 1에서, 예를 들어, 하드 디스크 드라이브(141)는 운영 시스템(144), 응용 프로그램(145), 다른 프로그램 모듈(146) 및 프로그램 데이터(147)를 기억시키는 것으로 예시된다. 이러한 컴포넌트는 운영 시스템(134), 응용 프로그램(136), 다른 프로그램 모듈(137) 및 프로그램 데이터(138)와 동일하거나 이것들과는 상이할 수 있다는 것이 인식되어야 한다. 운영 시스템(144), 응용 프로그램(145), 다른 프로그램 모듈(146) 및 프로그램 데이터(147)는, 이들이 최소한 상이한 카피라는 것을 나타내기 위하여 여기에서는 각각 다른 번호가 부여된다. 사용자는 타블렛(전자 디지타이저)(164), 마이크(163), 키보드(162) 및 일반적으로 마우스, 트랙볼 또는 터치 패드로 칭해지는 포인팅 디바이스(161) 등의 입력 디바이스를 통해 커맨드 및 정보를 컴퓨터(110)에 입력할수 있다. 다른 입력 디바이스(도시하지 않음)는 조이스틱, 게임 패드, 위성 안테나, 스캐너 등을 포함할 수 있다. 이러한 입력 디바이스 및 다른 입력 디바이스는 종종 시스템 버스에 결합된 사용자 입력 인터페이스(160)를 통해 처리 유닛(120)에 접속되지만, 병렬 포트, 게임 포트 또는 범용 직렬 버스(USB) 등의 다른 인터페이스 및 버스 구조를 통해 접속될 수 있다. 또한, 모니터(191) 또는 다른 형태의 표시 디바이스는 비디오 인터페이스(190) 등의 인터페이스를 통해 시스템 버스(121)에 접속된다. 또한, 모니터(191)에는 터치-스크린 인터페이스(192) 등의 인터페이스를 통해 핸드라이팅 등의 디지탈 입력을 컴퓨터 시스템(110)에 입력할 수 있는 터치-스크린 패널(193) 등이 통합될 수 있다. 컴퓨팅 디바이스(110)가 통합되는 타블렛형 퍼스널 컴퓨터 등의 하우징에 모니터 및/또는 터치 스크린 패널이 물리적으로 결합될 수 있으며, 터치 스크린 패널(193)이 본질적으로 타블렛(164)으로서 기능한다는 것이 인식되어야 한다. 아울러, 컴퓨팅 디바이스(110) 등의 컴퓨터는 또한 출력 주변 인터페이스(194) 등을 통해 접속될 수 있는 스피커(195) 및 프린터(196) 등의 다른 주변 출력 디바이스를 포함할 수 있다.
컴퓨터(110)는 원격 컴퓨터(180) 등의 하나 이상의 원격 컴퓨터들에 대한 논리 접속부를 이용한 네트워크 환경에서 운용될 수 있다. 도 1에는 메모리 기억 디바이스(181)만이 도시되어 있지만, 원격 컴퓨터(180)는 퍼스널 컴퓨터, 서버, 라우터, 네트워크 PC, 피어 디바이스 또는 다른 공통 네트워크 노드일 수 있으며, 통상적으로 컴퓨터(110)에 대하여 전술된 다수 또는 모든 엘리먼트를 포함한다. 도 1에 도시된 논리 접속부는 근거리 통신망(LAN)(171) 및 광역 통신망(WAN)(173)을 포함하지만, 다른 네트워크를 포함할 수도 있다. 이러한 네트워크 환경은 사무실, 종합(Enterprise-wide) 컴퓨터 네트워크, 인트라넷 및 인터넷에서 일반적이다.
LAN 네트워크 환경에서 사용되는 경우, 컴퓨터(110)는 네트워크 인터페이스 또는 어댑터(170)를 통해 LAN(171)에 접속된다. WAN 네트워크 환경에서 사용되는 경우, 컴퓨터(110)는 통상적으로 모뎀(172) 또는 인터넷 등의 WAN(173) 상에서 통신을 구현하기 위한 다른 수단을 포함한다. 모뎀(172)은 내장형 또는 외장형일 수 있으며, 사용자 입력 인터페이스(160) 또는 다른 적절한 메카니즘을 통해 시스템 버스(121)에 접속될 수 있다. 네트워크 환경에서, 컴퓨터(110) 또는 그 일부에 대하여 기술된 프로그램 모듈은 원격 메모리 기억 디바이스에 저장될 수 있다. 예를 들어, 도 1은 메모리 디바이스(181) 상에 상주하는 원격 응용 프로그램(185)을 도시하지만, 이에 제한되지 않는다. 도시된 네트워크 접속부는 예시적이며 컴퓨터들 사이에서 통신 링크를 구현하는 다른 수단이 사용될 수 있다는 것이 이해될 것이다.
그래픽 아키텍처
본 발명의 한 양태는 개괄적으로는 시스템 표시 장치 상에 그래픽을 출력하기 위하여 애플리케이션 또는 운영 시스템 컴포넌트 등의 프로그램 코드를 통해 드로잉 명령 및 다른 정보(예를 들어, 이미지 비트맵)를 그래픽 컴포넌트로 통신하는 것을 가능하게 하는 것이다. 따라서, 본 발명은 형상 엘리먼트 세트 및 다른 엘리먼트들, 그룹화 및 합성 시스템과 함께, 그리고 프로그램을 통해 데이터 구조, 드로잉 프리미티브(커맨드) 및 다른 그래픽 관련 데이터로 장면 그래프를 파퓰레이트가능한 오브젝트 모델에서의 일반적인 속성 시스템에 통합되는 마크업 언어를 제공한다. 처리되는 경우, 장면 그래프는 스크린 상에 표시되는 그래픽으로 된다.
도 2는 본 발명이 수행될 수 있는 일반적인 적층 아키텍처(200)를 도시한다. 도 2에서 도시된 바와 같이, 프로그램 코드(202)(예를 들어, 응용 프로그램 또는 운영 시스템 컴포넌트 등)는 이미징(204), 벡터 그래픽 엘리먼트(206), 및/또는 비주얼 응용 프로그래밍 인터페이스(API) 계층(212)에 직접 제공되는 기능/방법 호출(call)을 포함하는 하나 이상의 다양한 방법을 통해 출력 그래픽 데이터로 개발될 수 있다. API 계층와의 직접적인 상호 작용은 "비주얼 및 장면 그래프 인터페이스"라는 제목으로 공동 계류중인 전술한 특허 출원에서도 기술되어 있다.
일반적으로, 이미징(204)은 이미지, 예를 들어, 비트맵을 로딩, 편집 및 저장하기 위한 메카니즘에 프로그램(202)을 제공한다. 이러한 이미지들은 시스템의 다른 부분에 의해 사용될 수 있으며, 이미지에 직접적으로 드로잉을 하기 위해 프리미티브 드로잉 코드를 사용하는 방법도 있다.
본 발명의 일 양태에 따르면, 벡터 그래픽 엘리먼트(206)는 (이하에서 기술되는 바와 같이) 나머지 오브젝트 모델과 일치하는, 그래픽을 드로잉하는 다른 방법을 제공한다. 벡터 그래픽 엘리먼트(206)는 마크업 언어를 통해 생성될 수 있으며, 엘리먼트/속성 시스템(208) 및 프리젠터 시스템(210)은 비주얼 API 계층(212)에 대한 적절한 호출을 형성하도록 처리된다. 도 26을 참조로 이하에서 기술되는 바와 같이, 일반적으로 벡터 그래픽 엘리먼트(206)는 장면 그래프가 드로잉되는 오브젝트 모델의 오브젝트로 분석되며, 엘리먼트/속성 시스템(208) 및 프리젠터 시스템(210)을 개재하여 엘리먼트 레벨을 매개로 장면 그래프에 제공되거나, 또는 이하에서 기술되는 바와 같이, 자원 레벨에서 보다 효율적인 방식으로 제공될 수 있다.
일 실시예에서, 그래픽 계층 아키텍처(200)는 상위 레벨의 합성 및 애니메이션 엔진(214)를 포함하며, 캐싱 데이터 구조(216)를 포함하거나 그렇지 않으면 상기 구조(216)와 관련이 있다. 캐싱 데이터 구조(216)는 이하 기술되는 바와 같이, 정의된 오브젝트 모델에 따라 관리되는 계층적으로 배열된 오브젝트를 포함하는 장면 그래프로 이루어진다. 일반적으로, 비주얼 API 계층(212)는 오브젝트를 생성하며, 상기 오브젝트에 데이터를 제공하기 위해 오브젝트를 개방 및 폐쇄하는 등의 능력을 구비한, 캐싱 데이터 구조(216)에 대한 인터페이스에 프로그램 코드(202)(및 프리젠터 시스템(210))를 제공한다. 즉, 상위 레벨의 합성 및 애니메이션 엔진(214)은 개발자가 그래픽 및 매체에 관한 의도를 표현하여 그래픽 정보를 디스플레이하고, 플렛폼이 프로그램 코드를 위한 하드웨어의 사용을 최적화할 수 있도록 충분한 정보를 가진 기반 플렛폼을 제공할 수 있게 되어 통합된 매체의 API 계층(212)를 노출시킨다. 예를 들어, 기반 플렛폼은 캐싱, 자원 니고시에이션(negotiation) 및 매체 통합의 기능을 한다.
일 실시예에서, 상위 레벨의 합성 및 애니메이션 엔진(214)은 명령 스트림 및 가능하다면 다른 데이터(예를 들어, 비트맵에 대한 포인터)를 고속의 하위 레벨의 합성 및 애니메이션 엔진(218)으로 보낸다. 본 발명에서 사용되는 바와 같이, "상위 레벨" 및 "하위 레벨"이라는 용어는 다른 컴퓨팅 시나리오에서 사용되는 용어와 유사하며, 여기에서는 일반적으로, 소프트웨어 컴포넌트가 상위 레벨의 컴포넌트와 관련이 낮으면 낮을수록, 이 컴포넌트는 하드웨어에 보다 밀접하다. 따라서, 예를 들어, 상위 레벨의 합성 및 애니메이션 엔진(214)으로부터 전송된 그래픽 정보는 하위 레벨의 합성 및 애니메이션 엔진(218)에서 수신될 수 있으며, 상기 그래픽 정보는 하드웨어(222)를 포함하는 그래픽 서브시스템에 그래픽 데이터를 전송하기 위해 사용된다.
프로그램 코드(202)와 함께 상위 레벨의 합성 및 애니메이션 엔진(214)은 프로그램 코드(202)에 의해 제공된 그래픽 장면을 나타내는 장면 그래프를 구축한다. 예를 들어, 드로잉될 각각의 아이템은 드로잉 명령으로 로딩될 수 있으며, 시스템은 장면 그래프 데이터 구조(216)에서 캐싱될 수 있다. 이하에서 기술되는 바와 같이, 이러한 데이터 구조(216) 및 드로잉되는 것을 열거하기 위한 여러 가지 방법이 있다. 아울러, 상위 레벨의 합성 및 애니메이션 엔진(214)은 선언적인 (또는 다른) 애니메이션 제어(예를 들어, 애니메이션 간격) 및 타이밍 제어를 제공하기 위해 타이밍 및 애니메이션 시스템(220)과 통합된다. 애니메이션 시스템은 예를 들어, 엘리먼트 속성 레벨(208)에서, 비주얼 API 계층(212) 내부에서, 그리고 다른 모든 자원에서 등, 어느 시스템에서나 본질적으로 애니메이트 값이 통과되는 것이 허용된다는 것이 인식되어야 한다. 타이밍 시스템은 엘리먼트 및 비주얼 레벨에서 노출된다.
하위 레벨 합성 애니메이션 엔진(218)은 장면의 합성, 애니메이팅 및 렌더링을 관리하며, 이 장면은 그 후에 그래픽 서브시스템(222)에 제공된다. 상기 하위 레벨의 엔진(218)은 다수의 애플리케이션의 장면에 대한 렌더링을 합성하고, 컴포넌트를 렌더링함으로써, 그래픽의 실질적 렌더링을 스크린에 대해 수행한다. 그러나, 때때로 일부 렌더링이 상위 레벨에서 발생하는 것이 필요하고 및/또는 바람직할 수도 있다는 것이 인식되어야 한다. 예를 들어, 하위 계층이 다수의 애플리케이션으로부터의 요청을 처리하는 동안, 상위 계층은 하나의 애플리케이션을 기초로 실증(instantiate)되고, 이에 의해 상위 레벨에서 시간-소비 또는 애플리케이션-특정한 렌더링을 이미징 메카니즘(204)을 통해서 수행하고, 비트맵에 대한 기준을 하위 레벨로 보내는 것이 가능하다.
장면 그래프 오브젝트 모델
이하 기술되는 바와 같이, 렌더링 모델은 상위 레벨의, 제어-기반 벡터 그래픽 엘리먼트(206)에 의해 공유되며, 하위 레벨의 오브젝트는 장면 그래프 데이터 구조(216)에서 사용된 비주얼 API 계층(212)에 의해 생성된다. 이것은 본 발명의 상위 레벨의 엘리먼트 및 하위 레벨의 오브젝트 사이에서 높은 상관 관계를 제공한다. 이하에서는 장면 그래프 오브젝트 모델의 일 실시예에 대해서 기술한다.
도 3 및 4는 비주얼로 칭해지는 베이스 오브젝트를 포함하는 예시적인 장면 그래프(300, 400)를 각각 도시한다. 일반적으로, 비주얼은 사용자에게 가상의 표면을 나타내고 표시 장치 상에 시각적으로 나타나는 오브젝트를 포함한다. 도 5에 도시된 바와 같이, 기본 클래스 비주얼은 다른 비주얼 타입에 대해 기본적인 기능을 제공한다. 즉, 비주얼 클래스(500)는 비주얼 타입(예를 들어, 501-506)으로부터 도출된는 추상(abstract) 기본 클래스가다.
도 3에서 도시된 바와 같이, 최상위 레벨(또는 루트)의 비주얼(302)은 비주얼관리 오브젝트(304)에 접속되며, 또한 그래픽 데이터가 프로그램 코드를 위해 출력되는 윈도우(HWnd)(306) 또는 유사한 유닛과 관련성이 있다. 비주얼 관리자(304)는 이러한 윈도우(306)에 대한 최상위 레벨의 비주얼(및 이러한 비주얼의 임의의 차일드의 드로잉을 관리한다. 도 6은 본 발명에서 기술되는 그래픽 시스템의 오브젝트 모델에서의 일련의 다른 오브젝트(620)들 중 하나로서 비주얼 관리자를 나타낸다.
드로잉을 위하여, 비주얼 관리자(304)는 디스패쳐(308)에 의해 예정된 바와 같이 장면 그래프를 처리(예를 들어, 횡단(traverse) 또는 전송)하고, 미국 특허 출원 No. 10/184,795, 10/184,796 및 10/185,775에서 개괄적으로 개시된 바와 같이, 그 대응 윈도우(306)에 대한 하위 레벨의 컴포넌트(218)(도 2)에 그래픽 명령 및 다른 데이터를 제공한다. 장면 그래프 처리는 통상적으로 하위 레벨의 컴포넌트(218) 및/또는 그래픽 서브시스템(222)의 리프레쉬 속도보다 상대적으로 느린 속도로 디스패처(308)에 의해 스케쥴될 것이다. 도 3은 계층적으로 최상위 레벨(루트)의 비주얼(302) 밑에 계층적으로 배열되며, 그 중 일부는 드로잉 컨텍스트(316, 317)(그 일시적 특성을 나타내기 위해 점선 박스로 도시됨)를 통해, 예를 들어 드로잉 프리미티브 및 다른 비주얼을 포함하는 해당 명령 리스트(318, 319) 각각으로 파퓰레이트되는 것으로 나타난다. 비주얼은 또한 다음의 예시적 비주얼 클래스에서 도시되는 바와 같이, 다른 속성 정보를 포함할 수 있다:
Transform 속성에 의해 설정된 변환은 비주얼의 서브-그래프를 위한 좌표 시스템을 정의한다. 변환 이전의 좌표 시스템은 전-변환(Pre-Transformation) 좌표 시스템이라 하며, 변환 이후의 좌표 시스템은 후-변환(post-Transformation) 좌표 시스템이라 한다. 즉, 변형된 비주얼은 페어런트로서 변형 노드를 갖는 비주얼과 동일하다. 도 7은 일반적으로 비주얼과 관련된 전-변환 좌표 시스템 및 후-변환 좌표 시스템을 나타내는 변형예를 제공한다. 비주얼의 변환을 얻거나 설정하기 위하여, Transform 속성이 사용될 수 있다.
좌표 변환은 마치 비트맵에서 존재하는 것처럼, 모든 것에 대해 동일한 방법으로 적용될 수 있다는 것에 유의해야 한다. 이것은 비트맵에 변형이 항상 적용되는 것이 아니라, 렌더링되는 것이 변형에 의해 동일하게 영향을 받는다는 것을 의미한다는 것에 유의해야 한다. 예를 들어, 사용자가 1인치 폭의 라운드 펜으로 원을 드로잉한 후에 이 원에 대해 2의 X 방향 스케일을 적용하면, 그 펜은 좌우로 2인치 폭 및 상하로 단지 1인치 폭이 될 것이다. 이것은 때때로 합성 또는 비트맵 변형(윤곽 또는 기하학에만 영향을 주는 기하학적 스케일에 대항함)이라고 한다. 도 8a는 스케일링 변환을 나타내는 도면으로, 좌측에 비변환 이미지(800)를 나타내고, 우측에 비균일 스케일을 갖는 변환된 이미지(802)를 나타내고 있다. 도 8b는 스케일링 변환을 나타내는 도면으로, 좌측에 비변환 이미지(800)를 나타내고, 우측에 기하학적 스케일링을 나타내는 변환된 이미지(804)를 나타내고 있다.
비주얼의 좌표 변환에 대하여, TransformToDescendant는 포인트를 참조 비주얼로부터 후손 비주얼(descendant visual)로 변환한다. 이 포인트는 참조 비주얼의 후-변환 좌표 공간으로부터 후손 비주얼의 후-변환 좌표 공간으로 변환된다. TransformFromDescendant는 포인트를 페어런트 체인 위의 후손 비주얼로부터 참조 비주얼로 변환한다. 이 포인트는 후손 비주얼의 후-변환 좌표 공간으로부터 참조 비주얼의 후-변환 좌표 공간으로 변형된다. CalculateBounds 방법은 후-변환 좌표 공간에서 비주얼 콘텐츠의 바운딩 박스를 리턴한다. 좌표 변환 동안 비주얼에 대한 변환이 해석되는 방법에 관하여 다수의 특정 규격이 허용되는 API의 대안적 버전이 존재할 수도 있다는 것이 인식되어야 한다. 예를 들어, 참조 및 후손 비주얼에 대한 변형은 고려될 수도 있고 또는 그렇지 않을 수도 있다. 따라서, 이러한 대안에서는 4개의 옵션이 존재한다. 예를 들어, 전-변환으로부터 전-변환 공간으로의 변형, 전-변환으로부터 후-변환 공간으로의 변형, 후-변환으로부터 전-변환 공간으로의 변형 및 후-변환으로부터 후-변환 공간으로의 변형이 좌표에서 존재할수 있다. 히트(hit)-테스트에 동일한 개념이 적용되는데, 예를 들어, 히트-테스트는 전-변환 또는 후-변환의 변형 좌표 공간에서 시작될 수 있으며, 히트-테스트의 결과는 전-변환 또는 후-변환 좌표 공간에서 존재할 수 있다.
Clip 속성은 비주얼의 클립핑 영역을 획득 및 설정한다. 임의의 기하학(기하학적 클래스는 이하에서 도 12를 참조로 기술됨)은 클립핑 영역으로서 사용될 수 있으며, 클립핑 영역은 후-변환 좌표 공간에서 적용된다. 일 실시예에서, 클립핑 영역을 위해 설정되는 디폴트는 널(null), 즉, (-∞, -∞)으로부터 (+∞, +∞)으로의 무한대의 대형 클립핑 직사각형으로 인식될 수 있는 클립핑은 없다.
Opacity 속성은 비주얼의 불투명값을 획득/설정하며, 그 결과 비주얼의 콘텐츠는 불투명값 및 선택된 혼합(blending) 모드에 기초한 드로잉 표면상에서 혼합된다. 혼합 모드(BlendMode) 속성은 사용된 혼합 모드를 설정(또는 획득)하기 위해 사용될 수 있다. 예를 들어, 상기 모드로서 선형 알파가 혼합 설정되어, 불투명(알파) 값은 0.0 내지 1.0 사이에서 설정될 수 있다(예를 들어, 컬러 = 알파 * 전경 컬러 + (1.0 - 알파) * 배경 컬러). 특수 효과 속성 등의 다른 서비스는 비주얼, 예를 들어, 블러(blur), 단색 등에 포함될 수 있다.
다양한 서비스(변환, 불투명 및 클립을 포함)는 드로잉 컨텍스트상에서 푸시(push) 및 팝(pop)될 수 있으며, 푸시/팝 동작은 팝 호출이 푸시 호출과 매칭되는 한, 네스트(nest)될 수 있다. 예를 들어, PushTransform(...); PushOpacity(...); PopTransform(...)은 규격에 맞지 않는데, 이는 PopTransform 호출 이전에 PopOpacity가 호출될 필요가 있기 때문이다.
PushTransform 방법은 변환을 푸시한다. 후속하는 드로잉 동작은 푸시된 변형에 대하여 수행된다. PopTransform은 매칭 PushTransform 호출에 의해 푸시된 변형을 팝한다:
void PushTransform(Transform transform);
void PushTransform(Matrix matrix);
void PopTransform( );.
유사하게, PushOpacity 방법은 불투명값을 푸시한다. 후속하는 드로잉 동작은 특정 불투명값을 갖는 임시 표면상에서 수행된 후에 장면 내부에서 합성된다. PopOpacity는 매칭 PushOpacity 호출에 의해 푸시된 불투명값을 팝한다:
void PushOpacity(float opacity);
void PushOpacity(NumberAnimationBase opacity);
void PopOpacity( );.
PushClip 방법은 클립핑 기하학을 푸시한다. 후속하는 드로잉 동작은 기하학에 대해 클립핑된다. 클립핑은 후-변환 공간에 적용된다. PopClip은 매칭 PushClip 호출에 의해 푸시된 클립핑 영역을 팝한다:
void PushClip(Geometry clip);
void PopClip( );.
팝 동작이 푸시 및 매칭되는 한, 푸시 동작은 임의로 네스팅될 수 있다. 예를 들어, 다음은 유효하다.
히트-테스트는 후-변환 좌표 공간에서 수행되어, 예를 들어, 펜 또는 마우스 클릭이 검출되는 경우, 히트된 각각의 히트-테스트 가능한 비주얼의 아이덴티티를 리턴한다. 인터페이스의 대안적 버전은 히트-테스트가 시작되는 비주얼에 관련된 전-변환 좌표 공간에서 히트-테스트가 시작되는 것을 가능하게 할 수 있다. 히트되는 비주얼은 우측-좌측 깊이 우선 순서(right-to-left, depth-first)로 리턴된다. 히트-테스트는 비주얼이 히트-테스트 가능한지(디폴트는 참)를 결정하는 HitTestable 및 비주얼이 히트되는 경우에 히트-테스트가 정지하는지, 즉, 비주얼이 히트되고 비주얼의 HitTestFinal 속성이 참이면 히트-테스트가 중지되어 이 포인트까지 수집된 결과를 리턴하는지(디폴트는 거짓)를 결정하는 HitTestFinal을 포함하는 다양한 플래그로 제어될 수 있다. 다른 플래그는 히트-테스트가 비주얼상에서 수행되는 경우에 (디폴트는 거짓) 비주얼의 차일드가 고려되어야 하는지를 결정하는 HitTestIgnoreChildren이다.
ProxyVisual은 장면 그래프에 한 번 이상 부가될 수 있는 비주얼이다. ProxyVisual에 의해 참조되는 임의의 비주얼이 루트로부터 다수의 경로에 의해 도달될 수 있기 때문에, 판독 서비스(TransformToDescendant, TransformFromDescendant 및 HitTest)는 ProxyVisual을 통해 수행되지 않는다. 필수적으로, 임의의 비주얼로부터 비주얼 트리의 루트까지 하나의 기준(canonical) 경로가 존재하고 그 경로는 임의의 ProxyVisual을 포함하지 않는다.
도 5에 도시된 바와 같이, 다양한 타입의 비주얼은 ContainVisual(501), DrawingVisual(502), ValidationVisual(503), SurfaceVisual(504) 및 HwndVisual(505)를 포함하는 오브젝트 모델로 정의된다. 이하의 표는 DrawingVisual의 예시적 방법을 설명한다.
DrawingVisual은 그래픽 콘텐츠(예를 들어, 라인, 텍스트, 이미지 등)을 위한 컨테이너가다. DrawingVisual에 비주얼을 부가하는 것이 가능하지만, 일부 실시예에서는 이것이 허용되지 않음을 알아야 한다. DrawingVisual(502)은 이하 기술되는 바와 같이, DrawingVisual이 예를 들어, 다른 비주얼 및 드로잉 프리미티브로 파퓰레이트하는 데 사용될 수 있는 IDrawingContext를 리턴하는 Open 방법을 포함한다. 일 실시예에서, 마찬가지로 이하 기술되는 여러 가지 이유로, DrawingVisual은 그 드로잉 컨텍스트를 파퓰레이트 하기 위해 단지 한 번만 개방될 수 있다. 즉, 이러한 DrawingVisual은 변경되지 않는다. DrawingVisual이 파퓰레이트된 후에, DrawingVisual은 Close 방법을 사용하여 예를 들어, 드로잉 컨텍스트상에서 폐쇄된다. Open 호출이 비주얼의 임의의 콘텐츠(차일드)를 제거(clear)할 수 있지만, 하나의 대안적 실시예에서, 이러한 비주얼에 부가되는 방식으로 현재의비주얼을 개방하는, Append 방법이 제공된다는 것이 인식되어야 한다. 즉, OpenForAppend 호출은 DrawingVisual의 현재의 콘텐츠가 개방시에 제거되지 않는다는 것을 제외하고는 Open과 동일하게 동작한다.
다음은 드로잉 컨텍스트가 비주얼을 파퓰레이트하는데 사용되는 방법의 예이다.
일반적으로, ValidationVisual(503)은, 프로그램 코드가 그것을 파퓰레이트하기를 원할 때가 아니라 시스템이 채워질 것을 요구하는 경우에 ValidationVisual이 파퓰레이트되는 것을 제외하고는, 개념적으로 DrawingVisual과 유사하다. 예를들어, 미국 특허 출원 No. 10/185,775에서 개시된 바와 같이, 상위 레벨의 합성 및 애니메이션 엔진(214)(도 2)은, 장면 그래프의 일부가 눈에 보이지 않을 때와 같이, 자원이 요구되는 경우에, 장면 그래프 데이터를 무효화할 수 있다. 예를 들어, 일부분이 디스플레이 스크롤 오프되는 경우, 클립핑 등이 된다. 무효화된 장면 그래프 데이터가 추후에 요구되는 경우, 호출된 프로그램 코드(202)는 장면 그래프의 무효화 부분을 리드로잉(유효화)하도록 회수될 것이다. 따라서, 통상적인 하나의 사용 시나리오는 프로그램 코드가 ValidationVisual을 서브클래스하고 OnValidate 방법을 무효로 하는(override) 것이다. 시스템이 OnValidate 방법을 호출하는 경우, 드로잉 컨텍스트는 통과되고, 드로잉 컨텍스트를 사용하는 프로그램은 ValidationVisual을 리파퓰레이트(repopulate)한다.
이하의 예는 단순한 ValidationVisual을 수행하는 하나의 방법, 예를 들어, 특정 컬러로 라인을 드로잉하는 방법을 나타낸다. 라인 컬러는 SetColor를 호출함으로써 변경될 수 있다. ValidationVisual를 갱신하기 위하여, SetColor 호출은 그래픽 서브-시스템이 ValidationVisual을 다시 유효화하도록 무효화된다:
이 예는 ValidationVisual의 사용법을 나타낸다:
도 4는 ContainerVisual 및 DrawingVisual이 장면 그래프에 관련되고 드로잉 프리미티브의 형태로(예를 들어, 대응 드로잉 컨텍스트에서) 해당 데이터를 포함하는 예시적 장면 그래프(400)를 나타낸다. ContainerVisual은 Visual을 위한 컨테이너가고, ContainerVisual은 서로에 대해 네스트될 수 있다. ContainerVisual의 차일드는 VisualContainer의 Children 속성으로부터 리턴된 VisualCollection으로 조작될 수 있다. VisualCollection에서 Visual의 순서는 Visual이 렌더링되는, 즉 Visual이 뒤에서부터 앞으로, 최하위 인덱스로부터 최상위 인덱스로 렌더링되는 순서로 결정된다. 예를 들어, 컨테이너 비주얼 하에서 계층적으로 직사각형의 적색, 녹색 및 청색을 나타내는 3개의 드로잉 비주얼을 갖는 적절한 파라미터에 대하여, 다음의 코드는 후방부의 적색 직사각형, 중간부의 녹색 직사각형 및 전반부의 청색 직사각형 등의 3개의 직사각형이 드로잉되는 결과가 초래될 것이다(우측 하부로 이동(translate)됨).
도 5에 도시된 바와 같이, 다른 타입의 비주얼 오브젝트는 SurfaceVisual(504)이다. 일반적으로, 도 3에 도시된 바와 같이, SurfaceVisual 오브젝트(315)는 프로그램 코드(202)(도 2)가 액세스될 수 있는 인-메모리 표면(비트맵)(322)을 기준으로 한다. 클라이언트 프로그램 코드(202)는 자신의 표면 메모리를 공급하거나 메모리가 표면 오브젝트에 의해 할당되도록 요청할 수 있다.
프로그램 코드(202)는 SurfaceVisual을 개방하여 드로잉 컨텍스트(323)를 얻는 옵션을 가지며, 그 중에서 프로그램 코드(202)는 화소 데이터(324) 등을 기록하고 표면상에 그 화소를 직접 배치할 수 있다. 이것은 표면 오브젝트(322), 드로잉 컨텍스트(323)(그것의 임시 특성을 나타내기 위해 점선 박스로 도시함) 및 화소 데이터(324) 사이에서 점선으로 도 3에서 도시된다.
프로그램 코드(202)는 또한 표면 비주얼 관리자(330)를 생성하고 비주얼 서브그래프(332)를 SurfaceVisual(315)과 관련시키는 옵션을 갖는다. 이 옵션은 도 3에서 표면 오브젝트(322) 및 표면 비주얼 관리자(330) 사이에서 점선으로 표시된다. 도 3에서 도시된 바와 같이, 비주얼 서브그래프(332)는 또한 다른 표면 비주얼을 네스트할 수 있다는 것이 인식되어야 한다. 표면 비주얼 관리자(330)(도 6의세트(620)에서 다른 오브젝트의 타입으로서도 도시됨)는 비주얼 서브그래프(332)를 배회(walk)하여 SurfaceVisual 비트맵(322)을 갱신한다. 아울러, 이러한 배회는 디스패쳐(308)에 의해 스케쥴되며, 효율성을 위하여 이러한 비트맵(322)이 갱신되는 빈도를 제어하도록 억제(throttle)될 수 있다. 표면 비주얼 관리자(330)는 비주얼 서브그래프(322)를 매번 및/또는 최상위 레벨의 비주얼 관리자(302)가 장면 그래프의 나머지를 배회하는 것과 동일한 레이트로 배회할 필요는 없다.
표면에 대하여, 도 9a-9c를 참조로 추가로 기술되는 바와 같이, 일반적으로 본 발명의 그래픽 모델은 벡터의 표면에 비주얼 세트를 합성하고, 벡터 및 비트맵 프리미티브를 표면에 즉시-모드로 렌더링하고, 데스크탑 또는 다른 표면상에 표면을 합성하고, 표면 리스트 내의 표면이 합성 또는 드로잉하는데 사용되는 것을 제어하는 것을 허용한다. 표면 리스트는 비주얼 또는 그래픽 드로잉, 또는 둘다의 합성을 기억하는데 사용되는 물리적(시스템 또는 비디오) 메모리의 하나 이상의 표면(즉, 프레임/버퍼)의 컬렉션으로서 정의된다. 표면 리스트의 표면 중 하나는 드로잉 및/또는 합성이 수행되는 현재 후방 버퍼로서 설정될 수 있으며, 표면 리스트의 표면 중 하나는 다른 렌더링 타겟에 합성되는 데에 사용되는 현재 제1 또는 전방 버퍼로서 설정된다.
표면은 다수의 방법으로 사용될 수 있다. 예를 들어, 도 9a는 표면에 합성하는 것을 나타낸다. 도 9a에서, 표면 비주얼 관리자 오브젝트(900)는 비주얼 트리(904)에 대한 렌더링 타겟으로서 표면 리스트(902)를 접속한다. 각각의 합성 주기동안, 비주얼은 표면 리스트에 대한 활성 후방 버퍼로서 일반적으로 제공되는 표면 리스트의 표면으로 합성된다. 합성되는 표면은 시나리오를 합성하는 인-프로세스(in-process)에 대한 클라이언트/상위 레벨 엔진(214; 도 2)이 소유하는 표면, 클라이언트가 비트를 필요로 하지 않지만 하위 레벨 합성 엔진(218)이 또다른 렌더링 타겟에 표면을 합성하기 위하여 필요로 하는 시나리오에 대하여 하위 레벨 합성 엔진(218)이 소유하는 표면, 또는 클라이언트가 표면 비트에 액세스할 필요가 있지만 하위 레벨 합성 엔진(218)이 다른 합성 작업에 대한 표면을 필요로 하는 시나리오에 대한 크로스-프로세스(cross-process) 표면을 포함할 수 있다.
합성은 비주얼 관리자에 부가된 타이밍 서비스에 의해 제어된다. 타이밍 서비스의 일례는 이하의 예에서 사용될 수 있는 수동 모드이다.
표면을 사용하는 또다른 방법은 컨텍스트를 통한 표면에 대한 즉시 모드 렌더링이다. 표면 리스트를 비주얼(표면 비주얼)에 부가하는 것은, 현재 표면 리스트에 대한 액티브 후방 버퍼로서 기능하는 표면 리스트의 표면에 대한 렌더링을 가능하게 한다. 이 렌더링은 상술한 바와 같이 표면 비주얼로부터 드로잉 컨텍스트를 얻고 그 컨텍스트에 대한 명령을 실행함으로써 행해진다. 드로잉 컨텍스트를 얻는 것은 표면을 잠궈(lock) 다른 합성 동작이 수행될 수 없도록 하는 것이다. 각각의 드로잉 명령은 즉시 실행되고, 벡터 및 다른 표면은 표면상에 드로잉(혼합)될 수 있다. 그러나, 다른 비주얼은 표면상에 드로잉될 수 없지만, 대신해서 상술한 바와 같이 비주얼 관리자로 관련시킴으로써 표면에 합성될 수 있다 (예를 들어, 도 9a).
표면에 대한 또다른 사용은 또다른 렌더링 타겟에 표면을 합성하는 경우이다. 이 때문에, 표면 리스트가 표면 비주얼에 부착되면, 표면은 비주얼 트리의 노드로서 부착될 수 있고, 일반적으로 첫번째 또는 전방 버퍼로서 제공되는 표면 리스트의 표면이 다른 표면 또는 데스크탑에 합성될 수 있다. 이것은 도 9b에 도시되어 있으며, 그 예는 다음과 같다.
표면으로/으로부터의 라이브 합성(live composition)은 도 9c에 도시되며,상술한 능력은 결합되어 표면 리스트의 후방 버퍼 표면으로의 합성 및 표면 리스트의 전방 버퍼 표면으로부터(예를 들어, 데스크탑으로)의 합성이 동시에 수행된다. 티어링(tearing)으로서 공지된 바람직하지 않은 비디오 효과를 제거하기 위하여 표면 리스트는 적어도 2개의 표면, 전방 및 후방 버퍼 표면을 가져야 한다. 도 9c에서 사용된 표면은 하위 레벨 엔진(218)에 의해 소유될 수 있고, 또는 하위 레벨 엔진(218)의 합성이 더 잘 수행되도록 하는 크로스프로세스 표면이다.
표면은 이하의 작성예에서와 같이 독립 오브젝트로서 작성된다.
일단 작성되면, 표면 및/또는 표면 리스트가 표면 비주얼 오브젝트 또는 비주얼 관리자 오브젝트에 부착될 수 있다.
또한, 표면은 디코더로부터 데이터를 얻을 수 있고, 및/또는 그 데이터를 특정 파일 포맷으로 기입하기 위한 인코더로 전송할 수 있다. 표면은 또한 효과 인터페이스로/로부터 데이터를 수신/전송할 수 있다. 표면은 모든 셋트의 지지 표면 포맷 타입으로부터 임의의 화소 포맷에 대하여 작성될 수 있다. 그러나, 특정 화소 포맷에 몇가지 조정이 수행될 수 있다. 예를 들어, 특정 화소 포맷이 화소당 32비트 미만이면, 포맷은 화소당 32비트로 진행된다. 비트가 원래의 포맷의 표면으로부터 요구될 때마다, 표면은 포맷 변환 필터를 사용하여 요구된 화소 포맷의 버퍼로 복제될 것이다.
도 5로 되돌아가서, 또다른 비주얼이 장면 그래프에 Win32 차일드 HWnd를 배치하는 HwndVisual(505)이다. 특히, 레가시(legacy) 프로그램은 이전의 그래픽 기술에 기초하여 차일드 HWnd (등)으로 드로잉하는 WM_PAINT 방법 (등)을 통해 동작할 것이다. 새로운 그래픽 처리 모델에서 이러한 프로그램을 지지하기 위하여, HwndVisual은, 도 10a에 도시된 바와 같이, Hwnd가 장면 그래프에 포함되도록 하고 페어런트 비주얼(parent visual)은 이동하여 재배치된다. 그러나, 기존의 Hwnd의 제한 결과로서, 렌더링될때, 차일드 Hwnd는 다른 윈도우의 상부에만 있을 수 있으며, 상술한 다른 비주얼처럼 회전되거나 스케일링될 수 없다. 도 10b에 도시된 바와 같이, 몇몇 클립핑이 가능하며, 여기서 파선은 HWnd가 표시되는 직사각형이 그 페어런트 비주얼에 대하여 상대적으로 이동하는 동안 클립핑되는 것을 나타낸다.
다른 타입의 비주얼(506)이 또한 실행될 수 있으며, 현재의 오브젝트 모델은 다른 비주얼이 개발되도록 확장될 수 있다. 예를 들어, 도 11에 도시된 바와 같이, 계층화된 비주얼(1100)은 애플리케이션 개발자가 다중 데이터 스트림을 통해 비주얼의 정보를 개별적으로 제어하도록 하고, 단일 데이터 스트림을 갖는 비주얼에 대하여 미세 입도(granularity)의 제어를 제공한다. 유사한 입도의 제어는 단일 페어런트 비주얼하의 (예를 들어 3개의) 개별 차일드 비주얼을 가짐으로써 달성될 수 있지만, 이것은 단일 계층 비주얼을 갖는 작업보다 더 복잡한 다중 비주얼을 갖는 프로그램 코드 작업이 다중층에 대하여 색인을 다는 것을 요구한다.
예를 들어, 도 11에서, 배경 데이터, 컨텐츠 데이터, 경계 데이터는 단일 계층 비주얼에 포함되지만, 계층값, 예를 들어, 0, 1, 2에 의해 색인을 달아 서로 각각 분리된다. 표시를 위한 암시된 Z 순서를 정의하는 계층 순서(예를 들어, 도시된 바와 같이 왼쪽으로부터 오른쪽으로)를 갖는 계층이 삽입(어느 한쪽끝에 결합되는 것을 포함)되고/되거나 삭제될 수 있다. 보안을 위하여, 계층화된 비주얼 내의 차일드 컨텐츠와 다른 데이터는 열거될 수 없다.
다른 타입의 비주얼은 컨테이너 비주얼을 포함하고, 그 컨텐츠가 비트맵으로 드로잉되는 차일드 Hwnd 비주얼을 재지향시키고(redirect), 표면 비주얼에 결합시킨다. 3차원 비주얼은 2차원 및 3차원 세계사이의 접속을 가능하게 하고, 예를 들어, 3차원 세계로의 뷰(view)를 갖는 2차원 비주얼을 통해 카메라와 같은 뷰(camera-like view)가 가능하다.
많은 자원 오브젝트는, 일단 생성되면 불변한다. 즉, 자원 오브젝트는 일단 생성되면 연속하는 유출의 간략화, 다른 것에 의한 변조 방지, 및 엘리먼트와 API 간의 상호 작용 간략화를 포함하는 다양한 이유에 대해서 변경될 수 없다. 이것은 일반적으로 시스템을 간략화시킨다. 그러나, 이러한 오브젝트가 변하는 시스템을 이용하는 것도 가능하지만, 예를 들어, 의존 그래프를 관리할 필요가 있다는 점에 유의한다. 예를 들어, 이러한 오브젝트가 변하는 시스템을 가질 수 있지만, 프로그램 코드가 비주얼에 설정된 클립을 변경시키면, 비주얼은 다시 렌더링될 필요가 있고, 따라서, 예를 들어 새로운 클립이 비주얼에 할당되면, 통지/등록 메카니즘이 필요하고, 비주얼은 그 자체를 통지(예를 들어, 클립 변경 통지)를 위한 클립으로등록한다. 따라서, 일 구현에 있어서, 간략화하기 위하여, 자원 오브젝트는 불변이다.
이들 자원 오브젝트는 이하에서 설명하는 바와 같이 오브젝트를 생성하기 위한 간단하고 일반적인 방법인 작성자로 정의될 수도 있고, 컴패니언 빌더 오브젝트(companion builder object)를 사용하여 정의될 수도 있다. 예를 들어, SolidColorBrush(브러쉬 오브젝트는 이하에 설명됨)를 생성하기 위하여, 작성자가 사용될 수 있다.
Brush MyBrush = new SolidColorBrush(Colors.Red);
사용자는 또한 한 셋트의 미리 정의된 컬러를 얻기 위하여 브러쉬 클래스에 정적 부재를 사용할 수 있다.
불변 오브젝트는 변화할 수 없기 때문에, 오브젝트를 효과적으로 변화시키기 위하여 사용자는 새로운 오브젝트를 생성하고 기존의 것을 그 새로운 오브젝트로 대체할 필요가 있다. 이 때문에, 시스템의 많은 자원 오브젝트는, 가변하는 컴패니언 클래스인 빌더 클래스를 갖는 불변 오브젝트가 생성되는 빌더 패턴을 이용할 수 있다. 사용자는 불변 오브젝트를 생성하며 빌더에 설정된 파라미터를 반영하고, 그 오브젝트에 대한 새로운 빌더를 생성하고, 불변 오브젝트로부터 새로운 빌더를 초기화시킨다. 그후, 사용자는 필요에 따라 빌더를 변경한다. 일단 수행되면, 사용자는 빌더를 변경하고 재사용하여 또다른 불변 오브젝트를 생성함으로써 새로운 오브젝트를 작성할 수 있다. 설정된 특성을 갖는 불변 오브젝트가 바람직하고, 불변 오브젝트는 변경될 수 없지만, 특성 변경에 의해서 대체될 수 있다.
그러므로, 상술한 바와 같이 SolidColorBrush를 생성하기 위하여 작성자를 사용하는 대신에, SolidColorBrushBuilder가 사용될 수 있다.
SolidColorBrushBuilder MyBuilder = new
SolidColorBrushBuilder();
MyBuilder.Color = Colors.Red;
Brush MyBrush = MyBuilder.ToBrush();
정적인 값을 갖는 대부분의 오브젝트는 또한 애니메이션 오브젝트를 가질 수 있다. 예를 들어, DrawingContext에서, 원의 중심에 대하여 PointAnimationBase를 갖는 DrawCircle에 대한 철회가 있다. 이 방법에서, 사용자는 프리미티브 레벨에서 풍부한 애니메이션 정보를 지정할 수 있다. 자원 오브젝트에서, 베이스값에 더하여 애니메이션 컬렉션이 존재한다. 이들은 합성되어, 사용자가 상기의 예를 애니메이팅하기를 원하면, 브러쉬가 작성되기 전에 사용자가 다음의 예를 지정할 수 있다.
MyBuilder.ColorAnimations.Add(new ColorAnimation(...));
애니메이션 파라미터는 정적이기 때문에, 애니메이션 파라미터를 갖는 오브젝트는 불변이다. 그러나, 장면 그래프가 처리될 때(예를 들어, 횡단) 애니메이션 파라미터의 의미는 시간에 따라 변화하고, 정적이지 않고 애니메이팅된 데이터의 외관을 부여한다.
상술한 바와 같이, Geometry, ImageData, 및 Videodata를 포함하는 다양한 드로잉 프리미티브와 함께 그 드로잉 컨텍스트를 배치시킴으로써 비주얼이 드로잉될 수 있다. 또한, 이 모든 스택을 통해 공유되는 한 세트의 자원과 클래스가 있다. 이것은 Pen, Brushe, Geometry, Transform, 및 Effect를 포함한다. IDrawingContext는 DrawingVisual, ValidationVisual을 배치하는데 사용될 수 있는 한 세트의 드로잉 동작을 나타낸다. IDrawing 컨텍스트로의 베이스 인터페이스인 ISurfaceDrawingContext는 SurfaceVisual을 배치하는데 사용될 수 있다. 즉, 드로잉 컨텍스트는 한 셋트의 드로잉 동작을 나타내고, 각각의 드로잉 동작에 대하여 2개의 방법이 있으며, 그중 하나는 인수로서 정수를 취하고, 또다른 하나는 인수로서 애니메이터를 취한다.
DrawLine 법은 시작점에서 끝점까지 지정된 펜으로 라인을 드로잉한다.
DrawRoundedRectangle 법은 지정된 브러쉬와 펜으로 라운딩된 직사각형을 드로잉한다. 브러쉬와 펜은 중요하지 않다.
DrawGeometry법은 지정된 브러쉬와 펜으로 경로를 드로잉한다. 브러쉬와 펜은 중요하지 않다.
DrawRectangle 법은 지정된 브러쉬와 펜으로 직사각형을 드로잉한다. 브러쉬와 펜은 중요하지 않다.
DrawSurface 법은 표면을 드로잉한다.
Geometry는 스트로크 또는 채움없이 벡터 그래픽 골격을 정의하는 한 타입의 클래스(도 12)이다. 각각의 기하학 오브젝트는 간단한 형상(LineGeometry, EllipseGeometry, RectangleGeometry), 복잡한 단일 형상(PathGeometry), 또는 결합 동작(예를 들어, 유니온, 인터섹션 등)을 갖는 이러한 형상 GeometryList의 리스트이다. 이들 오브젝트는 도 12에 도시된 바와 같이 클래스 계층을 형성한다.
도 13에 도시된 바와 같이, PathGeometry는 Figure 오브젝트의 컬렉션이다. Figure 오브젝트의 각각은 실제적으로 도형의 형상을 정의하는 하나 이상의 세그먼트로 구성된다. Figure는 세그먼트 컬렉션을 정의하는 Geometry의 서브섹션(sub-section)이다. 이 세그먼트 컬렉션은 접속된 일련의 2차원 세그먼트 오브젝트이다. Figure는 정의된 영역을 갖는 밀폐된 형상 또는 곡선을 정의하는 접속된 일련의 세그먼트일 수 있지만, 포위된 영역은 없다.
PathGeometry의 채움 영역은 참(true)으로 설정된 채움 특성을 갖는 포함된 Figure을 취하고 FillMode를 적용하여 포위된 영역을 결정함으로써 정의된다. FillMode 열거는 Geometry내에 포함된 Figure 오브젝트의 교차 영역이 어떻게 결합되어 Geometry의 결과 영역을 형성하는지를 지정한다. "alternate" 룰은 그 위치로부터 무한대로 광선을 임의의 방향으로 개념적으로 드로잉함으로써 포인트가 캔버스내에 있는지를 결정한 후, 형상의 세그먼트가 광선과 교차하는 위치를 조사한다. 0으로부터 카운트를 시작하여 왼쪽으로부터 오른쪽으로 세그먼트가 광선을 교차할때마다 하나씩 더하고, 경로 세그먼트가 오른쪽으로부터 왼쪽으로 광선과 교차할때마다 하나씩 빼고, 교차를 카운팅한 후, 그 결과가 0이면, 포인트는 경로의 밖에 있는 것이다. 그렇지 않으면, 포인트가 경로내에 있는 것이다. "winding" 룰은 캔버스상의 포인트가 내부에 있는지를 결정하고, 임의의 방향으로 그 포인트로부터 무한대로 광선을 개념적으로 드로잉하고 그 광선이 교차하는 주어진 형상으로부터 경로 세그먼트의 수를 카운트함으로써 작업을 수행한다. 그 수가 홀수이면, 포인트가 내부에 있는 것이고, 그렇지 않으면 포인트는 외부에 있는 것이다.
도 14에 도시된 바와 같이, 기하 도형(예를 들어, 직사각형)이 드로잉되면, 이하에 설명되는 바와 같이, 브러쉬 또는 펜이 지정될 수 있다. 또한, 펜 오브젝트는 또한 브러쉬 오브젝트를 갖는다. 브러쉬 오브젝트는 어떻게 평면을 그래픽으로 채울 것인지를 정의하고, 브러쉬 오브젝트의 클래스 계층이 있다. 이것은 도 14에서 직사각형 및 브러쉬 명령 및 파라미터를 포함하는 비주얼이 처리될 때 나타내는 채워진 직사각형(1402)으로 표시된다.
이하에서 설명하는 바와 같이, 몇가지 타입의 브러쉬(그래디언트 및 9개의 그리드)가 크기별로 분류된다. 사용될때, 이들 브러쉬의 크기는 바운딩 박스(bounding box)로부터 얻어진다. 예를 들어, 브러쉬에 대한 GradentUnit/DestinationUnit이 ObjectBoundingBox로 설정되면, 드로잉되는 프리미티브의 바운딩 박스가 사용된다. 그 특성이 UserSpaceOnUse로 설정되면, 좌표 공간이 사용된다.
Pen 오브젝트는 이하의 예에 나타낸 바와 같이 Width, LineJoin, LineCap, MiterLimit, DashArray, 및 DashOffset에 대한 특성에 따라 Brush 상에 유지된다.
상술한 바와 같이, 본 발명의 그래픽 오브젝트 모델은 일반적으로 화소를 갖는 평면을 커버하는 개념을 지향하는 Brush 오브젝트 모델을 포함한다. 브러쉬의 타입의 예는 도 15의 계층에 표시되며, Brush 기본 클래스하에서, SolidColorBrush, GradientBrush, ImageBrush, (Visual을 참조할 수 있는) VisualBrush, 및 NineGridBrush을 포함한다. GradientBrush는 LinearGradient 및 RadialGradient 오브젝트를 포함한다. 상술한 바와 같이, Brush 오브젝트는 불변이다.
다음은 BrushBuilder 클래스의 예이다:
Brush 오브젝트는 브러쉬 오브젝트가 사용될때 좌표계와 어떻게 관련되는지 및/또는 브러쉬 오브젝트가 사용되는 형상의 바운딩 박스와 어떻게 관련되는지를 인식할 수 있다. 일반적으로, 크기 등의 정보는 브러쉬가 드로잉된 오브젝트로부터 추측될 수 있다. 특히, 많은 브러쉬 타입은 몇개의 파라미터를 지정하는 좌표계를 사용한다. 이 좌표계는 브러쉬가 적용되는 형상의 간단한 바운딩 박스에 관련되도록 정의될 수 있거나, 또는 브러쉬가 사용되는 시간에 활성화되는 좌표 공간에 관련될 수 있다. 이들은 각각 ObjectBoundingBox 모드 및 UserSpaceOnUse 모드로 공지되어 있다.
SolidColorBrush 오브젝트는 식별된 평면을 솔리드 컬러로 채운다. 컬러의 알파 성분이 있으면, Brush 기본 클래스의 대응하는 불투명 속성으로 증가하는 방식으로 결합된다. 다음은 SolidColorBrush 오브젝트의 예를 나타낸다.
GradientBrush 오브젝트, 또는 단순히 그래디언트는 그래디언트 채움(gradient fill)을 제공하고, 몇종류의 진행에 따라 컬러를 지정하는 한 세트의 그래디언트 스톱을 지정함으로써 드로잉된다. 그래디언트는 감마 2.2 RGB 컬러 공간에서 그래디언트 스톱간의 선형 보간을 수행함으로써 드로잉된다; 다른 감마 또는 다른 컬러 공간(HSB, CMYK 등)을 통한 보간이 실행될 수 있는 대안이다. 2가지 타입의 그래디언트 오브젝트는 선형 및 원형 그래디언트를 포함한다.
일반적으로, 그래디언트는 그래디언트 스톱의 리스트로 구성된다. 이들 그래디언트 스톱의 각각은 (알파값을 갖는) 컬러와 오프셋을 함유한다. 그래디언트 스톱이 지정되지 않으면, 마치 브러쉬가 전혀 지정되지 않은 것처럼, 브러쉬는 솔리트 투명 블랙으로 드로잉된다. 하나의 그래디언 스톱만이 지정되면, 브러쉬는 그 지정된 하나의 컬러로 솔리드 컬러로서 드로잉된다. 다른 자원 클래스처럼, 그래디언트 스톱 클래스(이하의 표의 예)는 불변이다.
또한, 다음의 예에서처럼, 컬렉션 클래스가 있다.
아래의 표에 나타낸 바와 같이, GradientSpreadMethod는 그래디언트가 지정된 벡터 또는 공간의 외부에 어떻게 드로잉되어야 하는지를 지정한다. 에지 컬러(첫번째와 마지막)가 잔여의 공간을 채우는데 사용되는 패드, 스톱이 공간을 채우기 위하여 역순으로 반복적으로 재생되는 반사, 및 공간이 채워질때까지 스톱이 순서대로 반복되는 반복을 포함하는 3개의 값이 있다.
도 16은 GradientSpreadMethod의 예를 나타낸다. 각각의 형상은 백색으로부터 회색으로 진행하는 선형 그래디언트를 갖는다. 솔리드 라인은 그래디언트 벡터를 나타낸다.
LinearGradient는 벡터에 따라 선형 그래디언트 브러쉬를 지정한다. 각각의스톱은 그 벡터에 따라 컬러를 지정한다. 일례가 이하의 표에 표시된다.
RadialGradient 는 프로그래밍 모델에서의 선형 그래디언트와 유사하다. 그러나, 선형 그래디언트는 그래디언트 벡터를 정의하기 위한 시작점과 끝점을 갖지만, 원형 그래디언트는 그래디언트 행동을 정의하기 위한 초점과 함께 원을 갖는다. 원은 그래디언트의 끝점을 정의한다. 즉, 1.0에서의 그래디언트 스톱은 원에서의 컬러를 정의한다. 초점은 그래디언트의 중심을 정의한다. 0.0에서의 그래디언트 스톱은 초점에서의 컬러를 정의한다.
도 17은 백색으로부터 회색으로의 원형 그래디언트를 나타낸다. 외부 원은 그래디언트 원을 나타내고, 도트는 초점을 지칭한다. 그래디언트의 이 예는 Pad에 설정된 SpreadMethod를 갖는다.
도 15에 나타낸 또다른 브러쉬 오브젝트는 VisualBrush 오브젝트이다. 개념적으로, VisualBrush는 채움으로서 반복 타일(tile) 방식으로 드로잉된 비주얼을 갖는 방법을 제공한다. 비주얼 페인트 오브젝트는 이하에서 설명되는 바와 같이 마크업 언어를 위한 메카니즘을 제공하여, 자원 레벨에서 API 계층으로 직접 작업한다. 이러한 채움의 예는 도 14에서 직사각형(1422)을 채우는 단일 원형(1420)을지정하는 비주얼 (및 임의의 차일드 비주얼)을 참조하는 비주얼 브러쉬에 의해 표시된다. 그러므로, VisualBrush 오브젝트는 브러쉬가 어떻게 드로잉되는지를 정의하기 위하여 비주얼을 참조할 수 있으며, 비주얼을 위한 다중 사용의 타입을 도입한다. 이 방법에서, 프로그램은 임의의 그래픽 "메타파일(metafile)"을 이용하여 브러쉬 또는 펜을 통해 영역을 채울 수 있다. 이것은 임의의 그래픽을 저장하고 사용하기 위하여 압축된 형태이므로, 그래픽 자원을 제공한다. 다음은 VisualBrush 오브젝트의 일례를 나타낸다.
비주얼 브러쉬의 컨텐츠는 고유(intrinsic) 경계가 없으며, 무한 평면을 효과적으로 기술한다. 이들 컨텐츠는 그들 자체의 좌표 공간에 존재하며, 비주얼 브러쉬에 의해 채워지는 공간은 애플리케이션에서는 국부 좌표 공간이다. 컨텐츠 공간은 ViewBox, ViewPort, Alignment, 및 Stretch 속성에 기초하여 국부 공간에 매핑된다. 뷰박스는 컨텐츠 공간에서 규정되며, 이 사각형은 뷰포트(Origin 및 Size 속성에 의해 규정되는 바와 같이) 직사각형으로 매핑된다.
뷰포트는 이 브러쉬에 대한 기본 타일을 생성하여 컨텐츠가 최종적으로 드로잉되는 위치를 정의한다. DestinationUnit의 값이 UserSpaceOnUse이면, 원점 및 크기 속성이 애플리케이션에서는 국부 공간에 있는 것으로 간주된다. 반면에, DestinationUnit의 값이 ObjectBoundingBox이면, 원점 및 크기는, 브러쉬되는 오브젝트의 바운딩 박스의 상부 좌측 코너가 0,0 이며, 동일 박스의 하부 우측 코너가 1,1 인 좌표 공간에 있는 것으로 간주된다. 예를 들면, 100,100에서 200,200까지 도시되어 채워지는 RectagnleGeometry를 고려하자. 이러한 예에서, DestinationUnit이 UserSpaceOnUse이면, 100,100의 원점과 100,100의 크기가 전체 컨텐츠 영역을 기술한다. DestinationUnit이 ObjectBoundingBox이면, 0,0의 원점과 1,1의 크기는 전체 컨텐츠 영역을 기술한다. 크기가 비어 있으면, 브러쉬는 아무 것도 렌더링하지 않는다.
뷰박스는 컨텐츠 공간에서 규정된다. 이 직사각형은 Alignment 속성과 Stretch 속성에 의해 결정된대로 뷰포트 내 맞도록 변환된다. 스트레치가 None이면, 어떠한 스케일링도 그 컨텐츠에 적용되지 않는다. 스트레치가 Fill이면, 뷰박스는 X와 Y 모두 독립적으로 스케일되어 뷰포트와 동일한 크기가 된다. 스트레치가 Uniform 또는 UniformToFill이면, 논리는 유사하지만 X와 Y차원이 균일하게 스케일링되어 컨텐츠의 종횡비가 유지된다. 스트레치가 Uniform이면, 뷰박스는 뷰포트의 크기와 동일하게 보다 제한된 차원을 갖도록 스케일된다. 스트레치가UniformToFill이면, 뷰박스는 뷰포트의 크기와 동일하게 보다 적게 제한되는 차원을 갖도록 스케일된다. 즉, Uniform과 UniformToFill 모두 종횡비를 유지하지만, Uniform은 전체 뷰박스가 뷰포트 내부에 있음을 보장하고(뷰박스에 의해 커버되지 않은 뷰포트 부위를 잠재적으로 버림), UniformToFill은 전체 뷰포트가 뷰박스에 의해 채워지는 것을 보장한다(잠재적으로 뷰박스의 일부를 뷰포트 외부에 있게 함). 뷰박스가 비어 있으면, 어떠한 스트레치도 적용되지 않는다. 또한, 정렬은 여전히 행해지며, 이에 의해 "점" 형태의 뷰박스가 위치되는 것에 주목하자.
도 18은 스트레치가 "none"으로 설정되는 경우의 타일(800)을 포함하여, 다양한 스트레치가 설정된 그래픽의 단일 타일(1800)의 표현을 제공한다. 타일(1802)은 스트레치가 "Uniform"으로 설정되는 경우의 표현이고, 타일(1804)은 스트레치가 "UniformToFill"로 설정되는 경우이며, 타일(1806)은 스트레치가 "Fill"로 설정되는 경우이다.
일단 뷰포트가 (DestinationUnit에 기초하여) 결정되고 그 뷰박스의 크기가 (스트레치에 기초하여) 결정되면, 그 뷰박스는 뷰포트 내에 위치될 필요가 있다. 그 뷰박스가 뷰포트와 동일한 크기이면 (스트레치가 Fill이거나 다른 3개의 스트레치 값들 중의 하나로서 발생하는 경우), 뷰박스는 뷰포트와 동일하도록 원점에 위치된다. 그렇지 않으면, HorizontalAlignment와 VerticalAlignment가 고려된다. 이들 속성에 기초하여, 뷰박스는 X와 Y차원으로 정렬된다. HorizontalAlignment가 좌측이면, 뷰박스의 좌측 에지는 뷰포트의 좌측 에지에 위치될 것이다. 그것이 중앙이면, 뷰박스의 중앙은 뷰포트의 중앙에 위치될 것이며, 우측이면, 우측 에지들이 만날 것이다. 그 프로세스는 Y차원에 대하여 반복된다.
뷰박스가 (0,0,0,0)이면, 비설정으로 간주되고, 그에 따라 ContentUnit이 고려된다. ContentUnit이 UserSpaceOnUse이면, 어떠한 스케일링 또는 오프셋도 발생하지 않으며, 컨텐츠는 아무런 변환없이 뷰포트에 드로잉된다. ContentUnit이 ObjectBoudingBox이면, 컨텐츠 원점은 뷰포트 원점에 정렬되어, 그 컨텐츠는 오브젝트의 바운딩 박스의 폭과 높이에 의해 스케일링된다.
비주얼 브러쉬에 의해 공간을 채우는 경우에는, 그 컨텐츠는 상기한 바와 같이 뷰포트로 매칭되고 그 뷰포트에 클립핑된다. 이는 채움을 위한 기본 타일을 형성하며, 공간의 여백은 브러쉬의 TileMode에 기초하여 채워진다. 최종적으로, 설정된 경우, 브러쉬의 변환이 적용된다 -이것은 결국 다른 매핑, 스케일링, 오프셋 등이 모두 다 행해지고 난 후에 발생한다.
TileMode 나열되는 공간이 브러쉬에 의해 채워질지의 여부 그리고 어떻게 채워지는지를 설명하는 데에 이용된다. 타일될 수 있는 브러쉬는 타일 사각형을 정의하며, 이 타일은 채워진 공간 내부에 베이스 위치를 가진다. 나머지 공간은 TileMode 값에 기초하여 채워진다. 도 19는 "None"(1900), "Tile"(1902), "FlipX"(1904), "FlipY"(1906) 및 "FlipXY"(1908)를 포함하는 다양한 TileMode 설정을 갖는 예시적인 그래픽 표현을 제공한다. 다양한 실시예의 그래픽에서의 상부 최좌측 타일은 기본 타일을 구비한다.
도 20은 이 브러쉬에 대한 화소를 생성하는 프로세스를 나타낸다. 도 20에 도시되는 논리는 단지 그 논리를 구현하는 가능한 하나의 방법이며, 보다 효과적인방식을 포함하여 다른 방식들도 가능하다. 예를 들면, 타일이 드로잉되고 캐싱되는 것에 의해 매 반복시마가 컨텐츠가 드로잉되지 않는 것과 같이, 효율적인 데이터 처리 방식들이 있을 것이다. 그러나, 도 20은 간단한 설명을 제공한다.
통상적으로, 패턴의 컨텐츠가 드로잉될 때마다, 새로운 좌표 시스템이 생성된다. 각각의 반복에 대한 원점과 오프셋은 DestinationUnit와 Transform 속성에 의해 필터링되어 Origin 및 Size 속성에 의해 규정된다.
좌표 프레임은 DestinationUnit 속성에 기초하여 설정된다. 이를 위해서는, 단계(2000)에서, DestinationUnit 속성이 UserSpaceOnUse이면, 브러쉬가 이용되는 때의 좌표 프레임은 단계(2002)에 의해 개시 좌표 프레임이다. 단계(2004)에서, 속성이 ObjectBoudingBox이면, 단계(2004)에서 나타낸 바와 같이 이 브러쉬가 적용되는 기하학의 바운딩 박스가 이용되어 바운딩 박스의 상부 좌측 코너가 (0,0)에 매핑하고 바운딩 박스의 하부 좌측 코너가 (1,1)에 매핑되도록 새로운 좌표 프레임을 설정한다. 어떠한 경우이든, 단계(2006)에서는, Transform 속성이 그리드를 실질적으로 정의하는 이러한 좌표 프레임에 적용된다.
도 21은 비주얼 브러쉬에서 타일로서 정의되는 비주얼 브러쉬 그리드를 나타낸다. 제1 원은 단순 그리드이며, 제2 원은 x 방향으로 47만큼 스큐된 Transform을 가진다.
단계(2008)에서, 비주얼은, 도 22에 나타난 바와 같이, 그리드의 각각의 셀로 드로잉되고, 여기에서 비주얼은 적합한 드로잉한다. 단계(2010)에서, 뷰박스가 규정되며, 비주얼은 단계(2012)에 의해 ViewBox, Stretch, HorizontalAlign 및VerticalAlign 속성들에 의해 규정된 바와 같이 그리드 셀에 맞춰진다. DestinationUnit과 Transform 속성은 비주얼이 그리드 박스에 라인업(line-up)하도록 정확한 변환형을 적용하는데 이용된다.
아무런 뷰박스도 규정되지 않으면, 단계(2014)에서 컨텐츠를 드로잉하기 위해서 새로운 좌표 시스템이 설정된다.
좌표 프레임은 그 원점이 특정 그리드 셀이 도시되는 원점이 되도록 설정된다.
단계(2018)에서는, Size 속성에 기초하여 타일이 셀 경계 외부를 드로잉하지 않도록 클립이 적용된다. 원점과 크기는 DestinationUnit 속성에 기초하여 적절하게 변환된다.
그 후, 좌표 시스템이 SourceUnit 속성에 기초하여 변환된다. 이를 위해서, 단계(2020)에서는, SourceUnit 속성이 ObjectBoundbox이며, 적절한 스케일링 변환이 단계(2026)에서 적용되지만, UserspaceOnUse이면, 어떠한 새로운 변환도 적용되지 않는다. 단계(2024)에서 Transform 속성이 적용되며, 단계(206)에서는 그 컨텐츠가 드로잉된다.
크기의 어느 부분이 0이면, 아무것도 드로잉되지 않으며, 스트레치가 "None"이면, 뷰박스에 대한 변환은 새로운 좌표 프레임에서의 일단위가 구 좌표 프레임에서의 일단위와 동일하도록 설정된다. 변환은 뷰박스의 정렬 속성과 크기에 기초되는 실질적인 오프셋이 된다. 단계(2010)과 단계(2012)에서 상술한 바와 같이, Stretch 및 Alignment 속성은 규정된 뷰박스가 있는 경우에만 적용된다. 뷰박스는컨텐츠에 대한 새로운 좌표 시스템을 규정하며 스트레치는 이들 컨텐츠를 뷰박스에 어떻게 매핑하는 지를 규정하게 한다. 정렬 옵션은 컨텐츠가 아닌 뷰박스를 정렬한다. 따라서, 예를 들면, 뷰박스가 "0 0 10 10"으로 설정되고 무엇인가가 -10,-10에 드로잉되고 상부 좌측 코너에 정렬된 경우, 그것은 클립핑될 것이다.
도 15를 참조하면, 이미지 브러쉬는 비주얼 브러쉬의 특별한 경우로서 간주될 수 있다. 프로그램이 비주얼을 생성하여 이미지를 그 비주얼에 적용한 후 이를 비주얼 브러쉬에 첨부하더라도, 그렇게 하는 API는 번거로울 것이다. 필요한 컨텐츠 좌표 프레임이 없기 때문에, 뷰박스와 ContentUnit 속성 멤버는 더이상 적용하지 않는다.
NineGridBrush는 이미지가 크기에 기초하여 워핑(warping)되는 것을 제외하면, ImageBrush와 매우 유사하다. 본질적으로, 다른 것들(예를 들면, 경계)과는 달리, NineGridBrush는 이미지 스트레치의 일정 부분인 통상의 스트레치 타입으로 간주될 수 있다. 따라서, ImageBrush 내의 이미지의 크기는 단순 스케일링되며, NineGridBrush는 원하는 크기까지 불균일하게 스케일 업된다. 스케일되지 않은 영역에 대한 단위는 브러쉬가 인가되는 때의 사용자 단위이며, 이는 ContentUnit (만약 NineGridBrush가 존재하면)은 UserUnitOnUse로 설정되는 것을 의미한다. 브러쉬의 변환 속성은 효과적으로 사용될 수 있다. 경계 멤버는 이미지의 에지로 간주됨에 주목하자.
예를 들면, 도 23은 제1 인스턴스(2302)로부터 제2 인스턴스(2304)까지 4개 타입의 영역을 가지며 확대되는 9개의 그리드 이미지를 나타낸다. 도 23에 나타낸 바와 같이, 경계를 동일하게 유지하기 위해서, "a"로 마크된 영역은 수평하게 확장하고, "b"로 마크된 영역은 수직으로 확장하며, "c"로 마크된 영역은 수직과 수평으로 확장하고, "d"로 마크된 영역은 크기가 변하지 않는다.
상술한 바와 같이, 본 발명의 그래픽 오브젝트 모델은 변형 오브젝트 모델을 구비하며, 이는 변형 기본 클래스 하에서, 도 24의 계층에 표현된 타입들의 변형을 포함한다. 변형을 행하는 이들 서로 다른 타입의 컴포넌트들은 TransformList, TranslateTransform, RotateTransform, ScaleTransform, SkewTransform, 및 MatrixTransform 등을 구비한다. 개별 속성은 예를 들면 애니메이트될 수 있으며, 프로그램 개발자는 RotateTransform의 각도 속성을 애니메이트할 수 있다.
2D 계산을 위한 행렬은 3×3 행렬로서 표현된다. 요구되는 변환에 대하여, 3×3 행렬 전체 대신 단지 6개의 값만이 요구된다. 이들은 다음과 같이 지정되고정의된다.
행렬과 점을 승산하면, 점은 새로운 좌표 시스템에서 이전의 좌표 시스템으로 변환된다.
변환은 임의의 레벨로 네스트될 수 있다. 새로운 변환이 가해질 때마다, 현재의 변환 행렬상에 그것을 후-승산하는(post-multiplying) 것과 동일하게 된다.
API 내의 대부분의 장소는 직접 행렬을 취하지 않는 대신, 애니메이션을 지원하는 변환 클래스를 이용한다.
벡터 그래픽에 대한 오브젝트 모델과 마크업 언어
본 발명의 일 양태에 따르면, 사용자 프로그램 및 툴이 API 계층(212)(도 2)의 세부사항에 대한 특정 지식을 요구하지 않고도 장면 그래프 데이터 구조(216)와 상호 작용할 수 있도록 하기 위해, 마크업 언어와 엘리먼트 오브젝트 모델이 제공된다. 통상적으로, 엘리먼트 오브젝트 모델에 의해 벡터 그래픽을 표현하는 기재 포맷(authoring format)에 기초한 단순 마크업과 함께, 교환 포맷을 구성하는 벡터 그래픽 마크업 언어가 제공된다. 이 언어를 통해서, 마크업(예를 들면, HTML 또는 XML 타입의 컨텐츠)이 프로그래밍될 수 있다. 따라서, 장면 그래프를 구축하기 위해서, 마크업이 구문 분석되어 상술한 바와 같은 적절한 비주얼 API 계층으로 번역된다. 이러한 보다 고도의 동작 레벨에서는, 엘리먼트 트리, 속성 시스템 및 프리젠터 시스템이 상당한 정도의 복잡도를 다룰 수 있도록 제공되어 장면 설계자가 복잡한 장면을 설계할 수 있게 한다.
통상적으로, 벡터 그래픽 시스템은 일련의 형상 및 다른 엘리먼트들, 범용 속성시스템과의 통합, 그룹화 및 합성 시스템, 그리고 2층(엘리먼트 레벨과 자원 레벨) 접근을 주로 제공하여, 사용자가 유연성과 성능요구를 매치하는 방식으로 프로그램할 수 있다. 본 발명의 일 양태에 대하여 계속 설명하면, 백터 그래픽을 다루는 엘리먼트 오브젝트 모델은 장면 그래프 오브젝트 모델과 상관한다. 즉, 백터 그래픽 시스템과 비주얼 API 계층은 예를 들면, 엘리먼트 오브젝트 모델 레벨에서 일련의 자원을 공유하고, 브러쉬 오브젝트는 비주얼 API에 드로잉하는 경우에 사용될 수 있으며, 또한, 이는 형상에 대해서는 채움 속성의 타입이다. 따라서, 마크업 언어는 장면 그래프 오브젝트와 상관하는 엘리먼트를 가질 뿐만 아니라, 다수의기본자원(예를 들면, 브러쉬, 변형 등)을 비주얼 API 계층과 공유한다. 또한, 그래픽 시스템은 비주얼 API 계층의 애니메이션 성능을 노출 및 확장하며, 이는 레벨들 간에 대부분 공유된다.
또한, 이하 설명하는 바와 같이, 벡터 그래픽 시스템은 엘리먼트 레벨과 자원 레벨을 포함하는 레벨 또는 서로 다른 프로그램을 프로그래밍할 수 있다. 엘리먼트 레벨에서, 각각의 드로잉 형상은 페이지/스크린 내의 나머지 프로그래밍가능한 엘리먼트들과 동일한 레벨에서의 엘리먼트로서 나타난다. 이는 형상이 프리젠터 시스템, 이벤트, 및 속성과 함께 전체적으로 상호 작용함을 의미한다. 자원 레벨에서, 벡터그래픽 시스템은 종래 그래픽 메타파일과 유사하게 순수한 자원 포맷에서 동작한다. 자원 레벨은 효율적이지만, 중첩 속성, 이벤트 및 정밀(fine-grained) 프로그래밍 가능성을 다소 제한적으로 지원한다. 따라서, 그 장면 설계자는 요구되는 프로그래밍 가능성을 효율적으로 균형잡을 수 있는 능력을 갖는다.
본 발명의 일 양태에 대하여 계속 설명하면, 일 실시예에서, 자원 레벨 마크업이 비주얼 브러쉬로서 표현된다는 점에서 자원 레벨에서의 벡터 그래픽 시스템은 또한 비주얼 API 계층에 상관한다. 자원 마크업이 구문 분석될 때, 비주얼 오브젝트가 생성된다. 비주얼 오브젝트는 형상, 제어 및 동일 엘리먼트 레벨에서의 다른 엘리먼트에 의해 이용될 수 있는 비주얼 브러쉬로 설정된다.
도 25는 엘리먼트 클래스 계층(2500)의 엘리먼트 표현이다. 본 발명의 마크업 언어오브젝트 모델의 클래스는 음영된 박스에 의해 나타내며, 형상 클래스(2502), 이미지 클래스(2504), 비디오 클래스(2506), 캔버스 클래스(2508)를구비한다. 형상 클래스의 엘리먼트는 사각형(2510), 다중선(2512), 다각형(2514), 경로(2516), 선(2518), 및 타원(2520)을 구비한다. 일부 실시예에서는, 도 25의 점선 박스(2522)에 의해 표시되는 바와 같이 원 엘리먼트는 나타내지 않을 수 있지만, 여기서 다양한 실시예의 목적을 위해서, 원 엘리먼트(2522)을 설명하고자 한다. 각 엘리먼트는 채움(속성) 데이터, 스트로크 데이터, 클립핑 데이터, 변형 데이터, 필터 효과 데이터 및 마스크 데이터를 포함하거나 이들에 관련될 수 있다.
이하 설명되는 바와 같이, 형상들은 전승되고 중첩되는 프리젠테이션 속성으로 도시되는 기하학에 대응한다. 그 프리젠테이션 속성은 형상을 드로잉하는 데 필요한 펜과 브러쉬를 구성하는데 사용된다. 일 실시예에서, 형상은 다른 제어엘리먼트과 같이 전체 프리젠터이다. 그러나, 다른 실시예에서는, 캔버스 클래스(2508)는 형상에 대한 컨테이너로서 제공될 수 있으며, 형상은 캔버스 엘리먼트에 있는 경우에만 드로잉될 수 있다. 예를 들면, 형상을 가볍게 하기 위해서, 형상에는 프리젠터가 첨부될 수 없을 것이다. 캔버스 엘리먼트는 이하 상세히 설명하고자 한다.
또한, 이하 설명하는 바와 같이, 이미지 클래스는 형상보다 구체적이며, 예를 들면 복잡할 수 있는 경계 데이터를 포함할 수 있다. 예를 들면, 경계는 상부에 하나의 색으로서 규정되고, 측면에는 다른 색으로 되며, 여러 규정된 두께와 다른 속성 세트들이 가능하다. 텍스트 또는 비디오와 같은 이미지 또는 유사 박스엘리먼트에 대하여 위치, 크기 회전 및 스케일이 설정될 수 있다. 이미지 및 비디오 엘리먼트는 캔버스 엘리먼트의 외부에 존재하여 나타낼 수 있으며, 예를 들면,BoxedElement로부터 전승되어 그 엘리먼트으로부터 배경, 경계, 패딩(padding) 지원을 획득할 수 있다.
비디오 엘리먼트는 표시되는 엘리먼트 내에서 비디오(또는 유사한 멀티미디어)가 재생될 수 있게 한다. 이러한 방식으로, 벡터 그래픽 시스템은 마크업 인터페이스를 텍스트, 2D 그래픽, 3D 그래픽, 애니메이션, 비디오, 및 이미지와 오디오를 포함하는 멀티미디어에 대하여 완전하게 부합하는 API 계층에 제공한다. 이는 하나의 매체에서 작업하는 것을 배운 설계자에게 다른 매체를 애플리케이션과 문서에 용이하게 통합할 수 있게 한다. 벡터 그래픽 시스템은 또한 멀티미디어가 다른 엘리먼트과 동일한 방식으로 동작되게 하고, 설계자가 다른 엘리먼트과 같이 멀티미디어를 이용할 수 있게 하지만 개별 매체타입 각각의 코어 내재적 고유성을 희생시키지는 않는다. 예를 들면, 설계자는 서로 다른 매체타입에 걸쳐서 회전, 스케일링, 애니메이팅, 그림, 합성, 및 다른 효과에 대한 동일한 명명법을 이용함으로써, 매우 많은 애플리케이션을 생성할 수 있을 뿐만 아니라 매우 유효한 렌더링과 이를 기반으로 구축되는 실시예를 구성할 수 있다.
도 26은 마크업 코드(2602)가 구문 분석기/번역기(2604)에 의해 설명되는 일실시예를 나타낸다. 통상적으로, 구문 분석기/번역기(2604)는 엘리먼트에 엘리먼트 트리/속성 시스템(208)(도 2에도 도시됨)을 추가하며, 이들 엘리먼트에 프리젠터를 첨부한다. 그 후, 프리젠터 시스템(210)은 첨부된 프리젠터로 엘리먼트 트리(210)을 취하여, 데이터를 오브젝트로 번역하고 비주얼 API 계층(212)을 호출한다. 모든 엘리먼트가 번역될 필요는 없으며, 단지 첨부된 프리젠터만이 번역됨에 주목하자.
통상적으로, 엘리먼트는 속성 시스템, 이벤팅 및 레이아웃/프리젠테이션 시스템 내에 관여하는 엘리먼트층 내의 오브젝트이다. 구문 분석기는 태그를 발견하며 이들 태그가 엘리먼트 또는 자원 오브젝트를 정의하는지를 결정한다. 비주얼 브러쉬의 특별한 경우에는, 예를 들면, 이들 태그가 표시되는 신택스에 의존하고, 복합 속성 신택스가 나타나는지에 의존하여, 동일한 태그가 엘리먼트로서 해석되거나 또한 자원 오브젝트로서 해석된다.
본 발명의 일 양태에 따라서, 마크업 언어는 단순 스트링 포맷 또는 복잡한 오브젝트 표현을 포함하는 자원을 기재하는 고유의 방식을 제공한다. 단순 스트링 포맷에서는, 구문 분석기/번역기(2604)는 스트링을 적절한 비주얼 API 오브젝트로 변환하는 타입 변환기(2608)를 사용한다. 예를 들면, 마크업의 다음 라인에서는, Fill 속성값이 타입 변형기(2608)에 의해 브러쉬 오브젝트로 변환될 수 있다.
파라미터의 단순 스트링을 갖는 이러한 태그 기반의 인라인 선의 변환은 브러쉬 오브젝트에서는 명확하며, 장면 설계자가 형상과 그 속성을 장면에 추가하는 간단한 방법을 제공한다.
그러나 Fill 속성이 단일 스트링에 맞추기에는 너무 복잡한 경우가 있다. 이러한 상황에서, 마크업에서 인라인일 수 있는 복합 속성 신택스가 이러한 속성을 설정하는 데에 이용된다. 예를 들면, 다음의 복합 속성 신택스가 여러 그래디언트스탑(gradient stop)(0에서 1 범위)으로 색들을 규정하여, 점진적으로 다소 진해지는 색으로 원을 채운다.
자원 인스턴스는 마크업에서 현재 인라인 뿐만 아니라, 다른 곳에도 위치될 수 있으며 (예를 들면, 원격 네트워크 및 적절하게 다운로드되거나 로컬일 수 있는 파일 또는 마크업), 명칭(예를 들면, 텍스트 명칭, 참조 또는 다른 적합한 식별자)에 의해 참조된다. 이러한 방식으로, 장면 설계자는 복합 속성 신택스에 의해 기술되는 엘리먼트들을 포함하는 장면에 걸쳐서 엘리먼트 트리에서의 엘리먼트를 재사용할 수 있다.
구문 분석기는 필요시 타입 변환기(2608)를 액세스하고 또한 규정된 파라미터를 오브젝트 속성에 매칭함으로써 복합 속성 신택스에서의 마크업을 다루어 장면 설계자에 대한 복잡성을 취급한다. 따라서, 구문 분석기는 오브젝트만을 설정하는 것이 아니라 오브젝트에 대한 속성도 설정한다. 오브젝트는 불변이기 때문에, 구문 분석기는 빌더를 실증하여 오브젝트를 생성함에 주목하자.
동일한 렌더링 모델이 엘리먼트 레벨과 API 레벨 간에 공유되기 때문에, 다수의 오브젝트들은 본질적으로 동일하다. 이는 구문 분석/번역을 매우 효율적이게하며, 또한 서로 다른 타입의 프로그래밍 언어(예를 들면, C#과 같은 언어)가 마크업에서 그 자체의 신택스으로 또는 그 역으로 용이하게 변환될 수 있게 한다. 도 26에 나타낸 바와 같이, 또다른 이러한 프로그래밍 언어(2610)가 엘리먼트 트리(208)에 엘리먼트를 추가하거나 비주얼 API 계층 (212)과 직접 인터페이스할 수 있다.
또한, 도 26에 나타낸 바와 같이, 본 발명의 일 양태에 따르면, 동일한 마크업(2602)이 엘리먼트 레벨과 자원 레벨을 프로그래밍하는 데에 이용될 수 있다. 상술한 바와 같이, 엘리먼트 레벨은 장면 설계자에게 전체 프로그래밍 가능성, 전승(예를 들면, 스타일시트(style-sheet) 유사의 특성)을 제공하는 속성시스템의 사용, 및 이벤팅(예를 들면, 엘리먼트가 사용자 입력 이벤트에 대응하여 그 외관, 위치 등을 변경하는 첨부 코드를 가질 수 있게 함)을 부여한다. 그러나, 본 발명은 또한 장면 설계자가 엘리먼트 트리와 프리젠터 시스템을 실질적으로 단축하여 비주얼 API 계층에 직접 프로그램할 수 있다. 정적 형상, 이미지 등의 많은 타입에서는, 엘리먼트 레벨특성이 요구되지 않으며, 이는 적절한 오브젝트를 출력하는데 보다 효율적이고 경량의 방법을 제공한다. 이를 위해서, 구문 분석기는 "비주얼 브러쉬" 타입의 채움이 존재하는 경우, 자원 레벨 데이터(2612)를 갖는 API 계층(212)를 직접 호출하여 오브젝트를 생성한다. 즉, 도 22에 나타낸 바와 같이, 엘리먼트 레벨 벡터 그래프는 생성되는 엘리먼트에 구문 분석되며, 이는 후에 오브젝트로 번역되는 반면, 자원 레벨벡터 그래프는 구문 분석되어 효과적인 방식으로 직접 저장된다.
예를 들면, 다음의 마크업이 LinearGradient 오브젝트에 대한 오브젝트 모델로부터 직접 유도되어 VisualBrush로 외부 원을 채운다. 그 VisualBrush의 컨텐츠는 내부 마크업에 의해 정의된다. 이 신택스는 여러 브러쉬, 변형 및 애니메이션을 표현하는데 주로 사용된다.
이들 비주얼 블러시가 채워진 오브젝트들은 효율적으로 저장되지만, 자원 레벨 데이터(또는 그에 의해 생성되는 오브젝트)는 도 26에 주로 나타낸 바와 같이 엘리먼트들과 엘리먼트트리(208)의 일부에 의해 참조될 수 있다. 이를 위해서, 이들 비주얼 브러쉬 자원들은 복합 속성신택스에 의해 기재되는 다른 자원과 같이 (예를 들면, 명칭, 참조, 또는 다른 적합한 식별자에 의해) 명명되어 참조된다.
캔버스의 설명에 있어서는 한 대체 실시예에서 전술한 바와 같이 형상은 경량으로 유지될 수 있으며, 따라서 캔버스에 포함되도록 요구될 수 있다. 이 대체 실시예에서 콘텐츠는 렌더링 시에 연관 좌표 시스템을 가진 무한, 장치 비종속 캔버스 상에 렌더링된다. 따라서, 캔버스 요소는 절대 좌표에 따라 콘텐츠를 배치할 수 있다. 캔버스 요소는 선택적으로 뷰포트를 정의할 수 있으며, 클립핑, 변환, 선호 종횡비 및 뷰포트를 페어런트 공간에 맵핑하는 방법을 지정한다. 뷰포트가 정의되지 않은 경우, 캔버스 요소는 드로잉 원시 함수들의 그룹화만을 지정하며,변환, 불투명도 및 다른 복합 속성을 정의할 수 있다.
다음은 샘플 캔버스에 대한 마크업 예이다.
일 실시예에서, 단위 없이 좌표가 지정될 때 이들 단위는 1 인치의 1/96의 "논리 화소들"로 간주되며, 전술한 예에서 라인은 200 화소 길이이다. 좌표 외에 다른 특성으로는 폭, 높이 수평 및 수직 정렬 및 뷰박스(직사각형; 디폴트는 조정이 되지 않는 것을 의미하는 미설정 또는 (0, 0, 0, 0)이며, 스트레치 및 정렬 특성은 무시된다) 등이 있다. 도 18-20을 참조하여 전술한 바와 같이, 다른 특성에는 스트레치가 있는데, 이 스트레치는 미지정시 최초 크기를 유지하거나, 1) 종횡비가 유지되지 않고 콘텐츠가 상/좌/폭/높이에 의해 정의되는 경계를 채우도록 스케일링되는 "채움"을 지정하거나, 2) 화상이 상/좌/폭/높이에 의해 정의되는 경계에 맞을 때까지 크기를 균일하게 스케일링하는 균일(uniform)을 지정하거나, 3) 상/좌/폭/높이에 의해 정의되는 경계를 채우도록 크기를 균일하게 스케일링하고 필요에 따라 클립하는 UniformToFill을 지정할 수 있다.
더 낮은 레벨의 오브젝트 모델과 더 상관되기 위하여, 변환 특성은 요소의 차일드에 대해 새로운 좌표 프레임을 정의하며, 클립 특성은 콘텐츠가 캔버스 상에 드로잉될 수 있는 영역을 제한하는데, 디폴트 클립핑 경로는 바운딩 박스로 정의된다. ZIndex 특성은 패널 내의 중첩 캔버스 요소들에 대한 렌더링 순서를 지정하는데 사용될 수 있다.
뷰박스는 예컨대 뷰포트의 크기 및 원점을 재정의함으로써 콘텐츠에 대해 새로운 좌표 시스템을 지정한다. 스트레치는 이들 콘텐츠가 뷰포트로 맵핑되는 방법을 지정하는 것을 돕는다. 뷰박스 속성의 값은 예컨대 여백 및/또는 콤마로 분리된 4개의 "단위없는" 숫자 <min-x>, <min-y>, <width> 및 <height>의 리스트이고, 직사각형이다. 뷰포트 직사각형은 바운딩 박스로 맵핑되는 사용자 공간에 직사각형을 지정한다. 이것은 scaleX와 scaleY를 삽입하는 것과 동일하게 이루어진다. 스트레치 특성은(옵션이 none이 아닌 경우) 그래픽의 종횡비를 유지하기 위한 추가적인 제어를 제공한다. 특정 효과를 달성하기 위하여 주어진 요소의 차일드에 대해 추가적인 변환이 이루어진다.
전술한 예에서, 각 스트레치 규칙 하에서 상기 마크업 샘플 내의 직사각형의 유효 결과는 다음과 같다:
None - (100, 600)에서 (200, 650)까지
Fill - (100, 100)에서 (900, 700)까지
Uniform - (100, ?)에서 (900, ?)까지 - 새로운 높이는 400이고, HorizontalAlign 및 VerticalAlign에 기초하여 센터링된다.
UniformToFill - (?, 100)에서 (?, 700)까지 -새로운 폭은 1200이고, HorizontalAlign 및 VerticalAlign에 기초하여 다시 센터링된다.
캔버스에 대한 변환이 있는 경우, 기본적으로 (예컨대 트리에서) 뷰박스로의 맵핑 위에 변환이 이루어진다. 이 맵핑은 형상만이 아니라 캔버스 내의 임의의 요소, 예컨대 박스, 텍스트 등을 스트레칭하게 된다는 점에 유의한다. 또한, 뷰박스가 지정되면, 캔버스는 그 콘텐츠에 맞추어지지 않고 특정 크기를 갖는다는 점에도 유의한다. y-width과 y-height도 지정되면, 스트레치/정렬 특성은 뷰박스를 특정 폭 및 높이에 맞추는 데 사용된다.
오브젝트 모델 내의 요소들 각각은 'Clip' 속성이 적용될 수 있다. 일부 요소, 특히 형상에 대해 이것은 공통 언어 실행 시간 특성으로서 직접 노출되지만, 다른 것들(예컨대 대부분의 제어)에 대해서 이 특성은 DynamicProperty를 통해 설정된다.
일반적으로, 클립핑 경로는 도 27에 일반적으로 표시된 바와 같이 콘텐츠가 그려질 수 있는 영역을 제한하는데, 도 27에는 버튼이 클립되지 않은 형태(2702)와 클립핑 경로가 특정된 형태(2704)(점선은 클립핑 경로를 나타냄)로 도시되어 있다. 개념적으로, 현재 활성화된 클립핑 경로에 의해 경계가 정해지는 영역의 외측에 위치하는 드로잉의 어느 부분도 도시되어 있지 않다. 클립핑 경로는 마스크로 간주될 수 있는데, 클립핑 경로 외측의 화소들은 0의 알파 값을 가진 블랙이고, 클립핑 경로 내측의 화소들은 1의 알파 값을 가진 화이트이다(실루엣의 에지를 따른 안티-에일리어싱은 예외일 수 있음).
클립핑 경로는 인라인 또는 자원 섹션에서 더 일반적으로 기하 오브젝트에 의해 정의된다. 클립핑 경로는 아래의 예에 나타난 바와 같이 요소 상의 "클립"특성을 이용하여 이용되거나 참조된다.
클립을 애니메이션화하는 것은 변환을 애니메이션화하는 것과 유사하다:
'기하' 데이타 및 경로 요소 상의 Fill, Stroke 및 StrokeWidth와 같은 렌더링 특성을 지정함으로써 경로가 드로잉된다. 경로에 대한 예시적인 마크업이 다음과 같이 지정된다:
경로 '데이타' 스트링은 기하 형태이다. 그려진 경로를 특정하는 더 상세하고 완전한 방법은 전술한 바와 같이 복합 속성 신택스 통해서이다. 마크업은 (아래 예에서와 같이) 전술한 기하 구축 클래스로 직접 제공된다.
경로 데이타 스트링은 또한 경로 데이타 스트링에 대한 신택스를 설명하기 위한 아래의 기호를 이용하여 설명된다:
* : 0 또는 그 이상
+ : 1 또는 그 이상
? : 0 또는 1
() : 그룹화
| : 올터너티브(alternative)를 분리
이중 인용 부호가 리터럴(literal)을 둘러싼다.
다음은 상기 기호로 설명된 경로 데이타 스트링 정보를 나타낸다(일 실시예에서 요소 레벨에서의 속성 대신에 FillMode가 지정될 수 있다는 점에 유의).
이미지 엘리먼트(도 25)는, 완전한 파일의 컨텐츠가 현재 사용자 좌표 시스템 내에서 주어진 직사각형으로 렌더링되는 것을 표시한다. (이미지 태그에 의해 표시되는) 이미지는 다음의 예시에서와 마찬가지로 "image/wvg"의 MIME 타입을 갖는 파일이거나, PNG 또는 JPEG와 같은 래스터 이미지 파일에 적용될 수 있다.
아래의 테이블은 이미지들에 대한 예시적인 속성들에 대한 정보를 제공한다.
명칭 |
타입 |
R/RW |
디폴트 값 |
설명 |
Top |
BoxUnit |
|
|
이미지의 상면의 좌표 |
Left |
BoxUnit |
|
|
이미지의 좌측면의 좌표 |
Width |
BoxUnit |
|
|
이미지의 폭 |
Height |
BoxUnit |
|
|
이미지의 높이 |
Source |
ImageData |
|
|
이미지의 소스 |
Dpi |
Float |
|
96 (?) |
크기 결정위해 사용할 타겟 DPI |
HorizontalAlign |
enum {Left (?),Center (?),Right (?)} |
|
Center |
|
VerticalAlign |
enum {Top (?),Middle (?),Bottom (?)} |
|
Middle |
|
Stretch |
enum Stretch{None,Fill,Uniform,UniformToFill} |
|
None |
None: 원크기를 보전함.Fill: 종횡비는 보전되지 않으며, 컨텐츠는 tlbh에 의해 형성된 경계를 채우도록 스케일링됨Uniform: 이미지가 tlwh에 의해 형성된 경계에 맞을 때까지 크기를 균일하게 스케일링함.UniformToFill: tlbh에 의해 형성되고 클립핑된 경계를 채울 때까지 크기를 균일하게 스케일링함 |
ReadyState |
enum {MetaDataReady,Loading,LoadedLoadError} |
|
|
|
LoadCounter |
Int |
Read |
Null |
ReadyState가 로딩하고 있는 때에 증가하는 카운터 |
Name |
String |
|
|
이미지에 대한 대체 텍스트 |
위에서 기술한 바와 같이, 형상들은, 전승되고 캐스캐이드된 표현 속성 을 갖고 드로잉된 도형에 대응한다. 아래의 표는 앞서 설명한 기본적인 형상 엘리먼트들(직사각형, 타원, 선, 다중선, 다각형)에 대한 예시적인 형상 속성을 나타낸다. 이러한 기본적인 형상들은 스트로크 속성, 채움 속성을 가질 수 있고, 클립핑 경로로 사용될 수 있으며, 전승 특성을 가질 수 있을 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용될 수 있다.
명칭 |
타입 |
R/RW |
디폴트 값 |
설명 |
Fill |
Brush |
RW |
null |
직사각형의 상면에 대한 좌표 |
FillOpacity |
Float |
RW |
1.0 |
직사각형의 좌측면에 대한 좌표 |
Stroke |
Brush |
RW |
null |
직사각형의 폭 |
StrokeOpacity |
Float |
RW |
1.0 |
직사각형의 높이 |
StrokeWidth |
BoxUnit |
RW |
1px |
스트로크의 폭 (1px=1/96 인치) |
FillRule |
enum {EvenOdd,NonZero} |
RW |
EvenOdd |
FillRule은 캔버스의 어떤 부분이 형상 안에 포함되는지를 결정하는 데에 사용되는 알고리즘을 표시함. |
StrokeLineCap |
enum {Butt,Round,Square,Diamond} |
RW |
Butt |
StrokeLineCap은 개방형 서브-경로가 스트로크될 때 개방형 서브-경로의 마지막에 사용되는 형상을 특정함. |
StrokiLineJoint |
enum {Miter,Round,Bevel} |
RW |
Miter |
StrokiLineJoint는 경로의 코너 또는 다른 벡터 형상이 스트로크될 때 스트로크되는 다른 벡터 형상 또는 경로의 코너에 사용되는 형상을 특정함. |
StrokeMiterLimit |
Float |
RW |
4.0 |
StrokeWidth까지 MiterLength의 비율에 대한 한계, 1보다 크거나 같은 값 |
StrokeDashArray |
PointList |
RW |
null |
StrokeDashArray는 스트로크 경로에 사용되는 갭 또는 대시(dash)의 패턴을 제어함. <dasharray>는 사용자 유닛에서 교대의 대시 및 갭의 길이를 지정하는 콤마 또는 공백으로 분리된 <number>들의 리스트를 포함함. 홀수개의 값이 제공되면, 값의 리스트는 짝수개의 값을 내도록 반복됨. 따라서, stroke-dasharrary: 5 3 2는 stroke-dasharrary: 5 3 2 5 3 2 와 동등함. |
StrokeDashOffset |
Point |
RW |
|
StrokeDashOffset는 대시를 시작하기 위해 대시 패턴으로의 거리를 특정함. |
Transform |
Transform |
RW |
null |
Transform는 엘리먼트의 차일드에 대한 새로운 좌표 프레임을 형성함. |
Clip |
Geometry |
RW |
null |
Clip은 페인트가 캔버스에 가해질 수 있는 영역을 제한함. 디폴트 클립핑 경로는 바운딩 박스로 정의됨. |
아래 표는 직사각형에 대한 마크업 신택스를 예시한다.
직사각형은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (직사각형은 판독/기입이고, 제로와 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
Top |
BoxUnit |
직사각형의 상면에 대한 좌표 |
Left |
BoxUnit |
직사각형의 좌측면에 대한 좌표 |
Width |
BoxUnit |
직사각형의 폭 |
Height |
BoxUnit |
직사각형의 높이 |
RadiusX |
BoxUnit |
둥글게 된 직사각형에 대하여, 직사각형의 코너를 둥글게 하기 위해 사용되는 타원의 X축 반지름, 음의 X측 반지름이 지정되면, 반지름의 절대값이 사용됨. |
RadiusY |
BoxUnit |
둥글게 된 직사각형에 대하여, 직사각형의 코너를 둥글게 하기 위해 사용되는 타원의 Y축 반지름, 음의 Y측 반지름이 지정되면, 반지름의 절대값이 사용됨. |
아래의 표는 원에 대한 마크업 신택스를 예시한다.
원은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (원은 판독/기입이고, 제로와 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
CenterX |
BoxUnit |
원 중심의 X 좌표 |
CenterY |
BoxUnit |
원 중심의 Y 좌표 |
Radius |
BoxUnit |
원의 반지름 |
아래의 표는 타원에 대한 마크업 신택스를 예시한다.
타원은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (타원은 판독/기입이고, 제로와 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
CenterX |
Coordinate |
타원 중심의 X 좌표 |
CenterY |
Coordinate |
타원 중심의 Y 좌표 |
RadiusX |
Length |
타원의 X축 반지름. 음의 X축 반지름이 지정되면, 반지름의 절대값이 사용됨. |
RadiusY |
Length |
타원의 Y축 반지름. 음의 Y축 반지름이 지정되면, 반지름의 절대값이 사용됨. |
아래의 표는 선에 대한 마크업 신택스를 예시한다.
선은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (선은 판독/기입이고, 제로와 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
X1 |
BoxUnit |
선의 시작점의 X축 좌표, 디폴트 값은 "0". |
Y1 |
BoxUnit |
선의 시작점의 Y축 좌표, 디폴트 값은 "0". |
X2 |
BoxUnit |
선의 종결점의 X축 좌표, 디폴트 값은 "0". |
Y2 |
BoxUnit |
선의 종결점의 Y축 좌표, 디폴트 값은 "0". |
'다중선'은 연결된 직선 세그먼트의 세트를 정의한다. 전형적으로, '다중선'은 개방형 형상을 정의한다.
아래의 표는 다중선에 대한 마크업 신택스를 예시한다.
다중선은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (다중선은 판독/기입이고, 널(null)과 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
Points |
PointCollection |
다중선을 구성하는 점들. 좌표값들은 사용자 좌표 시스템 내에 있음. |
다각형 엘리먼트는 연결된 직선 조각들의 세트으로 구성된 폐쇄형 형상을 정의한다. 아래의 표는 다각형에 대한 마크업 신택스를 예시한다.
다각형은 오브젝트 모델에서 다음과 같은 속성을 갖는다. (다중선은 판독/기입이고, 널과 동일한 디폴트 값을 가지며, 전승을 지원할 뿐 아니라, 엘리먼트 및 자원 레벨 모두에 적용된다.)
명칭 |
타입 |
설명 |
Points |
PointCollection |
다각형을 구성하는 점들. 좌표값들은 사용자 좌표 시스템 내에 있음. 홀수개의 좌표가 제공되면, 엘리먼트는 에러 상태에 있음. |
'다중선' 및 '다각형'에서의 점 지정에 대한 신택스는 아래 표와 같은 표시법을 사용하여 기술된다.
*: 0 or more+: 1 or more?: 0 or 1(): 그룹화(grouping)|: 대안들을 분리함(separates alternatives)겹따옴표는 리터럴을 둘러쌈 (double quotes surround literals) |
아래의 표에서는 위 표시법을 사용하여 '다중성' 및 '다각형'에서의 점 지정을 기술한다.