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"
9 #include "nsDeviceContextSpecWin.h"
10 #include "nsPrintSettingsImpl.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
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
103 kPaperSizeMillimeters
, // DMPAPER_JAPANESE_POSTCARD_ROTATED
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
,
147 /** ---------------------------------------------------
148 * See documentation in nsPrintSettingsWin.h
151 nsPrintSettingsWin::nsPrintSettingsWin()
153 mDeviceName(nullptr),
154 mDriverName(nullptr),
157 /** ---------------------------------------------------
158 * See documentation in nsPrintSettingsWin.h
161 nsPrintSettingsWin::nsPrintSettingsWin(const nsPrintSettingsWin
& aPS
)
162 : mDevMode(nullptr) {
167 void nsPrintSettingsWin::PaperSizeUnitFromDmPaperSize(short aPaperSize
,
168 int16_t& aPaperSizeUnit
) {
169 if (aPaperSize
> 0 && aPaperSize
< int32_t(std::size(kPaperSizeUnits
))) {
170 aPaperSizeUnit
= kPaperSizeUnits
[aPaperSize
];
174 void nsPrintSettingsWin::InitWithInitializer(
175 const PrintSettingsInitializer
& aSettings
) {
176 nsPrintSettings::InitWithInitializer(aSettings
);
178 if (aSettings
.mDevmodeWStorage
.Length() < sizeof(DEVMODEW
)) {
183 reinterpret_cast<const DEVMODEW
*>(aSettings
.mDevmodeWStorage
.Elements());
184 if (devmode
->dmSize
!= sizeof(DEVMODEW
) ||
185 devmode
->dmSize
+ devmode
->dmDriverExtra
>
186 aSettings
.mDevmodeWStorage
.Length()) {
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) {
199 mDevMode
->dmScale
= 100;
203 already_AddRefed
<nsIPrintSettings
> CreatePlatformPrintSettings(
204 const PrintSettingsInitializer
& aSettings
) {
205 RefPtr
<nsPrintSettings
> settings
= aSettings
.mPrintSettings
.get();
207 settings
= MakeRefPtr
<nsPrintSettingsWin
>();
209 settings
->InitWithInitializer(aSettings
);
210 return settings
.forget();
213 /** ---------------------------------------------------
214 * See documentation in nsPrintSettingsWin.h
217 nsPrintSettingsWin::~nsPrintSettingsWin() {
218 if (mDevMode
) ::HeapFree(::GetProcessHeap(), 0, mDevMode
);
221 NS_IMETHODIMP
nsPrintSettingsWin::SetDeviceName(const nsAString
& aDeviceName
) {
222 mDeviceName
= aDeviceName
;
225 NS_IMETHODIMP
nsPrintSettingsWin::GetDeviceName(nsAString
& aDeviceName
) {
226 aDeviceName
= mDeviceName
;
230 NS_IMETHODIMP
nsPrintSettingsWin::SetDriverName(const nsAString
& aDriverName
) {
231 mDriverName
= aDriverName
;
234 NS_IMETHODIMP
nsPrintSettingsWin::GetDriverName(nsAString
& aDriverName
) {
235 aDriverName
= mDriverName
;
239 void nsPrintSettingsWin::CopyDevMode(DEVMODEW
* aInDevMode
,
240 DEVMODEW
*& aOutDevMode
) {
241 aOutDevMode
= nullptr;
242 size_t size
= aInDevMode
->dmSize
+ aInDevMode
->dmDriverExtra
;
244 (LPDEVMODEW
)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY
, size
);
246 memcpy(aOutDevMode
, aInDevMode
, size
);
250 NS_IMETHODIMP
nsPrintSettingsWin::GetDevMode(DEVMODEW
** aDevMode
) {
251 NS_ENSURE_ARG_POINTER(aDevMode
);
254 CopyDevMode(mDevMode
, *aDevMode
);
261 NS_IMETHODIMP
nsPrintSettingsWin::SetDevMode(DEVMODEW
* aDevMode
) {
263 ::HeapFree(::GetProcessHeap(), 0, mDevMode
);
268 CopyDevMode(aDevMode
, mDevMode
);
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
) {
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
) {
311 MOZ_FALLTHROUGH_ASSERT("bad value for dmDuplex field");
313 mDuplex
= kDuplexNone
;
316 mDuplex
= kDuplexFlipOnLongEdge
;
318 case DMDUP_HORIZONTAL
:
319 mDuplex
= kDuplexFlipOnShortEdge
;
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) {
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
358 mPaperHeight
= mPaperSizeUnit
== kPaperSizeInches
360 : paperHeightInch
* MM_PER_INCH_FLOAT
;
362 double paperWidthInch
= mOrientation
== kPortraitOrientation
364 : physicalHeightInch
;
365 mPaperWidth
= mPaperSizeUnit
== kPaperSizeInches
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
;
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
;
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
;
405 aDevMode
->dmPaperWidth
= 0;
406 aDevMode
->dmFields
&= ~DM_PAPERWIDTH
;
410 aDevMode
->dmOrientation
= GetSheetOrientation() == kPortraitOrientation
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
422 aDevMode
->dmDuplex
= DMDUP_SIMPLEX
;
423 aDevMode
->dmFields
|= DM_DUPLEX
;
425 case kDuplexFlipOnLongEdge
:
426 aDevMode
->dmDuplex
= DMDUP_VERTICAL
;
427 aDevMode
->dmFields
|= DM_DUPLEX
;
429 case kDuplexFlipOnShortEdge
:
430 aDevMode
->dmDuplex
= DMDUP_HORIZONTAL
;
431 aDevMode
->dmFields
|= DM_DUPLEX
;
434 MOZ_ASSERT_UNREACHABLE("bad value for duplex option");
439 //-------------------------------------------
440 nsresult
nsPrintSettingsWin::_Clone(nsIPrintSettings
** _retval
) {
441 RefPtr
<nsPrintSettingsWin
> printSettings
= new nsPrintSettingsWin(*this);
442 printSettings
.forget(_retval
);
446 //-------------------------------------------
447 nsPrintSettingsWin
& nsPrintSettingsWin::operator=(
448 const nsPrintSettingsWin
& rhs
) {
453 ((nsPrintSettings
&)*this) = rhs
;
455 // Use free because we used the native malloc to create the memory
457 ::HeapFree(::GetProcessHeap(), 0, mDevMode
);
460 mDeviceName
= rhs
.mDeviceName
;
461 mDriverName
= rhs
.mDriverName
;
464 CopyDevMode(rhs
.mDevMode
, mDevMode
);
472 //-------------------------------------------
473 nsresult
nsPrintSettingsWin::_Assign(nsIPrintSettings
* aPS
) {
474 nsPrintSettingsWin
* psWin
= static_cast<nsPrintSettingsWin
*>(aPS
);