Added scaling ability and visualization of the options Reverse and Collate.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10619 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Pfeiffer 2005-01-09 17:42:53 +00:00
parent 1c921c1e06
commit d225778e9a
5 changed files with 198 additions and 89 deletions

View File

@ -147,7 +147,7 @@ void GraphicsDriver::cleanupBitmap()
fView = NULL;
}
BPoint get_scale(JobData *org_job_data)
static BPoint get_scale(JobData *org_job_data)
{
float width;
float height;
@ -224,11 +224,14 @@ BPoint get_scale(JobData *org_job_data)
break;
}
scale.x = scale.x * org_job_data->getScaling() / 100.0;
scale.y = scale.y * org_job_data->getScaling() / 100.0;
DBGMSG(("real scale = %f, %f\n", scale.x, scale.y));
return scale;
}
BPoint get_offset(
static BPoint get_offset(
int index,
const BPoint *scale,
JobData *org_job_data)
@ -237,8 +240,8 @@ BPoint get_offset(
offset.x = 0;
offset.y = 0;
float width = org_job_data->getPrintableRect().Width();
float height = org_job_data->getPrintableRect().Height();
float width = org_job_data->getScaledPrintableRect().Width();
float height = org_job_data->getScaledPrintableRect().Height();
switch (org_job_data->getNup()) {
case 1:
@ -321,6 +324,7 @@ BPoint get_offset(
return offset;
}
// print the specified pages on a physical page
bool GraphicsDriver::printPage(PageDataList *pages)
{
#ifndef USE_PREVIEW_FOR_DEBUG
@ -333,11 +337,13 @@ bool GraphicsDriver::printPage(PageDataList *pages)
}
do {
// clear the physical page
fView->SetScale(1.0);
fView->SetHighColor(255, 255, 255);
fView->ConstrainClippingRegion(NULL);
fView->FillRect(fView->Bounds());
BPoint scale = get_scale(fOrgJobData);
float real_scale = min(scale.x, scale.y) * fOrgJobData->getXres() / 72.0f;
fView->SetScale(real_scale);
@ -349,7 +355,7 @@ bool GraphicsDriver::printPage(PageDataList *pages)
BPoint left_top(get_offset(page_index++, &scale, fOrgJobData));
left_top.x -= x;
left_top.y -= y;
BRect clip(fOrgJobData->getPrintableRect());
BRect clip(fOrgJobData->getScaledPrintableRect());
clip.OffsetTo(left_top);
BRegion *region = new BRegion();
region->Set(clip);
@ -438,6 +444,7 @@ bool GraphicsDriver::printDocument(SpoolData *spool_data)
do {
DBGMSG(("page index = %d\n", page_index));
// collect the pages to be printed on the physical page
nup = fOrgJobData->getNup();
PageDataList pages;
do {
@ -450,7 +457,8 @@ bool GraphicsDriver::printDocument(SpoolData *spool_data)
success = startPage(page_index);
if (!success)
break;
// print the pages on the physical page
fView->Window()->Lock();
success = printPage(&pages);
fView->Window()->Unlock();

View File

@ -17,6 +17,7 @@ StaticLibrary print :
JobSetupDlg.cpp
PackBits.cpp
PageSetupDlg.cpp
PagesView.cpp
Preview.cpp
PrinterData.cpp
PrinterDriver.cpp

View File

@ -9,28 +9,30 @@
#include "PrinterCap.h"
#include "DbgMsg.h"
const char *kJDXRes = "xres";
const char *kJDYRes = "yres";
const char *kJDCopies = "copies";
const char *kJDOrientation = "orientation";
const char *kJDScaling = "scaling";
const char *kJDPaperRect = "paper_rect";
const char *kJDPrintableRect = "printable_rect";
const char *kJDFirstPage = "first_page";
const char *kJDLastPage = "last_page";
static const char *kJDXRes = "xres";
static const char *kJDYRes = "yres";
static const char *kJDCopies = "copies";
static const char *kJDOrientation = "orientation";
static const char *kJDScaling = "scale";
static const char *kJDScaledPaperRect = "paper_rect";
static const char *kJDScaledPrintableRect = "printable_rect";
static const char *kJDFirstPage = "first_page";
static const char *kJDLastPage = "last_page";
const char *kJDPaper = "JJJJ_paper";
const char *kJDNup = "JJJJ_nup";
const char *kJDGamma = "JJJJ_gamma";
const char *kJDInkDensity = "JJJJ_ink_density";
const char *kJDPaperSource = "JJJJ_paper_source";
const char *kJDCollate = "JJJJ_collate";
const char *kJDReverse = "JJJJ_reverse";
const char *kJDPrintStyle = "JJJJ_print_style";
const char *kJDBindingLocation = "JJJJ_binding_location";
const char *kJDPageOrder = "JJJJ_page_order";
const char *kJDColor = "JJJJ_color";
const char *kJDDitherType = "JJJJ_dither_type";
static const char *kJDPaper = "JJJJ_paper";
static const char *kJDNup = "JJJJ_nup";
static const char *kJDGamma = "JJJJ_gamma";
static const char *kJDInkDensity = "JJJJ_ink_density";
static const char *kJDPaperSource = "JJJJ_paper_source";
static const char *kJDCollate = "JJJJ_collate";
static const char *kJDReverse = "JJJJ_reverse";
static const char *kJDPrintStyle = "JJJJ_print_style";
static const char *kJDBindingLocation = "JJJJ_binding_location";
static const char *kJDPageOrder = "JJJJ_page_order";
static const char *kJDColor = "JJJJ_color";
static const char *kJDDitherType = "JJJJ_dither_type";
static const char *kJDPaperRect = "JJJJ_paper_rect";
static const char* kJDPrintableRect = "JJJJ_printable_rect";
JobData::JobData(BMessage *msg, const PrinterCap *cap, Settings settings)
{
@ -43,56 +45,60 @@ JobData::~JobData()
JobData::JobData(const JobData &job_data)
{
fPaper = job_data.fPaper;
fXRes = job_data.fXRes;
fYRes = job_data.fYRes;
fOrientation = job_data.fOrientation;
fScaling = job_data.fScaling;
fPaperRect = job_data.fPaperRect;
fPrintableRect = job_data.fPrintableRect;
fNup = job_data.fNup;
fFirstPage = job_data.fFirstPage;
fLastPage = job_data.fLastPage;
fGamma = job_data.fGamma;
fInkDensity = job_data.fInkDensity;
fPaperSource = job_data.fPaperSource;
fCopies = job_data.fCopies;
fCollate = job_data.fCollate;
fReverse = job_data.fReverse;
fPrintStyle = job_data.fPrintStyle;
fBindingLocation = job_data.fBindingLocation;
fPageOrder = job_data.fPageOrder;
fSettings = job_data.fSettings;
fMsg = job_data.fMsg;
fColor = job_data.fColor;
fDitherType = job_data.fDitherType;
fPaper = job_data.fPaper;
fXRes = job_data.fXRes;
fYRes = job_data.fYRes;
fOrientation = job_data.fOrientation;
fScaling = job_data.fScaling;
fPaperRect = job_data.fPaperRect;
fScaledPaperRect = job_data.fScaledPaperRect;
fPrintableRect = job_data.fPrintableRect;
fScaledPrintableRect = job_data.fScaledPrintableRect;
fNup = job_data.fNup;
fFirstPage = job_data.fFirstPage;
fLastPage = job_data.fLastPage;
fGamma = job_data.fGamma;
fInkDensity = job_data.fInkDensity;
fPaperSource = job_data.fPaperSource;
fCopies = job_data.fCopies;
fCollate = job_data.fCollate;
fReverse = job_data.fReverse;
fPrintStyle = job_data.fPrintStyle;
fBindingLocation = job_data.fBindingLocation;
fPageOrder = job_data.fPageOrder;
fSettings = job_data.fSettings;
fMsg = job_data.fMsg;
fColor = job_data.fColor;
fDitherType = job_data.fDitherType;
}
JobData &JobData::operator = (const JobData &job_data)
{
fPaper = job_data.fPaper;
fXRes = job_data.fXRes;
fYRes = job_data.fYRes;
fOrientation = job_data.fOrientation;
fScaling = job_data.fScaling;
fPaperRect = job_data.fPaperRect;
fPrintableRect = job_data.fPrintableRect;
fNup = job_data.fNup;
fFirstPage = job_data.fFirstPage;
fLastPage = job_data.fLastPage;
fGamma = job_data.fGamma;
fInkDensity = job_data.fInkDensity;
fPaperSource = job_data.fPaperSource;
fCopies = job_data.fCopies;
fCollate = job_data.fCollate;
fReverse = job_data.fReverse;
fPrintStyle = job_data.fPrintStyle;
fBindingLocation = job_data.fBindingLocation;
fPageOrder = job_data.fPageOrder;
fSettings = job_data.fSettings;
fMsg = job_data.fMsg;
fColor = job_data.fColor;
fDitherType = job_data.fDitherType;
fPaper = job_data.fPaper;
fXRes = job_data.fXRes;
fYRes = job_data.fYRes;
fOrientation = job_data.fOrientation;
fScaling = job_data.fScaling;
fPaperRect = job_data.fPaperRect;
fScaledPaperRect = job_data.fScaledPaperRect;
fPrintableRect = job_data.fPrintableRect;
fScaledPrintableRect = job_data.fScaledPrintableRect;
fNup = job_data.fNup;
fFirstPage = job_data.fFirstPage;
fLastPage = job_data.fLastPage;
fGamma = job_data.fGamma;
fInkDensity = job_data.fInkDensity;
fPaperSource = job_data.fPaperSource;
fCopies = job_data.fCopies;
fCollate = job_data.fCollate;
fReverse = job_data.fReverse;
fPrintStyle = job_data.fPrintStyle;
fBindingLocation = job_data.fBindingLocation;
fPageOrder = job_data.fPageOrder;
fSettings = job_data.fSettings;
fMsg = job_data.fMsg;
fColor = job_data.fColor;
fDitherType = job_data.fDitherType;
return *this;
}
@ -144,10 +150,18 @@ void JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
fPaperRect = msg->FindRect(kJDPaperRect);
}
if (msg->HasRect(kJDScaledPaperRect)) {
fScaledPaperRect = msg->FindRect(kJDScaledPaperRect);
}
if (msg->HasRect(kJDPrintableRect)) {
fPrintableRect = msg->FindRect(kJDPrintableRect);
}
if (msg->HasRect(kJDScaledPrintableRect)) {
fScaledPrintableRect = msg->FindRect(kJDScaledPrintableRect);
}
if (msg->HasInt32(kJDFirstPage))
fFirstPage = msg->FindInt32(kJDFirstPage);
else
@ -262,11 +276,21 @@ void JobData::save(BMessage *msg)
else
msg->AddRect(kJDPaperRect, fPaperRect);
if (msg->HasRect(kJDScaledPaperRect))
msg->ReplaceRect(kJDScaledPaperRect, fScaledPaperRect);
else
msg->AddRect(kJDScaledPaperRect, fScaledPaperRect);
if (msg->HasRect(kJDPrintableRect))
msg->ReplaceRect(kJDPrintableRect, fPrintableRect);
else
msg->AddRect(kJDPrintableRect, fPrintableRect);
if (msg->HasRect(kJDScaledPrintableRect))
msg->ReplaceRect(kJDScaledPrintableRect, fScaledPrintableRect);
else
msg->AddRect(kJDScaledPrintableRect, fScaledPrintableRect);
// page settings end here; don't store job settings in message
if (fSettings == kPageSettings) return;

View File

@ -36,6 +36,7 @@
#include "JobSetupDlg.h"
#include "JobData.h"
#include "JSDSlider.h"
#include "PagesView.h"
#include "PrinterData.h"
#include "PrinterCap.h"
#include "DbgMsg.h"
@ -138,6 +139,11 @@ using namespace std;
#define REVERSE_WIDTH PAPERFEED_WIDTH
#define REVERSE_HEIGHT 16
#define PAGES_H PAPERFEED_H
#define PAGES_V REVERSE_V + COLLATE_HEIGHT + 5
#define PAGES_WIDTH PAPERFEED_WIDTH
#define PAGES_HEIGHT 40
#define PRINT_BUTTON_WIDTH 70
#define PRINT_BUTTON_HEIGHT 20
@ -251,6 +257,12 @@ const BRect reverse_rect(
REVERSE_H + REVERSE_WIDTH,
REVERSE_V + REVERSE_HEIGHT);
const BRect pages_rect(
PAGES_H,
PAGES_V,
PAGES_H + PAGES_WIDTH,
PAGES_V + PAGES_HEIGHT);
const BRect ok_rect(
PRINT_OK_BUTTON_H,
PRINT_OK_BUTTON_V,
@ -330,6 +342,8 @@ enum {
kMsgCancel,
kMsgOK,
kMsgQuality,
kCollateChanged,
kReverseChanged,
};
JobSetupView::JobSetupView(BRect frame, JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
@ -397,10 +411,10 @@ void JobSetupView::AttachedToWindow()
}
if (!marked && item)
item->SetMarked(true);
menufield = new BMenuField(bpp_rect, "", "Color", fColorType);
menufield = new BMenuField(bpp_rect, "", "Color:", fColorType);
box->AddChild(menufield);
width = StringWidth("Color") + 10;
width = StringWidth("Color:") + 10;
menufield->SetDivider(width);
fColorType->SetTargetForItems(this);
@ -422,10 +436,10 @@ void JobSetupView::AttachedToWindow()
}
if (!marked && item)
item->SetMarked(true);
menufield = new BMenuField(dither_rect, "", "Dithering", fDitherType);
menufield = new BMenuField(dither_rect, "", "Dithering:", fDitherType);
box->AddChild(menufield);
width = StringWidth("Dithering") + 10;
width = StringWidth("Dithering:") + 10;
menufield->SetDivider(width);
fDitherType->SetTargetForItems(this);
@ -527,9 +541,9 @@ void JobSetupView::AttachedToWindow()
}
if (!marked)
item->SetMarked(true);
menufield = new BMenuField(paperfeed_rect, "", "Paper Source", fPaperFeed);
menufield = new BMenuField(paperfeed_rect, "", "Paper Source:", fPaperFeed);
AddChild(menufield);
width = StringWidth("Number of Copies") + 7;
width = StringWidth("Number of Copies:") + 7;
menufield->SetDivider(width);
/* Page Per Sheet */
@ -550,7 +564,7 @@ void JobSetupView::AttachedToWindow()
}
if (!marked)
item->SetMarked(true);
menufield = new BMenuField(nup_rect, "", "Page Per Sheet", fNup);
menufield = new BMenuField(nup_rect, "", "Page Per Sheet:", fNup);
menufield->SetDivider(width);
AddChild(menufield);
@ -566,7 +580,7 @@ void JobSetupView::AttachedToWindow()
/* copies */
copies = new BTextControl(copies_rect, "", "Number of Copies", "", NULL);
copies = new BTextControl(copies_rect, "", "Number of Copies:", "", NULL);
AddChild(copies);
copies->SetDivider(width);
@ -576,19 +590,28 @@ void JobSetupView::AttachedToWindow()
/* collate */
fCollate = new BCheckBox(collate_rect, "Collate", "Collate", NULL);
fCollate = new BCheckBox(collate_rect, "Collate", "Collate", new BMessage(kCollateChanged));
AddChild(fCollate);
if (fJobData->getCollate()) {
fCollate->SetValue(B_CONTROL_ON);
}
fCollate->SetTarget(this);
/* reverse */
fReverse = new BCheckBox(reverse_rect, "Reverse", "Reverse", NULL);
fReverse = new BCheckBox(reverse_rect, "Reverse", "Reverse", new BMessage(kReverseChanged));
AddChild(fReverse);
if (fJobData->getReverse()) {
fReverse->SetValue(B_CONTROL_ON);
}
fReverse->SetTarget(this);
/* pages view */
fPages = new PagesView(pages_rect, "Pages", B_FOLLOW_ALL, B_WILL_DRAW);
AddChild(fPages);
fPages->setCollate(fJobData->getCollate());
fPages->setReverse(fJobData->getReverse());
/* cancel */
@ -623,6 +646,14 @@ void JobSetupView::MessageReceived(BMessage *msg)
fHalftone->preview(getGamma(), getInkDensity(), getDitherType(), getColor() == JobData::kColor);
break;
case kCollateChanged:
fPages->setCollate(fCollate->Value() == B_CONTROL_ON);
break;
case kReverseChanged:
fPages->setReverse(fReverse->Value() == B_CONTROL_ON);
break;
}
}
@ -738,7 +769,7 @@ bool JobSetupView::UpdateJobData()
//====================================================================
filter_result PrintKeyFilter(BMessage *msg, BHandler **target, BMessageFilter *filter)
static filter_result PrintKeyFilter(BMessage *msg, BHandler **target, BMessageFilter *filter)
{
BWindow *window = (BWindow *)filter->Looper();
@ -809,7 +840,7 @@ void JobSetupDlg::MessageReceived(BMessage *msg)
case kMsgCancel:
PostMessage(B_QUIT_REQUESTED);
break;
default:
DialogWindow::MessageReceived(msg);
break;

View File

@ -24,6 +24,7 @@
#include <PrintJob.h>
#include <RadioButton.h>
#include <Rect.h>
#include <String.h>
#include <TextControl.h>
#include <View.h>
@ -32,6 +33,7 @@
#include "PrinterData.h"
#include "PrinterCap.h"
#include "DbgMsg.h"
#include "BeUtils.h"
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
using namespace std;
@ -40,11 +42,12 @@ using namespace std;
#endif
#define PAGESETUP_WIDTH 270
#define PAGESETUP_HEIGHT 125
#define PAGESETUP_HEIGHT 135
#define MENU_HEIGHT 16
#define BUTTON_WIDTH 70
#define BUTTON_HEIGHT 20
#define TEXT_HEIGHT 16
#define ORIENT_H 10
#define ORIENT_V 10
@ -57,13 +60,19 @@ using namespace std;
#define PAPER_V 20
#define PAPER_WIDTH 200
#define PAPER_HEIGHT MENU_HEIGHT
#define PAPER_TEXT "Paper Size"
#define PAPER_TEXT "Paper Size:"
#define RES_H PAPER_H
#define RES_V PAPER_V + 24
#define RES_WIDTH 150
#define RES_HEIGHT MENU_HEIGHT
#define RES_TEXT "Resolution"
#define RES_TEXT "Resolution:"
#define SCALE_H PAPER_H
#define SCALE_V RES_V + 24
#define SCALE_WIDTH 100
#define SCALE_HEIGHT TEXT_HEIGHT
#define SCALE_TEXT "Scale [%]:"
#define OK_H (PAGESETUP_WIDTH - BUTTON_WIDTH - 11)
#define OK_V (PAGESETUP_HEIGHT - BUTTON_HEIGHT - 11)
@ -96,6 +105,12 @@ const BRect RESOLUTION_RECT(
RES_H + RES_WIDTH,
RES_V + RES_HEIGHT);
const BRect SCALE_RECT(
SCALE_H,
SCALE_V,
SCALE_H + SCALE_WIDTH,
SCALE_V + SCALE_HEIGHT);
const BRect OK_RECT(
OK_H,
OK_V,
@ -195,6 +210,24 @@ void PageSetupView::AttachedToWindow()
AddChild(menufield);
menufield->SetDivider(width);
/* scale */
BString scale;
scale << (int)fJobData->getScaling();
fScaling = new BTextControl(SCALE_RECT, "scale", "Scale [%]:",
scale.String(),
NULL, B_FOLLOW_RIGHT);
int num;
for (num = 0; num <= 255; num++) {
fScaling->TextView()->DisallowChar(num);
}
for (num = 0; num <= 9; num++) {
fScaling->TextView()->AllowChar('0' + num);
}
fScaling->TextView()->SetMaxBytes(3);
fScaling->SetDivider(width);
AddChild(fScaling);
/* cancel */
button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(kMsgCancel));
@ -259,9 +292,21 @@ bool PageSetupView::UpdateJobData()
swap(&printable_rect.right, &printable_rect.bottom);
}
fJobData->setScaling(100.0);
float scaling = atoi(fScaling->Text());
if (scaling <= 0.0) { // sanity check
scaling = 100.0;
}
if (scaling > 1000.0) {
scaling = 1000.0;
}
float scalingR = 100.0 / scaling;
fJobData->setScaling(scaling);
fJobData->setPaperRect(paper_rect);
fJobData->setScaledPaperRect(ScaleRect(paper_rect, scalingR));
fJobData->setPrintableRect(printable_rect);
fJobData->setScaledPrintableRect(ScaleRect(printable_rect, scalingR));
fJobData->save();
return true;