Moved files to ../shared/libprint
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6373 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* AboutBox.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <Window.h>
|
|
||||||
#include <View.h>
|
|
||||||
#include <Button.h>
|
|
||||||
|
|
||||||
#include "AboutBox.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class AboutBoxView : public BView {
|
|
||||||
public:
|
|
||||||
AboutBoxView(BRect frame, const char *driver_name, const char *version, const char *copyright);
|
|
||||||
virtual void Draw(BRect);
|
|
||||||
virtual void AttachedToWindow();
|
|
||||||
|
|
||||||
private:
|
|
||||||
string __driver_name;
|
|
||||||
string __version;
|
|
||||||
string __copyright;
|
|
||||||
};
|
|
||||||
|
|
||||||
AboutBoxView::AboutBoxView(BRect rect, const char *driver_name, const char *version, const char *copyright)
|
|
||||||
: BView(rect, "", B_FOLLOW_ALL, B_WILL_DRAW)
|
|
||||||
{
|
|
||||||
__driver_name = driver_name;
|
|
||||||
__version = version;
|
|
||||||
__copyright = copyright;
|
|
||||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
|
||||||
SetDrawingMode(B_OP_SELECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AboutBoxView::Draw(BRect)
|
|
||||||
{
|
|
||||||
SetHighColor(0, 0, 0);
|
|
||||||
DrawString(__driver_name.c_str(), BPoint(10.0f, 16.0f));
|
|
||||||
DrawString(" Driver for ");
|
|
||||||
SetHighColor(0, 0, 0xff);
|
|
||||||
DrawString("B");
|
|
||||||
SetHighColor(0xff, 0, 0);
|
|
||||||
DrawString("e");
|
|
||||||
SetHighColor(0, 0, 0);
|
|
||||||
DrawString("OS Version ");
|
|
||||||
DrawString(__version.c_str());
|
|
||||||
DrawString(__copyright.c_str(), BPoint(10.0f, 30.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define M_OK 1
|
|
||||||
|
|
||||||
void AboutBoxView::AttachedToWindow()
|
|
||||||
{
|
|
||||||
BRect rect;
|
|
||||||
rect.Set(110, 50, 175, 55);
|
|
||||||
BButton *button = new BButton(rect, "", "OK", new BMessage(M_OK));
|
|
||||||
AddChild(button);
|
|
||||||
button->MakeDefault(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
class AboutBoxWindow : public BWindow {
|
|
||||||
public:
|
|
||||||
AboutBoxWindow(BRect frame, const char *driver_name, const char *version, const char *copyright);
|
|
||||||
virtual void MessageReceived(BMessage *msg);
|
|
||||||
virtual bool QuitRequested();
|
|
||||||
};
|
|
||||||
|
|
||||||
AboutBoxWindow::AboutBoxWindow(BRect frame, const char *driver_name, const char *version, const char *copyright)
|
|
||||||
: BWindow(frame, "", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE )
|
|
||||||
{
|
|
||||||
char title[256];
|
|
||||||
sprintf(title, "About %s Driver", driver_name);
|
|
||||||
SetTitle(title);
|
|
||||||
AddChild(new AboutBoxView(Bounds(), driver_name, version, copyright));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AboutBoxWindow::MessageReceived(BMessage *msg)
|
|
||||||
{
|
|
||||||
switch (msg->what) {
|
|
||||||
case M_OK:
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AboutBoxWindow::QuitRequested()
|
|
||||||
{
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
AboutBox::AboutBox(const char *signature, const char *driver_name, const char *version, const char *copyright)
|
|
||||||
: BApplication(signature)
|
|
||||||
{
|
|
||||||
BRect rect;
|
|
||||||
rect.Set(100, 80, 400, 170);
|
|
||||||
AboutBoxWindow *window = new AboutBoxWindow(rect, driver_name, version, copyright);
|
|
||||||
window->Show();
|
|
||||||
}
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
/*
|
|
||||||
* DbgMsg.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdarg>
|
|
||||||
|
|
||||||
#include <Message.h>
|
|
||||||
#include <File.h>
|
|
||||||
#include <Directory.h>
|
|
||||||
#include <fs_attr.h>
|
|
||||||
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#ifdef DBG
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void write_debug_stream(const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, format);
|
|
||||||
FILE *f = fopen("/boot/home/libprint.log", "aw+");
|
|
||||||
vfprintf(f, format, ap);
|
|
||||||
fclose(f);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DUMP_BFILE(BFile *in, const char *path)
|
|
||||||
{
|
|
||||||
off_t size;
|
|
||||||
if (B_NO_ERROR == in->GetSize(&size)) {
|
|
||||||
uchar *buffer = new uchar[size];
|
|
||||||
in->Read(buffer, size);
|
|
||||||
BFile out(path, B_WRITE_ONLY | B_CREATE_FILE);
|
|
||||||
out.Write(buffer, size);
|
|
||||||
in->Seek(0, SEEK_SET);
|
|
||||||
delete [] buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DUMP_BMESSAGE(BMessage *msg)
|
|
||||||
{
|
|
||||||
uint32 i;
|
|
||||||
int32 j;
|
|
||||||
char *name = "";
|
|
||||||
uint32 type = 0;
|
|
||||||
int32 count = 0;
|
|
||||||
|
|
||||||
DBGMSG(("\t************ START - DUMP BMessage ***********\n"));
|
|
||||||
DBGMSG(("\taddress: 0x%x\n", (int)msg));
|
|
||||||
if (!msg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// DBGMSG(("\tmsg->what: 0x%x\n", msg->what));
|
|
||||||
DBGMSG(("\tmsg->what: %c%c%c%c\n",
|
|
||||||
*((char *)&msg->what + 3),
|
|
||||||
*((char *)&msg->what + 2),
|
|
||||||
*((char *)&msg->what + 1),
|
|
||||||
*((char *)&msg->what + 0)));
|
|
||||||
|
|
||||||
for (i= 0; msg->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i++) {
|
|
||||||
switch (type) {
|
|
||||||
case B_BOOL_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
bool aBool;
|
|
||||||
aBool = msg->FindBool(name, j);
|
|
||||||
DBGMSG(("\t%s, B_BOOL_TYPE[%d]: %s\n",
|
|
||||||
name, j, aBool ? "true" : "false"));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_INT8_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
int8 anInt8;
|
|
||||||
msg->FindInt8(name, j, &anInt8);
|
|
||||||
DBGMSG(("\t%s, B_INT8_TYPE[%d]: %d\n", name, j, (int)anInt8));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_INT16_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
int16 anInt16;
|
|
||||||
msg->FindInt16(name, j, &anInt16);
|
|
||||||
DBGMSG(("\t%s, B_INT16_TYPE[%d]: %d\n", name, j, (int)anInt16));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_INT32_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
int32 anInt32;
|
|
||||||
msg->FindInt32(name, j, &anInt32);
|
|
||||||
DBGMSG(("\t%s, B_INT32_TYPE[%d]: %d\n", name, j, (int)anInt32));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_INT64_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
int64 anInt64;
|
|
||||||
msg->FindInt64(name, j, &anInt64);
|
|
||||||
DBGMSG(("\t%s, B_INT64_TYPE[%d]: %d\n", name, j, (int)anInt64));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_FLOAT_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
float aFloat;
|
|
||||||
msg->FindFloat(name, j, &aFloat);
|
|
||||||
DBGMSG(("\t%s, B_FLOAT_TYPE[%d]: %f\n", name, j, aFloat));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_DOUBLE_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
double aDouble;
|
|
||||||
msg->FindDouble(name, j, &aDouble);
|
|
||||||
DBGMSG(("\t%s, B_DOUBLE_TYPE[%d]: %f\n", name, j, (float)aDouble));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_STRING_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
const char *string;
|
|
||||||
msg->FindString(name, j, &string);
|
|
||||||
DBGMSG(("\t%s, B_STRING_TYPE[%d]: %s\n", name, j, string));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_POINT_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
BPoint aPoint;
|
|
||||||
msg->FindPoint(name, j, &aPoint);
|
|
||||||
DBGMSG(("\t%s, B_POINT_TYPE[%d]: %f, %f\n",
|
|
||||||
name, j, aPoint.x, aPoint.y));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_RECT_TYPE:
|
|
||||||
for (j = 0; j < count; j++) {
|
|
||||||
BRect aRect;
|
|
||||||
msg->FindRect(name, j, &aRect);
|
|
||||||
DBGMSG(("\t%s, B_RECT_TYPE[%d]: %f, %f, %f, %f\n",
|
|
||||||
name, j, aRect.left, aRect.top, aRect.right, aRect.bottom));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_REF_TYPE:
|
|
||||||
case B_MESSAGE_TYPE:
|
|
||||||
case B_MESSENGER_TYPE:
|
|
||||||
case B_POINTER_TYPE:
|
|
||||||
DBGMSG(("\t%s, 0x%x, count: %d\n",
|
|
||||||
name ? name : "(null)", type, count));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DBGMSG(("\t%s, 0x%x, count: %d\n",
|
|
||||||
name ? name : "(null)", type, count));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
name = "";
|
|
||||||
type = 0;
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
DBGMSG(("\t************ END - DUMP BMessage ***********\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PD_DRIVER_NAME "Driver Name"
|
|
||||||
#define PD_PRINTER_NAME "Printer Name"
|
|
||||||
#define PD_COMMENTS "Comments"
|
|
||||||
|
|
||||||
void DUMP_BDIRECTORY(BDirectory *dir)
|
|
||||||
{
|
|
||||||
DUMP_BNODE(dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DUMP_BNODE(BNode *dir)
|
|
||||||
{
|
|
||||||
char buffer1[256];
|
|
||||||
char buffer2[256];
|
|
||||||
attr_info info;
|
|
||||||
int32 i;
|
|
||||||
float f;
|
|
||||||
BRect rc;
|
|
||||||
bool b;
|
|
||||||
|
|
||||||
DBGMSG(("\t************ STRAT - DUMP BNode ***********\n"));
|
|
||||||
|
|
||||||
dir->RewindAttrs();
|
|
||||||
while (dir->GetNextAttrName(buffer1) == B_NO_ERROR) {
|
|
||||||
dir->GetAttrInfo(buffer1, &info);
|
|
||||||
switch (info.type) {
|
|
||||||
case B_ASCII_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, buffer2, sizeof(buffer2));
|
|
||||||
DBGMSG(("\t%s, B_ASCII_TYPE: %s\n", buffer1, buffer2));
|
|
||||||
break;
|
|
||||||
case B_STRING_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, buffer2, sizeof(buffer2));
|
|
||||||
DBGMSG(("\t%s, B_STRING_TYPE: %s\n", buffer1, buffer2));
|
|
||||||
break;
|
|
||||||
case B_INT32_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, &i, sizeof(i));
|
|
||||||
DBGMSG(("\t%s, B_INT32_TYPE: %d\n", buffer1, i));
|
|
||||||
break;
|
|
||||||
case B_FLOAT_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, &f, sizeof(f));
|
|
||||||
DBGMSG(("\t%s, B_FLOAT_TYPE: %f\n", buffer1, f));
|
|
||||||
break;
|
|
||||||
case B_RECT_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, &rc, sizeof(rc));
|
|
||||||
DBGMSG(("\t%s, B_RECT_TYPE: %f, %f, %f, %f\n", buffer1, rc.left, rc.top, rc.right, rc.bottom));
|
|
||||||
break;
|
|
||||||
case B_BOOL_TYPE:
|
|
||||||
dir->ReadAttr(buffer1, info.type, 0, &b, sizeof(b));
|
|
||||||
DBGMSG(("\t%s, B_BOOL_TYPE: %d\n", buffer1, (int)b));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DBGMSG(("\t%s, %c%c%c%c\n",
|
|
||||||
buffer1,
|
|
||||||
*((char *)&info.type + 3),
|
|
||||||
*((char *)&info.type + 2),
|
|
||||||
*((char *)&info.type + 1),
|
|
||||||
*((char *)&info.type + 0)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DBGMSG(("\t************ END - DUMP BNode ***********\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* DBG */
|
|
||||||
@@ -1,654 +0,0 @@
|
|||||||
/*
|
|
||||||
* GraphicsDriver.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdarg>
|
|
||||||
|
|
||||||
#include <Alert.h>
|
|
||||||
#include <Bitmap.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include <PrintJob.h>
|
|
||||||
#include <Region.h>
|
|
||||||
#include <TextControl.h>
|
|
||||||
#include <TextControl.h>
|
|
||||||
#include <View.h>
|
|
||||||
#include <Directory.h>
|
|
||||||
#include <File.h>
|
|
||||||
|
|
||||||
#include "GraphicsDriver.h"
|
|
||||||
#include "PrintProcess.h"
|
|
||||||
#include "JobData.h"
|
|
||||||
#include "PrinterData.h"
|
|
||||||
#include "PrinterCap.h"
|
|
||||||
#include "Preview.h"
|
|
||||||
#include "Transport.h"
|
|
||||||
#include "ValidRect.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GraphicsDriver::GraphicsDriver(BMessage *msg, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: __msg(msg), __printer_data(printer_data), __printer_cap(printer_cap)
|
|
||||||
{
|
|
||||||
__view = NULL;
|
|
||||||
__bitmap = NULL;
|
|
||||||
__transport = NULL;
|
|
||||||
__org_job_data = NULL;
|
|
||||||
__real_job_data = NULL;
|
|
||||||
__spool_meta_data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GraphicsDriver::~GraphicsDriver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::setupData(BFile *spool_file, long page_count)
|
|
||||||
{
|
|
||||||
BMessage *msg = new BMessage();
|
|
||||||
msg->Unflatten(spool_file);
|
|
||||||
__org_job_data = new JobData(msg, __printer_cap);
|
|
||||||
DUMP_BMESSAGE(msg);
|
|
||||||
delete msg;
|
|
||||||
|
|
||||||
__real_job_data = new JobData(*__org_job_data);
|
|
||||||
BRect rc;
|
|
||||||
|
|
||||||
switch (__org_job_data->getNup()) {
|
|
||||||
case 2:
|
|
||||||
case 8:
|
|
||||||
case 32:
|
|
||||||
case 128:
|
|
||||||
rc.left = __org_job_data->getPrintableRect().top;
|
|
||||||
rc.top = __org_job_data->getPrintableRect().left;
|
|
||||||
rc.right = __org_job_data->getPrintableRect().bottom;
|
|
||||||
rc.bottom = __org_job_data->getPrintableRect().right;
|
|
||||||
__real_job_data->setPrintableRect(rc);
|
|
||||||
if (JobData::PORTRAIT == __org_job_data->getOrientation())
|
|
||||||
__real_job_data->setOrientation(JobData::LANDSCAPE);
|
|
||||||
else
|
|
||||||
__real_job_data->setOrientation(JobData::PORTRAIT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__org_job_data->getCollate() && page_count > 1) {
|
|
||||||
__real_job_data->setCopies(1);
|
|
||||||
__internal_copies = __org_job_data->getCopies();
|
|
||||||
} else {
|
|
||||||
__internal_copies = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
__spool_meta_data = new SpoolMetaData(spool_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::cleanupData()
|
|
||||||
{
|
|
||||||
delete __real_job_data;
|
|
||||||
delete __org_job_data;
|
|
||||||
delete __spool_meta_data;
|
|
||||||
__real_job_data = NULL;
|
|
||||||
__org_job_data = NULL;
|
|
||||||
__spool_meta_data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_MEMORY_SIZE (4 *1024 *1024)
|
|
||||||
|
|
||||||
void GraphicsDriver::setupBitmap()
|
|
||||||
{
|
|
||||||
__pixel_depth = color_space2pixel_depth(__org_job_data->getSurfaceType());
|
|
||||||
|
|
||||||
__page_width = (__real_job_data->getPrintableRect().IntegerWidth() * __org_job_data->getXres() + 71) / 72;
|
|
||||||
__page_height = (__real_job_data->getPrintableRect().IntegerHeight() * __org_job_data->getYres() + 71) / 72;
|
|
||||||
|
|
||||||
int widthByte = (__page_width * __pixel_depth + 7) / 8;
|
|
||||||
int size = widthByte * __page_height;
|
|
||||||
|
|
||||||
if (size < MAX_MEMORY_SIZE) {
|
|
||||||
__band_count = 0;
|
|
||||||
__band_width = __page_width;
|
|
||||||
__band_height = __page_height;
|
|
||||||
} else {
|
|
||||||
__band_count = (size + MAX_MEMORY_SIZE - 1) / MAX_MEMORY_SIZE;
|
|
||||||
if ((JobData::LANDSCAPE == __real_job_data->getOrientation()) && (__flags & GDF_ROTATE_BAND_BITMAP)) {
|
|
||||||
__band_width = (__page_width + __band_count - 1) / __band_count;
|
|
||||||
__band_height = __page_height;
|
|
||||||
} else {
|
|
||||||
__band_width = __page_width;
|
|
||||||
__band_height = (__page_height + __band_count - 1) / __band_count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DBGMSG(("****************\n"));
|
|
||||||
DBGMSG(("page_width = %d\n", __page_width));
|
|
||||||
DBGMSG(("page_height = %d\n", __page_height));
|
|
||||||
DBGMSG(("band_count = %d\n", __band_count));
|
|
||||||
DBGMSG(("band_height = %d\n", __band_height));
|
|
||||||
DBGMSG(("****************\n"));
|
|
||||||
|
|
||||||
BRect rect;
|
|
||||||
rect.Set(0, 0, __band_width - 1, __band_height - 1);
|
|
||||||
__bitmap = new BBitmap(rect, __org_job_data->getSurfaceType(), true);
|
|
||||||
__view = new BView(rect, "", B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
__bitmap->AddChild(__view);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::cleanupBitmap()
|
|
||||||
{
|
|
||||||
delete __bitmap;
|
|
||||||
__bitmap = NULL;
|
|
||||||
__view = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
BPoint get_scale(JobData *org_job_data)
|
|
||||||
{
|
|
||||||
float width;
|
|
||||||
float height;
|
|
||||||
BPoint scale;
|
|
||||||
|
|
||||||
scale.x = scale.y = 1.0f;
|
|
||||||
|
|
||||||
switch (org_job_data->getNup()) {
|
|
||||||
case 1:
|
|
||||||
scale.x = scale.y = 1.0f;
|
|
||||||
break;
|
|
||||||
case 2: /* 1x2 or 2x1 */
|
|
||||||
width = org_job_data->getPrintableRect().Width();
|
|
||||||
height = org_job_data->getPrintableRect().Height();
|
|
||||||
if (width < height) { // portrait
|
|
||||||
scale.x = height / 2.0f / width;
|
|
||||||
scale.y = width / height;
|
|
||||||
} else { // landscape
|
|
||||||
scale.x = height / width;
|
|
||||||
scale.y = width / 2.0f / height;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8: /* 2x4 or 4x2 */
|
|
||||||
width = org_job_data->getPrintableRect().Width();
|
|
||||||
height = org_job_data->getPrintableRect().Height();
|
|
||||||
if (width < height) {
|
|
||||||
scale.x = height / 4.0f / width;
|
|
||||||
scale.y = width / height / 2.0f;
|
|
||||||
} else {
|
|
||||||
scale.x = height / width / 2.0f;
|
|
||||||
scale.y = width / 4.0f / height;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 32: /* 4x8 or 8x4 */
|
|
||||||
width = org_job_data->getPrintableRect().Width();
|
|
||||||
height = org_job_data->getPrintableRect().Height();
|
|
||||||
if (width < height) {
|
|
||||||
scale.x = height / 8.0f / width;
|
|
||||||
scale.y = width / height / 4.0f;
|
|
||||||
} else {
|
|
||||||
scale.x = height / width / 4.0f;
|
|
||||||
scale.y = width / 8.0f / height;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4: /* 2x2 */
|
|
||||||
scale.x = scale.y = 1.0f / 2.0f;
|
|
||||||
break;
|
|
||||||
case 9: /* 3x3 */
|
|
||||||
scale.x = scale.y = 1.0f / 3.0f;
|
|
||||||
break;
|
|
||||||
case 16: /* 4x4 */
|
|
||||||
scale.x = scale.y = 1.0f / 4.0f;
|
|
||||||
break;
|
|
||||||
case 25: /* 5x5 */
|
|
||||||
scale.x = scale.y = 1.0f / 5.0f;
|
|
||||||
break;
|
|
||||||
case 36: /* 6x6 */
|
|
||||||
scale.x = scale.y = 1.0f / 6.0f;
|
|
||||||
break;
|
|
||||||
case 49: /* 7x7 */
|
|
||||||
scale.x = scale.y = 1.0f / 7.0f;
|
|
||||||
break;
|
|
||||||
case 64: /* 8x8 */
|
|
||||||
scale.x = scale.y = 1.0f / 8.0f;
|
|
||||||
break;
|
|
||||||
case 81: /* 9x9 */
|
|
||||||
scale.x = scale.y = 1.0f / 9.0f;
|
|
||||||
break;
|
|
||||||
case 100: /* 10x10 */
|
|
||||||
scale.x = scale.y = 1.0f / 10.0f;
|
|
||||||
break;
|
|
||||||
case 121: /* 11x11 */
|
|
||||||
scale.x = scale.y = 1.0f / 11.0f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBGMSG(("real scale = %f, %f\n", scale.x, scale.y));
|
|
||||||
return scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
BPoint get_offset(
|
|
||||||
int index,
|
|
||||||
const BPoint *scale,
|
|
||||||
JobData *org_job_data)
|
|
||||||
{
|
|
||||||
BPoint offset;
|
|
||||||
offset.x = 0;
|
|
||||||
offset.y = 0;
|
|
||||||
|
|
||||||
float width = org_job_data->getPrintableRect().Width();
|
|
||||||
float height = org_job_data->getPrintableRect().Height();
|
|
||||||
|
|
||||||
switch (org_job_data->getNup()) {
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (index == 1) {
|
|
||||||
if (JobData::PORTRAIT == org_job_data->getOrientation()) {
|
|
||||||
offset.x = width;
|
|
||||||
} else {
|
|
||||||
offset.y = height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
if (JobData::PORTRAIT == org_job_data->getOrientation()) {
|
|
||||||
offset.x = width * (index / 2);
|
|
||||||
offset.y = height * (index % 2);
|
|
||||||
} else {
|
|
||||||
offset.x = width * (index % 2);
|
|
||||||
offset.y = height * (index / 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
if (JobData::PORTRAIT == org_job_data->getOrientation()) {
|
|
||||||
offset.x = width * (index / 4);
|
|
||||||
offset.y = height * (index % 4);
|
|
||||||
} else {
|
|
||||||
offset.x = width * (index % 4);
|
|
||||||
offset.y = height * (index / 4);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
offset.x = width * (index / 2);
|
|
||||||
offset.y = height * (index % 2);
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
offset.x = width * (index / 3);
|
|
||||||
offset.y = height * (index % 3);
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
offset.x = width * (index / 4);
|
|
||||||
offset.y = height * (index % 4);
|
|
||||||
break;
|
|
||||||
case 25:
|
|
||||||
offset.x = width * (index / 5);
|
|
||||||
offset.y = height * (index % 5);
|
|
||||||
break;
|
|
||||||
case 36:
|
|
||||||
offset.x = width * (index / 6);
|
|
||||||
offset.y = height * (index % 6);
|
|
||||||
break;
|
|
||||||
case 49:
|
|
||||||
offset.x = width * (index / 7);
|
|
||||||
offset.y = height * (index % 7);
|
|
||||||
break;
|
|
||||||
case 64:
|
|
||||||
offset.x = width * (index / 8);
|
|
||||||
offset.y = height * (index % 8);
|
|
||||||
break;
|
|
||||||
case 81:
|
|
||||||
offset.x = width * (index / 9);
|
|
||||||
offset.y = height * (index % 9);
|
|
||||||
break;
|
|
||||||
case 100:
|
|
||||||
offset.x = width * (index / 10);
|
|
||||||
offset.y = height * (index % 10);
|
|
||||||
break;
|
|
||||||
case 121:
|
|
||||||
offset.x = width * (index / 11);
|
|
||||||
offset.y = height * (index % 11);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
float real_scale = min(scale->x, scale->y);
|
|
||||||
if (real_scale != scale->x)
|
|
||||||
offset.x *= scale->x / real_scale;
|
|
||||||
else
|
|
||||||
offset.y *= scale->y / real_scale;
|
|
||||||
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::printPage(PageDataList *pages)
|
|
||||||
{
|
|
||||||
#ifndef USE_PREVIEW_FOR_DEBUG
|
|
||||||
BPoint offset;
|
|
||||||
offset.x = 0.0f;
|
|
||||||
offset.y = 0.0f;
|
|
||||||
|
|
||||||
if (pages == NULL) {
|
|
||||||
return nextBand(NULL, &offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
__view->SetScale(1.0);
|
|
||||||
__view->SetHighColor(255, 255, 255);
|
|
||||||
__view->ConstrainClippingRegion(NULL);
|
|
||||||
__view->FillRect(__view->Bounds());
|
|
||||||
|
|
||||||
BPoint scale = get_scale(__org_job_data);
|
|
||||||
float real_scale = min(scale.x, scale.y) * __org_job_data->getXres() / 72.0f;
|
|
||||||
__view->SetScale(real_scale);
|
|
||||||
float x = offset.x / real_scale;
|
|
||||||
float y = offset.y / real_scale;
|
|
||||||
int page_index = 0;
|
|
||||||
|
|
||||||
for (PageDataList::iterator it = pages->begin(); it != pages->end(); it++) {
|
|
||||||
BPoint left_top(get_offset(page_index++, &scale, __org_job_data));
|
|
||||||
left_top.x -= x;
|
|
||||||
left_top.y -= y;
|
|
||||||
BRect clip(__org_job_data->getPrintableRect());
|
|
||||||
clip.OffsetTo(left_top);
|
|
||||||
BRegion *region = new BRegion();
|
|
||||||
region->Set(clip);
|
|
||||||
__view->ConstrainClippingRegion(region);
|
|
||||||
delete region;
|
|
||||||
if ((*it)->startEnum()) {
|
|
||||||
bool more;
|
|
||||||
do {
|
|
||||||
PictureData *picture_data;
|
|
||||||
more = (*it)->enumObject(&picture_data);
|
|
||||||
BPoint real_offset = left_top + picture_data->point;
|
|
||||||
__view->DrawPicture(picture_data->picture, real_offset);
|
|
||||||
__view->Sync();
|
|
||||||
delete picture_data;
|
|
||||||
} while (more);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!nextBand(__bitmap, &offset)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} while (offset.x >= 0.0f && offset.y >= 0.0f);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
#else // !USE_PREVIEW_FOR_DEBUG
|
|
||||||
__view->SetScale(1.0);
|
|
||||||
__view->SetHighColor(255, 255, 255);
|
|
||||||
__view->ConstrainClippingRegion(NULL);
|
|
||||||
__view->FillRect(__view->Bounds());
|
|
||||||
|
|
||||||
BPoint scale = get_scale(__org_job_data);
|
|
||||||
__view->SetScale(min(scale.x, scale.y));
|
|
||||||
|
|
||||||
int page_index = 0;
|
|
||||||
PageDataList::iterator it;
|
|
||||||
|
|
||||||
for (it = pages->begin() ; it != pages->end() ; it++) {
|
|
||||||
BPoint left_top(get_offset(page_index, &scale, __org_job_data));
|
|
||||||
BRect clip(__org_job_data->getPrintableRect());
|
|
||||||
clip.OffsetTo(left_top);
|
|
||||||
BRegion *region = new BRegion();
|
|
||||||
region->Set(clip);
|
|
||||||
__view->ConstrainClippingRegion(region);
|
|
||||||
delete region;
|
|
||||||
if ((*it)->startEnum()) {
|
|
||||||
bool more;
|
|
||||||
do {
|
|
||||||
PictureData *picture_data;
|
|
||||||
more = (*it)->enumObject(&picture_data);
|
|
||||||
BPoint real_offset = left_top + picture_data->point;
|
|
||||||
__view->DrawPicture(picture_data->picture, real_offset);
|
|
||||||
__view->Sync();
|
|
||||||
delete picture_data;
|
|
||||||
} while (more);
|
|
||||||
}
|
|
||||||
page_index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
BRect rc(__real_job_data->getPrintableRect());
|
|
||||||
rc.OffsetTo(30.0, 30.0);
|
|
||||||
PreviewWindow *preview = new PreviewWindow(rc, "Preview", __bitmap);
|
|
||||||
preview->Go();
|
|
||||||
#endif // USE_PREVIEW_FOR_DEBUG
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::printDocument(SpoolData *spool_data)
|
|
||||||
{
|
|
||||||
bool more;
|
|
||||||
bool success;
|
|
||||||
PageData *page_data;
|
|
||||||
int page_index;
|
|
||||||
int nup;
|
|
||||||
|
|
||||||
more = false;
|
|
||||||
success = true;
|
|
||||||
page_index = 0;
|
|
||||||
|
|
||||||
if (spool_data->startEnum()) {
|
|
||||||
do {
|
|
||||||
DBGMSG(("page index = %d\n", page_index));
|
|
||||||
if (!(success = startPage(page_index)))
|
|
||||||
break;
|
|
||||||
nup = __org_job_data->getNup();
|
|
||||||
PageDataList pages;
|
|
||||||
do {
|
|
||||||
more = spool_data->enumObject(&page_data);
|
|
||||||
pages.push_back(page_data);
|
|
||||||
} while (more && --nup);
|
|
||||||
__view->Window()->Lock();
|
|
||||||
success = printPage(&pages);
|
|
||||||
__view->Window()->Unlock();
|
|
||||||
if (!success)
|
|
||||||
break;
|
|
||||||
if (!(success = endPage(page_index)))
|
|
||||||
break;
|
|
||||||
page_index++;
|
|
||||||
} while (more);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef USE_PREVIEW_FOR_DEBUG
|
|
||||||
if (success
|
|
||||||
&& __printer_cap->isSupport(PrinterCap::PRINTSTYLE)
|
|
||||||
&& (__org_job_data->getPrintStyle() != JobData::SIMPLEX)
|
|
||||||
&& (((page_index + __org_job_data->getNup() - 1) / __org_job_data->getNup()) % 2))
|
|
||||||
{
|
|
||||||
success = startPage(page_index);
|
|
||||||
if (success) {
|
|
||||||
success = printPage(NULL);
|
|
||||||
if (success) {
|
|
||||||
success = endPage(page_index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::printJob(BFile *spool_file)
|
|
||||||
{
|
|
||||||
bool success = true;
|
|
||||||
print_file_header pfh;
|
|
||||||
|
|
||||||
spool_file->Seek(0, SEEK_SET);
|
|
||||||
spool_file->Read(&pfh, sizeof(pfh));
|
|
||||||
|
|
||||||
DBGMSG(("print_file_header::version = 0x%x\n", pfh.version));
|
|
||||||
DBGMSG(("print_file_header::page_count = %d\n", pfh.page_count));
|
|
||||||
DBGMSG(("print_file_header::first_page = 0x%x\n", (int)pfh.first_page));
|
|
||||||
|
|
||||||
if (pfh.page_count <= 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
__transport = new Transport(__printer_data);
|
|
||||||
|
|
||||||
if (__transport->check_abort()) {
|
|
||||||
success = false;
|
|
||||||
} else {
|
|
||||||
setupData(spool_file, pfh.page_count);
|
|
||||||
setupBitmap();
|
|
||||||
SpoolData spool_data(spool_file, pfh.page_count, __org_job_data->getNup(), __org_job_data->getReverse());
|
|
||||||
success = startDoc();
|
|
||||||
if (success) {
|
|
||||||
while (__internal_copies--) {
|
|
||||||
success = printDocument(&spool_data);
|
|
||||||
if (success == false) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endDoc(success);
|
|
||||||
}
|
|
||||||
cleanupBitmap();
|
|
||||||
cleanupData();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (success == false) {
|
|
||||||
BAlert *alert;
|
|
||||||
if (__transport->check_abort()) {
|
|
||||||
alert = new BAlert("", __transport->last_error().c_str(), "OK");
|
|
||||||
} else {
|
|
||||||
alert = new BAlert("", "Printer not responding.", "OK");
|
|
||||||
}
|
|
||||||
alert->Go();
|
|
||||||
}
|
|
||||||
|
|
||||||
delete __transport;
|
|
||||||
__transport = NULL;
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
BMessage *GraphicsDriver::takeJob(BFile* spool_file, uint32 flags)
|
|
||||||
{
|
|
||||||
__flags = flags;
|
|
||||||
BMessage *msg;
|
|
||||||
if (printJob(spool_file)) {
|
|
||||||
msg = new BMessage('okok');
|
|
||||||
} else {
|
|
||||||
msg = new BMessage('baad');
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::startDoc()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::startPage(int)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::nextBand(BBitmap *, BPoint *)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::endPage(int)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GraphicsDriver::endDoc(bool)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::writeSpoolData(const void *buffer, size_t size) throw(TransportException)
|
|
||||||
{
|
|
||||||
if (__transport) {
|
|
||||||
__transport->write(buffer, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::writeSpoolString(const char *format, ...) throw(TransportException)
|
|
||||||
{
|
|
||||||
if (__transport) {
|
|
||||||
char buffer[256];
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, format);
|
|
||||||
vsprintf(buffer, format, ap);
|
|
||||||
__transport->write(buffer, strlen(buffer));
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::writeSpoolChar(char c) throw(TransportException)
|
|
||||||
{
|
|
||||||
if (__transport) {
|
|
||||||
__transport->write(&c, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GraphicsDriver::rgb32_to_rgb24(void* src, void* dst, int width) {
|
|
||||||
uint8* d = (uint8*)dst;
|
|
||||||
rgb_color* s = (rgb_color*)src;
|
|
||||||
for (int i = width; i > 0; i --) {
|
|
||||||
*d ++ = s->red;
|
|
||||||
*d ++ = s->green;
|
|
||||||
*d ++ = s->blue;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::cmap8_to_rgb24(void* src, void* dst, int width) {
|
|
||||||
uint8* d = (uint8*)dst;
|
|
||||||
uint8* s = (uint8*)src;
|
|
||||||
const color_map* cmap = system_colors();
|
|
||||||
for (int i = width; i > 0; i --) {
|
|
||||||
const rgb_color* rgb = &cmap->color_list[*s];
|
|
||||||
*d ++ = rgb->red;
|
|
||||||
*d ++ = rgb->green;
|
|
||||||
*d ++ = rgb->blue;
|
|
||||||
s ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::convert_to_rgb24(void* src, void* dst, int width, color_space cs) {
|
|
||||||
if (cs == B_RGB32) rgb32_to_rgb24(src, dst, width);
|
|
||||||
else if (cs == B_CMAP8) cmap8_to_rgb24(src, dst, width);
|
|
||||||
else {
|
|
||||||
DBGMSG(("color_space %d not supported", cs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8 GraphicsDriver::gray(uint8 r, uint8 g, uint8 b) {
|
|
||||||
if (r == g && g == b) {
|
|
||||||
return r;
|
|
||||||
} else {
|
|
||||||
return (r * 3 + g * 6 + b) / 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GraphicsDriver::rgb32_to_gray(void* src, void* dst, int width) {
|
|
||||||
uint8* d = (uint8*)dst;
|
|
||||||
rgb_color* s = (rgb_color*)src;
|
|
||||||
for (int i = width; i > 0; i --) {
|
|
||||||
*d ++ = gray(s->red, s->green, s->blue);
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::cmap8_to_gray(void* src, void* dst, int width) {
|
|
||||||
uint8* d = (uint8*)dst;
|
|
||||||
uint8* s = (uint8*)src;
|
|
||||||
const color_map* cmap = system_colors();
|
|
||||||
for (int i = width; i > 0; i --) {
|
|
||||||
const rgb_color* rgb = &cmap->color_list[*s];
|
|
||||||
*d ++ = gray(rgb->red, rgb->green, rgb->blue);
|
|
||||||
s ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsDriver::convert_to_gray(void* src, void* dst, int width, color_space cs) {
|
|
||||||
if (cs == B_RGB32) rgb32_to_gray(src, dst, width);
|
|
||||||
else if (cs == B_CMAP8) cmap8_to_gray(src, dst, width);
|
|
||||||
else {
|
|
||||||
DBGMSG(("color_space %d not supported", cs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,308 +0,0 @@
|
|||||||
/*
|
|
||||||
* HalftoneEngine.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <InterfaceDefs.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <memory>
|
|
||||||
#include "Halftone.h"
|
|
||||||
#include "ValidRect.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "Pattern.h"
|
|
||||||
|
|
||||||
uint gray(rgb_color c)
|
|
||||||
{
|
|
||||||
if (c.red == c.green && c.red == c.blue) {
|
|
||||||
return 255 - c.red;
|
|
||||||
} else {
|
|
||||||
return 255 - (c.red * 3 + c.green * 6 + c.blue) / 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Halftone::Halftone(color_space cs, double gamma, DITHERTYPE dither_type)
|
|
||||||
{
|
|
||||||
__pixel_depth = color_space2pixel_depth(cs);
|
|
||||||
__palette = system_colors()->color_list;
|
|
||||||
__gray = gray;
|
|
||||||
|
|
||||||
createGammaTable(gamma);
|
|
||||||
memset(__cache_table, 0, sizeof(__cache_table));
|
|
||||||
|
|
||||||
switch (dither_type) {
|
|
||||||
case TYPE2:
|
|
||||||
__pattern = pattern16x16_type2;
|
|
||||||
break;
|
|
||||||
case TYPE3:
|
|
||||||
__pattern = pattern16x16_type3;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
__pattern = pattern16x16_type1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cs) {
|
|
||||||
case B_GRAY1:
|
|
||||||
__dither = &Halftone::ditherGRAY1;
|
|
||||||
break;
|
|
||||||
case B_GRAY8:
|
|
||||||
__dither = &Halftone::ditherGRAY8;
|
|
||||||
break;
|
|
||||||
case B_RGB32:
|
|
||||||
case B_RGB32_BIG:
|
|
||||||
__dither = &Halftone::ditherRGB32;
|
|
||||||
break;
|
|
||||||
// case B_CMAP8:
|
|
||||||
default:
|
|
||||||
__dither = &Halftone::ditherCMAP8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Halftone::~Halftone()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Halftone::createGammaTable(double gamma)
|
|
||||||
{
|
|
||||||
// gamma = 1.0f / gamma;
|
|
||||||
uint *g = __gamma_table;
|
|
||||||
for (int i = 0; i < 256; i++) {
|
|
||||||
*g++ = (uint)(pow((double)i / 255.0, gamma) * 256.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Halftone::initElements(int x, int y, uchar *elements)
|
|
||||||
{
|
|
||||||
x &= 0x0F;
|
|
||||||
y &= 0x0F;
|
|
||||||
|
|
||||||
const uchar *left = &__pattern[y * 16];
|
|
||||||
const uchar *pos = left + x;
|
|
||||||
const uchar *right = left + 0x0F;
|
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
*elements++ = *pos;
|
|
||||||
if (pos >= right) {
|
|
||||||
pos = left;
|
|
||||||
} else {
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Halftone::dither(
|
|
||||||
uchar *dst,
|
|
||||||
const uchar *src,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
return (this->*__dither)(dst, src, x, y, width);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Halftone::ditherGRAY1(
|
|
||||||
uchar *dst,
|
|
||||||
const uchar *src,
|
|
||||||
int,
|
|
||||||
int,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
int widthByte = (width + 7) / 8;
|
|
||||||
memcpy(dst, src, widthByte);
|
|
||||||
return widthByte;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Halftone::ditherGRAY8(
|
|
||||||
uchar *dst,
|
|
||||||
const uchar *src,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
uchar elements[16];
|
|
||||||
initElements(x, y, elements);
|
|
||||||
|
|
||||||
int widthByte = (width + 7) / 8;
|
|
||||||
int remainder = width % 8;
|
|
||||||
if (!remainder)
|
|
||||||
remainder = 8;
|
|
||||||
|
|
||||||
uchar cur;
|
|
||||||
uint density;
|
|
||||||
int i, j;
|
|
||||||
uchar *e = elements;
|
|
||||||
uchar *last_e = elements + 16;
|
|
||||||
|
|
||||||
if (width >= 8) {
|
|
||||||
for (i = 0; i < widthByte - 1; i++) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
density = __gamma_table[*src++];
|
|
||||||
if (density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (remainder > 0) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < remainder; j++) {
|
|
||||||
density = __gamma_table[*src++];
|
|
||||||
if (density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
return widthByte;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Halftone::ditherCMAP8(
|
|
||||||
uchar *dst,
|
|
||||||
const uchar *src,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
uchar elements[16];
|
|
||||||
initElements(x, y, elements);
|
|
||||||
|
|
||||||
int widthByte = (width + 7) / 8;
|
|
||||||
int remainder = width % 8;
|
|
||||||
if (!remainder)
|
|
||||||
remainder = 8;
|
|
||||||
|
|
||||||
rgb_color c;
|
|
||||||
uchar cur;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
uchar *e = elements;
|
|
||||||
uchar *last_e = elements + 16;
|
|
||||||
CACHE_FOR_CMAP8 *cache;
|
|
||||||
|
|
||||||
if (width >= 8) {
|
|
||||||
for (i = 0; i < widthByte - 1; i++) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
cache = &__cache_table[*src];
|
|
||||||
if (!cache->hit) {
|
|
||||||
cache->hit = true;
|
|
||||||
c = __palette[*src];
|
|
||||||
cache->density = __gamma_table[__gray(c)];
|
|
||||||
}
|
|
||||||
src++;
|
|
||||||
if (cache->density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (remainder > 0) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < remainder; j++) {
|
|
||||||
cache = &__cache_table[*src];
|
|
||||||
if (!cache->hit) {
|
|
||||||
cache->hit = true;
|
|
||||||
c = __palette[*src];
|
|
||||||
cache->density = __gamma_table[__gray(c)];
|
|
||||||
}
|
|
||||||
src++;
|
|
||||||
if (cache->density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
return widthByte;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Halftone::ditherRGB32(
|
|
||||||
uchar *dst,
|
|
||||||
const uchar *a_src,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
uchar elements[16];
|
|
||||||
initElements(x, y, elements);
|
|
||||||
|
|
||||||
const rgb_color *src = (const rgb_color *)a_src;
|
|
||||||
|
|
||||||
int widthByte = (width + 7) / 8;
|
|
||||||
int remainder = width % 8;
|
|
||||||
if (remainder == 0)
|
|
||||||
remainder = 8;
|
|
||||||
|
|
||||||
rgb_color c;
|
|
||||||
uchar cur;
|
|
||||||
uint density;
|
|
||||||
int i, j;
|
|
||||||
uchar *e = elements;
|
|
||||||
uchar *last_e = elements + 16;
|
|
||||||
|
|
||||||
c = *src;
|
|
||||||
density = __gamma_table[__gray(c)];
|
|
||||||
|
|
||||||
if (width >= 8) {
|
|
||||||
for (i = 0; i < widthByte - 1; i++) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
if (c.red != src->red || c.green != src->green || c.blue != src->blue) {
|
|
||||||
c = *src;
|
|
||||||
density = __gamma_table[__gray(c)];
|
|
||||||
}
|
|
||||||
src++;
|
|
||||||
if (density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (remainder > 0) {
|
|
||||||
cur = 0;
|
|
||||||
if (e == last_e) {
|
|
||||||
e = elements;
|
|
||||||
}
|
|
||||||
for (j = 0; j < remainder; j++) {
|
|
||||||
if (c.red != src->red || c.green != src->green || c.blue != src->blue) {
|
|
||||||
c = *src;
|
|
||||||
density = __gamma_table[__gray(c)];
|
|
||||||
}
|
|
||||||
src++;
|
|
||||||
if (density > *e++) {
|
|
||||||
cur |= (0x80 >> j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst++ = cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
return widthByte;
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
SubDir OBOS_TOP src add-ons print drivers canon_lips libprint ;
|
|
||||||
|
|
||||||
StaticLibrary print :
|
|
||||||
AboutBox.cpp
|
|
||||||
DbgMsg.cpp
|
|
||||||
GraphicsDriver.cpp
|
|
||||||
Halftone.cpp
|
|
||||||
JobData.cpp
|
|
||||||
JobSetupDlg.cpp
|
|
||||||
PackBits.cpp
|
|
||||||
PageSetupDlg.cpp
|
|
||||||
Preview.cpp
|
|
||||||
PrinterData.cpp
|
|
||||||
PrinterCap.cpp
|
|
||||||
PrintProcess.cpp
|
|
||||||
SpoolMetaData.cpp
|
|
||||||
Transport.cpp
|
|
||||||
UIDriver.cpp
|
|
||||||
ValidRect.cpp
|
|
||||||
;
|
|
||||||
|
|
||||||
@@ -1,322 +0,0 @@
|
|||||||
/*
|
|
||||||
* JobData.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <InterfaceDefs.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include "JobData.h"
|
|
||||||
#include "PrinterCap.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
const char *JD_XRES = "xres";
|
|
||||||
const char *JD_YRES = "yres";
|
|
||||||
const char *JD_COPIES = "copies";
|
|
||||||
const char *JD_ORIENTATION = "orientation";
|
|
||||||
const char *JD_SCALING = "scaling";
|
|
||||||
const char *JD_PAPER_RECT = "paper_rect";
|
|
||||||
const char *JD_FIRST_PAGE = "first_page";
|
|
||||||
const char *JD_LAST_PAGE = "last_page";
|
|
||||||
const char *JD_PRINTABLE_RECT = "printable_rect";
|
|
||||||
|
|
||||||
const char *JD_PAPER = "JJJJ_paper";
|
|
||||||
const char *JD_NUP = "JJJJ_nup";
|
|
||||||
const char *JD_SURFACE_TYPE = "JJJJ_surface_type";
|
|
||||||
const char *JD_GAMMA = "JJJJ_gamma";
|
|
||||||
const char *JD_PAPER_SOURCE = "JJJJ_paper_source";
|
|
||||||
const char *JD_COLLATE = "JJJJ_collate";
|
|
||||||
const char *JD_REVERSE = "JJJJ_reverse";
|
|
||||||
const char *JD_PRINT_STYLE = "JJJJ_print_style";
|
|
||||||
const char *JD_BINDING_LOCATION = "JJJJ_binding_location";
|
|
||||||
const char *JD_PAGE_ORDER = "JJJJ_page_order";
|
|
||||||
const char *JD_COLOR = "JJJJ_color";
|
|
||||||
|
|
||||||
JobData::JobData(BMessage *msg, const PrinterCap *cap)
|
|
||||||
{
|
|
||||||
load(msg, cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
JobData::~JobData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
JobData::JobData(const JobData &job_data)
|
|
||||||
{
|
|
||||||
__paper = job_data.__paper;
|
|
||||||
__xres = job_data.__xres;
|
|
||||||
__yres = job_data.__yres;
|
|
||||||
__orientation = job_data.__orientation;
|
|
||||||
__scaling = job_data.__scaling;
|
|
||||||
__paper_rect = job_data.__paper_rect;
|
|
||||||
__printable_rect = job_data.__printable_rect;
|
|
||||||
__nup = job_data.__nup;
|
|
||||||
__first_page = job_data.__first_page;
|
|
||||||
__last_page = job_data.__last_page;
|
|
||||||
__surface_type = job_data.__surface_type;
|
|
||||||
__gamma = job_data.__gamma;
|
|
||||||
__paper_source = job_data.__paper_source;
|
|
||||||
__copies = job_data.__copies;
|
|
||||||
__collate = job_data.__collate;
|
|
||||||
__reverse = job_data.__reverse;
|
|
||||||
__print_style = job_data.__print_style;
|
|
||||||
__binding_location = job_data.__binding_location;
|
|
||||||
__page_order = job_data.__page_order;
|
|
||||||
__msg = job_data.__msg;
|
|
||||||
__color = job_data.__color;
|
|
||||||
}
|
|
||||||
|
|
||||||
JobData &JobData::operator = (const JobData &job_data)
|
|
||||||
{
|
|
||||||
__paper = job_data.__paper;
|
|
||||||
__xres = job_data.__xres;
|
|
||||||
__yres = job_data.__yres;
|
|
||||||
__orientation = job_data.__orientation;
|
|
||||||
__scaling = job_data.__scaling;
|
|
||||||
__paper_rect = job_data.__paper_rect;
|
|
||||||
__printable_rect = job_data.__printable_rect;
|
|
||||||
__nup = job_data.__nup;
|
|
||||||
__first_page = job_data.__first_page;
|
|
||||||
__last_page = job_data.__last_page;
|
|
||||||
__surface_type = job_data.__surface_type;
|
|
||||||
__gamma = job_data.__gamma;
|
|
||||||
__paper_source = job_data.__paper_source;
|
|
||||||
__copies = job_data.__copies;
|
|
||||||
__collate = job_data.__collate;
|
|
||||||
__reverse = job_data.__reverse;
|
|
||||||
__print_style = job_data.__print_style;
|
|
||||||
__binding_location = job_data.__binding_location;
|
|
||||||
__page_order = job_data.__page_order;
|
|
||||||
__msg = job_data.__msg;
|
|
||||||
__color = job_data.__color;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobData::load(BMessage *msg, const PrinterCap *cap)
|
|
||||||
{
|
|
||||||
__msg = msg;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAPER))
|
|
||||||
__paper = (PAPER)msg->FindInt32(JD_PAPER);
|
|
||||||
else if (cap->isSupport(PrinterCap::PAPER))
|
|
||||||
__paper = ((const PaperCap *)cap->getDefaultCap(PrinterCap::PAPER))->paper;
|
|
||||||
else
|
|
||||||
__paper = A4;
|
|
||||||
|
|
||||||
if (msg->HasInt64(JD_XRES)) {
|
|
||||||
int64 xres64;
|
|
||||||
msg->FindInt64(JD_XRES, &xres64);
|
|
||||||
__xres = xres64;
|
|
||||||
} else if (cap->isSupport(PrinterCap::RESOLUTION)) {
|
|
||||||
__xres = ((const ResolutionCap *)cap->getDefaultCap(PrinterCap::RESOLUTION))->xres;
|
|
||||||
} else {
|
|
||||||
__xres = 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg->HasInt64(JD_YRES)) {
|
|
||||||
int64 yres64;
|
|
||||||
msg->FindInt64(JD_YRES, &yres64);
|
|
||||||
__yres = yres64;
|
|
||||||
} else if (cap->isSupport(PrinterCap::RESOLUTION)) {
|
|
||||||
__yres = ((const ResolutionCap *)cap->getDefaultCap(PrinterCap::RESOLUTION))->yres;
|
|
||||||
} else {
|
|
||||||
__yres = 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_ORIENTATION))
|
|
||||||
__orientation = (ORIENTATION)msg->FindInt32(JD_ORIENTATION);
|
|
||||||
else if (cap->isSupport(PrinterCap::ORIENTATION))
|
|
||||||
__orientation = ((const OrientationCap *)cap->getDefaultCap(PrinterCap::ORIENTATION))->orientation;
|
|
||||||
else
|
|
||||||
__orientation = PORTRAIT;
|
|
||||||
|
|
||||||
if (msg->HasFloat(JD_SCALING))
|
|
||||||
__scaling = msg->FindFloat(JD_SCALING);
|
|
||||||
else
|
|
||||||
__scaling = 100.0f;
|
|
||||||
|
|
||||||
if (msg->HasRect(JD_PAPER_RECT)) {
|
|
||||||
__paper_rect = msg->FindRect(JD_PAPER_RECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg->HasRect(JD_PRINTABLE_RECT)) {
|
|
||||||
__printable_rect = msg->FindRect(JD_PRINTABLE_RECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_FIRST_PAGE))
|
|
||||||
__first_page = msg->FindInt32(JD_FIRST_PAGE);
|
|
||||||
else
|
|
||||||
__first_page = 1;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_LAST_PAGE))
|
|
||||||
__last_page = msg->FindInt32(JD_LAST_PAGE);
|
|
||||||
else
|
|
||||||
__last_page = -1;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_NUP))
|
|
||||||
__nup = msg->FindInt32(JD_NUP);
|
|
||||||
else
|
|
||||||
__nup = 1;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_SURFACE_TYPE))
|
|
||||||
__surface_type = (color_space)msg->FindInt32(JD_SURFACE_TYPE);
|
|
||||||
else
|
|
||||||
__surface_type = B_CMAP8;
|
|
||||||
|
|
||||||
if (msg->HasFloat(JD_GAMMA))
|
|
||||||
__gamma = __msg->FindFloat(JD_GAMMA);
|
|
||||||
else
|
|
||||||
__gamma = 1.4f;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAPER_SOURCE))
|
|
||||||
__paper_source = (PAPERSOURCE)__msg->FindInt32(JD_PAPER_SOURCE);
|
|
||||||
else if (cap->isSupport(PrinterCap::PAPERSOURCE))
|
|
||||||
__paper_source = ((const PaperSourceCap *)cap->getDefaultCap(PrinterCap::PAPERSOURCE))->paper_source;
|
|
||||||
else
|
|
||||||
__paper_source = AUTO;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_COPIES))
|
|
||||||
__copies = msg->FindInt32(JD_COPIES);
|
|
||||||
else
|
|
||||||
__copies = 1;
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_COLLATE))
|
|
||||||
__collate = msg->FindBool(JD_COLLATE);
|
|
||||||
else
|
|
||||||
__collate = false;
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_REVERSE))
|
|
||||||
__reverse = msg->FindBool(JD_REVERSE);
|
|
||||||
else
|
|
||||||
__reverse = false;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PRINT_STYLE))
|
|
||||||
__print_style = (PRINTSTYLE)msg->FindInt32(JD_PRINT_STYLE);
|
|
||||||
else if (cap->isSupport(PrinterCap::PRINTSTYLE))
|
|
||||||
__print_style = ((const PrintStyleCap *)cap->getDefaultCap(PrinterCap::PRINTSTYLE))->print_style;
|
|
||||||
else
|
|
||||||
__print_style = SIMPLEX;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_BINDING_LOCATION))
|
|
||||||
__binding_location = (BINDINGLOCATION)msg->FindInt32(JD_BINDING_LOCATION);
|
|
||||||
else if (cap->isSupport(PrinterCap::BINDINGLOCATION))
|
|
||||||
__binding_location = ((const BindingLocationCap *)cap->getDefaultCap(PrinterCap::BINDINGLOCATION))->binding_location;
|
|
||||||
else
|
|
||||||
__binding_location = LONG_EDGE_LEFT;
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAGE_ORDER))
|
|
||||||
__page_order = (PAGEORDER)msg->FindInt32(JD_PAGE_ORDER);
|
|
||||||
else
|
|
||||||
__page_order = ACROSS_FROM_LEFT;
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_COLOR))
|
|
||||||
__color = msg->FindBool(JD_COLOR);
|
|
||||||
else
|
|
||||||
__color = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobData::save(BMessage *msg)
|
|
||||||
{
|
|
||||||
if (msg == NULL) {
|
|
||||||
msg = __msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAPER))
|
|
||||||
msg->ReplaceInt32(JD_PAPER, __paper);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_PAPER, __paper);
|
|
||||||
|
|
||||||
if (msg->HasInt64(JD_XRES))
|
|
||||||
msg->ReplaceInt64(JD_XRES, __xres);
|
|
||||||
else
|
|
||||||
msg->AddInt64(JD_XRES, __xres);
|
|
||||||
|
|
||||||
if (msg->HasInt64(JD_YRES))
|
|
||||||
msg->ReplaceInt64(JD_YRES, __yres);
|
|
||||||
else
|
|
||||||
msg->AddInt64(JD_YRES, __yres);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_ORIENTATION))
|
|
||||||
msg->ReplaceInt32(JD_ORIENTATION, __orientation);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_ORIENTATION, __orientation);
|
|
||||||
|
|
||||||
if (msg->HasFloat(JD_SCALING))
|
|
||||||
msg->ReplaceFloat(JD_SCALING, __scaling);
|
|
||||||
else
|
|
||||||
msg->AddFloat(JD_SCALING, __scaling);
|
|
||||||
|
|
||||||
if (msg->HasRect(JD_PAPER_RECT))
|
|
||||||
msg->ReplaceRect(JD_PAPER_RECT, __paper_rect);
|
|
||||||
else
|
|
||||||
msg->AddRect(JD_PAPER_RECT, __paper_rect);
|
|
||||||
|
|
||||||
if (msg->HasRect(JD_PRINTABLE_RECT))
|
|
||||||
msg->ReplaceRect(JD_PRINTABLE_RECT, __printable_rect);
|
|
||||||
else
|
|
||||||
msg->AddRect(JD_PRINTABLE_RECT, __printable_rect);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_NUP))
|
|
||||||
msg->ReplaceInt32(JD_NUP, __nup);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_NUP, __nup);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_FIRST_PAGE))
|
|
||||||
msg->ReplaceInt32(JD_FIRST_PAGE, __first_page);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_FIRST_PAGE, __first_page);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_LAST_PAGE))
|
|
||||||
msg->ReplaceInt32(JD_LAST_PAGE, __last_page);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_LAST_PAGE, __last_page);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_SURFACE_TYPE))
|
|
||||||
msg->ReplaceInt32(JD_SURFACE_TYPE, __surface_type);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_SURFACE_TYPE, __surface_type);
|
|
||||||
|
|
||||||
if (msg->HasFloat(JD_GAMMA))
|
|
||||||
msg->ReplaceFloat(JD_GAMMA, __gamma);
|
|
||||||
else
|
|
||||||
msg->AddFloat(JD_GAMMA, __gamma);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAPER_SOURCE))
|
|
||||||
msg->ReplaceInt32(JD_PAPER_SOURCE, __paper_source);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_PAPER_SOURCE, __paper_source);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_COPIES))
|
|
||||||
msg->ReplaceInt32(JD_COPIES, __copies);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_COPIES, __copies);
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_COLLATE))
|
|
||||||
msg->ReplaceBool(JD_COLLATE, __collate);
|
|
||||||
else
|
|
||||||
msg->AddBool(JD_COLLATE, __collate);
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_REVERSE))
|
|
||||||
msg->ReplaceBool(JD_REVERSE, __reverse);
|
|
||||||
else
|
|
||||||
msg->AddBool(JD_REVERSE, __reverse);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PRINT_STYLE))
|
|
||||||
msg->ReplaceInt32(JD_PRINT_STYLE, __print_style);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_PRINT_STYLE, __print_style);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_BINDING_LOCATION))
|
|
||||||
msg->ReplaceInt32(JD_BINDING_LOCATION, __binding_location);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_BINDING_LOCATION, __binding_location);
|
|
||||||
|
|
||||||
if (msg->HasInt32(JD_PAGE_ORDER))
|
|
||||||
msg->ReplaceInt32(JD_PAGE_ORDER, __page_order);
|
|
||||||
else
|
|
||||||
msg->AddInt32(JD_PAGE_ORDER, __page_order);
|
|
||||||
|
|
||||||
if (msg->HasBool(JD_COLOR))
|
|
||||||
msg->ReplaceBool(JD_COLOR, __color);
|
|
||||||
else
|
|
||||||
msg->AddBool(JD_COLOR, __color);
|
|
||||||
}
|
|
||||||
@@ -1,699 +0,0 @@
|
|||||||
/*
|
|
||||||
* JobSetupDlg.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include "_sstream"
|
|
||||||
#include <string>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <Alert.h>
|
|
||||||
#include <Bitmap.h>
|
|
||||||
#include <Box.h>
|
|
||||||
#include <Button.h>
|
|
||||||
#include <CheckBox.h>
|
|
||||||
#include <Looper.h>
|
|
||||||
#include <MessageFilter.h>
|
|
||||||
#include <MenuField.h>
|
|
||||||
#include <MenuItem.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include <Point.h>
|
|
||||||
#include <PopUpMenu.h>
|
|
||||||
#include <PrintJob.h>
|
|
||||||
#include <RadioButton.h>
|
|
||||||
#include <Rect.h>
|
|
||||||
#include <TextControl.h>
|
|
||||||
#include <View.h>
|
|
||||||
|
|
||||||
#include "JobSetupDlg.h"
|
|
||||||
#include "JobData.h"
|
|
||||||
#include "PrinterData.h"
|
|
||||||
#include "PrinterCap.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define PRINT_COPIES 100
|
|
||||||
|
|
||||||
#define PRINT_WIDTH 355
|
|
||||||
#define PRINT_HEIGHT 210
|
|
||||||
|
|
||||||
#define QUALITY_H 10
|
|
||||||
#define QUALITY_V 10
|
|
||||||
#define QUALITY_WIDTH 180
|
|
||||||
#define QUALITY_HEIGHT 70
|
|
||||||
|
|
||||||
#define BPP_H 10
|
|
||||||
#define BPP_V 15
|
|
||||||
#define BPP_WIDTH 140
|
|
||||||
#define BPP_HEIGHT 16
|
|
||||||
|
|
||||||
#define GAMMA_H BPP_H
|
|
||||||
#define GAMMA_V BPP_V + BPP_HEIGHT + 10
|
|
||||||
#define GAMMA_WIDTH 120
|
|
||||||
#define GAMMA_HEIGHT BPP_HEIGHT
|
|
||||||
|
|
||||||
#define PAGERABGE_H QUALITY_H
|
|
||||||
#define PAGERABGE_V QUALITY_V + QUALITY_HEIGHT + 5
|
|
||||||
#define PAGERABGE_WIDTH QUALITY_WIDTH
|
|
||||||
#define PAGERABGE_HEIGHT 70
|
|
||||||
|
|
||||||
#define ALL_H 10
|
|
||||||
#define ALL_V 20
|
|
||||||
#define ALL_WIDTH 36
|
|
||||||
#define ALL_HEIGHT 16
|
|
||||||
|
|
||||||
#define SELECTION_H ALL_H
|
|
||||||
#define SELECTION_V ALL_V + ALL_HEIGHT + 4
|
|
||||||
#define SELECTION_WIDTH 16
|
|
||||||
#define SELECTION_HEIGHT 16
|
|
||||||
|
|
||||||
#define FROM_H (SELECTION_H + SELECTION_WIDTH + 1)
|
|
||||||
#define FROM_V ALL_V + 19
|
|
||||||
#define FROM_WIDTH 73
|
|
||||||
#define FROM_HEIGHT 16
|
|
||||||
|
|
||||||
#define TO_H (FROM_H + FROM_WIDTH + 7)
|
|
||||||
#define TO_V FROM_V
|
|
||||||
#define TO_WIDTH 59
|
|
||||||
#define TO_HEIGHT FROM_HEIGHT
|
|
||||||
|
|
||||||
#define PAPERFEED_H QUALITY_H + QUALITY_WIDTH + 10
|
|
||||||
#define PAPERFEED_V QUALITY_V + 5
|
|
||||||
#define PAPERFEED_WIDTH 160
|
|
||||||
#define PAPERFEED_HEIGHT 16
|
|
||||||
|
|
||||||
#define NUP_H PAPERFEED_H
|
|
||||||
#define NUP_V PAPERFEED_V + PAPERFEED_HEIGHT + 7
|
|
||||||
#define NUP_WIDTH PAPERFEED_WIDTH
|
|
||||||
#define NUP_HEIGHT 16
|
|
||||||
#define MENU_HEIGHT 16
|
|
||||||
|
|
||||||
#define COPIES_H PAPERFEED_H
|
|
||||||
#define COPIES_V NUP_V + NUP_HEIGHT + 10
|
|
||||||
#define COPIES_WIDTH 140
|
|
||||||
#define COPIES_HEIGHT 16
|
|
||||||
|
|
||||||
#define DUPLEX_H PAPERFEED_H
|
|
||||||
#define DUPLEX_V COPIES_V + COPIES_HEIGHT + 7
|
|
||||||
#define DUPLEX_WIDTH PAPERFEED_WIDTH
|
|
||||||
#define DUPLEX_HEIGHT 16
|
|
||||||
|
|
||||||
#define COLLATE_H PAPERFEED_H
|
|
||||||
#define COLLATE_V DUPLEX_V + DUPLEX_HEIGHT + 5
|
|
||||||
#define COLLATE_WIDTH PAPERFEED_WIDTH
|
|
||||||
#define COLLATE_HEIGHT 16
|
|
||||||
|
|
||||||
#define REVERSE_H PAPERFEED_H
|
|
||||||
#define REVERSE_V COLLATE_V + COLLATE_HEIGHT + 5
|
|
||||||
#define REVERSE_WIDTH PAPERFEED_WIDTH
|
|
||||||
#define REVERSE_HEIGHT 16
|
|
||||||
|
|
||||||
#define PRINT_BUTTON_WIDTH 70
|
|
||||||
#define PRINT_BUTTON_HEIGHT 20
|
|
||||||
|
|
||||||
#define PRINT_LINE_V (PRINT_HEIGHT - PRINT_BUTTON_HEIGHT - 23)
|
|
||||||
|
|
||||||
#define PRINT_OK_BUTTON_H (PRINT_WIDTH - PRINT_BUTTON_WIDTH - 10)
|
|
||||||
#define PRINT_OK_BUTTON_V (PRINT_HEIGHT - PRINT_BUTTON_HEIGHT - 11)
|
|
||||||
|
|
||||||
#define PRINT_CANCEL_BUTTON_H (PRINT_OK_BUTTON_H - PRINT_BUTTON_WIDTH - 12)
|
|
||||||
#define PRINT_CANCEL_BUTTON_V PRINT_OK_BUTTON_V
|
|
||||||
|
|
||||||
const BRect quality_rect(
|
|
||||||
QUALITY_H,
|
|
||||||
QUALITY_V,
|
|
||||||
QUALITY_H + QUALITY_WIDTH,
|
|
||||||
QUALITY_V + QUALITY_HEIGHT);
|
|
||||||
|
|
||||||
const BRect bpp_rect(
|
|
||||||
BPP_H,
|
|
||||||
BPP_V,
|
|
||||||
BPP_H + BPP_WIDTH,
|
|
||||||
BPP_V + BPP_HEIGHT);
|
|
||||||
|
|
||||||
const BRect gamma_rect(
|
|
||||||
GAMMA_H,
|
|
||||||
GAMMA_V,
|
|
||||||
GAMMA_H + GAMMA_WIDTH,
|
|
||||||
GAMMA_V + GAMMA_HEIGHT);
|
|
||||||
|
|
||||||
const BRect pagerange_rect(
|
|
||||||
PAGERABGE_H,
|
|
||||||
PAGERABGE_V,
|
|
||||||
PAGERABGE_H + PAGERABGE_WIDTH,
|
|
||||||
PAGERABGE_V + PAGERABGE_HEIGHT);
|
|
||||||
|
|
||||||
const BRect all_button_rect(
|
|
||||||
ALL_H,
|
|
||||||
ALL_V,
|
|
||||||
ALL_H + ALL_WIDTH,
|
|
||||||
ALL_V + ALL_HEIGHT);
|
|
||||||
|
|
||||||
const BRect selection_rect(
|
|
||||||
SELECTION_H,
|
|
||||||
SELECTION_V,
|
|
||||||
SELECTION_H + SELECTION_WIDTH,
|
|
||||||
SELECTION_V + SELECTION_HEIGHT);
|
|
||||||
|
|
||||||
const BRect from_rect(
|
|
||||||
FROM_H,
|
|
||||||
FROM_V,
|
|
||||||
FROM_H + FROM_WIDTH,
|
|
||||||
FROM_V + FROM_HEIGHT);
|
|
||||||
|
|
||||||
const BRect to_rect(
|
|
||||||
TO_H,
|
|
||||||
TO_V,
|
|
||||||
TO_H + TO_WIDTH,
|
|
||||||
TO_V + TO_HEIGHT);
|
|
||||||
|
|
||||||
const BRect paperfeed_rect(
|
|
||||||
PAPERFEED_H,
|
|
||||||
PAPERFEED_V,
|
|
||||||
PAPERFEED_H + PAPERFEED_WIDTH,
|
|
||||||
PAPERFEED_V + PAPERFEED_HEIGHT);
|
|
||||||
|
|
||||||
const BRect nup_rect(
|
|
||||||
NUP_H,
|
|
||||||
NUP_V,
|
|
||||||
NUP_H + NUP_WIDTH,
|
|
||||||
NUP_V + NUP_HEIGHT);
|
|
||||||
|
|
||||||
const BRect copies_rect(
|
|
||||||
COPIES_H,
|
|
||||||
COPIES_V,
|
|
||||||
COPIES_H + COPIES_WIDTH,
|
|
||||||
COPIES_V + COPIES_HEIGHT);
|
|
||||||
|
|
||||||
const BRect duplex_rect(
|
|
||||||
DUPLEX_H,
|
|
||||||
DUPLEX_V,
|
|
||||||
DUPLEX_H + DUPLEX_WIDTH,
|
|
||||||
DUPLEX_V + DUPLEX_HEIGHT);
|
|
||||||
|
|
||||||
const BRect collate_rect(
|
|
||||||
COLLATE_H,
|
|
||||||
COLLATE_V,
|
|
||||||
COLLATE_H + COLLATE_WIDTH,
|
|
||||||
COLLATE_V + COLLATE_HEIGHT);
|
|
||||||
|
|
||||||
const BRect reverse_rect(
|
|
||||||
REVERSE_H,
|
|
||||||
REVERSE_V,
|
|
||||||
REVERSE_H + REVERSE_WIDTH,
|
|
||||||
REVERSE_V + REVERSE_HEIGHT);
|
|
||||||
|
|
||||||
const BRect ok_rect(
|
|
||||||
PRINT_OK_BUTTON_H,
|
|
||||||
PRINT_OK_BUTTON_V,
|
|
||||||
PRINT_OK_BUTTON_H + PRINT_BUTTON_WIDTH,
|
|
||||||
PRINT_OK_BUTTON_V + PRINT_BUTTON_HEIGHT);
|
|
||||||
|
|
||||||
const BRect cancel_rect(
|
|
||||||
PRINT_CANCEL_BUTTON_H,
|
|
||||||
PRINT_CANCEL_BUTTON_V,
|
|
||||||
PRINT_CANCEL_BUTTON_H + PRINT_BUTTON_WIDTH,
|
|
||||||
PRINT_CANCEL_BUTTON_V + PRINT_BUTTON_HEIGHT);
|
|
||||||
|
|
||||||
struct SurfaceCap : public BaseCap {
|
|
||||||
color_space surface_type;
|
|
||||||
SurfaceCap(const string &s, bool d, color_space cs) : BaseCap(s, d), surface_type(cs) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct NupCap : public BaseCap {
|
|
||||||
int nup;
|
|
||||||
NupCap(const string &s, bool d, int n) : BaseCap(s, d), nup(n) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
const SurfaceCap rgb32("RGB32", false, B_RGB32);
|
|
||||||
const SurfaceCap cmap8("CMAP8", true, B_CMAP8);
|
|
||||||
const SurfaceCap gray8("GRAY8", false, B_GRAY8);
|
|
||||||
const SurfaceCap gray1("GRAY1", false, B_GRAY1);
|
|
||||||
|
|
||||||
const NupCap nup1("Normal", true, 1);
|
|
||||||
const NupCap nup2("2-up", false, 2);
|
|
||||||
const NupCap nup4("4-up", false, 4);
|
|
||||||
const NupCap nup8("8-up", false, 8);
|
|
||||||
const NupCap nup9("9-up", false, 9);
|
|
||||||
const NupCap nup16("16-up", false, 16);
|
|
||||||
const NupCap nup25("25-up", false, 25);
|
|
||||||
const NupCap nup32("32-up", false, 32);
|
|
||||||
const NupCap nup36("36-up", false, 36);
|
|
||||||
|
|
||||||
const SurfaceCap *surfaces[] = {
|
|
||||||
&rgb32,
|
|
||||||
&cmap8,
|
|
||||||
&gray8,
|
|
||||||
&gray1
|
|
||||||
};
|
|
||||||
|
|
||||||
const NupCap *nups[] = {
|
|
||||||
&nup1,
|
|
||||||
&nup2,
|
|
||||||
&nup4,
|
|
||||||
&nup8,
|
|
||||||
&nup9,
|
|
||||||
&nup16,
|
|
||||||
&nup25,
|
|
||||||
&nup32,
|
|
||||||
&nup36
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
M_RANGE_ALL = 1,
|
|
||||||
M_RANGE_SELECTION,
|
|
||||||
M_CANCEL,
|
|
||||||
M_OK
|
|
||||||
};
|
|
||||||
|
|
||||||
JobSetupView::JobSetupView(BRect frame, JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW), __job_data(job_data), __printer_data(printer_data), __printer_cap(printer_cap)
|
|
||||||
{
|
|
||||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobSetupView::AttachedToWindow()
|
|
||||||
{
|
|
||||||
BBox *box;
|
|
||||||
BMenuItem *item = NULL;
|
|
||||||
BMenuField *menufield;
|
|
||||||
BButton *button;
|
|
||||||
float width;
|
|
||||||
bool marked;
|
|
||||||
int count;
|
|
||||||
|
|
||||||
/* quality */
|
|
||||||
|
|
||||||
box = new BBox(quality_rect);
|
|
||||||
AddChild(box);
|
|
||||||
box->SetLabel("Quality");
|
|
||||||
|
|
||||||
/*
|
|
||||||
// always B_RGB32
|
|
||||||
__surface_type = new BPopUpMenu("");
|
|
||||||
__surface_type->SetRadioMode(true);
|
|
||||||
|
|
||||||
count = sizeof(surfaces) / sizeof(surfaces[0]);
|
|
||||||
const SurfaceCap **surface_cap = surfaces;
|
|
||||||
uint32 support_flags;
|
|
||||||
while (count--) {
|
|
||||||
if (bitmaps_support_space((*surface_cap)->surface_type, &support_flags)) {
|
|
||||||
item = new BMenuItem((*surface_cap)->label.c_str(), NULL);
|
|
||||||
__surface_type->AddItem(item);
|
|
||||||
if ((*surface_cap)->surface_type == __job_data->getSurfaceType()) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
surface_cap++;
|
|
||||||
}
|
|
||||||
menufield = new BMenuField(bpp_rect, "", "Surface Type", __surface_type);
|
|
||||||
box->AddChild(menufield);
|
|
||||||
width = StringWidth("Color") + 10;
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* color */
|
|
||||||
marked = false;
|
|
||||||
__color_type = new BPopUpMenu("");
|
|
||||||
__color_type->SetRadioMode(true);
|
|
||||||
|
|
||||||
count = __printer_cap->countCap(PrinterCap::COLOR);
|
|
||||||
const ColorCap **color_cap = (const ColorCap **)__printer_cap->enumCap(PrinterCap::COLOR);
|
|
||||||
while (count--) {
|
|
||||||
item = new BMenuItem((*color_cap)->label.c_str(), NULL);
|
|
||||||
__color_type->AddItem(item);
|
|
||||||
if ((*color_cap)->color == __job_data->getColor()) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
color_cap++;
|
|
||||||
}
|
|
||||||
if (!marked && item)
|
|
||||||
item->SetMarked(true);
|
|
||||||
menufield = new BMenuField(bpp_rect, "", "Color", __color_type);
|
|
||||||
|
|
||||||
box->AddChild(menufield);
|
|
||||||
width = StringWidth("Color") + 10;
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
|
|
||||||
__gamma = new BTextControl(gamma_rect, "", "Gamma", "", NULL);
|
|
||||||
box->AddChild(__gamma);
|
|
||||||
__gamma->SetDivider(width);
|
|
||||||
ostringstream oss3;
|
|
||||||
oss3 << __job_data->getGamma();
|
|
||||||
__gamma->SetText(oss3.str().c_str());
|
|
||||||
|
|
||||||
/* page range */
|
|
||||||
|
|
||||||
box = new BBox(pagerange_rect);
|
|
||||||
AddChild(box);
|
|
||||||
box->SetLabel("Page Range");
|
|
||||||
|
|
||||||
__all = new BRadioButton(all_button_rect, "", "All", new BMessage(M_RANGE_ALL));
|
|
||||||
box->AddChild(__all);
|
|
||||||
|
|
||||||
BRadioButton *from = new BRadioButton(selection_rect, "", "", new BMessage(M_RANGE_SELECTION));
|
|
||||||
box->AddChild(from);
|
|
||||||
|
|
||||||
from_page = new BTextControl(from_rect, "", "From", "", NULL);
|
|
||||||
box->AddChild(from_page);
|
|
||||||
from_page->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT);
|
|
||||||
from_page->SetDivider(StringWidth("From") + 7);
|
|
||||||
|
|
||||||
to_page = new BTextControl(to_rect, "", "To", "", NULL);
|
|
||||||
box->AddChild(to_page);
|
|
||||||
to_page->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT);
|
|
||||||
to_page->SetDivider(StringWidth("To") + 7);
|
|
||||||
|
|
||||||
int first_page = __job_data->getFirstPage();
|
|
||||||
int last_page = __job_data->getLastPage();
|
|
||||||
|
|
||||||
if (first_page <= 1 && last_page <= 0) {
|
|
||||||
__all->SetValue(B_CONTROL_ON);
|
|
||||||
from_page->SetEnabled(false);
|
|
||||||
to_page->SetEnabled(false);
|
|
||||||
} else {
|
|
||||||
from->SetValue(B_CONTROL_ON);
|
|
||||||
if (first_page < 1)
|
|
||||||
first_page = 1;
|
|
||||||
if (first_page > last_page)
|
|
||||||
last_page = -1;
|
|
||||||
|
|
||||||
ostringstream oss1;
|
|
||||||
oss1 << first_page;
|
|
||||||
from_page->SetText(oss1.str().c_str());
|
|
||||||
|
|
||||||
ostringstream oss2;
|
|
||||||
oss2 << last_page;
|
|
||||||
to_page->SetText(oss2.str().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
__all->SetTarget(this);
|
|
||||||
from->SetTarget(this);
|
|
||||||
|
|
||||||
/* paper source */
|
|
||||||
|
|
||||||
marked = false;
|
|
||||||
__paper_feed = new BPopUpMenu("");
|
|
||||||
__paper_feed->SetRadioMode(true);
|
|
||||||
count = __printer_cap->countCap(PrinterCap::PAPERSOURCE);
|
|
||||||
const PaperSourceCap **paper_source_cap = (const PaperSourceCap **)__printer_cap->enumCap(PrinterCap::PAPERSOURCE);
|
|
||||||
while (count--) {
|
|
||||||
item = new BMenuItem((*paper_source_cap)->label.c_str(), NULL);
|
|
||||||
__paper_feed->AddItem(item);
|
|
||||||
if ((*paper_source_cap)->paper_source == __job_data->getPaperSource()) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
paper_source_cap++;
|
|
||||||
}
|
|
||||||
if (!marked)
|
|
||||||
item->SetMarked(true);
|
|
||||||
menufield = new BMenuField(paperfeed_rect, "", "Paper Source", __paper_feed);
|
|
||||||
AddChild(menufield);
|
|
||||||
width = StringWidth("Number of Copies") + 7;
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
|
|
||||||
/* Page Per Sheet */
|
|
||||||
|
|
||||||
marked = false;
|
|
||||||
__nup = new BPopUpMenu("");
|
|
||||||
__nup->SetRadioMode(true);
|
|
||||||
count = sizeof(nups) / sizeof(nups[0]);
|
|
||||||
const NupCap **nup_cap = nups;
|
|
||||||
while (count--) {
|
|
||||||
item = new BMenuItem((*nup_cap)->label.c_str(), NULL);
|
|
||||||
__nup->AddItem(item);
|
|
||||||
if ((*nup_cap)->nup == __job_data->getNup()) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
nup_cap++;
|
|
||||||
}
|
|
||||||
if (!marked)
|
|
||||||
item->SetMarked(true);
|
|
||||||
menufield = new BMenuField(nup_rect, "", "Page Per Sheet", __nup);
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
AddChild(menufield);
|
|
||||||
|
|
||||||
/* duplex */
|
|
||||||
|
|
||||||
if (__printer_cap->isSupport(PrinterCap::PRINTSTYLE)) {
|
|
||||||
__duplex = new BCheckBox(duplex_rect, "Duplex", "Duplex", NULL);
|
|
||||||
AddChild(__duplex);
|
|
||||||
if (__job_data->getPrintStyle() != JobData::SIMPLEX) {
|
|
||||||
__duplex->SetValue(B_CONTROL_ON);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* copies */
|
|
||||||
|
|
||||||
copies = new BTextControl(copies_rect, "", "Number of Copies", "", NULL);
|
|
||||||
AddChild(copies);
|
|
||||||
copies->SetDivider(width);
|
|
||||||
|
|
||||||
ostringstream oss4;
|
|
||||||
oss4 << __job_data->getCopies();
|
|
||||||
copies->SetText(oss4.str().c_str());
|
|
||||||
|
|
||||||
/* collate */
|
|
||||||
|
|
||||||
__collate = new BCheckBox(collate_rect, "Collate", "Collate", NULL);
|
|
||||||
AddChild(__collate);
|
|
||||||
if (__job_data->getCollate()) {
|
|
||||||
__collate->SetValue(B_CONTROL_ON);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* reverse */
|
|
||||||
|
|
||||||
__reverse = new BCheckBox(reverse_rect, "Reverse", "Reverse", NULL);
|
|
||||||
AddChild(__reverse);
|
|
||||||
if (__job_data->getReverse()) {
|
|
||||||
__reverse->SetValue(B_CONTROL_ON);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cancel */
|
|
||||||
|
|
||||||
button = new BButton(cancel_rect, "", "Cancel", new BMessage(M_CANCEL));
|
|
||||||
AddChild(button);
|
|
||||||
|
|
||||||
/* ok */
|
|
||||||
|
|
||||||
button = new BButton(ok_rect, "", "OK", new BMessage(M_OK));
|
|
||||||
AddChild(button);
|
|
||||||
button->MakeDefault(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobSetupView::MessageReceived(BMessage *msg)
|
|
||||||
{
|
|
||||||
switch (msg->what) {
|
|
||||||
case M_RANGE_ALL:
|
|
||||||
Window()->Lock();
|
|
||||||
from_page->SetEnabled(false);
|
|
||||||
to_page->SetEnabled(false);
|
|
||||||
Window()->Unlock();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case M_RANGE_SELECTION:
|
|
||||||
Window()->Lock();
|
|
||||||
from_page->SetEnabled(true);
|
|
||||||
to_page->SetEnabled(true);
|
|
||||||
Window()->Unlock();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JobSetupView::UpdateJobData()
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
|
|
||||||
/*
|
|
||||||
count = sizeof(surfaces) / sizeof(surfaces[0]);
|
|
||||||
const SurfaceCap **surface_cap = surfaces;
|
|
||||||
const char *surface_label = __surface_type->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*surface_cap)->label.c_str(), surface_label)) {
|
|
||||||
__job_data->setSurfaceType((*surface_cap)->surface_type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
surface_cap++;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
count = __printer_cap->countCap(PrinterCap::COLOR);
|
|
||||||
const ColorCap **color_cap = (const ColorCap**)__printer_cap->enumCap(PrinterCap::COLOR);
|
|
||||||
const char *color_label = __color_type->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*color_cap)->label.c_str(), color_label)) {
|
|
||||||
__job_data->setColor((*color_cap)->color);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
color_cap++;
|
|
||||||
}
|
|
||||||
|
|
||||||
__job_data->setGamma(atof(__gamma->Text()));
|
|
||||||
|
|
||||||
int first_page;
|
|
||||||
int last_page;
|
|
||||||
|
|
||||||
if (B_CONTROL_ON == __all->Value()) {
|
|
||||||
first_page = 1;
|
|
||||||
last_page = -1;
|
|
||||||
} else {
|
|
||||||
first_page = atoi(from_page->Text());
|
|
||||||
last_page = atoi(to_page->Text());
|
|
||||||
}
|
|
||||||
|
|
||||||
__job_data->setFirstPage(first_page);
|
|
||||||
__job_data->setLastPage(last_page);
|
|
||||||
|
|
||||||
count = __printer_cap->countCap(PrinterCap::PAPERSOURCE);
|
|
||||||
const PaperSourceCap **paper_source_cap = (const PaperSourceCap **)__printer_cap->enumCap(PrinterCap::PAPERSOURCE);
|
|
||||||
const char *paper_source_label = __paper_feed->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*paper_source_cap)->label.c_str(), paper_source_label)) {
|
|
||||||
__job_data->setPaperSource((*paper_source_cap)->paper_source);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
paper_source_cap++;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = sizeof(nups) / sizeof(nups[0]);
|
|
||||||
const NupCap **nup_cap = nups;
|
|
||||||
const char *nup_label = __nup->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*nup_cap)->label.c_str(), nup_label)) {
|
|
||||||
__job_data->setNup((*nup_cap)->nup);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
nup_cap++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__printer_cap->isSupport(PrinterCap::PRINTSTYLE)) {
|
|
||||||
__job_data->setPrintStyle((B_CONTROL_ON == __duplex->Value()) ? JobData::DUPLEX : JobData::SIMPLEX);
|
|
||||||
}
|
|
||||||
|
|
||||||
__job_data->setCopies(atoi(copies->Text()));
|
|
||||||
|
|
||||||
__job_data->setCollate((B_CONTROL_ON == __collate->Value()) ? true : false);
|
|
||||||
__job_data->setReverse((B_CONTROL_ON == __reverse->Value()) ? true : false);
|
|
||||||
|
|
||||||
__job_data->save();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================================
|
|
||||||
|
|
||||||
filter_result PrintKeyFilter(BMessage *msg, BHandler **target, BMessageFilter *filter)
|
|
||||||
{
|
|
||||||
|
|
||||||
BWindow *window = (BWindow *)filter->Looper();
|
|
||||||
JobSetupView *view = (JobSetupView *)window->ChildAt(0);
|
|
||||||
|
|
||||||
if ((*target != view->copies->ChildAt(0)) &&
|
|
||||||
(*target != view->from_page->ChildAt(0)) &&
|
|
||||||
(*target != view->to_page->ChildAt(0)))
|
|
||||||
{
|
|
||||||
return B_DISPATCH_MESSAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong mods = msg->FindInt32("modifiers");
|
|
||||||
if (mods & B_COMMAND_KEY)
|
|
||||||
return B_DISPATCH_MESSAGE;
|
|
||||||
|
|
||||||
const uchar *bytes = NULL;
|
|
||||||
if (msg->FindString("bytes", (const char **)&bytes) != B_NO_ERROR)
|
|
||||||
return B_DISPATCH_MESSAGE;
|
|
||||||
|
|
||||||
long key = bytes[0];
|
|
||||||
if (key < '0') {
|
|
||||||
if ((key != B_TAB) && (key != B_BACKSPACE) && (key != B_ENTER) &&
|
|
||||||
(key != B_LEFT_ARROW) && (key != B_RIGHT_ARROW) &&
|
|
||||||
(key != B_UP_ARROW) && (key != B_DOWN_ARROW))
|
|
||||||
return B_SKIP_MESSAGE;
|
|
||||||
}
|
|
||||||
if (key > '9')
|
|
||||||
return B_SKIP_MESSAGE;
|
|
||||||
return B_DISPATCH_MESSAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================================
|
|
||||||
|
|
||||||
JobSetupDlg::JobSetupDlg(JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: BWindow(BRect(100, 100, 100 + PRINT_WIDTH, 100 + PRINT_HEIGHT),
|
|
||||||
"PrintJob Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
|
|
||||||
B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE)
|
|
||||||
{
|
|
||||||
__result = 0;
|
|
||||||
/*
|
|
||||||
ostringstream oss;
|
|
||||||
oss << printer_data->get_printer_name() << " Print";
|
|
||||||
SetTitle(oss.str().c_str());
|
|
||||||
*/
|
|
||||||
Lock();
|
|
||||||
JobSetupView *view = new JobSetupView(Bounds(), job_data, printer_data, printer_cap);
|
|
||||||
AddChild(view);
|
|
||||||
__filter = new BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE, B_KEY_DOWN, &PrintKeyFilter);
|
|
||||||
AddCommonFilter(__filter);
|
|
||||||
Unlock();
|
|
||||||
|
|
||||||
__semaphore = create_sem(0, "JobSetupSem");
|
|
||||||
}
|
|
||||||
|
|
||||||
JobSetupDlg::~JobSetupDlg()
|
|
||||||
{
|
|
||||||
Lock();
|
|
||||||
RemoveCommonFilter(__filter);
|
|
||||||
Unlock();
|
|
||||||
delete __filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JobSetupDlg::QuitRequested()
|
|
||||||
{
|
|
||||||
__result = B_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobSetupDlg::MessageReceived(BMessage *msg)
|
|
||||||
{
|
|
||||||
switch (msg->what) {
|
|
||||||
case M_OK:
|
|
||||||
Lock();
|
|
||||||
((JobSetupView *)ChildAt(0))->UpdateJobData();
|
|
||||||
Unlock();
|
|
||||||
__result = B_NO_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case M_CANCEL:
|
|
||||||
__result = B_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
BWindow::MessageReceived(msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int JobSetupDlg::Go()
|
|
||||||
{
|
|
||||||
Show();
|
|
||||||
acquire_sem(__semaphore);
|
|
||||||
delete_sem(__semaphore);
|
|
||||||
int value = __result;
|
|
||||||
Lock();
|
|
||||||
Quit();
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
/*
|
|
||||||
* PackBits.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//#define DBG_CON_STREAM
|
|
||||||
|
|
||||||
#ifdef DBG_CON_STREAM
|
|
||||||
#include <fstream>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "PackBits.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAXINBYTES 127
|
|
||||||
#define CONTROL1(i) -i
|
|
||||||
#define CONTROL2(i) i
|
|
||||||
|
|
||||||
enum STATUS {
|
|
||||||
INITIAL,
|
|
||||||
UNDECIDED,
|
|
||||||
UNMATCHED,
|
|
||||||
MATCHED
|
|
||||||
};
|
|
||||||
|
|
||||||
int pack_bits(unsigned char *pOut, unsigned char *pIn, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned char *control;
|
|
||||||
unsigned char *runbuf;
|
|
||||||
unsigned char thisbyte;
|
|
||||||
unsigned char runbyte;
|
|
||||||
STATUS status;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
status = INITIAL;
|
|
||||||
control = runbuf = pOut;
|
|
||||||
runbyte = *pIn++;
|
|
||||||
|
|
||||||
while (--n) {
|
|
||||||
thisbyte = *pIn++;
|
|
||||||
switch (status) {
|
|
||||||
case INITIAL:
|
|
||||||
control = runbuf++;
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
if (thisbyte == runbyte) {
|
|
||||||
status = UNDECIDED;
|
|
||||||
} else {
|
|
||||||
runbyte = thisbyte;
|
|
||||||
status = UNMATCHED;
|
|
||||||
}
|
|
||||||
i = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UNDECIDED:
|
|
||||||
if (i == MAXINBYTES) {
|
|
||||||
*control = CONTROL2(i);
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
runbyte = thisbyte;
|
|
||||||
status = INITIAL;
|
|
||||||
} else if (thisbyte == runbyte) {
|
|
||||||
if (i > 1) {
|
|
||||||
*control = CONTROL2(i - 2);
|
|
||||||
control = runbuf - 1;
|
|
||||||
}
|
|
||||||
i = 2;
|
|
||||||
status = MATCHED;
|
|
||||||
} else {
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
runbyte = thisbyte;
|
|
||||||
status = UNMATCHED;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UNMATCHED:
|
|
||||||
if (i == MAXINBYTES) {
|
|
||||||
*control = CONTROL2(i);
|
|
||||||
status = INITIAL;
|
|
||||||
} else {
|
|
||||||
if (thisbyte == runbyte) {
|
|
||||||
status = UNDECIDED;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
runbyte = thisbyte;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MATCHED:
|
|
||||||
if ((thisbyte != runbyte) || (i == MAXINBYTES)) {
|
|
||||||
runbuf = control;
|
|
||||||
*runbuf++ = CONTROL1(i);
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
runbyte = thisbyte;
|
|
||||||
status = INITIAL;
|
|
||||||
} else {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (status) {
|
|
||||||
case INITIAL:
|
|
||||||
*runbuf++ = CONTROL2(1);
|
|
||||||
break;
|
|
||||||
case UNDECIDED:
|
|
||||||
case UNMATCHED:
|
|
||||||
*control = CONTROL2(i);
|
|
||||||
break;
|
|
||||||
case MATCHED:
|
|
||||||
runbuf = control;
|
|
||||||
*runbuf++ = CONTROL1(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*runbuf++ = runbyte;
|
|
||||||
|
|
||||||
return runbuf - pOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DBG_CON_STREAM
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
if (argc < 2) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifstream ifs(*++argv, ios::binary | ios::nocreate);
|
|
||||||
if (!ifs) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifs.seekg(0, ios::end);
|
|
||||||
long size = ifs.tellg();
|
|
||||||
ifs.seekg(0, ios::beg);
|
|
||||||
|
|
||||||
unsigned char *pIn = new unsigned char[size];
|
|
||||||
unsigned char *pOut = new unsigned char[size * 3];
|
|
||||||
|
|
||||||
ifs.read(pIn, size);
|
|
||||||
|
|
||||||
int cnt = PackBits(pOut, pIn, size);
|
|
||||||
|
|
||||||
ofstream ofs("test.bin", ios::binary);
|
|
||||||
ofs.write(pOut, cnt);
|
|
||||||
|
|
||||||
delete [] pIn;
|
|
||||||
delete [] pOut;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
/*
|
|
||||||
* PageSetupDlg.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <Alert.h>
|
|
||||||
#include <Bitmap.h>
|
|
||||||
#include <Box.h>
|
|
||||||
#include <Button.h>
|
|
||||||
#include <Looper.h>
|
|
||||||
#include <MessageFilter.h>
|
|
||||||
#include <MenuField.h>
|
|
||||||
#include <MenuItem.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include <Point.h>
|
|
||||||
#include <PopUpMenu.h>
|
|
||||||
#include <PrintJob.h>
|
|
||||||
#include <RadioButton.h>
|
|
||||||
#include <Rect.h>
|
|
||||||
#include <TextControl.h>
|
|
||||||
#include <View.h>
|
|
||||||
|
|
||||||
#include "PageSetupDlg.h"
|
|
||||||
#include "JobData.h"
|
|
||||||
#include "PrinterData.h"
|
|
||||||
#include "PrinterCap.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PAGESETUP_WIDTH 270
|
|
||||||
#define PAGESETUP_HEIGHT 125
|
|
||||||
|
|
||||||
#define MENU_HEIGHT 16
|
|
||||||
#define BUTTON_WIDTH 70
|
|
||||||
#define BUTTON_HEIGHT 20
|
|
||||||
|
|
||||||
#define ORIENT_H 10
|
|
||||||
#define ORIENT_V 10
|
|
||||||
#define ORIENT_WIDTH 100
|
|
||||||
#define ORIENT_HEIGHT 60
|
|
||||||
#define PORT_TEXT "Portrait"
|
|
||||||
#define RAND_TEXT "Landscape"
|
|
||||||
|
|
||||||
#define PAPER_H ORIENT_H + ORIENT_WIDTH + 15
|
|
||||||
#define PAPER_V 20
|
|
||||||
#define PAPER_WIDTH 200
|
|
||||||
#define PAPER_HEIGHT MENU_HEIGHT
|
|
||||||
#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 OK_H (PAGESETUP_WIDTH - BUTTON_WIDTH - 11)
|
|
||||||
#define OK_V (PAGESETUP_HEIGHT - BUTTON_HEIGHT - 11)
|
|
||||||
#define OK_TEXT "OK"
|
|
||||||
|
|
||||||
#define CANCEL_H (OK_H - BUTTON_WIDTH - 12)
|
|
||||||
#define CANCEL_V OK_V
|
|
||||||
#define CANCEL_TEXT "Cancel"
|
|
||||||
|
|
||||||
#define PRINT_LINE_V (PAGESETUP_HEIGHT - BUTTON_HEIGHT - 23)
|
|
||||||
|
|
||||||
const BRect ORIENTAION_RECT(
|
|
||||||
ORIENT_H,
|
|
||||||
ORIENT_V,
|
|
||||||
ORIENT_H + ORIENT_WIDTH,
|
|
||||||
ORIENT_V + ORIENT_HEIGHT);
|
|
||||||
|
|
||||||
const BRect PORT_RECT(10, 15, 80, 14);
|
|
||||||
const BRect LAND_RECT(10, 35, 80, 14);
|
|
||||||
|
|
||||||
const BRect PAPER_RECT(
|
|
||||||
PAPER_H,
|
|
||||||
PAPER_V,
|
|
||||||
PAPER_H + PAPER_WIDTH,
|
|
||||||
PAPER_V + PAPER_HEIGHT);
|
|
||||||
|
|
||||||
const BRect RESOLUTION_RECT(
|
|
||||||
RES_H,
|
|
||||||
RES_V,
|
|
||||||
RES_H + RES_WIDTH,
|
|
||||||
RES_V + RES_HEIGHT);
|
|
||||||
|
|
||||||
const BRect OK_RECT(
|
|
||||||
OK_H,
|
|
||||||
OK_V,
|
|
||||||
OK_H + BUTTON_WIDTH,
|
|
||||||
OK_V + BUTTON_HEIGHT);
|
|
||||||
|
|
||||||
const BRect CANCEL_RECT(
|
|
||||||
CANCEL_H,
|
|
||||||
CANCEL_V,
|
|
||||||
CANCEL_H + BUTTON_WIDTH,
|
|
||||||
CANCEL_V + BUTTON_HEIGHT);
|
|
||||||
|
|
||||||
enum MSGS {
|
|
||||||
M_CANCEL = 1,
|
|
||||||
M_OK
|
|
||||||
};
|
|
||||||
|
|
||||||
PageSetupView::PageSetupView(BRect frame, JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW), __job_data(job_data), __printer_data(printer_data), __printer_cap(printer_cap)
|
|
||||||
{
|
|
||||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
|
||||||
}
|
|
||||||
|
|
||||||
PageSetupView::~PageSetupView()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void PageSetupView::AttachedToWindow()
|
|
||||||
{
|
|
||||||
BMenuItem *item = NULL;
|
|
||||||
BMenuField *menufield;
|
|
||||||
BButton *button;
|
|
||||||
bool marked;
|
|
||||||
int count;
|
|
||||||
|
|
||||||
/* orientaion */
|
|
||||||
|
|
||||||
BBox *box = new BBox(ORIENTAION_RECT);
|
|
||||||
AddChild(box);
|
|
||||||
box->SetLabel("Orientation");
|
|
||||||
|
|
||||||
__portrait = new BRadioButton(PORT_RECT, "", PORT_TEXT, NULL);
|
|
||||||
box->AddChild(__portrait);
|
|
||||||
|
|
||||||
BRadioButton *landscape = new BRadioButton(LAND_RECT, "", RAND_TEXT, NULL);
|
|
||||||
box->AddChild(landscape);
|
|
||||||
|
|
||||||
if (JobData::PORTRAIT == __job_data->getOrientation())
|
|
||||||
__portrait->SetValue(B_CONTROL_ON);
|
|
||||||
else
|
|
||||||
landscape->SetValue(B_CONTROL_ON);
|
|
||||||
|
|
||||||
/* paper selection */
|
|
||||||
|
|
||||||
marked = false;
|
|
||||||
__paper = new BPopUpMenu("");
|
|
||||||
__paper->SetRadioMode(true);
|
|
||||||
count = __printer_cap->countCap(PrinterCap::PAPER);
|
|
||||||
PaperCap **paper_cap = (PaperCap **)__printer_cap->enumCap(PrinterCap::PAPER);
|
|
||||||
while (count--) {
|
|
||||||
item = new BMenuItem((*paper_cap)->label.c_str(), NULL);
|
|
||||||
__paper->AddItem(item);
|
|
||||||
item->SetTarget(this);
|
|
||||||
if ((*paper_cap)->paper == __job_data->getPaper()) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
paper_cap++;
|
|
||||||
}
|
|
||||||
if (!marked)
|
|
||||||
item->SetMarked(true);
|
|
||||||
menufield = new BMenuField(PAPER_RECT, "", PAPER_TEXT, __paper);
|
|
||||||
AddChild(menufield);
|
|
||||||
float width = StringWidth(PAPER_TEXT) + 7;
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
|
|
||||||
/* resolution */
|
|
||||||
|
|
||||||
marked = false;
|
|
||||||
__resolution = new BPopUpMenu("");
|
|
||||||
__resolution->SetRadioMode(true);
|
|
||||||
count = __printer_cap->countCap(PrinterCap::RESOLUTION);
|
|
||||||
ResolutionCap **resolution_cap = (ResolutionCap **)__printer_cap->enumCap(PrinterCap::RESOLUTION);
|
|
||||||
while (count--) {
|
|
||||||
item = new BMenuItem((*resolution_cap)->label.c_str(), NULL);
|
|
||||||
__resolution->AddItem(item);
|
|
||||||
item->SetTarget(this);
|
|
||||||
if (((*resolution_cap)->xres == __job_data->getXres()) && ((*resolution_cap)->yres == __job_data->getYres())) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
marked = true;
|
|
||||||
}
|
|
||||||
resolution_cap++;
|
|
||||||
}
|
|
||||||
if (!marked)
|
|
||||||
item->SetMarked(true);
|
|
||||||
menufield = new BMenuField(RESOLUTION_RECT, "", RES_TEXT, __resolution);
|
|
||||||
AddChild(menufield);
|
|
||||||
menufield->SetDivider(width);
|
|
||||||
|
|
||||||
/* cancel */
|
|
||||||
|
|
||||||
button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(M_CANCEL));
|
|
||||||
AddChild(button);
|
|
||||||
|
|
||||||
/* ok */
|
|
||||||
|
|
||||||
button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(M_OK));
|
|
||||||
AddChild(button);
|
|
||||||
button->MakeDefault(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void swap(float *e1, float *e2)
|
|
||||||
{
|
|
||||||
float e = *e1;
|
|
||||||
*e1 = *e2;
|
|
||||||
*e2 = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PageSetupView::UpdateJobData()
|
|
||||||
{
|
|
||||||
if (B_CONTROL_ON == __portrait->Value()) {
|
|
||||||
__job_data->setOrientation(JobData::PORTRAIT);
|
|
||||||
} else {
|
|
||||||
__job_data->setOrientation(JobData::LANDSCAPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
BRect paper_rect;
|
|
||||||
BRect printable_rect;
|
|
||||||
|
|
||||||
int count;
|
|
||||||
|
|
||||||
count = __printer_cap->countCap(PrinterCap::PAPER);
|
|
||||||
PaperCap **paper_cap = (PaperCap **)__printer_cap->enumCap(PrinterCap::PAPER);
|
|
||||||
const char *paper_label = __paper->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*paper_cap)->label.c_str(), paper_label)) {
|
|
||||||
__job_data->setPaper((*paper_cap)->paper);
|
|
||||||
paper_rect = (*paper_cap)->paper_rect;
|
|
||||||
printable_rect = (*paper_cap)->printable_rect;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
paper_cap++;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = __printer_cap->countCap(PrinterCap::RESOLUTION);
|
|
||||||
ResolutionCap **resolution_cap = (ResolutionCap **)__printer_cap->enumCap(PrinterCap::RESOLUTION);
|
|
||||||
const char *resolution_label = __resolution->FindMarked()->Label();
|
|
||||||
while (count--) {
|
|
||||||
if (!strcmp((*resolution_cap)->label.c_str(), resolution_label)) {
|
|
||||||
__job_data->setXres((*resolution_cap)->xres);
|
|
||||||
__job_data->setYres((*resolution_cap)->yres);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
resolution_cap++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (JobData::LANDSCAPE == __job_data->getOrientation()) {
|
|
||||||
swap(&paper_rect.left, &paper_rect.top);
|
|
||||||
swap(&paper_rect.right, &paper_rect.bottom);
|
|
||||||
swap(&printable_rect.left, &printable_rect.top);
|
|
||||||
swap(&printable_rect.right, &printable_rect.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
__job_data->setScaling(100.0);
|
|
||||||
__job_data->setPaperRect(paper_rect);
|
|
||||||
__job_data->setPrintableRect(printable_rect);
|
|
||||||
|
|
||||||
__job_data->save();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================================
|
|
||||||
|
|
||||||
PageSetupDlg::PageSetupDlg(JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: BWindow(BRect(100, 100, 100 + PAGESETUP_WIDTH, 100 + PAGESETUP_HEIGHT),
|
|
||||||
"Page Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
|
|
||||||
B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE)
|
|
||||||
{
|
|
||||||
__result = 0;
|
|
||||||
/*
|
|
||||||
ostringstream oss;
|
|
||||||
oss << printer_data->get_printer_name() << " Setup";
|
|
||||||
SetTitle(title.str().c_str());
|
|
||||||
*/
|
|
||||||
|
|
||||||
Lock();
|
|
||||||
PageSetupView *view = new PageSetupView(Bounds(), job_data, printer_data, printer_cap);
|
|
||||||
AddChild(view);
|
|
||||||
Unlock();
|
|
||||||
|
|
||||||
__semaphore = create_sem(0, "PageSetupSem");
|
|
||||||
}
|
|
||||||
|
|
||||||
PageSetupDlg::~PageSetupDlg()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PageSetupDlg::QuitRequested()
|
|
||||||
{
|
|
||||||
__result = B_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PageSetupDlg::MessageReceived(BMessage *msg)
|
|
||||||
{
|
|
||||||
switch (msg->what) {
|
|
||||||
case M_OK:
|
|
||||||
Lock();
|
|
||||||
((PageSetupView *)ChildAt(0))->UpdateJobData();
|
|
||||||
Unlock();
|
|
||||||
__result = B_NO_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case M_CANCEL:
|
|
||||||
__result = B_ERROR;
|
|
||||||
release_sem(__semaphore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
BWindow::MessageReceived(msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int PageSetupDlg::Go()
|
|
||||||
{
|
|
||||||
Show();
|
|
||||||
acquire_sem(__semaphore);
|
|
||||||
delete_sem(__semaphore);
|
|
||||||
int value = __result;
|
|
||||||
Lock();
|
|
||||||
Quit();
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* Preview.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <View.h>
|
|
||||||
#include "Preview.h"
|
|
||||||
|
|
||||||
#ifdef USE_PREVIEW_FOR_DEBUG
|
|
||||||
|
|
||||||
class PreviewView : public BView {
|
|
||||||
public:
|
|
||||||
PreviewView(BRect, BBitmap *);
|
|
||||||
void Draw(BRect);
|
|
||||||
private:
|
|
||||||
BBitmap *__bitmap;
|
|
||||||
};
|
|
||||||
|
|
||||||
PreviewView::PreviewView(BRect frame, BBitmap *bitmap)
|
|
||||||
: BView(frame, "preview", B_FOLLOW_ALL, B_WILL_DRAW)
|
|
||||||
{
|
|
||||||
__bitmap = bitmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PreviewView::Draw(BRect)
|
|
||||||
{
|
|
||||||
DrawBitmap(__bitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
PreviewWindow::PreviewWindow(BRect frame, const char *title, BBitmap *bitmap)
|
|
||||||
: BWindow(frame, title, B_TITLED_WINDOW, 0)
|
|
||||||
{
|
|
||||||
AddChild(new PreviewView(Bounds(), bitmap));
|
|
||||||
__semaphore = create_sem(0, "PreviewSem");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PreviewWindow::QuitRequested()
|
|
||||||
{
|
|
||||||
release_sem(__semaphore);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PreviewWindow::Go()
|
|
||||||
{
|
|
||||||
Show();
|
|
||||||
acquire_sem(__semaphore);
|
|
||||||
delete_sem(__semaphore);
|
|
||||||
Lock();
|
|
||||||
Quit();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* USE_PREVIEW_FOR_DEBUG */
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* PrinterCap.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "PrinterCap.h"
|
|
||||||
|
|
||||||
PrinterCap::PrinterCap(const PrinterData *printer_data)
|
|
||||||
: __printer_data(printer_data), __printer_id(UNKNOWN_PRINTER)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterCap::~PrinterCap()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
PrinterCap::PrinterCap(const PrinterCap &printer_cap)
|
|
||||||
{
|
|
||||||
__printer_data = printer_cap.__printer_data;
|
|
||||||
__printer_id = printer_cap.__printer_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterCap::PrinterCap &operator = (const PrinterCap &printer_cap)
|
|
||||||
{
|
|
||||||
__printer_data = printer_cap.__printer_data;
|
|
||||||
__printer_id = printer_cap.__printer_id;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
const BaseCap *PrinterCap::getDefaultCap(CAPID id) const
|
|
||||||
{
|
|
||||||
int count = countCap(id);
|
|
||||||
if (count > 0) {
|
|
||||||
const BaseCap **base_cap = enumCap(id);
|
|
||||||
while (count--) {
|
|
||||||
if ((*base_cap)->is_default) {
|
|
||||||
return *base_cap;
|
|
||||||
}
|
|
||||||
base_cap++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* PrinterData.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Directory.h>
|
|
||||||
#include <FindDirectory.h>
|
|
||||||
#include <Path.h>
|
|
||||||
#include <StorageDefs.h>
|
|
||||||
|
|
||||||
#include "PrinterData.h"
|
|
||||||
|
|
||||||
const char *PD_DRIVER_NAME = "Driver Name";
|
|
||||||
const char *PD_PRINTER_NAME = "Printer Name";
|
|
||||||
const char *PD_COMMENTS = "Comments";
|
|
||||||
const char *PD_TRANSPORT = "transport";
|
|
||||||
|
|
||||||
PrinterData::PrinterData(BNode *node)
|
|
||||||
{
|
|
||||||
if (node) {
|
|
||||||
load(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterData::~PrinterData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
PrinterData::PrinterData(const PrinterData &printer_data)
|
|
||||||
{
|
|
||||||
__driver_name = printer_data.__driver_name;
|
|
||||||
__printer_name = printer_data.__printer_name;
|
|
||||||
__comments = printer_data.__comments;
|
|
||||||
__transport = printer_data.__transport;
|
|
||||||
__node = printer_data.__node;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterData &PrinterData::operator = (const PrinterData &printer_data)
|
|
||||||
{
|
|
||||||
__driver_name = printer_data.__driver_name;
|
|
||||||
__printer_name = printer_data.__printer_name;
|
|
||||||
__comments = printer_data.__comments;
|
|
||||||
__transport = printer_data.__transport;
|
|
||||||
__node = printer_data.__node;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void PrinterData::load(BNode *node)
|
|
||||||
{
|
|
||||||
char buffer[512];
|
|
||||||
|
|
||||||
__node = node;
|
|
||||||
|
|
||||||
__node->ReadAttr(PD_DRIVER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
|
||||||
__driver_name = buffer;
|
|
||||||
__node->ReadAttr(PD_PRINTER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
|
||||||
__printer_name = buffer;
|
|
||||||
__node->ReadAttr(PD_COMMENTS, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
|
||||||
__comments = buffer;
|
|
||||||
__node->ReadAttr(PD_TRANSPORT, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
|
||||||
__transport = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void PrinterData::save(BNode *node)
|
|
||||||
{
|
|
||||||
BDirectory dir;
|
|
||||||
if (node == NULL) {
|
|
||||||
BPath path;
|
|
||||||
::find_directory(B_USER_PRINTERS_DIRECTORY, &path, false);
|
|
||||||
path.Append(__printer_name.c_str());
|
|
||||||
BDirectory base_dir;
|
|
||||||
base_dir.CreateDirectory(path.Path(), &dir);
|
|
||||||
node = &dir;
|
|
||||||
}
|
|
||||||
node->WriteAttr(PD_DRIVER_NAME, B_STRING_TYPE, 0, driver_name_.c_str(), driver_name_.length() + 1);
|
|
||||||
node->WriteAttr(PD_PRINTER_NAME, B_STRING_TYPE, 0, printer_name_.c_str(), printer_name_.length() + 1);
|
|
||||||
node->WriteAttr(PD_COMMENTS, B_STRING_TYPE, 0, comments_.c_str(), comments_.length() + 1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool PrinterData::getPath(char *buf) const
|
|
||||||
{
|
|
||||||
if (__node) {
|
|
||||||
node_ref nref;
|
|
||||||
__node->GetNodeRef(&nref);
|
|
||||||
BDirectory dir;
|
|
||||||
dir.SetTo(&nref);
|
|
||||||
BPath path(&dir, NULL);
|
|
||||||
strcpy(buf, path.Path());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
*buf = '\0';
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* SpoolMetaData.cpp
|
|
||||||
* Copyright 2003 Michael Pfeiffer. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "SpoolMetaData.h"
|
|
||||||
#include <String.h>
|
|
||||||
|
|
||||||
const char *SD_DESCRIPTION = "_spool/Description";
|
|
||||||
const char* SD_MIME_TYPE = "_spool/MimeType";
|
|
||||||
|
|
||||||
SpoolMetaData::SpoolMetaData(BFile* spool_file)
|
|
||||||
{
|
|
||||||
BString string;
|
|
||||||
time_t time;
|
|
||||||
if (spool_file->ReadAttrString(SD_DESCRIPTION, &string) == B_OK) {
|
|
||||||
__description = string.String();
|
|
||||||
}
|
|
||||||
if (spool_file->ReadAttrString(SD_MIME_TYPE, &string) == B_OK) {
|
|
||||||
__mime_type = string.String();
|
|
||||||
}
|
|
||||||
if (spool_file->GetCreationTime(&time) == B_OK) {
|
|
||||||
__creation_time = ctime(&time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SpoolMetaData::~SpoolMetaData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* Transport.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <FindDirectory.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include <Directory.h>
|
|
||||||
#include <DataIO.h>
|
|
||||||
#include <Path.h>
|
|
||||||
#include <image.h>
|
|
||||||
|
|
||||||
#include "Transport.h"
|
|
||||||
#include "PrinterData.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
|
|
||||||
using namespace std;
|
|
||||||
#else
|
|
||||||
#define std
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Transport::Transport(const PrinterData *printer_data)
|
|
||||||
: __image(-1), __init_transport(0), __exit_transport(0), __data_stream(0), __abort(false)
|
|
||||||
{
|
|
||||||
BPath path;
|
|
||||||
|
|
||||||
if (B_OK == find_directory(B_USER_ADDONS_DIRECTORY, &path)) {
|
|
||||||
path.Append("Print/transport");
|
|
||||||
path.Append(printer_data->getTransport().c_str());
|
|
||||||
DBGMSG(("load_add_on: %s\n", path.Path()));
|
|
||||||
__image = load_add_on(path.Path());
|
|
||||||
}
|
|
||||||
if (__image < 0) {
|
|
||||||
if (B_OK == find_directory(B_BEOS_ADDONS_DIRECTORY, &path)) {
|
|
||||||
path.Append("Print/transport");
|
|
||||||
path.Append(printer_data->getTransport().c_str());
|
|
||||||
DBGMSG(("load_add_on: %s\n", path.Path()));
|
|
||||||
__image = load_add_on(path.Path());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__image < 0) {
|
|
||||||
set_last_error("cannot load a transport add-on");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBGMSG(("image id = %d\n", (int)__image));
|
|
||||||
|
|
||||||
get_image_symbol(__image, "init_transport", B_SYMBOL_TYPE_TEXT, (void **)&__init_transport);
|
|
||||||
get_image_symbol(__image, "exit_transport", B_SYMBOL_TYPE_TEXT, (void **)&__exit_transport);
|
|
||||||
|
|
||||||
if (__init_transport == NULL) {
|
|
||||||
set_last_error("get_image_symbol failed.");
|
|
||||||
DBGMSG(("init_transport is NULL\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__exit_transport == NULL) {
|
|
||||||
set_last_error("get_image_symbol failed.");
|
|
||||||
DBGMSG(("exit_transport is NULL\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__init_transport) {
|
|
||||||
char spool_path[256];
|
|
||||||
printer_data->getPath(spool_path);
|
|
||||||
BMessage *msg = new BMessage('TRIN');
|
|
||||||
msg->AddString("printer_file", spool_path);
|
|
||||||
__data_stream = (*__init_transport)(msg);
|
|
||||||
delete msg;
|
|
||||||
if (__data_stream == 0) {
|
|
||||||
set_last_error("init_transport failed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Transport::~Transport()
|
|
||||||
{
|
|
||||||
if (__exit_transport) {
|
|
||||||
(*__exit_transport)();
|
|
||||||
}
|
|
||||||
if (__image >= 0) {
|
|
||||||
unload_add_on(__image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Transport::check_abort() const
|
|
||||||
{
|
|
||||||
return __data_stream == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string &Transport::last_error() const
|
|
||||||
{
|
|
||||||
return __last_error_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Transport::set_last_error(const char *e)
|
|
||||||
{
|
|
||||||
__last_error_string = e;
|
|
||||||
__abort = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Transport::write(const void *buffer, size_t size) throw(TransportException)
|
|
||||||
{
|
|
||||||
if (__data_stream) {
|
|
||||||
if (size == (size_t)__data_stream->Write(buffer, size)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
set_last_error("BDataIO::Write failed.");
|
|
||||||
}
|
|
||||||
throw TransportException(last_error());
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* UIDriver.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Message.h>
|
|
||||||
|
|
||||||
#include "UIDriver.h"
|
|
||||||
#include "JobData.h"
|
|
||||||
#include "PrinterData.h"
|
|
||||||
#include "JobSetupDlg.h"
|
|
||||||
#include "PageSetupDlg.h"
|
|
||||||
#include "DbgMsg.h"
|
|
||||||
|
|
||||||
UIDriver::UIDriver(BMessage *msg, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
: __msg(msg), __printer_data(printer_data), __printer_cap(printer_cap)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
UIDriver::~UIDriver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
BMessage *UIDriver::configPage()
|
|
||||||
{
|
|
||||||
BMessage *clone_msg = new BMessage(*__msg);
|
|
||||||
JobData *job_data = new JobData(clone_msg, __printer_cap);
|
|
||||||
|
|
||||||
if (doPageSetup(job_data,__printer_data, __printer_cap) < 0) {
|
|
||||||
delete clone_msg;
|
|
||||||
clone_msg = NULL;
|
|
||||||
} else {
|
|
||||||
clone_msg->what = 'okok';
|
|
||||||
}
|
|
||||||
|
|
||||||
delete job_data;
|
|
||||||
return clone_msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
BMessage *UIDriver::configJob()
|
|
||||||
{
|
|
||||||
BMessage *clone_msg = new BMessage(*__msg);
|
|
||||||
JobData *job_data = new JobData(clone_msg, __printer_cap);
|
|
||||||
|
|
||||||
if (doJobSetup(job_data, __printer_data, __printer_cap) < 0) {
|
|
||||||
delete clone_msg;
|
|
||||||
clone_msg = NULL;
|
|
||||||
} else {
|
|
||||||
clone_msg->what = 'okok';
|
|
||||||
}
|
|
||||||
|
|
||||||
delete job_data;
|
|
||||||
return clone_msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
long UIDriver::doPageSetup(JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
{
|
|
||||||
PageSetupDlg *dlg = new PageSetupDlg(job_data, printer_data, printer_cap);
|
|
||||||
return dlg->Go();
|
|
||||||
}
|
|
||||||
|
|
||||||
long UIDriver::doJobSetup(JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap)
|
|
||||||
{
|
|
||||||
JobSetupDlg *dlg = new JobSetupDlg(job_data, printer_data, printer_cap);
|
|
||||||
return dlg->Go();
|
|
||||||
}
|
|
||||||
@@ -1,253 +0,0 @@
|
|||||||
/*
|
|
||||||
* ValidRect.cpp
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Bitmap.h>
|
|
||||||
#include "ValidRect.h"
|
|
||||||
|
|
||||||
bool get_valid_line_RGB32(
|
|
||||||
const uchar *bits,
|
|
||||||
const rgb_color *,
|
|
||||||
int width,
|
|
||||||
int *left,
|
|
||||||
int *right)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
rgb_color c;
|
|
||||||
const rgb_color *ptr = (const rgb_color *)bits;
|
|
||||||
|
|
||||||
while (i < *left) {
|
|
||||||
c = *ptr++;
|
|
||||||
if (c.red != 0xff || c.green != 0xff || c.blue != 0xff) {
|
|
||||||
*left = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == width) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = width - 1;
|
|
||||||
ptr = (const rgb_color *)bits + width - 1;
|
|
||||||
|
|
||||||
while (i > *right) {
|
|
||||||
c = *ptr--;
|
|
||||||
if (c.red != 0xff || c.green != 0xff || c.blue != 0xff) {
|
|
||||||
*right = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool get_valid_line_CMAP8(
|
|
||||||
const uchar *bits,
|
|
||||||
const rgb_color *palette,
|
|
||||||
int width,
|
|
||||||
int *left,
|
|
||||||
int *right)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
rgb_color c;
|
|
||||||
const uchar *ptr = bits;
|
|
||||||
|
|
||||||
while (i < *left) {
|
|
||||||
c = palette[*ptr++];
|
|
||||||
if (c.red != 0xff || c.green != 0xff || c.blue != 0xff) {
|
|
||||||
*left = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == width) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = width - 1;
|
|
||||||
ptr = bits + width - 1;
|
|
||||||
|
|
||||||
while (i > *right) {
|
|
||||||
c = palette[*ptr--];
|
|
||||||
if (c.red != 0xff || c.green != 0xff || c.blue != 0xff) {
|
|
||||||
*right = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool get_valid_line_GRAY8(
|
|
||||||
const uchar *bits,
|
|
||||||
const rgb_color *,
|
|
||||||
int width,
|
|
||||||
int *left,
|
|
||||||
int *right)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
const uchar *ptr = bits;
|
|
||||||
|
|
||||||
while (i < *left) {
|
|
||||||
if (*ptr++) {
|
|
||||||
*left = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == width) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = width - 1;
|
|
||||||
ptr = bits + width - 1;
|
|
||||||
|
|
||||||
while (i > *right) {
|
|
||||||
if (*ptr--) {
|
|
||||||
*right = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool get_valid_line_GRAY1(
|
|
||||||
const uchar *bits,
|
|
||||||
const rgb_color *,
|
|
||||||
int width,
|
|
||||||
int *left,
|
|
||||||
int *right)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
const uchar *ptr = bits;
|
|
||||||
|
|
||||||
while (i < *left) {
|
|
||||||
if (*ptr++) {
|
|
||||||
*left = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == width) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = width - 1;
|
|
||||||
ptr = bits + ((width - 1) + 7) / 8;
|
|
||||||
|
|
||||||
while (i > *right) {
|
|
||||||
if (*ptr--) {
|
|
||||||
*right = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i -= 8;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef bool (*PFN_GET_VALID_LINE)(const uchar *, const rgb_color *, int, int *, int *);
|
|
||||||
|
|
||||||
bool get_valid_rect(BBitmap *a_bitmap, const rgb_color *palette, RECT *rc)
|
|
||||||
{
|
|
||||||
int width = rc->right - rc->left + 1;
|
|
||||||
int height = rc->bottom - rc->top + 1;
|
|
||||||
int delta = a_bitmap->BytesPerRow();
|
|
||||||
|
|
||||||
int left = width;
|
|
||||||
int right = 0;
|
|
||||||
int top = 0;
|
|
||||||
int bottom = 0;
|
|
||||||
|
|
||||||
PFN_GET_VALID_LINE get_valid_line;
|
|
||||||
|
|
||||||
switch (a_bitmap->ColorSpace()) {
|
|
||||||
case B_RGB32:
|
|
||||||
case B_RGB32_BIG:
|
|
||||||
get_valid_line = get_valid_line_RGB32;
|
|
||||||
break;
|
|
||||||
case B_CMAP8:
|
|
||||||
get_valid_line = get_valid_line_CMAP8;
|
|
||||||
break;
|
|
||||||
case B_GRAY8:
|
|
||||||
get_valid_line = get_valid_line_GRAY8;
|
|
||||||
break;
|
|
||||||
case B_GRAY1:
|
|
||||||
get_valid_line = get_valid_line_GRAY1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
get_valid_line = get_valid_line_GRAY1;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
uchar *ptr = (uchar *)a_bitmap->Bits();
|
|
||||||
|
|
||||||
while (i < height) {
|
|
||||||
if (get_valid_line(ptr, palette, width, &left, &right)) {
|
|
||||||
top = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ptr += delta;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == height) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int j = height - 1;
|
|
||||||
ptr = (uchar *)a_bitmap->Bits() + (height - 1) * delta;
|
|
||||||
bool found_boundary = false;
|
|
||||||
|
|
||||||
while (j >= i) {
|
|
||||||
if (get_valid_line(ptr, palette, width, &left, &right)) {
|
|
||||||
if (!found_boundary) {
|
|
||||||
bottom = j;
|
|
||||||
found_boundary = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptr -= delta;
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc->left = left;
|
|
||||||
rc->top = top;
|
|
||||||
rc->right = right;
|
|
||||||
rc->bottom = bottom;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int color_space2pixel_depth(color_space cs)
|
|
||||||
{
|
|
||||||
int pixel_depth;
|
|
||||||
|
|
||||||
switch (cs) {
|
|
||||||
case B_GRAY1: /* Y0[0],Y1[0],Y2[0],Y3[0],Y4[0],Y5[0],Y6[0],Y7[0] */
|
|
||||||
pixel_depth = 1;
|
|
||||||
break;
|
|
||||||
case B_GRAY8: /* Y[7:0] */
|
|
||||||
case B_CMAP8: /* D[7:0] */
|
|
||||||
pixel_depth = 8;
|
|
||||||
break;
|
|
||||||
case B_RGB15: /* G[2:0],B[4:0] -[0],R[4:0],G[4:3] */
|
|
||||||
case B_RGB15_BIG: /* -[0],R[4:0],G[4:3] G[2:0],B[4:0] */
|
|
||||||
pixel_depth = 16;
|
|
||||||
break;
|
|
||||||
case B_RGB32: /* B[7:0] G[7:0] R[7:0] -[7:0] */
|
|
||||||
case B_RGB32_BIG: /* -[7:0] R[7:0] G[7:0] B[7:0] */
|
|
||||||
pixel_depth = 32;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
pixel_depth = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return pixel_depth;
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* _sstream
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if __MWERKS__
|
|
||||||
#include <sstream>
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef __SSTREAM_H
|
|
||||||
#define __SSTREAM_H
|
|
||||||
|
|
||||||
#include <strstream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class ostringstream : public ostrstream {
|
|
||||||
public:
|
|
||||||
ostringstream() : ostrstream() {}
|
|
||||||
~ostringstream() { delete [] ostrstream::str(); }
|
|
||||||
string str() { *this << ends; return string(ostrstream::str()); }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __SSTREAM_H */
|
|
||||||
#endif /* USING_STRSTREAM */
|
|
||||||
Reference in New Issue
Block a user