OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/include/fxge/fx_ge.h" | 7 #include "core/include/fxge/fx_ge.h" |
8 | 8 |
9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ | 9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ |
10 #include <crtdbg.h> | 10 #include <crtdbg.h> |
(...skipping 25 matching lines...) Expand all Loading... |
36 // IFX_SystemFontInfo | 36 // IFX_SystemFontInfo |
37 void Release() override; | 37 void Release() override; |
38 FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override; | 38 FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override; |
39 void* MapFont(int weight, | 39 void* MapFont(int weight, |
40 FX_BOOL bItalic, | 40 FX_BOOL bItalic, |
41 int charset, | 41 int charset, |
42 int pitch_family, | 42 int pitch_family, |
43 const FX_CHAR* face, | 43 const FX_CHAR* face, |
44 int& iExact) override; | 44 int& iExact) override; |
45 void* GetFont(const FX_CHAR* face) override { return NULL; } | 45 void* GetFont(const FX_CHAR* face) override { return NULL; } |
46 FX_DWORD GetFontData(void* hFont, | 46 uint32_t GetFontData(void* hFont, |
47 FX_DWORD table, | 47 uint32_t table, |
48 uint8_t* buffer, | 48 uint8_t* buffer, |
49 FX_DWORD size) override; | 49 uint32_t size) override; |
50 FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override; | 50 FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override; |
51 FX_BOOL GetFontCharset(void* hFont, int& charset) override; | 51 FX_BOOL GetFontCharset(void* hFont, int& charset) override; |
52 void DeleteFont(void* hFont) override; | 52 void DeleteFont(void* hFont) override; |
53 | 53 |
54 FX_BOOL IsOpenTypeFromDiv(const LOGFONTA* plf); | 54 FX_BOOL IsOpenTypeFromDiv(const LOGFONTA* plf); |
55 FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf); | 55 FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf); |
56 void AddInstalledFont(const LOGFONTA* plf, FX_DWORD FontType); | 56 void AddInstalledFont(const LOGFONTA* plf, uint32_t FontType); |
57 void GetGBPreference(CFX_ByteString& face, int weight, int picth_family); | 57 void GetGBPreference(CFX_ByteString& face, int weight, int picth_family); |
58 void GetJapanesePreference(CFX_ByteString& face, | 58 void GetJapanesePreference(CFX_ByteString& face, |
59 int weight, | 59 int weight, |
60 int picth_family); | 60 int picth_family); |
61 CFX_ByteString FindFont(const CFX_ByteString& name); | 61 CFX_ByteString FindFont(const CFX_ByteString& name); |
62 HDC m_hDC; | 62 HDC m_hDC; |
63 CFX_FontMapper* m_pMapper; | 63 CFX_FontMapper* m_pMapper; |
64 CFX_ByteString m_LastFamily; | 64 CFX_ByteString m_LastFamily; |
65 CFX_ByteString m_KaiTi, m_FangSong; | 65 CFX_ByteString m_KaiTi, m_FangSong; |
66 }; | 66 }; |
67 | 67 |
68 CFX_Win32FontInfo::CFX_Win32FontInfo() { | 68 CFX_Win32FontInfo::CFX_Win32FontInfo() { |
69 m_hDC = CreateCompatibleDC(NULL); | 69 m_hDC = CreateCompatibleDC(NULL); |
70 } | 70 } |
71 CFX_Win32FontInfo::~CFX_Win32FontInfo() { | 71 CFX_Win32FontInfo::~CFX_Win32FontInfo() { |
72 m_pMapper = NULL; | 72 m_pMapper = NULL; |
73 } | 73 } |
74 void CFX_Win32FontInfo::Release() { | 74 void CFX_Win32FontInfo::Release() { |
75 DeleteDC(m_hDC); | 75 DeleteDC(m_hDC); |
76 delete this; | 76 delete this; |
77 } | 77 } |
78 #define TT_MAKE_TAG(x1, x2, x3, x4) \ | 78 #define TT_MAKE_TAG(x1, x2, x3, x4) \ |
79 (((FX_DWORD)x1 << 24) | ((FX_DWORD)x2 << 16) | ((FX_DWORD)x3 << 8) | \ | 79 (((uint32_t)x1 << 24) | ((uint32_t)x2 << 16) | ((uint32_t)x3 << 8) | \ |
80 (FX_DWORD)x4) | 80 (uint32_t)x4) |
81 FX_BOOL CFX_Win32FontInfo::IsOpenTypeFromDiv(const LOGFONTA* plf) { | 81 FX_BOOL CFX_Win32FontInfo::IsOpenTypeFromDiv(const LOGFONTA* plf) { |
82 HFONT hFont = CreateFontIndirectA(plf); | 82 HFONT hFont = CreateFontIndirectA(plf); |
83 FX_BOOL ret = FALSE; | 83 FX_BOOL ret = FALSE; |
84 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); | 84 uint32_t font_size = GetFontData(hFont, 0, NULL, 0); |
85 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { | 85 if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) { |
86 FX_DWORD lVersion = 0; | 86 uint32_t lVersion = 0; |
87 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); | 87 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t)); |
88 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | | 88 lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) | |
89 ((FX_DWORD)((uint8_t)(lVersion >> 8))) << 16 | | 89 ((uint32_t)((uint8_t)(lVersion >> 8))) << 16 | |
90 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | | 90 ((uint32_t)((uint8_t)(lVersion >> 16))) << 8 | |
91 ((uint8_t)(lVersion >> 24)); | 91 ((uint8_t)(lVersion >> 24)); |
92 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || lVersion == 0x00010000 || | 92 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || lVersion == 0x00010000 || |
93 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || | 93 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || |
94 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || lVersion == 0x00020000) { | 94 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || lVersion == 0x00020000) { |
95 ret = TRUE; | 95 ret = TRUE; |
96 } | 96 } |
97 } | 97 } |
98 DeleteFont(hFont); | 98 DeleteFont(hFont); |
99 return ret; | 99 return ret; |
100 } | 100 } |
101 FX_BOOL CFX_Win32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) { | 101 FX_BOOL CFX_Win32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) { |
102 HFONT hFont = CreateFontIndirectA(plf); | 102 HFONT hFont = CreateFontIndirectA(plf); |
103 FX_BOOL ret = FALSE; | 103 FX_BOOL ret = FALSE; |
104 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); | 104 uint32_t font_size = GetFontData(hFont, 0, NULL, 0); |
105 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { | 105 if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) { |
106 FX_DWORD lVersion = 0; | 106 uint32_t lVersion = 0; |
107 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); | 107 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t)); |
108 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | | 108 lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) | |
109 ((FX_DWORD)((uint8_t)(lVersion >> 8))) << 16 | | 109 ((uint32_t)((uint8_t)(lVersion >> 8))) << 16 | |
110 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | | 110 ((uint32_t)((uint8_t)(lVersion >> 16))) << 8 | |
111 ((uint8_t)(lVersion >> 24)); | 111 ((uint8_t)(lVersion >> 24)); |
112 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || lVersion == 0x00010000 || | 112 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || lVersion == 0x00010000 || |
113 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || | 113 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || |
114 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || lVersion == 0x00020000) { | 114 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || lVersion == 0x00020000) { |
115 ret = TRUE; | 115 ret = TRUE; |
116 } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) || | 116 } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) || |
117 (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) { | 117 (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) { |
118 ret = TRUE; | 118 ret = TRUE; |
119 } | 119 } |
120 } | 120 } |
121 DeleteFont(hFont); | 121 DeleteFont(hFont); |
122 return ret; | 122 return ret; |
123 } | 123 } |
124 void CFX_Win32FontInfo::AddInstalledFont(const LOGFONTA* plf, | 124 void CFX_Win32FontInfo::AddInstalledFont(const LOGFONTA* plf, |
125 FX_DWORD FontType) { | 125 uint32_t FontType) { |
126 CFX_ByteString name(plf->lfFaceName); | 126 CFX_ByteString name(plf->lfFaceName); |
127 if (name[0] == '@') { | 127 if (name[0] == '@') { |
128 return; | 128 return; |
129 } | 129 } |
130 if (name == m_LastFamily) { | 130 if (name == m_LastFamily) { |
131 m_pMapper->AddInstalledFont(name, plf->lfCharSet); | 131 m_pMapper->AddInstalledFont(name, plf->lfCharSet); |
132 return; | 132 return; |
133 } | 133 } |
134 if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) { | 134 if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) { |
135 return; | 135 return; |
136 } | 136 } |
137 if (!(FontType & TRUETYPE_FONTTYPE)) { | 137 if (!(FontType & TRUETYPE_FONTTYPE)) { |
138 if (!IsSupportFontFormDiv(plf)) { | 138 if (!IsSupportFontFormDiv(plf)) { |
139 return; | 139 return; |
140 } | 140 } |
141 } | 141 } |
142 m_pMapper->AddInstalledFont(name, plf->lfCharSet); | 142 m_pMapper->AddInstalledFont(name, plf->lfCharSet); |
143 m_LastFamily = name; | 143 m_LastFamily = name; |
144 } | 144 } |
145 static int CALLBACK FontEnumProc(const LOGFONTA* plf, | 145 static int CALLBACK FontEnumProc(const LOGFONTA* plf, |
146 const TEXTMETRICA* lpntme, | 146 const TEXTMETRICA* lpntme, |
147 FX_DWORD FontType, | 147 uint32_t FontType, |
148 LPARAM lParam) { | 148 LPARAM lParam) { |
149 CFX_Win32FontInfo* pFontInfo = (CFX_Win32FontInfo*)lParam; | 149 CFX_Win32FontInfo* pFontInfo = (CFX_Win32FontInfo*)lParam; |
150 if (pFontInfo->m_pMapper->GetFontEnumerator()) { | 150 if (pFontInfo->m_pMapper->GetFontEnumerator()) { |
151 pFontInfo->m_pMapper->GetFontEnumerator()->HitFont(); | 151 pFontInfo->m_pMapper->GetFontEnumerator()->HitFont(); |
152 } | 152 } |
153 pFontInfo->AddInstalledFont(plf, FontType); | 153 pFontInfo->AddInstalledFont(plf, FontType); |
154 return 1; | 154 return 1; |
155 } | 155 } |
156 FX_BOOL CFX_Win32FontInfo::EnumFontList(CFX_FontMapper* pMapper) { | 156 FX_BOOL CFX_Win32FontInfo::EnumFontList(CFX_FontMapper* pMapper) { |
157 m_pMapper = pMapper; | 157 m_pMapper = pMapper; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 } | 399 } |
400 break; | 400 break; |
401 } | 401 } |
402 hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, | 402 hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, |
403 OUT_TT_ONLY_PRECIS, 0, 0, subst_pitch_family, face); | 403 OUT_TT_ONLY_PRECIS, 0, 0, subst_pitch_family, face); |
404 return hFont; | 404 return hFont; |
405 } | 405 } |
406 void CFX_Win32FontInfo::DeleteFont(void* hFont) { | 406 void CFX_Win32FontInfo::DeleteFont(void* hFont) { |
407 ::DeleteObject(hFont); | 407 ::DeleteObject(hFont); |
408 } | 408 } |
409 FX_DWORD CFX_Win32FontInfo::GetFontData(void* hFont, | 409 uint32_t CFX_Win32FontInfo::GetFontData(void* hFont, |
410 FX_DWORD table, | 410 uint32_t table, |
411 uint8_t* buffer, | 411 uint8_t* buffer, |
412 FX_DWORD size) { | 412 uint32_t size) { |
413 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); | 413 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); |
414 table = FXDWORD_GET_MSBFIRST(reinterpret_cast<uint8_t*>(&table)); | 414 table = FXDWORD_GET_MSBFIRST(reinterpret_cast<uint8_t*>(&table)); |
415 size = ::GetFontData(m_hDC, table, 0, buffer, size); | 415 size = ::GetFontData(m_hDC, table, 0, buffer, size); |
416 ::SelectObject(m_hDC, hOldFont); | 416 ::SelectObject(m_hDC, hOldFont); |
417 if (size == GDI_ERROR) { | 417 if (size == GDI_ERROR) { |
418 return 0; | 418 return 0; |
419 } | 419 } |
420 return size; | 420 return size; |
421 } | 421 } |
422 FX_BOOL CFX_Win32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { | 422 FX_BOOL CFX_Win32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 delete pBitmap; | 574 delete pBitmap; |
575 } | 575 } |
576 } | 576 } |
577 return TRUE; | 577 return TRUE; |
578 } | 578 } |
579 FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, | 579 FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, |
580 int dest_left, | 580 int dest_left, |
581 int dest_top, | 581 int dest_top, |
582 int dest_width, | 582 int dest_width, |
583 int dest_height, | 583 int dest_height, |
584 FX_DWORD flags, | 584 uint32_t flags, |
585 void* pIccTransform) { | 585 void* pIccTransform) { |
586 CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; | 586 CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; |
587 if (!pBitmap || dest_width == 0 || dest_height == 0) { | 587 if (!pBitmap || dest_width == 0 || dest_height == 0) { |
588 return FALSE; | 588 return FALSE; |
589 } | 589 } |
590 if ((pBitmap->IsCmykImage() || pIccTransform) && | 590 if ((pBitmap->IsCmykImage() || pIccTransform) && |
591 !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) { | 591 !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) { |
592 return FALSE; | 592 return FALSE; |
593 } | 593 } |
594 CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); | 594 CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); |
(...skipping 22 matching lines...) Expand all Loading... |
617 if (del) { | 617 if (del) { |
618 delete pToStrechBitmap; | 618 delete pToStrechBitmap; |
619 } | 619 } |
620 return TRUE; | 620 return TRUE; |
621 } | 621 } |
622 FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, | 622 FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, |
623 int dest_left, | 623 int dest_left, |
624 int dest_top, | 624 int dest_top, |
625 int dest_width, | 625 int dest_width, |
626 int dest_height, | 626 int dest_height, |
627 FX_DWORD bitmap_color, | 627 uint32_t bitmap_color, |
628 FX_DWORD flags, | 628 uint32_t flags, |
629 int alpha_flag, | 629 int alpha_flag, |
630 void* pIccTransform) { | 630 void* pIccTransform) { |
631 CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; | 631 CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1; |
632 if (!pBitmap || dest_width == 0 || dest_height == 0) { | 632 if (!pBitmap || dest_width == 0 || dest_height == 0) { |
633 return FALSE; | 633 return FALSE; |
634 } | 634 } |
635 _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), | 635 _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), |
636 pIccTransform); | 636 pIccTransform); |
637 int width = pBitmap->GetWidth(), height = pBitmap->GetHeight(); | 637 int width = pBitmap->GetWidth(), height = pBitmap->GetHeight(); |
638 struct { | 638 struct { |
639 BITMAPINFOHEADER bmiHeader; | 639 BITMAPINFOHEADER bmiHeader; |
640 FX_DWORD bmiColors[2]; | 640 uint32_t bmiColors[2]; |
641 } bmi; | 641 } bmi; |
642 FXSYS_memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); | 642 FXSYS_memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); |
643 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | 643 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
644 bmi.bmiHeader.biBitCount = 1; | 644 bmi.bmiHeader.biBitCount = 1; |
645 bmi.bmiHeader.biCompression = BI_RGB; | 645 bmi.bmiHeader.biCompression = BI_RGB; |
646 bmi.bmiHeader.biHeight = -height; | 646 bmi.bmiHeader.biHeight = -height; |
647 bmi.bmiHeader.biPlanes = 1; | 647 bmi.bmiHeader.biPlanes = 1; |
648 bmi.bmiHeader.biWidth = width; | 648 bmi.bmiHeader.biWidth = width; |
649 if (m_nBitsPerPixel != 1) { | 649 if (m_nBitsPerPixel != 1) { |
650 SetStretchBltMode(m_hDC, HALFTONE); | 650 SetStretchBltMode(m_hDC, HALFTONE); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 } | 684 } |
685 FX_BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect) { | 685 FX_BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect) { |
686 return ::GetClipBox(m_hDC, (RECT*)pRect); | 686 return ::GetClipBox(m_hDC, (RECT*)pRect); |
687 } | 687 } |
688 FX_BOOL CGdiDeviceDriver::SetClipRgn(void* hRgn) { | 688 FX_BOOL CGdiDeviceDriver::SetClipRgn(void* hRgn) { |
689 ::SelectClipRgn(m_hDC, (HRGN)hRgn); | 689 ::SelectClipRgn(m_hDC, (HRGN)hRgn); |
690 return TRUE; | 690 return TRUE; |
691 } | 691 } |
692 static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, | 692 static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, |
693 const CFX_Matrix* pMatrix, | 693 const CFX_Matrix* pMatrix, |
694 FX_DWORD argb) { | 694 uint32_t argb) { |
695 FX_FLOAT width; | 695 FX_FLOAT width; |
696 FX_FLOAT scale = 1.f; | 696 FX_FLOAT scale = 1.f; |
697 if (pMatrix) | 697 if (pMatrix) |
698 scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) | 698 scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) |
699 ? FXSYS_fabs(pMatrix->a) | 699 ? FXSYS_fabs(pMatrix->a) |
700 : FXSYS_fabs(pMatrix->b); | 700 : FXSYS_fabs(pMatrix->b); |
701 if (pGraphState) { | 701 if (pGraphState) { |
702 width = scale * pGraphState->m_LineWidth; | 702 width = scale * pGraphState->m_LineWidth; |
703 } else { | 703 } else { |
704 width = 1.0f; | 704 width = 1.0f; |
705 } | 705 } |
706 FX_DWORD PenStyle = PS_GEOMETRIC; | 706 uint32_t PenStyle = PS_GEOMETRIC; |
707 if (width < 1) { | 707 if (width < 1) { |
708 width = 1; | 708 width = 1; |
709 } | 709 } |
710 if (pGraphState->m_DashCount) { | 710 if (pGraphState->m_DashCount) { |
711 PenStyle |= PS_USERSTYLE; | 711 PenStyle |= PS_USERSTYLE; |
712 } else { | 712 } else { |
713 PenStyle |= PS_SOLID; | 713 PenStyle |= PS_SOLID; |
714 } | 714 } |
715 switch (pGraphState->m_LineCap) { | 715 switch (pGraphState->m_LineCap) { |
716 case 0: | 716 case 0: |
(...skipping 17 matching lines...) Expand all Loading... |
734 PenStyle |= PS_JOIN_BEVEL; | 734 PenStyle |= PS_JOIN_BEVEL; |
735 break; | 735 break; |
736 } | 736 } |
737 int a; | 737 int a; |
738 FX_COLORREF rgb; | 738 FX_COLORREF rgb; |
739 ArgbDecode(argb, a, rgb); | 739 ArgbDecode(argb, a, rgb); |
740 LOGBRUSH lb; | 740 LOGBRUSH lb; |
741 lb.lbColor = rgb; | 741 lb.lbColor = rgb; |
742 lb.lbStyle = BS_SOLID; | 742 lb.lbStyle = BS_SOLID; |
743 lb.lbHatch = 0; | 743 lb.lbHatch = 0; |
744 FX_DWORD* pDash = NULL; | 744 uint32_t* pDash = NULL; |
745 if (pGraphState->m_DashCount) { | 745 if (pGraphState->m_DashCount) { |
746 pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount); | 746 pDash = FX_Alloc(uint32_t, pGraphState->m_DashCount); |
747 for (int i = 0; i < pGraphState->m_DashCount; i++) { | 747 for (int i = 0; i < pGraphState->m_DashCount; i++) { |
748 pDash[i] = FXSYS_round( | 748 pDash[i] = FXSYS_round( |
749 pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) | 749 pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) |
750 : pGraphState->m_DashArray[i]); | 750 : pGraphState->m_DashArray[i]); |
751 if (pDash[i] < 1) { | 751 if (pDash[i] < 1) { |
752 pDash[i] = 1; | 752 pDash[i] = 1; |
753 } | 753 } |
754 } | 754 } |
755 } | 755 } |
756 HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, | 756 HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, |
757 pGraphState->m_DashCount, (const DWORD*)pDash); | 757 pGraphState->m_DashCount, (const DWORD*)pDash); |
758 FX_Free(pDash); | 758 FX_Free(pDash); |
759 return hPen; | 759 return hPen; |
760 } | 760 } |
761 static HBRUSH _CreateBrush(FX_DWORD argb) { | 761 static HBRUSH _CreateBrush(uint32_t argb) { |
762 int a; | 762 int a; |
763 FX_COLORREF rgb; | 763 FX_COLORREF rgb; |
764 ArgbDecode(argb, a, rgb); | 764 ArgbDecode(argb, a, rgb); |
765 return CreateSolidBrush(rgb); | 765 return CreateSolidBrush(rgb); |
766 } | 766 } |
767 static void _SetPathToDC(HDC hDC, | 767 static void _SetPathToDC(HDC hDC, |
768 const CFX_PathData* pPathData, | 768 const CFX_PathData* pPathData, |
769 const CFX_Matrix* pMatrix) { | 769 const CFX_Matrix* pMatrix) { |
770 BeginPath(hDC); | 770 BeginPath(hDC); |
771 int nPoints = pPathData->GetPointCount(); | 771 int nPoints = pPathData->GetPointCount(); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL); | 844 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL); |
845 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); | 845 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); |
846 } | 846 } |
847 static FX_BOOL _MatrixNoScaled(const CFX_Matrix* pMatrix) { | 847 static FX_BOOL _MatrixNoScaled(const CFX_Matrix* pMatrix) { |
848 return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && | 848 return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && |
849 pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f; | 849 pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f; |
850 } | 850 } |
851 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, | 851 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, |
852 const CFX_Matrix* pMatrix, | 852 const CFX_Matrix* pMatrix, |
853 const CFX_GraphStateData* pGraphState, | 853 const CFX_GraphStateData* pGraphState, |
854 FX_DWORD fill_color, | 854 uint32_t fill_color, |
855 FX_DWORD stroke_color, | 855 uint32_t stroke_color, |
856 int fill_mode, | 856 int fill_mode, |
857 int alpha_flag, | 857 int alpha_flag, |
858 void* pIccTransform, | 858 void* pIccTransform, |
859 int blend_type) { | 859 int blend_type) { |
860 if (blend_type != FXDIB_BLEND_NORMAL) { | 860 if (blend_type != FXDIB_BLEND_NORMAL) { |
861 return FALSE; | 861 return FALSE; |
862 } | 862 } |
863 _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); | 863 _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); |
864 _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform); | 864 _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform); |
865 CWin32Platform* pPlatform = | 865 CWin32Platform* pPlatform = |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 hPen = (HPEN)SelectObject(m_hDC, hPen); | 954 hPen = (HPEN)SelectObject(m_hDC, hPen); |
955 DeleteObject(hPen); | 955 DeleteObject(hPen); |
956 } | 956 } |
957 if (hBrush) { | 957 if (hBrush) { |
958 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); | 958 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); |
959 DeleteObject(hBrush); | 959 DeleteObject(hBrush); |
960 } | 960 } |
961 return TRUE; | 961 return TRUE; |
962 } | 962 } |
963 FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, | 963 FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, |
964 FX_DWORD fill_color, | 964 uint32_t fill_color, |
965 int alpha_flag, | 965 int alpha_flag, |
966 void* pIccTransform, | 966 void* pIccTransform, |
967 int blend_type) { | 967 int blend_type) { |
968 if (blend_type != FXDIB_BLEND_NORMAL) { | 968 if (blend_type != FXDIB_BLEND_NORMAL) { |
969 return FALSE; | 969 return FALSE; |
970 } | 970 } |
971 _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); | 971 _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); |
972 int alpha; | 972 int alpha; |
973 FX_COLORREF rgb; | 973 FX_COLORREF rgb; |
974 ArgbDecode(fill_color, alpha, rgb); | 974 ArgbDecode(fill_color, alpha, rgb); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 SetPolyFillMode(m_hDC, WINDING); | 1010 SetPolyFillMode(m_hDC, WINDING); |
1011 FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND); | 1011 FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND); |
1012 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1012 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1013 DeleteObject(hPen); | 1013 DeleteObject(hPen); |
1014 return ret; | 1014 return ret; |
1015 } | 1015 } |
1016 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, | 1016 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, |
1017 FX_FLOAT y1, | 1017 FX_FLOAT y1, |
1018 FX_FLOAT x2, | 1018 FX_FLOAT x2, |
1019 FX_FLOAT y2, | 1019 FX_FLOAT y2, |
1020 FX_DWORD color, | 1020 uint32_t color, |
1021 int alpha_flag, | 1021 int alpha_flag, |
1022 void* pIccTransform, | 1022 void* pIccTransform, |
1023 int blend_type) { | 1023 int blend_type) { |
1024 if (blend_type != FXDIB_BLEND_NORMAL) { | 1024 if (blend_type != FXDIB_BLEND_NORMAL) { |
1025 return FALSE; | 1025 return FALSE; |
1026 } | 1026 } |
1027 _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform); | 1027 _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform); |
1028 int a; | 1028 int a; |
1029 FX_COLORREF rgb; | 1029 FX_COLORREF rgb; |
1030 ArgbDecode(color, a, rgb); | 1030 ArgbDecode(color, a, rgb); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 } | 1091 } |
1092 } | 1092 } |
1093 if (pBitmap->HasAlpha() && ret) { | 1093 if (pBitmap->HasAlpha() && ret) { |
1094 pBitmap->LoadChannel(FXDIB_Alpha, 0xff); | 1094 pBitmap->LoadChannel(FXDIB_Alpha, 0xff); |
1095 } | 1095 } |
1096 DeleteObject(hbmp); | 1096 DeleteObject(hbmp); |
1097 DeleteObject(hDCMemory); | 1097 DeleteObject(hDCMemory); |
1098 return ret; | 1098 return ret; |
1099 } | 1099 } |
1100 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, | 1100 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, |
1101 FX_DWORD color, | 1101 uint32_t color, |
1102 const FX_RECT* pSrcRect, | 1102 const FX_RECT* pSrcRect, |
1103 int left, | 1103 int left, |
1104 int top, | 1104 int top, |
1105 int blend_type, | 1105 int blend_type, |
1106 int alpha_flag, | 1106 int alpha_flag, |
1107 void* pIccTransform) { | 1107 void* pIccTransform) { |
1108 ASSERT(blend_type == FXDIB_BLEND_NORMAL); | 1108 ASSERT(blend_type == FXDIB_BLEND_NORMAL); |
1109 if (pSource->IsAlphaMask()) { | 1109 if (pSource->IsAlphaMask()) { |
1110 int width = pSource->GetWidth(), height = pSource->GetHeight(); | 1110 int width = pSource->GetWidth(), height = pSource->GetHeight(); |
1111 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) | 1111 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 NULL); | 1145 NULL); |
1146 } | 1146 } |
1147 CFX_DIBExtractor temp(pSource); | 1147 CFX_DIBExtractor temp(pSource); |
1148 CFX_DIBitmap* pBitmap = temp; | 1148 CFX_DIBitmap* pBitmap = temp; |
1149 if (pBitmap) { | 1149 if (pBitmap) { |
1150 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform); | 1150 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform); |
1151 } | 1151 } |
1152 return FALSE; | 1152 return FALSE; |
1153 } | 1153 } |
1154 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, | 1154 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, |
1155 FX_DWORD color, | 1155 uint32_t color, |
1156 int dest_left, | 1156 int dest_left, |
1157 int dest_top, | 1157 int dest_top, |
1158 int dest_width, | 1158 int dest_width, |
1159 int dest_height, | 1159 int dest_height, |
1160 const FX_RECT* pClipRect, | 1160 const FX_RECT* pClipRect, |
1161 int render_flags, | 1161 int render_flags, |
1162 int alpha_flag, | 1162 int alpha_flag, |
1163 void* pIccTransform, | 1163 void* pIccTransform, |
1164 int blend_type) { | 1164 int blend_type) { |
1165 FX_RECT bitmap_clip = *pClipRect; | 1165 FX_RECT bitmap_clip = *pClipRect; |
(...skipping 10 matching lines...) Expand all Loading... |
1176 return TRUE; | 1176 return TRUE; |
1177 } | 1177 } |
1178 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); | 1178 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); |
1179 FX_BOOL ret = | 1179 FX_BOOL ret = |
1180 SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, | 1180 SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, |
1181 FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform); | 1181 FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform); |
1182 delete pStretched; | 1182 delete pStretched; |
1183 return ret; | 1183 return ret; |
1184 } | 1184 } |
1185 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, | 1185 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, |
1186 FX_DWORD color, | 1186 uint32_t color, |
1187 int dest_left, | 1187 int dest_left, |
1188 int dest_top, | 1188 int dest_top, |
1189 int dest_width, | 1189 int dest_width, |
1190 int dest_height, | 1190 int dest_height, |
1191 const FX_RECT* pClipRect, | 1191 const FX_RECT* pClipRect, |
1192 FX_DWORD flags, | 1192 uint32_t flags, |
1193 int alpha_flag, | 1193 int alpha_flag, |
1194 void* pIccTransform, | 1194 void* pIccTransform, |
1195 int blend_type) { | 1195 int blend_type) { |
1196 ASSERT(pSource && pClipRect); | 1196 ASSERT(pSource && pClipRect); |
1197 if (flags || dest_width > 10000 || dest_width < -10000 || | 1197 if (flags || dest_width > 10000 || dest_width < -10000 || |
1198 dest_height > 10000 || dest_height < -10000) { | 1198 dest_height > 10000 || dest_height < -10000) { |
1199 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, | 1199 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, |
1200 dest_width, dest_height, pClipRect, flags, | 1200 dest_width, dest_height, pClipRect, flags, |
1201 alpha_flag, pIccTransform, blend_type); | 1201 alpha_flag, pIccTransform, blend_type); |
1202 } | 1202 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 } | 1258 } |
1259 return FALSE; | 1259 return FALSE; |
1260 } | 1260 } |
1261 #define GET_PS_FEATURESETTING 4121 | 1261 #define GET_PS_FEATURESETTING 4121 |
1262 #define FEATURESETTING_PSLEVEL 2 | 1262 #define FEATURESETTING_PSLEVEL 2 |
1263 int GetPSLevel(HDC hDC) { | 1263 int GetPSLevel(HDC hDC) { |
1264 int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY); | 1264 int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY); |
1265 if (device_type != DT_RASPRINTER) { | 1265 if (device_type != DT_RASPRINTER) { |
1266 return 0; | 1266 return 0; |
1267 } | 1267 } |
1268 FX_DWORD esc = GET_PS_FEATURESETTING; | 1268 uint32_t esc = GET_PS_FEATURESETTING; |
1269 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { | 1269 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { |
1270 int param = FEATURESETTING_PSLEVEL; | 1270 int param = FEATURESETTING_PSLEVEL; |
1271 if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, | 1271 if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, |
1272 sizeof(int), (char*)¶m) > 0) { | 1272 sizeof(int), (char*)¶m) > 0) { |
1273 return param; | 1273 return param; |
1274 } | 1274 } |
1275 } | 1275 } |
1276 esc = POSTSCRIPT_IDENTIFY; | 1276 esc = POSTSCRIPT_IDENTIFY; |
1277 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) { | 1277 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) { |
1278 esc = POSTSCRIPT_DATA; | 1278 esc = POSTSCRIPT_DATA; |
1279 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { | 1279 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { |
1280 return 2; | 1280 return 2; |
1281 } | 1281 } |
1282 return 0; | 1282 return 0; |
1283 } | 1283 } |
1284 esc = PSIDENT_GDICENTRIC; | 1284 esc = PSIDENT_GDICENTRIC; |
1285 if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, | 1285 if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(uint32_t), (char*)&esc, 0, |
1286 NULL) <= 0) { | 1286 NULL) <= 0) { |
1287 return 2; | 1287 return 2; |
1288 } | 1288 } |
1289 esc = GET_PS_FEATURESETTING; | 1289 esc = GET_PS_FEATURESETTING; |
1290 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { | 1290 if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) { |
1291 int param = FEATURESETTING_PSLEVEL; | 1291 int param = FEATURESETTING_PSLEVEL; |
1292 if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, | 1292 if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)¶m, |
1293 sizeof(int), (char*)¶m) > 0) { | 1293 sizeof(int), (char*)¶m) > 0) { |
1294 return param; | 1294 return param; |
1295 } | 1295 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 SelectObject(m_hDC, m_hOldBitmap); | 1363 SelectObject(m_hDC, m_hOldBitmap); |
1364 DeleteDC(m_hDC); | 1364 DeleteDC(m_hDC); |
1365 } | 1365 } |
1366 if (m_hBitmap) { | 1366 if (m_hBitmap) { |
1367 DeleteObject(m_hBitmap); | 1367 DeleteObject(m_hBitmap); |
1368 } | 1368 } |
1369 delete GetBitmap(); | 1369 delete GetBitmap(); |
1370 } | 1370 } |
1371 | 1371 |
1372 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ | 1372 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ |
OLD | NEW |