Uniscribe를 사용하여 텍스트 표시

애플리케이션은 Uniscribe API 함수를 사용하여 입력 체계와 국제 텍스트의 표시 및 편집을 지원할 수 있습니다. Uniscribe는 단락을 텍스트 표시의 단위로 사용하며 전체 단락에 대해 유니스크립브 기능을 사용해야 합니다.

텍스트 표시에 Uniscribe를 사용하는 경우 애플리케이션은 일반적으로 Uniscribe를 사용하는 서식("레이아웃") 프로세스를 거쳐야 합니다. 애플리케이션은 텍스트 단락을 "runs"라는 스타일이 같은 문자 문자열로 나눕니다. 스타일은 특정 구현에 의해 결정되지만 일반적으로 글꼴, 크기 및 색과 같은 특성을 포함합니다. 실행을 정의할 때 애플리케이션은 언어 및 로캘 데이터와 같은 다른 정보를 적용할 수도 기본 어휘 도구와 함께 사용할 수 있습니다. 예를 들어 애플리케이션은 프랑스어로 렌더링되는 주로 영어 텍스트의 구절을 별도의 실행으로 처리할 수 있습니다.

모든 단락에 대한 실행이 결정되면 애플리케이션은 각 단락을 동일한 스크립트와 방향("items")이 있는 문자열로 나눕니다. 애플리케이션은 항목 정보를 적용하여 스크립트 및 방향에서 고유하고 완전히 단일 항목("범위") 내에 속하는 실행을 생성합니다.

범위는 "클러스터"라고 하는 하나 이상의 연속 스크립트 정의, 분할할 수 없는 문자 그룹화로 구성되어야 하지만 항목의 범위를 범위로 분석하는 것은 다소 임의적입니다. 유럽 언어의 경우 클러스터는 일반적으로 단일 코드 페이지 문자 또는 유니코드 코드 포인트에 해당하며 단일 문자 모양으로 구성됩니다. 그러나 태국어와 같은 언어에서 클러스터는 문자 모양 그룹화이며 여러 개의 연속 문자 또는 코드 포인트에 해당합니다. 예를 들어 태국 클러스터에는 자음, 모음 및 톤 표시가 포함될 수 있습니다. 클러스터를 중단하지 않도록 애플리케이션은 일반적으로 가능한 가장 긴 범위를 사용하거나 자체 어휘 정보를 사용하여 클러스터 중간에 있지 않은 위치의 범위 간을 구분해야 합니다.

각 범위에서 클러스터를 식별한 경우 애플리케이션은 각 클러스터의 크기를 결정해야 합니다. Uniscribe를 사용하여 클러스터의 합계를 계산하여 각 범위의 크기를 결정합니다. 그런 다음, 애플리케이션은 선을 오버플로할 때까지 범위의 크기를 합산합니다. 즉, 여백에 도달합니다. 선을 오버플로하는 범위는 현재 줄과 다음 줄로 나뉩니다. 각 줄에 대해 애플리케이션은 시각적 위치에서 각 범위에 대한 논리적 위치로 맵을 작성합니다. 그런 다음, 애플리케이션은 각 범위에 대한 코드 요소를 문자 모양으로 셰이프하여 이후에 위치 지정하고 렌더링할 수 있습니다.

애플리케이션은 텍스트 레이아웃을 한 번만 수행합니다. 그 후 표시를 위해 문자 모양과 위치를 저장하거나 텍스트를 표시할 때마다 문자 모양과 위치를 생성합니다. 이 경우 장단위가 메모리와 비교됩니다. 일반적인 애플리케이션은 레이아웃 프로세스를 한 번 구현한 다음 텍스트를 표시할 때마다 문자 모양과 위치를 생성합니다.

복잡한 스크립트를 사용하는 애플리케이션에는 레이아웃 및 표시에 대한 간단한 접근 방식과 관련하여 다음과 같은 문제가 있습니다.

  • 복잡한 스크립트 문자의 너비는 컨텍스트에 따라 달라집니다. 너비를 단순 테이블에 저장할 수 없습니다.
  • 태국어와 같은 스크립트의 단어 간을 분리하려면 사전 지원이 필요합니다. 예를 들어 태국어 단어 사이에는 구분 기호 문자가 사용되지 않습니다.
  • 아랍어, 히브리어, 페르시아어, 우르두어 및 기타 양방향 텍스트 언어는 표시하기 전에 순서를 변경해야 합니다.
  • 복잡한 스크립트를 쉽게 사용하려면 일부 형태의 글꼴 연결이 필요한 경우가 많습니다.

Uniscribe가 단락을 표시 단위로 사용한다는 사실은 애플리케이션이 이러한 복잡한 스크립트 문제를 적절하게 처리하는 데 도움이 됩니다.

참고 항목

단락의 섹션이 복잡한 스크립트가 아니더라도 전체 단락에 유니스크립트를 사용해야 합니다.

 

다음 표와 같이 Uniscribe 버전 1.6 이상에서는 OpenType 태그를 활용하는 여러 함수를 지원합니다. 해당 일반 Uniscribe 함수로 대체할 수 있습니다. 일반적으로 애플리케이션은 한 집합 또는 다른 집합의 함수에서 완전히 작동해야 하며 함수를 "혼합 및 일치"하려고 시도해서는 안 됩니다.

일반 Uniscribe 함수 해당 OpenType 함수
ScriptItemize ScriptItemizeOpenType
ScriptShape ScriptShapeOpenType
ScriptPlace ScriptPlaceOpenType

 

유니스크립트를 사용하여 텍스트 레이아웃

애플리케이션은 다음 단계를 사용하여 Uniscribe를 사용하여 텍스트 단락을 배치할 수 있습니다. 이 절차에서는 애플리케이션이 이미 단락을 실행으로 분할한 것으로 가정합니다.

  1. 시작하거나 WM_SETTINGCHANGE 메시지를 받을 때만 ScriptRecordDigitSubstitution 호출합니다.

  2. (선택 사항) ScriptIsComplex를 호출하여 단락에 복잡한 처리가 필요한지 확인합니다.

  3. (선택 사항) Uniscribe를 사용하여 양방향 텍스트 및/또는 숫자 대체를 처리하는 경우 ScriptApplyDigitSubstitution를 호출하여 SCRIPT_CONTROL 및 SCRIPT_STATE 구조를 ScriptItemize에 대한 입력으로 준비합니다. 이 단계를 건너뛰지만 여전히 숫자 대체가 필요한 경우 유니코드 U+0030에서 U+0039(유럽 숫자)로 국가 숫자를 대체합니다. 숫자 대체에 대한 자세한 내용은 숫자 셰이프를 참조 하세요.

  4. ScriptItemize를 호출하여 단락을 항목으로 나눕니다. 숫자 대체에 Uniscribe를 사용하지 않는 경우 양방향 순서를 알 수 있습니다. 예를 들어 문자를 입력하는 데 사용되는 키보드 레이아웃 때문에 ScriptItemize를 호출 합니다. 호출에서 SCRIPT_CONTROL 및SCRIPT_STATE 구조체에 대한 null 포인터를 제공합니다. 이 기술은 셰이핑 엔진만 사용하여 항목을 생성하고 엔진 정보를 사용하여 항목을 다시 정렬할 수 있습니다.

    참고 항목

    일반적으로 왼쪽에서 오른쪽 스크립트로만 작동하고 숫자 대체 없이 작동하는 애플리케이션은 SCRIPT_CONTROL 및 SCRIPT_STATE 구조에 대한 null 포인터를 전달해야 합니다.

     

  5. 항목 정보를 실행 정보와 병합하여 범위를 생성합니다.

  6. ScriptShape를 호출하여 클러스터를 식별하고 문자 모양을 생성합니다.

  7. ScriptShape가 누락된 문자 모양이 포함된 출력을 사용하여 코드 USP_E_SCRIPT_NOT_IN_FONT 또는 S_OK 반환하는 경우 다른 글꼴에서 문자를 선택합니다. ScriptShape에 전달된 SCRIPT_ANALYSIS 구조체의 eScript 멤버를 설정하여 다른 글꼴을 대체하거나 셰이핑을 사용하지 않도록 설정하여 SCRIPT_UNDEFINED. 자세한 내용은 글꼴 대체 사용을 참조하세요.

  8. ScriptPlace를 호출하여 각 연속 범위의 문자 모양에 대한 사전 너비 및 x 및 y 위치를 생성합니다. 텍스트 크기가 고려되는 첫 번째 단계입니다.

  9. 줄이 오버플로될 때까지 범위 크기를 합산합니다.

  10. 논리 특성에서 fSoftBreakfWhiteSpace 멤버를 사용하여 단어 경계의 범위를 끊습니다. 실행에서 단일 문자 클러스터를 중단하려면 ScriptBreak를 호출하여 반환된 정보를 사용합니다.

    참고 항목

    이전 범위의 마지막 문자에 단어 중단점이 필요하기 때문에 범위의 첫 번째 코드 포인트가 단어 중단점이어야 하는지 여부를 결정합니다. 예를 들어 한 범위가 쉼표로 끝나는 경우 다음 범위의 첫 번째 문자를 단어 중단점으로 간주합니다.

     

  11. 단락의 각 줄에 대해 6~10단계를 반복합니다. 그러나 줄에서 마지막 실행을 중단하는 경우 ScriptShape를 호출하여 실행의 재기본 부분을 다음 줄의 첫 번째 실행으로 재구성합니다.

Uniscribe를 사용하여 텍스트 표시

애플리케이션은 다음 단계를 사용하여 텍스트 단락을 표시할 수 있습니다. 이 절차에서는 애플리케이션이 이미 텍스트를 배치했으며 레이아웃 프로세스에서 문자 모양과 위치를 저장하지 않았다고 가정합니다. 속도가 중요한 경우 애플리케이션은 레이아웃 프로시저에서 문자 모양과 위치를 저장하고 표시 프로시저의 2단계에서 시작할 수 있습니다.

참고 항목

텍스트에 오른쪽에서 왼쪽 스크립트의 문자가 없고 양방향 제어 문자가 없고 왼쪽에서 오른쪽 기본 포함 수준을 사용하는 경우 애플리케이션에서 2단계를 생략할 수 있습니다.

 

  1. 각 실행에 대해 다음을 수행합니다.

    1. 마지막 실행 이후 스타일이 변경된 경우 핸들을 해제하고 다시 가져오면 디바이스 컨텍스트로 업데이트합니다.
    2. ScriptShape를 호출하여 실행에 대한 문자 모양을 생성합니다.
    3. ScriptPlace를 호출하여 각 문자 모양에 대한 사전 너비 및 x,y 오프셋을 생성합니다.
  2. 줄에서 실행에 대한 올바른 시각적 순서를 설정하려면 다음을 수행합니다.

    1. 범위당 하나씩 양방향 포함 수준의 배열을 추출합니다. 포함 수준은 (SCRIPT_ITEM) si에 의해 지정됩니다. (SCRIPT_ANALYSIS) a. (SCRIPT_STATE) s.uBidiLevel.
    2. 이 배열을 ScriptLayout전달하여 시각적 위치의 맵을 논리적 위치로 생성합니다.
  3. (선택 사항) 텍스트를 정당화하려면 ScriptJustify를 호출하거나 텍스트에 대한 특수 지식을 사용합니다.

  4. 시각적-논리 맵을 사용하여 실행을 시각적 순서로 표시합니다. 줄의 왼쪽 끝에서 시작하여 ScriptTextOut을 호출하여 지도의 첫 번째 항목에서 제공하는 실행을 표시합니다. 맵의 각 후속 항목에 대해 ScriptTextOut을 호출하여 이전에 표시된 실행의 오른쪽에 표시된 실행을 표시합니다.

    2단계를 생략하는 경우 줄의 왼쪽 끝에서 시작하고 ScriptTextOut을 호출하여 첫 번째 논리 실행을 표시한 다음, 이전 실행의 오른쪽에 각 논리 실행을 표시합니다.

  5. 단락의 모든 줄에 대해 위의 단계를 반복합니다.

Uniscribe 사용