2011-04-21 2 views
5

OpenType 파일의 cmap 테이블은 문자 코드를 글리프 ID로 변환합니다. cmap에 대한 Microsoft OpenType 사양

어느 한 날이 C 식을 이해하는 데 도움 수 :

*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i]) 

Here는 형식 4 cmap를 서브 테이블입니다.

+4

Microsoft 설명서를 건너 뛰고 원래 Apple TrueType 설명서로 이동해보십시오. http://developer.apple.com/fonts/ttrefman/rm06/Chap6cmap.html – ohmantics

+0

감사합니다. 멋 졌어요 ! – Ayrosa

답변

5

그래서, 그 표현에 나는 = 세그먼트 인덱스와 C = 문자 코드. idRangeOffset을하여 cmap를 내부 glyphIdArray으로 세그먼트의 오프셋 (offset)를 가져옵니다. 당신이 실제로 찾고있는 값을 이 경우 glyphIdArray [something]입니다 .GlyphIdArray는 글꼴 파일의 idRangeOffset 바로 뒤에 있으므로 기본 포인터로 idRangeOffset을 사용합니다.

glyphIdArray의 시작 부분으로 이동하려면 idRangeOffset을 추가해야하지만 그 값 바이트 단위이고 idRangeOffset 테이블이 16 비트이면 단어 수를 얻기 위해 2로 나누어야합니다. 그러면 glyphIdArray 내의 세그먼트 i의 오프셋을 가져옵니다

그러나이 세그먼트 내에서 캐릭터의 오프셋은 c - startCount [i]에 있으므로 추가해야합니다.

마지막 표현식은 포인터이므로 실제로 글리프 색인을 가져 오기 위해 역 참조를해야합니다.

이 색인은 LOCA 테이블에 사용됩니다.

+0

나는 오랫동안 그렇게 멀리 떨어져 있었다. 그래서 당신의 대답을 받아들이는 데 오랜 시간이 걸렸습니다. – Ayrosa

-5

RTFM!

"세그먼트의 idRangeOffset 값이 0이 아닌 경우 문자 코드의 매핑은 glyphIdArray에 의존하며 startCode의 문자 코드 오프셋이 idRangeOffset 값에 추가됩니다.이 합계는 현재 위치의 오프셋 idRangeOffset 자체 인덱스 아웃 정확한 glyphIdArray 값에 glyphIdArray 즉시 폰트 파일 idRangeOffset 다음 때문에 불분명 인덱싱 트릭 작동 글리프 인덱스 맺는 C 표현식이다..

* (idRangeOffset [I]/2 + (c - startCount [i]) + & idRangeOffset [i])

Th e 값 c는 해당 문자 코드이고, i는 c가 나타나는 세그먼트 인덱스입니다. 인덱싱 작업에서 얻은 값이 0 (누락 된 글리프를 나타냄)이 아닌 경우 글리프 인덱스를 가져 오기 위해 idDelta [i]가 추가됩니다. idDelta 산술 모듈로 65536입니다 "

+0

하지만 그게 정확히 내가 이해해야 할 것입니다. 수식에 대해서는 신경 쓰지 않지만 테이블 레이아웃 자체에 대해서는 관심이 있습니다.idRangeOffset [i]가 세그먼트 i의 글리프가있는 GlyphIDArray []의 오프셋 인 경우이 수식이 정확하지 않은 것 같습니다. 기본적으로, 내가 찾고있는 것은 포맷 4 cmap 테이블의 배열 idDelta []와 idRangeOffset []에 대한 의미이다. 감사. – Ayrosa

5

여전히 필요한 경우 확실하지 않지만 주위를 둘러 본 사람에게 내 조사 결과를 공유합니다.

&idRangeOffset[i]idRangeOffset[i]의 주소 또는 문서의 음성에서 파일 시작 부분의 오프셋을 나타냅니다.

*(x)은 x 주소의 내용입니다.

따라서 idRangeOffset[i]의 주소를 찾고 idRangeOffset[i]/2 + (c - startCount[i])에 추가하면 결과가 다른 주소가됩니다. 해당 주소의 내용은 원하는 글리프 ID입니다.