Backed out changeset 2450366cf7ca (bug 1891629) for causing win msix mochitest failures
[gecko.git] / widget / windows / nsPrintSettingsWin.cpp
blob788c4ab6da7698a12ce0b3ccd446ddec0c5e8f00
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "nsPrintSettingsWin.h"
7 #include "mozilla/ArrayUtils.h"
8 #include "nsCRT.h"
9 #include "nsDeviceContextSpecWin.h"
10 #include "nsPrintSettingsImpl.h"
11 #include "WinUtils.h"
13 using namespace mozilla;
15 // Using paper sizes from wingdi.h and the units given there, plus a little
16 // extra research for the ones it doesn't give. Looks like the list hasn't
17 // changed since Windows 2000, so should be fairly stable now.
18 const short kPaperSizeUnits[] = {
19 nsIPrintSettings::kPaperSizeMillimeters, // Not Used default to mm as
20 // DEVMODE uses tenths of mm, just
21 // in case
22 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER
23 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTERSMALL
24 nsIPrintSettings::kPaperSizeInches, // DMPAPER_TABLOID
25 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LEDGER
26 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LEGAL
27 nsIPrintSettings::kPaperSizeInches, // DMPAPER_STATEMENT
28 nsIPrintSettings::kPaperSizeInches, // DMPAPER_EXECUTIVE
29 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A3
30 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A4
31 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A4SMALL
32 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A5
33 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B4
34 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B5
35 nsIPrintSettings::kPaperSizeInches, // DMPAPER_FOLIO
36 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_QUARTO
37 nsIPrintSettings::kPaperSizeInches, // DMPAPER_10X14
38 nsIPrintSettings::kPaperSizeInches, // DMPAPER_11X17
39 nsIPrintSettings::kPaperSizeInches, // DMPAPER_NOTE
40 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_9
41 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_10
42 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_11
43 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_12
44 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_14
45 nsIPrintSettings::kPaperSizeInches, // DMPAPER_CSHEET
46 nsIPrintSettings::kPaperSizeInches, // DMPAPER_DSHEET
47 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ESHEET
48 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_DL
49 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_C5
50 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_C3
51 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_C4
52 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_C6
53 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_C65
54 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_B4
55 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_B5
56 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_B6
57 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_ITALY
58 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_MONARCH
59 nsIPrintSettings::kPaperSizeInches, // DMPAPER_ENV_PERSONAL
60 nsIPrintSettings::kPaperSizeInches, // DMPAPER_FANFOLD_US
61 nsIPrintSettings::kPaperSizeInches, // DMPAPER_FANFOLD_STD_GERMAN
62 nsIPrintSettings::kPaperSizeInches, // DMPAPER_FANFOLD_LGL_GERMAN
63 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ISO_B4
64 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JAPANESE_POSTCARD
65 nsIPrintSettings::kPaperSizeInches, // DMPAPER_9X11
66 nsIPrintSettings::kPaperSizeInches, // DMPAPER_10X11
67 nsIPrintSettings::kPaperSizeInches, // DMPAPER_15X11
68 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_ENV_INVITE
69 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_RESERVED_48
70 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_RESERVED_49
71 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER_EXTRA
72 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LEGAL_EXTRA
73 nsIPrintSettings::kPaperSizeInches, // DMPAPER_TABLOID_EXTRA
74 nsIPrintSettings::kPaperSizeInches, // DMPAPER_A4_EXTRA
75 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER_TRANSVERSE
76 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A4_TRANSVERSE
77 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER_EXTRA_TRANSVERSE
78 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A_PLUS
79 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B_PLUS
80 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER_PLUS
81 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A4_PLUS
82 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A5_TRANSVERSE
83 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B5_TRANSVERSE
84 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A3_EXTRA
85 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A5_EXTRA
86 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B5_EXTRA
87 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A2
88 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A3_TRANSVERSE
89 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A3_EXTRA_TRANSVERSE
90 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_DBL_JAPANESE_POSTCARD
91 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A6
92 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_KAKU2
93 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_KAKU3
94 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_CHOU3
95 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_CHOU4
96 nsIPrintSettings::kPaperSizeInches, // DMPAPER_LETTER_ROTATED
97 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A3_ROTATED
98 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A4_ROTATED
99 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A5_ROTATED
100 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B4_JIS_ROTATED
101 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B5_JIS_ROTATED
102 nsIPrintSettings::
103 kPaperSizeMillimeters, // DMPAPER_JAPANESE_POSTCARD_ROTATED
104 nsIPrintSettings::
105 kPaperSizeMillimeters, // DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED
106 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_A6_ROTATED
107 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_KAKU2_ROTATED
108 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_KAKU3_ROTATED
109 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_CHOU3_ROTATED
110 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_CHOU4_ROTATED
111 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B6_JIS
112 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_B6_JIS_ROTATED
113 nsIPrintSettings::kPaperSizeInches, // DMPAPER_12X11
114 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_YOU4
115 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_JENV_YOU4_ROTATED
116 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P16K
117 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P32K
118 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P32KBIG
119 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_1
120 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_2
121 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_3
122 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_4
123 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_5
124 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_6
125 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_7
126 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_8
127 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_9
128 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_10
129 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P16K_ROTATED
130 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P32K_ROTATED
131 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_P32KBIG_ROTATED
132 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_1_ROTATED
133 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_2_ROTATED
134 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_3_ROTATED
135 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_4_ROTATED
136 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_5_ROTATED
137 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_6_ROTATED
138 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_7_ROTATED
139 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_8_ROTATED
140 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_9_ROTATED
141 nsIPrintSettings::kPaperSizeMillimeters, // DMPAPER_PENV_10_ROTATED
144 NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsWin, nsPrintSettings,
145 nsIPrintSettingsWin)
147 /** ---------------------------------------------------
148 * See documentation in nsPrintSettingsWin.h
149 * @update
151 nsPrintSettingsWin::nsPrintSettingsWin()
152 : nsPrintSettings(),
153 mDeviceName(nullptr),
154 mDriverName(nullptr),
155 mDevMode(nullptr) {}
157 /** ---------------------------------------------------
158 * See documentation in nsPrintSettingsWin.h
159 * @update
161 nsPrintSettingsWin::nsPrintSettingsWin(const nsPrintSettingsWin& aPS)
162 : mDevMode(nullptr) {
163 *this = aPS;
166 /* static */
167 void nsPrintSettingsWin::PaperSizeUnitFromDmPaperSize(short aPaperSize,
168 int16_t& aPaperSizeUnit) {
169 if (aPaperSize > 0 && aPaperSize < int32_t(ArrayLength(kPaperSizeUnits))) {
170 aPaperSizeUnit = kPaperSizeUnits[aPaperSize];
174 void nsPrintSettingsWin::InitWithInitializer(
175 const PrintSettingsInitializer& aSettings) {
176 nsPrintSettings::InitWithInitializer(aSettings);
178 if (aSettings.mDevmodeWStorage.Length() < sizeof(DEVMODEW)) {
179 return;
182 auto* devmode =
183 reinterpret_cast<const DEVMODEW*>(aSettings.mDevmodeWStorage.Elements());
184 if (devmode->dmSize != sizeof(DEVMODEW) ||
185 devmode->dmSize + devmode->dmDriverExtra >
186 aSettings.mDevmodeWStorage.Length()) {
187 return;
190 // SetDevMode copies the DEVMODE.
191 SetDevMode(const_cast<DEVMODEW*>(devmode));
193 if (mDevMode->dmFields & DM_SCALE) {
194 // Since we do the scaling, grab the DEVMODE value and reset it back to 100.
195 double scale = double(mDevMode->dmScale) / 100.0f;
196 if (mScaling == 1.0 || scale != 1.0) {
197 SetScaling(scale);
199 mDevMode->dmScale = 100;
203 already_AddRefed<nsIPrintSettings> CreatePlatformPrintSettings(
204 const PrintSettingsInitializer& aSettings) {
205 RefPtr<nsPrintSettings> settings = aSettings.mPrintSettings.get();
206 if (!settings) {
207 settings = MakeRefPtr<nsPrintSettingsWin>();
209 settings->InitWithInitializer(aSettings);
210 return settings.forget();
213 /** ---------------------------------------------------
214 * See documentation in nsPrintSettingsWin.h
215 * @update
217 nsPrintSettingsWin::~nsPrintSettingsWin() {
218 if (mDevMode) ::HeapFree(::GetProcessHeap(), 0, mDevMode);
221 NS_IMETHODIMP nsPrintSettingsWin::SetDeviceName(const nsAString& aDeviceName) {
222 mDeviceName = aDeviceName;
223 return NS_OK;
225 NS_IMETHODIMP nsPrintSettingsWin::GetDeviceName(nsAString& aDeviceName) {
226 aDeviceName = mDeviceName;
227 return NS_OK;
230 NS_IMETHODIMP nsPrintSettingsWin::SetDriverName(const nsAString& aDriverName) {
231 mDriverName = aDriverName;
232 return NS_OK;
234 NS_IMETHODIMP nsPrintSettingsWin::GetDriverName(nsAString& aDriverName) {
235 aDriverName = mDriverName;
236 return NS_OK;
239 void nsPrintSettingsWin::CopyDevMode(DEVMODEW* aInDevMode,
240 DEVMODEW*& aOutDevMode) {
241 aOutDevMode = nullptr;
242 size_t size = aInDevMode->dmSize + aInDevMode->dmDriverExtra;
243 aOutDevMode =
244 (LPDEVMODEW)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, size);
245 if (aOutDevMode) {
246 memcpy(aOutDevMode, aInDevMode, size);
250 NS_IMETHODIMP nsPrintSettingsWin::GetDevMode(DEVMODEW** aDevMode) {
251 NS_ENSURE_ARG_POINTER(aDevMode);
253 if (mDevMode) {
254 CopyDevMode(mDevMode, *aDevMode);
255 } else {
256 *aDevMode = nullptr;
258 return NS_OK;
261 NS_IMETHODIMP nsPrintSettingsWin::SetDevMode(DEVMODEW* aDevMode) {
262 if (mDevMode) {
263 ::HeapFree(::GetProcessHeap(), 0, mDevMode);
264 mDevMode = nullptr;
267 if (aDevMode) {
268 CopyDevMode(aDevMode, mDevMode);
270 return NS_OK;
273 void nsPrintSettingsWin::InitUnwriteableMargin(HDC aHdc) {
274 mozilla::gfx::MarginDouble margin =
275 mozilla::widget::WinUtils::GetUnwriteableMarginsForDeviceInInches(aHdc);
277 mUnwriteableMargin.SizeTo(NS_INCHES_TO_INT_TWIPS(margin.top),
278 NS_INCHES_TO_INT_TWIPS(margin.right),
279 NS_INCHES_TO_INT_TWIPS(margin.bottom),
280 NS_INCHES_TO_INT_TWIPS(margin.left));
283 void nsPrintSettingsWin::CopyFromNative(HDC aHdc, DEVMODEW* aDevMode) {
284 MOZ_ASSERT(aHdc);
285 MOZ_ASSERT(aDevMode);
287 mIsInitedFromPrinter = true;
288 if (aDevMode->dmFields & DM_ORIENTATION) {
289 const bool areSheetsOfPaperPortraitMode =
290 (aDevMode->dmOrientation == DMORIENT_PORTRAIT);
292 // If our Windows print settings say that we're producing portrait-mode
293 // sheets of paper, then our page format must also be portrait-mode; unless
294 // we've got a pages-per-sheet value with orthogonal pages/sheets, in which
295 // case it's reversed.
296 const bool arePagesPortraitMode =
297 (areSheetsOfPaperPortraitMode != HasOrthogonalPagesPerSheet());
299 // Record the orientation of the pages (determined above) in mOrientation:
300 mOrientation = int32_t(arePagesPortraitMode ? kPortraitOrientation
301 : kLandscapeOrientation);
304 if (aDevMode->dmFields & DM_COPIES) {
305 mNumCopies = aDevMode->dmCopies;
308 if (aDevMode->dmFields & DM_DUPLEX) {
309 switch (aDevMode->dmDuplex) {
310 default:
311 MOZ_FALLTHROUGH_ASSERT("bad value for dmDuplex field");
312 case DMDUP_SIMPLEX:
313 mDuplex = kDuplexNone;
314 break;
315 case DMDUP_VERTICAL:
316 mDuplex = kDuplexFlipOnLongEdge;
317 break;
318 case DMDUP_HORIZONTAL:
319 mDuplex = kDuplexFlipOnShortEdge;
320 break;
324 // Since we do the scaling, grab their value and reset back to 100.
325 if (aDevMode->dmFields & DM_SCALE) {
326 double scale = double(aDevMode->dmScale) / 100.0f;
327 if (mScaling == 1.0 || scale != 1.0) {
328 mScaling = scale;
330 aDevMode->dmScale = 100;
333 if (aDevMode->dmFields & DM_PAPERSIZE) {
334 mPaperId.Truncate(0);
335 mPaperId.AppendInt(aDevMode->dmPaperSize);
336 // If it is not a paper size we know about, the unit will remain unchanged.
337 PaperSizeUnitFromDmPaperSize(aDevMode->dmPaperSize, mPaperSizeUnit);
340 if (aDevMode->dmFields & DM_COLOR) {
341 mPrintInColor = aDevMode->dmColor == DMCOLOR_COLOR;
344 InitUnwriteableMargin(aHdc);
346 int pixelsPerInchY = ::GetDeviceCaps(aHdc, LOGPIXELSY);
347 int physicalHeight = ::GetDeviceCaps(aHdc, PHYSICALHEIGHT);
348 double physicalHeightInch = double(physicalHeight) / pixelsPerInchY;
349 int pixelsPerInchX = ::GetDeviceCaps(aHdc, LOGPIXELSX);
350 int physicalWidth = ::GetDeviceCaps(aHdc, PHYSICALWIDTH);
351 double physicalWidthInch = double(physicalWidth) / pixelsPerInchX;
353 // Get the paper size from the device context rather than the DEVMODE, because
354 // it is always available.
355 double paperHeightInch = mOrientation == kPortraitOrientation
356 ? physicalHeightInch
357 : physicalWidthInch;
358 mPaperHeight = mPaperSizeUnit == kPaperSizeInches
359 ? paperHeightInch
360 : paperHeightInch * MM_PER_INCH_FLOAT;
362 double paperWidthInch = mOrientation == kPortraitOrientation
363 ? physicalWidthInch
364 : physicalHeightInch;
365 mPaperWidth = mPaperSizeUnit == kPaperSizeInches
366 ? paperWidthInch
367 : paperWidthInch * MM_PER_INCH_FLOAT;
369 // Using LOGPIXELSY to match existing code for print scaling calculations.
370 mResolution = pixelsPerInchY;
373 void nsPrintSettingsWin::CopyToNative(DEVMODEW* aDevMode) {
374 MOZ_ASSERT(aDevMode);
376 if (!mPaperId.IsEmpty()) {
377 aDevMode->dmPaperSize = _wtoi((const wchar_t*)mPaperId.BeginReading());
378 aDevMode->dmFields |= DM_PAPERSIZE;
379 } else {
380 aDevMode->dmPaperSize = 0;
381 aDevMode->dmFields &= ~DM_PAPERSIZE;
384 aDevMode->dmFields |= DM_COLOR;
385 aDevMode->dmColor = mPrintInColor ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
387 // The length and width in DEVMODE are always in tenths of a millimeter.
388 double tenthsOfAmmPerSizeUnit =
389 mPaperSizeUnit == kPaperSizeInches ? MM_PER_INCH_FLOAT * 10.0 : 10.0;
391 // Note: small page sizes can be required here for sticker, label and slide
392 // printers etc. see bug 1271900.
393 if (mPaperHeight > 0) {
394 aDevMode->dmPaperLength = std::round(mPaperHeight * tenthsOfAmmPerSizeUnit);
395 aDevMode->dmFields |= DM_PAPERLENGTH;
396 } else {
397 aDevMode->dmPaperLength = 0;
398 aDevMode->dmFields &= ~DM_PAPERLENGTH;
401 if (mPaperWidth > 0) {
402 aDevMode->dmPaperWidth = std::round(mPaperWidth * tenthsOfAmmPerSizeUnit);
403 aDevMode->dmFields |= DM_PAPERWIDTH;
404 } else {
405 aDevMode->dmPaperWidth = 0;
406 aDevMode->dmFields &= ~DM_PAPERWIDTH;
409 // Setup Orientation
410 aDevMode->dmOrientation = GetSheetOrientation() == kPortraitOrientation
411 ? DMORIENT_PORTRAIT
412 : DMORIENT_LANDSCAPE;
413 aDevMode->dmFields |= DM_ORIENTATION;
415 // Setup Number of Copies
416 aDevMode->dmCopies = mNumCopies;
417 aDevMode->dmFields |= DM_COPIES;
419 // Setup Simplex/Duplex mode
420 switch (mDuplex) {
421 case kDuplexNone:
422 aDevMode->dmDuplex = DMDUP_SIMPLEX;
423 aDevMode->dmFields |= DM_DUPLEX;
424 break;
425 case kDuplexFlipOnLongEdge:
426 aDevMode->dmDuplex = DMDUP_VERTICAL;
427 aDevMode->dmFields |= DM_DUPLEX;
428 break;
429 case kDuplexFlipOnShortEdge:
430 aDevMode->dmDuplex = DMDUP_HORIZONTAL;
431 aDevMode->dmFields |= DM_DUPLEX;
432 break;
433 default:
434 MOZ_ASSERT_UNREACHABLE("bad value for duplex option");
435 break;
439 //-------------------------------------------
440 nsresult nsPrintSettingsWin::_Clone(nsIPrintSettings** _retval) {
441 RefPtr<nsPrintSettingsWin> printSettings = new nsPrintSettingsWin(*this);
442 printSettings.forget(_retval);
443 return NS_OK;
446 //-------------------------------------------
447 nsPrintSettingsWin& nsPrintSettingsWin::operator=(
448 const nsPrintSettingsWin& rhs) {
449 if (this == &rhs) {
450 return *this;
453 ((nsPrintSettings&)*this) = rhs;
455 // Use free because we used the native malloc to create the memory
456 if (mDevMode) {
457 ::HeapFree(::GetProcessHeap(), 0, mDevMode);
460 mDeviceName = rhs.mDeviceName;
461 mDriverName = rhs.mDriverName;
463 if (rhs.mDevMode) {
464 CopyDevMode(rhs.mDevMode, mDevMode);
465 } else {
466 mDevMode = nullptr;
469 return *this;
472 //-------------------------------------------
473 nsresult nsPrintSettingsWin::_Assign(nsIPrintSettings* aPS) {
474 nsPrintSettingsWin* psWin = static_cast<nsPrintSettingsWin*>(aPS);
475 *this = *psWin;
476 return NS_OK;