Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: core/fxge/win32/fx_win32_device.cpp

Issue 2059883004: Remove default arguments from IFX_RenderDeviceDriver. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fxge/skia/fx_skia_device.cpp ('k') | core/fxge/win32/fx_win32_print.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fxge/include/fx_ge.h" 7 #include "core/fxge/include/fx_ge.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 m_Width = ::GetDeviceCaps(m_hDC, HORZRES); 746 m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
747 m_Height = ::GetDeviceCaps(m_hDC, VERTRES); 747 m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
748 } 748 }
749 if (m_DeviceClass != FXDC_DISPLAY) { 749 if (m_DeviceClass != FXDC_DISPLAY) {
750 m_RenderCaps = FXRC_BIT_MASK; 750 m_RenderCaps = FXRC_BIT_MASK;
751 } else { 751 } else {
752 m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK; 752 m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;
753 } 753 }
754 } 754 }
755 755
756 CGdiDeviceDriver::~CGdiDeviceDriver() {}
757
756 int CGdiDeviceDriver::GetDeviceCaps(int caps_id) { 758 int CGdiDeviceDriver::GetDeviceCaps(int caps_id) {
757 switch (caps_id) { 759 switch (caps_id) {
758 case FXDC_DEVICE_CLASS: 760 case FXDC_DEVICE_CLASS:
759 return m_DeviceClass; 761 return m_DeviceClass;
760 case FXDC_PIXEL_WIDTH: 762 case FXDC_PIXEL_WIDTH:
761 return m_Width; 763 return m_Width;
762 case FXDC_PIXEL_HEIGHT: 764 case FXDC_PIXEL_HEIGHT:
763 return m_Height; 765 return m_Height;
764 case FXDC_BITS_PIXEL: 766 case FXDC_BITS_PIXEL:
765 return m_nBitsPerPixel; 767 return m_nBitsPerPixel;
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); 984 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr);
983 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); 985 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
984 } 986 }
985 987
986 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, 988 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
987 const CFX_Matrix* pMatrix, 989 const CFX_Matrix* pMatrix,
988 const CFX_GraphStateData* pGraphState, 990 const CFX_GraphStateData* pGraphState,
989 uint32_t fill_color, 991 uint32_t fill_color,
990 uint32_t stroke_color, 992 uint32_t stroke_color,
991 int fill_mode, 993 int fill_mode,
992 int alpha_flag,
993 void* pIccTransform,
994 int blend_type) { 994 int blend_type) {
995 if (blend_type != FXDIB_BLEND_NORMAL) { 995 if (blend_type != FXDIB_BLEND_NORMAL)
996 return FALSE; 996 return FALSE;
997 } 997
998 Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); 998 Color2Argb(fill_color, fill_color, 1 << 24, nullptr);
999 Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform); 999 Color2Argb(stroke_color, stroke_color, 0, nullptr);
1000 CWin32Platform* pPlatform = 1000 CWin32Platform* pPlatform =
1001 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 1001 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
1002 if (!(pGraphState || stroke_color == 0) && 1002 if (!(pGraphState || stroke_color == 0) &&
1003 !pPlatform->m_GdiplusExt.IsAvailable()) { 1003 !pPlatform->m_GdiplusExt.IsAvailable()) {
1004 CFX_FloatRect bbox_f = pPathData->GetBoundingBox(); 1004 CFX_FloatRect bbox_f = pPathData->GetBoundingBox();
1005 if (pMatrix) { 1005 if (pMatrix) {
1006 bbox_f.Transform(pMatrix); 1006 bbox_f.Transform(pMatrix);
1007 } 1007 }
1008 FX_RECT bbox = bbox_f.GetInnerRect(); 1008 FX_RECT bbox = bbox_f.GetInnerRect();
1009 if (bbox.Width() <= 0) { 1009 if (bbox.Width() <= 0) {
1010 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), 1010 return DrawCosmeticLine(
1011 (FX_FLOAT)(bbox.left), 1011 (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left),
1012 (FX_FLOAT)(bbox.bottom + 1), fill_color, 1012 (FX_FLOAT)(bbox.bottom + 1), fill_color, FXDIB_BLEND_NORMAL);
1013 alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); 1013 }
1014 } else if (bbox.Height() <= 0) { 1014 if (bbox.Height() <= 0) {
1015 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), 1015 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top),
1016 (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), 1016 (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top),
1017 fill_color, alpha_flag, pIccTransform, 1017 fill_color, FXDIB_BLEND_NORMAL);
1018 FXDIB_BLEND_NORMAL);
1019 } 1018 }
1020 } 1019 }
1021 int fill_alpha = FXARGB_A(fill_color); 1020 int fill_alpha = FXARGB_A(fill_color);
1022 int stroke_alpha = FXARGB_A(stroke_color); 1021 int stroke_alpha = FXARGB_A(stroke_color);
1023 FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || 1022 FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) ||
1024 (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState); 1023 (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);
1025 if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) { 1024 if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha)
1026 return FALSE; 1025 return FALSE;
1027 } 1026
1028 if (pPlatform->m_GdiplusExt.IsAvailable()) { 1027 if (pPlatform->m_GdiplusExt.IsAvailable()) {
1029 if (bDrawAlpha || 1028 if (bDrawAlpha ||
1030 ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || 1029 ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) ||
1031 (pGraphState && pGraphState->m_DashCount))) { 1030 (pGraphState && pGraphState->m_DashCount))) {
1032 if (!((!pMatrix || MatrixNoScaled(pMatrix)) && pGraphState && 1031 if (!((!pMatrix || MatrixNoScaled(pMatrix)) && pGraphState &&
1033 pGraphState->m_LineWidth == 1.f && 1032 pGraphState->m_LineWidth == 1.f &&
1034 (pPathData->GetPointCount() == 5 || 1033 (pPathData->GetPointCount() == 5 ||
1035 pPathData->GetPointCount() == 4) && 1034 pPathData->GetPointCount() == 4) &&
1036 pPathData->IsRect())) { 1035 pPathData->IsRect())) {
1037 if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, 1036 if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 hPen = (HPEN)SelectObject(m_hDC, hPen); 1084 hPen = (HPEN)SelectObject(m_hDC, hPen);
1086 DeleteObject(hPen); 1085 DeleteObject(hPen);
1087 } 1086 }
1088 if (hBrush) { 1087 if (hBrush) {
1089 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); 1088 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
1090 DeleteObject(hBrush); 1089 DeleteObject(hBrush);
1091 } 1090 }
1092 return TRUE; 1091 return TRUE;
1093 } 1092 }
1094 1093
1095 FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, 1094 FX_BOOL CGdiDeviceDriver::FillRectWithBlend(const FX_RECT* pRect,
1096 uint32_t fill_color, 1095 uint32_t fill_color,
1097 int alpha_flag, 1096 int blend_type) {
1098 void* pIccTransform, 1097 if (blend_type != FXDIB_BLEND_NORMAL)
1099 int blend_type) {
1100 if (blend_type != FXDIB_BLEND_NORMAL) {
1101 return FALSE; 1098 return FALSE;
1102 } 1099
1103 Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); 1100 Color2Argb(fill_color, fill_color, 1 << 24, nullptr);
1104 int alpha; 1101 int alpha;
1105 FX_COLORREF rgb; 1102 FX_COLORREF rgb;
1106 ArgbDecode(fill_color, alpha, rgb); 1103 ArgbDecode(fill_color, alpha, rgb);
1107 if (alpha == 0) { 1104 if (alpha == 0)
1108 return TRUE; 1105 return TRUE;
1109 } 1106
1110 if (alpha < 255) { 1107 if (alpha < 255)
1111 return FALSE; 1108 return FALSE;
1112 } 1109
1113 HBRUSH hBrush = CreateSolidBrush(rgb); 1110 HBRUSH hBrush = CreateSolidBrush(rgb);
1114 ::FillRect(m_hDC, (RECT*)pRect, hBrush); 1111 ::FillRect(m_hDC, (RECT*)pRect, hBrush);
1115 DeleteObject(hBrush); 1112 DeleteObject(hBrush);
1116 return TRUE; 1113 return TRUE;
1117 } 1114 }
1118 1115
1119 FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, 1116 FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
1120 const CFX_Matrix* pMatrix, 1117 const CFX_Matrix* pMatrix,
1121 int fill_mode) { 1118 int fill_mode) {
1122 if (pPathData->GetPointCount() == 5) { 1119 if (pPathData->GetPointCount() == 5) {
(...skipping 23 matching lines...) Expand all
1146 hPen = (HPEN)SelectObject(m_hDC, hPen); 1143 hPen = (HPEN)SelectObject(m_hDC, hPen);
1147 DeleteObject(hPen); 1144 DeleteObject(hPen);
1148 return ret; 1145 return ret;
1149 } 1146 }
1150 1147
1151 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, 1148 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
1152 FX_FLOAT y1, 1149 FX_FLOAT y1,
1153 FX_FLOAT x2, 1150 FX_FLOAT x2,
1154 FX_FLOAT y2, 1151 FX_FLOAT y2,
1155 uint32_t color, 1152 uint32_t color,
1156 int alpha_flag,
1157 void* pIccTransform,
1158 int blend_type) { 1153 int blend_type) {
1159 if (blend_type != FXDIB_BLEND_NORMAL) { 1154 if (blend_type != FXDIB_BLEND_NORMAL)
1160 return FALSE; 1155 return FALSE;
1161 } 1156
1162 Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform); 1157 Color2Argb(color, color, 1 << 24, nullptr);
1163 int a; 1158 int a;
1164 FX_COLORREF rgb; 1159 FX_COLORREF rgb;
1165 ArgbDecode(color, a, rgb); 1160 ArgbDecode(color, a, rgb);
1166 if (a == 0) { 1161 if (a == 0)
1167 return TRUE; 1162 return TRUE;
1168 } 1163
1169 HPEN hPen = CreatePen(PS_SOLID, 1, rgb); 1164 HPEN hPen = CreatePen(PS_SOLID, 1, rgb);
1170 hPen = (HPEN)SelectObject(m_hDC, hPen); 1165 hPen = (HPEN)SelectObject(m_hDC, hPen);
1171 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); 1166 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr);
1172 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); 1167 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
1173 hPen = (HPEN)SelectObject(m_hDC, hPen); 1168 hPen = (HPEN)SelectObject(m_hDC, hPen);
1174 DeleteObject(hPen); 1169 DeleteObject(hPen);
1175 return TRUE; 1170 return TRUE;
1176 } 1171 }
1177 1172
1178 CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) 1173 CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC)
1179 : CGdiDeviceDriver(hDC, FXDC_DISPLAY) { 1174 : CGdiDeviceDriver(hDC, FXDC_DISPLAY) {
1180 CWin32Platform* pPlatform = 1175 CWin32Platform* pPlatform =
1181 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 1176 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
1182 if (pPlatform->m_GdiplusExt.IsAvailable()) { 1177 if (pPlatform->m_GdiplusExt.IsAvailable()) {
1183 m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE; 1178 m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;
1184 } 1179 }
1185 } 1180 }
1186 1181
1187 FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, 1182 CGdiDisplayDriver::~CGdiDisplayDriver() {}
1188 int left, 1183
1189 int top, 1184 FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) {
1190 void* pIccTransform,
1191 FX_BOOL bDEdge) {
1192 FX_BOOL ret = FALSE; 1185 FX_BOOL ret = FALSE;
1193 int width = pBitmap->GetWidth(); 1186 int width = pBitmap->GetWidth();
1194 int height = pBitmap->GetHeight(); 1187 int height = pBitmap->GetHeight();
1195 HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height); 1188 HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);
1196 HDC hDCMemory = CreateCompatibleDC(m_hDC); 1189 HDC hDCMemory = CreateCompatibleDC(m_hDC);
1197 HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp); 1190 HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp);
1198 BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY); 1191 BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);
1199 SelectObject(hDCMemory, holdbmp); 1192 SelectObject(hDCMemory, holdbmp);
1200 BITMAPINFO bmi; 1193 BITMAPINFO bmi;
1201 FXSYS_memset(&bmi, 0, sizeof bmi); 1194 FXSYS_memset(&bmi, 0, sizeof bmi);
1202 bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; 1195 bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
1203 bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); 1196 bmi.bmiHeader.biBitCount = pBitmap->GetBPP();
1204 bmi.bmiHeader.biHeight = -height; 1197 bmi.bmiHeader.biHeight = -height;
1205 bmi.bmiHeader.biPlanes = 1; 1198 bmi.bmiHeader.biPlanes = 1;
1206 bmi.bmiHeader.biWidth = width; 1199 bmi.bmiHeader.biWidth = width;
1207 if (!CFX_GEModule::Get()->GetCodecModule() || 1200 if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage()) {
1208 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
1209 pIccTransform = nullptr;
1210 }
1211 if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && !pIccTransform) {
1212 ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, 1201 ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi,
1213 DIB_RGB_COLORS) == height; 1202 DIB_RGB_COLORS) == height;
1214 } else { 1203 } else {
1215 CFX_DIBitmap bitmap; 1204 CFX_DIBitmap bitmap;
1216 if (bitmap.Create(width, height, FXDIB_Rgb)) { 1205 if (bitmap.Create(width, height, FXDIB_Rgb)) {
1217 bmi.bmiHeader.biBitCount = 24; 1206 bmi.bmiHeader.biBitCount = 24;
1218 ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, 1207 ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi,
1219 DIB_RGB_COLORS); 1208 DIB_RGB_COLORS);
1220 ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, 1209 ret =
1221 pIccTransform); 1210 pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, nullptr);
1222 } else { 1211 } else {
1223 ret = FALSE; 1212 ret = FALSE;
1224 } 1213 }
1225 } 1214 }
1226 if (pBitmap->HasAlpha() && ret) { 1215 if (pBitmap->HasAlpha() && ret)
1227 pBitmap->LoadChannel(FXDIB_Alpha, 0xff); 1216 pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
1228 } 1217
1229 DeleteObject(hbmp); 1218 DeleteObject(hbmp);
1230 DeleteObject(hDCMemory); 1219 DeleteObject(hDCMemory);
1231 return ret; 1220 return ret;
1232 } 1221 }
1233 1222
1234 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, 1223 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource,
1235 uint32_t color, 1224 uint32_t color,
1236 const FX_RECT* pSrcRect, 1225 const FX_RECT* pSrcRect,
1237 int left, 1226 int left,
1238 int top, 1227 int top,
1239 int blend_type, 1228 int blend_type) {
1240 int alpha_flag,
1241 void* pIccTransform) {
1242 ASSERT(blend_type == FXDIB_BLEND_NORMAL); 1229 ASSERT(blend_type == FXDIB_BLEND_NORMAL);
1243 if (pSource->IsAlphaMask()) { 1230 if (pSource->IsAlphaMask()) {
1244 int width = pSource->GetWidth(), height = pSource->GetHeight(); 1231 int width = pSource->GetWidth(), height = pSource->GetHeight();
1245 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) 1232 int alpha = FXARGB_A(color);
1246 ? FXGETFLAG_ALPHA_FILL(alpha_flag)
1247 : FXARGB_A(color);
1248 if (pSource->GetBPP() != 1 || alpha != 255) { 1233 if (pSource->GetBPP() != 1 || alpha != 255) {
1249 CFX_DIBitmap background; 1234 CFX_DIBitmap background;
1250 if (!background.Create(width, height, FXDIB_Rgb32) || 1235 if (!background.Create(width, height, FXDIB_Rgb32) ||
1251 !GetDIBits(&background, left, top, nullptr) || 1236 !GetDIBits(&background, left, top) ||
1252 !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, 1237 !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0,
1253 FXDIB_BLEND_NORMAL, nullptr, FALSE, 1238 FXDIB_BLEND_NORMAL, nullptr, FALSE, 0,
1254 alpha_flag, pIccTransform)) { 1239 nullptr)) {
1255 return FALSE; 1240 return FALSE;
1256 } 1241 }
1257 FX_RECT src_rect(0, 0, width, height); 1242 FX_RECT src_rect(0, 0, width, height);
1258 return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 1243 return SetDIBits(&background, 0, &src_rect, left, top,
1259 0, nullptr); 1244 FXDIB_BLEND_NORMAL);
1260 } 1245 }
1261 FX_RECT clip_rect(left, top, left + pSrcRect->Width(), 1246 FX_RECT clip_rect(left, top, left + pSrcRect->Width(),
1262 top + pSrcRect->Height()); 1247 top + pSrcRect->Height());
1263 return StretchDIBits(pSource, color, left - pSrcRect->left, 1248 return StretchDIBits(pSource, color, left - pSrcRect->left,
1264 top - pSrcRect->top, width, height, &clip_rect, 0, 1249 top - pSrcRect->top, width, height, &clip_rect, 0,
1265 alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); 1250 FXDIB_BLEND_NORMAL);
1266 } 1251 }
1267 int width = pSrcRect->Width(), height = pSrcRect->Height(); 1252 int width = pSrcRect->Width(), height = pSrcRect->Height();
1268 if (pSource->HasAlpha()) { 1253 if (pSource->HasAlpha()) {
1269 CFX_DIBitmap bitmap; 1254 CFX_DIBitmap bitmap;
1270 if (!bitmap.Create(width, height, FXDIB_Rgb) || 1255 if (!bitmap.Create(width, height, FXDIB_Rgb) ||
1271 !GetDIBits(&bitmap, left, top, nullptr) || 1256 !GetDIBits(&bitmap, left, top) ||
1272 !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, 1257 !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left,
1273 pSrcRect->top, FXDIB_BLEND_NORMAL, nullptr, 1258 pSrcRect->top, FXDIB_BLEND_NORMAL, nullptr,
1274 FALSE, pIccTransform)) { 1259 FALSE, nullptr)) {
1275 return FALSE; 1260 return FALSE;
1276 } 1261 }
1277 FX_RECT src_rect(0, 0, width, height); 1262 FX_RECT src_rect(0, 0, width, height);
1278 return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, 1263 return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL);
1279 nullptr);
1280 } 1264 }
1281 CFX_DIBExtractor temp(pSource); 1265 CFX_DIBExtractor temp(pSource);
1282 CFX_DIBitmap* pBitmap = temp; 1266 CFX_DIBitmap* pBitmap = temp;
1283 if (pBitmap) { 1267 if (!pBitmap)
1284 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform); 1268 return FALSE;
1285 } 1269 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, nullptr);
1286 return FALSE;
1287 } 1270 }
1288 1271
1289 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, 1272 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource,
1290 uint32_t color, 1273 uint32_t color,
1291 int dest_left, 1274 int dest_left,
1292 int dest_top, 1275 int dest_top,
1293 int dest_width, 1276 int dest_width,
1294 int dest_height, 1277 int dest_height,
1295 const FX_RECT* pClipRect, 1278 const FX_RECT* pClipRect,
1296 int render_flags, 1279 int render_flags) {
1297 int alpha_flag,
1298 void* pIccTransform,
1299 int blend_type) {
1300 FX_RECT bitmap_clip = *pClipRect; 1280 FX_RECT bitmap_clip = *pClipRect;
1301 if (dest_width < 0) { 1281 if (dest_width < 0)
1302 dest_left += dest_width; 1282 dest_left += dest_width;
1303 } 1283
1304 if (dest_height < 0) { 1284 if (dest_height < 0)
1305 dest_top += dest_height; 1285 dest_top += dest_height;
1306 } 1286
1307 bitmap_clip.Offset(-dest_left, -dest_top); 1287 bitmap_clip.Offset(-dest_left, -dest_top);
1308 std::unique_ptr<CFX_DIBitmap> pStretched( 1288 std::unique_ptr<CFX_DIBitmap> pStretched(
1309 pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip)); 1289 pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip));
1310 if (!pStretched) 1290 if (!pStretched)
1311 return TRUE; 1291 return TRUE;
1312 1292
1313 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); 1293 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());
1314 return SetDIBits(pStretched.get(), color, &src_rect, pClipRect->left, 1294 return SetDIBits(pStretched.get(), color, &src_rect, pClipRect->left,
1315 pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, 1295 pClipRect->top, FXDIB_BLEND_NORMAL);
1316 pIccTransform);
1317 } 1296 }
1318 1297
1319 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, 1298 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource,
1320 uint32_t color, 1299 uint32_t color,
1321 int dest_left, 1300 int dest_left,
1322 int dest_top, 1301 int dest_top,
1323 int dest_width, 1302 int dest_width,
1324 int dest_height, 1303 int dest_height,
1325 const FX_RECT* pClipRect, 1304 const FX_RECT* pClipRect,
1326 uint32_t flags, 1305 uint32_t flags,
1327 int alpha_flag,
1328 void* pIccTransform,
1329 int blend_type) { 1306 int blend_type) {
1330 ASSERT(pSource && pClipRect); 1307 ASSERT(pSource && pClipRect);
1331 if (flags || dest_width > 10000 || dest_width < -10000 || 1308 if (flags || dest_width > 10000 || dest_width < -10000 ||
1332 dest_height > 10000 || dest_height < -10000) { 1309 dest_height > 10000 || dest_height < -10000) {
1333 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, 1310 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top,
1334 dest_width, dest_height, pClipRect, flags, 1311 dest_width, dest_height, pClipRect, flags);
1335 alpha_flag, pIccTransform, blend_type);
1336 } 1312 }
1337 if (pSource->IsAlphaMask()) { 1313 if (pSource->IsAlphaMask()) {
1338 FX_RECT image_rect; 1314 FX_RECT image_rect;
1339 image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width; 1315 image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;
1340 image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left; 1316 image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;
1341 image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height; 1317 image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;
1342 image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top; 1318 image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;
1343 FX_RECT clip_rect = image_rect; 1319 FX_RECT clip_rect = image_rect;
1344 clip_rect.Intersect(*pClipRect); 1320 clip_rect.Intersect(*pClipRect);
1345 clip_rect.Offset(-image_rect.left, -image_rect.top); 1321 clip_rect.Offset(-image_rect.left, -image_rect.top);
1346 int clip_width = clip_rect.Width(), clip_height = clip_rect.Height(); 1322 int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();
1347 std::unique_ptr<CFX_DIBitmap> pStretched( 1323 std::unique_ptr<CFX_DIBitmap> pStretched(
1348 pSource->StretchTo(dest_width, dest_height, flags, &clip_rect)); 1324 pSource->StretchTo(dest_width, dest_height, flags, &clip_rect));
1349 if (!pStretched) 1325 if (!pStretched)
1350 return TRUE; 1326 return TRUE;
1351 1327
1352 CFX_DIBitmap background; 1328 CFX_DIBitmap background;
1353 if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) || 1329 if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||
1354 !GetDIBits(&background, image_rect.left + clip_rect.left, 1330 !GetDIBits(&background, image_rect.left + clip_rect.left,
1355 image_rect.top + clip_rect.top, nullptr) || 1331 image_rect.top + clip_rect.top) ||
1356 !background.CompositeMask( 1332 !background.CompositeMask(
1357 0, 0, clip_width, clip_height, pStretched.get(), color, 0, 0, 1333 0, 0, clip_width, clip_height, pStretched.get(), color, 0, 0,
1358 FXDIB_BLEND_NORMAL, nullptr, FALSE, alpha_flag, pIccTransform)) { 1334 FXDIB_BLEND_NORMAL, nullptr, FALSE, 0, nullptr)) {
1359 return FALSE; 1335 return FALSE;
1360 } 1336 }
1361 1337
1362 FX_RECT src_rect(0, 0, clip_width, clip_height); 1338 FX_RECT src_rect(0, 0, clip_width, clip_height);
1363 return SetDIBits( 1339 return SetDIBits(&background, 0, &src_rect,
1364 &background, 0, &src_rect, image_rect.left + clip_rect.left, 1340 image_rect.left + clip_rect.left,
1365 image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, nullptr); 1341 image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL);
1366 } 1342 }
1367 if (pSource->HasAlpha()) { 1343 if (pSource->HasAlpha()) {
1368 CWin32Platform* pPlatform = 1344 CWin32Platform* pPlatform =
1369 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); 1345 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
1370 if (pPlatform->m_GdiplusExt.IsAvailable() && !pIccTransform && 1346 if (pPlatform->m_GdiplusExt.IsAvailable() && !pSource->IsCmykImage()) {
1371 !pSource->IsCmykImage()) {
1372 CFX_DIBExtractor temp(pSource); 1347 CFX_DIBExtractor temp(pSource);
1373 CFX_DIBitmap* pBitmap = temp; 1348 CFX_DIBitmap* pBitmap = temp;
1374 if (!pBitmap) 1349 if (!pBitmap)
1375 return FALSE; 1350 return FALSE;
1376 return pPlatform->m_GdiplusExt.StretchDIBits( 1351 return pPlatform->m_GdiplusExt.StretchDIBits(
1377 m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, 1352 m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height,
1378 pClipRect, flags); 1353 pClipRect, flags);
1379 } 1354 }
1380 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, 1355 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top,
1381 dest_width, dest_height, pClipRect, flags, 1356 dest_width, dest_height, pClipRect, flags);
1382 alpha_flag, pIccTransform, blend_type);
1383 } 1357 }
1384 CFX_DIBExtractor temp(pSource); 1358 CFX_DIBExtractor temp(pSource);
1385 CFX_DIBitmap* pBitmap = temp; 1359 CFX_DIBitmap* pBitmap = temp;
1386 if (pBitmap) { 1360 if (!pBitmap)
1387 return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, 1361 return FALSE;
1388 dest_height, flags, pIccTransform); 1362 return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width,
1389 } 1363 dest_height, flags, nullptr);
1390 return FALSE;
1391 } 1364 }
1392 1365
1393 CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) { 1366 CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) {
1394 SetDeviceDriver(CreateDriver(hDC)); 1367 SetDeviceDriver(CreateDriver(hDC));
1395 } 1368 }
1396 1369
1397 CFX_WindowsDevice::~CFX_WindowsDevice() {} 1370 CFX_WindowsDevice::~CFX_WindowsDevice() {}
1398 1371
1399 HDC CFX_WindowsDevice::GetDC() const { 1372 HDC CFX_WindowsDevice::GetDC() const {
1400 IFX_RenderDeviceDriver* pRDD = GetDeviceDriver(); 1373 IFX_RenderDeviceDriver* pRDD = GetDeviceDriver();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 if (m_hDC) { 1415 if (m_hDC) {
1443 SelectObject(m_hDC, m_hOldBitmap); 1416 SelectObject(m_hDC, m_hOldBitmap);
1444 DeleteDC(m_hDC); 1417 DeleteDC(m_hDC);
1445 } 1418 }
1446 if (m_hBitmap) 1419 if (m_hBitmap)
1447 DeleteObject(m_hBitmap); 1420 DeleteObject(m_hBitmap);
1448 delete GetBitmap(); 1421 delete GetBitmap();
1449 } 1422 }
1450 1423
1451 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ 1424 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
OLDNEW
« no previous file with comments | « core/fxge/skia/fx_skia_device.cpp ('k') | core/fxge/win32/fx_win32_print.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698