본문 바로가기

iOS개발팁

쿼츠2D 튜토리얼...1


개요


  • 쿼츠2D는 아이폰과 맥OS X 환경에서 접근 가능한 2차원 드로잉 엔진
  • 패스 기반 드로잉, 투명하게 그리기, 쉐이딩, 그림자 그리기, 레이어 투명하게 그리기, 색상   관리, 안티앨리어싱 렌더링, PDF 생성 및 PDF 메타데이터 접근 가능
  • 그래픽스 하드웨어의 성능 사용이 가능하다면 활용.
  • 아 이폰에서는 쿼츠2D와 함께 Core Graphics, Core Animation, OpenGL ES 만 사용 가능.


페이지 개념

  • 쿼츠2D는 페인터 모델을 바탕으로 그림을 그린다.
  • 드 로잉 연산은 레이어에 적용되고 결과는 페이지라 불리는 캔바스로 출력된다.
  • 페이지의 종류는 프린터의 실제 종이 일수도 있고 PDF파일 같은 가상 종이 일 수도 있고 비트맵 이미지 일 수도 있다. 페이지의 종류는 사용자가 사용하는 그래픽스 컨텍스트에 따라 결정된다.
  • 그래픽스 컨텍스트 : 드로잉의 목적지
  • 그래픽스 컨텍스트는 데이터 타입 CGContextRef으로 쿼츠가 이지지를 출력 장치에 그릴 때 필요한 정보를 담고 있다. 
  • 그래픽스 컨텍스트는 그래픽스 드로잉 옵션과 장치별 표현 방법 정보를 담고 있다.
  • 그래픽스 컨텍스트를 통해서 쿼츠의 모든 객체를 그릴 수 있거나 얻을 수 있다.
  • 그래픽스 컨텍스트를 드로잉의 목적지로 생각하면 기억하기 쉽다.

그래픽스 컨텍스트의 종류

  • 비트맵 그래픽스 컨텍스트 : 비트맵에 RGB, CMYK 또는 회색조로 그림을 그린다. 비트맵은 픽셀의 2차원 배열이고 각 픽셀은 이미지의 한 점을 표현한다. 비트맵 이미지를 샘플링된 이미지라고 말하기도 한다.
  • PDF 그래픽스 컨텍스트 : PDF를 생성할 수 있고 PDF 내에 그림을 그릴 수 있다.
  • 윈도우 그래픽스 컨텍스트 : 윈도우에 드로잉할 때 사용하는 그래픽스 컨텍스트이다. 
  • 레이어 그래픽스 컨텍스트 : 레이어 그래픽스 컨텍스트는 성능 최적화를 위해 설계되었고 오프스크린 드로잉 목적지로 사용된다. 오프스크린 드로잉을 구현할 때 비트맵 그래픽스 컨텍스트를 사용하는 것보다 레이어 그래픽스 컨텍스트를 사용하는 것이 더 좋다.

쿼츠2D 의 데이터 타입

  • 쿼 츠2D가 코어 그래픽스 프레임워크의 일부이기 때문에 쿼츠2D의 데이터타입은 모두 CG로 시작한다.
  • 쿼츠2D는 특정한 드로잉 결과를 얻기 위해서 데이터 타입으로 객체를 만들고 그 객체에 원하는 연산을 수행한다.
  • 예1) PDF 페이지 객체를 생성하고 PDF 그래픽스 컨텍스트에 회전 연산을 적용한 후 쿼츠2D에 페이지 드로잉을 요청하면 회전된 PDF 페이지를 볼 수 있다.
  • 예2) 특정 패턴을 담고 있는 패턴 객체를 생성한 후 그래픽스 컨텍스트가 패턴 객체를 사용하도록 설정하면 패턴이 적용되어 그림이 그려진다.
  • 예3) 쉐이딩 객체를 생성한 후 쿼츠2D에게 채움 색상으로 쉐이딩 객체를 사용하도록 하면 한 방향의 또는 원형으로 적용된 쉐이딩을 채움을 얻을 수 있다.

쿼츠2D 의 데이터 타입 목록

  • CGPathRef : 벡터 그래픽스에서 색을 채우거나 선을 긋기 위해 필요한 경로(Path) 생성에 사용된다.
  • CGImageRef : 비트앱 이미지를 표현하는데 사용된다.
  • CGLayerRef : 드로잉 레이어를 표현하는데 사용된다. 레이어는 반복 그리기(배경이나 패턴과 같은) 또는 오프스크린 드로잉에 사용된다.
  • CGPatternRef : 반복 그리기에 사용된다.
  • CGShadingRef 와 CGGradientRef : 쉐이딩과 그래디언트 드로잉에 사용된다
  • CGFunctionRef : 콜백함수를 정의하는데 사용된다. 콜백함수는 임의 갯수의 float  인자를 받는다.
  • CGColorRef , CGColorSpaceRef : 쿼츠가 색상을 어떻게 해석할 것이가의 정보를 제공한다. 
  • CGPSConverterRef : 포스트스크립트를 PDF 로 변경할 때 사용하며 아이폰에서는 사용할 수 없다.
  • CGDataConsumerRef, CGDataProviderRef : 데이터를 쿼츠로 옮기거나 쿼츠의 데이터를 밖으로 꺼낼 때 사용한다.
  • CGFontRef : 문자를 그릴 때 사용한다.
  • CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, CGPDFArrayRef  : PDF 메타데이터에 접근할 때 사용한다. 
  • CGPDFScannerRef, CGPDFContentStreamRef  : PDF 메타데이터를 분석(파싱)할 때 사용한다.

그래픽스 상태

  • 쿼 츠는 현재 그래픽스 상태를 바탕으로 드로잉을 한다. 그래픽스 상태는 여러 파라미터를 설정하여 변경된다.  너비, 현재 위치, 폰트 크기 등은 자주 사용하는 파라미터이다.
  • 그래픽스 컨텍스트는 그래픽스 상태의 스택을 가지고 있다. 쿼츠가 그래픽스 컨텍스트를 생성하면 스택은 비어 있다. 그래픽스 상태를 저장하면 쿼츠는 현재 그래픽스 상태를 스택에 집어 넣는다. 그래픽스 상태를 복귀하면 쿼츠는 스택에서 그래픽스 상태를 꺼내와 해당 상태가 현재 그래픽스 상태가 된다.
  • CGContextSaveGState 로 현재 상태를 저장하고 CGContextRestoreGState로 복귀한다.
  • 주의할 것은 현재 드로잉 환경의 모든 면들이 그래픽스 상태의 요소가 되는 것은 아니다. 예를 들어 현재 경로(path) 는 그래픽스 상태가 아니다. 따라서 CGContextSaveGState 를 해도 경로는 저장되지 않는다

그래 픽스 상태의 파라미터 목록

  • 현재 변환 행렬(CTM)
  • 클리핑 영역
  • 선분 : width, join, cap, dash, miter, limit
  • 곡선의 정확도
  • 안티앨리어싱
  • 색 상 : fill, stroke 설정
  • 알파값(투명도)
  • 렌더링 인텐트(?)
  • 색상 공간
  • 텍 스트 : font, font size, character spacing, text drawing mode
  • 블렌드(혼 합) 모드

쿼츠2D 좌표계

  • 쿼츠는 장치와 독립된 좌표계를 사용한다.
  • 현재 변환 행렬(CTM)을 사용하여 사용자 좌표계를 장치좌표계로 변환한다.
  • CTM 은 아핀 변환을 수행하는 행렬이다.
  • 이동, 회전, 확대/축소을 적용하여 한 좌표계에서 다른 좌표꼐로 점을 맵핑한다.
  • CTM 을 사용하면 좌표계매핑 외에도 드로잉 객체에 회전, 이동, 확대/축소를 적용할 수 있다.