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 "../../../include/fxge/fx_ge_win32.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <crtdbg.h> 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../agg/include/fxfx_agg_clip_liang_barsky.h" 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "dwrite_int.h" 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "win32_int.h" 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../ge/text_int.h" 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../dib/dib_int.h" 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../agg/include/fx_agg_driver.h" 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_freetype.h" 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxcodec/fx_codec.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CWin32FontInfo : public IFX_SystemFontInfo 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32FontInfo(); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CWin32FontInfo(); 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void Release(); 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper); 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact); 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void* GetFont(FX_LPCSTR face) 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size); 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void DeleteFont(void* hFont); 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual FX_BOOL GetFontCharset(void* hFont, int& charset); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf); 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf); 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType); 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void GetGBPreference(CFX_ByteString& face, int weight, int picth_family); 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString FindFont(const CFX_ByteString& name); 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HDC m_hDC; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FontMapper* m_pMapper; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString m_LastFamily; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString m_KaiTi, m_FangSong; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCWin32FontInfo::CWin32FontInfo() 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_hDC = CreateCompatibleDC(NULL); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCWin32FontInfo::~CWin32FontInfo() 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMapper = NULL; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CWin32FontInfo::Release() 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteDC(m_hDC); 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete this; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4) 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf) 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = CreateFontIndirectA(plf); 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = FALSE; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD lVersion = 0; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD)); 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 | 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24)); 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == 0x00010000 || 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == 0x00020000) { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = TRUE; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteFont(hFont); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = CreateFontIndirectA(plf); 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = FALSE; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD lVersion = 0; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD)); 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 | 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24)); 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == 0x00010000 || 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lVersion == 0x00020000) { 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = TRUE; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) || 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = TRUE; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteFont(hFont); 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType) 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString name(plf->lfFaceName, -1); 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (name[0] == '@') { 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (name == m_LastFamily) { 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMapper->AddInstalledFont(name, plf->lfCharSet); 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) { 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(FontType & TRUETYPE_FONTTYPE)) { 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!IsSupportFontFormDiv(plf)) { 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMapper->AddInstalledFont(name, plf->lfCharSet); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastFamily = name; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int CALLBACK FontEnumProc( 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const LOGFONTA *plf, 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const TEXTMETRICA *lpntme, 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD FontType, 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LPARAM lParam 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov) 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFontInfo->m_pMapper->GetFontEnumerator()) { 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontInfo->m_pMapper->GetFontEnumerator()->HitFont(); 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontInfo->AddInstalledFont(plf, FontType); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper) 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pMapper = pMapper; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(&lf, 0, sizeof(LOGFONTA)); 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lf.lfCharSet = DEFAULT_CHARSET; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lf.lfFaceName[0] = 0; 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lf.lfPitchAndFamily = 0; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0); 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMapper->GetFontEnumerator()) { 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMapper->GetFontEnumerator()->Finish(); 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const struct { 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pFaceName; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pVariantName; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovVariantNames[] = { 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"}, 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const struct { 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pName; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pWinName; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bBold; 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bItalic; 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovBase14Substs[] = { 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Courier", "Courier New", FALSE, FALSE}, 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Courier-Bold", "Courier New", TRUE, FALSE}, 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Courier-BoldOblique", "Courier New", TRUE, TRUE}, 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Courier-Oblique", "Courier New", FALSE, TRUE}, 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Helvetica", "Arial", FALSE, FALSE}, 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Helvetica-Bold", "Arial", TRUE, FALSE}, 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Helvetica-BoldOblique", "Arial", TRUE, TRUE}, 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Helvetica-Oblique", "Arial", FALSE, TRUE}, 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Times-Roman", "Times New Roman", FALSE, FALSE}, 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Times-Bold", "Times New Roman", TRUE, FALSE}, 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Times-BoldItalic", "Times New Roman", TRUE, TRUE}, 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"Times-Italic", "Times New Roman", FALSE, TRUE}, 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pMapper == NULL) { 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return name; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nFonts = m_pMapper->m_InstalledTTFonts.GetSize(); 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nFonts; i ++) { 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i]; 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (thisname[0] == ' ') { 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (thisname.Mid(1, name.GetLength()) == name) { 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pMapper->m_InstalledTTFonts[i + 1]; 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (thisname.Left(name.GetLength()) == name) { 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pMapper->m_InstalledTTFonts[i]; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct _FontNameMap { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pSubFontName; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_pSrcFontName; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst _FontNameMap g_JpFontNameMap[] = { 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"MS Mincho", "Heiseimin-W3"}, 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {"MS Gothic", "Jun101-Light"}, 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst _FontNameMap g_GbFontNameMap[1]; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" { 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static int compareString(const void* key, const void* element) 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName); 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL _GetSubFontName(CFX_ByteString& name, int lang) 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = sizeof g_JpFontNameMap; 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* pFontnameMap = (void*)g_JpFontNameMap; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lang == 1) { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = sizeof g_GbFontNameMap; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFontnameMap = (void*)g_GbFontNameMap; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (lang == 2) { 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = 0; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap, 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (found == NULL) { 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name = found->m_pSubFontName; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family) 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) { 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_KaiTi.IsEmpty()) { 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_KaiTi = FindFont("KaiTi"); 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_KaiTi.IsEmpty()) { 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_KaiTi = "SimSun"; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = m_KaiTi; 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) { 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_FangSong.IsEmpty()) { 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FangSong = FindFont("FangSong"); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_FangSong.IsEmpty()) { 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FangSong = "SimSun"; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = m_FangSong; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) { 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "SimSun"; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) { 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "SimHei"; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (!(picth_family & FF_ROMAN) && weight > 550) { 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "SimHei"; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "SimSun"; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family) 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS PGothic"; 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (face.Find("UI Gothic") >= 0) { 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS UI Gothic"; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) { 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS PGothic"; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS Gothic"; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS PMincho"; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS Mincho"; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_GetSubFontName(face, 0)) { 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(picth_family & FF_ROMAN) && weight > 400) { 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS PGothic"; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MS PMincho"; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact) 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString face = cstr_face; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iBaseFont; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++) 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) { 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = Base14Substs[iBaseFont].m_pWinName; 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bItalic = Base14Substs[iBaseFont].m_bItalic; 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bExact = TRUE; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) { 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charset = DEFAULT_CHARSET; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int subst_pitch_family = pitch_family; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (charset) { 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SHIFTJIS_CHARSET: 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov subst_pitch_family = FF_ROMAN; 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CHINESEBIG5_CHARSET: 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case HANGUL_CHARSET: 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case GB2312_CHARSET: 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov subst_pitch_family = 0; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS, 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, subst_pitch_family, face); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char facebuf[100]; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont); 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = ::GetTextFaceA(m_hDC, 100, facebuf); 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SelectObject(m_hDC, hOldFont); 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.EqualNoCase(facebuf)) { 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return hFont; 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]); 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iCount; ++i) { 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face == VariantNames[i].m_pFaceName) { 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf); 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName); 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (wsFace == wsName) { 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return hFont; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::DeleteObject(hFont); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (charset == DEFAULT_CHARSET) { 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (charset) { 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SHIFTJIS_CHARSET: 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetJapanesePreference(face, weight, pitch_family); 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case GB2312_CHARSET: 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetGBPreference(face, weight, pitch_family); 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case HANGUL_CHARSET: 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "Gulim"; 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CHINESEBIG5_CHARSET: 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (face.Find("MSung") >= 0) { 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "MingLiU"; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = "PMingLiU"; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS, 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, subst_pitch_family, face); 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return hFont; 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CWin32FontInfo::DeleteFont(void* hFont) 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::DeleteObject(hFont); 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = FXDWORD_FROM_MSBFIRST(table); 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = ::GetFontData(m_hDC, table, 0, buffer, size); 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SelectObject(m_hDC, hOldFont); 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (size == GDI_ERROR) { 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return size; 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char facebuf[100]; 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ret = ::GetTextFaceA(m_hDC, 100, facebuf); 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SelectObject(m_hDC, hOldFont); 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret == 0) { 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name = facebuf; 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset) 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TEXTMETRIC tm; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::GetTextMetrics(m_hDC, &tm); 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SelectObject(m_hDC, hOldFont); 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charset = tm.tmCharSet; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FX_NEW CWin32FontInfo; 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_GEModule::InitPlatform() 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32Platform* pPlatformData = FX_NEW CWin32Platform; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPlatformData) { 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OSVERSIONINFO ver; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ver.dwOSVersionInfoSize = sizeof(ver); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetVersionEx(&ver); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5; 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPlatformData->m_GdiplusExt.Load(); 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPlatformData = pPlatformData; 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault()); 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_GEModule::DestroyPlatform() 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pPlatformData) { 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (CWin32Platform*)m_pPlatformData; 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPlatformData = NULL; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class) 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_hDC = hDC; 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_DeviceClass = device_class; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR); 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (GetObjectType(m_hDC) == OBJ_MEMDC) { 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL); 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap); 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BITMAP bitmap; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetObject(hBitmap, sizeof bitmap, &bitmap); 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nBitsPerPixel = bitmap.bmBitsPixel; 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = bitmap.bmWidth; 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Height = abs(bitmap.bmHeight); 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap); 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hBitmap); 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL); 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = ::GetDeviceCaps(m_hDC, HORZRES); 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Height = ::GetDeviceCaps(m_hDC, VERTRES); 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DeviceClass != FXDC_DISPLAY) { 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RenderCaps = FXRC_BIT_MASK; 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK; 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CGdiDeviceDriver::GetDeviceCaps(int caps_id) 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (caps_id) { 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDC_DEVICE_CLASS: 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_DeviceClass; 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDC_PIXEL_WIDTH: 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Width; 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDC_PIXEL_HEIGHT: 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Height; 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDC_BITS_PIXEL: 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_nBitsPerPixel; 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDC_RENDER_CAPS: 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_RenderCaps; 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPVOID CGdiDeviceDriver::GetClipRgn() 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1); 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (::GetClipRgn(m_hDC, hClipRgn) == 0) { 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hClipRgn); 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hClipRgn = NULL; 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FX_LPVOID)hClipRgn; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform) 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DeviceClass == FXDC_PRINTER) { 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap == NULL) { 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((pBitmap->IsCmykImage() || pIccTransform) && 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) { 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pSrcRect->Width(), height = pSrcRect->Height(); 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pitch = pBitmap->GetPitch(); 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LPBYTE pBuffer = pBitmap->GetBuffer(); 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT dst_rect(0, 0, width, height); 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dst_width = dst_rect.Width(); 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dst_height = dst_rect.Height(); 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::StretchDIBits(m_hDC, left, top, dst_width, dst_height, 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY); 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBitmap; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((pBitmap->IsCmykImage() || pIccTransform) && 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) { 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pSrcRect->Width(), height = pSrcRect->Height(); 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pitch = pBitmap->GetPitch(); 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LPBYTE pBuffer = pBitmap->GetBuffer(); 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom, 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS); 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap != pBitmap1) { 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBitmap; 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top, 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform) 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap == NULL) { 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((pBitmap->IsCmykImage() || pIccTransform) && 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) { 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 || 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) { 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStretchBltMode(m_hDC, HALFTONE); 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStretchBltMode(m_hDC, COLORONCOLOR); 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pToStrechBitmap = pBitmap; 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool del = false; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) { 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height); 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov del = true; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap); 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(), 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY); 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (del) { 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pToStrechBitmap; 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top, 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags, 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, void* pIccTransform) 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap == NULL) { 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform); 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pBitmap->GetWidth(), height = pBitmap->GetHeight(); 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct { 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BITMAPINFOHEADER bmiHeader; 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD bmiColors[2]; 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } bmi; 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER)); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biBitCount = 1; 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biCompression = BI_RGB; 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biHeight = -height; 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biPlanes = 1; 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biWidth = width; 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_nBitsPerPixel != 1) { 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStretchBltMode(m_hDC, HALFTONE); 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiColors[0] = 0xffffff; 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiColors[1] = 0; 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND); 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovBOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect) 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ::GetClipBox(m_hDC, (RECT*)pRect); 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn) 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::SelectClipRgn(m_hDC, (HRGN)hRgn); 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb) 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT width; 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT scale = 1.f; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ? 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b); 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGraphState) { 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = scale * pGraphState->m_LineWidth; 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = 1.0f; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD PenStyle = PS_GEOMETRIC; 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (width < 1) { 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = 1; 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pGraphState->m_DashCount) { 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_USERSTYLE; 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_SOLID; 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(pGraphState->m_LineCap) { 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_ENDCAP_FLAT; 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_ENDCAP_ROUND; 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_ENDCAP_SQUARE; 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(pGraphState->m_LineJoin) { 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_JOIN_MITER; 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_JOIN_ROUND; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PenStyle |= PS_JOIN_BEVEL; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int a; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_COLORREF rgb; 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ArgbDecode(argb, a, rgb); 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGBRUSH lb; 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lb.lbColor = rgb; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lb.lbStyle = BS_SOLID; 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lb.lbHatch = 0; 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD* pDash = NULL; 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGraphState->m_DashCount) { 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount); 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDash) { 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pGraphState->m_DashCount; i ++) { 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]); 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDash[i] < 1) { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDash[i] = 1; 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash); 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDash) { 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pDash); 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return hPen; 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic HBRUSH _CreateBrush(FX_DWORD argb) 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int a; 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_COLORREF rgb; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ArgbDecode(argb, a, rgb); 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CreateSolidBrush(rgb); 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix) 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BeginPath(hDC); 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nPoints = pPathData->GetPointCount(); 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_PATHPOINT* pPoints = pPathData->GetPoints(); 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < nPoints; i++) { 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(posx, posy); 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy); 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int point_type = pPoints[i].m_Flag & FXPT_TYPE; 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(point_type == PT_MOVETO) { 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MoveToEx(hDC, screen_x, screen_y, NULL); 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(point_type == PT_LINETO) { 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) { 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov screen_x ++; 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LineTo(hDC, screen_x, screen_y); 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(point_type == PT_BEZIERTO) { 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POINT lppt[3]; 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[0].x = screen_x; 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[0].y = screen_y; 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posx = pPoints[i + 1].m_PointX; 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posy = pPoints[i + 1].m_PointY; 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(posx, posy); 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[1].x = FXSYS_round(posx); 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[1].y = FXSYS_round(posy); 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posx = pPoints[i + 2].m_PointX; 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posy = pPoints[i + 2].m_PointY; 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(posx, posy); 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[2].x = FXSYS_round(posx); 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lppt[2].y = FXSYS_round(posy); 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PolyBezierTo(hDC, lppt, 3); 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i += 2; 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPoints[i].m_Flag & PT_CLOSEFIGURE) { 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CloseFigure(hDC); 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EndPath(hDC); 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3); 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3); 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag1 & flag2) { 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag1 || flag2) { 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height)); 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x[2], y[2]; 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y); 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (np == 0) { 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (np == 1) { 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x2 = x[0]; 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov y2 = y[0]; 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x1 = x[0]; 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov y1 = y[0]; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x2 = x[np - 1]; 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov y2 = y[np - 1]; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL); 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix) 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f; 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_AffineMatrix* pMatrix, 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_GraphStateData* pGraphState, 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD fill_color, 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD stroke_color, 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int fill_mode, 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* pIccTransform, 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int blend_type 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (blend_type != FXDIB_BLEND_NORMAL) { 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform); 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) { 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect bbox_f = pPathData->GetBoundingBox(); 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bbox_f.Transform(pMatrix); 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT bbox = bbox_f.GetInnerRect(); 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bbox.Width() <= 0) { 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color, 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (bbox.Height() <= 0) { 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color, 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int fill_alpha = FXARGB_A(fill_color); 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int stroke_alpha = FXARGB_A(stroke_color); 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState); 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) { 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPlatform->m_GdiplusExt.IsAvailable()) { 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) { 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) && 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pGraphState && pGraphState->m_LineWidth == 1.f && 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPathData->IsRect()) ) { 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) { 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int old_fill_mode = fill_mode; 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fill_mode &= 3; 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HPEN hPen = NULL; 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HBRUSH hBrush = NULL; 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGraphState && stroke_alpha) { 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL); 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = _CreatePen(pGraphState, pMatrix, stroke_color); 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fill_mode && fill_alpha) { 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPolyFillMode(m_hDC, fill_mode); 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hBrush = _CreateBrush(fill_color); 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) { 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0); 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(x1, y1); 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1); 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMatrix) { 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(x2, y2); 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DrawLine(x1, y1, x2, y2); 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _SetPathToDC(m_hDC, pPathData, pMatrix); 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGraphState && stroke_alpha) { 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fill_mode && fill_alpha) { 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (old_fill_mode & FX_FILL_TEXT_MODE) { 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StrokeAndFillPath(m_hDC); 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FillPath(m_hDC); 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _SetPathToDC(m_hDC, pPathData, pMatrix); 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StrokePath(m_hDC); 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StrokePath(m_hDC); 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (fill_mode && fill_alpha) { 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FillPath(m_hDC); 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (hPen) { 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hPen); 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (hBrush) { 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hBrush); 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type) 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (blend_type != FXDIB_BLEND_NORMAL) { 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha; 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_COLORREF rgb; 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ArgbDecode(fill_color, alpha, rgb); 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (alpha == 0) { 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (alpha < 255) { 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HBRUSH hBrush = CreateSolidBrush(rgb); 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::FillRect(m_hDC, (RECT*)pRect, hBrush); 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hBrush); 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_AffineMatrix* pMatrix, 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int fill_mode 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPathData->GetPointCount() == 5) { 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rectf; 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPathData->IsRect(pMatrix, &rectf)) { 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect = rectf.GetOutterRect(); 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom); 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _SetPathToDC(m_hDC, pPathData, pMatrix); 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPolyFillMode(m_hDC, fill_mode & 3); 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SelectClipPath(m_hDC, RGN_AND); 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData, 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_AffineMatrix* pMatrix, 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_GraphStateData* pGraphState 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000); 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _SetPathToDC(m_hDC, pPathData, pMatrix); 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov WidenPath(m_hDC); 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetPolyFillMode(m_hDC, WINDING); 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND); 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hPen); 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color, 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, void* pIccTransform, int blend_type) 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (blend_type != FXDIB_BLEND_NORMAL) { 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform); 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int a; 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_COLORREF rgb; 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ArgbDecode(color, a, rgb); 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (a == 0) { 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HPEN hPen = CreatePen(PS_SOLID, 1, rgb); 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL); 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov hPen = (HPEN)SelectObject(m_hDC, hPen); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hPen); 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn) 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject((HGDIOBJ)pRgn); 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY) 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPlatform->m_GdiplusExt.IsAvailable()) { 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE; 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge) 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = FALSE; 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pBitmap->GetWidth(); 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int height = pBitmap->GetHeight(); 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height); 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HDC hDCMemory = CreateCompatibleDC(m_hDC); 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp); 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY); 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SelectObject(hDCMemory, holdbmp); 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BITMAPINFO bmi; 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(&bmi, 0, sizeof bmi); 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biHeight = -height; 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biPlanes = 1; 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biWidth = width; 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pIccTransform = NULL; 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) { 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height; 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap bitmap; 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bitmap.Create(width, height, FXDIB_Rgb)) { 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmi.bmiHeader.biBitCount = 24; 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS); 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform); 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = FALSE; 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap->HasAlpha() && ret) { 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBitmap->LoadChannel(FXDIB_Alpha, 0xff); 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hbmp); 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(hDCMemory); 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type, 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, void* pIccTransform) 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(blend_type == FXDIB_BLEND_NORMAL); 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSource->IsAlphaMask()) { 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pSource->GetWidth(), height = pSource->GetHeight(); 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255; 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bGDI) { 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap background; 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!background.Create(width, height, FXDIB_Rgb32) || 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !GetDIBits(&background, left, top, NULL) || 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) { 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT src_rect(0, 0, width, height); 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL); 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height()); 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height, 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pSrcRect->Width(), height = pSrcRect->Height(); 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSource->HasAlpha()) { 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap bitmap; 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap.Create(width, height, FXDIB_Rgb) || 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !GetDIBits(&bitmap, left, top, NULL) || 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) { 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT src_rect(0, 0, width, height); 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL); 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBExtractor temp(pSource); 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = temp; 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap) { 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform); 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top, 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags, 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, void* pIccTransform, int blend_type) 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT bitmap_clip = *pClipRect; 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_width < 0) { 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_left += dest_width; 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest_height < 0) { 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_top += dest_height; 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_clip.Offset(-dest_left, -dest_top); 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip); 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStretched == NULL) { 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform); 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStretched; 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top, 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags, 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha_flag, void* pIccTransform, int blend_type) 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(pSource != NULL && pClipRect != NULL); 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000) 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height, 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClipRect, flags, alpha_flag, pIccTransform, blend_type); 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSource->IsAlphaMask()) { 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect; 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width; 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left; 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height; 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top; 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT clip_rect = image_rect; 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clip_rect.Intersect(*pClipRect); 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clip_rect.Offset(-image_rect.left, -image_rect.top); 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int clip_width = clip_rect.Width(), clip_height = clip_rect.Height(); 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect); 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStretched == NULL) { 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap background; 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) || 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) || 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) { 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStretched; 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT src_rect(0, 0, clip_width, clip_height); 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL); 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStretched; 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSource->HasAlpha()) { 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) { 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBExtractor temp(pSource); 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = temp; 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap == NULL) { 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags); 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height, 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClipRect, flags, alpha_flag, pIccTransform, blend_type); 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBExtractor temp(pSource); 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = temp; 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap) { 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform); 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define GET_PS_FEATURESETTING 4121 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FEATURESETTING_PSLEVEL 2 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint GetPSLevel(HDC hDC) 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY); 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (device_type != DT_RASPRINTER) { 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD esc = GET_PS_FEATURESETTING; 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int param = FEATURESETTING_PSLEVEL; 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, sizeof(int), (char*)¶m) > 0) { 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return param; 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov esc = POSTSCRIPT_IDENTIFY; 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) { 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov esc = POSTSCRIPT_DATA; 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov esc = PSIDENT_GDICENTRIC; 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) { 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov esc = GET_PS_FEATURESETTING; 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int param = FEATURESETTING_PSLEVEL; 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, sizeof(int), (char*)¶m) > 0) { 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return param; 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CFX_WindowsDevice::m_psLevel = 2; 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel) 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bForcePSOutput = bForcePSOutput; 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_psLevel = psLevel; 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bForcePSOutput) { 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver; 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDriver) { 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput); 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetDeviceDriver(pDriver); 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetDeviceDriver(CreateDriver(hDC, bCmykOutput)); 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovHDC CFX_WindowsDevice::GetDC() const 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_RenderDeviceDriver *pRDD = GetDeviceDriver(); 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pRDD) { 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (HDC)pRDD->GetPlatformSurface(); 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput) 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY); 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int obj_type = ::GetObjectType(hDC); 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int device_class; 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) { 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov device_class = FXDC_PRINTER; 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov device_class = FXDC_DISPLAY; 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FX_NEW CGdiDisplayDriver(hDC); 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format) 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BITMAPINFOHEADER bmih; 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER)); 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmih.biSize = sizeof(BITMAPINFOHEADER); 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmih.biBitCount = format & 0xff; 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmih.biHeight = -height; 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmih.biPlanes = 1; 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bmih.biWidth = width; 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pBuffer; 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0); 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_hBitmap == NULL) { 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap; 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pBitmap) { 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBitmap->Create(width, height, format, pBuffer); 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetBitmap(pBitmap); 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_hDC = ::CreateCompatibleDC(NULL); 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap); 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC); 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDriver) { 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetDeviceDriver(pDriver); 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WinBitmapDevice::~CFX_WinBitmapDevice() 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_hDC) { 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SelectObject(m_hDC, m_hOldBitmap); 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteDC(m_hDC); 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_hBitmap) { 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DeleteObject(m_hBitmap); 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete GetBitmap(); 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1201