3장: 렌더링 모델

SVG 2 렌더링 모델은 합성 및 블렌딩 명세에서 정의된 규칙을 따릅니다.

결정: Seattle/Paris 2012 F2F day 3.

담당자: Nikos (Action 3332).

상태: 완료.

3.1. 소개

SVG의 구현은 본 장에서 설명된 렌더링 모델을 구현해야 하며, 적합성 요구사항 부록에서 수정된 부분에 따라 구현이 다를 수 있는 상황을 설명합니다. 실제로는 출력 장치의 제한(예: 제한된 색상만 지원하는 경우)과 정확한 수학적 모델을 구현하는 데 있어 현실적인 한계(예: 실제 성능을 위해 곡선을 직선으로 근사, 이 근사는 적합성 요구사항을 만족할 만큼 충분히 정확하면 됨)에 따라 변동이 허용됩니다.

적합성 요구사항 부록에서는 실제 구현이 이 설명에서 얼마나 벗어날 수 있는지 범위를 설명합니다. 실제 구현은 출력 장치의 제한(예: 제한된 색상만 지원하는 경우)이나 정확한 수학적 모델을 구현하는 데 있어 현실적인 한계(예: 실제 성능을 위해 곡선을 직선으로 근사, 이 근사는 적합성 요구사항을 만족할 만큼 충분히 정확하면 됨)로 인해 약간 벗어날 수 있습니다.

3.2. 렌더링 트리

SVG 문서의 최종 렌더링된 표현의 구성 요소는 문서 모델의 기본 요소와 일대일 관계를 가지지 않습니다. 그래픽의 외형은 대신 렌더링 트리라는 병렬 구조를 반영하며, 일부 요소는 제외되고 다른 요소는 반복됩니다.

SVG 네임스페이스의 많은 요소는 그래픽 문서의 구성 요소를 직접 나타내지 않습니다. 대신, 그래픽 효과, 메타데이터, 다른 요소를 나타내기 위한 콘텐츠, 혹은 특정 조건에서 표시될 대안을 정의합니다. 동적 문서에서는 그래픽의 특정 구성 요소가 상호작용이나 애니메이션에 따라 렌더링될 수도 있고 그렇지 않을 수도 있습니다. 이러한 렌더링되지 않는(non-rendered) 요소는 렌더링 트리에 직접 포함되지 않습니다.

SVG는 그래픽 하위 구성요소의 재사용을 지원하므로, 일부 요소는 여러 번 렌더링됩니다. 각각의 렌더링은 문맥에 따라 스타일링이 다를 수 있고 서로 다른 배율이나 변환으로 래스터화될 수 있습니다.

3.2.1. 정의

렌더링 트리

렌더링 트리는 SVG 문서 조각에서 렌더링되는 요소 집합입니다. 문서 트리에서 렌더링되지 않는 요소를 제외하고 재사용된 그래픽에 대해 추가 조각을 삽입해 생성됩니다. 그래픽은 렌더링 트리 순서에 따라 페인팅 및 합성되며, paint-order 속성에 따라 재정렬될 수 있습니다. 시각적으로 그릴 내용이 없는 요소도 렌더링 트리에 포함될 수 있다는 점에 유의하세요.

렌더링된 요소

현재 문서의 렌더링 트리에 직접 표현이 있는 요소. use-element shadow tree에서 요소의 렌더링된 인스턴스를 포함합니다. 재사용된 그래픽의 원본 정의로써 렌더링에 영향을 주지만 직접 렌더링되지 않는 요소는 포함되지 않습니다. 렌더링되는 요소와 렌더링되지 않는 요소 참고.

렌더링되지 않는 요소

현재 문서의 렌더링 트리에 직접 표현이 없는 요소. 그래도 재사용된 그래픽이나 그래픽 효과로써 렌더링 트리에 영향을 줄 수 있습니다. 렌더링되는 요소와 렌더링되지 않는 요소 참고.

재사용된 그래픽

렌더링 트리에 포함되지만 문서 모델에 직접적으로 단일 대응하는 요소가 없는 그래픽 구성 요소. shadow DOM 요소로 나타날 수 있으며 (use 요소로 그래픽을 재사용하는 경우처럼), 그래픽 효과의 일부로 생성된 이미지 조각(패턴이나 마스크 등)일 수도 있습니다.

절대 렌더링되지 않는 요소

문맥이나 display 스타일 값과 관계없이 절대 직접 렌더링되지 않는 요소 타입. 다음 요소들을 포함합니다: clipPath, defs, desc, linearGradient, marker, mask, metadata, pattern, radialGradient, script, style 그리고 title; 또한 인스턴스 루트가 아닌 symbol 요소도 포함합니다.

렌더링 가능한 요소

렌더링 트리에 그래픽, 컨테이너, 텍스트, 오디오, 또는 애니메이션으로 직접 표현될 수 있는 모든 요소 타입. 다음 요소들을 포함합니다: a, audio, canvas, circle, ellipse, foreignObject, g, iframe, image, line, path, polygon, polyline, rect, svg, switch, text, textPath, tspan, unknown, use 그리고 video; 또한 인스턴스 루트symbol 요소도 포함합니다.

렌더링 가능한 요소는 특정 문서나 시점에 렌더링될 수도 있고 안 될 수도 있습니다.

3.2.2. 렌더링되는 요소와 렌더링되지 않는 요소

어느 시점이든 모든 SVG 요소 (또는 요소 인스턴스, use-element shadow tree 내) 는 렌더링 또는 비렌더링 상태입니다. 요소가 현재 렌더링되는지 여부는 시각적 표시뿐만 아니라 상호작용 및 기하학적 계산에도 영향을 줍니다.

요소가 렌더링되지 않는다는 네 가지 경우는 다음과 같습니다:

렌더링되지 않는(non-rendered) 요소:

렌더링되지 않는 요소는 문서 접근성 트리에는 나타나지 않습니다. 그러나 문서 모델의 일부로 남아 있으며, 스타일 상속과 계단식에 참여합니다.

3.2.3. 가시성 제어: ‘display’ 및 ‘visibility’ 속성의 효과

SVG는 일반적으로 렌더링되는 요소의 가시적 표시를 토글하기 위해 두 가지 속성을 사용합니다: displayvisibility입니다. 정적 문서에서는 둘 다 비슷한 시각적 효과를 내지만, 개념적으로는 구별됩니다.

CSS 2.1 명세에서 displayvisibility 정의를 참고하세요. [CSS2]

displaynone으로 설정하면 해당 요소는 렌더링되지 않습니다. 그래픽 요소, 텍스트 콘텐츠 요소, 컨테이너 요소에 적용 시, displaynone으로 설정하면 해당 요소(및 모든 자손)는 렌더링 트리의 일부가 되지 않습니다. display는 상속 속성이 아니라는 점에 유의하세요.

display 값이 none이 아닌 경우는 정상적으로 렌더링됩니다.

display 속성은 렌더링 가능한 요소에만 적용됩니다. 절대 직접 렌더링되지 않는 요소나 조건부 처리로 렌더링되지 않는 요소에 display: none을 설정해도 아무 효과가 없습니다.

display 속성은 해당 요소의 직접 처리에만 영향을 주며, 다른 요소에서 참조하는 것은 막지 않습니다. 예를 들어, display: nonepath 요소에 지정하면 그 요소가 캔버스에 직접 렌더링되는 것은 막지만, path 요소는 textPath 요소에서 참조될 수 있고, 해당 기하 정보는 텍스트 경로(text-on-a-path) 처리에 사용됩니다.

그래픽 요소 또는 use 요소에 visibilityhidden 또는 collapse로 설정하면 해당 요소는 페인팅되지 않습니다. 하지만 렌더링 트리의 일부로 남아 있습니다. 포인터 이벤트에 민감할 수 있고 (pointer-events 값에 따라), 포커스를 받을 수 있으며 (tabindex 값에 따라), 바운딩 박스 계산 및 클리핑 경로에 기여하며, 텍스트 레이아웃에도 영향을 줍니다.

visibility 속성은 그래픽 요소, 텍스트 콘텐츠 요소, 그리고 a 요소가 텍스트 콘텐츠 요소의 자식일 때만 직접적으로 렌더링에 영향을 줍니다. visibility는 상속 속성이므로, use 요소나 컨테이너 요소 자체에는 효과가 없지만, 상속된 값이 자손 요소에 영향을 줄 수 있습니다.

3.2.4. 그래픽 재사용

문서의 한 부분(또는 다른 문서)에서 정의된 그래픽 콘텐츠는 다른 요소를 렌더링하는 데 사용할 수 있습니다. 렌더링 관점에서 그래픽 재사용은 두 가지 유형이 있습니다:

Shadow DOM 요소는 일반 요소와 동일하게 렌더링됩니다. 즉, 호스트 요소(예: use 요소)가 컨테이너이고 shadow 콘텐츠가 그 자손인 것처럼 취급됩니다. Shadow DOM 요소의 스타일 및 기하 속성은 원본 문서의 대응 요소와는 독립적으로 처리됩니다. display 속성은 shadow 요소에서 일반적으로 동작하지만, symbol 요소에는 예외 규칙이 적용됩니다.

블렌딩 관점에서 use 요소는 비고립 그룹을 형성합니다.

반면, 그래픽 효과 요소는 독립적인 SVG 조각을 생성하여 스태킹 컨텍스트고립 그룹으로 렌더링됩니다. 이 조각의 캔버스는 크기가 조정됩니다. 그래픽 효과 요소의 자식 콘텐츠는 이 캔버스에 렌더링 및 합성됩니다. 평탄화된(Flattened) 캔버스 전체는 다른 페인트 레이어와 합성/블렌딩할 때 벡터 이미지로 취급됩니다.

그래픽 효과 요소의 자식 콘텐츠에서 display 속성을 none으로 설정하면, 해당 서브트리가 렌더링에 사용되지 않습니다. 그러나 그래픽 효과 요소나 상위 요소에서 display: none 값을 지정해도 그래픽 효과 자체에는 영향을 주지 않습니다.

3.3. 페인터 모델

SVG는 "페인터 모델" 렌더링을 사용합니다. 페인트는 출력 장치에 연속적으로 적용되어 각 작업이 출력 장치의 일부 영역에 페인트를 칠하며, 이미 칠해진 페인트를 가릴 수 있습니다. 각 객체 또는 그룹이 페인팅된 후에는 다음 페인팅 작업의 배경이 됩니다. SVG 2는 각 페인팅 작업이 배경과 어떻게 상호작용할지 제어하는 고급 블렌딩 모드 및 합성 작업을 지원합니다. 이러한 페인팅 작업을 규정하는 규칙은 합성 및 블렌딩 명세에서 설명합니다.

3.4. 렌더링 순서

SVG의 요소들은 3차원으로 배치됩니다. SVG 뷰포트의 x, y 축 위치 외에도, SVG 요소들은 z축에도 배치됩니다. z축 위치가 그려지는 순서를 결정합니다.

z축을 따라 요소들은 스태킹 컨텍스트로 그룹화됩니다.

3.4.1. SVG에서 스태킹 컨텍스트 설정

SVG 요소의 자손에 대해 다음 중 하나에 해당하면 새로운 스태킹 컨텍스트를 설정해야 합니다:

스태킹 컨텍스트는 문서 렌더링 시 요소들이 서로 위에 쌓이는 순서와 포인터 이벤트의 타겟이 될 때 가장 위에 있는 요소를 결정하기 위해 사용되는 개념적 도구입니다. 스태킹 컨텍스트는 DOM 트리에서 요소의 위치에 영향을 주지 않으며, 스태킹 컨텍스트의 존재 여부가 요소의 위치, 크기, 방향에 영향을 주지 않습니다. 오직 페인팅 순서에만 영향을 줍니다.

스태킹 컨텍스트는 추가적인 스태킹 컨텍스트를 포함할 수 있습니다. 한 스태킹 컨텍스트는 부모 컨텍스트 관점에서 원자적이며, 조상 스태킹 컨텍스트의 요소가 그 사이에 끼어들 수 없습니다.

각 요소는 하나의 스태킹 컨텍스트에 속합니다. 스태킹 컨텍스트 내의 요소들은 문서 순서대로 쌓입니다.

foreignObject 요소를 제외하고, SVG 요소가 생성하는 스태킹 컨텍스트의 뒤에서 앞으로의 스태킹 순서는 다음과 같습니다:

  1. 스태킹 컨텍스트를 형성하는 요소의 배경과 테두리(있는 경우)
  2. 자손 요소들(트리 순서대로)

foreignObject 요소는 CSS 용어로 "고정 위치 포함 블록"을 생성하므로, 해당 요소가 생성한 스태킹 컨텍스트의 스태킹 순서에 대한 규범적 규칙은 CSS 2.1의 부록 E의 규칙을 따릅니다.

3.5. 요소의 렌더링 방법

개별 그래픽 요소비고립 그룹처럼 취급되며, 그래픽 요소를 구성하는 컴포넌트(채우기, 외곽선 등)는 (자세한 내용은 도형 및 텍스트 페인팅 참고) 해당 그룹의 구성원입니다. 그룹 렌더링 방법도 확인하세요.

3.6. 그룹의 렌더링 방법

g 요소(자세한 내용은 컨테이너 요소 참고)와 같은 그룹화 요소는 합성 그룹을 만듭니다. 마찬가지로 use 요소도 자신의 섀도우 콘텐츠에 대해 합성 그룹을 만듭니다. 합성 및 블렌딩 명세는 합성 그룹을 렌더링하는 방법을 규범적으로 설명합니다. SVG에서는 효과를 그룹에 적용할 수 있습니다. 예를 들어, 불투명도(opacity), 필터, 마스킹 등이 있습니다. 이러한 효과들은 그룹에 대한 변형(transform)이 적용되기 직전에 렌더링된 그룹 결과에 적용되며, 변형은 그룹이 그룹 배경과 블렌딩 및 합성되기 바로 전에 적용됩니다. 이러한 효과를 그룹에 적용하면 해당 그룹은 고립(isolated)됩니다.

따라서 합성 그룹의 렌더링은 다음과 같은 단계로 진행됩니다:
그룹이 고립된 경우:

  1. 초기 배경(initial backdrop)은 rgba(0,0,0,0)로 초기화된 새 버퍼로 설정됩니다
  2. 그룹 내 그래픽 요소 또는 g 요소의 콘텐츠를 순서대로 초기 배경에 렌더링합니다
  3. 필터 및 그룹 캔버스를 변경하는 기타 효과가 적용됩니다

    고품질 렌더링을 위해 필터 프리미티브와 기타 비트맵 효과는 작동 좌표 공간에서 적용해야 합니다.

  4. 그룹 변형이 적용됩니다
  5. 그룹 캔버스가 그룹 배경과 블렌딩 및 합성됩니다
그렇지 않은 경우(그룹이 고립되지 않음):
  1. 초기 배경그룹 배경으로 설정됩니다
  2. 그룹 내 그래픽 요소 또는 g 요소의 콘텐츠를 순서대로 초기 배경에 렌더링합니다. 이때 그룹 변형은 각 요소가 렌더링될 때 각각 적용됩니다.

3.6.1. 객체 및 그룹 불투명도: ‘opacity’ 속성의 효과

opacity’ 정의는 CSS Color Module Level 3에서 참고하세요. [css-color-3]

opacity 속성은 해당 그래픽 요소 또는 컨테이너 요소가 캔버스에 페인팅될 때 얼마나 불투명(opaque)한지 지정합니다. 컨테이너 요소에 적용될 때는 그룹 불투명도, 개별 렌더링 요소에 적용될 때는 객체 불투명도라 합니다. 두 연산 모두 원리는 동일합니다.

SVG에는 불투명도와 관련된 여러 속성이 더 있습니다:

이 네 가지 불투명도 속성은 중간 렌더링 연산에 관여합니다. 객체 및 그룹 불투명도는 후처리(post-processing) 연산으로 볼 수 있습니다. 개념적으로, opacity가 적용된 객체 또는 그룹은 RGBA 오프스크린 이미지로 렌더링됩니다. 오프스크린 이미지는 전체적으로 지정된 opacity 값으로 캔버스에 블렌딩됩니다. 따라서 opacity가 존재하면 그룹이 고립됩니다.

opacity 속성은 다음 SVG 요소에 적용됩니다: svg, g, symbol, marker, a, switch, use, unknown 그리고 그래픽 요소.

다음 예시는 객체와 그룹에 opacity 속성을 다양하게 사용하는 방법을 보여줍니다.

<svg xmlns="http://www.w3.org/2000/svg"
     width="600" height="175" viewBox="0 0 1200 350">

  <!-- Background blue rectangle -->
  <rect x="100" y="100" width="1000" height="150" fill="blue"/>

  <!-- Red circles going from opaque to nearly transparent -->
  <circle cx="200" cy="100" r="50" fill="red" opacity="1"/>
  <circle cx="400" cy="100" r="50" fill="red" opacity=".8"/>
  <circle cx="600" cy="100" r="50" fill="red" opacity=".6"/>
  <circle cx="800" cy="100" r="50" fill="red" opacity=".4"/>
  <circle cx="1000" cy="100" r="50" fill="red" opacity=".2"/>

  <!-- Opaque group, opaque circles -->
  <g opacity="1">
    <circle cx="182.5" cy="250" r="50" fill="red" opacity="1"/>
    <circle cx="217.5" cy="250" r="50" fill="green" opacity="1"/>
  </g>
  <!-- Group opacity: .5, opacity circles -->
  <g opacity=".5">
    <circle cx="382.5" cy="250" r="50" fill="red" opacity="1"/>
    <circle cx="417.5" cy="250" r="50" fill="green" opacity="1"/>
  </g>
  <!-- Opaque group, semi-transparent green over red -->
  <g opacity="1">
    <circle cx="582.5" cy="250" r="50" fill="red" opacity=".5"/>
    <circle cx="617.5" cy="250" r="50" fill="green" opacity=".5"/>
  </g>
  <!-- Opaque group, semi-transparent red over green -->
  <g opacity="1">
    <circle cx="817.5" cy="250" r="50" fill="green" opacity=".5"/>
    <circle cx="782.5" cy="250" r="50" fill="red" opacity=".5"/>
  </g>
  <!-- Group opacity .5, semi-transparent green over red -->
  <g opacity=".5">
    <circle cx="982.5" cy="250" r="50" fill="red" opacity=".5"/>
    <circle cx="1017.5" cy="250" r="50" fill="green" opacity=".5"/>
  </g>
</svg>
여러 그룹의 원이 배경에 블렌딩된 모습을 보여주는 이미지.

각각의 빨간색과 초록색 원 그룹은 먼저 오프스크린 이미지로 렌더링된 후, 전체적으로 배경 파란색 사각형과 지정된 opacity 값으로 블렌딩됩니다.

예시에서, 윗줄의 원들은 1.0에서 0.2까지 다양한 불투명도를 가집니다. 아랫줄은 다섯 개의 g 요소를 보여주며, 각각은 겹치는 빨간색과 초록색 원을 다음과 같이 포함합니다:

3.7. 그래픽 요소의 유형

SVG는 캔버스에 렌더링할 수 있는 세 가지 기본 그래픽 요소 유형을 지원합니다:

3.7.1. 도형 및 텍스트 페인팅

도형과 텍스트는 채우기(즉, 도형의 내부에 페인트 적용) 및 외곽선(stroke)(즉, 도형의 윤곽선에 페인트 적용) 할 수 있습니다.

특정 유형의 도형에서는 마커 기호(자체적으로 도형, 텍스트 및 이미지를 조합할 수 있음)를 도형 경계의 위치에 그릴 수 있습니다. 각각의 마커 기호는 그래픽 콘텐츠가 해당 도형 객체 바로 뒤에 SVG 문서 트리로 확장된 것처럼 페인트됩니다. 마커 기호의 그래픽 콘텐츠는 그래픽 요소와 동일한 방식으로 렌더링됩니다. 마커 기호는 텍스트에는 적용되지 않습니다.

채우기, 외곽선, 마커가 그려지는 순서는 paint-order 속성에 의해 결정됩니다. 기본값은 채우기가 먼저, 외곽선, 그리고 마커 기호 순입니다. 마커 기호는 도형의 윤곽선을 따라 도형 시작부터 끝까지 순서대로 렌더링됩니다.

채우기와 외곽선 연산은 완전히 독립적입니다. 예를 들어, 각 채우기 또는 외곽선 연산마다 자체 opacity 설정을 가질 수 있습니다.

SVG는 채우기 및 외곽선 연산에 사용할 수 있는 다양한 내장 페인트 유형을 지원합니다. 자세한 내용은 페인트 서버에서 설명합니다.

3.7.2. 래스터 이미지 페인팅

래스터 이미지를 렌더링할 때, 원본 샘플은 표준 알고리즘을 사용하여 출력 장치에 필요한 위치의 샘플로 "재샘플링"됩니다. 재샘플링 요구사항은 적합성 요구사항에서 설명합니다.

HTML [HTML, 10.4.2]과 마찬가지로, 동일한 절대 URL 및 동일한 이미지 데이터를 갖는 모든 애니메이션 이미지들은 그룹으로서 동일한 타임라인에 동기화되어 렌더링되는 것이 기대되며, 타임라인은 그룹에 가장 먼저 추가된 시점에서 시작합니다.

사용자 에이전트가 애니메이션 이미지를 보여주는 img 요소의 애니메이션을 다시 시작하려 할 때, 해당 img 요소의 노드 문서 내에서 동일한 절대 URL과 동일한 이미지 데이터를 가진 모든 애니메이션 이미지는 애니메이션을 처음부터 다시 시작해야 합니다.

3.8. 페인트 영역 필터링

SVG는 모든 페인팅 작업에 필터를 적용할 수 있습니다. (필터 효과 참고.)

이 경우 결과는 페인트 작업이 투명한 검정색으로 초기화된 중간 캔버스에 적용된 것처럼 되어야 하며, 캔버스의 크기는 필터 효과에서 정의된 규칙에 따라 결정되고, 그 후 필터 효과에서 정의된 처리로 필터링됩니다.

3.9. 클리핑 및 마스킹

SVG는 다음과 같은 클리핑/마스킹 기능을 지원합니다:

클리핑과 마스킹 모두 CSS Masking 모듈 [css-masking-1]에서 정의되어 있습니다.

3.10. 부모 합성

SVG 문서 조각은 반투명하게 만들 수 있습니다.

합성 및 블렌딩 명세에 따라, svg 요소는 항상 고립된 그룹을 만듭니다. SVG 문서가 최상위 문서(즉, 다른 문서에 임베드되지 않은 경우)일 때, 루트 svg 요소는 페이지 그룹으로 간주되며, 100% 불투명도의 흰색 배경과 합성됩니다. 그 외의 경우에는 SVG 문서 또는 문서 조각이 부모 문서에 불투명도를 유지하면서 합성됩니다.

3.11. ‘overflow’ 속성의 효과

overflow’ 정의는 Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) 명세 [CSS2] 참고.

overflow 속성의 SVG 내 동작 요약
element initial ua stylesheet auto visible hidden scroll
document root svg visible n/a visible | scroll visible hidden scroll
other svg visible hidden visible | scroll visible hidden scroll
text visible hidden visible visible hidden hidden
pattern visible hidden visible visible hidden hidden
marker visible hidden visible visible hidden hidden
symbol visible hidden visible visible hidden hidden
image visible hidden visible visible hidden hidden
iframe visible hidden visible | scroll visible hidden scroll
foreignObject visible hidden visible | scroll visible hidden scroll

overflow 속성은 동일한 파라미터 값을 가지며, CSS 2.1에서 정의된 것과 동일한 의미를 가집니다 ([CSS2], 섹션 11.1.1); 다만, 다음 추가 사항이 적용됩니다:

overflow의 초기값은 auto입니다. 사용자 에이전트 스타일 시트에서는, 독립 문서의 루트 요소가 아닌 svg 요소, pattern 요소, marker 요소의 overflow가 기본적으로 hidden으로 오버라이드됩니다.