2013-12-22 1 views
9

TTF 파서를 쓰고 있습니다. TTF 형식을 더 잘 이해하기 위해 TTX를 사용하여 C : \ Windows \ calibri.ttf의 ".notdef"글리프 데이터를 추출했습니다.트루 타입 글꼴의 글리프는 2 차 베 지어로 만들어집니다. 글리프 윤곽에 두 개 이상의 연속 된 오프 커브 점이 나타나는 이유는 무엇입니까?

<TTGlyph name=".notdef" xMin="0" yMin="-397" xMax="978" yMax="1294"> 
     <contour> 
     <pt x="978" y="1294" on="1"/> 
     <pt x="978" y="0" on="1"/> 
     <pt x="44" y="0" on="1"/> 
     <pt x="44" y="1294" on="1"/> 
     </contour> 
     <contour> 
     <pt x="891" y="81" on="1"/> 
     <pt x="891" y="1213" on="1"/> 
     <pt x="129" y="1213" on="1"/> 
     <pt x="129" y="81" on="1"/> 
     </contour> 
     <contour> 
     <pt x="767" y="855" on="1"/> 
     <pt x="767" y="796" on="0"/> 
     <pt x="732" y="704" on="0"/> 
     <pt x="669" y="641" on="0"/> 
     <pt x="583" y="605" on="0"/> 
     <pt x="532" y="602" on="1"/> 
     <pt x="527" y="450" on="1"/> 
     many more points 
    </contour> 
    ...some other xml 
</TTGlyph> 

한 행에 두 개 이상의 오프 커브 제어점을 볼 수 있습니다. 그러나 트루 타입 글꼴은 두 개의 온 커브 점 (끝점)과 하나의 오프 커브 점 (제어점)을 가진 이차원 베 지어로 만들어 졌음을 알게되었습니다. 연속적인 오프 커브 포인트를 어떻게 해석합니까?

+0

이들은 베 지어 곡선의 오프 커브 * 제어점 *입니다. [Wikipedia article] (http://en.wikipedia.org/wiki/B%C3%A9zier_curve)의 P1 및 P2 포인트. –

+4

안녕 한스. 답장을 보내 주셔서 감사합니다. 언급 한 P1 점과 P2 점은 입방체 베 지어입니다. 베 지어는 n-order 제어점을 가지고 있습니다. 특히 2 차 베 지어는 하나의 제어점 만 필요합니다. 왜 2 차 베 지어 (quadratic bezier)가 만든 TTF에 하나 이상의 제어점이 있습니까? – Moon

+0

@HansPassant, 상기 참조. – Moon

답변

15

TTF 구문 분석을 수행하려면 http://www.microsoft.com/typography/otspec/glyf.htm과 Microsoft 사이트의 TTF 형식에 대한 기술 문서를 적용해야합니다. 이것들은 커브에 두 가지 유형의 포인트가 있음을 알려줍니다 : 커브와 오프 커브 포인트. 곡선 위 점은 곡선이 통과하는 "실제"점이고, 오프 커브 점은 베 지어 곡률을 안내하는 제어 점입니다.

이제 "베 지어 곡선"으로 설명하는 것이 맞습니다. 단일 베 지어 곡선은 1 개의 실제 점에서 1 개의 제어점을 기준으로 1 개의 실제 점으로 이동합니다. 그러나 2 차 곡선은 일반적으로 원호를 근사 할 때 좋지 않기 때문에 설계 작업에서 쓰레기가 많지만 3 차 곡선보다 작업하기가 훨씬 저렴하므로 트루 타입 외곽선이있는 글꼴에 대해서는 2 차원 곡선이 붙어 있습니다. 이 문제를 해결하기 위해 TTF 개요는 일반적으로 괜찮은 모양의 균일 곡선을 얻기 위해 일련의 베 지어 곡선을 사용하며 이러한 시퀀스는 좋은 특성을 갖는 경향이 있습니다. 온 및 오프 커브 점은 매우 특정한 패턴으로 간격을 둡니다. 트릭 지금

P1 - C1 - P2 - C2 - P3 - C3 - P4 
1 - 0 - 1 - 0 - 1 - 0 - 1 

: 우리가 on 정보를 추가하는 경우

P1 - C1 - P2 - C2 - P3 - C3 - P4 

, 우리는 같은 TTF에서 인코딩 것 :

이 베 지어 순서를 고려 각 PN이 온 경우 -curve point이고, 각 Cn은 제어점이고 P2는 C1과 C2 사이의 정확히 중간에 있고, P3은 C2와 C3 사이에 있으며, 다음은 압축 가능한 곡선입니다. C1과 C2를 알면 P2를 알기 때문에 명시 적으로 나열 할 필요가 없습니다. w 글리프 윤곽을 파싱하는 모든 구문을 그대로 유지할 수 있습니다. 정밀도의 손실없이,

P1 - C1 - C2 - C3 - P4 
1 - 0 - 0 - 0 - 1 

상당한 공간을 절약 :

그래서 TTF는 다음과 같이 균일 한 곡선 긴 베 지어 순서를 인코딩합니다. TTX 덤프를 보면 각 점의 값이 on에 반영된 것을 볼 수 있습니다.등등 P2, P3를 얻으려면, 우리가하는 모든이입니다 :

foreach(array as point): 
    // do we have an implied on-curve point? 
    if(mask_for_point == 0 && mask_for_previous_point === 0): 
    missing_point = midpoint(point, previous_point) 
    points.push(missing_point) 
    // add the explicitly encoded point 
    points.push(point) 

이 절차를 실행 한 후, points 배열이 점 곡선과 오프 곡선을 교대로 한 것이며, 베지는

로 구성된다
for(i=0, i<arr.length, i+=2): 
    curve(array[i], array[i+1], array[i+2]) 

검색을 조금 후 편집, http://chanae.walon.org/pub/ttf/ttf_glyphs.htm 꽤 좋은 자세히 glyf 테이블 데이터로 작업하는 방법을 설명합니다 (아스키 그래픽 조금 바보지만, 아직 충분히 읽을 수 있습니다)

,536,913,632 몇 년 후 10

더 편집 나는 "그림 13"에 명시 https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html#necessary에 이상 TTF에 애플 문서에 그것을 실제로 (적어도 의미, 또는) 설명 문서를 찾을 관리한다 :

특히 커브의 접선의 중간 점에있는 온 커브 점은 추가 정보를 추가하지 않으며 생략되었을 수 있습니다. 또한 그림 2의 곡선을 지정할 수있을 것

:

더욱 편집는 ShreevatsaR은 사과 설명서의 그림 2와 3 사이에있는 텍스트도 관련이 있다고 지적 점 p2를 제거하여 점 하나를 더 작게합니다. 포인트 p2는 곡선의 존재를 의미하고 그 위치는 다른 포인트에 의해 주어진 데이터로부터 재구성 될 수 있기 때문에 곡선을 정의하는 데 엄격하게 필요하지 않습니다. 남은 점의 번호를 다시 매긴 후에 [그림 3]과 같다.

+1

와우! 귀하의 답변 주셔서 감사합니다! 개요가 어떻게 든 압축되었지만 정확히 어떻게 알지는 못했을 것입니다. 당신의 대답은 옳은 것 같습니다. 나는 당신의 방법을 사용하고 윤곽을 정확하게 해석했다. 이 트릭이 공식적으로 문서화 된 곳을 아십니까? TTF 사양에서이 것을 찾지 못했습니다 (사양이 매우 구체적이지는 않습니다). – Moon

+0

https://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html 또는 http://www.microsoft.com/typography/otspec/glyf.htm에서 트릭을 찾을 수 없습니다. – Moon

+0

흠, 필자가 TTF 구문 분석을 구현하는 데 사용한 문서가 기억 나지 않습니다.이 방법으로 돌아 왔을 때 유즈넷이나 opentype 메일 링리스트에서 설명했을 수도 있습니다. –

관련 문제