사전 분석 인프라
Important
최신 인쇄 플랫폼은 Windows에서 프린터와 통신하는 데 선호되는 수단입니다. 프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하려면 MICROSOFT의 IPP 받은 편지함 클래스 드라이버와 PSA(인쇄 지원 앱)를 사용하는 것이 좋습니다.
자세한 내용은 최신 인쇄 플랫폼 및 인쇄 지원 앱 디자인 가이드를 참조하세요.
사전 분석 인프라는 각 페이지의 첫 번째 밴드 재생이 전체 페이지를 포함하는 밴드가 되도록 Unidrv가 인쇄 작업에서 밴딩을 강제하는 메커니즘입니다. 사전 분석 패스는 렌더링을 허용하지 않으며 개체가 렌더링되기 전에 페이지에서 개체를 분석할 수 있도록 하기 위해서만 수행됩니다.
전체 페이지 사전 분석을 허용하기 위해 Unidrv는 먼저 DrvEnableSurface 함수 내에서 전체 페이지 디바이스 화면을 지정한 다음 DrvQueryPerBandInfo를 통해 첫 번째 밴드가 전체 페이지의 크기임을 나타냅니다. 사전 분석이 완료되면 Unidrv는 DrvQueryPerBandInfo를 사용하여 사전 분석이 활성화되기 전에 클리핑 영역을 다시 크기로 복원합니다. 이후 Unidrv는 해당 화면으로 렌더링됩니다. GDI의 구현 제한으로 인해 N-up 모드가 ONE_UP 경우 또는 렌더링 밴드가 전체 페이지인 경우에만 사전 분석을 사용하도록 설정할 수 있습니다.
다음 의사 코드는 사전 분석에 사용되는 논리를 보여 줍니다.
DrvEnableSurface
if( preanalysis enabled )
Use dummy device surface
DrvStartDoc
For each physical page
{
DrvStartPage
DrvStartBanding
For each banding surface
{
DrvQueryPerBandInfo
// Set sizlBand member of PERBANDINFO
if( preanalysis_pass )
pbi.sizlBand = {whole page}
else
pbi.sizlBand = {normal band}
Carry out rendering operations
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass ) {
Call OEM hooks
DrvNextBand
}
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass )
Call OEMNextBand
if( preanalysis pass ) {
Disable preanalysis
Switch from dummy device surface to real device surface
}
if( last band )
Write end page character from GPD
} // for each banding surface
} // for each physical page
DrvEndDoc
사전 분석 기능은 현재 GPD(일반 프린터 설명) 파일 및 플러그 인에서 작동해야 하므로 텍스트 z 순서, 빈 대역 검색 및 기타 작업은 미니 드라이버의 관점에서 보이지 않게 구현됩니다. 미니 드라이버는 DrvStartBanding 및 DrvNextBand를 후크할 수 있지만 DrvNextBand에 대한 첫 번째 호출에는 렌더링이 포함되지 않으므로 DrvNextBand에 대한 첫 번째 호출이 수신되지 않습니다. 플러그 인은 OEM 개체 수준 사전 분석(*PreAnalysisOptions: 8)을 사용하도록 설정하는 GPD의 플래그를 설정하는 경우에만 첫 번째 DrvNextBand 호출을 받습니다. 이 경우 플러그 인은 DrvStartBanding 및 DrvNextBand를 후크해야 하며 플러그 인은 DrvStartBanding 함수의 pptl 매개 변수를 확인해야 합니다. pptl 매개 변수가 NULL이 아닌 경우 사전 분석이 비활성화됩니다. pptl 매개 변수가 NULL이면 사전 분석 패스의 시작을 나타냅니다. 이 경우 플러그 인은 플러그 인이 사전 분석 패스의 결과를 후크한 그리기 DDI에 대한 모든 호출을 가정해야 합니다. 사전 분석 패스는 DrvNextBand 함수에 대한 첫 번째 호출로 끝나고 렌더링 패스는 DrvNextBand 함수에 대한 첫 번째 호출 후에 시작됩니다. 이 함수에 대한 후속 호출에는 렌더링 데이터가 포함됩니다.
*PreAnalysisOptions 모드
사전 분석 모드는 *PreAnalysisOptions: n 특성 이름 및 특성 매개 변수에 의해 GPD 파일에서 제어됩니다. 다음 표에서는 *PreAnalysisOptions 특성 이름과 함께 사용할 수 있는 매개 변수 값을 나열합니다 . 이러한 값 중 두 개 이상을 결합하여 여러 옵션을 사용하도록 설정할 수 있습니다.
매개 변수 의미 값 0
모든 사전 분석 모드를 사용하지 않도록 설정합니다.
1
기본 모드입니다. 단색 z 순서 텍스트 분석 및 빈 대역 최적화를 사용하도록 설정합니다. 이 모드는 다운로드 가능한 글꼴 또는 디바이스 글꼴 지원 및 고해상도(600dpi 이상), 24개의 BPP 렌더링 모드를 사용하는 디바이스에 사용할 수 있습니다.
2
24개의 BPP IPrintOemUni ImageProcessing 콜백에 대해 1 BPP 최적화를 사용하도록 설정합니다.
4
디바이스 StretchBlt 작업을 사용하도록 설정합니다.
8
OEM 개체 수준 사전 분석 사용
빈 대역 최적화를 사용하는 단색 Z 순서 텍스트 분석
*PreAnalysisOptions: 1
*PreAnalysisOptions 매개 변수를 1로 설정하면 Unidrv에서 다음 작업을 수행할 수 있습니다.
단색 프린터에서 텍스트와 그래픽 개체 간의 z 순서로 문제를 검색합니다.
빈 대역 최적화를 수행합니다.
첫 번째 작업은 흑백 프린터로 다운로드된 텍스트를 나중에 덮어쓰거나 그래픽 개체와 상호 작용할 때 발생하는 z 순서 문제를 처리합니다. Z 순서 문제는 Unidrv가 이전에 다운로드한 텍스트를 지우는 흰색 사각형을 다운로드할 수 없도록 복잡한 클립을 포함하는 그래픽 개체로 인해 발생하는 경우가 많습니다.
Unidrv는 렌더링 패스를 수행하기 전에 각 페이지에서 사전 분석 패스를 수행합니다. Unidrv는 이 작업을 수행하여 시뮬레이션할 수 없는 복잡한 클립을 사용하는 Blt(비트 블록 전송) 개체로 텍스트를 오버레이할지 여부를 결정합니다. 따라서 나중에 렌더링된 개체가 텍스트와 올바르게 상호 작용할 수 있도록 텍스트를 직접 다운로드하는 대신 표면 비트맵에 렌더링됩니다.
또한 흰색 사각형을 지원하지 않는 디바이스의 경우 Unidrv는 복잡한 클립이 없는 경우에도 Blt로 오버레이된 텍스트를 확인합니다. Unidrv는 텍스트를 프린터로 직접 다운로드하는 대신 표면에 렌더링합니다.
다음 그리기 명령은 후속 Blt에 의해 오버레이될 수 있는 텍스트에 대해 테스트됩니다.
따라서 이 모드는 텍스트와 채워진 영역 개체 간의 모든 z 순서 문제를 수정해야 합니다. 텍스트 및 겹쳐진 줄에는 여전히 문제가 있을 수 있습니다. 이러한 솔루션으로 인해 그리는 대신 거의 모든 텍스트가 다운로드될 수 있으므로 이러한 상황은 포함되지 않습니다.
이 기능은 디바이스 글꼴 사용과 관련된 z 순서 문제를 수정하지 않습니다. 애플리케이션 또는 드라이버가 디바이스 글꼴 모드를 선택한 경우 드라이버는 이 문제를 해결할 수 없으며 디바이스 글꼴을 화면에 렌더링할 수 없습니다.
두 번째 작업을 통해 Unidrv는 페이지의 빈 지역에 대해 최적화할 수 있습니다. 이 모드에서 Unidrv는 빈 위쪽 및 아래쪽 여백과 페이지 중간에 있는 큰 빈 영역을 건너뜁니다. 색 인쇄에 사용하기 위한 이 모드는 페이지를 렌더링하는 데 필요한 밴드 패스 수를 최소화하여 성능을 향상시킵니다.
사전 분석 패스 중에 Unidrv는 페이지에서 드로잉이 발생할 위치를 결정합니다. 사전 분석이 사용되거나 프린터가 고해상도(600dpi 이상)에서 24개의 BPP 렌더링 밴드를 사용하는 경우 빈 대역 최적화가 활성화됩니다. 이로 인해 잉크 제트 프린터에 대한 24개의 BPP 렌더링에서 눈에 띄는 성능이 향상되며 기존 OEM 플러그 인을 변경할 필요가 없습니다.
검정색 대역 최적화
*PreAnalysisOptions: 2 *% 1 bpp ImageProcessing bitmaps
*PreAnalysisOptions 매개 변수를 2로 설정하면 Unidrv가 BPP 24에서 전체 페이지를 렌더링하는 대신 더 큰 1 BPP 밴딩 표면을 사용하여 단색 검정 개체만 포함된 영역을 렌더링할 수 있습니다. 이 모드는 빈 대역 최적화와 유사하며, 단색 영역(색 영역과 반대)도 페이지에서 결정한다는 점을 제외합니다. 24 BPP 색에 대해 설정된 하프톤이 1 BPP 단색으로 올바르게 렌더링되지 않으므로 단색 검정(회색 음영 없음)인 개체만 1 BPP 밴딩 화면에서 렌더링할 수 있습니다.
Unidrv는 DrvEnableSurface 함수 내에 두 개의 표면을 만듭니다. 하나는 색이고 다른 하나는 BPP 모노크롬 1개입니다. Unidrv는 각각에 대해 동일한 메모리를 사용하므로 추가 메모리가 필요하지 않습니다. 페이지 사전 분석에서는 페이지에 색이 포함된 영역보다 더 큰 밴드를 사용할 수 있는 검은색 또는 빈 영역이 있는지 여부를 결정합니다. 색 영역만 더 작은 색 밴드 표면을 사용해야 합니다.
동일한 양의 메모리를 사용하여 1 BPP 단색 표면은 24 BPP 색 표면의 24배에 달할 수 있습니다. 따라서 페이지 중간에만 색이 포함된 이미지는 위쪽 영역, 색이 포함된 영역 및 아래쪽 영역의 세 가지 영역으로 나눌 수 있습니다. 이러한 세 영역은 다음과 같이 묶을 수 있습니다. 상위 영역은 단일 단색 밴드에 배치할 수 있고, 색이 포함된 영역은 이를 커버하는 데 필요한 만큼의 색상 밴드로 나눌 수 있으며, 아래쪽 영역은 단일 단색 밴드에 배치할 수 있습니다.
이 기능을 사용하려면 OEM이 IPrintOemUni ImageProcessing 콜백을 지원하고 래스터 데이터의 덤프를 처리해야 합니다. 24개의 BPP 밴드 또는 1개의 BPP 솔리드 블랙 밴드를 허용하려면 IPrintOemUni ImageProcessing 콜백에 대한 현재 OEM 플러그 인 지원이 향상되어야 합니다.
Device StretchBlt 작업 지원
*PreAnalysisOptions: 4
*PreAnalysisOptions 매개 변수를 4로 설정하면 Unidrv에서 Stretchblt 작업을 지원하는 디바이스에 DrvStretchBlt 호출을 직접 다운로드할 수 있습니다.
Unidrv가 24개의 BPP 색 데이터를 생성하면 모든 스트레치블 이미지가 디바이스 해상도로 확장되어 대량의 래스터 데이터를 다운로드해야 합니다. 이로 인해 많은 동아시아 프린터의 메모리 부족 조건 외에도 성능이 저하될 수 있습니다.
미니 드라이버 렌더링 플러그 인은 OEMStretchBlt를 후크 하고 자체 이미지 다운로드 명령을 제공해야 하므로 스트레치블 모드 를 활용해야 합니다. Unidrv는 직접 다운로드할 수 있는 호출에서만 OEMStretchBlt 후크를 허용합니다. 따라서 플러그 인은 z-order 문제를 처리할 책임이 없습니다. 플러그 인은 수신하는 OEMStretchBlt 호출에 포함된 원본 이미지 데이터를 직접 다운로드하기만 하면 됩니다. 플러그 인에는 이미지가 플러그 인에서 지원하지 않거나 다운로드할 수 없는 형식인 경우 이미지를 Unidrv로 다시 펀칭하는 옵션도 있습니다.
다른 데이터가 시스템에서 렌더링되는 동안 개체가 디바이스에 직접 다운로드될 때마다 z-order 문제 또는 하프톤 불일치가 있을 수 있습니다. 이 모드는 사전 분석 기능을 사용하여 직접 다운로드할 수 있는 스트레치블을 결정합니다. 마스크나 복잡한 클리핑이 없는 스트레치블렛만 직접 다운로드할 수 있습니다. 이후 개체가 직접 다운로드를 위해 고려되는 스트레치블렛을 오버레이하는 경우 개체가 직접 다운로드되지 않습니다. 이 원칙은 성능을 향상해야 하며, 이미지에 시스템 및 디바이스의 하프톤이 포함되어 있지 않은지 확인해야 하므로 품질이 저하되는 인쇄 출력이 발생합니다.
OEM 개체 수준 사전 분석 후크
*PreAnalysisOptions: 8
*PreAnalysisOptions 매개 변수를 8로 설정하면 OEM은 대역 크기에 관계없이 DrvStartBanding 호출 후에 전체 페이지의 모든 개체가 재생되도록 사전 분석 패스를 시작할 수 있습니다. 사전 분석 패스 중에는 Unidrv 내에서 그리기가 허용되지 않지만 OEM은 모든 DrvXxx 그리기 호출을 후크하여 페이지의 개체를 분석할 수 있습니다.
OEM에서 개체 기반 색 보정 또는 렌더링을 사용할 수 있도록 이 모드의 기능은 잉크 제트 프린터 색에 중점을 둡니다. 예를 들어 특정 프린터는 색 개체와 교차하는 경우 검은색 개체를 다르게 처리해야 하며, 그 자체로 나타나는 검은색 개체와는 반대로 처리해야 합니다. 다른 OEM은 비트블렛 개체와 다른 stretchblt 개체에 대해 하프톤을 원할 수 있습니다. Stretchblt 개체는 .png 또는 .jpg 같이 Windows에서 지원하는 그래픽 파일 형식일 수 있습니다. 비트블렛 개체는 단독으로 비트맵입니다.
GPD에서 이 모드를 사용하도록 설정하면 Unidrv는 표면을 밴딩 표면으로 정의하지만 첫 번째 재생은 전체 페이지가 됩니다. 이를 위해 Unidrv는 GDI 클립 창을 전체 페이지로 설정합니다. Unidrv를 사용하면 모든 그리기 명령을 후크할 수 있지만 그리기를 수행하기 전에 반환됩니다. 다음 패스에서 Unidrv는 클립 창을 평소와 같이 일반 밴드 크기와 밴드로 다시 설정합니다.
OEM은 GPD에서 이 모드를 사용하도록 설정한 경우 DrvStartBanding과 DrvNextBand를 모두 후크해야 합니다. DrvStartBanding 함수의 pptl 매개 변수를 테스트하여 Unidrv가 지정된 페이지에서 이 모드에서 사전 분석 기능을 사용하도록 설정할 수 있는지 여부를 확인해야 합니다. pptl 매개 변수가 NULL인 경우 Unidrv는 사전 분석 기능을 사용하도록 설정했습니다. Unidrv는 이 시점에서 의미가 없기 때문에 pptl 매개 변수를 사용합니다(밴드 위치로 업데이트되지 않았습니다.) 사전 분석의 경우 밴드 위치는 항상 (0, 0)으로 설정됩니다. pptl 매개 변수가 NULL인 경우 OEM은 첫 번째 DrvNextBand 이전의 모든 그리기 호출을 사전 분석의 일부로 간주해야 하며 표면에 그리기를 허용해야 합니다.
사전 분석의 끝은 OEMNextBand 함수를 호출하여 신호를 받습니다. OEMNextBand에 전달되는 pptl 매개 변수는 NULL이 아닙니다. 이 호출은 적절한 pptl 값을 Unidrv로 반환하는 데만 사용됩니다. 플러그 인은 pptl 값 자체를 설정하거나 Unidrv로 다시 호출할 수 있습니다(이 문서의 시작 부분에 있는 이전 의사 코드 예제처럼). OEMNextBand에 대한 첫 번째 호출에서 지정한 OEMNextBand의 pso 매개 변수가 아직 렌더링되지 않았기 때문에 플러그 인은 해당 콘텐츠를 디바이스로 보내면 안 됩니다.