root/src/add-ons/print/drivers/pcl6/PCL6Cap.cpp
/*
 * PCL6Cap.cpp
 * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
 * Copyright 2003-2007 Michael Pfeiffer.
 */
#include "PCL6Cap.h"

#include "PCL6Config.h"
#include "PCL6Writer.h"
#include "PrinterData.h"

#define TO72DPI(a)      (a * 72.0f / 600.0f)

// since 1.1
const PaperCap letter(
        "Letter",
        false,
        JobData::kLetter,
        BRect(0.0f,            0.0f,            TO72DPI(5100.0f), TO72DPI(6600.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4980.0f), TO72DPI(6480.0f)));

// since 1.1
const PaperCap legal(
        "Legal",
        false,
        JobData::kLegal,
        BRect(0.0f,            0.0f,            TO72DPI(5100.0f), TO72DPI(8400.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4980.0f), TO72DPI(8280.0f)));

// since 1.1
const PaperCap a4(
        "A4",
        true,
        JobData::kA4,
        BRect(0.0f,            0.0f,            TO72DPI(4960.0f), TO72DPI(7014.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4840.0f), TO72DPI(6894.0f)));

// TODO
// since 1.1
const PaperCap exec(
        "Executive",
        false,
        JobData::kA4,
        BRect(0.0f,            0.0f,            TO72DPI(4960.0f), TO72DPI(7014.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4840.0f), TO72DPI(6894.0f)));

// TODO
// since 1.1
const PaperCap ledger(
        "Ledger",
        false,
        JobData::kLegal,
        BRect(0.0f,            0.0f,            TO72DPI(5100.0f), TO72DPI(8400.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4980.0f), TO72DPI(8280.0f)));

// since 1.1
const PaperCap a3(
        "A3",
        false,
        JobData::kA3,
        BRect(0.0f,            0.0f,            TO72DPI(7014.0f), TO72DPI(9920.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(6894.0f), TO72DPI(9800.0f)));

// TODO 
// COM10Envelope
// since 1.1

// MonarchEnvelope
// since 1.1

// C5Envelope
// since 1.1

// DLEnvelope
// since 1.1

// JB4Paper
// since 1.1

// JB5Paper
// since 1.1

// since 2.1
const PaperCap b5(
        "B5",
        false,
        JobData::kB5,
        BRect(0.0f,            0.0f,            TO72DPI(4298.0f), TO72DPI(6070.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(4178.0f), TO72DPI(5950.0f)));

// since 1.1
const PaperCap japanese_postcard(
        "Japanese Postcard",
        false,
        JobData::kJapanesePostcard,
        BRect(0.0f,           0.0f,             TO72DPI(2362.0f), TO72DPI(3506.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(2242.0f), TO72DPI(3386.0f)));

// TODO
// JDoublePostcard
// since 1.1

// since 1.1
const PaperCap a5(
        "A5",
        false,
        JobData::kA5,
        BRect(0.0f,            0.0f,            TO72DPI(3506.0f), TO72DPI(4960.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(3386.0f), TO72DPI(4840.0f)));

// TODO 
// A6
// since 2.0

// JB6
// since 2.0
// TBD: Validate. Is this JB4?
const PaperCap b4(
        "B4",
        false,
        JobData::kB4,
        BRect(0.0f,            0.0f,            TO72DPI(6070.0f), TO72DPI(8598.0f)),
        BRect(TO72DPI(120.0f), TO72DPI(120.0f), TO72DPI(5950.0f), TO72DPI(8478.0f)));


// JIS8K
// since 2.1

// JIS16K
// since 2.1

// JISExec
// since 2.1

// since 1.1
const PaperSourceCap defaultSource("Default", false, JobData::kCassette1);
const PaperSourceCap autobin("Auto", true, JobData::kAuto);
const PaperSourceCap manualFeed("Manual Feed", false, JobData::kManual);
const PaperSourceCap multiPurposeTray("Multi Purpose Tray", false,
        JobData::kCassette3);
const PaperSourceCap upperCassette("Upper Cassette", false, JobData::kUpper);
const PaperSourceCap lowerCassette("Lower Cassette", false, JobData::kLower);
const PaperSourceCap envelopeTray("Envelope Tray", false,
        JobData::kCassette2);
// since 2.0:
const PaperSourceCap thridCassette("Thrid Cassette",  false,  JobData::kMiddle);

const ResolutionCap dpi150("150dpi", false, 0, 150, 150);
const ResolutionCap dpi300("300dpi", true, 1, 300, 300);
const ResolutionCap dpi600("600dpi", false, 2, 600, 600);
const ResolutionCap dpi1200("1200dpi", false, 3, 1200, 1200);

const PrintStyleCap simplex("Simplex", true, JobData::kSimplex);
const PrintStyleCap duplex("Duplex", false, JobData::kDuplex);

const ProtocolClassCap pc1_1("PCL 6 Protocol Class 1.1", true,
        PCL6Writer::kProtocolClass1_1,
        "The printer driver supports the following features of protocol class 1.1:"
        "\n"
        "* Monochrome and Color Printing.\n"
        "* Paper Formats: Letter, Legal, A4, A3, A5 and Japanese Postcard.\n"
        "* Paper Sources: Auto, Default, Manual Feed, Multi-Purpose Tray, Upper "
        "and Lower Cassette and Envelope Tray.\n"
        "* Resolutions: 150, 300, 600 and 1200 DPI."
#if ENABLE_RLE_COMPRESSION
        "\n* Compression Method: RLE."
#else
        "\n* Compression Method: None."
#endif
);

const ProtocolClassCap pc2_0("PCL 6 Protocol Class 2.0", false,
        PCL6Writer::kProtocolClass2_0,
        "In addition to features of protocol class 1.1, the printer driver "
        "supports the following features of protocol class 2.0:\n"
        "* Additonal Paper Source: Third Cassette."
//      "\n* JPEG compression (not implemented yet)"
);

const ProtocolClassCap pc2_1("PCL 6 Protocol Class 2.1", false,
        PCL6Writer::kProtocolClass2_1, 
        "In addition to features of previous protocol classes, the printer driver "
        "supports the following features of protocol class 2.1:\n"
        "* Additional Paper Format: B5."
#if ENABLE_DELTA_ROW_COMPRESSION
        "\n* Additional Compression Method: Delta Row Compression."
#endif
);

// Disable until driver supports new features of protocol class 3.0
//      const ProtocolClassCap pc3_0("PCL 6 Protocol Class 3.0", false,
//              PCL6Writer::kProtocolClass3_0, "Protocol Class 3.0");

const PaperCap* papers1_1[] = {
        &letter,
        &legal,
        &a4,
        &a3,
        &a5,
        &b4,
        &japanese_postcard
};

const PaperCap* papers2_1[] = {
        &letter,
        &legal,
        &a4,
        &a3,
        &a5,
        &b4,
        &b5,
        &japanese_postcard
};

const PaperSourceCap* paperSources1_1[] = {
        &autobin,
        &defaultSource,
        &envelopeTray,
        &lowerCassette,
        &upperCassette,
        &manualFeed,
        &multiPurposeTray
};

const PaperSourceCap* paperSources2_0[] = {
        &autobin,
        &defaultSource,
        &envelopeTray,
        &lowerCassette,
        &upperCassette,
        &thridCassette,
        &manualFeed,
        &multiPurposeTray
};

const ResolutionCap* resolutions[] = {
        &dpi150,
        &dpi300,
        &dpi600,
        &dpi1200,
};

const PrintStyleCap* printStyles[] = {
        &simplex,
        &duplex
};

const ProtocolClassCap* protocolClasses[] = {
        &pc1_1,
        &pc2_0,
        &pc2_1
// Disabled until driver supports features of protocol class 3.0
//      &pc3_0
};

const ColorCap color("Color", false, JobData::kColor);
const ColorCap colorCompressionDisabled("Color (No Compression)", false,
        JobData::kColorCompressionDisabled);
const ColorCap monochrome("Shades of Gray", true, JobData::kMonochrome);

const ColorCap* colors[] = {
        &color,
        &colorCompressionDisabled,
        &monochrome
};


PCL6Cap::PCL6Cap(const PrinterData* printer_data)
        :
        PrinterCap(printer_data)
{
}


int
PCL6Cap::CountCap(CapID capid) const
{
        switch (capid) {
                case kPaper:
                        if (GetProtocolClass() >= PCL6Writer::kProtocolClass2_1)
                                return sizeof(papers2_1) / sizeof(papers2_1[0]);
                        return sizeof(papers1_1) / sizeof(papers1_1[0]);
                case kPaperSource:
                        if (GetProtocolClass() >= PCL6Writer::kProtocolClass2_0)
                                return sizeof(paperSources2_0) / sizeof(paperSources2_0[0]);
                        return sizeof(paperSources1_1) / sizeof(paperSources1_1[0]);
                case kResolution:
                        return sizeof(resolutions) / sizeof(resolutions[0]);
                case kColor:
                        return sizeof(colors) / sizeof(colors[0]);
                case kPrintStyle:
                        return sizeof(printStyles) / sizeof(printStyles[0]);
                case kProtocolClass:
                        return sizeof(protocolClasses) / sizeof(protocolClasses[0]);
                default:
                        return 0;
        }
}


const BaseCap**
PCL6Cap::GetCaps(CapID capid) const
{
        switch (capid) {
                case kPaper:
                        if (GetProtocolClass() >= PCL6Writer::kProtocolClass2_1)
                                return (const BaseCap **)papers2_1;
                        return (const BaseCap**)papers1_1;
                case kPaperSource:
                        if (GetProtocolClass() >= PCL6Writer::kProtocolClass2_0)
                                return (const BaseCap **)paperSources2_0;
                        return (const BaseCap**)paperSources1_1;
                case kResolution:
                        return (const BaseCap**)resolutions;
                case kColor:
                        return (const BaseCap**)colors;
                case kPrintStyle:
                        return (const BaseCap**)printStyles;
                case kProtocolClass:
                        return (const BaseCap**)protocolClasses;
                default:
                        return NULL;
        }
}


bool
PCL6Cap::Supports(CapID capid) const
{
        switch (capid) {
                case kPaper:
                case kPaperSource:
                case kResolution:
                case kColor:
                case kCopyCommand:
                case kPrintStyle:
                case kProtocolClass:
                case kHalftone:
                        return true;
                default:
                        return false;
        }
}