* Enable halftone configuration options if requested by printer driver

only.
* WIP: Driver specific generic capabilities.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39153 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Pfeiffer 2010-10-26 09:48:36 +00:00
parent 2ca94d9be9
commit 308f0e195d
9 changed files with 179 additions and 63 deletions
headers/libs/print/libprint
src
add-ons/print/drivers
canon_lips
pcl5
pcl6
postscript
libs/print/libprint

@ -35,6 +35,8 @@ public:
private: private:
void UpdateButtonEnabledState(); void UpdateButtonEnabledState();
bool IsHalftoneConfigurationNeeded();
void CreateHalftoneConfigurationUI();
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message, void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
PrinterCap::CapID category, int id); PrinterCap::CapID category, int id);
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message, void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
@ -44,6 +46,7 @@ private:
BRadioButton* CreatePageSelectionItem(const char* name, const char* label, BRadioButton* CreatePageSelectionItem(const char* name, const char* label,
JobData::PageSelection pageSelection); JobData::PageSelection pageSelection);
void AllowOnlyDigits(BTextView* textView, int maxDigits); void AllowOnlyDigits(BTextView* textView, int maxDigits);
void UpdateHalftonePreview();
JobData::Color Color(); JobData::Color Color();
Halftone::DitherType DitherType(); Halftone::DitherType DitherType();
float Gamma(); float Gamma();
@ -58,9 +61,11 @@ private:
const PrinterCap *fPrinterCap; const PrinterCap *fPrinterCap;
BPopUpMenu *fColorType; BPopUpMenu *fColorType;
BPopUpMenu *fDitherType; BPopUpMenu *fDitherType;
BMenuField *fDitherMenuField;
JSDSlider *fGamma; JSDSlider *fGamma;
JSDSlider *fInkDensity; JSDSlider *fInkDensity;
HalftoneView *fHalftone; HalftoneView *fHalftone;
BBox *fHalftoneBox;
BRadioButton *fAll; BRadioButton *fAll;
BCheckBox *fCollate; BCheckBox *fCollate;
BCheckBox *fReverse; BCheckBox *fReverse;

@ -21,6 +21,7 @@ struct BaseCap {
virtual ~BaseCap(); virtual ~BaseCap();
virtual int ID() const = 0; virtual int ID() const = 0;
const char* Key() const;
string fLabel; string fLabel;
bool fIsDefault; bool fIsDefault;
@ -108,6 +109,23 @@ struct ProtocolClassCap : public BaseCap {
}; };
struct DriverSpecificCap : public BaseCap {
enum Type {
kList,
kCheckBox,
kRange
};
DriverSpecificCap(const string& label,
bool isDefault, int category, Type type);
int ID() const;
int fCategory;
Type fType;
};
class PrinterData; class PrinterData;
class PrinterCap { class PrinterCap {
@ -124,9 +142,16 @@ public:
kBindingLocation, kBindingLocation,
kColor, kColor,
kProtocolClass, kProtocolClass,
kDriverSpecifcCapababilities,
// Static boolean settings follow. // Static boolean settings follow.
// For them isSupport() has to be implemented only. // For them isSupport() has to be implemented only.
kCopyCommand, // supports printer page copy command? kCopyCommand, // supports printer page copy command?
kHalftone, // needs the printer driver the configuration
// for class Halftone?
// The driver specific generic capabilities start here
kDriverSpecificCapabablitiesBegin = 100
}; };
virtual int countCap(CapID category) const = 0; virtual int countCap(CapID category) const = 0;

@ -155,6 +155,7 @@ Lips3Cap::isSupport(CapID capid) const
case kResolution: case kResolution:
case kColor: case kColor:
case kCopyCommand: case kCopyCommand:
case kHalftone:
return true; return true;
default: default:
return false; return false;

@ -220,6 +220,7 @@ Lips4Cap::isSupport(CapID capid) const
case kBindingLocation: case kBindingLocation:
case kColor: case kColor:
case kCopyCommand: case kCopyCommand:
case kHalftone:
return true; return true;
default: default:
return false; return false;

@ -152,6 +152,7 @@ PCL5Cap::isSupport(CapID capid) const
case kPaperSource: case kPaperSource:
case kResolution: case kResolution:
case kColor: case kColor:
case kHalftone:
return true; return true;
default: default:
return false; return false;

@ -335,6 +335,7 @@ PCL6Cap::isSupport(CapID capid) const
case kCopyCommand: case kCopyCommand:
case kPrintStyle: case kPrintStyle:
case kProtocolClass: case kProtocolClass:
case kHalftone:
return true; return true;
default: default:
return false; return false;

@ -151,6 +151,7 @@ PSCap::isSupport(CapID capid) const
case kPaperSource: case kPaperSource:
case kResolution: case kResolution:
case kColor: case kColor:
case kHalftone:
return true; return true;
default: default:
return false; return false;

@ -133,9 +133,27 @@ JobSetupView::JobSetupView(JobData *job_data, PrinterData *printer_data,
const PrinterCap *printer_cap) const PrinterCap *printer_cap)
: :
BView("jobSetup", B_WILL_DRAW), BView("jobSetup", B_WILL_DRAW),
fCopies(NULL),
fFromPage(NULL),
fToPage(NULL),
fJobData(job_data), fJobData(job_data),
fPrinterData(printer_data), fPrinterData(printer_data),
fPrinterCap(printer_cap) fPrinterCap(printer_cap),
fColorType(NULL),
fDitherType(NULL),
fGamma(NULL),
fInkDensity(NULL),
fHalftone(NULL),
fAll(NULL),
fCollate(NULL),
fReverse(NULL),
fPages(NULL),
fPaperFeed(NULL),
fDuplex(NULL),
fNup(NULL),
fAllPages(NULL),
fOddNumberedPages(NULL),
fEvenNumberedPages(NULL)
{ {
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
} }
@ -182,48 +200,8 @@ JobSetupView::AttachedToWindow()
BMenuField* colorMenuField = new BMenuField("color", "Color:", fColorType); BMenuField* colorMenuField = new BMenuField("color", "Color:", fColorType);
fColorType->SetTargetForItems(this); fColorType->SetTargetForItems(this);
// dither type if (IsHalftoneConfigurationNeeded())
fDitherType = new BPopUpMenu(""); CreateHalftoneConfigurationUI();
fDitherType->SetRadioMode(true);
FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes, sizeof(gDitherTypes) /
sizeof(gDitherTypes[0]), fJobData->getDitherType());
BMenuField* ditherMenuField = new BMenuField("dithering", "Dot Pattern:",
fDitherType);
fDitherType->SetTargetForItems(this);
// halftone preview view
BBox* halftoneBox = new BBox("halftoneBox");
halftoneBox->SetBorder(B_PLAIN_BORDER);
// TODO make layout compatible
BSize size(240, 14 * 4);
BRect rect(0, 0, size.width, size.height);
fHalftone = new HalftoneView(rect, "halftone",
B_FOLLOW_ALL, B_WILL_DRAW);
fHalftone->SetExplicitMinSize(size);
fHalftone->SetExplicitMaxSize(size);
// gamma
fGamma = new JSDSlider("gamma", "Gamma", new BMessage(kMsgQuality),
-300, 300);
fGamma->SetLimitLabels("Lighter", "Darker");
fGamma->SetValue((int32)(100 * log(fJobData->getGamma()) / log(2.0)));
fGamma->SetHashMarks(B_HASH_MARKS_BOTH);
fGamma->SetHashMarkCount(7);
fGamma->SetModificationMessage(new BMessage(kMsgQuality));
fGamma->SetTarget(this);
// ink density
fInkDensity = new JSDSlider("inkDensity", "Ink Usage",
new BMessage(kMsgQuality), 0, 127);
fInkDensity->SetLimitLabels("Min", "Max");
fInkDensity->SetValue((int32)fJobData->getInkDensity());
fInkDensity->SetHashMarks(B_HASH_MARKS_BOTH);
fInkDensity->SetHashMarkCount(10);
fInkDensity->SetModificationMessage(new BMessage(kMsgQuality));
fInkDensity->SetTarget(this);
// page range // page range
@ -351,21 +329,26 @@ JobSetupView::AttachedToWindow()
BButton* ok = new BButton("ok", "OK", new BMessage(kMsgOK)); BButton* ok = new BButton("ok", "OK", new BMessage(kMsgOK));
ok->MakeDefault(true); ok->MakeDefault(true);
BGroupView* halftoneGroup = new BGroupView(B_VERTICAL, 0); if (IsHalftoneConfigurationNeeded()) {
BGroupLayout* halftoneLayout = halftoneGroup->GroupLayout(); BGroupView* halftoneGroup = new BGroupView(B_VERTICAL, 0);
halftoneLayout->AddView(fHalftone); BGroupLayout* halftoneLayout = halftoneGroup->GroupLayout();
halftoneBox->AddChild(halftoneGroup); halftoneLayout->AddView(fHalftone);
fHalftoneBox->AddChild(halftoneGroup);
}
BGridView* qualityGrid = new BGridView(); BGridView* qualityGrid = new BGridView();
BGridLayout* qualityGridLayout = qualityGrid->GridLayout(); BGridLayout* qualityGridLayout = qualityGrid->GridLayout();
qualityGridLayout->AddItem(colorMenuField->CreateLabelLayoutItem(), 0, 0); qualityGridLayout->AddItem(colorMenuField->CreateLabelLayoutItem(), 0, 0);
qualityGridLayout->AddItem(colorMenuField->CreateMenuBarLayoutItem(), 1, 0); qualityGridLayout->AddItem(colorMenuField->CreateMenuBarLayoutItem(), 1, 0);
qualityGridLayout->AddItem(ditherMenuField->CreateLabelLayoutItem(), 0, 1); if (IsHalftoneConfigurationNeeded()) {
qualityGridLayout->AddItem(ditherMenuField->CreateMenuBarLayoutItem(), 1, qualityGridLayout->AddItem(fDitherMenuField->CreateLabelLayoutItem(),
1); 0, 1);
qualityGridLayout->AddView(fGamma, 0, 2, 2); qualityGridLayout->AddItem(fDitherMenuField->CreateMenuBarLayoutItem(),
qualityGridLayout->AddView(fInkDensity, 0, 3, 2); 1, 1);
qualityGridLayout->AddView(halftoneBox, 0, 4, 2); qualityGridLayout->AddView(fGamma, 0, 2, 2);
qualityGridLayout->AddView(fInkDensity, 0, 3, 2);
qualityGridLayout->AddView(fHalftoneBox, 0, 4, 2);
}
qualityGridLayout->SetSpacing(0, 0); qualityGridLayout->SetSpacing(0, 0);
qualityGridLayout->SetInsets(5, 5, 5, 5); qualityGridLayout->SetInsets(5, 5, 5, 5);
qualityBox->AddChild(qualityGrid); qualityBox->AddChild(qualityGrid);
@ -443,13 +426,75 @@ JobSetupView::AttachedToWindow()
.SetInsets(0, 0, 0, 0) .SetInsets(0, 0, 0, 0)
); );
fHalftone->preview(fJobData->getGamma(), fJobData->getInkDensity(), /* TODO remove
fJobData->getDitherType(), fJobData->getColor() != JobData::kMonochrome); if (IsHalftoneConfigurationNeeded())
fHalftone->preview(fJobData->getGamma(), fJobData->getInkDensity(),
fJobData->getDitherType(),
fJobData->getColor() != JobData::kMonochrome);
*/
UpdateHalftonePreview();
UpdateButtonEnabledState(); UpdateButtonEnabledState();
} }
bool
JobSetupView::IsHalftoneConfigurationNeeded()
{
return fPrinterCap->isSupport(PrinterCap::kHalftone);
}
void
JobSetupView::CreateHalftoneConfigurationUI()
{
// dither type
fDitherType = new BPopUpMenu("");
fDitherType->SetRadioMode(true);
FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes,
sizeof(gDitherTypes) / sizeof(gDitherTypes[0]),
fJobData->getDitherType());
fDitherMenuField = new BMenuField("dithering", "Dot Pattern:",
fDitherType);
fDitherType->SetTargetForItems(this);
// halftone preview view
fHalftoneBox = new BBox("halftoneBox");
fHalftoneBox->SetBorder(B_PLAIN_BORDER);
// TODO make layout compatible
BSize size(240, 14 * 4);
BRect rect(0, 0, size.width, size.height);
fHalftone = new HalftoneView(rect, "halftone",
B_FOLLOW_ALL, B_WILL_DRAW);
fHalftone->SetExplicitMinSize(size);
fHalftone->SetExplicitMaxSize(size);
// gamma
fGamma = new JSDSlider("gamma", "Gamma", new BMessage(kMsgQuality),
-300, 300);
fGamma->SetLimitLabels("Lighter", "Darker");
fGamma->SetValue((int32)(100 * log(fJobData->getGamma()) / log(2.0)));
fGamma->SetHashMarks(B_HASH_MARKS_BOTH);
fGamma->SetHashMarkCount(7);
fGamma->SetModificationMessage(new BMessage(kMsgQuality));
fGamma->SetTarget(this);
// ink density
fInkDensity = new JSDSlider("inkDensity", "Ink Usage",
new BMessage(kMsgQuality), 0, 127);
fInkDensity->SetLimitLabels("Min", "Max");
fInkDensity->SetValue((int32)fJobData->getInkDensity());
fInkDensity->SetHashMarks(B_HASH_MARKS_BOTH);
fInkDensity->SetHashMarkCount(10);
fInkDensity->SetModificationMessage(new BMessage(kMsgQuality));
fInkDensity->SetTarget(this);
}
void void
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message, JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
PrinterCap::CapID category, int id) PrinterCap::CapID category, int id)
@ -472,7 +517,7 @@ JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
const BaseCap* capability = *capabilities; const BaseCap* capability = *capabilities;
if (message != kMsgNone) if (message != kMsgNone)
item = new BMenuItem(capability->fLabel.c_str(), item = new BMenuItem(capability->fLabel.c_str(),
new BMessage(kMsgQuality)); new BMessage(message));
else else
item = new BMenuItem(capability->fLabel.c_str(), NULL); item = new BMenuItem(capability->fLabel.c_str(), NULL);
@ -542,8 +587,7 @@ JobSetupView::MessageReceived(BMessage *msg)
break; break;
case kMsgQuality: case kMsgQuality:
fHalftone->preview(Gamma(), InkDensity(), DitherType(), UpdateHalftonePreview();
Color() != JobData::kMonochrome);
break; break;
case kMsgCollateChanged: case kMsgCollateChanged:
@ -557,6 +601,17 @@ JobSetupView::MessageReceived(BMessage *msg)
} }
void
JobSetupView::UpdateHalftonePreview()
{
if (!IsHalftoneConfigurationNeeded())
return;
fHalftone->preview(Gamma(), InkDensity(), DitherType(),
Color() != JobData::kMonochrome);
}
JobData::Color JobData::Color
JobSetupView::Color() JobSetupView::Color()
{ {
@ -613,9 +668,11 @@ JobSetupView::UpdateJobData(bool showPreview)
{ {
fJobData->setShowPreview(showPreview); fJobData->setShowPreview(showPreview);
fJobData->setColor(Color()); fJobData->setColor(Color());
fJobData->setGamma(Gamma()); if (IsHalftoneConfigurationNeeded()) {
fJobData->setInkDensity(InkDensity()); fJobData->setGamma(Gamma());
fJobData->setDitherType(DitherType()); fJobData->setInkDensity(InkDensity());
fJobData->setDitherType(DitherType());
}
int first_page; int first_page;
int last_page; int last_page;

@ -19,6 +19,13 @@ BaseCap::~BaseCap()
} }
const char*
BaseCap::Key() const
{
return fKey.c_str();
}
PaperCap::PaperCap(const string &label, bool isDefault, JobData::Paper paper, PaperCap::PaperCap(const string &label, bool isDefault, JobData::Paper paper,
const BRect &paperRect, const BRect &physicalRect) const BRect &paperRect, const BRect &physicalRect)
: :
@ -151,6 +158,23 @@ ProtocolClassCap::ID() const
} }
DriverSpecificCap::DriverSpecificCap(const string& label, bool isDefault,
int category, Type type)
:
BaseCap(label, isDefault),
fCategory(category),
fType(type)
{
}
int
DriverSpecificCap::ID() const
{
return fCategory;
}
PrinterCap::PrinterCap(const PrinterData *printer_data) PrinterCap::PrinterCap(const PrinterData *printer_data)
: fPrinterData(printer_data), : fPrinterData(printer_data),
fPrinterID(kUnknownPrinter) fPrinterID(kUnknownPrinter)
@ -163,7 +187,7 @@ PrinterCap::~PrinterCap()
} }
const BaseCap * const BaseCap*
PrinterCap::getDefaultCap(CapID category) const PrinterCap::getDefaultCap(CapID category) const
{ {
int count = countCap(category); int count = countCap(category);