void wxOSXPrintData::TransferResolutionTo( wxPrintData &data ) { PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession, &printer ); /* assume high quality, will change below if we are able to */ data.SetQuality(wxPRINT_QUALITY_HIGH); PMResolution *resolutions; UInt32 resCount; resolutions = GetSupportedResolutions(printer, &resCount); if (resolutions) { bool valid = false; PMResolution res; if ( PMPrinterGetOutputResolution(printer, m_macPrintSettings, &res) == noErr ) valid = true; if ( valid ) { UInt32 i; for (i = 0; i < resCount; i++) { if ((resolutions[i].hRes == res.hRes) && (resolutions[i].vRes = res.vRes)) break; } if (i < resCount) data.SetQuality((((i + 1) * 3) / resCount) + wxPRINT_QUALITY_DRAFT); } free(resolutions); } }
bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) { HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; if (!hDevMode) return false; if ( hDevMode ) { LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode); //// Orientation if (devMode->dmFields & DM_ORIENTATION) data.SetOrientation( devMode->dmOrientation ); //// Collation if (devMode->dmFields & DM_COLLATE) { if (devMode->dmCollate == DMCOLLATE_TRUE) data.SetCollate( true ); else data.SetCollate( false ); } //// Number of copies if (devMode->dmFields & DM_COPIES) data.SetNoCopies( devMode->dmCopies ); if (devMode->dmFields & DM_DEFAULTSOURCE) data.SetBin( (wxPrintBin)devMode->dmDefaultSource ); //// Printer name if (devMode->dmDeviceName[0] != 0) data.SetPrinterName( devMode->dmDeviceName ); //// Colour if (devMode->dmFields & DM_COLOR) { if (devMode->dmColor == DMCOLOR_COLOR) data.SetColour( true ); else data.SetColour( false ); } else data.SetColour( true ); //// Paper size // We don't know size of user defined paper and some buggy drivers // set both DM_PAPERSIZE and DM_PAPERWIDTH & DM_PAPERLENGTH. Since // dmPaperSize >= DMPAPER_USER wouldn't be in wxWin's database, this // code wouldn't set m_paperSize correctly. bool foundPaperSize = false; if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER)) { if (wxThePrintPaperDatabase) { wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize); if (paper) { data.SetPaperId( paper->GetId() ); data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) ); m_customWindowsPaperId = 0; foundPaperSize = true; } } else { // Shouldn't really get here wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative.")); data.SetPaperId( wxPAPER_NONE ); data.SetPaperSize( wxSize(0,0) ); m_customWindowsPaperId = 0; GlobalUnlock(hDevMode); return false; } } if (!foundPaperSize && (devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH)) { // DEVMODE is in tenths of a milimeter data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) ); data.SetPaperId( wxPAPER_NONE ); m_customWindowsPaperId = devMode->dmPaperSize; } else { // Often will reach this for non-standard paper sizes (sizes which // wouldn't be in wxWidget's paper database). Setting // m_customWindowsPaperId to devMode->dmPaperSize should be enough // to get this paper size working. data.SetPaperSize( wxSize(0,0) ); data.SetPaperId( wxPAPER_NONE ); m_customWindowsPaperId = devMode->dmPaperSize; } //// Duplex if (devMode->dmFields & DM_DUPLEX) { switch (devMode->dmDuplex) { case DMDUP_HORIZONTAL: data.SetDuplex( wxDUPLEX_HORIZONTAL ); break; case DMDUP_VERTICAL: data.SetDuplex( wxDUPLEX_VERTICAL ); break; default: case DMDUP_SIMPLEX: data.SetDuplex( wxDUPLEX_SIMPLEX ); break; } } else data.SetDuplex( wxDUPLEX_SIMPLEX ); //// Quality if (devMode->dmFields & DM_PRINTQUALITY) { switch (devMode->dmPrintQuality) { case DMRES_MEDIUM: data.SetQuality( wxPRINT_QUALITY_MEDIUM ); break; case DMRES_LOW: data.SetQuality( wxPRINT_QUALITY_LOW ); break; case DMRES_DRAFT: data.SetQuality( wxPRINT_QUALITY_DRAFT ); break; case DMRES_HIGH: data.SetQuality( wxPRINT_QUALITY_HIGH ); break; default: { // TODO: if the printer fills in the resolution in DPI, how // will the application know if it's high, low, draft etc.?? // wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values."); data.SetQuality( devMode->dmPrintQuality ); break; } } } else data.SetQuality( wxPRINT_QUALITY_HIGH ); if (devMode->dmDriverExtra > 0) data.SetPrivData( (char *)devMode+devMode->dmSize, devMode->dmDriverExtra ); else data.SetPrivData( NULL, 0 ); GlobalUnlock(hDevMode); } if (hDevNames) { LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames); if (lpDevNames) { // TODO: Unicode-ification // Get the port name // port is obsolete in WIN32 // m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset); // Get the printer name wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset; // Not sure if we should check for this mismatch // wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!"); if (!printerName.empty()) data.SetPrinterName( printerName ); GlobalUnlock(hDevNames); } } return true; }