1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_ge.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <windows.h>
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_ge_win32.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "win32_int.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_freetype.h"
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../ge/text_int.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../dib/dib_int.h"
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SIZETHRESHOLD 1000
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OUTPUTPSLEN 4096
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bSupportROP = TRUE;
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CGdiPrinterDriver::GetDeviceCaps(int caps_id)
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (caps_id == FXDC_HORZ_SIZE) {
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_HorzSize;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (caps_id == FXDC_VERT_SIZE) {
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_VertSize;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CGdiDeviceDriver::GetDeviceCaps(caps_id);
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     int alpha_flag, void* pIccTransform)
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSource->IsAlphaMask()) {
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(blend_type == FXDIB_BLEND_NORMAL);
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSource->HasAlpha()) {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBExtractor temp(pSource);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBitmap* pBitmap = temp;
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pBitmap == NULL) {
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int alpha_flag, void* pIccTransform, int blend_type)
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSource->IsAlphaMask()) {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dest_width < 0 || dest_height < 0) {
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFlipped == NULL) {
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dest_width < 0) {
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_left += dest_width;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dest_height < 0) {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_top += dest_height;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pFlipped;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ret;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBExtractor temp(pSource);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBitmap* pBitmap = temp;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pBitmap == NULL) {
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ASSERT(pSource != NULL);
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSource->HasAlpha()) {
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dest_width < 0 || dest_height < 0) {
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFlipped == NULL) {
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dest_width < 0) {
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_left += dest_width;
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dest_height < 0) {
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_top += dest_height;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pFlipped;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ret;
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBExtractor temp(pSource);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBitmap* pBitmap = temp;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pBitmap == NULL) {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT full_rect = unit_rect.GetOutterRect();
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int full_left = full_rect.left;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int full_top = full_rect.top;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBExtractor src_bitmap(pSrc);
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBitmap* pSrcBitmap = src_bitmap;
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSrcBitmap == NULL) {
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD src_pitch = pSrcBitmap->GetPitch();
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT dest_area = pDestMatrix->GetUnitArea();
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT size_scale = FXSYS_sqrt(area_scale);
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix adjusted_matrix(*pDestMatrix);
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    adjusted_matrix.Scale(size_scale, size_scale);
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT result_rect = result_rect_f.GetOutterRect();
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix src2result;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.e = adjusted_matrix.c + adjusted_matrix.e;
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.f = adjusted_matrix.d + adjusted_matrix.f;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    src2result.TranslateI(-result_rect.left, -result_rect.top);
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix result2src;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    result2src.SetReverse(src2result);
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FixedMatrix result2src_fix(result2src, 8);
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int result_width = result_rect.Width();
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int result_height = result_rect.Height();
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pTempBitmap) {
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSrcBitmap != src_bitmap) {
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pSrcBitmap;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pTempBitmap;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSrcBitmap != src_bitmap) {
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pSrcBitmap;
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pTempBitmap->CopyPalette(pSrc->GetPalette());
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int dest_pitch = pTempBitmap->GetPitch();
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSrcBitmap->IsAlphaMask()) {
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int dest_y = 0; dest_y < result_height; dest_y ++) {
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int dest_x = 0; dest_x < result_width; dest_x ++) {
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                int src_x, src_y;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int dest_y = 0; dest_y < result_height; dest_y ++) {
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int dest_x = 0; dest_x < result_width; dest_x ++) {
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                int src_x, src_y;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSrcBitmap != src_bitmap) {
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pSrcBitmap;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pTempBitmap;
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       int alpha_flag, void* pIccTransform, int blend_type)
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect unit_rect = pMatrix->GetUnitRect();
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT full_rect = unit_rect.GetOutterRect();
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFlipX = pMatrix->a < 0;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFlipY = pMatrix->d > 0;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             alpha_flag, pIccTransform, blend_type);
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pTransformed == NULL) {
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    alpha_flag, pIccTransform, blend_type);
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pTransformed;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ret;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSource->GetBPP() == 1) {
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pIccTransform == NULL) {
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SaveState();
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PathData path;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        path.AppendRect(0, 0, 1.0f, 1.0f);
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetClip_PathFill(&path, pMatrix, WINDING);
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    alpha_flag, pIccTransform, blend_type);
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RestoreState();
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pTransformed;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        handle = NULL;
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ret;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPSOutput::CPSOutput(HDC hDC)
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_hDC = hDC;
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pBuf = NULL;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPSOutput::~CPSOutput()
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pBuf) {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pBuf);
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPSOutput::Init()
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pBuf = FX_Alloc(FX_CHAR, 1026);
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPSOutput::OutputPS(FX_LPCSTR string, int len)
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (len < 0) {
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        len = (int)FXSYS_strlen(string);
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int sent_len = 0;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (len > 0) {
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int send_len = len > 1024 ? 1024 : len;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *(FX_WORD*)m_pBuf = send_len;
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        sent_len += send_len;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        len -= send_len;
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPSPrinterDriver::CPSPrinterDriver()
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPSOutput = NULL;
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bCmykOutput = FALSE;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPSPrinterDriver::~CPSPrinterDriver()
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EndRendering();
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pPSOutput) {
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pPSOutput;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_hDC = hDC;
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPSOutput = FX_NEW CPSOutput(hDC);
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pPSOutput) {
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ((CPSOutput*)m_pPSOutput)->Init();
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bCmykOutput = bCmykOutput;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int ret = ::GetClipRgn(hDC, hRgn);
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (ret == 1) {
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ret = ::GetRegionData(hRgn, 0, NULL);
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ret) {
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!pData) {
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ret = ::GetRegionData(hRgn, ret, pData);
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ret) {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_PathData path;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                path.AllocPointCount(pData->rdh.nCount * 5);
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(pData);
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ::DeleteObject(hRgn);
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPSPrinterDriver::GetDeviceCaps(int caps_id)
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (caps_id) {
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_DEVICE_CLASS:
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FXDC_PRINTER;
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_PIXEL_WIDTH:
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_Width;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_PIXEL_HEIGHT:
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_Height;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_BITS_PIXEL:
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_nBitsPerPixel;
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_RENDER_CAPS:
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_HORZ_SIZE:
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_HorzSize;
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case FXDC_VERT_SIZE:
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_VertSize;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPSPrinterDriver::StartRendering()
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.StartRendering();
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPSPrinterDriver::EndRendering()
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.EndRendering();
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPSPrinterDriver::SaveState()
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.SaveState();
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.RestoreState(bKeepSaved);
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int fill_mode)
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        const CFX_AffineMatrix* pObject2Device,
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        const CFX_GraphStateData* pGraphState)
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   const CFX_AffineMatrix* pObject2Device,
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (blend_type != FXDIB_BLEND_NORMAL) {
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *pRect = m_PSRenderer.GetClipBox();
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    int alpha_flag, void* pIccTransform)
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (blend_type != FXDIB_BLEND_NORMAL) {
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        int alpha_flag, void* pIccTransform, int blend_type)
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (blend_type != FXDIB_BLEND_NORMAL) {
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      int alpha_flag, void* pIccTransform, int blend_type)
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (blend_type != FXDIB_BLEND_NORMAL) {
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bitmap_alpha < 255) {
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    handle = NULL;
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int alpha_flag, void* pIccTransform)
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
427