KR20060123029A - 실시간 잉킹 - Google Patents

실시간 잉킹 Download PDF

Info

Publication number
KR20060123029A
KR20060123029A KR1020057012369A KR20057012369A KR20060123029A KR 20060123029 A KR20060123029 A KR 20060123029A KR 1020057012369 A KR1020057012369 A KR 1020057012369A KR 20057012369 A KR20057012369 A KR 20057012369A KR 20060123029 A KR20060123029 A KR 20060123029A
Authority
KR
South Korea
Prior art keywords
plug
information
component
ink
renderer
Prior art date
Application number
KR1020057012369A
Other languages
English (en)
Other versions
KR101085730B1 (ko
Inventor
스티브 도지
알렉산더 제이. 콜미코브-조토브
아린 제이. 골드버그
브리게트 크랜츠
카릴 펠드맨
매노즈 케이. 비스와스
루돌프 발라즈
피차이아 쉔바갈락쉬미
Original Assignee
마이크로소프트 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 마이크로소프트 코포레이션 filed Critical 마이크로소프트 코포레이션
Publication of KR20060123029A publication Critical patent/KR20060123029A/ko
Application granted granted Critical
Publication of KR101085730B1 publication Critical patent/KR101085730B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/03Arrangements for converting the position or the displacement of a member into a coded form
    • G06F3/033Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor
    • G06F3/038Control and interface arrangements therefor, e.g. drivers or device-embedded control circuitry
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/048Interaction techniques based on graphical user interfaces [GUI]
    • G06F3/0487Interaction techniques based on graphical user interfaces [GUI] using specific features provided by the input device, e.g. functions controlled by the rotation of a mouse with dual sensing arrangements, or of the nature of the input device, e.g. tap gestures based on pressure sensed by a digitiser
    • G06F3/0488Interaction techniques based on graphical user interfaces [GUI] using specific features provided by the input device, e.g. functions controlled by the rotation of a mouse with dual sensing arrangements, or of the nature of the input device, e.g. tap gestures based on pressure sensed by a digitiser using a touch-screen or digitiser, e.g. input of commands through traced gestures
    • G06F3/04883Interaction techniques based on graphical user interfaces [GUI] using specific features provided by the input device, e.g. functions controlled by the rotation of a mouse with dual sensing arrangements, or of the nature of the input device, e.g. tap gestures based on pressure sensed by a digitiser using a touch-screen or digitiser, e.g. input of commands through traced gestures for inputting data by handwriting, e.g. gesture or text
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/12Digital output to print unit, e.g. line printer, chain printer
    • G06F3/1201Dedicated interfaces to print systems
    • G06F3/1202Dedicated interfaces to print systems specifically adapted to achieve a particular effect
    • G06F3/1203Improving or facilitating administration, e.g. print management
    • G06F3/1204Improving or facilitating administration, e.g. print management resulting in reduced user or operator actions, e.g. presetting, automatic actions, using hardware token storing data
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/12Digital output to print unit, e.g. line printer, chain printer
    • G06F3/1201Dedicated interfaces to print systems
    • G06F3/1202Dedicated interfaces to print systems specifically adapted to achieve a particular effect
    • G06F3/1203Improving or facilitating administration, e.g. print management
    • G06F3/1206Improving or facilitating administration, e.g. print management resulting in increased flexibility in input data format or job format or job type
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/12Digital output to print unit, e.g. line printer, chain printer
    • G06F3/1201Dedicated interfaces to print systems
    • G06F3/1223Dedicated interfaces to print systems specifically adapted to use a particular technique
    • G06F3/1237Print job management
    • G06F3/126Job scheduling, e.g. queuing, determine appropriate device
    • G06F3/1263Job scheduling, e.g. queuing, determine appropriate device based on job priority, e.g. re-arranging the order of jobs, e.g. the printing sequence
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/12Digital output to print unit, e.g. line printer, chain printer
    • G06F3/1201Dedicated interfaces to print systems
    • G06F3/1278Dedicated interfaces to print systems specifically adapted to adopt a particular infrastructure
    • G06F3/1284Local printer device
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/451Execution arrangements for user interfaces
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06VIMAGE OR VIDEO RECOGNITION OR UNDERSTANDING
    • G06V30/00Character recognition; Recognising digital ink; Document-oriented image-based pattern recognition
    • G06V30/10Character recognition
    • G06V30/14Image acquisition
    • G06V30/142Image acquisition using hand-held instruments; Constructional details of the instruments
    • G06V30/1423Image acquisition using hand-held instruments; Constructional details of the instruments the instrument generating sequences of position coordinates corresponding to handwriting

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Software Systems (AREA)
  • Multimedia (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Computer Hardware Design (AREA)
  • User Interface Of Digital Computer (AREA)
  • Computer And Data Communications (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)
  • Processing Or Creating Images (AREA)
  • Stored Programmes (AREA)
  • Character Discrimination (AREA)

Abstract

전자 잉크의 원활한 흐름을 보증하기 위한 시스템 및 프로세스가 기술되어 있다. 다이내믹 렌더링이 다른 이벤트 핸들러들에 비하여 우선 순위를 갖게 된다. 우선 순위는 이벤트들이 발생하고 다른 단계들 전에 다이내믹 렌더링을 수행할 수 있을 때 주문에 의하여 하나 이상의 큐를 사용하는 것일 수 있다.
화상 처리, 전자 잉크, 다이내믹 렌더링, 스타일러스, 플러그인

Description

실시간 잉킹{REAL-TIME INKING}
[관련 출원 정보]
이 출원은 2003년 10월 24일자 출원된, "Tablet Platform Controls and APIs"라는 제명의 미국 출원 번호 60/513,591의 우선권을 주장하며, 이 관련 출원의 내용은 본 명세서에 참고로 명백히 통합된다.
본 발명의 양태들은 화상 처리 및 정보 조작에 관한 것이다. 보다 구체적으로, 본 발명의 양태들은 전자 잉크 정보(electronic ink information)의 수신 및 핸들링에 관한 것이다.
전형적인 컴퓨터 시스템, 특히 마이크로소프트 윈도즈와 같은 그래픽 사용자 인터페이스(GUI) 시스템을 이용하는 컴퓨터 시스템은, 텍스트를 입력하기 위한 키보드와 같은 하나 이상의 개별 입력 장치, 및 사용자 인터페이스를 구동하기 위한 하나 이상의 버튼을 갖는 마우스와 같은 포인팅 장치로부터의 사용자 입력을 받아들이기 위해 최적화되어 있다. 유비쿼터스 키보드 및 마우스는 문서, 스프레드시트, 데이터베이스 필드, 그림, 사진 등의 신속한 생성 및 변경을 제공한다. 그러나, 비컴퓨터(즉, 표준) 펜 및 종이와 비교할 때 키보드 및 마우스 인터페이스에 의해 제공되는 유연성(flexibility)에는 상당한 차이가 있다. 표준 펜 및 종이를 이용하여, 사용자는 문서를 편집하고, 여백에 주(notes)를 기록하고, 그림 및 다른 형상들을 그리는 등등을 행한다. 어떤 경우에, 사용자는 스크린 상에서 문서를 리뷰하기보다는 펜을 이용하여 문서에 마크업(mark-up)하기를 선호할 수 있다. 왜냐하면 펜을 이용할 경우 키보드 및 마우스 인터페이스의 범위 외부에 자유로이 주를 달 수 있기 때문이다.
사용자는 펜으로 기록할 때 펜 끝으로부터 잉크가 흘러 나오기를 기대한다. 전자 잉크 영역에서도, 유사한 목적이 존재한다. 펜 또는 스타일러스로부터 전자 잉크가 흘러 나오는 것을 방해하는 하나의 문제점은 전자 잉크가 어떻게 핸들링되는가 하는 것이다.
이전의 방법들은 잉킹의 모든 양태들을 동시에 핸들링하려고 시도하였다. 일단 잉크 정보가 존재하면, 이전의 방법들은 여러 처리들 중에서도 특히, 잉크를 렌더링하고, 제스처들을 찾고, 그 잉크 정보와 다른 잉크 정보를 결합시키고, 잉크를 인식하고, 잉크의 외관을 매끄럽게 하려고 시도하였다. 이러한 처리들로 인해 사용자에게 잉크를 디스플레이하는 데 지연이 발생하고, 그로 인해 사용자가 더 많은 잉크를 입력하려면 대기해야 하고, 보다 중요한 것은, 전자 스타일러스의 팁으로부터 잉크가 흘러 나오는 환영이 줄어들거나 없어지게 된다.
[간략 개요]
본 발명의 양태들은 위에 언급된 문제점들 중 하나 이상을 다룸으로써, 스타일러스로부터의 잉크의 흐름을 제공한다. 사용자의 동작과 전자 잉크의 디스플레이 간의 지연을 줄이기 위한 처리 흐름에서 다이내믹 렌더 객체(dynamic render object)가 여기저기 옮겨질 수 있다.
이들 및 다른 양태들은 도면들 및 관련 설명과 관련하여 다루어진다.
도 1A는 본 발명의 특정 양태들이 구현될 수 있는 범용 디지털 컴퓨팅 환경의 개략도를 예시한다.
도 1B 내지 1M은 본 발명의 하나 이상의 양태들을 지원하는 범용 컴퓨터 환경을 도시한다.
도 2는 본 발명의 양태들에 따른 스타일러스 기반 입력 시스템에 대한 디스플레이를 도시한다.
도 3은 본 발명의 양태들에 따라서 전자 잉크의 흐름을 핸들링하기 위한 시스템을 도시한다.
도 4는 본 발명의 양태들에 따라서 전자 잉크의 흐름을 핸들링하기 위한 대안적인 방법을 도시한다.
도 5는 본 발명의 양태들을 지원할 수 있는 객체 모드를 도시한다.
도 6은 본 발명의 양태들에 따라서 전자 잉크를 핸들링하기 위한 시스템을 도시한다.
도 7은 본 발명의 양태들에 따라서 전자 잉크를 핸들링하기 위한 시스템을 도시한다.
도 8A 및 8B는 본 발명의 양태들에 따라서 입력 큐 및 출력 큐를 이용하기 위한 다양한 방법들을 도시한다.
도 9 및 10은 본 발명의 양태들에 따라서 전자 잉크를 핸들링하기 위한 시스템을 생성하고 이용하기 위한 방법들을 도시한다.
도 11은 본 발명의 양태들에 따라서 잉크 수집 객체를 변경하기 위한 프로토콜을 갖는 시스템을 도시한다.
도 12는 본 발명의 양태들에 따라서 부가적인 큐를 갖는 시스템을 도시한다.
도 13은 본 발명의 양태들에 따라서 분리된 실시간 스타일러스 컴포넌트들을 갖는 시스템을 도시한다.
도 14는 본 발명의 양태들에 따라서 제스처 인식기가 얼마나 깊이 제스처들을 찾을 수 있는지를 도시한다.
도 15는 본 발명의 양태들에 따라서 예외 처리를 위한 시스템을 도시한다.
도 16은 본 발명의 양태들에 따라서 관리 및 비관리 코드(managed and unmanaged code)를 도시한다.
도 17A 및 17B는 본 발명의 양태들에 따라서 동기화를 보증하기 위하여 데이터가 큐 내의 상이한 위치들에 어떻게 배치될 수 있는지를 도시한다.
도 18 및 19는 본 발명의 양태들에 따라서 펜 데이터를 핸들링하기 위한 다양한 시스템들을 도시한다.
도 20은 본 발명의 양태들에 따라서 큐를 도시한다.
본 발명의 양태들은 사용자에게 전자 잉크를 신속히 렌더링하기 위해 효율적인 방식으로 스타일러스 이벤트들을 핸들링하는 것과 관련이 있다.
이 명세서는 독자를 돕기 위해 섹션들로 나누어진다. 이들 섹션들은: 잉크의 특징, 용어, 범용 컴퓨팅 환경, 실시간 잉킹 개관, 객체 모델, 다이내믹 렌더링 및 왯 잉크, 제스처 인식, 동기식 및 비동기식 처리, 케스케이딩, 다이내믹한 플러그인 컬렉션 변경, 에러 전파, 관리/비관리 예시, 데이트 세트 및 흐름, 데이터 동기화, 및 애플리케이션 프로그래밍 인터페이스를 포함한다.
잉크의 특징
잉크 펜을 사용하는 사용자들에게 알려져 있는 바와 같이, 물리적 잉크(잉크통을 구비한 펜을 이용하여 종이 위에 칠해지는 종류)는 라인 세그먼트들에 의해 연결된 일련의 좌표들보다 더 많은 정보를 전달할 수 있다. 예를 들면, 물리적 잉크는 펜 압력(잉크의 두께에 의해), 펜 각도(라인 및 곡선 세그먼트들의 형상 및 불연속 점들 주위의 잉크의 작용(behavior)에 의해), 및 펜촉의 속도(곧은 정도, 라인 폭, 및 라인 또는 곡선의 진로에 걸친 라인 폭 변화에 의해)를 반영할 수 있다. 또 다른 예는 잉크가 칠해지는 종이의 섬유 또는 다른 표면에 잉크가 흡수되는 방법을 포함한다. 이들 미묘한 특징들은 또한 위에 열거된 특성들을 전달하는 데 도움이 된다. 이들 부가적인 특성들 때문에, 감정, 개성, 중요성 등이 점들 간의 균일한 라인 폭에 의한 것보다 더 즉시적으로 전달될 수 있다.
전자 잉크(또는 잉크)는 사용자가 스타일러스 기반 입력 장치를 사용할 경우 캡처되는 전자 정보의 캡처 및 디스플레이와 관련이 있다. 전자 잉크는 스크로크들의 시퀀스 또는 임의의 컬렉션을 가리키고, 여기서 각각의 스트로크는 일련의 점들로 구성된다. 스트로크들은 동시에 그려졌거나 모아졌을 수도 있고 또는 독립된 시간 및 위치들에서 독립된 이유로 그려졌거나 모아졌을 수도 있다. 점들은 데카르트 좌표(X, Y), 극좌표(r, θ)를 포함하는 각종 공지의 기법들, 및 이 분야에 공지된 다른 기법들을 이용하여 표현될 수 있다. 전자 잉크는 압력, 각도, 속도, 컬러, 스타일러스 사이즈, 및 잉크 불투명도를 포함하는 실제 잉크의 특성들의 표현을 포함할 수 있다. 전자 잉크는, 여러 정보 중에서도 특히, 페이지에 잉크가 어떻게 칠해졌는지의 순서(대부분의 서구 언어들에서는 좌에서 우로 그런 다음 아래로의 래스터 패턴), 타임스탬프(잉크가 언제 칠해졌는지를 나타냄), 잉크의 저자의 표시, 및 발원 장치(originating device)(그 위에 잉크가 그려진 머신의 식별 정보 또는 잉크를 칠하기 위해 사용된 펜의 식별 정보)
용어
잉크(Ink)
특성들을 갖는 스트로크들의 시퀀스 또는 세트. 스트로크들의 시퀀스는 순서화된 형태로 스트로크들을 포함할 수 있다. 이 시퀀스는 캡처된 시간에 의해 또는 페이지 상에서 또는 잉크의 저자에 의해 협조 위치들에서 스트로크들이 어디에 나타나는지에 의해 순서화될 수 있다. 다른 순서도 가능하다. 스트로크들의 세트는 스트로크들의 시퀀스들 또는 비순서화된 스트로크들 또는 그들의 임의의 조합을 포함할 수 있다. 또한, 어떤 특성들은 각각의 스트로크 또는 스트로크 내의 점에 고유할 수 있다(예를 들면, 압력, 속도, 각도 등). 이들 특성들은 잉크 레벨에서가 아니라, 스트로크 또는 점 레벨에서 저장될 수 있다.
잉크 객체(Ink object)
특성들을 갖거나 갖지 않는 잉크를 저장하는 데이터 구조
스트로크(Stroke)
캡처된 점들의 시퀀스 또는 세트. 예를 들면, 렌더링될 때, 점들의 시퀀스는 라인들로 연결될 수 있다. 대안적으로, 스트로크는 점과 다음 점의 방향으로의 벡터로서 표현될 수 있다. 요컨대, 스트로크는 점들의 기초를 이루는 표현(underlying representation of points) 및/또는 무엇이 그 점들을 연결하는지에 상관 없이, 잉크에 관한 점들 또는 세그먼트들의 임의의 표현을 두루 포함하도록 의도되어 있다.
점(Point)
공간 중의 한 위치를 정의하는 정보. 예를 들면, 점들은 캡처링 공간(예를 들면, 디지타이저 상의 점들), 가상 잉크 공간(캡처된 잉크가 배치되는 공간 내의 좌표), 및/또는 디스플레이 공간(디스플레이 장치의 점들 또는 화소들)과 관련하여 정의될 수 있다.
문서(Document)
볼 수 있는 표현 및 내용을 갖는 임의의 전자 파일. 문서는 웹 페이지, 워드 처리 문서, 노트 페이지 또는 패드, 스프레드시트, 비주얼 프리젠테이션, 데이터베이스 레코드, 이미지 파일, 및 그 조합들을 포함할 수 있다.
실시간 스타일러스(RealTimeStylus)
실시간 스타일러스는 주어진 윈도 입력 사각형 내의 주어진 윈도 핸들 상의 실시간 스타일러스 이벤트들을 제공하는 객체이다. 실시간 스타일러스는 또한 부가적인 기능들을 핸들링하는 플러그인 객체들을 부가할 프레임워크로서 간주될 수도 있다. 플러그인 객체들은 실시간 스타일러스의 원하는 기능이 변할 때 부가되거나 제거될 수 있다. 실시간 스타일러스에 대한 API는 RTS로 불릴 수 있다. RTS는 개발자들이 거기에 다른 기능들을 결합할 수 있는 코어 API 컴포넌트일 수 있다. RTS는 펜 서비스들로부터 오는 미가공 데이터(raw data)를 패키징하고 그 데이터를 제1 플러그인 객체(만일 있다면)에 전송한다. 실시간 스타일러스는 하나 이상의 인터페이스를 가질 수 있다. 인터페이스가 2개인 경우, 이들은 동기식 인터페이스 및 비동기식 인터페이스일 수 있다. 이들 인터페이스는 실시간 스타일러스에 플러그인들이 접속될 수 있는 위치들을 제공한다. 이들 인터페이스는 예시를 위한 것일 뿐이다. 다른 인터페이스들도 사용될 수 있다.
실시간 잉크(Real Time Ink)
실시간 잉크는 스타일러스의 팁으로부터 잉크가 흘러 나오는 환영이다. 종래의 방법들은 상당한 처리 단계들을 잉크의 렌더링과 결합시키려 시도하였고, 그에 따라 새로이 수신된 스트로크들의 디스플레이가 느려졌다. 실시간 잉크는 새로이 수신된 스트로크들이 수신될 때 그것들을 디스플레이로 푸시하려고 시도하고 실시간 처리 단계들과 실시간 디스플레이를 분리시켜 함께 동작하도록 시도함으로써, 사용자에게 보다 신속히 잉크를 디스플레이한다.
플러그인(Plug-in)
플러그인은 실시간 스타일러스 객체에 부가될 수 있는 기능 컴포넌트이다. 만일 플러그인이 실시간 스타일러스 객체의 동기식 인터페이스에 부착되면, 그것은 동기식 플러그인으로 불릴 수 있다. 만일 플러그인이 실시간 스타일러스 객체의 비동기식 인터페이스에 부착되면, 그것은 비동기식 플러그인으로 불릴 수 있다.
펜 서비스(Pen Service)
디지털 하드웨어 드라이버와 인터페이스 접속하고, 태블릿 기능(예를 들면, TabletAdded/Removed, StylusButtonUp/Down 등)에 여전히 관련이 있는 잉크 수집과 관계 없이 다른 통지들과 함께, 표준 "패킷" 및 관련 구조들로 해석된 원시 "패킷" 데이터를 제공하는 시스템 서비스 컴포넌트. 펜 서비스들은 플러그인 컬렉션에 의해 패킷들이 핸들링되도록 하는 주요 메커니즘을 제공한다.
플러그인 컬렉션(Plug-in Collection)
RTS에 부착되는, 하나 이상의 그룹으로 된, 플러그인들의 컬렉션. 2개의 컬렉션이 존재하는 경우, 그것들은 각각 RTS의 동기식 및 비동기식 인터페이스들과 관련될 수 있다. 각각의 컬렉션은 순서대로 실행될 수 있다. 2 이상의 컬렉션들이 존재할 경우, 그것들은 서로 관계 없이 실행될 수 있다. 왜냐하면 그것들은 RTS(또는 RTS들)의 서로 다른 인터페이스들에 부착될 수 있기 때문이다. 데이터는 각각의 플러그인에 의해 핸들링된 후에 RTS로 복귀한다. 컬렉션 내의 플러그인들의 순서는 컬렉션의 출력에 영향을 미칠 수 있다.
플러그인 컬렉션(Plug-in 체인)
플러그인들의 각각의 그룹이 직렬로 접속되어 있는 플러그인들의 체인. 여기서, 데이터는 RTS에 복귀하기 전에 체인 내의 각각의 플러그인을 통하여 진행한다. 이 체인은 또한 플러그인들의 "데이지 체인"(daisy chain)으로 불릴 수도 있다. 체인 또는 데이지 체인 내의 플러그인들의 순서는 체인의 출력에 영향을 미칠 것이다.
입력 큐(Input Queue)
동기식 플러그인 컬렉션 또는 플러그인 체인에 발생되어 그 동기식 플러그인 컬렉션 또는 플러그인 체인에 의해 재처리하기 위한 패킷들 또는 객체들에 대한 임시 보유 큐. 요컨대, 동기식 플러그인 컬렉션 또는 플러그인 체인은 객체들을 그 입력 큐에 푸시할 수 있다.
다이내믹 렌더링(Dynamic Rendering)
펜이 스크린을 터치하는 동안 잉크를 그리는 점진적 처리. 펜이 디지타이저를 가로질러 움직일 때 스크린 상에 "잉크"의 자국이 뒤에 남겨진다. 그 효과는 마치 잉크가 그려질 때 그것이 펜으로부터 흘러 나오는 것처럼 나타난다. 잉크는 데이터가 수신될 때 조금씩 그려진다. 렌더링은 또한 반 에일리어싱(anti-aliasing) 등과 같은 부가적인 효과들이 적용되도록 할 수 있다.
스태틱 렌더링(Static Rendering)
전체 잉크 스트로크를 한 번에 렌더링하는 처리. 잉크가 그려지기 전에 데이터는 이미 이용 가능하게 되어 있고 전체 스트로크는 단일 단위로서 그려진다. 스태틱 렌더링은 또한 바이자르 평활화(Bezier smoothing) 및 반 에일리어싱과 같은 부가적인 효과들이 적용되도록 할 수 있다.
다이내믹 렌더러(Dynamic Renderer)
개발자는 선택적으로 다이내믹 렌더러를 인스턴스화(instantiate)하여 GDI 렌더링 표면에 실시간 패킷 데이터의 고도로 효율적인 렌더링을 자동으로 제공할 수 있다. 본 발명의 양태들의 구현의 일부로서 제공된 GDI 중심 다이내믹 렌더러(GDI-centric DynamicRenderer)와 동일한 인터페이스 정의를 이용하여, DirectX 또는 플로터와 같이, 다른 렌더링 표면을 위한 다이내믹 렌더러들도 가능하다.
제스처 인식기(Gesture Recognizer)
개발자는 선택적으로 제스처 인식기를 인스턴스화하여 스트로크들의 실시간 인식을 수행하고 하나 이상의 스트로크들이 개발자가 관심을 표현한 제스처를 구성할 경우 보고할 수 있다. 제스처 인식기는, 사용될 경우에는, 동기식 또는 비동기식 컬렉션 또는 체인 내에 배치될 수 있다.
출력 큐(Output Queue)
일단 패킷이 객체들의 컬렉션 또는 체인을 통하여 흘러 나온(잠재적으로 변경된) 후에는, 그것은 출력 큐 내에 축적되고, 거기서 RTS는 그것을 비동기식 플러그인들의 컬렉션 또는 체인으로 송신한다.
잉크 수집 객체(InkCollectingObject)
실시간 스타일러스에 의해 제공된 잉크 데이터를 축적하고 저장하는 비동기식 플러그인 객체를 기술한다.
ICO
비동기식 컬렉션 또는 체인에 있을 수 있는 잉크 수집 객체. 그것은 출력 큐로부터 데이터를 수신한다.
범용 컴퓨팅 환경
도 1A는 본 발명이 실시될 수 있는 적당한 컴퓨팅 시스템 환경(100)의 일례를 예시한다. 컴퓨팅 시스템 환경(100)은 적당한 컴퓨팅 시스템 환경의 일례일 뿐이고 본 발명의 이용 및 기능의 범위에 대한 어떠한 제한도 제시하도록 의도되어 있지 않다. 컴퓨팅 환경(100)은 예시적인 컴퓨팅 환경(100)에서 예시된 컴포넌트들 중 임의의 하나 또는 조합에 관하여 어떠한 종속성이나 필요 조건을 갖는 것으로 해석되어서는 안 된다.
본 발명은 다수의 다른 범용 또는 특별 용도 컴퓨팅 시스템 환경 또는 구성에서 동작 가능하다. 본 발명과 함께 이용하기에 적합할 수 있는 잘 알려진 컴퓨팅 시스템, 환경, 및/또는 구성들의 예로는, 퍼스널 컴퓨터, 서버 컴퓨터, 스마트 폰, 스마트 시계(smart watches), 및 개인 정보 단말(personal data assistants)을 포함하는 핸드헬드 또는 랩탑 디바이스, 멀티프로세서 시스템, 마이크로프로세서 기반 시스템, 셋톱 박스, 프로그램 가능한 소비자 전자 기기, 네트워크 PC, 미니컴퓨터, 메인프레임 컴퓨터, 상기 시스템들 또는 디바이스들 중 임의의 것을 포함하는 분산 컴퓨팅 환경 등을 포함하지만, 이들에 한정되지는 않는다.
본 발명은 컴퓨터에 의해 실행되는, 프로그램 모듈과 같은, 컴퓨터 실행 가능 명령들의 일반적인 컨텍스트에서 설명될 수 있다. 일반적으로, 프로그램 모듈은 특정 작업을 수행하거나 특정 추상 데이터 타입(abstract data types)을 구현하는 루틴, 프로그램, 객체, 컴포넌트, 데이터 구조 등을 포함한다. 본 발명은 또한 통신 네트워크를 통하여 연결되어 있는 원격 처리 디바이스들에 의해 작업이 수행되는 분산 컴퓨팅 환경에서 실시될 수도 있다. 분산 컴퓨팅 환경에서는, 프로그램 모듈은 메모리 기억 장치들을 포함하는 로컬 및 원격 컴퓨터 기억 매체 양쪽 모두에 위치할 수 있다.
도 1A를 참조하면, 본 발명을 구현하기 위한 예시적인 시스템이 컴퓨터(110)의 형태로 범용 컴퓨팅 디바이스를 포함한다. 컴퓨터(110)의 컴포넌트들은, 처리 장치(120), 시스템 메모리(130), 및 이 시스템 메모리(130)을 포함하는 각종 시스템 컴포넌트들을 처리 장치(120)에 연결하는 시스템 버스(121)를 포함할 수 있지만, 이들에 한정되지는 않는다. 시스템 버스(121)는, 각종 버스 아키텍처 중 어느 하나를 이용한, 메모리 버스 또는 메모리 컨트롤러, 주변 버스, 및 로컬 버스를 포함하는, 몇몇 타입의 버스 구조들 중 어느 하나일 수 있다. 한정이 아니라 예로서, 그러한 아키텍처는 ISA(Industry Standard Architecture) 버스, MCA(Micro Channel Architecture) 버스, EISA(Enhanced ISA) 버스, VESA(Video Electronics Standards Association) 로컬 버스, 및 Mazzanine 버스로도 알려져 있는 PCI(Peripheral Component Interconnects) 버스를 포함한다.
컴퓨터(110)는 전형적으로 갖가지 컴퓨터 판독 가능 매체를 포함한다. 컴퓨터 판독 가능 매체는 컴퓨터(110)에 의해 액세스될 수 있고 휘발성 및 비휘발성 매체, 분리형(removable) 및 비분리형(non-removable) 매체 모두를 포함하는 임의의 이용 가능한 매체일 수 있다. 한정이 아니라 예로서, 컴퓨터 판독 가능 매체는 컴퓨터 기억 매체 및 통신 매체를 포함한다. 컴퓨터 기억 매체는 컴퓨터 판독 가능 명령들, 데이터 구조들, 프로그램 모듈들 또는 다른 데이터와 같은 정보의 저장을 위해 임의의 방법 및 기술로 구현된 휘발성 및 비휘발성, 분리형 및 비분리형 매체를 포함한다. 컴퓨터 기억 매체는 랜덤 액세스 메모리(RAM), 판독 전용 메모리(ROM), 전기적으로 소거 가능 프로그램 가능한 판독 전용 메모리(EEPROM), 플래시 메모리 또는 다른 메모리 기술, CD-ROM, 디지털 비디오 디스크(DVD) 또는 다른 광 디스크 기억 장치, 자기 카세트, 자기 테이프, 자기 디스크 기억 장치 또는 다른 자기 기억 장치, 또는 소망의 정보를 저장하기 위해 이용될 수 있고 컴퓨터(110)에 의해 액세스될 수 있는 임의의 다른 매체를 포함하지만, 이들에 한정되지는 않는다. 통신 매체는 전형적으로 컴퓨터 판독 가능 명령들, 데이터 구조들, 프로그램 모듈들, 또는 다른 데이터를 반송파(carrier wave)와 같은 변조된 데이터 신호 또는 다른 전달 메커니즘(transport mechanism)으로 구현하고 임의의 정보 전달 매체를 포함한다. "변조된 데이터 신호"(modulated data signal)라는 용어는 그 신호의 특성들 중 하나 이상이 그 신호 내에 정보를 인코딩하도록 설정되거나 변경된 신호를 의미한다. 한정이 아니라 예로서, 통신 매체는 유선 네트워크(wired network) 또는 직접 유선 접속(direct-wired connection)과 같은 유선 매체, 및 음향, RF, 적외선 및 다른 무선 매체와 같은 무선 매체를 포함한다. 상기한 것들 중 임의의 것들의 조합들도 컴퓨터 판독 가능 매체의 범위 내에 포함되어야 한다.
시스템 메모리(130)는 ROM(131) 및 RAM(132)과 같은 휘발성 및/또는 비휘발성 메모리의 형태로 컴퓨터 기억 매체를 포함한다. 시동(start-up) 중과 같이, 컴퓨터(110) 내의 컴포넌트들 간에 정보를 전송하는 것을 돕는 기본 루틴들을 포함하는 기본 입출력 시스템(133)(BIOS)은 전형적으로 ROM(131)에 저장된다. RAM(132)은 전형적으로 처리 장치(120)에 의해 즉시 액세스 가능하고 및/또는 현재 실행되고 있는 데이터 및/또는 프로그램 모듈들을 포함한다. 한정이 아니라 예로서, 도 1은 운영 시스템(134), 애플리케이션 프로그램(135), 기타 프로그램 모듈(136), 및 프로그램 데이터(137)를 예시한다.
컴퓨터(110)는 또한 다른 분리형/비분리형, 휘발성/비휘발성 컴퓨터 기억 매체를 포함할 수 있다. 예로서, 도 1A는 비분리형, 비휘발성 자기 매체로부터 판독하거나 거기에 기록하는 하드 디스크 드라이브(141), 분리형, 비휘발성 자기 디스크(152)로부터 판독하거나 거기에 기록하는 자기 디스크 드라이브(151), 및 CD ROM 또는 다른 광학 매체와 같은 분리형, 비휘발성 광 디스크(156)로부터 판독하거나 거기에 기록하는 광 디스크 드라이브(155)를 예시한다. 예시적인 운영 환경에서 사용될 수 있는 다른 분리형/비분리형, 휘발성/비휘발성 컴퓨터 기억 매체로는, 자기 테이프 카세트, 플래시 메모리 카드, 디지털 비디오 디스크, 디지털 비디오 테이프, 고체 상태 RAM, 고체 상태 ROM 등을 포함하지만, 이들에 한정되지는 않는다. 하드 디스크 드라이브(141)는 전형적으로 인터페이스(140)와 같은 비분리형 메모리 인터페이스를 통하여 시스템 버스(121)에 접속되고, 자기 디스크 드라이브(151) 및 광 디스크 드라이브(155)는 전형적으로 인터페이스(150)와 같은 분리형 메모리 인터페이스에 의해 시스템 버스(121)에 접속된다.
위에서 논의되고 도 1A에 예시된 드라이브들 및 그들의 관련 컴퓨터 기억 매체는, 컴퓨터 판독 가능 명령들, 데이터 구조들, 프로그램 모듈들 및 컴퓨터(110)용의 다른 데이터의 저장을 제공한다. 도 1A에서, 예를 들면, 하드 디스크 드라이브(141)는 운영 시스템(144), 애플리케이션 프로그램(145), 기타 프로그램 모듈들(146), 및 프로그램 데이터(147)를 저장하는 것으로 예시되어 있다. 이들 컴포넌트들은 운영 시스템(134), 애플리케이션 프로그램(135), 기타 프로그램 모듈들(136), 및 프로그램 데이터(137)와 동일하거나 또는 다를 수 있다는 점에 주목한다. 운영 시스템(144), 애플리케이션 프로그램(145), 기타 프로그램 모듈들(146), 및 프로그램 데이터(147)에 대해서는 최소한 그것들이 서로 다른 카피들임을 예시하기 위해 여기에서 서로 다른 번호가 부여되었다. 사용자는 디지털 카메라(163), 키보드(162) 및 통상적으로 마우스, 트랙볼 또는 터치 패드로 불리는 포인팅 디바이스(161)와 같은 입력 장치들을 통하여 컴퓨터(110) 내에 커맨드 및 정보를 입력할 수 있다. (도시되지 않은) 다른 입력 장치들은 마이크, 조이스틱, 게임 패드, 위성 안테나(satellite dish), 스캐너, 또는 그와 유사한 것을 포함할 수 있다. 이들 및 다른 입력 장치들은 흔히 시스템 버스에 연결되어 있는 사용자 입력 인터페이스(160)를 통하여 처리 장치(120)에 접속되지만, 병렬 포트, 게임 포트, 또는 USB(universal serial bus)와 같은 다른 인터페이스 및 버스 구조들에 의해 접속될 수도 있다. 모니터(191) 또는 다른 타입의 디스플레이 장치가 또한 비디오 인터페이스(190)와 같은 인터페이스를 통하여 시스템 버스(121)에 접속된다. 모니터 외에, 컴퓨터는 또한 다른 주변 인터페이스(195)를 통하여 접속될 수 있는 스피커(197) 및 프린터(196)와 같은 다른 주변 출력 장치들을 포함할 수 있다.
컴퓨터(110)는 원격 컴퓨터(180)와 같은 하나 이상의 원격 컴퓨터들에의 논리적 접속들을 이용한 네트워킹된 환경에서 동작할 수 있다. 원격 컴퓨터(180)는 퍼스널 컴퓨터, 서버, 라우터, 네트워크 PC, 피어 디바이스(peer device) 또는 다른 통상의 네트워크 노드일 수 있고, 전형적으로 컴퓨터(110)와 관련하여 위에서 설명한 컴포넌트들의 다수 또는 전부를 포함하지만, 도 1A에서는 메모리 기억 장치(181)만이 예시되어 있다. 도 1A에 도시된 논리적 접속들은 근거리 통신망(LAN)(171) 및 광역 통신망(WAN)(173)을 포함하지만, 다른 네트워크들을 포함할 수도 있다. 그러한 네트워킹 환경들은 사무실, 전사적 컴퓨터 통신망(enterprise-wise computer networks), 인트라넷, 및 인터넷에서 흔한 것이다.
LAN 네트워킹 환경에서 사용될 때, 컴퓨터(110)는 네트워크 인터페이스 또는 어댑터(170)를 통하여 LAN(171)에 접속된다. WAN 네트워킹 환경에서 사용될 경우, 컴퓨터(110)는 전형적으로 인트라넷과 같은 WAN(173)을 통하여 통신을 성립하기 위한 모뎀(172) 또는 다른 수단들을 포함한다. 내장형 또는 외장형일 수 있는 모뎀(172)은 사용자 입력 인터페이스(160) 또는 다른 적당한 메커니즘을 통하여 시스템 버스(121)에 접속될 수 있다. 네트워킹된 환경에서, 컴퓨터(110)와 관련하여 도시된 프로그램 모듈들 또는 그 일부는 원격 메모리 기억 장치에 저장될 수 있다. 한정이 아니라 예로서, 도 1A는 원격 애플리케이션 프로그램들(185)이 메모리 디바이스(181)에 상주하는 것으로 예시하고 있다. 도시된 네트워크 접속들은 예시적인 것이고 컴퓨터들 간에 통신 링크를 성립하기 위한 다른 수단들이 이용될 수도 있다는 것을 알 것이다.
도시된 네트워크 접속들은 예시적인 것이고 컴퓨터들 간에 통신 링크를 성립하기 위한 다른 수단들이 이용될 수도 있다는 것을 알 것이다. TCP/IP, 이더넷, FTP, HTTP 등과 같은 각종 공지된 프로토콜들 중 임의의 것이 존재하는 것으로 가정되고, 시스템은 클라이언트-서버 구성으로 사용자가 웹 기반 서버로부터 웹 페이지들을 검색할 수 있도록 작동될 수 있다. 각종 종래의 웹 브라우저들 중 임의의 것이 웹 페이지들 상에 데이터를 디스플레이하고 그 데이터를 조작하기 위해 사용될 수 있다.
프로그래밍 인터페이스(또는 더 간단히, 인터페이스)는 하나 이상의 코드 세그먼트(들)가 하나 이상의 다른 코드 세그먼트(들)에 의해 제공된 기능과 통신하거나 그 기능에 액세스할 수 있게 하기 위한 임의의 메커니즘, 프로세스, 프로토콜로 간주될 수 있다. 다르게는, 프로그래밍 인터페이스는 시스템의 다른 컴포넌트(들)의 하나 이상의 메커니즘(들), 메서드(들), 함수 호출(들), 모듈(들) 등에 통신 연결 가능한 시스템의 컴포넌트의 하나 이상의 메커니즘(들), 메서드(들), 함수 호출(들), 모듈(들), 객체(들) 등으로 간주될 수 있다. 바로 앞의 문장에서 "코드 세그먼트"(segment of code)라는 용어는, 적용된 용어에 상관없이 또는 코드 세그먼트들이 따로따로 컴파일되든, 또는 코드 세그먼트들이 소스, 중간(intermediate) 혹은 객체 코드로서 제공되든, 코드 세그먼트들이 런타임 시스템 또는 프로세스에서 이용되든, 또는 그것들이 동일한 머신 상에 있든 서로 다른 머신들 상에 있든 또는 다수의 머신들에 걸쳐서 분산되어 있든, 또는 코드 세그먼트들에 의해 표현되는 기능이 전적으로 소프트웨어로 구현되든, 전적으로 하드웨어로 구현되든, 또는 하드웨어와 소프트웨어의 조합으로 구현되든 상관없이, 코드의 하나 이상의 명령 또는 라인들을 포함하도록 의도되어 있고, 예를 들면, 코드 모듈들, 오브젝들, 서브루틴들, 함수들 등을 포함한다.
개념적으로, 프로그래밍 인터페이스는 도 1B 또는 도 1C에 도시된 바와 같이, 포괄적으로 생각될 수 있다. 도 1B는 제1 및 제2 코드 세그먼트들이 통신하는 도관(conduit)으로서의 인터페이스 Interface1을 예시한다. 도 1C는 시스템의 제1 및 제2 코드 세그먼트들이 매체 M을 통하여 통신할 수 있게 하는 인터페이스 객체들 I1 및 I2(제1 및 제2 코드 세그먼트들의 부분일 수도 아닐 수도 있음)을 포함하는 것으로 인터페이스를 예시한다. 도 1C의 보기에서는, 인터페이스 객체들 I1 및 I2를 동일 시스템의 별개의 인터페이스들로 생각할 수도 있고 객체들 I1 및 I2에 매체 M을 더한 것이 인터페이스를 포함하는 것을 생각할 수도 있다. 도 1B 및 1C는 양방향 흐름 및 그 흐름의 양쪽에 인터페이스를 보여주지만, 어떤 구현들은 한 방향으로의 정보 흐름만을 갖거나(또는 아래에서 설명하는 바와 같이 아무런 정보 흐름도 없거나) 한 쪽에 하나의 인터페이스 객체만을 가질 수 있다. 제한이 아니라 예로서, 애플리케이션 프로그래밍 인터페이스(API), 엔트리 포인트(entry point), 메서드, 함수, 서브루틴, 원격 프로시저 호출(remote procedure call), 및 컴포넌트 객체 모델(COM: component object model) 인터페이스와 같은 용어들이 프로그래밍 인터페이스의 정의 내에서 두루 포함된다.
그러한 프로그래밍 인터페이스의 양태들은 제1 코드 세그먼트가 제2 코드 세그먼트에 정보(여기서 "정보"는 가장 넓은 의미로 사용되고 데이터, 커맨드, 요구(requests) 등을 포함한다)를 전송하게 하는 메서드; 제2 코드 세그먼트가 상기 정보를 수신하게 하는 메서드; 및 상기 정보의 구조, 시퀀스, 구문, 조직, 스키마, 타이밍 및 콘텐츠를 포함할 수 있다. 이와 관련하여, 하위 전송 매체(underlying transport medium) 자체는, 그 매체가 유선이든 무선이든, 또는 양자의 조합이든, 상기 정보가 상기 인터페이스에 의해 정의된 방식으로 전송되기만 한다면, 인터페이스의 동작에 중요하지 않을 수 있다. 어떤 경우에, 정보는 종래의 의미에서 한 방향 또는 양방향으로 전달되지 않을 수도 있다. 왜냐하면 정보 전송은, 하나의 코드 세그먼트가 단순히 제2의 코드 세그먼트에 의해 수행되는 기능에 액세스하는 경우와 같이, 다른 메커니즘(예를 들면, 코드 세그먼트들 간의 정보 흐름과 별도로 버퍼, 파일 등에 있는 정보)을 통하거나 또는 존재하지 않을 수 있기 때문이다. 이들 양태들의 어느 것이든 또는 전부가, 주어진 상황에서, 예를 들면 코드 세그먼트들이 느슨하게 연결되거나 또는 긴밀하게 연결된 구성으로 시스템의 부분인지에 따라서 중요할 수 있고, 따라서 이 리스트는 예시적이고 비제한적인 것으로 간주되어야 할 것이다.
프로그래밍 인터페이스의 이 개념은 숙련된 당업자에게 공지되어 있고 본 발명의 전술한 상세한 설명으로부터 명백하다. 그러나, 프로그래밍 인터페이스를 구현하는 다른 방법들이 있고, 명백히 배제되지 않는 한, 이것들도 본 명세서의 말미에 제시된 청구항들에 의해 포함되도록 의도된다. 그런 다른 방법들은 도 1B 및 1C의 극단적으로 단순화한 보기보다 복잡해보일 수 있지만, 그럼에도 불구하고 그것들은 유사한 기능을 수행하여 동일한 전체 결과를 성취한다. 이제부터 프로그래밍 인터페이스의 몇몇 예시적인 대안 구현예들을 간단히 설명해보겠다.
A. 인수 분해(FACTORING)
하나의 코드 세그먼트로부터 다른 것으로의 통신은 그 통신을 다수의 개별 통신들(discrete communications)로 분해함으로써 간접적으로 성취될 수 있다. 이것은 도 1D 및 1E에 개략적으로 도시되어 있다. 도시된 바와 같이, 몇몇 인터페이스들은 기능의 분할 가능한 세트들로 설명될 수 있다. 따라서, 도 1B 및 1C의 인터페이스 기능은, 수학적으로 24, 또는 2×2×3×2를 제공할 수 있는 것처럼, 동일한 결과를 성취하도록 인수 분해(factor)될 수 있다. 따라서, 도 1D에 예시된 바와 같이, 인터페이스 Interface1에 의해 제공된 기능은 동일한 결과를 성취하면서 그 인터페이스의 통신들을 다수의 인터페이스 Interface1A, Interface1B, Interface1C 등으로 변환하도록 세분될 수 있다. 도 1E에 예시된 바와 같이, 인터페이스 I1에 의해 제공된 기능은 동일한 결과를 성취하면서 다수의 인터페이스 I1a, I1b, I1c 등으로 세분될 수 있다. 마찬가지로, 제1 코드 세그먼트로부터 정보를 수신하는 제2 코드 세그먼트의 인터페이스 I2는 다수의 인터페이스 I2a, I2b, I2c 등으로 인수 분해될 수 있다. 인수 분해할 때, 제1 코드 세그먼트와 함께 포함되는 인터페이스의 수는 제2 코드 세그먼트와 함께 포함되는 인터페이스의 수와 일치할 필요는 없다. 도 1D 및 1E의 어느 경우든, 인터페이스 Interface1 및 I1의 기능적 의미는 각각 도 1B 및 1C에서와 여전히 동일하다. 인터페이스들의 인수 분해는 또한 그 인수 분해를 알아내기 곤란하도록 결합(associtave), 교환(commutative), 및 다른 수학적 특성들을 따를 수 있다. 이를테면, 동작들의 순서는 중요하지 않을 수 있고, 따라서, 인터페이스에 의해 수행되는 기능은 그 인터페이스에 도달하기 훨씬 전에 코드 또는 인터페이스의 다른 피스(piece)에 의해 수행될 수 있고, 또는 시스템의 별도의 컴포넌트에 의해 수행될 수 있다. 또한, 프로그래밍 기술 분야의 통상의 기술을 가진 자라면 동일한 결과를 성취하는 다른 함수 호출들을 행하는 갖가지 방법들이 있다는 것을 알 수 있다.
B. 재정의(REDEFINITION)
일부 경우에, 프로그래밍 인터페이스의 어떤 특징들(aspects)(예를 들면, 파라미터들)을 무시하거나, 부가하거나 또는 재정의하면서도 의도된 결과를 성취하는 것이 가능할 수 있다. 이것은 도 1F 및 1G에 예시되어 있다. 예를 들면, 도 1B의 인터페이스 Interface1은 3개의 파라미터, 입력(input), 정밀도(precision) 및 출력(output)을 포함하고, 제1 코드 세그먼트로부터 제2 코드 세그먼트로 발행되는 호출인, 함수 호출 Square(입력, 정밀도, 출력)를 포함한다고 가정하자. 만일 중앙의 파라미터 정밀도가, 도 1F에 도시된 바와 같이, 주어진 시나리오에서 중요하지 않다면(of no concern), 그것은 무시되거나 또는 의미 없는(이 상황에서) 파라미터로 대체되는 것도 좋을 수 있다. 또한 중요하지 않은 부가적인 파라미터를 부가할 수도 있다. 어느 경우든, 입력이 제2 코드 세그먼트에 의해 제곱(square)된 후에 출력이 반환되는 한, square의 기능은 성취될 수 있다. 정밀도는 컴퓨터 시스템의 어떤 다운스크림 또는 다른 부분에게 의미 있는 파라미터일지도 모르지만, square를 계산하는 한정된 목적을 위해 정밀도가 필요하지 않다고 일단 인지되면, 그것은 대체되거나 무시될 수 있다. 예를 들면, 유효 정밀도 값을 전달하는 대신에, 결과에 악영향을 미치지 않으면 생일 날짜와 같은 무의미한 값이 전달될 수 있다. 마찬가지로, 도 1G에 도시된 바와 같이, 인터페이스 I1은 그 인터페이스에 파라미터들을 부가하거나 또는 무시하도록 재정의된, 인터페이스 I1'에 의해 대체된다. 인터페이스 I2는 마찬가지로 불필요한 파라미터들, 또는 다른 곳에서 처리될 수 있는 파라미터들을 무시하도록 재정의된, 인터페이스 I2'에 의해 대체될 수 있다. 여기에서 요점은 일부 경우에 프로그래밍 인터페이스가 어떤 목적을 위해 필요하지 않은, 파라미터들과 같은, 특징들을 포함할 수 있고, 따라서 그것들은 무시되거나 재정의되거나, 또는 다른 목적을 위해 다른 곳에서 처리될 수 있다는 점이다.
C. 인라인 코딩(INLINE CODING)
2개의 별개의 코드 모듈들 간의 "인터페이스"가 형태를 변경하도록 그 코드 모듈들의 기능의 일부 또는 전부를 병합하는 것도 실행할 수 있을 것이다. 예를 들면, 도 1B 및 1C의 기능은 각각 도 1H 및 1I의 기능으로 변환될 수 있다. 도 1H에서, 도 1B의 이전의 제1 및 제2 코드 세그먼트들은 그들 모두를 포함하는 하나의 모듈로 변합된다. 이 경우에, 코드 세그먼트들은 여전히 서로 통신할 수 있지만 인터페이스는 단일 모듈에 보다 적합한 형태로 적용될 수 있다. 따라서, 예를 들면, 형식적인 호출(Call) 및 반환(Return) 문장들은 더 이상 필요하지 않을 수 있지만, 인터페이스 Interface1에 따른 처리 또는 응답(들)이 여전히 유효할 수 있다. 마찬가지로, 도 1I에 도시된 바와 같이, 도 1C로부터의 인터페이스 I2의 일부(또는 전부)가 인터페이스 I1에 인라인으로 기입되어 인터페이스 I1"을 형성할 수 있다. 예시된 바와 같이, 인터페이스 I2는 I2a 및 I2b로 분할되고, 인터페이스 부분 I2a는 인터페이스 I1과 함께 인라인으로 코딩되어 인터페이스 I1"을 형성하였다. 구체적인 예를 위해, 도 1C로부터의 인터페이스 I1이 함수 호출 square(입력, 출력)을 수행하는 것을 생각해보자. 여기서, 상기 함수 호출 square(입력, 출력)은 인터페이스 I2에 의해 수신되고, 이 인터페이스 I2는 제2 코드 세그먼트에 의해 입력과 함께 전달된 값을 처리한 후에(그것을 제곱(square)), 제곱된 결과를 출력과 함께 도로 전달한다. 그런 경우에, 제2 코드 세그먼트에 의해 수행되는 처리(입력을 제곱)는 인터페이스에 대한 호출 없이 제1 코드 세그먼트에 의해 수행될 수 있다.
D. 분리(DIVORCE)
하나의 코드 세그먼트로부터 다른 것으로의 통신은 그 통신을 다수의 이산 통신으로 분해함으로써 성취될 수 있다. 이것은 도 1J 및 1K에 개략적으로 도시되어 있다. 도 1J에 도시된 바와 같이, 미들웨어의 하나 이상의 피스(들)(이것들은 원본 인터페이스로부터의 기능 및/또는 인터페이스 기능들을 분리(divorce)하므로, 분리 인터페이스(들)(Diverce Interface(s))이라 함)이 제공되어 제1 인터페이스 Interface1 상의 통신들을 변환하여 그것들을 상이한 인터페이스, 이 경우 인터페이스들 Interface2A, Interface2B 및 Interface2C에 적합하게 한다. 이것은 예를 들면 Interface1 프로토콜에 따라서 운영 시스템과 통신하도록 설계된 애플리케이션들의 설치된 베이스가 있지만, 그 운영 시스템이 상이한 인터페이스, 이 경우 인터페이스들 Interface2A, Interface2B 및 Interface2C를 사용하도록 변경되는 경우에 행해질 수 있다. 요점은 제2 코드 세그먼트에 의해 사용되는 원본 인터페이스가 더 이상 제1 코드 세그먼트에 의해 사용되는 인터페이스와 호환되지 않도록 변경되고, 따라서 이전 인터페이스와 새로운 인터페이스를 호환되게 하기 위하여 매개물(intermediary)이 사용된다는 점이다. 마찬가지로, 도 1K에 도시된 바와 같이, 인터페이스 I1로부터 통신들을 수신하는 분리 인터페이스 DI1를 갖고 예를 들면 DI2와 함께 동작하도록 재설계된 인터페이스들 I2a 및 I2b에 인터페이스 기능을 송신하는 분리 인터페이스 DI2를 갖는 제3 코드 세그먼트가 도입될 수 있지만, 동일한 기능적 결과를 제공한다. 마찬가지로, DI1 및 DI2는 함께 동작하여 도 1C의 인터페이스 I1 및 I2의 기능을 새로운 운영 시스템으로 변환하지만, 동일하거나 유사한 기능적 결과를 제공한다.
E. 재기입(REWRITING)
또 다른 가능한 변형은 인터페이스 기능을 어떤 다른 것으로 대체하면서도 동일한 전체 결과를 성취하도록 코드를 다이내믹하게 재기입하는 것이다. 예를 들면, 중간 언어(예를 들면, 마이크로소프트 IL, Java ByteCode 등)로 제시된 코드 세그먼트가 (예컨대 .Net 프레임워크, Java 런타임 환경, 또는 다른 유사한 런타임 타입 환경들에 의해 제공된 것과 같은) 실행 환경에서 JIT(Just-in-Time) 컴파일러 또는 인터프리터에 제공되는 시스템이 있을 수 있다. JIT 컴파일러는 제1 코드 세그먼트로부터의 통신들을 제2 코드 세그먼트로 다이내믹하게 변환하도록, 즉 그것들을 제2 코드 세그먼트(원본 또는 상이한 제2 코드 세그먼트)에 의해 요구될 수 있는 상이한 인터페이스에 적합하게 하도록 기입될 수 있다. 이것은 도 1L 및 1M에 도시되어 있다. 도 1L에서 알 수 있는 바와 같이, 이 방법은 위에서 설명된 분리(Divorce) 시나리오와 유사하다. 이것은 예를 들면, 애플리케이션들의 설치된 베이스가 Interface 1 프로토콜에 따라서 운영 시스템과 통신하도록 설계되어 있지만, 운영 시스템이 상이한 인터페이스를 사용하도록 변경되는 경우에 행해질 수 있다. JIT 컴파일러는 설치된 베이스 애플리케이션들로부터의 진행중인 통신들을 운영 시스템의 새로운 인터페이스에 적합하게 하기 위해 사용될 수 있다. 도 1M에 도시된 바와 같이, 인터페이스(들)을 다이내믹하게 재기입하는 이 방법은 또한 인터페이스(들)를 다이내믹하게 인수 분해하거나 또는 다르게 변경하기 위해 적용될 수 있다.
또한 대안 실시예들을 통하여 인터페이스로서 동일하거나 유사한 결과를 성취하기 위한 상술한 시나리오들은 다양한 방법으로, 직렬로 및/또는 병렬로, 또는 다른 중재 코드에 의해 조합될 수도 있다는 것에 주목해야 할 것이다. 따라서, 위에서 제시된 대안 실시예들은 상호 배타적이지 않고 도 1B 및 1C에서 제시된 일반적 시나리오들과 동일하거나 동등한 시나리오들을 생성하도록 혼합되고, 매칭되고, 결합될 수 있다. 또한, 대부분의 프로그래밍 구성들에서와 같이, 여기에서 설명되어 있지 않지만, 본 발명의 사상 및 범위에 의해 표현되는 인터페이스의 동일하거나 유사한 기능을 성취하는 다른 유사한 방법들이 있다는 것에 주목한다. 즉, 그것은 적어도 부분적으로 인터페이스의 값의 밑에 있는 인터페이스에 의해 표현되는 기능, 및 인터페이스의 값의 밑에 있는 인터페이스에 의해 가능하게 되는 유리한 결과들이라는 것에 주목한다.
도 2는 본 발명의 다양한 양태들에 따라서 사용될 수 있는 예시적인 태블릿 PC(201)를 예시한다. 도 1의 시스템에서의 특징들, 서브시스템들, 및 기능들의 임의의 것 또는 전부가 도 2의 컴퓨터에 포함될 수 있다. 태블릿 PC(201)는, 복수의 윈도(203)가 디스플레이되는, 대형 디스플레이 표면(202), 예컨대, 디지털화 플랫 패널 디스플레이, 바람직하게는, 액정 디스플레이(LCD) 스크린을 포함한다. 스타일러스(204)를 이용하여, 사용자는 디지털화 디스플레이 표면(202) 상에서 선택하거나, 하이라이트하거나, 및/또는 기록할 수 있다. 적당한 디지털화 디스플레이 표면(202)의 예로는, 무토(Mutoh) 또는 와컴(Wacom) 펜 디지타이저와 같은 전자기 펜 디지타이저를 포함한다. 다른 타입의 펜 디지타이저, 예컨대, 광학 디지타이저도 사용될 수 있다. 태플릿 PC(201)는 데이터를 조작하거나, 텍스트를 입력하거나, 그림을 생성하거나, 및/또는 스프레드시트, 워드 프로세싱 프로그램 등과 같은 종래의 컴퓨터 응용 태스크를 실행하기 위하여 스타일러스(204)를 이용하여 행해진 제스처들을 해석한다.
스타일러스(204)는 그것의 선택 능력을 증대시키기 위하여 하나 이상의 버튼 또는 다른 특징들을 구비할 수 있다. 일 실시예에서, 스타일러스(204)는 "연필" 또는 "펜"으로 구현될 수 있고, 여기서 한쪽 단부는 기록 부분을 구성하고 다른 쪽 단부는 "지우개" 부분을 구성하고, 그리고 그것은 디스플레이를 가로질러 움직일 때, 디스플레이의 부분들이 지워질 것임을 나타낸다. 마우스, 트랙볼 등과 같은 다른 타입의 입력 장치가 사용될 수도 있다. 또한, 사용자 자신의 손가락이 스타일러스(204)가 되어 터치 감응(touch-sensitive) 또는 근접 감응(proximity-sensitive) 디스플레이 상의 디스플레이된 이미지의 부분들을 선택하거나 지시하기 위해 사용될 수도 있다. 따라서, 본 명세서에서 사용된, "사용자 입력 장치"라는 용어는 광의의 정의를 갖고 스타일러스(204)와 같은 공지 입력 장치의 다수의 변형들을 포함하도록 의도되어 있다. 영역(205)은 사용자가 스타일러스(204)가 디스플레이 표면(202)과 접촉한 지점을 판정할 수 있게 하는 피드백 영역 또는 접촉 영역을 도시한다.
여러 실시예들에서, 이 시스템은 애플리케이션이 잉크를 캡처하고, 조작하고, 저장하기 위해 사용할 수 있는 COM(컴포넌트 객체 모델) 서비스들의 세트로서 잉크 플랫폼을 제공한다. 하나의 서비스는 애플리케이션이 개시된 잉크의 표현들을 이용하여 잉크를 판독하고 기록할 수 있게 한다. 잉크 플랫폼은 또한 XML(extensible markup language)과 같은 언어를 포함하는 마크업 언어(markup language)를 포함할 수 있다. 또한, 이 시스템은 다른 구현으로서 DCOM을 이용할 수 있다. 마이크로소프트사로부터 출시된 Win32 프로그래밍 모델 및 Net 프로그래밍 모델을 포함하는 또 다른 구현들이 이용될 수도 있다.
실시간 잉킹 개관
스트일러스나 펜을 사용하여, 사용자는 전자 잉크를 생성한다. 이 잉크는 부가적인 처리들이 완료될 때까지 기다리기보다는 사용자가 잉크를 생성하는 시간에 보다 가깝게 잉크가 디스플레이될 수 있게 하는 시스템에 의해 핸들링된다.
도 3은 본 발명의 양태들에 따라서 전자 잉크를 핸들링하기 위한 예시적인 시스템을 도시한다. 입력 매니저(301)에서 입력 매니저가 잉크를 수신한다. 당업계에는 펜 및 디지털화 태블릿, 와컴 태블릿 등을 포함하는 다양한 입력 매니저들이 존재한다. 잉크 데이터의 존재는 스타일러스 입력 이벤트(302)로 불린다. 다음으로, 스타일러스 입력 이벤트(302)는 잉크 수집기(ink gatherer)(303)에 의해 핸들링된다. 잉크 수집 객체(303)는 입력 매니저(301)로부터의 정보에 대한 초기 핸들링을 수행한다. 그 후 시스템은 디스플레이(305) 상에 출력하기 위해 잉크(304)를 다이내믹하게 렌더링한다. 다른 컴포넌트들은 보다 완전한 잉크 처리를 핸들링할 수 있다. 이를테면, 스트로크가 기존의 잉크 객체(306)에 부가될 수 있고(또는 잉크 스토로크를 포함하도록 새로운 잉크 객체를 생성할 수 있고) 수신된 잉크(데이터로 불림)를 하나 이상의 속성들과 관련시킬 수도 있다. 이것은 잉크 객체 속성을 갖는 컴포넌트(307)에 의해 도시되어 있다. 그 후 잉크 객체는 디스플레이(305) 상에 디스플레이하기 위해 다시 그려질(redrawn) 수 있다(평활화(smoothing)가 요망된다면).
도 4는 도 3의 대안적인 방법을 도시한다. 도 4는 내부 스타일러스 입력 소스(401), 입력 매니저(402)(입력 큐(input queue)를 구비할 수도 아닐 수도 있음), 잉크 수집 객체(403), 잉크 객체 속성을 갖는 엘리먼트(405), 실시간 잉킹 객체(404) 및 디스플레이(406)를 포함한다.
2가지 타입의 입력 세트들이 핸들링될 수 있다: 스타일러스와 디지타이저 간의 접촉으로 인해 생기는 데이터 및 디지타이저 위에서 행해지는 움직임으로 인해 생기는 데이터. 디지타이저와 접촉하지 않고 디지타이저 위에서 행해지는 움직임들은 "인에어 스타일러스"(in-air stylus) 입력들로 불린다. 내부 스타일러스 입력 소스는 2개의 입력 세트를 분리시키고 그에 따라서 그것들을 라우팅한다. 다음은 도 4에서 일어나는 다양한 액션들을 리스트한다:
A) 인에어 스타일러스 입력 이벤트가 입력 매너저(402)의 입력 큐에 부가된다.
B) 입력 매너저(402)는 인에어 스타일러스 입력을 잉크 수집(403)에 디스패치(dispatch)한다.
C) 입력 매너저(402)는 또한 포커스 변화가 일어났는지를 판정하기 위한 처리를 위해 인에어 스타일러스 입력을 출력한다. 실시간 잉킹 객체(404)(실시간 스타일러스 컨트롤이라고도 함)도 통지를 받는다. 실시간 잉킹 객체(404)는 임의의 필요한 데이터(잉크 컬러 등)를 요구할 수 있다.
D) 인에어 스타일러스 이벤트는 통상의 처리를 계속하여 잉크 객체 속성(405)을 갖는 엘리먼트에 이어진다.
E) 스타일러스 "다운" 이벤트들이 수신되어 실시간 잉킹 객체(405)에 보내진다.
F) 실시간 객체(405)는 점들이 수신될 때 그 점들을 그린다. 이것은 다이내믹 렌더링으로 불릴 수 있다.
G) 실시간 잉킹 객체(405)는 그려진 이벤트들을 입력 매너저(402)에 전송하고 나중에 사용자 인터페이스 스레드(user interface threads)가 이용 가능하게 될 때 디스패치되게 한다.
H) 스트로크가 수집(collect)된 다음 잉크 객체에 부가된다.
I) 엘리먼트는 먼저 실시간 잉킹 객체(405)에게 다이내믹하게 그려진 스트로크를 제거하도록 통지하고, 그 후 새로운 스트로크를 다시 그린다. 이 동작은 스트로크별로(on a stroke by stroke basis) 일어나거나 잉크 스트로크들 상에 적용될 수 있다.
J) 잉크는 모든 잉킹이 완료된 후에 렌더링된다.
도 4에 도시된 것과 같은 상기 방법은 잉크 래그(ink lag)가 "스타일러스 다운" 이벤트들에 대해서만 중요하다(critical)는 이점을 제공한다. 잉크 래그는 스타일러스가 능다이내믹하게 그리고 있는 동안에만 인지할 수 있다. 모든 다른 스타일러스 이벤트들은 부정적인 사용자 영향이 거의 없이 지연될 수 있다.
도 4의 방법은 멀티스레드 인식(multi-thread awareness)이 입력 매니저 큐 및 RTI 객체에 로컬화되도록 한다. 그것은 또한 일단 포커스가 확립되면 래그나 지연이 없도록 보증한다.
객체 모델
도 5는 다양한 정도로 조합될 수 있는 5개의 파트들을 포함하는 본 발명의 양태들과 조합하여 이용될 수 있는 다양한 객체들을 도시한다. 다음은 다음의 설명에서 사용되는 여러 용어들을 열거한다.
제1 파트는 전자 잉크의 수집을 지원하는 펜 서비스 애플리케이션(501)이다. 일례는 마이크로소프트사로부터 제공되고 윈도즈 XP 태플릿판(Windows XP Tablet Edition)에서 사용되는 wisptis.exe이다.
둘째로, (프로세스 1과 관련하여 도시된) 실시간 스타일러스 서비스(503)는 펜 서비스(501)로부터의 스타일러스 데이터를 컬렉션을 위하여 적당한 윈도즈에 전송하는 애플리케이션이다. 실시간 스타일러스 서비스(503)는 무한 개수의 객체들을 핸들링할 수 있거나 또는 용법에 걸쳐 최소화하도록 제한될 수 있다. 이를테면, 제한될 경우에는, 스레드당 예시적인 객체의 수는 16, 32, 64, 128 등이다. 물론, 다른 값들이 사용될 수도 있다.
셋째로, 실시간 스타일러스들(504 및 505)이 프로세스 1에 도시되어 있다. 실시간 스타일러스들(504 및 505)은 실시간 스타일러스 서비스(503)로부터 스타일러스 데이터를 수신할 수 있다. 각각의 실시간 스타일러스 객체는 (그 실시간 스타일러스 객체에 대한 관련 윈도 또는 영역에 기초하여) 윈도 또는 영역의 주어진 부분에 대한 스타일러스 데이터를 수신할 수 있다.
다중 프로세스들이 어떻게 동시에 구현될 수 있는지를 보여주기 위하여, 프로세스 2(506)도 도시되어 있다. 실시간 스타일러스 서비스(507)는 또한 펜 서비스(501)로부터 스타일러스 데이터를 수신하여 이 정보를 실시간 스타일러스들(508 및 509)에 전송할 수 있다.
실시간 스타일러스 객체들(504, 505, 508 및 509)는 도 6에 보다 상세히 도시되어 있다. 펜 서비스 컴포넌트(601)는 데이터 플로우 A에서 실시간 스타일러스 서비스(602)에 데이터를 전송한다. 다음으로, 실시간 스타일러스 서비스(602)는 데이터 플로우 B에서 하나 이상의 실시간 스타일러스 컴포넌트들(603)에 스타일러스 데이터를 전송한다. 대안적으로, 점선으로 도시된 실시간 스타일러스 서비스(602)에 의해 도시된 바와 같이, 이 서비스는 생략될 수 있고 스타일러스 데이터는 실시간 스타일러스 컴포넌트(603)에 직접 흘러갈 수 있다.
실시간 스타일러스 컴포넌트(603)에서 수신된 스타일러스 데이터는 플러그 가능 컴포넌트들(606-608)에 직접 공급될 수 있다. 대안적으로, 수신된 스타일러스 데이터는 순서화된 처리를 위하여 그것의 입력 큐(604)에 공급될 수 있다. 실시간 스타일러스 컴포넌트(603)는 다음으로 하나 이상의 플러그 가능 컴포넌트들에 스타일러스 데이터를 전송한다. 이들 컴포넌트들(606-608)은 현재 렌더링된 스타일러스 데이터를 저장하는 비주얼 스토어(visual store)를 갖는 다이내믹 렌더러(608)를 포함할 수 있다. 데이터 플로우들은 플로우 C 및 D를 포함한다.
다이내믹 렌더러(608)는 비주얼 스토어(609) 내에 하나 이상의 스트로크에 대한 패킷 데이터를 축적 및 저장할 수 있다. 이것은 스타일러스가 여전히 아래에 있는 동안 스트로크가 에지를 넘어 연장한 다음 잉크 가능한 영역(inkable region)에 다시 들어가는 경우에 유리하다. 만일 디스플레이된 윈도가 펜이 아래에 있는 동안 리페인트(repaint) 요구를 수신하면, 스토어(609)는 신속히 윈도를 리페인트하기 위한 정보를 제공한다. 만일 다이내믹 렌더러가 609에 스타일러스 데이터를 저장하지 않았다면, 시스템은 데이터가 출력 큐로부터 나와 잉크 수집 객체(611)에 들어갈 때까지 윈도를 리페인트하기를 기다리고 가장 현재의 스트로크 또는 스트로크들을 렌더링해야 할 것이다.
플러그 가능 컴포넌트들(606-608)은 스타일러스 데이터를 처리하기 위한 인터페이스를 통하여 특정 호출들에 응답할 수 있는 클래스 객체들이다. 사용될 수 있는 인터페이스의 일례는 IStylusSyncPlugin을 포함한다. 플러그 가능 컴포넌트들(606-608)의 조합은 개발자가 플러그인들 내의 패킷 스트림들로부터의 데이터를 충분히 제어하고, 변경하고, 심지어는 삭제할 수 있게 한다. 데이터 플로우 B로부터의 변경된 패킷 스트림은 그 후에 출력 큐(605)에 저장된다.
출력 큐(605)의 출력은 데이터 플로우 F 및 G를 통하여 흘러서 플러그 가능 컴포넌트들(610 및 611)의 다른 컬렉션에 입력된다. 이들 컴포넌트들은 제스처 인식기(610) 및 잉크 저장소(612)를 갖는 잉크 수집 객체를 포함할 수 있다. 갖가지 부가적인 플리그인 객체들이 데이터 플로우 F 및 G에 의해 탭(tap)될 수 있다.
플러그 가능 컴포넌트들(606-608)을 플러그 가능 컴포넌트들(610 및 611)과 분리하는 판정은 갖가지 기준에 기초할 수 있다. 이를테면, 컴포넌트들(606-608)은 동기식 플러그인들일 수 있고 컴포넌트들(610 및 611)은 비동기식 플러그인들일 수 있다. 대안적으로, 보다 짧은 스타일러스 데이터 핸들링 시간들을 갖는 플러그인들은 데이터 플로우 C/D에 의해 핸들링될 수 있고 보다 긴 스타일러스 데이터 핸들링 시간들을 갖는 플러그인들은 데이터 플로우 F/G에 의해 어드레싱될 수 있다. 하나의 스레드 C/D로부터의 컴포넌트들은 스레드 F/G의 것들과 교환될 수 있다.
2가지 세트의 플러그 가능 컴포넌트들(606-608 및 610-611)을 분리하는 하나의 이점은 그 플러그 가능 컴포넌트들이 서로 다른 스레드들에 의해 핸들링된다는 점이다. 여기서, 동기식 플러그인들과 비동기식 플러그인들 간의 차이는 그것들이 실행되는 스레드, 및 호출 시퀀스에 있다(동기식 플러그인들은 실시간 스타일러스(603)가 실행 중인 스레드에 의해 호출될 수 있고 비동기식 플러그인들은 패킷 스트림이 동기식 플러그인들에 의해 처리되고 출력 큐(605)에 저장된 후에 통상적으로 사용자 인터페이스/애플리케이션 스레드에 의해 호출된다).
일부 경우에는, 실시간 스타일러스 컴포넌트(603)로부터 펜 서비스(601) 또는 실시간 스타일러스 서비스(602)로의 공중 통신(public communication)이 있을 수 있다. 다른 경우에는, 실시간 스타일러스 컴포넌트(603)로부터 펜 서비스(601) 또는 실시간 스타일러스 서비스(602)로의 공중 통신이 없다. 통신을 막는 것은 이들 컴포넌트들로부터의 데이터의 흐름을 도울 수 있다.
일부 경우에, 실시간 스타일러스 컴포넌트(603)는 사전 정의된 순서로 플러그인들에 호출을 보냄으로써 데이터를 검색할 때 플러그인들에 통지할 수 있다. 이들 통지를 수신하는 플러그인들의 순서 및 타입들은 개발자에 의해 제어될 수 있다. 이벤트들 내의 패킷 데이터는 이들 플러그인들(606-608 및 610-611) 중 임의의 것에 의해 변경될 수 있다.
본 발명의 양태들은 펜 서비스들로부터의 패킷 데이터, 디스플레이, 태블릿, 펜 등에 관한 변경 통지, 및 실시간 스타일러스에 의해 핸들링될 수 있는 다른 데이터 세트들을 포함하는 갖가지 데이터 타입들과 함께 작용한다. 다음의 설명은 펜 서비스로부터의 패킷 데이터의 이용을 설명하지만, 이것은 실시간 스타일러스(603)로 이용될 수 있는 다수의 데이터 타입들 중 하나일 뿐이다. 다음에서는, RTS에 의해 핸들링되는 데이터 타입에 대한 일례로서 패킷 데이터가 이용되지만 RTS에 의해 핸들링될 수 있는 보다 일반적인 데이터를 참조하는 것으로 이해되어야 할 것이다.
실시간 스타일러스 컴포넌트(603)는 또한 큐들(604 및 605)을 포함할 수 있다. 출력 큐(605)는 실시간 스타일러스 컴포넌트(603)가 처리하는 모든 패킷 데이터를 유지할 수 있다. 일단 패킷 데이터가 플러그인으로부터 복귀하면 그 패킷 데이터는 데이터 플로우 E로부터 출력 큐(605)에 부가된다. 출력 큐(605)는 그 후에 플러그인들(이를테면, 동기식이고 일반적으로 잉크 수집 객체(611)를 포함하는)에 의해 사용될 수 있다. 이것은 데이터를 추출해내고(데이터 플로우 F) 데이터 플로우 G에서 출력 큐(605) 내에 유지된 데이터로부터 잉크 객체를 구성함으로써 일어날 수 있다.
출력 큐(605)의 사이즈는 고정일 수도 있고 아닐 수도 있다. 만일 고정이면, 큐(605)가 가득 찬 후에, 모든 후속 수신된 데이터 패킷들은 상실될 것이다. 만일 고정이 아니면, 큐(605)의 사이즈는 부가적인 데이터 패킷들을 수신하도록 확장될 수 있다. 고정 사이즈 큐를 유지하는 한 가지 이점은 데이터의 백로그(backlog)를 합당한 시간 내에 처리될 수 있는 것으로 제한한다는 점이다. 이를테면, 만일 최종 사용자가 시스템과 상호 작용하고 있고 그것이 반응하지 않게 될 경우, 그 최종 사용자는 시스템이 다시 한 번 반응할 때까지 기다림으로써 큐가 데이터를 상실하지 않고 백로그를 처리하도록 하는 것이 일반적이다. 또한, 만일, 어떤 이유로, 대용량의 스타일러스 데이터가 생성되면, 큐(605)는 고정 사이즈를 가짐으로써 데이터의 일부를 제거하는 것을 도울 수 있다.
출력 큐(605)는 데이터를 순서대로 수신할 때 고정일 수 있다. 대안적으로, 후술하는 바와 같이, 데이터는 실시간 렌더링과의 동기를 유지하기 위해 순서 없이 출력 큐(605) 내에 배치될 수 있다.
입력 큐(604)는 데이터 플로우 B(또는 만일 실시간 스타일러스 서비스(602)가 없으면, 데이터 플로우 A)에서 정보를 수신한다. 입력 큐는 플러그인들(606-608)에 데이터를 입력하는 처리를 제공한다. 대안적으로, 스타일러스 데이터는 플러그인들(606-608)에 직접 흘러갈 수 있다. 데이터 플로우 B와 C 사이에 중개물로서(여기서는 데이터 플로우 Z로서) 입력 큐(604)를 갖는 한 가지 이점은 그로 인해 아무 것도 존재하지 않는 곳에 생성된 데이터가 삽입될 수 있게 된다는 점이다.
다음은 상위 레벨 제어 흐름을 설명한다.
a. 실시간 스타일러스(603)는 패킷 데이터가 플러그인들(606-608)을 통과했을 때 패킷 데이터의 처리를 끝낸다.
b. 실시간 스타일러스(603)는 처리된 패킷 데이터를 출력 큐(605)에 저장한다.
c. 실시간 스타일러스(603)는 입력 큐(604)에 임의의 미처리된 패킷 데이터가 있는지를 살핀다. 만일 데이터가 있으면, 입력 큐로부터 그 패킷 데이터가 픽업되어 상기 a 단계에서 처리된다.
d. 실시간 스타일러스(603)는 펜 서비스(601)에 임의의 미처리된 패킷 데이터가 있는지를 살핀다. 만일 그렇다면, 펜 서비스(601)로부터 그 패킷 데이터가 픽업되어 상기 a 단계에서 처리된다.
e. 이 처리는 단계 c에서 반복된다.
다음은 실시간 스타일러스 객체가 어떻게 태블릿 펜 데이터를 핸들링할 수 있는지에 대한 대안적인 방법을 설명한다. 다음은 도 8, 11 및 13에 사소한 변경을 행하여 적용될 수 있고, 그 변경은 동기식 스레드 상의 플러그인들의 배열이다(각각이 각각에 데이지 체인되어 실시간 스타일러스 객체에 의해 개별적으로 호출됨).
a. 실시간 스타일러스 객체(603)는 먼저 그것의 입력 큐(604) 상에서 그런 다음 태블릿 펜 데이터 스트림 B로부터 플러그인 데이터 객체들을 체크한다.
b. 실시간 스타일러스 객체(603)는 그것의 동기식 플러그인 컬렉션 내의 객체들(606-608)에 C 하나의 플러그인 데이터 객체를 송신한다.
c. 일단 플러그인 데이터 객체가 동기식 플러그인 컬렉션의 모든 멤버들에게 송신되면, 플러그인 데이터 객체는 실시간 스타일러스 객체의 출력 큐(605) 상에 배치된다.
d. 실시간 스타일러스 객체(603)는 그 후에 처리할 다음 플러그인 데이터 객체를 체크한다(입력 큐(604) 또는 데이터 스트림 B로부터).
e. 실시간 스타일러스 객체의 출력 큐(605)가 데이터를 포함하는 동안, 실시간 스타일러스 객체(603)는 그것의 출력 큐(605)로부터 그것의 동기식 플로그인 컬렉션 내의 객체들(610-611)에 하나의 플러그인 데이터 객체를 송신한다. 각각의 동기식 플러그인(610-611)은 입력 큐(604) 또는 출력 큐(605)에 데이터를 부가할 수 있다. 그러나 동기식 플러그인들은 UI 스레드 상에서 실행될 수 있기 때문에, 큐들(604/605)에 부가된 데이터는 태블릿 펜 데이터 스트림 B 내의 데이터의 나머지에 또는 실시간 스타일러스 객체의 입력(604) 및 출력 큐들(605)에 대해 설정된 관계를 갖지 않는다.
넷째로, 시스템은 동기식 플러그인(611)(여기서는 잉크 수집 객체로 표현됨)을 포함한다. 여기서 잉크 수집 객체는 하나 이상의 플러그인 객체를 나타낼 수 있다. 잉크 수집 및 저장은 UI 또는 비동기식 스레드에서 일어나는 다양한 액션들 중 하나일 수 있다. 일단 패킷 데이터(또는 변경된 패킷 데이터)가 동기식 플러그인들(606-608)로부터 복귀하면, 그것은 실시간 스타일러스(603)의 출력 큐(605)에 배치된다. 실시간 스타일러스(603)는 그 후에 그 데이터를 출력 큐(605)에 배치한다. 데이터는 그 후에 (컬렉션 또는 체인 내의) 다음 플러그인 세트(610-611)에 전송된다. 이것은 데이터를 잉크 수집 객체(611)에 전송하는 것을 포함하고, 거기서 데이터는 동기식 스레드 상의 각종 플러그인들에 의해 특정된 대로 파괴되거나/삭제되거나/리사이클되거나/해방(free)된다.
다섯째로, 시스템은 시스템에 기본 기능을 제공하는 표준 플러그인들(이것들은 동기식 또는 비동기식 스레드들의 어느 한 쪽 또는 양쪽 모두에서 실행되도록 설계될 수 있음)을 포함할 수 있다. 표준 플러그인들은 다이내믹 렌더러(608) 및 제스처 인식기(610)를 포함할 수 있다. 물론, 표준 플러그인들은 원한다면 다른 플러그인들로 대체될 수도 있다. 또한, 본 발명의 양태들의 일부 구현에서는, 처음에 실시간 스타일러스와 함께 어떠한 표준 플러그인도 포함되지 않을 수 있다. 오히려, 개발자들은 제3자 공급자들로부터 선택하거나 및/또는 필요에 따라 그들 자신의 플러그인을 생성하도록 고무될 수 있다.
도 7 및 8은 도 6의 구조의 대안적인 버전을 제공한다. 도 7은 실시간 스타일러스(702)에 스타일러스 데이터를 제공하는 펜 서비스(701)를 도시한다. 입력 큐(703)(이것은 사용될 수도 있고 아닐 수도 있음)는 동기식 플러그인들(801-805)에 스타일러스 데이터를 제공한다. 여기서, 각각의 플러그인은 플러그인 컬렉션의 일부이다. 대안적으로, 플러그인들은 플러그인들의 체인의 일부일 수 있다. 최종 동기식 플러그인(실시간 스타일러스 동기 플러그인 N(805)) 후에, 스타일러스 데이터(또는 변경된 스타일러스 데이터)는 출력 큐(709)에 배치되고 그런 다음 후속의 실시간 스타일러스 이벤트 비동기식 플러그인들(710 및 808)에 의해 핸들링된다.
도 6 및 7의 데이터와 관련하여, RTS를 통하여 송신되는 각각의 데이터 세트는 단일 데이터 세트이거나 또는 디지타이저는 매우 고속으로 샘플링하기 때문에 효율성을 위하여 함께 묶인 데이터 세트들의 번들(a bundle of data sets)일 수 있다. 이들 데이터 세트들은 RTS를 통하여 각종 이벤트의 통지를 제공하거나 새로운 정보를 전송한다. 일부 경우에, 데이터 세트는 삭제될 수 있다. 다른 경우에, 데이터 세트가 데이터 세트들의 번들인 경우, 번들 내의 단일 데이터 세트는 삭제되면서 나머지 데이터 세트들은 유지될 수 있다. 효과적으로, 데이터 세트들의 번들은 변경된다. 실시간 스타일러스(702)는 그 후에 사신 메시지(private message)를 그것이 첨부되는 윈도에 포스트(post)하고 입력 시퀀스 내의 다음 데이터 세트로 진행할 수 있다(또는 입력 큐가 없다면, 펜 클라이언트 인터페이스 상의 펜 서비스(701)에 의해 호출된 함수로부터 복귀한다).
도 8A 및 8B는 갖가지 동작들에 대한 데이터 흐름을 도시한다. 도 8A는 펜 서비스(701)에서 컬러 변경이 수신되는 것을 도시한다. 실시간 스타일러스(702)는 동기식 플러그인 컬렉션(809) 및 비동기식 플러그인 컬렉션(810)을 포함한다. 동기식 플러그인 컬렉션은 동기식 플러그인 1(801), 다이내믹 렌더러(804) 및 동기식 플러그인 3(805)을 포함한다. 동기식 플러그인 컬렉션(809)으로부터의 출력은 출력 큐(709)에 보내진다. 비동기식 플러그인 컬렉션(810)은 출력 큐(709)로부터의 데이터 세트들을 수신하고 그것들을 비동기식 플러그인들 1-3(811, 812 및 813)에서 처리한다.
도 8A 및 8B에 대한 다음 설명에서는, 데이터 패킷들이 이용된다. 그러나, 정보를 전달하기 위해 다른 데이터 세트들이 이용될 수도 있다는 것을 알 것이다. 데이터 패킷들은 이용될 수 있는 데이터 세트들의 타입의 일례일 뿐이다. 여기서, 실시간 스타일러스(702)는 출력 큐(709)에 2개의 데이터 패킷들 A 및 B를 갖고 있다. 컬러 번경 CC가 펜 서비스(702)에 의해 수신될 때 데이터 패킷 C가 현재 다이내믹 렌더러(804)에 의해 처리되고 있다. 컬러 변경 CC는 즉시 비동기식 플러그인들 중 하나에 전송되어 처리될 수 있다. 그러나, 그렇게 하면 컬러 변경 전에 데이터 패킷들 A, B 및 C가 생성된 경우에 혼란스런 상황이 일어날 수 있다. 따라서, 비동기식 플러그인 컬렉션(810)에 의한 데이터 패킷들 A, B 및 C의 최종 처리 및 최종 렌더링 후에만 컬러 변경을 처리하기를 바랄 수 있다.
컬러 변경 CC의 처리를 지연시키기 위하여, 플러그인 컬렉션(809) 내의 동기식 플러그인들 중 하나가 데이터 객체 CC1을 생성하여 입력 큐(703)에 푸시할 수 있다. 다음으로 그 데이터 객체는 입력 큐에 의해 온라인으로 처리되고 컬러 변경의 결과는 출력 큐(709) 내의 CC2로 나타난다. 이 방법을 이용하여, 스토로크들의 컬러를 변경하는 지시는 이전에 수신된 데이터 패킷들과 함께 적절히 순서화될 수 있다.
도 8A는 실시간 스타일러스 컴포넌트(702)에 의해 핸들링되는 컬러 변경의 일례를 도시한다. 그러나, 입력 큐 또는 출력 큐에 의해 핸들링하기 위한 객체들을 생성하는 이 방법은 다른 이벤트들을 처리하는 데도 도움이 된다.
일부 플러그인들(다이내믹 렌더러를 포함하지만 이에 한정되지 않음)은 2개의 속성 카테고리 - 즉 변경이 즉시 효과를 얻는 것들 대 다음 스타일러스 다운(스트로크 스타트)으로부터 효과를 얻는 것들 - 를 가질 수 있다. 이 2개의 카테고리 간의 분류는, 기술적 고려 사항, 사용자 경험 및 사용자 기대에 대한 관심 등을 포함하는 갖가지 이유 때문에 발생할 수 있다. 이를테면, 스트로크 컬러 변경은, 스트로크 및 컬러 변경이 사용자의 견지로부터 발생한 순서를 보존하기 위하여 지연될 수 있다.
도 8B는 데이터 패킷들을 처리하고 동시에 제스처 인식 객체들을 핸들링하는 실시간 스타일러스 컴포넌트(702)를 도시한다. 출력 큐(709)는 스타일러스 다운 이벤트(SD), 데이터 패킷(P), 및 스타일러스 업 이벤트(SU)를 포함하는 다수의 데이터 객체들을 포함한다. 동기식 플러그인 컬렉션(809)에서 펜 서비스(701)로부터 스타일러스 업 이벤트 SU가 수신되면, 제스처 인식기는 하나 이상의 이전 데이터 패킷들 P로부터 제스처를 인식하려 시도한다. 만일 데이터 패킷이 제스처로서 인식되면, 제시처 인식기(814)는 제스처 인식 객체(GR)를 생성하여 그것을 입력 큐(703)에 배치한다. 객체의 제스처 인식 GR은 그 후 동기식 프러그인들을 통하여 송신되어 출력 큐(709)에 라우트된다. 출력 큐(709)로부터, 제스처 인식 객체 GR은 동기식 플러그인들을 통하여 전달된 다음 파괴/삭제/재사용(recycle)/해방(free)된다. 제스처 인식 객체가 생성되어 입력 플러그인 컬렉션(809)를 통하여 다시 전달되는 것의 이점은 프로세싱이 수신된 제스처 인식 객체가 출력 큐(709)에 전송되기 전에 변경 및/또는 삭제될 수 있게 한다는 점이다. 또한, 제스처 인식 객체 GR이 동기식 플러그인 컬렉션(809) 및 비동기식 플러그인 컬렉션(810)에 의해 핸들링되도록 함으로써, 스타일러스 다운 및 스타일러스 업 이벤트들 간의 데이터 패킷들은 제거될 수 있다. 왜냐하면, 그것들은 제스처 객체 GR의 존재로 대치되기 때문이다. 대안적으로, 그 제스처에 대응하는 데이터가 여전히 다운스트림의 다른 플러그인들과 관련이 있을 수 있는 이벤트들은 무시될 수 있다. 일반적으로, 시스템은 그 작용(behavior)이 개발자의 원하는 결과와 일관되도록, 즉 무시되는 데이터가 데이터 구조에 배치된 후에 그로부터 실제로 제거되도록 제스처 인식기가 존재할 때 어느 플러그인들이 존재하는지를 관리한다.
이를테면, InkCollectingObject 플러그인(이것은 패킷들의 테이블을 작성한 다음 SU 상에 잉크 스트로크를 생성함)은 GR이 그것에 도달할 때까지는 이미 스트로크를 생성하였을 것이다. 따라서, GR을 수신하면, InkCollectingObject는 단순히 이전에 생성된 스트로크를 삭제할 것이다. 그 후 다른 플러그인이 GR에 대해 적절한 액션을 트리거할 책임이 있을 수 있다.
동기식 및 비동기식 플러그인 컬렉션들 내에서의 데이터의 처리는 데이터에 대한 갖가지 핸들링 기법을 가능케 한다. 만일 일부 데이터가 일부 플러그인들에만 관련된다면, 다른 플러그인들은 그 데이터를 필요에 따라 무시하거나 전달할 수 있다. 예를 들면, 제1 플러그인은 데이터 패킷들이 디스플레이의 잉크 불가능(non-inkable) 영역과 관련이 있다고 판정할 수 있다. 제2 플러그인은 데이터 패킷들을 다음을 포함하는 갖가지 방법으로 핸들링할 수 있다:
a. 그 데이터 패킷으로부터의 통지를 무시하거나,
b. 통지를 흡수하고 그 데이터 패킷이 후속 플러그인들에 전달되지 않도록 무효로 하거나(nullify),
c. 그것이 통지에 관심이 없음을 특정한다(예를 들면, 제2 플러그인이 이들 패킷 타입들에 갖는 관심의 정도를 나타내는 속성을 설정함으로써). 여기서 실시간 스타일러스 컴포넌트는 그것이 데이터 패킷에 관심이 없다고 특정하였을 때 제2 플러그인을 스킵할 수 있다.
이 세 번째 방법 C는 아무 것도 요구되지 않을 때 함수 호출의 부하를 제거함으로써 성능 이점을 제공한다.
AddCustomStylusDataToQueue 메서드를 호출함으로써 커스텀 스타일러스 데이터(custom stylus data)가 실시간 스타일러스 객체에 부가될 수 있다. 만일 AddCustomStylusDataToQueue 메서드에의 호출이 그것의 IStylusSyncPlugin 메서드들 중 하나에의 호출에 응답하여 동기식 플러그인으로부터 행해진다면, 커스텀 스타일러스 데이터는 결정적 방식으로 태블릿 펜 데이터 스트림에 부가되고, 만일 그렇지 않다면, 그것은 비결정적 방식으로 부가된다. AddCustomStylusDataToQueue 메서드는 만일 RealTimeStylus 객체가 디스에이블되면 예외(exception)를 스로우(throw)한다.
커스텀 스타일러스 데이터는 실시간 스타일러스 객체의 큐들에 3개의 곳 중 하나에 부가될 수 있다.
a. 큐 파라미터가 "입력"으로 설정될 경우, 커스텀 데이터는 실시간 스타일러스 객체의 입력 큐에 부가되고 태플릿 펜 데이터 스트림으로부터의 새로운 데이터 전에 동기식 플러그인 컬렉션에 송신된다.
b. 큐 파라미터가 "출력"으로 설정될 경우, 커스텀 데이터는 동기식 플러그인 컬렉션에 의해 현재 처리되고 있는 데이터 뒤에 실시간 스타일러스 객체의 출력 큐에 부가된다.
c. 큐 파라미터가 "출력 중간"(output immediate)으로 설정될 경우, 커스텀 데이터는 동기식 플러그인 컬렉션에 의해 현재 처리되고 있는 데이터 전에 실시간 스타일러스 객체의 출력 큐에 부가된다.
상기 경우들 각각에서, 동기식 플러그인 컬렉션 내의 후속 플러그인들에 의해 부가된 데이터는 이전 플러그인들에 의해 부가된 데이터 뒤에 부가된다.
커스텀 스타일러스 데이터는 커스텀 스타일러스 데이터 객체로서 큐에 부가되고 플러그인들은 이 데이터를 그들의 IStylusSyncPlugin.CustomStylusDataAdded 또는 IStylusASyncPlugin.CustomStylusDataAdded 메서드를 통하여 수신한다.
다이내믹 렌더러 및 제스처 인식기 객체들은 커스텀 스타일러스 데이터를 큐에 부가할 수 있다.
실시간 스타일러스 객체는 그것의 AddCustomStylusDataToQueue 메서드에의 호출을 수신하는 스레드 상에서 IStylusSyncPlugin.CustomStylusDataAdded 메서드를 호출한다.
실시간 스타일러스 객체는 잉크를 수집하도록 구성될 수도 있고 아닐 수도 있다. 그것이 잉크를 수집하지 않는 경우에는, 잉크 데이터를 잉크 수집 객체에 전송하기 위해 실시간 스타일러스를 이용할 수 있다. 잉크 수집 객체는 실시간 스타일러스의 출력에 플러그인하는 잉크 수집 플러그인의 형태로 될 수 있다.
잉크 분석 또는 필기 인식은 실시간 스타일러스 객체의 기능이 아니다. 잉크-컬렉션 플러그인은 잉크를 수집하고 생성할 때, 또는 잉크를 인식하기를 원할 때, 잉크를 RecognizerContext 또는 Divider 객체에 복사할 수 있다.
상술한 바와 같이, 잉크는 1회 이상 디스플레이될 수 있다. 잉크는 처음에 다이내믹 렌더러를 이용하여 디스플레이될 수 있다. 잉크는 두 번째로 잉크 수집 객체에 수집된 후에 스태틱 렌더러를 이용하여 디스플레이될 수 있다. 이것은 잉크 수집 객체로부터 잉크가 수신될 때 잉크를 렌더링하기 위해 다른 타입의 렌더러들이 사용되도록 할 수 있다. 이를테면, 스태틱 렌더러의 일부로서 멀티컬러 잉크(multicolored ink)를 가질 수 있다. 이 효과들의 세트를 다이내믹 렌더러에 푸싱하는 것은 동기식 스레드에 대해 너무 인텐시브할 수 있다. 따라서, 렌더러를 생성하여 그것을 동기식 스레드에 부가할 수 있다. 대안적으로, 디폴트 다이내믹 렌더러를 무시하고 자신의 다이내믹 렌더러를 생성하여 그것을 동기식 스레드에 플러그인할 수 있다. 또한 객체 지향 방법들에서 이용되는 것과 같은 다형성(polymorphism), 집계(aggregation), 또는 포함(containment)를 통하여 표준 다이내믹 렌더러를 내부적으로 재사용하는 다이내믹 렌더러를 생성할 수 있다.
또한 이 새로운 렌더러를 비동기식 스레드 상에서 스태틱 렌더러로서 재사용하거나 또는 이 목적을 위해 새로운 렌더러를 생성할 수 있다. 이를테면, 목탄 또는 다른 팁으로 그려진 것처럼 잉크를 렌더링하기를 원할 수 있다. 또한, 물리적 잉크가 어떻게 마르는지를 나타내기 위해 시간에 따라서 (빠르게 또는 느리게) 끊임없이 컬러를 변경하는 것처럼 잉크를 디스플레이하는 렌더러를 생성할 수 있다. 더욱이, 잉크를 하이라이트하기 위해 (무지개에서와 같이) 순환 컬러(cycling colors)로 잉크를 디스플레이하는 렌더러를 생성할 수 있다. 특히, 스타일러스다운(StylusDown), 패킷(Packets), 및 스타일러스업(StylusUp) 통지들에 서브스크라이브(subscribe)하는 동기식 플러그인을 생성함으로써 다이내믹-렌더러-플러그인을 생성할 수 있다. 플러그인은 그 후 그려지는 것처럼 스트로크를 렌더링할 수 있다. 새로운 렌더러는 각종 선택 메커니즘뿐만 아니라 잉킹을 핸들링할 수 있다.
다이내믹-렌더-플러그인은 실시간 스타일러스 객체에 의해 핸들링되는 것처럼 실시간으로 태플릿 펜 데이터를 디스플레이하는 객체이다. 나중에, 폼 리프레시(form refresh)와 같은 이벤트들에 대해, 다이내믹 렌더러 플러그인 또는 잉크-컬렉션 플러그인은 잉크를 다시 그릴(redraw) 수 있다.
다이내믹 렌더러 객체는 IStylusSyncPlugin 인터페이스를 구현한다. 다이내믹 렌더러는 부가적으로 비동기식 인터페이스를 구현할 수 있다. 다이내믹 렌더러 객체는 그려지는 것처럼 잉크를 실시간으로 렌더링한다. 디폴트로, 리프레시 메서드가 호출될 때, 다이내믹 렌더러 객체는 임의의 다른 이전에 수집된 스트로크들(DynamicRenderer의 CachedData에 대응할 것이다)과 함께 현재 수집되고 있는 스트로크를 다시 그린다. 이를테면, 잉크가 주어진 형상 밖에 렌더링되지 않도록 클리핑 영역(clipping region)으로 그리기의 작용을 구속하는 파라미터들을 포함하는 리프레시 작용의 다른 오버로드도 가능하다.
이것은 (다이내믹 렌더러 객체가 잉크 데이터를 임시로 캐싱할 수 있는) 여러 도면들에 도시되어 있다. 다이내믹 렌더러가 그것의 IStylusSyncPlugin.StylusUp 메서드에의 호출을 수신할 경우, 그것은 스트로크 데이터를 캐싱하고 그 스트로크에 대한 StylusUpData 객체에 응답하여 입력 큐에 커스텀 스타일러스 데이터를 부가한다. CustomStylusData 객체의 CustomDataId 속성은 DynamicRendererCachedDataGuid 값으로 설정되고, CustomStylusData 객체의 Data 속성은 DynamicRendererCachedData 객체를 포함한다. 그 후 일단 잉크가 다운스트림에서 렌더링되면 다이내믹 렌더러의 캐시의 관련 데이터를 클리어한다. 대안적으로, 잉크를 리프레싱하는 것(CachedData에 저장된 데이터 및 현재의 스트로크들을 다시 그리는(redraw) 것)은 언제나 다이내믹 렌더러의 캐시의 잉크 스트로크들을 클리어할 수 있는 것은 아니다. 왜냐하면 그 잉크 스트로크들은 아직 잉크 수집 객체를 통과하여 그것에 의해 저장되지 않았을 수 있기 때문이다.
도 9 및 10은 본 시스템의 양태들을 확립하기 위한 프로세스들을 도시한다. 도 9, 단계 901에서, 실시간 스타일러스 컴포넌트가 인스턴스화된다. 단계 902에서, 동기식 및 비동기식 플러그인들이 인스턴스화된다. 이것은 다이내믹 렌더러 및/또는 제스처 인식기(903)의 인스턴스화를 포함할 수도 있고 아닐 수도 있다. 단계 904에서, 플러그인 컬렉션들에 플러그인들이 부가된다. 실시간 스타일러스가 단계 905에서 인에이블된다. 단계 906에서, 실시간 스타일러스를 통하여 펜 데이터가 수신된다.
도 10은 실시간 스타일러스를 사용하기 위한 프로세스를 도시한다. 단계 1001에서, RST에 의해 패킷이 수신된다. 이것은 입력 큐의 동작을 포함할 수도 있고 아닐 수도 있다. 입력 큐는 동기식 컬렉션을 통과하도록 임의 시간에 임의 데이터의 삽입을 지원한다. 이 예에서, 입력 큐에 데이터를 넣는 유일한 컴포넌트는, 이를테면, 펜 클라이언트 인터페이스의 RTS의 구현 상의 함수를 호출하는 결과로서, 펜 서비스이다.
단계 1002에서, 패킷은 동기식 플러그인 컬렉션에 들어간다. 도 8의 것과 같은 시스템의 경우, 이 단계는 패킷을 플러그인들 중 제1 플러그인에 전송하는 것을 의미한다. 실시간 스타일러스는 컬렉션(체인이 존재한다면 체인) 내의 제1 플러그인 상의 특정 패킷 데이터에 대해 적당한 함수를 호출한다. 많은 경우에, 이 컴포넌트는 데이터를 변경하거나 또는 그것을 그냥 내버려두는 옵션을 갖는다. 컴포넌트가 그것의 동작을 완료할 때, 그것은 다음 플러그인 객체 상에서 동일 함수를 호출하고, 등등이다.
단계 1003에서, 패킷은 동기식 플러그인 컬렉션(또는 체인)을 통하여 진행한다. 이것은 단계 1004에 도시된 바와 같이 제스처 인식기 또는 다이내믹 렌더러에 전송된 패킷들을 포함할 수도 있고 아닐 수도 있다. 만일 다이내믹 렌더러가 사용된다면, 그것은 커서 다운(cursor down) 이벤트(펜 다운(pen down) 이벤트라고도 불림)에서 패킷 데이터를 저장소에 축적하고 그것들을 스크린 상에 렌더링하기 시작할 수 있다(다이내믹 렌더러의 동작). 커서 업 이벤트(또는 펜 업 이벤트)에서, 다이내믹 렌더러는 다음 커서 다운 이벤트를 위하여 그것의 저장소를 클리어할 수 있다.
만일 제스처 인식기가 사용된다면, 제스처 인식기는 커서 다운 이벤트를 청취하고 그 자신의 저장소(이를테면, 저장소(807))에 데이터를 축적하기 시작한다. 스트로크들의 축적됨에 따라, 제스처 인식기는 스트로크들을 인식기에 전달하고, 만일 스트로크들이 원하는 패턴(또는 제스처)에 대응하면, a) 그 제스처 데이터가 출력 큐에 부가되고, b) 저장소가 비워지고 다음 커서 이벤트와 함께 다시 축적이 시작되어 큐를 통과한다. 여기서, 제스처들은 하나 이상의 스트로크를 포함할 수 있다는 것을 유의한다. 아래에서 더 상세히 설명되는 도 14는 도 10의 프로세스와 관련하여 다중 스트로크 제스처들이 어떻게 핸들링되는지를 보여준다.
어느 정도까지 플러그인이 이전 스트로크들을 알아야 하는지 또는 알 수 있는지는 플러그인의 용도에 의존한다.
a. 하나의 예시적 시나리오에서, 제스처를 청취하는 플러그인이 그 제스처에 응답하여 액션을 수행할 책임이 있을 수 있다. 스트로크에 대해서는 아무 것도 알 필요가 없을 수도 있다. 이를테면, 윈도 내의 "원"(circle) 제스처가 애플리케이션에 대한 "삭제"(delete)를 의미한다면, 그 제스처를 수신하는 플러그인은 단순히 윈도에 "삭제" 키스트로크를 보낼 것이다. 이 예시적 시나리오에서는 잉크가 윈도에 수집조차 되지 않을 수 있고, 그것은 텍스트를 포함하는 윈도일 수 있고 RTS 프레임워크는 이 경우에 스트로크 데이터가 수집되지 않고 단순히 폴 스루(fall through)하게 하도록 구성될 수 있다. 따라서 플러그인은 스트로크를 캐싱할 필요가 없다.
i. 대안의 경우에 상기 "인터프리터" 플러그인은 그 자신의 통지를 생성하여 다운스트림 플러그인들이 제스처가 해석되었고 따라서 그것의 스트로크(들)를 지속하지 않음을 알게 할 수 있다.
b. 다른 예시적 시나리오에서, 플러그인은 잉크 수집 및 편집 동작들을 수행할 수도 있다. 이것의 정규 예는 잉크 컬렉터 객체의 모드(잉크 및 제스처 모드)일 수 있고, 여기서는 모든 스트로크들이 잠재적으로 제스처이고, 만일 그것들이 제스처로 간주되면, 스트로크는 그 후 삭제된다. 따라서, 스트로크들이 결국 제스처로 해석된다면 플러그인은 스트로크들을 찾고 삭제할 수 있기 위하여 스트로크들을 캐싱해야 할 것이다.
이 예시적 시나리오들 양쪽 모두에서, 단일 및 다중 스트로크 제스처들 간의 구별은 실제로 중요하지 않고, 애플리케이션 시나리오는 다중 스트로크 제스처들(예컨대, 화살표)을 호출할 수 있고, 이 경우 상기 예시적 플러그인들 양쪽 모두는 당연히 다중 스트로크 제스처들을 알고 있을 것이다.
다음으로, 단계 1005에서, 패킷은 동기식 플러그인들의 컬렉션에 의해 처리된 후에 출력 큐에 들어간다. 먼저 설명한 바와 같이, 플러그인들의 컬렉션은, 그것에 보내진 객체들 각각을 핸들링할 때, 그 데이터 패킷을 변경, 삭제 및/또는 대체할 수 있다. 동기식 플러그인들의 아무 것도 패킷을 삭제하지 않았다고 가정하여, 단계 1005가 실행된다.
단계 1006에서, 패킷은 동기식 플러그인 컬렉션을 통하여 진행한다.
다이내믹 렌더링 및 왯 잉크
시스템은 스타일러스 데이터를 신속하고 효율적으로 핸들링하는 능력을 제공한다. 전자 잉크가 실제 잉크처럼 작용하게 하기 위하여, 전자 잉크는 스타일러스의 팁으로부터 실제 잉크처럼 용이하게 흘러나오는 것처럼 보일 필요가 있다. 잉크의 흐름에서의 작은 분열 또는 지연은 전자 잉킹 경험에 유해하다. 다음은 전자 잉크가 스타일러스로부터 매끄럽게 흘러나오는 것처럼 보이도록 하는 다양한 방법들을 설명한다. "왯 잉크"(Wet ink)는 잉크를 수집한 후에 얼마동안 다이내믹 렌더러가 스태틱 렌더링을 소유하는지를 제어하는 능력으로 간주된다. 다이내믹 렌더러에서 잉크의 수명 관리를 핸들링하는 것을 돕기 위하여, 잉크 수집 플러그인이 다이내믹 렌더러로부터 캐싱된(또는 왯) 잉크를 해방(free) 하는 통지가 사용될 수 있다(DynamicRendererCachedData로 불림).
갖가지 상이한 타입의 다이내믹 렌더러들이 생성될 수 있다. 이를테면, 파인 포인트(fine point) 또는 치절 포인트(chisel point) 펜에 의해 생성된 것처럼 잉크를 렌더링하는 대신에, 다이내믹 렌더러는 반투명 수성 페인트("워터 컬러"(water colors)라고도 함)에 의해 생성된 것처럼 잉크를 렌더링할 수 있다. 또한, 목탄 스타일러스에 의해 생성된 것처럼 잉크를 렌더링하는 다이내믹 렌더러들이 생성될 수도 있다. 또한, 다이내믹 렌더러는 잉크가 고정되지 않지만 규칙적으로 컬러를 변경하고 및/또는 이동하도록 잉크를 렌더링할 수 있다. 이를테면, 원하는 잉크 형태로 합체하는 잉크 또는 더스트의 작은 방울(small drops of ink or dust)로서, 결국 원하는 잉크를 형성하도록 함께 이동하는 작은 웜들(small worms)로서, 또는 컬러 또는 형상을 변경하는 잉크로서 나타나는 잉크를 렌더링할 수 있다.
다이내믹 렌더러는 RTS의 비동기식 스레드와 관련된 객체에 의해 나중에 렌더링되는 것과 동일한 형태로 잉크를 디스플레이할 수 있다. 대안적으로, 다이내믹 렌더러에 의해 렌더링된 잉크와 RTS의 비동기식 스레드와 관련된 잉크의 최종 디스플레이 간에 관계가 존재할 수 있다. 이를테면, 다이내믹 렌더러는 단지 나중에 동기식 스레드 상에서 플러그인에 의해 제2 음영 또는 형상으로 변경될, 제1 음영 또는 형상으로 잉크를 보여줄 수도 있다. 이것은 사용자에게 스타일러스로부터 흘러나오는 잉크 또는 페인트의 건조(drying)로서 나타날 수 있다.
다이내믹 렌더링 및 왯 잉크에 대한 다음 설명은 도 6-7에 적용될 수 있다. 설명을 목적으로, 도 6이 참조된다. 도 7의 구성도 동등하게 적용될 수 있고 다음 설명은 도 7도 포함하도록 요망된다.
도 6을 참조하면, 디지타이저 입력이 펜 서비스(601)로부터 입력되어 실시간 스타일러스(603)에 도달한다. 실시간 스타일러스는 디지타이저 입력을 다수의 동기식 플러그인 객체들(606-608)을 통하여 전달하여 그 결과를 출력 큐(605)에 저장한다. 객체들(606-608)은 객체들(606-608) 간의 링크, 이를테면, IStylusSyncPlugin을 기술하는 인터페이스를 통하여 연결될 수 있다. 그 후 객체들(610-611)의 비동기식 펄러그인 컬렉션이 출력 큐(605)로부터의 출력을 수신하여 그것을 처리하기 시작한다. 이를테면, 잉크 수집 객체(611)는 출력 큐로부터 디지타이저 입력을 추출하여 그것을 잉크로서 저장할 수 있다. 디지타이저 입력의 다이내믹 렌더링은 실시간 스타일러스 컴포넌트(603)가 (변경되거나 또는 변경되지 않은) 디지타이저 입력을 다이내믹 렌더러(608)에 전달할 때 일어난다. (변경되거나 변경되지 않은) 디지타이저 입력의 스태틱 렌더링은 디지타이저 입력이 잉크 수집 객체(611) 내부의 잉크 저장소에 저장될 때 일어난다.
발생할 수 있는 하나의 문제는 다이내믹 렌더링(608) 후에 그리고 디지타이저 입력이 잉크 수집 객체(611) 내부에 저장되기 전에 잉킹 표면이 무효로 될 수 있는 경우이다. 결과로 일어나는 사용자 경험은 디지타이저 입력이 잉크 수집 객체(611)에 도달할 때까지 디스플레이된 잉크가 사라지는 것일 것이다. 사용자는 잉크를 재생성할 필요가 있다고 믿고 그렇게 하는 데 시간을 소비할 수 있고, 결국 중복 잉크가 저장될 것이다. 이러한 비주얼 문제(visual hiccup)는 잉크가 즉시 사용자에게 보여지지 않거나 지연 후에 보여지는 때문이다.
이 사라지는 잉크 시나리오를 피하기 위하여, 다이내믹 렌더러(608)와 잉크 수집 객체(611) 간에 통신 프로토콜이 확립될 수 있다. 다이내믹 렌더러(608)는 잉크 수집 객체(611)에 의해 디지타이저 입력을 릴리스(release)할 수 있다고 지시를 받을 때까지(이를테면, 디지타이저 입력이 잉크 스토어(612)에 저장된 때) 계속해서 디지털 입력을 비주얼 스토어(609)에 저장할 수 있다.
본 명세서의 목적을 위하여, 다이내믹 렌더러(608) 내의 디지타이저 입력의 임시 캐시(609)는 일반적으로 cacheddata로 불린다. 왯 잉크는 디지타이저 입력이 잉크 수집 객체(611) 내에 저장되기 전에 시스템이 잉크를 렌더링할 수 있는 능력이다.
도 11은 잉크 수집 객체가 어떻게 다이내믹 렌더러에게 그것의 캐싱된 데이터를 릴리스하도록 경보하는지를 도시한다. 다이내믹 렌더러(1201)는 비주얼 스토어1202)를 포함한다. 잉크 수집 객체는 잉크 스토어(1204)를 포함한다. 일단 다이내믹 렌더러(1201)가 스타일러스 데이터를 비주얼 스토어(1202)에 저장하면, 그것은 입력 큐(1205)에 객체를 출력한다. 실시간 스타일러스(이를테면, 702)는 펜 서비스(701) 쪽으로 보기 전에 다음 데이터가 처리되도록 입력 큐를 프로브(probe)한다. 본 명세서의 목적을 위하여, 입력 큐에 삽입된 객체는 DynamicRendererCachedData로 불린다. 이 객체는 그 후 실시간 스타일러스(702)에 의해 픽업되어 (부가적인 처리로 또는 부가적인 처리 없이) 그것을 출력 큐(1206)에 출력한다. 한편, 잉크 수집 객체(1203)는 수신된 스타일러스 입력 패킷들을 출력 큐(1206)에 나타나는 순서로 처리한다. 잉크 수집 객체(1203)가 다이내믹 렌더러(1201)로부터의 객체(여기서는, DynamicRendererCachedData 객체)를 만나면, 다음을 수행한다:
a. 다이내믹 렌더러에 의해 랜더링된 스트로크와 매칭하는 적당한 상관 스트로크(correlating stroke)를 생성하고;
b. 다이내믹 렌더러 상에 존재하는 그리기(drawing) 속성들을 렌더링될 스트로크에 적용하고;
c. 다이내믹 렌더러(1202)에 릴리스(release) 통지를 보낸다. 이 통지는 다이내믹 렌더러 상의 메서드를 실행하고 파라미터를 전달하는 것을 수반한다.
상기 단계 B는 모든 스트로크들이 출력 큐 밖으로 옮겨지기 전에 그리기 속성 변경들의 동기화가 일어났는지 여부에 따라서 적당히 수행할 수도 있고 아닐 수도 있다. 도 8A는 그리기 속성 변경들을 이전에 수신된 데이터 패킷들과 동기화하기 위한 프로세스에 관한 것이다.
그리기 속성들은, 여러 방법들 중에서도 특히, 개발자의 요구에 따라서 시스템 내에 설정될 수 있고, 또는 잉크 수집 객체(1203)에 전달된 객체에 제공될 수도 있다. 릴리스 통지는 다이내믹 렌더러(1201)에 의해 제공된 인터페이스 상의 호출일 수 있다. 여기서, 통지는 ReleaseCachedData일 수 있다.
도 12는 왯 잉크를 핸들링하는 대안적인 방법을 도시한다. 도 12는 실시간 스타일러스(702)에 스타일러스 데이터를 보내는 펜 서비스 입력(701)을 포함한다. 입력 큐(703)는 입력들을 핸들링하고 큐잉할 수 있고 그 결과로 실시간 스타일러스 이벤트 싱크들이 출력 큐(709)에 배치된다. 도 12는 부가적인 큐(1101)를 포함한다. 이 큐는 다른 실시간 스타일러스 이벤트 싱크들 A(1103) 및 B(1104)로부터 분리된 다이내믹 렌더러(1102)로부터의 결과들을 핸들링한다. 여기서, 이 방법은 실시간 스타일러스 이벤트 싱크들 A(1103) 및/또는 B(1104)스타일러스로부터 흘러나오는 잉크의 출현을 더디게 하는 발생할 수 있는 문제를 다룬다. 도 12의 시스템은 다른 이벤트 싱크들 A(1103) 및 B(1104)를 핸들링하기 전에 스타일러스 데이터의 다이내믹 렌더링을 핸들링한다. 이벤트 싱크들 A(1103) 및 B(1104)가 잉크 수집 객체(1105)로 가는 도중에 스타일러스 데이터의 처리에서의 지연을 여전히 초래할 수 있다 하더라도, 다이내믹 렌더링(1102) 이벤트 싱크는 스타일러스 데이터가 수신되는 대로 처리를 계속한다. 여기서, 다이내믹 렌더러(1102)에 의해 스타일러스 데이터가 렌더링되자마자, 출력은 부가적인 큐(1101)에 보내지고 그 후 거기서 실시간 이벤트 싱크들 A(1103) 및 B(1104)에 의해 액세스된다. 실시간 이벤트 싱크들 A(1103) 및 B(1104)가 어떻게 액세스되는지의 처리는(하나가 다른 하나를 호출하거나 또는 양자 모두가 부가 큐(1101)에 의해 호출됨) 어느 한 쪽의 방법에 의하여 수행될 수 있다.
도 13은 스타일러스로부터 왯 잉크가 흘러나오도록 하는 방법에 대한 또 다른 양태를 도시한다. 여기서, 제2 실시간 스타일러스 오브젝트가 별도의 스레드에 존재한다. 펜 서비스(701)는 스타일러스 데이터를 실시간 스타일러스 컴포넌트(1301)에 출력한다. 입력 큐(1302)는 스타일러스 데이터를 다이내믹 렌더러(1303)에 제공한다. 다른 동기식 플러그인들이 실시간 스타일 컴포넌트(1301)와 관련될 수도 있고 아닐 수도 있다. 선택적(optional) 동기식 플러그인들은 제스처 인식기(1304) 및 다른 동기식 플러그인들(1305)을 포함한다. 이들 동기식 플러그인들로부터의 출력은 출력 큐(1306)에 전송된다. 여기서, 실시간 스타일러스 컴포넌트(1307)가 실시간 스타일러스 컴포넌트(1301)로부터 출력 큐(1306)로 접속된다. 실시간 스타일러스 컴포넌트(1307) 및 그것의 관련 동기식 플러그인들(1309-1313) 및 비동기식 플러그인들(1312-1313)은 실시간 스타일러스 컴포넌트(1301)의 견지에서 비동기식 플러그인으로 작용한다. 데이터 패킷들(실시간 스타일러스 컴포넌트(1301)의 동기식 플러그인들에 의해 어떤 식으로 변경되었더라도)은 실시간 스타일러스 컴포넌트(1307)용의 동기식 플러그인 컬렉션에 전송된다. 이를테면, 실시간 스타일러스 컴포넌트(1307)용의 동기식 플러그인은 동기식 플러그인 A(1309), 동기식 플러그인 컴포넌트 B(1310) 및 (이전에 사용되지 않았다면) 제스처 인식기(1313)를 포함한다. 제스처 인식기(1313)는 임의의 실시간 스타일러스 컴포넌트용의 동기식 스레드 또는 비동기식 스레드와 관련될 수 있는 일종의 플러그인이다. 제스처 인식기(1313)를 실시간 스타일러스 컴포넌트(1307)용의 동기식 플러그인 컬렉션과 관련시키는 것은 단지 예시를 위한 것일 뿐이다.
실시간 스타일러스 컴포넌트(1307)의 동기식 플러그인 컬렉션의 출력은 출력 큐(1311)에 전송된다. 비동기식 플러그인 객체들(1312-1313)은 그 후 출력 큐(1313) 내의 데이터 패킷들을 핸들링할 수 있다. 다시, 잉크는 다이내믹하게 랜더링되고 애플리케이션이 차단되는 경우에도 펜으로부터 매끄럽게 흘러나온다.
참고로, 각종 플러그인 컴포넌트들은 플러그인 컬렉션 내에서 서로 따르는 대신에 함께 체인될 수도 있다는 것에 유의한다. 여기 도 13에서는 동기식 플러그인 컴포넌트 A(1309)가 동기식 플러그인 컴포넌트 B(1310)에 체인된 예가 도시되어 있다. 물론, 플러그인 컴포넌트들을 함께 체인하거나 그것들을 컬렉션 내에 모으는 방법들은 본 발명의 양태들에 따라서 플러그인 컴포넌트들을 어드레싱하기 위해 서로에 대해 대안적으로 또는 서로에 부가하여 사용될 수 있다.
제스처 인식
제스처 인식은 제스처가 행해졌는지를 판정하려고 시도하고 그것을 적절히 핸들링한다. 제스처 인식기(610)는, 예를 들면, 디지타이저 입력을 보고, 다이내믹 렌더러(608)와 유사하게 제스처 인식 결과들을 입력 큐에 주입할 책임이 있다. 도 8B는 동기식 및 비동기식 플러그인 컬렉션들에 의해 어떻게 제스처 인식이 수행될 수 있는지를 설명한다. 그 설명은 제스처 인식 객체의 동작과 관련이 있다.
제스처 인식기(610)는 알고리즘을 이용할 수 있다. 여기서, 제스처 인식기는 다중 스트로크 제스처들을 인식하기 위해 순열 알고리즘(permutation algorithm)을 이용할 수 있다. 이를테면, 스트로크들의 최대 수에 관한 속성이 설정되어 있을 경우, 제스처 인식기는 그 다수의 스트로크들을 되돌아본다. 이를테면, 속성이 2로 설정되면, 제스처 인식기는 가장 최근의 2개의 스트로크들을 되돌아보고 그것들을 제스처로 인식하려고 한다. 이것은 다중 인식 호출들을 초래할 수 있다. 그러나, 이 방법은 최종 스트로크 후에 제스처 인식기가 처리를 시작하는 것을 기다려야 하는 일정한 지연을 제거한다.
도 14는 제스처 인식기가 제스처의 부분들을 얻기 위해 얼마나 멀리 뒤돌아보는지에 대한 예를 도시한다. 결과들은 객체(여기서는, 이를테면 GestureRecognitionData로 명명된 것)에 저장될 수 있다. 결과들은 실시간 스타일러스 입력 큐에 주입될 수 있다.
일단 잉크 수집 객체(611)가 제스처 객체(여기서는, GestureRecognitionData)를 수신하면, 그것은 잉크 스토어(612)로부터 그 제스처에 대한 스트로크들을 제거하고 그 제스처에 응답하여 적절한 액션들을 수행한다.
상술한 바와 같이, 제스처 인식을 수행하기 위하여, 시스템은 Tap 제스처에 대한 StylusUpData 객체와 같은 제스처를 완료하는 데이터에 응답하여 입력 큐에 SystemGestureData 객체를 부가할 수 있다.
제스처 인식기는 각종 인터페이스들을 갖는 객체로서 구현될 수 있다. 예를 들면, 제스처 인식기 객체는 IStylusSyncPlugin 및 IStylusAsyncPlugin 인터페이스들을 구현할 수 있다.
제스처 인식기 객체가 제스처를 인식하면, 그것은 그 스트로크에 대한 StylusUpData 객체에 응답하여 입력 큐에 커스텀 스타일러스 데이터를 부가한다. CustomStylusData 객체의 CustomDataId 속성은 GestureRecognitionDataGuid 값으로 설정되고, CustomStylusData 객체의 Data 속성은 GestureRecognitionData 객체를 포함한다.
디폴트로, 제스처 인식기 객체는 단일 스트로크 제스처들만을 인식한다. 제스처 인식기 객체는 다중 스트로크 제스처들을 인식하도록 설정될 수 있다(예컨대, 도 14 참조). 다중 스트로크 제스처들에 대해서는, 제스처의 최종 스트로크에 대한 StylusUpData 객체에 응답하여 CustomStylusData 객체가 입력 큐에 부가된다. 다중 스트로크 제스처들을 인식할 때, 스트로크들의 중첩 세트에 대한 통지를 수신할 수 있다. 예를 들면, 제1 및 제2 스트로크들은 함께 하나의 제스처로서 인식될 수 있고, 제2 스트로크는 단독으로 제스처로서 인식될 수 있고, 제2 및 제3 스트로크들은 함께 또 하나의 제스처로서 인식될 수 있다.
만일 다중 스트로크 제스처 인식을 위하여 제스처 인식기 객체를 사용한다면, 캐스케이딩된 실시간 스타일러스 모델을 사용할 수 있고 실시간 스레드 상의 지연들을 감소시키면서도 사용자 인터페이스 스레드 상의 지연들에 의해 제스처 인식이 영향을 받는 것을 막기 위하여 제2 실시간 스타일러스 객체에 제스처 인식기 객체를 부가할 수 있다.
또한, 필기, 제스처, 또는 다른 객체들을 다음 3가지 방법으로 인식하는 커스텀 제스처 인식기를 생성할 수 있다.
a. 기존의 인식기 객체에 스트로크 정보를 전달하고 AddCustomStylusDataToQueue 메서드를 이용하여 결과들을 펜 데이터 스트림에 부가하는 방법.
b. 커스텀 플러그인 내에서 인식을 수행하고 AddCustomStylusDataToQueue 메서드를 이용하여 결과들을 펜 데이터 스트림에 부가하는 방법.
c. 데이지 체인 방식으로 표준 플러그인을 호출하는 커스텀 플러그인으로 표준 제스처 인식기 플러그인을 래핑(wrapping)하는 방법. 이런 방법으로 개발자는, 인에어 패킷들(in-air-packets)을 Packet들로 "변환"(translating)하고, Cursor-In-Range를 StylusDown으로 변환하고, CursorOutOfRange를 StylusUp으로 변환함으로써, 인에어 제스처(in-air gesture) 인식을 구현할 수 있다.
실시간 스타일러스 객체는 시스템 데이터들이 시스템에 의해 인식될 때 그것들에 관한 정보를 수신한다. 다음 표는 SystemGestureData 객체들이 다른 펜 데이터와 관련하여 펜 데이터 스트림 내의 어디에서 발생하는지를 설명한다. 다음 리스트는 예시적인 것으로 모두 다 열거한 것이 아니다. 본 발명의 범위를 벗어나지 않고 본 발명의 양태들과 관련하여 다른 제스처들이 사용될 수도 있다.
시스템 제스처 설명
Tap StylusDownData 객체 뒤에, 그리고 StylusUpData 객체 앞에.
DoubleTap StylusDownData 객체, Tap 시스템 제스처에 대한 SystemGestureData 객체, 및 StylusUpData 객체 뒤에, 그리고 제2 StylusDownData 객체 앞에.
RightTap StylusDownData 객체 및 HoldEnter 시스템 제스처에 대한 SystemGestureData 객체 뒤에, 그리고 StylusUpData 객체 앞에.
Drag StylusDownData 객체 뒤에, 그리고 StylusUpData 객체 앞에.
RightDrag StylusDownData 객체 뒤에, 그리고 StylusUpData 객체 앞에.
HoldEnter StylusDownData 객체 뒤에, 그리고 StylusUpData 객체 앞에. 이 시스템 제스처는 사용자가 Drag 또는 RightDrag 시스템 제스처를 시작하면 인식되지 않는다.
HoldLeave 선택적(Optional)
HoverEnter 저 평균 속도의 몇 개의 InAirPacketData 객체들 뒤에. HoverEnter 시스템 제스처를 수신하기 전에 현저한 지연이 있을 수 있다. 실시간 스타일러스 객체는 단지 시스템 제스처의 시점에 펜 바로 아래에 있는 윈도 또는 제어에 실시간 스타일러스 객체가 부착되는 경우에만 이 데이터를 수신한다.
HoverLeave HoverEnter 제스처에 대한 SystemGestureData 객체 및 충분한 평균 속도의 몇 개의 InAirPacketsData 객체들 뒤에. HoverLeave 시스템 제스처를 수신하기 전에 현저한 지연이 있을 수 있다. 실시간 스타일러스 객체는 단지 시스템 제스처의 시점에 펜 바로 아래에 있는 윈도 또는 제어에 실시간 스타일러스 객체가 부착되는 경우에만 이 데이터를 수신한다.
동기식 및 비동기식 처리
실시간 스타일러스 인스턴스가 인스턴스화될 때, 실행 스레드가 인스턴스화될 수 있다. 실행 스레드는 동기식 객체들 및 비동기식 객체들로 분리될 수 있다. 동기식 객체들은 일반적으로 펜 서비스 컴포넌트로부터 발생된 패킷들과 동기하여 동작한다. 비동기식 객체들은 일반적으로 펜 서비스 컴포넌트들로부터 발생된 잉크 스트로크 및/또는 다른 데이터 패킷들과 동기하여 항상 실행될 필요가 없는 객체들로서 그룹화된다. 이들 2개의 스레드의 분리는 다이내믹 렌더러가 데이터 패킷들의 수신과 동기하여 데이터 패킷을 신속히 핸들링하도록 허용하고, 다른 플러그인 객체들을 허용하고, 이 다른 플러그인 객체들은, 더 중요하지만, 원 데이터 패킷들의 수신으로부터 약간 지연되더라도 정확히 핸들링될 수 있다.
동기식 플러그인들의 컬렉션은 실시간 스타일러스 인스턴스에 대해 인스턴스화된 이 새로운 스레드 상에서 실행된다. 비동기식 플러그인들의 컬렉션은 사용자 인터페이스 스레드에서 실행될 수 있다.
실시간 스타일러스 스레드는, 잉킹(패킷 큐잉 및 다이내믹 렌더링)이 일반적으로 응답성이 있고 매끄럽도록, 계산적으로 가벼운 활동을 위해 의도되어 있을 수 있다. 따라서, 계산적으로 가벼운 처리만이 일반적으로 동기식 플러그인들에 대한 스레드로 구현될 것이다.
(통상적으로 출력 큐의 출력과 관련된) 사용자 인터페이스 스레드는 통상적으로 계산적으로 집약적인 활동들을 필요로 하는 비동기식 플러그인들에 의해 사용된다. 사용자 인터페이스(UI) 스레드에서의 일시적 두절에 대해 강건하도록 실시간 스타일러스 스레드와 사용자 인터페이스 스레드 사이에 큐 아키텍처가 보조하기 위해 제공된다. UI 스레드는 실시간 스타일러스 스레드 상에 수집된 패킷들 및 다른 데이터의 최종 목적지일 수도 있고 아닐 수도 있다. 대안적인 아키텍처들이 계산적으로 집약적인 활동들을 더 잘 핸들링할 수도 있고, 그에 의하여 개발자가 펜 스레드와 사용자 인터페이스 스레드를 블로킹하는 것 사이에 타협하도록 쉽게 강제하지 않는다는 것에 유의한다. 이를테면 여기에서 설명된 캐스케이딩된 디자인은 스레드들의 분리가 상이한 활동들을 더 잘 핸들링할 수 있게 한다.
제스처 인식기는 동기식 스레드 상에서 구현될 수도 있고 또는 만일 제스처 인식기가 기대된 대량의 제스처 인식 활동들(예를 들면, 스트로크들이 대비될 다수의 수용된 제스처들)로부터 느려질 것으로 판단되거나 예기되면 비동기식 스레드 상에서 구현될 수도 있다. 제스처 인식기 객체는 게발자에게 어느 한 쪽 또는 양쪽의 스레드들로부터 객체를 이용하는 유연성을 부여하기 위하여 동기식 플러그인 인터페이스 및 비동기식 플러그인 인터페이스 양쪽 모두를 가질 수 있다. 이 능력은 제스처 인식기에 제한되지 않는다. 다이네믹 렌더러 또는 임의의 다른 플러그인은 임의로 어느 한 쪽 또는 양쪽의 큐들에서의 사용을 지원할 수 있다. 개발자가 어디에 플러그인이 있을 좋은 위치를 기대하는지에 따라서,플러그인이 이를 지원한다면 플러그인을 동기식 컬렉션에 배치하거나 또는 비동기식 컬렉션에 배치하거나 또는 양쪽 모두에 배치할 수 있게 하기 위하여, 모든 플러그인들은 동기식 인터페이스나, 비동기식 인터페이스나, 또는 양쪽 모두를 가질 수도 있고 아닐 수도 있다.
실시간 스타일러스 객체는 태블릿 펜 데이터 스트림에의 실시간 액세스를 제공하고 그 자신의 스레드 상에서 실행될 수 있다. 동기식 플러그인들은 일반적으로 실시간 스타일러스 객체의 스레드 상에서 실행될 수도 있고 아닐 수도 있는 반면, 비동기식 플러그인들은 일반적으로 애플리케이션의 사용자 인터페이스(UI) 스레드 상에서 실행될 수도 있고 아닐 수도 있다. 다이내믹 렌더링과 같이 데이터 스트림에의 실시간 액세스를 필요로 하고 계산적으로 가벼운 태스크들을 위한 플러그인들을 동기식 스레드 상에 배치함으로써 동기식 스레드와 비동기식 스레드를 분리할 수 있다. 잉크 수집과 같이 데이터 스트림에의 실시간 액세스를 필요로 하지 않는 태스크들을 위한 플러그인들은 비동기식 스레드 상에 배치될 수 있다.
다중 스트로크 제스처 인식과 같이 특정 태스크들은 계산 집약적(computionally intensive)이면서도 태블릿 펜 데이터 스트림에에 실시간 액세스에 가까운 것을 필요로 한다. 도 12 및 13에 도시된 바와 같이 이들 태스크들을 핸들링하는 플러그인들은 하나의 스레드 상에 또는 다른 스레드 상에 그룹화될 수 있고 또는 캐스케이딩된 실시간 스타일러스 객체들의 부분일 수도 있다.
캐스케이딩
실시간 스타일러스 인스턴스들은, 많은 점에서, 확장성 및 정책을 캡슐화하는 스레드 호스트(thread host)이다. 도 13은 다수의 동기식 스레드들이 어떻게 함께 동작하는지의 예를 도시한다. 제스처 인식기는 동기식 스레드 상에서 위치(1304)에 배치될 수도 있고 또는 동기식 스레드 상에서 위치(1313)에 배치될 수도 있다.
만일 개발자가 멀티스레드 방식(muti-threaded manner)으로 접속하기를 원하는 다수의 기능들이 있다면, 개발자는 다수의 실시간 스타일러스 인스턴스들을 캐스케이딩하여 그들의 기능을 동기식 플러그인들에 플러그인할 수 있다.
이 특징을 제안하는 특정 시나리오는 '진정으로 중단할 수 없는'(truly uninterruptible) 잉킹을 실현하는 것이다. 제스처 인식기는 때때로 개발자가 특히 다중 스트로크 제스처들에 관심이 있을 때 인식 결과들을 얻는 데 상당한 지연 시간을 초래할 수 있다. 따라서, 제스처 인식기는, 다이내믹 렌더링을 방해할 가능성이 있기 때문에, 다이내믹 렌더러가 위치하는 실시간 스타일러스의 동기식 컬렉션 상에 있지 않을 수 있다. 제스처 인식기는 또한 비동기식 플러그인들의 컬렉션을 갖는 잉크 수집 객체와 함께 배치될 수도 있다.
도 13에 도시된 것과 같은 시스템은 데이터베이스에 액세스하는 것과, 웹 서버에 포스트하는 것과, 스크린을 리프레시하는 것 등을 포함하는 동작들을 위해 계산 집약적인 동작들을 제스처 인식기 또는 다른 스레드들과 분리하기를 원하는 경우에 유익하다. 제스처 인식이 '진정으로 중단할 수 없는' 경험의 필수 부분인 경우에, 제스처 인식기가 그 자신의 스레드, 즉 제2 실시간 스타일러스 스레드 상에서 실행되게 할 수 있다.
실시간 스타일러스는 비동기식 인터페이스를 구현함으로써, 따라서 그것이 단순한 비동기식 플러그인 인스턴스로서 작용하게 함으로써 이 용법을 지원할 수 있다. 다으은 실시간 스타일러스가 어떻게 다른 실시간 스타일러스에 부가될 수 있는지를 설명한다. 다음은 구현될 수도 있고 아닐 수도 있는 다수의 옵션들을 제공한다.
1. 실시간 스타일러스가 비동기식 플러그인들의 컬렉션에 부가될 때, 시스템은 다른 비동기식 플러그인 인터페이스들이 부가될 수 없도록 관계를 제한할 수 있다.
2. 상이한 수의 실시간 스타일러스 객체들이 다수의 디멘전을 따라서 캐스케이딩될 수 있다. 이를테면, 다수의 RealTimeStylus 객체들이 단일 "부모" RealTimeStyles에 직접 접속될 수 있고, 또는 대안적으로 다수의 RealTimeStylus는 각각이 다음 것에 캐스케이딩하도록 직렬로 접속될 수 있고, 또는 대안적으로 RealTimeStylus 객체들은 전술한 구성들의 조합으로 접속될 수도 있다. 구현자는 단순성 또는 신뢰성을 위하여 이들 조합을 강제(constrain)하기로 결정할 수 있다.
3. 다수의 실시간 스타일러스 부모들로부터 비동기식 플러그인들의 다수의 컬렉션들로 동일한 실시간 스타일러스 인스턴스가 부가될 때, 캐스케이딩 실시간 스타일러스는 정상처럼 기능할 수 있다. 대안적으로, 캐스케이딩 (자식) 실시간 스타일러스 인스턴스는 기능을 중지하고 ErrorData 객체를 큐에 삽입할 수 있다. ErrorData 객체는 데이터에 에러가 있다거나 또는 이전의 플러그인이 ㄷ이터를 처리하는 동안에 에러를 만난 것을 다운스트림 객체들에게 지시하는 것일 수 있다. 물론, 이것은 에러를 핸들링하는 하나의 방법일 뿐이다. 다른 방법들도 이용될 수 있다.
일 구현예는 캐스케이딩을 위한 컬렉션 점으로서 비동기식 플러그인 컬렉션을 재사용할 수 있지만, 대안적인 구현예는 캐스케이딩된 RTS를 접속하기 위한 전용 접속점을 가질 수 있고, 그에 의하여 캐스케이드 내의 각각의 RTS가 그 자신의 독립적인 세트의 동기식 및 비동기식 플러그인들을 갖게 할 수 있다는 점에 유의한다.
ErrorData 객체의 존재는 캐스케이딩과는 독립적일 수 있다는 것을 알 것이다. 그래서, ErrorData 객체의 발생은 캐스케이딩된 실시간 스타일러스 컴포넌트들에 의해서만이 아니라 단일 실시간 스타일러스 컴포넌트와 관련하여 발생할 수 있다.
다이내믹한 플러그인 컬렉션 변경
실시간 스타일러스 상의 동기식 및 비동기식 플러그인 컬렉션들은 성능 이점을 위하여 실시간 스타일러스를 디스에이블한 다음에 다시 인에이블하지 않고도 변경될 수 있다. 따라서, 실시간 스타일러스 범위에서 행해지는 '인에이블된'(enabled) 또는 '디스에이블된'(disabled) 동작이 있다는 보증이 없다.
플러그인들이 초기화 및 클린업(initialize & clean-up)할 수 있는 타이밍을 보증하기 위하여, '인위적'(artificial)(인에이블 및 디스에이블하는 진정한 클라이언트 코드 호출들로부터 생기지 않은 것을 의미함) RealTimeStylusEnabled & RealTimeStylusDisabled 호출들이 플러그인들에 대해 행해질 수 있고, 이 플러그인들은 플러그인 컬렉션들에 다이내믹하게 삽입되거나 또는 그로부터 제거된다.
다음은 플러그인들을 부가하거나 제거할 때 일어날 수 있는 몇몇 작용들을 설명한다.
Figure 112005035311642-PCT00001
인에이블된 실시간 스타일러스 인스턴스에 플러그인이 부가될 때는, 인위적 RealTimeStylusEnabled 호출이 이 플러그인에 대해 행해질 수 있고;
Figure 112005035311642-PCT00002
디스에이블된 실시간 스타일러스 인스턴스에 플러그인이 부가될 때는, 아무 일도 일어나지 않을 수 있고;
Figure 112005035311642-PCT00003
인에이블된 실시간 스타일러스 인스턴스로부터 플러그인이 제거될 때는, 인위적 RealTimeStylusDisabled 호출이 이 플러그인에 대해 행해질 수 있고;
Figure 112005035311642-PCT00004
디스에이블된 실시간 스타일러스 인스턴스로부터 플러그인이 제거될 때는, 아무 일도 일어나지 않을 수 있다.
이들 관계들이 유지되는 방법은 실시간 스타일러스 인에이블된 호출을 받을 때마다 카운터를 증가(increment)시키는 것을 포함할 수도 있고 아닐 수도 있다. 실시간 스타일러스 디스에이블된 호출을 받을 때마다, 이 카운터는 감소(decrement)된다. 카운터가 1일 때,이 플러그인은 기능한다. 카운터가 1보다 크게 될 때, 이 플러그인은 예외(exception)을 제기(raise)하고 그것의 기능을 금한다. 카운터가 다시 1로 떨어질 때, 이 플러그인은 디스에이블된 채로 있는다. 플러그인은 카운터가 다시 0으로 떨어질 때만 자신을 다시 인에이블한다. 다른 방법들이 사용될 수도 있다.
에러 전파
설계 시간
개발 환경(예컨대, 마이크로소프트사에 의한 Visual Studio.NET)에 있는 동안 개발자들은 트라이 캐치(try catch)에 의해 캐치되든 아니든 관계 없이 제기되는 임의의 예외(Exception)에서 브레이크할 수 있다. 따라서, RealTimeStylus 프레임워크의 무효 구성들을 검출하는 목적으로 에러 보고는 간단하다(straightforward).
실행 시간(Run Time)
에러 보고/전파 문제는 실행 시간 에러들에 대해 어려워질 것이다. 왜냐하면 실시간 스타일러스 및 동기식 플러그인들은 UI 스레드(app 스레드)와는 다른 실시간 스타일러스 스레드(잉크 스레드) 상에서 실행되기 때문이다. 만일 동기식 플러그인이 예외를 제기한다면, 그것은 실시간 스타일러스에 의해 캐치되지만 예외는 그것을 넘어서 갈 데가 없다. 왜냐하면 그것은 실시간 스타일러스 스레드(잉크 스레드) 상에 있고, 제어 흐름의 기점(origin)은 실시간 스타일러스이기 때문이다. 에러를 사용자 인터페이스에 전파하고 클라이언트 코드가 그 에러를 적절하게 다루게 하는 것은 어려울 수 있다. 다음은 해법을 설명한다.
.NET 표준 에러 핸들링은 예외들이 발생할 때 플러그인들로부터 이벤트들을 파이어(fire)하고, UI 스레드 내의 개발자의 에러 핸들링 코드가 이 이벤트를 청취하게 하는 것이다. 이것은 그러나 실시간 스타일러스에 대해서는 효과가 없다. 왜냐하면 플러그인이 이벤트를 파이어할 때, 예의를 일으킨 데이터가 큐잉 때문에 UI 스레드에 도달하지 않았을 가능성이 있기 때문이다. 예외가 에러 핸들링 코드에서 발생한 컨텍스트(즉 불량 데이터는 물론 이전 및 후속 데이터)의 이용 가능성 없이 적절한 에러 핸들링을 수행하는 것은 도전적인 문제이다. 이 방법은 에러 다이얼로그를 제기하고 애플리케이션을 끝내는 것과 같은 극히 단순한 에러 핸들링에 대해서만 양호하다.
실시간 스타일러스 프레임워크 내에서 에러 핸들링을 수행할 적당한 곳은 프리그인들(동기식 또는 비동기식) 내이다. 왜냐하면 플러그인은 개발자의 제어 하에 있는 유일한 코드 블록들이기 때문이다.
실시간 스타일러스 스레드(잉크 스레드)는 동기식 플러그인으로부터 제기딘 예외에서 즉시 기능을 중지해서는 안 된다. 왜냐하면 그럴 경우 UI 스레드(app 스레드)에서 에러 핸들링을 수행하는 것이 불가능하기 때문이다(예컨대, 큐들은 에러 핸들링을 위해 원상태대로 있을 필요가 있다). 또한, 하나의 플러그인이 무효 입력이라고 생각하는 것은 다른 플러그인에 대해 완전히 유효할 수 있다.
도 15는 가능한 해법을 도시한다. 여기서, 예외 정보는 ErrorData 객체로서 큐를 통하여 리라우팅(re-route)된다. 에러 핸들링은 플러그인들에서 수행될 수 있다. 예외 정보는 플러그인들에 대해 생성된 데이터 흐름, 즉 큐를 통하여 처리될 수 있다.
도 15에 도시된 바와 같이, 실시간 스타일러스(603)는 플러그인들(606-608)로부터 오는 모든 예외들을 캐치하고 ErrorData 객체를 생성한다. 다음은 에러들을 식별하기 위한 프로세스를 도시한다:
a. 만일 동기식 또는 비동기식 플러그인들에 대한 인터페이스 상의 에러 메서드에서 예외가 발생했다면, 예외 기점 플러그인으로 다시 호출함으로써 무한 루프를 피하기 위해 아무런 ErrorData 객체도 생성되지 않는다.
i. 대안적인 방법은 예외를 일으킨 실제 데이터 전에, 컬렉션 내의 나머지 플러그인들을 통하여 ErrorData 객체를 즉시 전달하는 것이다.
b. 만일 동기식 또는 비동기식 플러그인 메서드들에 대한 인터페이스 상의 다른 메서드들에서 예외가 발생했다면, ErrorData 객체는 즉시 예외 기점 플러그인 자체에 먼저 전달되고, 그 후에 예외를 일으킨 실제 데이터 전에, 컬렉션 내의 나머지 플러그인들을 통하여 전달된다.
c. 예외가 동기식 플러그인들에서 발생했다면 ErrorData는 결국 출력 큐에 큐잉되고, 그렇지 않다면 비동기식 플러그인들에 전달된다.
d. ErrorData가 컬렉션을 통과한 후에, 예외를 일으킨 데이터는 컬렉션 내의 나머지 플러그인들을 통하여 전달된다.
ErrorData는 전용 메서드(예컨대, IStylusSyncPlugin.Error 메서드 또는 IStylusAsyncPlugin.Error 메서드)에 의하여 플러그인을 통하여 전달될 수 있다.
보다 구체적으로, 플러그인이 예외를 스로우(throw)할 때, 데이터의 통상의 흐름은 중단(interrupt)된다. 실시간 스타일러스 객체는 ErrorData 객체를 발생시키고 예외를 스로우한 플러그인의 IStylusSyncPlugin.Error 또는 IStylusAsyncPlugin.Error 메서드 및 그 컬렉션 내의 나머지 플러그인들의 IStylusSyncPlugin.Error 또는 IStylusAsyncPlugin.Error 메서드를 호출한다. 만일 예외를 스로우한 플러그인이 동기식 플러그인이면, ErrorData 객체는 출력 큐에 부가된다. 그 후 실시간 스타일러스 객체는 원 데이터의 통상의 처리를 재개한다.
만일 플러그인이 그것의 에러 메서드로부터 예외를 스로우하면, 실시간 스타일러스 객체는 예외를 캐치하지만 새로운 에러 데이터 객체를 발생시키지는 않는다. 대안적으로, 새로운 에러 데이터 객체는 개발자의 욕구 또는 구현에 따라서 생성될 수 있다. 이 대안적인 방법에서, 실시간 스타일러스는 그 후 재귀의 수를 제한함으로써 임의의 생성된 루프를 감소시킬 수 있고 또는 그것은 리스크를 전부 무시할 수도 있다.
동기식 플러그인들에 의해 부가된 커스텀 스타일러스 데이터와 관련하여, 에러 데이터는 출력 큐에 부가되는데, 에러 데이터를 생성한 예외 전에 "출력 즉시"(output immediate) 큐에 부가되는 임의의 커스텀 스타일러스 데이터 뒤에 그리고 동기식 플러그인 컬렉션 내의 후속 플러그인들에 의해 "출력 즉시" 큐에 부가되는 임의의 커스텀 스타일러스 데이터 앞에 부가된다. 만일 동기식 플러그인들 중 어느 하나가 에러 데이터에 응답하여 커스텀 스타일러스 데이터를 "출력 즉시" 큐에 부가한다면, 이 데이터는 에러 데이터 바로 앞에 부가된다. 만일 동기식 플러그인들 중 어느 하나가 에러 데이터에 응답하여 커스텀 스타일러스 데이터를 출력 큐에 부가한다면, 이 데이터는 에러 데이터 바로 뒤에 부가된다.
실시간 스타일러스 객체는 그로부터 예외가 스로우된 스레드 상의 IStylusSyncPlugin.Error 메서드를 호출한다.
관리/비관리 예시(Managed/Unmanaged Illustrations)
도 16은 본 발명의 양태들을 구현하는 다양한 방법들을 도시한다. 이 시스템은 C# 관리 객체들의 컬렉션에 의해 래핑(wrap)된 COM 객체들을 포함할 수 있다. 대안적으로, 자바, C++ 등을 포함하는 임의의 객체 지향 언어가 사용될 수 있다.
도 16은 관리 및 비관리 공간 양쪽 모두에 존재하는 실시간 스타일러스 컴포넌트를 도시한다. 도 16은 다이내믹 렌더러, 비동기식 플러그인 Y, 비동기식 플러그인 및 제스처 인식기를 포함한다.
펜 서비스(1601)는 비관리 코드 영역에서 그것의 입력 큐(1603) 및 출력 큐(1604)를 갖는 실시간 스타일러스 컴포넌트(1602)에 스타일러스 데이터를 송신한다. 스타일러스 데이터는 관리 코드 영역에서 실시간 스타일러스 컴포넌트(1605)에 전달된다.
다이내믹 렌더러는 실시간 스타일러스 컴포넌트에 부착된 제1 동기식 플러그인이다. 비관리 공간에서, 그것의 데이터 캐시(1616)를 갖는 다이내믹 렌더러(1608)가 실시간 스타일러스 컴포넌트(1602)에 부착된다. 유사하게 관리 공간에서, 그것의 데이터 캐시(1617)를 갖는 다이내믹 렌더러(1615)는 실시간 스타일러스 컴포넌트(1605)에 대한 동기식 플러그인 컬렉션의 일부이다. 동기식 플러그인 컬렉션 내의 다음 동기식 플러그인은 동기식 플러그인(1607)이다. 동기식 플러그인(1607)은 실시간 스타일러스 컴포넌트(1605)에 대한 동기식 플러그인 컬렉션 내의 다이내믹 렌더러의 뒤를 따른다. 동기식 플러그인 Y(1607)는 관리 공간에만 존재하기 때문에, 동기식 플러그인 래퍼(wrapper)(1618)는 비관리 실시간 스타일러스 컴포넌트(1602)가 관리/비관리 경계를 넘어서 동기식 플러그인(1607)에 액세스할 수 있게 한다.
도 16은 또한 비동기식 플러그인들의 컬렉션을 도시한다. 비동기식 플러그인들은 비동기식 플러그인(1612) 및 제스처 인식기(1609)를 포함한다. 비동기식 플러그인(1612)은 관리 공간에서 실시간 스타일러스 컴포넌트(1605)에 부착된 비동기식 플러그인 컬렉션 내의 제1 비동기식 플러그인이다. 비동기식 플러그인(1612)은 관리 공간에 있기 때문에, 비동기식 플러그인 래퍼(1619)가 사용되어 비관리 실시간 스타일러스 컴포넌트(1602)로부터 그것에의 액세스를 허용할 수 있다. 제스처 인식기는 관리 공간 및 비관리 공간 양쪽 모두에 존재한다. 그것의 데이터 캐시(1610)를 갖는 관리 제스처 인식기(1609)는 비동기식 플러그인(1612) 뒤에 액세스되는 다음 플러그인이다. 제스처 인식기(1609)는 그것의 데이터 캐시(1614)를 갖는 제스처 인식기(1613)의 비관리 버전과 정보를 교환할 수 있다.
도 16의 관리측과 비관리측 간의 데이터 크로싱은 비관리 영역에서 사용되는 구조와 관리 영역에서 사용되는 구조 간에 변환되거나 "마샬링"(marshal)될 필요가 있을 수 있다. 마이크로소프트사에 의한 .NET 프레임워크는 이 마샬링의 많은 것을 수행하는 상호 운용성 층을 제공한다. 이 부가적인 데이터 처리는 암시된 성능 페널티(implied performance penalty)를 초래하므로, 도 16에 도시된 것과 같은 디자인은 상호 운용성 층 크로싱들의 수를 최소화하도록 조정된다.
RTS(1605)에 대한 관리 래퍼와 비관리 RTS(1602) 간의 관계는 네이티브(비관리 RTS(1602)에 대한 것이고, 관리 RTS(1605)는 다른 RTS 이벤트 싱크와 비슷하다. 그것의 생성자(constructor) 내의 다이내믹 렌더러(1615)에 의해 인스턴스화될 때, RTS(1605)는 대응하는 비관리 다이내믹 렌더러(1608)에 액세스하고 그것을 그 자신 뒤에 동기식 플러그인 컬렉션 내에 후킹(hook)한다.
관리 제스처 인식기 객체(1609)는 비동기식 플러그인의 완전 구현(full implementation)일 수 있다. 그것은 관리측의 패킷 데이터를 축적하고 그것을 상호 운용성 층을 가로질러 마샬링하고, 비관리 코드 구현(1613) 내에 전달한다. 반환 코드는 패킷들이 제스처에 대응하는지 여부이다.
관리 및 비관리 다이내믹 렌더러 객체들(1615 및 1608) 또한 도 16에 도시되어 있다. 관리 다이내믹 렌더러 객체는 비관리 다이내믹 렌더러(1608)의 속성들에 대한 신 래퍼(thin wrapper)일 수 있다. 관리 다이내믹 렌더러(1615)는 선택적(optional)이다. 만일 다이내믹 렌더러(1615)가 여기서에 인스턴스화되지 않으면, 그것은 다른 동기식 플러그인들 중 하나로서 인스턴스화될 수 있다.
다음은 도 16의 시스템을 생성하기 위한 프로세스이다.
a. 첫째로, 개발자가 관리 비동기 플러그인(1612) 및 관리 다이내믹 렌더러(1615)를 인스턴스화한다. 내부적으로, 다이내믹 렌더러(1615)는 속성 설정들을 아래로 전달하기 위하여 비관리 다이내믹 렌더러(1608)를 인스턴스화한다.
b. 둘째로, 개발자는 다이내믹 렌더러(1615) 상의 속성들을 설정한다(그리기 속성 등).
c. 셋째로, 개발자는 실시간 스타일러스(1602)를 인스턴스화하여, 실시간 스타일러스 생성자 내의 다이내믹 렌더러(1615)를 전달한다. 내부적으로 소수의 일들이 일어날 수 있다:
i. 관리 실시간 스타일러스(1605)는 비관리 다이내믹 렌더러(1608)의 어드레스를 쿼리한다(퍼블릭 실드 액세서(public sealed accesser)를 통하여).
ii. 관리 실시간 스타일러스는, 자신을 펜 서비스(1608)에 후킹하는, 네이티브 실시간 스타일러스(1602)를 인스턴스화한다.
iii. 관리 실시간 스타일러스(1605)는 자신을 실시간 스타일러스 이벤트 싱크로서 네이티브 실시간 스타일러스(1602)에 후킹한다.
iv. 관리 실시간 스타일러스(1605)는 네이티브 다이내믹 렌더러(1608)를 그것의 동기식 출력에 후킹한다.
v. 관리 실시간 스타일러스(1605)는 자신을 네이티브 실시간 스타일러스(1602) 동기식 플러그인 스레드에 후킹한다.
d. 넷째로, 개발자는 관리 제스처 인식기(1609)를 선택적으로 포함하여, 하나 이상의 동기식 및/또는 비동기식 플러그인 객체들을 인스턴스화한다.
e. 다섯째로, 개발자는 관리 플러그인 객체들을 다양한 플러그인 컬렉션들로 함께 모은다. (이것은 RealTimeStylus 컴포넌트들에게 플러그인들이 액세스되어야 하는 순서를 통지함으로써 행해질 수 있다. 대안적으로, 플러그인들을 함께 체인 접속하기 위하여, 속성을 설정하고 이것에서 제1 플러그인을 참조할 수 있다.)
f. 여섯째로, 개발자는 관리 비동기식 플러그인 객체(1612)를 관리 실시간 스타일러스(1605) InkCollectionObject 속성과 관련시킬 수 있다(따라서 비동기식 플러그인 객체(1612)를 비동기식 플러그인 컬렉션에 후킹한다).
g. 일곱째로, 개발자는 RTS.Enabled를 "참"(true)으로 설정할 수 있다. 이것은 또한 관리 실시간 스타일러스(1605)로 하여금 네이티브 실시간 스타일러스(1602) 상에서 IRealTimeStylus->Enabled를 "참"으로 설정하게 할 수 있다.
h. 여덟째로, 이벤트들이 실시간 스타일러스(1602)를 통하여 흘러들기(streaming in) 시작한다.
단계 (c)는 대안적으로 구성으로 실현될 수 있다. 이를테면, API는 RTS 생성자 상에 임의의 플러그인 특정 조정들(plug-in specific accommodations)을 갖지 않을 수 있다. 대신에, RTS 생성자의 다양한 오버로드들이 RTS 자신이 어떻게 사용될 것인지를 기술한다(예컨대, 하나 또는 다수의 디지타이저, 마우스 대 펜 동작 등과 관련된, 윈도 또는 컨트롤에 부착되는). 다이내믹 렌더러 파라미터는 interop 경계를 여러 번 가로지르는 데이터의 성능 함축(performance implications) 때문에 사용될 수 있다. 그 결과 다이내믹 렌더러는 플러그인 컬렉션 또는 체인 내의 첫 번째 또는 마지막 동기식 플러그인이 되는 구조적 의미에서 사용될 수 있다.
도 16은 interop 크로싱을 최소화하고 다이내믹 렌더러가 플러그인들의 순서화된 리스트에서 어디에나 있을 수 있게 하는 아키텍처의 방법을 도시한다.
다음은 도 16의 시스템을 이용하기 위한 프로세스를 설명한다.
a. 펜 서비스(1601)는 RTS(1602) 상의 함수를 호출하여, 축적된 데이터를 실시간 스타일러스 컴포넌트(1602)와 관련된 동기식 플러그인 컬렉션 내에 전달한다. 일부 경우에, 입력 큐(1603)로부터의 데이터도 플러그인 컬렉션 내에 전달될 수 있다.
b. 네이티브 RTS(1602)는 입력 큐(1603) 내에 새로운 데이터가 나타날 때(또는 그것이 펜 서비스(1601)에게 드러내는(expose) 인터페이스 상에서 적당한 메서드가 호출될 때) 다음을 행한다:
i. 패킷들을 디지타이저 공간으로부터 himetric("잉크 공간")으로 변환하고;
ii. 역변환(himetric → 디지타이저)을 패킷 데이터에 포함(embed)시기코;
iii. 동기식 플러그인 컬렉션 인터페이스(이 경우에는 관리 RTS) 상의 데이터에 대한 적당한 함수를 호출함으로써, 변환된 패킷 데이터를 플러그인 컬렉션 내의 제1 동기식 플러그인 내에 전달한다.
c. 관리 RTS(1605)는 다음을 행한다:
i. 관리 친화적 방식으로 데이터를 유지하는 적당한 관리 데이터 구조를 생성하고;
ii. 컬렉트된 관리 동기식 플러그인들 상의 적당한 함수를 호출하고;
iii. 각각의 플러그인이 데이터를 처리하여 다시 실시간 스타일러스 컴포넌트(1605)에 반환함으로써 다음 플러그인이 호출될 수 있도록 보증하고;
iv. 그것이 제스처 인식기(1609) 상의 대응하는 함수를 호출할 때까지(만일 제스처 인식기(1609)가 사용되고 있다면) 계속한다.
d. 다이내믹 렌더러(1615)는 실시간 스타일러스(1605)에 의해 호출될 수 있다. 다이내믹 렌더러(1615)가 그것이 반환하는 새로운 패킷들을 렌더링하는 것을 끝내면, 비관리 RTS(1602)는 패킷 데이터가 변경되었는지를 검출하고, 적당한 데이터를 큐 내에 넣는다. 만일 부가할 "비즉시"(non-immediate) 사용자 데이터가 있다면, 그것은 그것들을 지금 부가한다.
e. 네이티브 RTS(1602)는 그 후 사적 메시지를 부착된 윈도에 포스트한다.
f. 네이티브 RTS(1602)는 그 후 입력 큐(1603)를 들여다보고 임의의 실시간 데이터가 부가되었는지를 확인하고 만일 그렇다면 다시 동기식 플러그인 컬렉션을 호출하여 그 데이터를 전달한다. 만일 아무런 데이터도 부가되지 않았다면, 네이티브 RTS(1602)는 복귀하여, 펜 서비스(1601)가 진행하여 새로운 디지타이저 데이터로 다시 RTS(1602)를 호출할 수 있게 한다.
g. 사적 메시지는 네이티브 RTS(102) 상의 서브클래스 프로시져에게 보여지고, 이 네이티브 RTS(1602)는 큐(1603)로부터 데이터를 검색하고 부착된 동기식 플러그인 인터페이스 상의 적당한 함수를 호출한다.
h. 이 경우에, 관리 RTS(1605)는 그 자신을 접속하였고 호출된다. 관리 RTS(1605)는 그 후 계속해서 비동기식 플러그인(1612) 상의 대응하는 함수까지 호출한다. 이것은 플러그인 래퍼(1619)를 통하여 전달될 수 있다.
i. 관리 비동기식 플러그인(1612)은 그 후 비동기적으로 데이터를 처리하여, 적절히 렌더링하고 축적한다.
j. 제스처 인식기(1609)는 실시간 스타일러스 컴포넌트와 떨어져 있는 비동기식 플러그인 컬렉션의 일부로서 호출될 수 있다. 제스처 인식기(1609)는 CurseUp을 만날 때까지 내부적으로 패킷들을 축적하고, CurseUp을 만난 시점에서 축적된 패킷들은 상호 운용성 경계를 가로질러 인식을 위한 네이티브 제스처 인식기(1613) 내에 전달된다.
i. 이 동작은 어느 제스처(들)가 인식되었는지, 및 얼마나 많은 스트로크들이 가능한 제스처들 각각에 대응하는지에 관한 정보를 반환한다.
ii. 제스처 인식기(1609)는 그 후 ("immediate"가 false로 설정된) 관리 RTS(1605) 상의 AddUserDataToQueue 메서드를 이용하여 제스처 인식의 결과들을 비동기식 소비(asynchronous consumption)를 위해 큐(1604)에 넣는다. (이것은 새로운 제스처 데이터가 즉시 상호 운용성 경계(또는 interop)를 가로질러서 네이티브 플러그인 컬렉션이 완료될 때까지 다른 큐에 놓이게 한다.
iii. 그것은 부가적으로 전통적인 관리 이벤트를 임의의 청취자들에게 파이어(fire)하여 제스처가 방금 일어났다는 것을 실시간으로 세계에 통지한다.
iv. 현재의 데이터는 그 후 제스처 인식기(1609)에 의해 플러그인 컬렉션 내의 임의의 부가적인 플러그인들에 대한 실시간 스타일러스 컴포넌트(1605)에 반환된다.
데이터 세트 및 흐름
다음은 이벤트 싱크 핸들러들 및 그들과 관련된 정보를 리스트한다:
Figure 112005035311642-PCT00005
Source IRealTimePen
이 백 포인터는 이벤트 싱크 구현에 소스 RealTimeStylus에의 후방 참조(back-reference)를 제공한다. 이 포인터는 2가지를 가능케 한다: (a) 스타일러스 인스턴스에 관한 액세스 컨텍스트 정보(예컨대, 다이내믹 렌더러(1615)는 디지타이저 좌표들과 픽셀들 간의 단위 변환을 할 수 있어야 한다), 및 (b) 다수의 RTS 이벤트 체인들 사이에서의 공유.
Figure 112005035311642-PCT00006
TabletContextID
실시간 데이터의 소비자가 데이터를 효율적으로 축적하고 데이터 컬렉션 내의 인덱서(indexer)로서 태블릿 ID를 이용할 수 있게 한다.
Figure 112005035311642-PCT00007
PacketDescription
패킷 호출 내의 데이터의 레이아웃을 기술한다. 서로 다른 디지타이저들이 (예컨대) x, y, 압력, 각도를 포함하는 서로 다른 정보량을 지원한다. PacketDescription은 패킷의 수신기에게 이 데이터가 어떻게 결국 도착하는 정수들의 평탄 배열(flat array)로 배열되는지를 지시한다.
Figure 112005035311642-PCT00008
CursorID
실시간 데이터의 소비자가 데이터를 효율적으로 축적하고 데이터 컬렉션에 대한 인덱서로서 커서 ID를 이용할 수 있게 한다.
Figure 112005035311642-PCT00009
StylusInfo
TabletContextID;
CursorID;
반전된 상태(이것은 커서가 펜의 "지우개" 단부에 대응하는지 아니면 펜의 "기록" 단부에 대응하는지 및 관련성을 나타내는 3상태(tri-state)이다);
버튼 상태(32개까지의 버턴들 각각이 눌려있는지 여부); 및
필요한 다른 관련 정보
를 포함하는 편리한 정보를 통합(consolidate)하는 단순 구조
Figure 112005035311642-PCT00010
PropertyCountPerPacket
개발자가 API 호출 없이 패킷 데이터의 레이아웃을 추론할 수 있게 하는 절충(compromise) 파라미터.(X, Y가 첫 번째이고 그 순서대로인 것으로 보증되고, 카운트는 xy 데이터에만 관심 있는 개발자가 매 n번째 엘리먼트마다 스킵하여 리스트를 통해 진행할 수 있게 한다).
Figure 112005035311642-PCT00011
CountOfPackets
효율성을 위하여 "함께 묶인"(bundled together) 패킷들의 수(펜 서비스 및/또는 디지타이저 디바이스 드라이버는 언제 그리고 얼마나 많은 패킷들이 이런 식으로 묶이는지를 결정한다).
Figure 112005035311642-PCT00012
PacketData
이것은 패킷 데이터의 읽기 전용 복사본이다.
Figure 112005035311642-PCT00013
CountofPacketsRef
플러그인 개발자들이 할당할 수 있는 변경된 패킷 데이터 세트 내의 패킷들의 수
Figure 112005035311642-PCT00014
PacketDataRef
이것은 플러그인 객체들의 개발자들에게 실시간 데이터 조작을 수반하는 시나리오들을 성취하기 위하여 패킷 데이터를 변경하는 능력을 부여하는 패킷 데이터에의 참조이다.
일 구현에서, 플러그인 컬렉션 구현들이 패킷 데이터가 플러그인 컬렉션에 들어가기 전에 변경되었는지 여부를 "알게" 하지 않을 수도 있다. 대안적으로, 플러그인 컬렉션들은 패킷 데이터가 변경되었는지를 통보 받을 수 있다. 예컨대, 데이터 상의 플래그 또는 데이터와 관계 없는 플래그가 세트될 수 있다. 플러그인 컬렉션들이 패킷 데이터가 변경되었는지 여부를 알게 하는 하나의 이점은 플러그인 컬렉션들에게 주의 밖의 변경된 패킷 데이터를 무시하는 능력을 제공한다. 다른 한편으로, 이 방법은 개발자가 실수하는 추가 옵션을 제공한다. 보다 중요한 것은, 그것은 설계 패턴의 단순성 및 객체 지향 특성을 혼란시킨다. 왜냐하면 플러그인들은 데이터의 근원을 더 이상 알지 못하기 때문이다. 만일 플러그인이 원 데이터 및 변경된 데이터 양쪽 모두를 검사한다면, 그것은 십중팔구 이전의 플러그인에 속하는 동작들을 수행하는 것이다.
성능/효율성 이유 때문에, 내부적으로 2개의 데이터 구조를 유지할 수 있고, 따라서 개발자가 데이터를 변경하려고 하지 않는 한 메모리를 할당할 필요가 없다.
데이터 동기화
다음은 도 17A에 도시된 바와 같이 동기화를 보증하기 위해 데이터가 어떻게 큐에 부가될 수 있는지를 설명한다.
ICO는 UI 스레드 상에 들어오는 다른 요구들과 잉크 스레드를 통하여 오는 계류 중 데이터(pending data)를 동기화하기 위하여, 시그널링 메커니즘으로서 입력 및 출력 큐들을 사용할 수 있다.
도 17A는 시스템이 정보를 처리하는 동안 발생하는 모드 전환을 도시한다. 시스템은 1701에서 제1 처리의 종결("완료(done)")을 도시한다. 시간(1702)에서, 새로운 스타일러스 데이터가 수신되고 시간(1702)에서 플러그인 1에 의해 및 시간(1704)에서 플러그인 2에 의해 처리가 시작되고 시간(1705)에서 끝난다. 시간(1703)에서 모드 전환이 일어난다. 예컨대, 만일 애플리케이션의 사용자가 "잉크"로부터 "지우기"(erase)로 "편집 모드"를 변경하고 있고 애플리케이션이 동작 중이면, 큐로부터 흘러나오는 패킷 데이터가 사용자 모드가 변경된 후에 얼마간의 시간 동안 여전히 "잉크"일 가능성이 상당히 있다.
그러나, 이 시간에서 큐(1706)에 모드 전환 이벤트를 부가하는 대신에, 그것은 스타일러스 데이터에 대해 시간(1705)에서 현재의 처리가 끝난 후까지 지연된다. 먼저, 모드 전환 동작 이벤트는 시간(1702)에서 플러그인들에서 시작한 스타일러스 데이터가 완료될 때까지 지연될 수 있다. 두 번째로, 시스템은 큐(1706)에 모드 전환 이벤트를 입력하여 시간(1705)에서 플러그인 2로부터의 결과가 큐(1706)에서 그것 앞에 배치되도록 충분한 공간을 남길 수 있다. 그래서, 이 경우에, ICO는 사용자가 모드 변경을 행한 순간에 출력 큐에 "마커"(marker)를 삽입할 수 있다. 소정 시간이 경과한 후에 마커는 ICO로 도로 전달될 것이고(실시간 스타일러스 플러그인 컬렉션 인터페이스 상의 CustomDataAdded 메서드를 통하여), 그 시점에서 ICO는 착신되는 패킷 데이터를 "지우기" 요구로 해석하기 시작할 수 있다.
도 17B는 도 17A의 일반적 버전을 도시한다. 제1 스레드에 대한 처리의 종료가 이벤트(1707)에 의해 도시되어 있다. 그것은 큐(1712)에 배치된다. 다음으로 시간(1708)에서, 제1 스레드 상의 다른 처리가 시작된다. 시간(1709)에서, 제2 스레드 상에 이벤트가 발생한다. 제1 스레드 상의 처리는 점(1708)에서 시작했기 때문에, 그 처리가 시간(1709)에서의 이벤트 전에 어드레싱될 것으로 기대한다. 그러나, 제1 스레드 상의 처리는 시간(1710)에서 계속되어 시간(1711)에서 종료하기 때문에, 시간(1709)에서의 이벤트를 처리(1708)의 시작 시간에 삽입하면 시간(1709)에서의 이벤트가 시간(1711)에서 처리가 완료되기 전에 큐에 배치될 것이라는 점에서 해로울 것이다. 여기서, 도 17B는 시간(1711)에서의 이벤트가, 큐(1712)에서 적어도 하나의 위치를 스킵함으로써 처리 완료 점(1707)으로부터 발생된 이벤트로부터 큐(1702)에서 다운스트림으로 어느 거리를 두고 삽입되는 것을 도시한다. 큐(1712)에서 위치를 이용할 수 있게 유지함으로써 처리(1708, 1710, 1711)의 완료가 큐(1712)에서 1709의 이벤트의 앞쪽 위치에 적당히 배치될 수 있게 되어 큐(1712) 내의 패킷/이벤트들의 판독이 기대된 순서로 일어날 수 있게 된다. 여기서, 순서는 패킷/이벤트들이 그들의 처리가 시작되거나 이벤트들이 발생한 순서로 발생하는 것으로 요약될 수 있다. 이 순서화는 점들(1713(처리 시작), 1714(처리 계속), 및 1715(처리 완료))에 의해 도시된 다음 처리에 대해 계속된다.
도 18 및 19는 본 발명의 양태들에 따라서 펜 데이터를 핸들링하기 위한 다양한 시스템들을 도시한다.
도 18을 참조하면, 펜 디바이스(1801)가 펜 서비스(1803)에 데이터를 송신한다. 마우스(1802)도 정보를 생성하여 그것을 user32(user32.dll로도 알려짐)(1804)에게 송신한다. 어떤 펜 데이터(예컨대 버튼들 상의 클리킹)는 마우스 이벤트들을 나타낼 수 있고 마우스 이벤트들로서 핸들링되도록 user32(1804)에 리라우팅된다. 마찬가지로, 어떤 마우스 이벤트들은 잉크를 나타낼 수 있고 펜 잉크로서 핸들링되도록 1814에서 리라우팅된다. 마우스 이벤트들은 그 후 윈도즈 메시지 펌프(1805)에 전달되고, 그 후 HWND(1806), HWND 마우스 디바이스(1812), 입력 큐(1810) 및 그 후 입력 매니저(1811)에 전달된다. 펜 입력(예를 들면, 펜이 잠재적 잉킹 서비스의 범위 내로 움직일 경우) 또는 스타일러스 이벤트는 펜 입력 매너저(1807/1808)(비관리 및 관리 실시간 스타일러스 서비스들)에 송신된다. 펜 입력 매너저(1807/1808)는 펜 서비스(1803)와 애플리케이션 간의 모든 통신을 핸들링한다. 이 핸들링은 표준 우선 순위 스레드 상에서 또는 높은 우선 순위 상태 스레드 상에서 수행될 수 있다. 펜 서비스(1803)는 다양한 이벤트들을 발생시킬 수 있다. 펜 이벤트들은 펜 이벤트 매니저(1807/1808)에 송신되어 표준 메시징 시스템(1804-1806 및 1812)을 바이패스할 수 있다.
펜 서비스(1803)는 다음 이벤트들을 발생시킬 수 있다: stylus in range(스타일러스가 디지타이저의 범위 내로 들어온 경우), stylus out of range(스타일러스가 더 이상 디지타이저에 의해 검출될 수 없는 경우), Stylus Packets(디지타이저로부터의 미가공 점 데이터 - 펜은 디지타이저와 접촉하고 있을 수도 있고 또는 아닐 수도 있다), stylus in air points, 태블릿 부가/제거, 및 시스템 제스처 이벤트들(예컨대, "press and hold" 및 hover 이벤트들).
스타일러스는 미가공 미리보기 이벤트들(raw preview events)을 생성할 수 있다. 이들 미가공 미리보기 이벤트들은 실시간 잉킹 서비스(1901)(도 19)에 의해 핸들링될 수 있다. 다른 서비스들도 이들 이벤트를 청취할 수 있다. 실시간 잉킹 서비스(1901)는 미가공 미리보기 이벤트들 상에서 다음을 포함하는 다수의 단계들을 수행할 수 있다:
a. 이벤트가 다운 "패킷" 이벤트인지를 체크한다. 만일 아니라면 처리를 중지하고 널(null)을 반환한다.
b. 이벤트가 그것의 캐싱된 레이아웃 정보에 기초하여 잉킹 엘리먼트 상에 있었는지를 체크한다. 만일 아니라면 처리를 중지하고 널을 반환한다.
c. 이 패킷은 "다운" 이벤트에 대한 것이기 때문에, 잉크 영역 내에 있으면, 점진적으로 스트로크를 그린다.
d. 마지막으로 스트로크가 그려진 엘리먼트를 펜 입력 매니저(1807/1808)에게 반환한다.
미가공 미리보기 이벤트로부터의 반환 값은 그 이벤트를 "타깃"(Target)하기 위하여 펜 입력 매니저(1807/1808)에 의해 사용된다. 만일 널이 아닌 타깃이 반환되면 이벤트는 그 특정 타깃과 함께 입력 큐 상에 배치될 수 있다. 이것은 엘리먼트 상에 그려진 잉크가 입력 큐 내의 다른 이벤트들의 결과로서 어떤 다른 엘리먼트가 아닌 그 엘리먼트에 실제로 전달되는 것을 보증한다.
이제 스타일러스 이벤트는 입력 이벤트가 될 준비가 되어 있다. 그러나 대부분의 경우에, 각각의 스타일러스 이벤트는 또한 메시지 시스템으로부터 흘러나오는 대응하는 마우스 메시지를 갖는다. 펜 입력 매니저(1807/1808)가 스타일러스 이벤트를 입력 이벤트로 변환하기 전에, 그것은 먼저 그 이벤트를 대응하는 마우스 메시지와 매칭시킬 것이다. 만일 필요하다면, 펜 입력 매니저(1807/1808)는 마우스 메시지가 도착하는 것을 기다릴 수 있다.
일단 펜 입력 매너저(1807/1808)가 마우스 메시지 및 스타일러스 이벤트 양쪽 모두를 가지면, 그것을 그 둘을 적당한 입력 보고서로 결합하여 그 보고서를 입력 큐(1810) 상에 배치한다.
도 20은 본 발명의 양태들에 따라서 큐를 도시한다. 도 20은 큐(2001)를 도시한다. 단순화를 위하여, 큐는 원으로 도시되어 있다. 선형 큐 및 이 기술 분야에 공지되어 있는 다른 버전들을 포함하는 큐의 대안적인 형태들도 사용될 수 있다. 큐(2001)는 시작 포인터(2002) 및 종료 포인터(2008)를 포함한다. 큐(2001)는 또한 정보를 갖는 다수의 위치들(2003, 2004, 및 2009)을 포함한다. 위치들(2005 및 2007)은 비어 있다. 위치(2006)는 잠겨 있다. 위치(2006)는 서로 다른 소스들로부터의 이벤트들 및 데이터를 동기화하기 위한 위치 보유자(place holder)로서 잠겨 있을 수 있다(그 예가 도 17A 및 17B에 도시되어 있다). 또한, 위치(2006)는 그것 안에 포함된 데이터가 플러그인 컬렉션 또는 체인을 통하여 전달될 때 잠길 수 있다. 위치들(2010 및 2011)도 비어 있다. 빈 공간들의 수는 필요에 따라 증가 또는 감소될 수 있다. 예컨대, 큐가 차 있으면 부가적인 데이터를 저장하기 위해 부가적인 공간들이 부가될 수 있다. 대안적으로, 큐의 사이즈는 큐에 보유될 수 있는 것보다 많은 임의의 데이터는 폐기되도록 고정될 수 있다. 이것은 시스템이 다른 처리들과 아주 많이 관련되어 있고 큐에 대한 새로운 데이터의 생성 시에 감속하는 것이 유익할 것임을 사용자에게 지시한다는 점에서 사용자에게 유익한 이점을 제공할 수 있다. 정보의 폐기는 또한 사용자에게 시스템이 잠겨 있고 시스템이 다시 처리를 계속할 때까지 부가적인 데이터의 입력이 권고되지 않음을 보여줄 수 있다.
애플리케이션 프로그래밍 인터페이스
다음은 본 발명의 양태들에 의해 사용될 수 있는 각종 애플리케이션 프로그래밍 인터페이스들에 대한 개관을 제공한다.
실시간 스타일러스는 실시간 스타일러스 입력 클래스의 부분일 수 있다. 인스턴스화된 실시간 스타일러스 객체는 윈도 핸들 또는 컨트롤에 부가될 수 있다. 실시간 스타일러스는 디폴트 생성자(default constructors)를 포함할 수 있다. 디폴트 생성자를 이용함으로써 다른 실시간 스타일러스 객체로부터만 입력을 수용하도록 허용된다.
플러그인들이 펜 데이터 스트림과 상호 작용하도록 허용하기 위하여, 실시간 스타일러스 객체는 2개의 플러그인 체인들을 유지할 수 있다. 이 컬렉션들은 실시간 스타일러스 객체의 속성에서 특정될 수 있다(예컨대, 동기식 플러그인들에 대한 SyncPluginCollection 및 비동기식 플러그인들에 대한 AsyncPluginCollection). 적당한 속성 상의 부가 메서드(예컨대, 동기식 컬렉션에 플러그인을 부가하기 위한 StylusSyncPluginCollection.Add 또는 비동기식 컬렉션에 플러그인을 부가하기 위한 StylusAsyncPluginCollection.Add)를 호출함으로써 어느 한 쪽의 컬렉션에 플러그인을 부가할 수 있다.
동기식 플러그인들은 인터페이스(예컨대, IStylusSyncPlugin)를 구현할 수 있고 비동기식 플러그인들은 다른 인터페이스(예컨대, IStylusAsyncPlugin)를 구현할 수 있다. 각각의 플러그인은 그것의 데이터 관심을 특정하는 속성을 가질 수 있다(예컨대, IStylusSyncPlugin.DataInterest 또는 IStylusAsyncPlugin.DataInterest). 실시간 스타일러스 객체는 플러그인이 서브스크라이브한 메서드들을 위해 플러그인의 통지 메서드들을 호출할 수 있다.
실시간 스타일러스 객체는 IStylusAsyncPlugin 인터페이스를 구현한다. 다른 실시간 스타일러스로부터 입력을 수용하는 실시간 스타일러스를 인스턴스화하기 위하여, 디폴트 생성자를 이용하는 것을 포함할 수 있다. 자식 또는 캐스케이딩된 RTS를 부모와 관련시키기 위하여 다른 대안적인 메커니즘들이 사용될 수도 있다. 또 다른 메커니즘은 자식 RTS에의 참조를 보유하기 위해 부모 RTS와 관련된 전용 포인터를 사용할 수 있다. 여기서, 부모 RTS는 비동기식 플러그인 인터페이스를 구현할 필요가 없을 것이다.
실시간 스타일러스 객체는 펜 데이터를 전송하는 2 이상의 내부 큐를 가질 수 있다. 이들은 입력 큐 및 출력 큐를 포함한다. 이들 2개의 큐 사이에 다른 큐가 부가될 수도 있다. 또한, 입력 큐는 데이터가 펜 데이터 스트림으로부터 동기식 플러그인들에 들어가도록 의도되어 있을 경우에만 제거될 수 있다. 이들 큐가 펜 데이터를 핸들링하기 위해 이용하는 처리는 적어도 도 6, 8, 11 및 13과 관련하여 위에 설명되어 있다.
다음은 잉크를 수집하는 폼(form) 상에서 실시간 스타일러스 객체를 이용하는 예시적인 시나리오이다.
a. IStylusAsyncPlugin 인터페이스를 구현하는 폼을 생성한다.
b. 그 폼 상의 컨트롤에 부가된 실시간 스타일러스 객체를 생성한다.
c. 그 폼이 관심을 갖는 데이터에 관한 그 폼의 속성에서 표면과 접촉하는 스타일러스(StylusDown 이벤트)에 관한 통지, 데이터 패킷, 및 스타일러스 업(예컨대, StylusUp 이벤트) 통지에 관심을 갖도록(따라서 수신하도록) 그 폼을 설정한다.
d. 그 폼의 IStylusAsyncPlugin.StylusDown, IStylusAsyncPlugin.Packets, IStylusAsyncPlugin.StylusUp 메서드들에서, 그 폼의 실시간 스타일러스 객체로부터 송신되는 스타일러스 다운, 패킷들, 및 스타일러스 업 통지들을 핸들링하는 코드를 부가한다.
각각의 실시간 스타일러스 객체는 그것과 상호 작용할 수 있는 객체들에 대한 고유 식별자들의 리스트를 유지한다. 실시간 스타일러스 객체는 고유 식별자와 태블릿 객체 사이에 변환을 위한 몇 개의 메서드를 가질 수 있다. 이들은 GetTabletContextIDFromTablet 및 GetTabletFromTabletContextID 메서드들을 포함할 수 있다.
펜 데이터는 그 자신의 명칭 공간(name space)를 차지할 수 있다(예컨대, StylusInput.PluginData 네임스페이스).
태블릿 속성 기술 객체(예컨대, TabletPropertyDescription 객체)는 GUID(property globally unique identifier) 및 특정 태블릿에 대한 속성의 범위, 레졸루션, 및 단위들을 기술하는 태블릿 속성 메트릭(예컨대, TabletPropertyMetrics) 구조를 포함할 수 있다.
고유 태블릿 식별자를 수취하여 그 태블릿에 의해 지원되는 속성 기술 객체들의 컬렉션을 반환하는 메서드가 존재할 수 있다. 이를테면, 실시간 스타일러스 객체의 GetTabletPropertyDescriptionCollection 메서드는 고유 태블릿 식별자를 수취하여 그 태블릿에 의해 지원되는 TabletPropteryDescription 객체들의 컬렉션을 반환한다. 실시간 스타일러스 객체의 GetDesiredPacketDescription 메서드는 실시간 스타일러스 객체가 그것의 플러그인들에 전송할 패킷 속성들에 대한 GUID들의 어레이를 반환한다.
주어진 태블릿에 대한 플러그인들에 송신되는 패킷 속성들의 세트는 GetTabletPropertyDescriptionCollection 메서드에 의해 반환된 세트와 GetDesiredPacketDescription 메서드에 의해 반환된 세트의 교집합일 수 있다. 실시간 스타일러스가 그것의 플러그인들에 전달할 패킷 속성들의 세트를 변경하기 위하여, 실시간 스타일러스 객체의 SetDesiredPacketDescription 메서드가 호출될 수 있다.
실시간 스타일러스 객체가 인에이블될 때, 각각의 플러그인은 그것의 IStylusSyncPlugin.RealTimeStylusEnabled 또는 IStylusASyncPlugin.RealTimeStylusEnabled 메서드에의 호출을 수신한다. 통지 내에서 전달된 RealTimeStylusEnabledData 객체는 실시간 스타일러스 객체가 인에이블될 때 이용 가능한 태블릿들에 대한 컨텍스트 식별자들의 컬렉션을 포함한다. 실시간 스타일러스 객체가 사용할 수 있는 태블릿이 실시간 스타일러스 객체가 인에이블된 동안 펜 이에이블된 컴퓨팅 시스템에 부가되거나 또는 그로부터 제거될 때, 실시간 스타일러스 객체는 그것의 플러그인들에게 태블릿이 부가되었거나 제거된 것을 통지한다.
스타일러스들은 부가적인 인터페이스들을 가질 수 있다. 각각의 스타일러스는 그 스타일러스들과 관련된 패킷들을 기술하는 그것과 관련된 정보를 가질 수 있다. 실시간 스타일러스 객체는 그 스타일러스들에 관한 정보를 다수의 통지 메서드들에서 플러그인들에 전달할 수 있다. 펜 또는 스타일러스에 관한 정보는 스타일러스(Stylus) 객체로 나타낼 수 있다. 이 객체는 데이터가 수집된 시간에 태블릿 펜의 상태에 대한 스냅샷이다. 플러그인들은 태블릿 펜 데이터 스트림의 일부로서 태블릿 펜 데이터를 수신하기 때문에, 플러그인들은 커서(Cursor) 클래스를 통하여 특정 태블릿 펜의 현재 상태를 체크하는 대신에 스타일러스 객체 내의 그 정보를 이용해야 한다.
다음은 플러그인들 및 실시간 스타일러스 클래스를 설명한다. IStylusSyncPlugin 또는 IStylusAsyncPlugin 인터페이스를 구현하는 플러그인들, 객체들이 실시간 스타일러스 객체에 부가될 수 있다.
IStylusSyncPlugin 및 IStylusAsyncPlugin 인터페이스들 양쪽 모두는 동일한 메서드들을 정의한다. 이들 메서드들은 실시간 스타일러스 객체가 펜 데이터를 각각의 플러그인에 전달할 수 있게 한다. IStylusSyncPlugin.DataInterest 및 IStylusAsyncPlugin.DataInterest 속성들은 각각의 플러그인이 태블릿 펜 데이터 스트림 내의 특정 데이터에 서브스크라이브할 수 있게 한다. 플러그인은 그것의 태스크를 수행하기 위해 필요한 데이터에만 서브스크라이브해야 하고, 그것은 잠재적인 성능 문제들을 최소화한다. 대안적으로, 플러그인에 대해 부가적인 서브스크립션들이 포함될 수 있다.
실시간 스타일러스 객체는 펜 데이터를 그것의 플러그인들에 전달하기 위해 StylusInput.PluginData 네임스페이스 내의 객체들을 이용한다. 실시간 스타일러스는 또한 플러그인들에 의해 스로우된 예외들을 캐치한다. 그것이 그렇게 할 때, 그것은 IStylusSyncPlugin.Error 또는 IStylusAsyncPlugin.Error 메서드를 호출함으로써 플러그인들에게 통지할 수 있다.
다음은 플러그인 데이터 및 실시간 스타일러스 클래스를 설명한다.
실시간 스타일러스에 대한 플러그인들은 IStylusSyncPlugin 또는 IStylusAsyncPlugin 인터페이스 중 어느 한 쪽을 구현할 수 있다. 실시간 스타일러스 내에 모든 메서드들을 구현할 수도 있고 아닐 수도 있다.
인터페이스들 상에 정의된 메서드들은 펜 데이터를 플러그인들에 전달하기 위해 StylusInput.PluginData 네임스페이스 내의 객체들을 이용한다. 다음 표는 통지 메서드들 내의 파라미터들인 데이터 객체들을 설명하고 통지와 관련된 DataInterestMask 값을 리스트한다.
플러그인 데이터 DataInterestMask 값 설명
CustomStylusData CustomStylusDataAdded 플러그인에 의해 부가되는 커스텀 애플리케이션 데이터.
ErrorData Error 실시간 스타일러스 객체가 그것의 플러그인들의 하나에서의 핸들링되지 않은 예외에 응답하여 부가하는 에러 정보.
InAirPacketsData InAirPackets 스타일러스가 디지타이저 위에 공중에 있는 동안 스타일러스 움직임에 대한 패킷 정보.
InAirPacketsData Packets 스타일러스가 디지타이저를 터치하고 있는 동안 스타일러스 움직임에 대한 패킷 정보.
RealTimeStylusDisabledData RealTimeStylusDisabled 실시간 스타일러스가 디스에이블될 때 부가하는 정보.
RealTimeStylusEnabledData RealTimeStylusEnabled 실시간 스타일러스가 인에이블될 때 부가하는 정보.
StylusButtonDownData StylusButtonDown 눌려져 있는 특정 스타일러스 버튼에 관한 정보.
StylusButtonUpData StylusButtonUp 풀려 있는 특정 스타일러스 버튼에 관한 정보.
StylusDownData StylusDown 스타일러스가 디지타이저와 접촉하게 될 때 스타일러스에 대한 패킷 정보.
StylusInRangeData StylusInRange 실시간 스타일러스 객체의 입력 영역에 들어가거나 실시간 스타일러스 객체의 입력 영역 위쪽 디지타이저의 검출 범위에 들어가는 특정 스타일러스에 관한 정보.
StylusOutOfRangeData StylusOutOfRange 실시간 스타일러스 객체의 입력 영역을 떠나거나 실시간 스타일러스 객체의 입력 영역 위쪽 디지타이저의 검출 범위를 떠나는 특정 스타일러스에 관한 정보.
StylusUpData StylusUp 스타일러스가 디지타이저로부터 들어올려질 때 스타일러스에 대한 패킷 정보.
SystemGestureData SystemGesture 실시간 스타일러스 객체가 시스템 제스처를 검출할 때 부가하는 정보.
TabletAddedData TabletAdded 부가되는 태블릿에 관한 정보.
TabletRemovedData TabletRemoved 제거되는 태블릿에 관한 정보.
실시간 스타일러스 객체는 태블릿 펜에 관한 정보를 다수의 통지 메서드들에서 그것의 플러그인들에 전달한다. 태블릿 펜에 관한 정보는 스타일러스 객체로 나타낸다. 이 객체는 데이터가 수집된 시간에 태블릿 펜의 상태에 대한 스냅샷이다. 플러그인들은 태블릿 펜 데이터 스트림의 일부로서 태블릿 펜 데이터를 수신하기 때문에, 플러그인들은 커서 클래스를 통하여 특정 태블릿 펜의 현재 상태를 체크하는 대신에 스타일러스 객체 내의 그 정보를 이용해야 한다. 각각의 스타일러스 객체는 데이터를 생성한 태블릿에 대한 태블릿 컨텍스트 식별자를 포함한다.
다음 13개의 함수들은 동기식 또는 비동기식 인터페이스들 상에 구현될 수 있다. 표는 각종 이벤트들을 통하여 전달되는 정보를 비교한다. 이벤트들 및 파라미터들의 리스트는 예시적인 것이고 모두 다 열거한 것이 아니다. 다음의 것들과 함께 또는 그 대신에 다른 이벤트들 및 파라미터들이 사용될 수도 있다.
동기식 파라미터들의 다수는 수신자가 큐를 통과하는 데이터를 변경하도록 허용한다는 점에서만 비동기식 파라미터들과 다르다. 대안적으로, 양쪽 파라미터 세트들 모두가 큐들을 통과하는 데이터를 변경하도록 허용될 수 있다.
함수 용도 동기식 파라미터 설명 비동기식 파라미터 설명
ContextCreat (RTSEnabled 라고도 함) 이벤트 체인들이 인에이블될 수 있도록 태블릿 컨텍스트가 생성된 때를 판정하기 위해 사용됨. 이 이벤트의 소비자들은 이것을 이용하여 RTS가 태블릿 초기화와 함께 끝나고 클라이언트 코드에 데이터를 파이어하기 시작할 준비가 되는 때를 알 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음), 태블릿 식별 정보 및 데이터 패킷들의 설명을 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음), 태블릿 식별 정보 및 데이터 패킷들의 설명을 포함한다.
ContextDestroy (RTSDisabled 라고도 함) RTS가 그것의 객체들을 클린업할 수 있도록 태블릿 컨텍스트가 파괴된 때를 판정하기 위해 이용됨. 이 이벤트의 소비자들은 이것을 이용하여 RTS가 태블릿 컨텍스트를 막 해방시키고(아마도 RTS.Enable가 False이기 때문에) 그것이 더 이상 이용될 수 없기 전에 필요할 때 임의의 PacketDescription 데이터를 캐싱하려고 하는 때를 알 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 태블릿 식별 정보를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 태블릿 식별 정보를 포함한다.
CursorNew 스타일러스가 디지타이저와 만났다는 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다.
CursorInRange 스타일러스가 디지타이저의 범위 내로 옮겨졌다는 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다.
CursorOutOfRange 스타일러스가 디지타이저의 범위 밖으로 옮겨졌다는 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다.
CursorDown 스타일러스 팁이 디지타이저 표면을 "터치"하고 있다는 통지 SourceRealTimePen, StylusInfo, PropertyCountPerPacket, PacketDataRef SourceRealTimePen, StylusInfo, PropertyCountPerPacket, PacketDataRef
CursorUp 스타일러스 팁이 더 이상 디지타이저 표면을 터치하지 않는다는 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다.
InAirPackets 디지타이저 표면 위쪽 스타일러스 움직임의 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다. 이것은 또한 데이터 패킷 버퍼 길이 및 데이터 패킷들의 카운트를 포함할 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다. 이것은 또한 데이터 패킷 버퍼 길이 및 데이터 패킷들의 카운트를 포함할 수 있다.
Packets 디지타이저 표면과 터치하는 동안 스타일러스 움직임의 통지 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다. 이것은 또한 데이터 패킷 버퍼 길이 및 데이터 패킷들의 카운트를 포함할 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 데이터 패킷당 속성 카운트 및 패킷 데이터 타입에의 참조를 포함할 수 있다. 이것은 또한 데이터 패킷 버퍼 길이 및 데이터 패킷들의 카운트를 포함할 수 있다.
SystemEvent 시스템 이벤트 또는 제스처의 통지. 예를 들면, "탭", "더블 탭", "프레스 & 홀드", "섀이크"(shake)를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 시스템 이벤트에 관한 시스템 이벤트 정보 및 데이터를 포함할 수 있다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 스타일러스에 관한 정보(활성화된 스타일러스 상의 버튼들 등을 포함하지만 이것에 한정되지 않음)를 포함한다. 이것은 또한 시스템 이벤트에 관한 시스템 이벤트 정보 및 데이터를 포함할 수 있다.
TabletAdded 시스템에 접속된 새로운 디지타이저의 통지(전형적으로 외부 USB 디바이스) 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 태블릿에 관한 정보를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 태블릿에 관한 정보를 포함한다.
TabletRemoved 시스템으로부터 분리된 디지타이저의 통지(전형적으로 외부 USB 디바이스) 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 제거된 태블릿에 관한 정보를 포함한다. 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음) 및 제거된 태블릿에 관한 정보를 포함한다.
UserData 고유하게 식별되는 임의의 사용자 데이터(예컨대, GUID에 의한). 이것은 큐를 통하여 잉크 수집 객체로 다운스트림으로 정보를 전달하고 위에 설명된 실시간 데이터의 나머지와 관련하여 옳은 순서로 오도록 보증하기를 원하는 특별한 플러그인들에 의해 사용된다. 해당 없음(n/a) 펜의 소스(펜 ID를 포함하지만 이것에 한정되지 않음), 사용자의 데이터와 관련된 GUID, 사용자의 데이터의 사이즈에 대한 표시, 및 사용자의 데이터의 콘텐츠
본 발명의 양태들에 대하여 그 예시적인 실시예들에 의하여 설명하였다. 이 분야의 통상의 기술을 가진 사람이라면 이 개시 내용을 검토함으로써 부속된 청구항들의 범위 및 의미 내의 다수의 다른 실시예들, 변경 및 변형들을 알 수 있을 것이다.

Claims (101)

  1. 잉크를 렌더링하기 위한 렌더러 객체(renderer object)로서,
    잉크가 객체들에 의해 어떻게 처리되는지를 코디네이트하는 컴포넌트에 상기 객체를 플러그인(plugging in)하기 위한 인터페이스를 포함하는 렌더러 객체.
  2. 제1항에 있어서, 상기 컴포넌트는 동기식 및 비동기식 인터페이스들을 포함하는 렌더러 객체.
  3. 제2항에 있어서, 상기 렌더러 객체는 상기 컴포넌트의 상기 동기식 인터페이스에 접속되는 렌더러 객체.
  4. 제1항에 있어서, 상기 컴포넌트는 2개의 컴포넌트 중 하나이고,
    상기 렌더러 객체는 상기 2개의 컴포넌트 중 상기 제1 컴포넌트의 동기식 인터페이스 상에 있고,
    제2 컴포넌트는 그것과 관련된 적어도 하나의 부가적인 객체를 갖는 렌더러 객체.
  5. 제1항에 있어서, 렌더링된 데이터를 임시로 저장하기 위한 캐시를 더 포함하는 렌더러 객체.
  6. 제1항에 있어서, 상기 컴포넌트는 입력 및 출력 큐들을 포함하는 렌더러 객체.
  7. 제6항에 있어서, 상기 컴포넌트는 동기식 인터페이스와 관련된 부가적인 큐인 렌더러 객체.
  8. 제1항에 있어서, 상기 렌더러 객체는 동기식 플러그인 컬렉션의 일부인 렌더러 객체.
  9. 제1항에 있어서, 상기 렌더러 객체는 동기식 플러그인 체인의 일부인 렌더러 객체.
  10. 제1항에 있어서, 상기 데이터는 태블릿(tablet)에서 비롯된 렌더러 객체.
  11. 제1항에 있어서, 상기 렌더러 객체는 상기 렌더러 객체가 다른 객체들과 체인되도록 허용하는 인터페이스를 포함하는 렌더러 객체.
  12. 컴퓨팅 시스템으로서,
    저장소(storage)와;
    상기 저장소와 데이터를 전송하는 프로세서 - 상기 프로세서는 잉크를 렌더링하기 위한 렌더러 객체를 호스팅함 -
    를 포함하고, 상기 렌더러 객체는,
    잉크가 객체들에 의해 어떻게 처리되는지를 코디네이트하는 컴포넌트에 상기 객체를 플러그인하기 위한 인터페이스를 포함하는 컴퓨터 시스템.
  13. 인터페이스를 갖는 렌더링 객체를 이용하여 잉크를 다이내믹하게 렌더링하기 위한 방법으로서,
    데이터가 어떻게 핸들링되는지를 지시하는 컴포넌트로부터 잉크를 수신하는 단계 - 상기 잉크는 상기 컴포넌트 상의 동기식 인터페이스에 부착되는 상기 인터페이스를 통하여 수신됨 - 와;
    상기 잉크를 렌더링하는 단계
    를 포함하는 방법.
  14. 제13항에 있어서,
    상기 렌더링된 잉크를 임시로 캐싱하는 단계를 더 포함하는 방법.
  15. 제14항에 있어서,
    통지를 수신하는 단계와;
    상기 통지에 응답하여 상기 렌더링된 잉크의 상기 캐시를 클리어하는 단계를 더 포함하는 방법.
  16. 제13항에 있어서, 상기 렌더링 단계는 스타일러스로부터 중단 없이 잉크가 흘러나오는 외관을 사용자에게 제공하는 방법.
  17. 제13항에 있어서, 상기 렌더링 객체는 상기 컴포넌트에 부착된 동기식 플러그인 컬렉션의 일부인 방법.
  18. 제13항에 있어서, 상기 렌더링 객체에 접속된 다른 객체에 데이터를 전달하는 단계를 더 포함하는 방법.
  19. 인터페이스를 갖는 렌더링 객체를 이용하여 잉크를 다이내믹하게 렌더링하기 위한 프로그램이 저장되어 있는 컴퓨터 판독 가능 매체로서, 상기 프로그램은,
    데이터가 어떻게 핸들링되는지를 지시하는 컴포넌트로부터 잉크를 수신하는 단계 - 상기 잉크는 상기 컴포넌트 상의 동기식 인터페이스에 부착되는 상기 인터페이스를 통하여 수신됨 - 와;
    상기 잉크를 렌더링하는 단계
    를 포함하는 컴퓨터 판독 가능 매체.
  20. 제19항에 있어서, 상기 프로그램은,
    상기 렌더링된 잉크를 임시로 캐싱하는 단계를 더 포함하는 컴퓨터 판독 가능 매체.
  21. 제20항에 있어서, 상기 프로그램은,
    통지를 수신하는 단계와;
    상기 통지에 응답하여 상기 렌더링된 잉크의 상기 캐시를 클러어하는 단계를 더 포함하는 컴퓨터 판독 가능 매체.
  22. 제19항에 있어서, 상기 렌더링 단계는 스타일러스로부터 잉크가 중단 없이 흘러나오는 외관을 사용자에게 제공하는 컴퓨터 판독 가능 매체.
  23. 제19항에 있어서, 상기 렌더링 객체는 상기 컴포넌트에 부착된 동기식 플러그인 컬렉션의 일부인 컴퓨터 판독 가능 매체.
  24. 제19항에 있어서, 상기 프로그램은,
    상기 렌더링 객체에 접속된 다른 객체에 데이터를 전달하는 단계를 더 포함하는 컴퓨터 판독 가능 매체.
  25. 렌더러 객체에 관한 프로그램을 갖는 컴퓨터 판독 가능 매체로서, 상기 렌더러 객체는,
    수신된 데이터를 렌더링하기 위한 기능 코드와;
    상기 데이터의 처리를 조직(organize)하는 컴포넌트에 상기 렌더러 객체를 접속하기 위한 인터페이스
    를 포함하고, 상기 렌더러 객체는 2 이상의 렌더러 객체들로부터 선택되고 동기식 인터페이스에서 상기 컴포넌트에 부착되는 컴퓨터 판독 가능 매체.
  26. 제25항에 있어서, 상기 렌더러 객체는 상기 잉크가 반투명 수성 페인트(translucent, water-based paint)에 의해 생성된 것 같이 보이도록 잉크를 렌더링하는 컴퓨터 판독 가능 매체.
  27. 제25항에 있어서, 상기 렌더러 객체는 상기 잉크가 목탄 스타일러스(charcoal stylus)에 의해 생성된 것 같이 보이도록 잉크를 렌더링하는 컴퓨터 판독 가능 매체.
  28. 제25항에 있어서, 상기 렌더러 객체는 상기 잉크가 움직이는 잉크(moving ink) 같이 보이도록 잉크를 렌더링하는 컴퓨터 판독 가능 매체.
  29. 플러그인 객체들을 부착하기 위한 적어도 2개의 인터페이스를 갖는 컴포넌트에 커스텀 렌더러(custom renderer)를 부착하는 방법으로서,
    커스텀 렌더러를 제공하는 단계와;
    상기 커스텀 렌더러를 상기 컴포넌트- 상기 컴포넌트는 잉크와 관련된 데이터의 처리를 지시함 - 의 동기식 인터페이스에 부착하는 단계
    를 포함하는 방법.
  30. 제29항에 있어서, 상기 커스텀 렌더러를 포함하는 컬렉션 내의 상기 컴포넌트에 다른 객체를 부착하는 단계를 더 포함하는 방법.
  31. 제29항에 있어서, 상기 커스텀 렌더러에 다른 객체를 체인하여, 상기 커스텀 렌더러에 의해 핸들링된 데이터가 다음으로 상기 다른 객체에 전달되도록 하는 단계를 더 포함하는 방법.
  32. 제29항에 있어서, 상기 컴포넌트는 시스템 제공 다이내믹 렌더러(system-provided dynamic renderer)에의 부착을 포함하고, 상기 방법은,
    상기 시스템 제공 다이내믹 렌더러를 상기 컴포넌트로부터 분리(unattaching)하는 단계를 더 포함하는 방법.
  33. 제29항에 있어서, 상기 컴포넌트는 시스템 제공 다이내믹 렌더러에의 부착을 포함하고, 상기 방법은,
    상기 시스템 제공 다이내믹 렌더러를 상기 컴포넌트의 상기 동기식 인터페이스에 부착하는 단계를 더 포함하는 방법.
  34. 동기식 인터페이스 및 비동기식 인터페이스를 갖는 컴포넌트에 객체들을 부착하기 위한 방법으로서,
    플러그인 객체가 수신된 입력과 동기적으로 핸들링될 필요가 있는지 또는 상기 플러그인 객체가 나중에 처리될 수 있는지를 판정하는 단계와;
    상기 판정 단계에 기초하여 상기 플러그인을 동기식 인터페이스 또는 비동기식 인터페이스 중 하나에 부착하는 단계
    를 포함하는 방법.
  35. 제34항에 있어서, 상기 컴포넌트를 실행하는 컴퓨터의 처리 속도를 판정하는 단계를 더 포함하고,
    상기 부착 단계는 또한 상기 처리 속도 판정 단계에 기초하는 방법.
  36. 제34항에 있어서, 적어도 하나의 렌더링 플러그인 객체가 상기 동기식 인터페이스에 부착되는 방법.
  37. 제34항에 있어서, 시간임계적(time-critical) 플러그인 객체들이 상기 동기식 인터페이스에 부착되고 비시간임계적(non-time-critical) 플러그인 객체들이 상기 비동기식 인터페이스에 부착되는 방법.
  38. 동기식 인터페이스 및 비동기식 인터페이스를 갖는 컴포넌트에 객체들을 부착하기 위한 시스템으로서,
    플러그인 객체가 수신된 입력과 동기적으로 핸들링될 필요가 있는지 또는 상기 플러그인 객체가 나중에 처리될 수 있는지를 판정하기 위한 수단과;
    상기 판정 단계에 기초하여 상기 플러그인을 동기식 인터페이스 또는 비동기식 인터페이스 중 하나에 부착하기 위한 수단
    을 포함하는 시스템.
  39. 제38항에 있어서, 상기 컴포넌트를 실행하는 컴퓨터의 처리 속도를 판정하는 단계를 더 포함하고,
    상기 부착 단계는 또한 상기 처리 속도 판정 단계에 기초하는 시스템.
  40. 제38항에 있어서, 적어도 하나의 렌더링 플러그인 객체가 상기 동기식 인터페이스에 부착되는 시스템.
  41. 제38항에 있어서, 시간임계적 플러그인 객체들이 상기 동기식 인터페이스에 부착되고 비시간임계적 플러그인 객체들이 상기 비동기식 인터페이스에 부착되는 시스템.
  42. 정보를 렌더링하기 위한 시스템으로서,
    잉크 정보를 수신하는 컴포넌트, 상기 수신된 잉크 정보를 렌더링하는 다이내믹 렌더러 - 상기 다이내믹 렌더러는 임시 저장소(temporary storage)를 포함함 -, 및 상기 수신된 잉크 정보를 렌더링하는 스태틱 렌더러 - 상기 스태틱 렌더러는 상기 수신된 잉크 정보에 관하여 상기 임시 저장소를 릴리스(release)하도록 상기 다이내믹 렌더러에게 통지함 - 을 호스팅하는 프로세서를 포함하는 시스템.
  43. 제42항에 있어서, 상기 잉크 정보는 스타일러스에 의해 생성되는 시스템.
  44. 정보를 렌더링하기 위한 방법으로서,
    잉크 정보를 수신하는 단계와;
    상기 수신된 잉크 정보를 다이내믹 렌더러 객체에서 렌더링하는 단계와;
    상기 수신된 잉크 정보를 상기 다이내믹 렌더러 객체와 관련된 임시 저장소에 저장하는 단계와;
    상기 수신된 잉크 정보를 스태틱 렌더러 객체에서 렌더링하는 단계와;
    상기 임시 저장소 내의 상기 수신된 잉크 정보를 소거하도록 상기 다이내믹 렌더러에게 통지하는 단계
    를 포함하는 방법.
  45. 정보를 처리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 컴포넌트를 호스팅함 -
    를 포함하고, 상기 컴포넌트는,
    제1 플러그인 객체가 부착되는 동기식 인터페이스 - 상기 제1 플러그인 객체는 상기 컴포넌트에 의해 수신된 정보를 상기 컴포넌트에 의한 상기 정보의 수신과 동기적으로 처리함 - 와;
    제2 플러그인 객체가 부착되는 비동기식 인터페이스 - 상기 제2 플러그인 객체는 상기 컴포넌트에 의해 수신된 정보를 상기 컴포넌트에 의한 상기 정보의 수신과 비동기적으로 처리함 -
    를 포함하는 시스템.
  46. 제45항에 있어서, 상기 제2 플러그인 객체에 의해 처리되는 상기 정보는 상기 제1 플러그인 객체에 의해 처리되는 것과 동일한 정보인 시스템.
  47. 제45항에 있어서, 상기 제2 플러그인 객체에 의해 처리되는 상기 정보는 상기 제1 플러그인 객체에 의해 처리되는 정보와 다르고, 상기 제1 플러그인 객체는 상기 제2 플러그인 객체에 의해 나중에 처리될 정보를 변경한 시스템.
  48. 제45항에 있어서, 상기 컴포넌트는 출력 큐를 더 포함하고, 상기 출력 큐는 상기 제1 플러그인 객체에 의해 처리된 정보를 수신하는 시스템.
  49. 제45항에 있어서, 상기 컴포넌트는 입력 큐를 더 포함하고, 상기 입력 큐는 상기 제1 플러그인에 의해 생성되어 상기 제1 플러그인 객체에 의해 처리될 정보를 수신하는 시스템.
  50. 제45항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 리스트의 일부를 형성하는 시스템.
  51. 제45항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 체인의 일부를 형성하는 시스템.
  52. 제45항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 제스처 인식기(gesture recognizer) 객체인 시스템.
  53. 제45항에 있어서, 상기 제2 플러그인 객체는 잉크를 수집(collect)하고 렌더링하는 잉크 컬렉터 객체인 시스템.
  54. 제45항에 있어서, 상기 제1 플러그인 객체로서 다이내믹 렌더러를 더 포함하고, 상기 다이내믹 렌더러는 상기 컴포넌트에 의해 수신된 잉크 스트로크들을 임시로 저장하기 위한 저장소를 포함하는 시스템.
  55. 제54항에 있어서, 임시 저장소 내의 상기 잉크는 상기 제2 플러그인 객체로부터 명령을 수신한 후에 삭제되는 시스템.
  56. 제54항에 있어서, 임시 저장소 내의 상기 잉크는 상기 제2 플러그인 객체로부터 명령을 수신하고 상기 제2 플러그인 객체가 상기 잉크를 렌더링한 후에 삭제되는 시스템.
  57. 정보를 처리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 컴포넌트를 호스팅함 -
    를 포함하고, 상기 컴포넌트는,
    제1 플러그인 객체가 부착되는 제1 인터페이스 - 상기 제1 플러그인 객체는 상기 컴포넌트에 의해 수신된 정보를 상기 컴포넌트에 의한 상기 정보의 수신과 동기적으로 처리함 - 와;
    제2 플러그인 객체가 부착되는 제2 인터페이스 - 상기 제2 플러그인 객체는 상기 제1 플러그인 객체에 의해 처리된 정보를 처리함 - 와;
    제3 플러그인 객체가 부착되는 제3 인터페이스 - 상기 제3 플러그인 객체는 상기 제2 플러그인 객체에 의해 처리된 정보를 처리함 -
    를 포함하는 시스템.
  58. 제57항에 있어서, 상기 제2 플러그인 객체 및 상기 제3 플러그인 객체는 상기 컴포넌트에 의해 수신된 정보와 관련하여 동기적으로 정보를 처리하는 시스템.
  59. 제57항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 리스트의 일부를 형성하는 시스템.
  60. 제57항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 체인의 일부를 형성하는 시스템.
  61. 정보를 처리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 제1 컴포넌트 및 제2 컴포넌트를 호스팅함 -
    를 포함하고, 상기 제1 컴포넌트는,
    제1 플러그인 객체가 부착되는 동기식 인터페이스 - 상기 제1 플러그인 객체는 상기 제1 컴포넌트에 의해 수신된 정보를 상기 제1 컴포넌트에 의한 상기 정보의 수신과 동기적으로 처리함 - 와;
    상기 제2 컴포넌트가 부착되는 비동기식 인터페이스를 포함하고,
    상기 제2 컴포넌트는 제2 플러그인 객체가 부착되는 동기식 인터페이스와 제3 플러그인 객체가 부착되는 비동기식 인터페이스를 포함하는 시스템.
  62. 제61항에 있어서, 상기 제1 플러그인 객체는 다이내믹 렌더러 객체인 시스템.
  63. 제61항에 있어서, 상기 제3 플러그인 객체는 잉크 수집 객체인 시스템.
  64. 제61항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 리스트의 일부를 형성하는 시스템.
  65. 제61항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 체인의 일부를 형성하는 시스템.
  66. 컴포넌트와 플러그인 객체들 간에 통신하는 방법으로서,
    상기 컴포넌트에서 데이터 패킷을 수신하는 단계와;
    상기 데이터 패킷을 한 위치(location)에 배치하는 단계와;
    상기 데이터 패킷의 존재에 플러그인 객체들의 리스트를 통지하는 단계와;
    상기 플러그인 객체들의 리스트를 통하여 상기 데이터 패킷을 처리하는 단계
    를 포함하는 방법.
  67. 플러그인 객체들을 컴포넌트에 관련시키는 방법으로서,
    플러그인 객체들에의 참조를 포함할 수 있는 리스트를 형성하는 단계와;
    상기 컴포넌트의 인터페이스에 상기 리스트를 부착하는 단계와;
    적어도 하나의 플러그인 객체에의 참조들로 상기 리스트를 포퓰레이팅(populating)하는 단계
    를 포함하고, 상기 리스트 내의 상기 플러그인 객체들의 순서에 따라서 상기 플러그인 객체들에 의해 데이터가 처리될 수 있는 방법.
  68. 플러그인 객체들을 컴포넌트에 관련시키는 방법으로서,
    상기 컴포넌트 상의 인터페이스에 제1 플러그인 객체를 부착하는 단계와;
    상기 제1 플러그인 객체 상의 인터페이스에 제2 플러그인 객체를 부착하여 상기 컴포넌트, 상기 제1 플러그인 객체, 및 상기 제2 플러그인 객체를 연결(link)하는 체인을 형성하는 단계
    를 포함하고, 상기 체인 내의 상기 플러그인 객체들에의 순서에 따라서 상기 플러그인 객체들에 의해 데이터가 처리될 수 있는 방법.
  69. 정보를 렌더링하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 컴포넌트를 호 스팅함 - 를 포함하고, 상기 컴포넌트는,
    상기 정보를 렌더링하는 렌더링 시스템과;
    상기 컴포넌트에 의해 렌더링된 정보를 수신하여 임시로 저장하는 제1 큐를 포함하고, 상기 제1 큐는 상기 임시로 저장된 정보를 검색하는 다른 컴포넌트에 의해 액세스되고, 상기 임시로 저장된 정보는 상기 다른 컴포넌트에 의해 나중에 처리되는 시스템.
  70. 제69항에 있어서, 상기 정보는 전자 잉크를 포함하는 시스템.
  71. 제69항에 있어서, 상기 정보는 전자 잉크의 변경들(modifications)을 포함하는 시스템.
  72. 제69항에 있어서, 상기 렌더링 시스템은 상기 컴포넌트에 제거 가능하게 부착될 수 있는 플러그인 객체인 시스템.
  73. 제69항에 있어서, 상기 정보는 제1 시간에 수신된 제1 패킷 및 나중 시간에 수신된 제2 패킷을 포함하고, 상기 프로세서는 상기 제1 패킷 및 상기 제2 패킷의 처리의 적당한 동기화를 유지하기 위하여 상기 제1 패킷을 상기 큐 내에 상기 제2 패킷의 앞에 배치하는 시스템.
  74. 제69항에 있어서, 상기 정보는 제1 시간에 수신된 제1 패킷 및 나중 시간에 수신된 제2 패킷을 포함하고, 상기 프로세서는 상기 제1 패킷 및 상기 제2 패킷의 처리의 적당한 동기화를 유지하기 위하여 상기 제1 패킷을 상기 큐 내에 상기 제2 패킷의 뒤에 배치하는 시스템.
  75. 정보를 렌더링하기 위한 방법으로서,
    수신된 정보를 렌더링하는 단계와;
    상기 렌더링된 정보를 제1 큐 내에 임시로 저장하는 단계와;
    상기 제1 큐에 액세스하여 상기 임시로 저장된 정보를 검색하는 단계와;
    상기 임시로 저장된 정보를 처리하는 단계
    를 포함하는 방법.
  76. 제75항에 있어서, 상기 렌더링 단계는 제1 컴포넌트에 의해 수행되는 방법.
  77. 제75항에 있어서, 상기 처리 단계는 제2 컴포넌트에 의해 수행되는 방법.
  78. 제75항에 있어서, 상기 수신된 정보는 제1 시간에 수신된 제1 패킷 및 나중 시간에 수신된 제2 패킷을 포함하고, 상기 임시로 저장하는 단계는,
    상기 제1 패킷 및 상기 제2 패킷의 처리의 적당한 동기화를 유지하기 위하여 상기 제1 패킷을 상기 제1 큐 내에 상기 제2 패킷의 앞에 배치하는 단계를 더 포함 하는 방법.
  79. 제75항에 있어서, 상기 수신된 정보는 제1 시간에 수신된 제1 패킷 및 나중 시간에 수신된 제2 패킷을 포함하고, 상기 임시로 저장하는 단계는,
    상기 제1 패킷 및 상기 제2 패킷의 처리의 적당한 동기화를 유지하기 위하여 상기 제1 패킷을 상기 제1 큐 내에 상기 제2 패킷의 뒤에 배치하는 단계를 더 포함하는 방법.
  80. 디스플레이 가능한 정보에 대한 디스플레이 속성들을 변경하기 위한 방법 - 상기 디스플레이 가능한 정보는 제1 렌더러 객체에 의해 및 제2 렌더러 객체에 의해 렌더링됨 - 으로서,
    컴포넌트에서 디스플레이 속성 변경 정보를 수신하는 단계와;
    상기 디스플레이 속성 변경 정보를 처리하는 단계와;
    상기 디스플레이 속성 변경 정보를 적용하는 단계
    를 포함하는 방법.
  81. 제80항에 있어서, 상기 디스플레이 속성 변경 정보는, 상기 디스플레이 가능한 정보가 상기 제1 렌더러 객체에 의해 렌더링된 후에 그리고 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링되기 전에 수신되고,
    상기 적용 단계는 상기 디스플레이 속성 변경 정보에 관련된 디스플레이 속 성 변경을 상기 디스플레이 가능한 정보에 적용하는 방법.
  82. 제80항에 있어서, 상기 디스플레이 속성 변경 정보는, 상기 디스플레이 가능한 정보가 상기 제1 렌더러 객체에 의해 렌더링된 후에 그리고 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링되기 전에 수신되고,
    상기 적용 단계는 상기 디스플레이 속성 변경 정보에 관련된 디스플레이 속성 변경의 적용을 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링된 후까지 지연시키는 방법.
  83. 제80항에 있어서, 상기 적용 단계를, 상기 컴포넌트에서 새로운 펜 또는 커서 다운 이벤트가 수신될 때까지 지연시키는 단계를 더 포함하는 방법.
  84. 디스플레이 가능한 정보에 대한 디스플레이 속성을 변경하기 위한 컴퓨터 시스템으로서,
    컴포넌트, 제1 렌더러 객체 및 제2 렌더러 객체를 호스팅하는 프로세서를 포함하고, 상기 프로세서는 디스플레이 속성 변경 정보를 수신하고, 상기 디스플레이 속성 변경 정보를 처리하여, 상기 디스플레이 속성 변경 정보를 상기 제2 렌더러 객체에 의해 렌더링된 상기 디스플레이 가능한 정보에 적용하는 컴퓨팅 시스템.
  85. 제84항에 있어서, 상기 디스플레이 속성 변경 정보는, 상기 디스플레이 가능 한 정보가 상기 제1 렌더러 객체에 의해 렌더링된 후에 그리고 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링되기 전에 수신되고,
    상기 적용 단계는 상기 디스플레이 속성 변경 정보에 관련된 디스플레이 속성 변경을 상기 디스플레이 가능한 정보에 적용하는 컴퓨팅 시스템.
  86. 제84항에 있어서, 상기 디스플레이 속성 변경 정보는, 상기 디스플레이 가능한 정보가 상기 제1 렌더러 객체에 의해 렌더링된 후에 그리고 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링되기 전에 수신되고,
    상기 적용 단계는 상기 디스플레이 속성 변경 정보에 관련된 디스플레이 속성 변경의 적용을 상기 디스플레이 가능한 정보가 상기 제2 렌더러 객체에 의해 렌더링된 후까지 지연시키는 컴퓨팅 시스템.
  87. 제84항에 있어서, 상기 프로세서는, 상기 디스플레이 속성 변경 정보의 적용을, 상기 컴포넌트에서 새로운 펜 또는 커서 다운 이벤트가 수신될 때까지 지연시키는 컴퓨팅 시스템.
  88. 정보를 처리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 제1 컴포넌트 및 제2 컴포넌트를 호스팅함 -
    를 포함하고, 상기 제1 컴포넌트는,
    제1 플러그인 객체가 부착되는 동기식 인터페이스 - 상기 제1 플러그인 객체는 상기 제1 컴포넌트에 의해 수신된 정보를 상기 제1 컴포넌트에 의한 상기 정보의 수신과 동기적으로 처리함 - 와;
    상기 제1 컴포넌트로부터 정보를 수신하는 출력 큐와;
    상기 제2 컴포넌트가 부착되는 비동기식 인터페이스 - 상기 제2 컴포넌트는 상기 출력 큐 내의 정보에 액세스함 - 를 포함하고,
    상기 제2 컴포넌트는 제2 플러그인 객체가 부착되는 동기식 인터페이스와 제3 플러그인 객체가 부착되는 비동기식 인터페이스를 포함하는 시스템.
  89. 제88항에 있어서, 상기 제1 플러그인 객체는 다이내믹 렌더러 객체인 시스템.
  90. 제88항에 있어서, 상기 제3 플러그인 객체는 잉크 수집 객체인 시스템.
  91. 제88항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 리스트의 일부를 형성하는 시스템.
  92. 제88항에 있어서, 상기 제1 플러그인 객체 및 상기 제2 플러그인 객체 중 적어도 하나가 상기 컴포넌트에 부착된 체인의 일부를 형성하는 시스템.
  93. 제88항에 있어서, 상기 제2 컴포넌트의 동기식 인터페이스는 상기 제2 플러그인 객체가 상기 출력 큐 내의 정보에 액세스하도록 허용하는 시스템.
  94. 제88항에 있어서, 상기 제2 컴포넌트는,
    상기 제1 컴포넌트로부터 상기 동기식 인터페이스를 통하여 수신된 정보를 임시로 저장하는 입력 큐 - 상기 입력 큐는 상기 제2 컴포넌트의 상기 동기식 인터페이스에 의해 액세스됨 - 를 더 포함하는 시스템.
  95. 키보드, 마우스, 및 스타일러스로부터의 이벤트들을 순서화(order)하는 컴퓨팅 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 펜 서비스 컴포넌트를 호스팅하고, 상기 펜 서비스는 상기 마우스 및 상기 스타일러스로부터 정보를 수신하고, 상기 정보를 순서화하고, 전자 잉크에 관련된 정보를 펜 입력 매니저(pen input manager)에 전송함 -
    를 포함하는 컴퓨팅 시스템.
  96. 제95항에 있어서, 상기 펜 입력 매니저는 비관리 부분 및 관리 부분을 포함하는 컴퓨팅 시스템.
  97. 전자 잉크를 핸들링할 수 있는 메모리를 관리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 전자 잉크를 핸들링하기 위한 컴포넌트를 호스팅하고, 상기 컴포넌트는 비관리 부분 및 관리 부분을 갖고, 상기 비관리 부분 및 상기 관리 부분은 공통 메모리를 공유함 -
    를 포함하는 컴퓨팅 시스템.
  98. 전자 잉크를 핸들링할 수 있는 메모리를 관리하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 플러그인 객체들을 호스팅하고, 상기 플러그인들은 관리 및 비관리 코드 양쪽 모두를 갖고 상기 관리 코드와 상기 비관리 코드 간에 공통 메모리를 공유함 -
    를 포함하는 컴퓨팅 시스템.
  99. 에러 통지를 핸들링하기 위한 시스템으로서,
    저장소와;
    상기 저장소와 정보를 교환하는 프로세서 - 상기 프로세서는 플러그인 객체들을 갖는 컴포넌트를 호스팅함 -
    를 포함하고, 상기 플러그인 객체들에 의한 정보의 처리 시에 예외 (exception)가 발생할 때, 상기 플러그인 객체들은 다른 플러그인 객체들에게 상기 예외에 대해 경보하기 위해 상기 다른 플러그인 객체들에게 전송되는 데이터 패킷을 생성하는 시스템.
  100. 제99항에 있어서, 상기 데이터 패킷은 입력 큐에 전송되고, 상기 입력 큐는 그 후에 동기식 스레드(synchronous thread) 및 비동기식 스레드(asynchronous thread) 중 적어도 하나에서 상기 플러그인 객체들에 의해 액세스되는 시스템.
  101. 제99항에 있어서, 상기 데이터 패킷은 출력 큐에 전송되고, 상기 출력 큐는 그 후에 비동기식 스레드 상에서 상기 플러그인 객체들에 의해 액세스되는 시스템.
KR1020057012369A 2003-10-24 2004-07-28 실시간 잉킹 KR101085730B1 (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US51359103P 2003-10-24 2003-10-24
US60/513,591 2003-10-24
US10/879,527 2004-06-30
US10/879,527 US7436535B2 (en) 2003-10-24 2004-06-30 Real-time inking
PCT/US2004/024194 WO2005045574A2 (en) 2003-10-24 2004-07-28 Real-time inking

Publications (2)

Publication Number Publication Date
KR20060123029A true KR20060123029A (ko) 2006-12-01
KR101085730B1 KR101085730B1 (ko) 2011-11-21

Family

ID=34526880

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020057012369A KR101085730B1 (ko) 2003-10-24 2004-07-28 실시간 잉킹

Country Status (13)

Country Link
US (17) US7436535B2 (ko)
EP (1) EP1676185A4 (ko)
JP (1) JP4698599B2 (ko)
KR (1) KR101085730B1 (ko)
CN (1) CN1795453B (ko)
AU (1) AU2004287136B2 (ko)
BR (1) BRPI0406514A (ko)
CA (1) CA2511395C (ko)
MX (1) MXPA05007085A (ko)
MY (1) MY139593A (ko)
RU (1) RU2392655C2 (ko)
TW (1) TWI374368B (ko)
WO (1) WO2005045574A2 (ko)

Families Citing this family (118)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8352400B2 (en) 1991-12-23 2013-01-08 Hoffberg Steven M Adaptive pattern recognition based controller apparatus and method and human-factored interface therefore
US7904187B2 (en) 1999-02-01 2011-03-08 Hoffberg Steven M Internet appliance system and method
US7262785B2 (en) * 2003-08-21 2007-08-28 Microsoft Corporation Ink editing architecture
BR0306576A (pt) * 2003-08-21 2006-10-03 Microsoft Corp coleta e renderização de tinta
US7436535B2 (en) 2003-10-24 2008-10-14 Microsoft Corporation Real-time inking
US7427984B2 (en) * 2003-10-26 2008-09-23 Microsoft Corporation Point erasing
US7978716B2 (en) 2003-11-24 2011-07-12 Citrix Systems, Inc. Systems and methods for providing a VPN solution
US8060743B2 (en) * 2003-11-14 2011-11-15 Certicom Corp. Cryptographic method and apparatus
US8495305B2 (en) 2004-06-30 2013-07-23 Citrix Systems, Inc. Method and device for performing caching of dynamically generated objects in a data communication network
US8739274B2 (en) 2004-06-30 2014-05-27 Citrix Systems, Inc. Method and device for performing integrated caching in a data communication network
US7757074B2 (en) 2004-06-30 2010-07-13 Citrix Application Networking, Llc System and method for establishing a virtual private network
EP1771998B1 (en) 2004-07-23 2015-04-15 Citrix Systems, Inc. Systems and methods for optimizing communications between network nodes
KR20070037650A (ko) 2004-07-23 2007-04-05 사이트릭스 시스템스, 인크. 종단에서 게이트웨이로 패킷을 라우팅하기 위한 방법 및시스템
US7761814B2 (en) * 2004-09-13 2010-07-20 Microsoft Corporation Flick gesture
US7810089B2 (en) 2004-12-30 2010-10-05 Citrix Systems, Inc. Systems and methods for automatic installation and execution of a client-side acceleration program
US8549149B2 (en) * 2004-12-30 2013-10-01 Citrix Systems, Inc. Systems and methods for providing client-side accelerated access to remote applications via TCP multiplexing
US8954595B2 (en) 2004-12-30 2015-02-10 Citrix Systems, Inc. Systems and methods for providing client-side accelerated access to remote applications via TCP buffering
US8700695B2 (en) 2004-12-30 2014-04-15 Citrix Systems, Inc. Systems and methods for providing client-side accelerated access to remote applications via TCP pooling
US8706877B2 (en) 2004-12-30 2014-04-22 Citrix Systems, Inc. Systems and methods for providing client-side dynamic redirection to bypass an intermediary
US8255456B2 (en) 2005-12-30 2012-08-28 Citrix Systems, Inc. System and method for performing flash caching of dynamically generated objects in a data communication network
KR100960577B1 (ko) 2005-02-08 2010-06-03 오블롱 인더스트리즈, 인크 제스처 기반의 제어 시스템을 위한 시스템 및 방법
US8108787B2 (en) * 2005-07-01 2012-01-31 Microsoft Corporation Distributing input events to multiple applications in an interactive media environment
US8305398B2 (en) 2005-07-01 2012-11-06 Microsoft Corporation Rendering and compositing multiple applications in an interactive media environment
US8020084B2 (en) 2005-07-01 2011-09-13 Microsoft Corporation Synchronization aspects of interactive multimedia presentation management
US7721308B2 (en) 2005-07-01 2010-05-18 Microsoft Corproation Synchronization aspects of interactive multimedia presentation management
US20070006062A1 (en) * 2005-07-01 2007-01-04 Microsoft Corporation Synchronization aspects of interactive multimedia presentation management
US7941522B2 (en) * 2005-07-01 2011-05-10 Microsoft Corporation Application security in an interactive media environment
US8799757B2 (en) * 2005-07-01 2014-08-05 Microsoft Corporation Synchronization aspects of interactive multimedia presentation management
US8656268B2 (en) * 2005-07-01 2014-02-18 Microsoft Corporation Queueing events in an interactive media environment
US7685298B2 (en) * 2005-12-02 2010-03-23 Citrix Systems, Inc. Systems and methods for providing authentication credentials across application environments
US7921184B2 (en) 2005-12-30 2011-04-05 Citrix Systems, Inc. System and method for performing flash crowd caching of dynamically generated objects in a data communication network
US8301839B2 (en) 2005-12-30 2012-10-30 Citrix Systems, Inc. System and method for performing granular invalidation of cached dynamically generated objects in a data communication network
US7378966B2 (en) * 2006-01-04 2008-05-27 Microsoft Corporation RFID device groups
US7486282B2 (en) * 2006-01-27 2009-02-03 Microsoft Corporation Size variant pressure eraser
US9823747B2 (en) 2006-02-08 2017-11-21 Oblong Industries, Inc. Spatial, multi-modal control device for use with spatial operating system
US8537111B2 (en) 2006-02-08 2013-09-17 Oblong Industries, Inc. Control system for navigating a principal dimension of a data space
US8531396B2 (en) 2006-02-08 2013-09-10 Oblong Industries, Inc. Control system for navigating a principal dimension of a data space
US9910497B2 (en) 2006-02-08 2018-03-06 Oblong Industries, Inc. Gestural control of autonomous and semi-autonomous systems
US8407725B2 (en) 2007-04-24 2013-03-26 Oblong Industries, Inc. Proteins, pools, and slawx in processing environments
US8370383B2 (en) 2006-02-08 2013-02-05 Oblong Industries, Inc. Multi-process interactive systems and methods
US20080001711A1 (en) * 2006-06-15 2008-01-03 Microsoft Corporation Reliability of execution for device provider implementations
US7956724B2 (en) * 2006-06-15 2011-06-07 Microsoft Corporation Support for reliable end to end messaging of tags in an RFID infrastructure
US8207822B2 (en) * 2006-06-15 2012-06-26 Microsoft Corporation Support for batching of events, and shredding of batched events in the RFID infrastructure platform
US7903094B2 (en) * 2006-06-23 2011-03-08 Wacom Co., Ltd Information processing apparatus, operation input method, and sensing device
US20080174404A1 (en) * 2007-01-23 2008-07-24 Microsoft Corporation Dynamic updates in rfid manager
US8245219B2 (en) * 2007-01-25 2012-08-14 Microsoft Corporation Standardized mechanism for firmware upgrades of RFID devices
JP4866262B2 (ja) * 2007-02-16 2012-02-01 ソフトバンクモバイル株式会社 操作入力処理方法及び携帯型情報処理装置
US20080271007A1 (en) * 2007-04-30 2008-10-30 Bea Systems, Inc. System and method for managed tuxedo wrapper for .net applications
US20080313607A1 (en) * 2007-06-15 2008-12-18 Microsoft Corporation Unified input stack
US20090027398A1 (en) * 2007-07-26 2009-01-29 Tufts University Method for recognizing a shape from a path of a digitizing device
US8291393B2 (en) * 2007-08-20 2012-10-16 International Business Machines Corporation Just-in-time compiler support for interruptible code
US20090144752A1 (en) * 2007-11-30 2009-06-04 Microsoft Corporation Unmanaged-to-managed aggregation
US20090157848A1 (en) * 2007-12-18 2009-06-18 Western Digital Technologies, Inc. Application server processing tcp/ip requests from a client by invoking an asynchronous function
US8245145B1 (en) * 2007-12-18 2012-08-14 Eakin Douglas M Tool and method for developing a web page
US20090189892A1 (en) 2008-01-27 2009-07-30 Nitin Desai Methods and systems for detecting a dirty region within a frame encompassing three dimensional graphics
US8390579B2 (en) * 2008-03-14 2013-03-05 France Telecom System for classifying gestures
US8723795B2 (en) 2008-04-24 2014-05-13 Oblong Industries, Inc. Detecting, representing, and interpreting three-space input: gestural continuum subsuming freespace, proximal, and surface-contact modes
US10642364B2 (en) 2009-04-02 2020-05-05 Oblong Industries, Inc. Processing tracking and recognition data in gestural recognition systems
US9952673B2 (en) 2009-04-02 2018-04-24 Oblong Industries, Inc. Operating environment comprising multiple client devices, multiple displays, multiple users, and gestural control
US9495013B2 (en) 2008-04-24 2016-11-15 Oblong Industries, Inc. Multi-modal gestural interface
US9740293B2 (en) 2009-04-02 2017-08-22 Oblong Industries, Inc. Operating environment with gestural control and multiple client devices, displays, and users
US9684380B2 (en) 2009-04-02 2017-06-20 Oblong Industries, Inc. Operating environment with gestural control and multiple client devices, displays, and users
US9740922B2 (en) 2008-04-24 2017-08-22 Oblong Industries, Inc. Adaptive tracking system for spatial input devices
EP2164026A1 (en) * 2008-09-15 2010-03-17 Alcatel, Lucent Gesture service platform
EP2350774A4 (en) * 2008-10-14 2014-11-05 Oblong Ind Inc MULTI-PROCESS INTERACTIVE SYSTEMS AND METHODS
US8149431B2 (en) * 2008-11-07 2012-04-03 Citrix Systems, Inc. Systems and methods for managing printer settings in a networked computing environment
US20100131921A1 (en) * 2008-11-25 2010-05-27 Microsoft Corporation Exposing asynchronous mechanisms as first-class events
US20100131556A1 (en) * 2008-11-25 2010-05-27 Microsoft Corporation Unified event programming and queries
US20100131745A1 (en) * 2008-11-25 2010-05-27 Microsoft Corporation Exceptional events
US20100131743A1 (en) * 2008-11-25 2010-05-27 Microsoft Corporation Lazy and stateless events
US10019081B2 (en) * 2009-01-15 2018-07-10 International Business Machines Corporation Functionality switching in pointer input devices
US9317128B2 (en) 2009-04-02 2016-04-19 Oblong Industries, Inc. Remote devices used in a markerless installation of a spatial operating environment incorporating gestural control
US10824238B2 (en) 2009-04-02 2020-11-03 Oblong Industries, Inc. Operating environment with gestural control and multiple client devices, displays, and users
US20110029904A1 (en) * 2009-07-30 2011-02-03 Adam Miles Smith Behavior and Appearance of Touch-Optimized User Interface Elements for Controlling Computer Function
US8751844B2 (en) * 2009-09-24 2014-06-10 Citrix Systems, Inc. Systems and methods for attributing an amount of power consumption to a workload
US9933852B2 (en) 2009-10-14 2018-04-03 Oblong Industries, Inc. Multi-process interactive systems and methods
US9971807B2 (en) 2009-10-14 2018-05-15 Oblong Industries, Inc. Multi-process interactive systems and methods
US8847961B2 (en) * 2010-06-14 2014-09-30 Microsoft Corporation Geometry, speed, pressure, and anti-aliasing for ink rendering
US9189147B2 (en) * 2010-06-22 2015-11-17 Microsoft Technology Licensing, Llc Ink lag compensation techniques
US8970870B2 (en) * 2010-06-30 2015-03-03 Canon Kabushiki Kaisha Delivery of scan services over a device service port
JP6010036B2 (ja) * 2010-10-01 2016-10-19 ゼット124Z124 タッチセンサ式ディスプレイに画像を表示する方法及び通信デバイスならびにコンピュータ可読媒体
US9069459B2 (en) 2011-05-03 2015-06-30 Microsoft Technology Licensing, Llc Multi-threaded conditional processing of user interactions for gesture processing using rendering thread or gesture processing thread based on threshold latency
DE102011053214A1 (de) * 2011-09-02 2013-03-07 Claas Selbstfahrende Erntemaschinen Gmbh Landwirtschaftliche Erntemaschine
US8994686B2 (en) 2011-10-17 2015-03-31 Topaz Systems, Inc. Digitizer
US8952926B2 (en) 2011-10-17 2015-02-10 Topaz Systems, Inc. Digitizer
US9052796B2 (en) 2012-01-08 2015-06-09 Microsoft Technology Licensing Llc Asynchronous handling of an input stream dedicated to multiple targets
US9537899B2 (en) 2012-02-29 2017-01-03 Microsoft Technology Licensing, Llc Dynamic selection of security protocol
TWI498778B (zh) * 2012-03-19 2015-09-01 Wistron Corp 校正不同觸控系統的方法
WO2013151587A1 (en) * 2012-04-06 2013-10-10 Topaz Systems, Inc. Digitizer
US9180262B2 (en) 2012-05-15 2015-11-10 JettStream, Inc. Delivery of nebulized medicines
US9389717B2 (en) * 2012-12-14 2016-07-12 Microsoft Technology Licensing, Llc Reducing latency in ink rendering
WO2014097303A1 (en) * 2012-12-23 2014-06-26 N-Trig Ltd. Touchscreen computing device and method
US20140253462A1 (en) * 2013-03-11 2014-09-11 Barnesandnoble.Com Llc Sync system for storing/restoring stylus customizations
US20140372903A1 (en) * 2013-06-14 2014-12-18 Microsoft Corporation Independent Hit Testing for Touchpad Manipulations and Double-Tap Zooming
US9535646B2 (en) * 2013-06-18 2017-01-03 Microsoft Technology Licensing, Llc Methods and systems for electronic ink projection
US9433736B2 (en) 2013-07-03 2016-09-06 JettStream, Inc. Positionable elongated members with multi-axis joints
US9360956B2 (en) 2013-10-28 2016-06-07 Microsoft Technology Licensing, Llc Wet ink texture engine for reduced lag digital inking
WO2015075930A1 (en) * 2013-11-19 2015-05-28 Wacom Co., Ltd. Method and system for ink data generation, ink data rendering, ink data manipulation and ink data communication
US9990046B2 (en) 2014-03-17 2018-06-05 Oblong Industries, Inc. Visual collaboration interface
WO2015141260A1 (ja) * 2014-03-17 2015-09-24 株式会社河合楽器製作所 手書き音楽記号認識装置およびプログラム
US9633466B2 (en) 2014-09-29 2017-04-25 Microsoft Technology Licensing, Llc Low latency ink rendering pipeline
US20160210038A1 (en) * 2015-01-21 2016-07-21 Microsoft Technology Licensing, Llc Electronic inking
CN111556426B (zh) * 2015-02-06 2022-03-25 杜比实验室特许公司 用于自适应音频的混合型基于优先度的渲染系统和方法
US10089291B2 (en) 2015-02-27 2018-10-02 Microsoft Technology Licensing, Llc Ink stroke editing and manipulation
US9950542B2 (en) * 2015-03-12 2018-04-24 Microsoft Technology Licensing, Llc Processing digital ink input subject to monitoring and intervention by an application program
US9898841B2 (en) 2015-06-29 2018-02-20 Microsoft Technology Licensing, Llc Synchronizing digital ink stroke rendering
JP6589469B2 (ja) 2015-09-04 2019-10-16 カシオ計算機株式会社 描画装置及び描画装置の描画方法
US20170236318A1 (en) * 2016-02-15 2017-08-17 Microsoft Technology Licensing, Llc Animated Digital Ink
JP6701853B2 (ja) * 2016-03-18 2020-05-27 カシオ計算機株式会社 描画装置及び描画装置の描画方法
US9996511B2 (en) * 2016-03-23 2018-06-12 International Business Machines Corporation Free form website structure design
US10146759B2 (en) * 2016-03-24 2018-12-04 Microsoft Technology Licensing, Llc Controlling digital input
US11029836B2 (en) * 2016-03-25 2021-06-08 Microsoft Technology Licensing, Llc Cross-platform interactivity architecture
US10529302B2 (en) 2016-07-07 2020-01-07 Oblong Industries, Inc. Spatially mediated augmentations of and interactions among distinct devices and applications via extended pixel manifold
CN111433738A (zh) 2017-12-11 2020-07-17 惠普发展公司,有限责任合伙企业 控制器事件队列
CN111625303B (zh) * 2019-02-27 2023-06-09 阿里巴巴集团控股有限公司 事件处理方法、装置、设备及可读存储介质
WO2021056780A1 (zh) * 2019-09-25 2021-04-01 掌阅科技股份有限公司 信息显示方法、阅读器、计算机存储介质、墨水屏阅读设备以及投屏显示系统
CN112802133B (zh) * 2021-04-13 2021-07-06 武汉精测电子集团股份有限公司 一种基于机器视觉的Mini Led显示屏单元板墨色检测分选方法
US20240094896A1 (en) * 2022-09-19 2024-03-21 Microsoft Technology Licensing, Llc Locally generating preliminary inking imagery

Family Cites Families (49)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2669575B2 (ja) * 1991-04-19 1997-10-29 インターナショナル・ビジネス・マシーンズ・コーポレイション データ入力方法及び装置
EP0566293B1 (en) 1992-04-15 2003-07-16 Xerox Corporation Graphical drawing and editing systems and methods therefor
US5710831A (en) * 1993-07-30 1998-01-20 Apple Computer, Inc. Method for correcting handwriting on a pen-based computer
US5500937A (en) * 1993-09-08 1996-03-19 Apple Computer, Inc. Method and apparatus for editing an inked object while simultaneously displaying its recognized object
US5534893A (en) * 1993-12-15 1996-07-09 Apple Computer, Inc. Method and apparatus for using stylus-tablet input in a computer system
US5768607A (en) 1994-09-30 1998-06-16 Intel Corporation Method and apparatus for freehand annotation and drawings incorporating sound and for compressing and synchronizing sound
US5802388A (en) * 1995-05-04 1998-09-01 Ibm Corporation System and method for correction and confirmation dialog for hand printed character input to a data processing system
US6268859B1 (en) * 1995-06-06 2001-07-31 Apple Computer, Inc. Method and system for rendering overlapping opaque graphical objects in graphic imaging systems
US5920688A (en) * 1995-11-13 1999-07-06 International Business Machines Corporation Method and operating system for manipulating the orientation of an output image of a data processing system
US5782539A (en) * 1995-11-16 1998-07-21 Peterson; Randall D. Wall-to-wall surface mining process
US5872966A (en) * 1996-05-10 1999-02-16 Apple Computer, Inc. System and method for logging and enabling further manipulation of system state information
US5949998A (en) * 1996-07-03 1999-09-07 Sun Microsystems, Inc. Filtering an object interface definition to determine services needed and provided
US6128007A (en) * 1996-07-29 2000-10-03 Motorola, Inc. Method and apparatus for multi-mode handwritten input and hand directed control of a computing device
US5919249A (en) 1996-08-07 1999-07-06 Adobe Systems Incorporated Multiplexed output movie rendering
US5896126A (en) * 1996-08-29 1999-04-20 International Business Machines Corporation Selection device for touchscreen systems
US5953523A (en) * 1996-10-28 1999-09-14 International Business Machines Corporation Method and apparatus for creating "smart forms "
US6049832A (en) 1996-11-15 2000-04-11 Wall Data Incorporated Method for accessing information on a host computer from a client computer through an intelligent virtual host component
GB2340362B (en) * 1998-07-31 2002-11-06 Sony Uk Ltd Digital video processing
GB2340265B (en) * 1998-07-31 2003-04-23 Sony Uk Ltd Data processing
GB2340360B (en) * 1998-07-31 2002-11-06 Sony Uk Ltd Animation of video special effects
US6269378B1 (en) * 1998-12-23 2001-07-31 Nortel Networks Limited Method and apparatus for providing a name service with an apparently synchronous interface
US6249810B1 (en) * 1999-02-19 2001-06-19 Chaincast, Inc. Method and system for implementing an internet radio device for receiving and/or transmitting media information
US6498610B1 (en) * 2000-05-05 2002-12-24 Xerox Corporation Concurrent utilization of multiple color profile databases for image rending
US7397949B2 (en) * 2000-06-21 2008-07-08 Microsoft Corporation Serial storage of ink and its properties
US6355889B1 (en) * 2000-06-28 2002-03-12 International Business Machines Corporation Method and apparatus for linking electronic ink to electronic personal information systems
US6608697B1 (en) * 2000-07-26 2003-08-19 Extensis, Inc. Preflight system that provides a universal resource locator address associated with a detected print file error
US6754386B1 (en) * 2000-08-22 2004-06-22 Microsft Corporation Method and system of matching ink processor and recognizer word breaks
US6707473B2 (en) * 2001-08-01 2004-03-16 Microsoft Corporation Dynamic rendering of ink strokes with transparency
US6469983B2 (en) * 2001-02-26 2002-10-22 Maple Optical Systems, Inc. Data packet transmission scheduling using a partitioned heap
US6943787B2 (en) * 2001-02-27 2005-09-13 Medtronics, Inc. System and method for displaying implantable medical device data
US7057615B2 (en) * 2001-06-28 2006-06-06 Microsoft Corporation Method and system for representing and displaying digital ink
US6885374B2 (en) * 2001-06-29 2005-04-26 Intel Corporation Apparatus, method and system with a graphics-rendering engine having a time allocator
US7039234B2 (en) * 2001-07-19 2006-05-02 Microsoft Corporation Electronic ink as a software object
US6909430B2 (en) * 2001-08-01 2005-06-21 Microsoft Corporation Rendering ink strokes of variable width and angle
US7287277B2 (en) * 2001-12-21 2007-10-23 Hewlett-Packard Development Company, L.P. Method and apparatus for controlling execution of a computer operation
JP2003216324A (ja) * 2002-01-17 2003-07-31 Hitachi Information Technology Co Ltd 入力システム
US7139004B2 (en) * 2002-01-25 2006-11-21 Xerox Corporation Method and apparatus to convert bitmapped images for use in a structured text/graphics editor
US7136082B2 (en) * 2002-01-25 2006-11-14 Xerox Corporation Method and apparatus to convert digital ink images for use in a structured text/graphics editor
DE10215615A1 (de) * 2002-04-09 2003-10-30 Roland Man Druckmasch Farbwerk für Druckwerke von Rotationsdruckmaschinen
US20040070616A1 (en) * 2002-06-02 2004-04-15 Hildebrandt Peter W. Electronic whiteboard
US7046213B2 (en) * 2002-06-05 2006-05-16 Ibm Apparatus and method for direct manipulation of electronic information
US7028229B2 (en) * 2002-09-30 2006-04-11 Sun Microsystems, Inc. Kernel event subscription and publication system and method
US7430623B2 (en) * 2003-02-08 2008-09-30 Hewlett-Packard Development Company, L.P. System and method for buffering data received from a network
JP4039274B2 (ja) * 2003-02-28 2008-01-30 富士ゼロックス株式会社 サービス処理システム及びプログラム
US7562289B2 (en) * 2003-06-18 2009-07-14 Layton Geo-Science, Inc. Methods and systems for encoding geographic coordinates and features in a portable document format file
US7533338B2 (en) * 2003-08-21 2009-05-12 Microsoft Corporation Electronic ink processing
US7436535B2 (en) * 2003-10-24 2008-10-14 Microsoft Corporation Real-time inking
US6925892B2 (en) 2003-12-17 2005-08-09 Sauer-Danfoss, Inc. Method and means for monitoring torque in a hydraulic power unit
US7499058B2 (en) * 2005-04-22 2009-03-03 Microsoft Corporation Programmatical access to handwritten electronic ink in a tree-based rendering environment

Also Published As

Publication number Publication date
CN1795453B (zh) 2012-04-11
MY139593A (en) 2009-10-30
US20050093839A1 (en) 2005-05-05
US7453585B2 (en) 2008-11-18
US20050093840A1 (en) 2005-05-05
US7436535B2 (en) 2008-10-14
WO2005045574A2 (en) 2005-05-19
US7446894B2 (en) 2008-11-04
US20060132817A1 (en) 2006-06-22
US7463371B2 (en) 2008-12-09
US8199131B2 (en) 2012-06-12
US20110225331A1 (en) 2011-09-15
US20050093844A1 (en) 2005-05-05
US20050093833A1 (en) 2005-05-05
US7016055B2 (en) 2006-03-21
US7428736B2 (en) 2008-09-23
CA2511395A1 (en) 2005-05-19
US20120242625A1 (en) 2012-09-27
EP1676185A2 (en) 2006-07-05
US8213027B2 (en) 2012-07-03
US20050093842A1 (en) 2005-05-05
US7212296B2 (en) 2007-05-01
US8400665B2 (en) 2013-03-19
JP4698599B2 (ja) 2011-06-08
TWI374368B (en) 2012-10-11
US20050093838A1 (en) 2005-05-05
AU2004287136B2 (en) 2009-08-13
US20050093843A1 (en) 2005-05-05
AU2004287136A1 (en) 2005-05-19
US20050088420A1 (en) 2005-04-28
RU2392655C2 (ru) 2010-06-20
US7511836B2 (en) 2009-03-31
US20050156913A1 (en) 2005-07-21
US7199885B2 (en) 2007-04-03
JP2007509413A (ja) 2007-04-12
US7239401B2 (en) 2007-07-03
US7450261B2 (en) 2008-11-11
KR101085730B1 (ko) 2011-11-21
MXPA05007085A (es) 2005-10-18
US7443531B2 (en) 2008-10-28
WO2005045574A3 (en) 2005-10-27
EP1676185A4 (en) 2012-01-04
RU2005120672A (ru) 2006-01-20
CN1795453A (zh) 2006-06-28
US20070121125A1 (en) 2007-05-31
US20050093841A1 (en) 2005-05-05
CA2511395C (en) 2012-04-24
US7973957B2 (en) 2011-07-05
US7515139B2 (en) 2009-04-07
US20070153300A1 (en) 2007-07-05
US20090189879A1 (en) 2009-07-30
TW200519711A (en) 2005-06-16
US20050093836A1 (en) 2005-05-05
BRPI0406514A (pt) 2005-12-20

Similar Documents

Publication Publication Date Title
KR101085730B1 (ko) 실시간 잉킹
US8803824B2 (en) Methods for allowing applications to filter out or opt into tablet input
US20140285457A1 (en) Touch Input Data Handling

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20141017

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20151016

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20161019

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20171018

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20181018

Year of fee payment: 8