1
0
mirror of https://github.com/pdewacht/brlaser synced 2025-04-05 20:36:44 +02:00

Compare commits

...

38 Commits
v4 ... master

Author SHA1 Message Date
Peter De Wachter
2a49e3287c
Merge pull request #133 from yaxollum/fix-mfc-7460dn
Fix MFC-7460DN PPD file name
2023-02-20 21:54:37 +01:00
Peter De Wachter
73b996a049 Github Actions: checkout@v3 2023-02-20 21:26:51 +01:00
Peter De Wachter
e52db5ba46 Github actions: Remove obsolete compilers 2023-02-20 21:24:13 +01:00
Peter De Wachter
48976ab82c
Merge pull request #125 from evanmiller/github-actions
Add support for GitHub Actions
2023-02-20 21:18:44 +01:00
Peter De Wachter
30bd80cb8b Fix build with GCC 13 2023-02-20 21:06:02 +01:00
Peter Ye
ea7e8cd274
Fix MFC-7460DN PPD file name 2021-09-08 14:50:49 -04:00
Evan Miller
df7c37eacf Add libcups2-dev to Linux build environment 2021-05-31 16:28:34 -04:00
Evan Miller
b58a014a51 Fix GitHub Actions script 2021-05-31 16:25:48 -04:00
Evan Miller
bf02b1d7b7 Fix syntax 2021-05-31 16:23:12 -04:00
Evan Miller
9546acc17c Add GitHub Actions for continuous integration 2021-05-31 16:21:33 -04:00
Peter De Wachter
9d7ddda838 Arrange blocks in bands of 128 lines
This is more similar to what the Brother driver does. This might
fix #52, #40, etc.
2020-04-20 21:58:11 +02:00
Peter De Wachter
e21f52f437 Tweak compiler flags 2020-04-20 21:53:43 +02:00
Peter De Wachter
cecfceb27a
Merge pull request #71 from xuzhao9/master
Add Brother DCP-L2520DW
2020-04-18 13:30:25 +02:00
Peter De Wachter
2a5ddf6bd1
Merge pull request #70 from vaukai/vaukai-add-Gentoo-patch-1
Also Gentoo uses brlaser
2020-04-18 13:29:53 +02:00
Peter De Wachter
de0d48dfdb Be tolerant of zero-page jobs
https://github.com/OpenPrinting/cups-filters/issues/117
2020-04-18 10:58:27 +02:00
Peter De Wachter
eae5f9ba98 Add some new printer definitions
Closes #53
Closes #56
Closes #62
Closes #65
2020-04-18 10:24:05 +02:00
xzhao
68dcbc4e38 Add Brother DCP-L2520DW 2020-04-11 08:33:14 -04:00
Volkmar W. Pogatzki
4beeed3733
Update README.md 2020-04-10 13:00:08 +02:00
Peter De Wachter
2f63d0a36c
Merge pull request #55 from nico202/patch-1
Package available on guix, too
2019-11-18 23:04:18 +01:00
Nicolò Balzarotti
e7268ac787
Package available on guix, too
Available here http://guix.gnu.org/packages/brlaser-4-1.779f71e/
2019-11-18 21:05:19 +01:00
Peter De Wachter
23117fe9e0 Bump version number 2019-09-22 21:27:36 +02:00
Peter De Wachter
1b5990560c Version 6 2019-09-22 20:44:17 +02:00
QORTEC
504c00f68e Add Brother HL-2270DW 2019-09-22 20:09:59 +02:00
QORTEC
5d36382350 add gedit backup file to .gitignore (*~) 2019-09-22 20:07:52 +02:00
Peter De Wachter
c08bbc3193 Add a bunch of printers
Closes #33   Brother HL-5030
Closes #39   Brother HL-2140
Closes #44   Brother HL-2220
Closes #45   Brother DCP-L2540D
Closes #46   Brother HL-2030
2019-09-22 19:34:00 +02:00
Peter De Wachter
172c3bf87b Don't compress across bands (#39)
This essentially re-introduces 7ed0d6f, but with a simpler
implementation. Some printers needed it after all.
2019-09-10 23:13:15 +02:00
Peter De Wachter
ff68db0f93 Version 5 2019-05-18 22:56:02 +02:00
Peter De Wachter
dbc897787e Brother HL-1110 2019-05-18 22:38:27 +02:00
Peter De Wachter
17a24ef7a1 Add a bunch of printer stanzas
- Brother DCP-1602 (fixes #42)
- Brother DCP-7060D (fixes #43)
- Brother DCP-L2500D (fixes #35)
- Brother DCP-L2540DW (fixes #32)
- Brother HL-L2340D (fixes #37)
- Brother MFC-1910W (fixes #36)
- Brother MFC-7365DN (fixes #30)
- Brother MFC-7840W (fixes #41)
- Brother MFC-L2710DW (fixes #34)
- Lenovo M7605D (fixes #26)
2019-05-18 22:03:30 +02:00
Peter De Wachter
779f71e80f Reduce max block size to 64 lines (#40)
This fixes HL-1210W, maybe other HL printers as well?
2019-03-25 20:57:51 +01:00
Peter De Wachter
7b4bf383bd O_BINARY
Because it seems people still use OS/2
2019-03-25 20:46:20 +01:00
Peter De Wachter
aa5fb9e2f0 Don't build brdecode by default
It's just a dev tool
2019-03-25 20:24:43 +01:00
Peter De Wachter
7e1cc6911e Update compatibility list.
- Add DCP-7080 (#24)
- Add HL-L2320D (#25)
- Add HL-1200 series (#27)
- Mark HL-L2300D as buggy.
2018-07-04 00:14:44 +02:00
Peter De Wachter
4414717ed4 Avoid overlong encodings, improve compression ratio 2018-07-03 22:42:22 +02:00
Peter De Wachter
41c56264a8 Revert "Do not use delta-encoding across block boundaries"
This reverts commit 7ed0d6f2e8d5a8192c5621898b3ff920c95b66dc.

This was intended as a possible fix for problems with the HL-L2300D
(#4), but it didn't help. And it worsens compression.
2018-07-03 22:37:35 +02:00
Peter De Wachter
7ed0d6f2e8 Do not use delta-encoding across block boundaries
Possible a fix for issue #4

Also: in block.h, rename line_bytes_ to block_size_
2018-04-11 22:45:08 +02:00
Peter De Wachter
4f2f1d606e Add Brother HL-L2360DW (Closes #22) 2018-03-17 12:15:49 +01:00
Peter De Wachter
de26cc4bf0 Add Brother MFC-7240 (Closes #21) 2018-03-13 22:07:13 +01:00
14 changed files with 374 additions and 45 deletions

39
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,39 @@
name: build
on: [ push, pull_request ]
jobs:
linux:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [ clang++, gcc++ ]
steps:
- name: Add repository
run: sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
- name: Install packages
run: sudo apt install libcups2-dev
- uses: actions/checkout@v3
- name: Configure
run: cmake .
- name: Make
run: make
env:
CXX: ${{ matrix.compiler }}
- name: Run tests
run: make check
macos:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
compiler: [ clang++, gcc++ ]
steps:
- uses: actions/checkout@v3
- name: Configure
run: cmake .
- name: Make
run: make
env:
CXX: ${{ matrix.compiler }}
- name: Run tests
run: make check

1
.gitignore vendored
View File

@ -1 +1,2 @@
*~
build/

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.1)
project(brlaser CXX)
set(BRLASER_VERSION "4")
set(BRLASER_VERSION "6")
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "No build type selected, default to RelWithDebInfo")
@ -39,10 +39,11 @@ endmacro(extra_cxx_compiler_flag)
# Compiler warnings
extra_cxx_compiler_flag("-Wall")
extra_cxx_compiler_flag("-Wno-missing-braces")
# Some security flags
extra_cxx_compiler_flag("-Wdate-time")
# Some hardening flags
extra_cxx_compiler_flag("-fstack-protector-strong")
extra_cxx_compiler_flag("-Wformat")
extra_cxx_compiler_flag("-Werror=format-security")
extra_cxx_compiler_flag("-Wformat -Werror=format-security")
extra_cxx_compiler_flag("-D_FORTIFY_SOURCE=2")
# Enable the supported flags, but give priority to CXXFLAGS env var
set(CMAKE_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
@ -112,19 +113,21 @@ target_compile_options(rastertobrlaser PRIVATE ${CUPS_CFLAGS})
target_link_libraries(rastertobrlaser ${CUPS_LIBS})
target_link_libraries(rastertobrlaser ${CUPS_LDFLAGS})
add_executable(brdecode src/brdecode.cc)
add_executable(brdecode EXCLUDE_FROM_ALL src/brdecode.cc)
add_executable(test_lest test/test_lest.cc)
add_executable(test_line test/test_line.cc src/line.cc)
add_executable(test_block test/test_block.cc)
add_executable(test_job test/test_job.cc src/job.cc src/line.cc)
enable_testing()
add_test(test_lest test_lest)
add_test(test_line test_line)
add_test(test_block test_block)
add_test(test_job test_job)
# Autotools-style "make check" command
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
add_dependencies(check test_lest test_line test_block)
add_dependencies(check test_lest test_line test_block test_job)
# Installation

View File

@ -1,3 +1,12 @@
brlaser v6 (2019-09-22)
Added support for some more Brother HL-series printers. These printers
had glitched output in earlier releases.
brlaser v5 (2019-05-18)
Fixed problems with Brother HL-series printers in 600 dpi mode. Thanks
to Onno Kortmann for the fix.
Added several printers.
brlaser v4 (2018-02-25)
Added several printers.
Merged duplex printing support from @xc-racer99. Enabled for DCP-7065DN.

View File

@ -8,16 +8,43 @@ such as PCL or PostScript, not all do. If you have a monochrome
Brother laser printer (or multi-function device) and the other open
source drivers don't work, this one might help.
This driver is known to work with these printers:
This driver has been reported to work with these printers:
* Brother DCP-1510
* Brother DCP-1510 series
* Brother DCP-1600 series
* Brother DCP-7030
* Brother DCP-7040
* Brother DCP-7055
* Brother DCP-7055W
* Brother DCP-7060D
* Brother DCP-7065DN
* Brother HL-L2300D
* Brother DCP-7080
* Brother DCP-L2500D series
* Brother DCP-L2520D series
* Brother DCP-L2520DW series
* Brother DCP-L2540DW series
* Brother HL-1110 series
* Brother HL-1200 series
* Brother HL-2030 series
* Brother HL-2140 series
* Brother HL-2220 series
* Brother HL-2270DW series
* Brother HL-5030 series
* Brother HL-L2300D series
* Brother HL-L2320D series
* Brother HL-L2340D series
* Brother HL-L2360D series
* Brother HL-L2375DW series
* Brother HL-L2390DW
* Brother MFC-1910W
* Brother MFC-7240
* Brother MFC-7360N
* Brother MFC-7365DN
* Brother MFC-7420
* Brother MFC-7460DN
* Brother MFC-7840W
* Brother MFC-L2710DW series
* Lenovo M7605D
Other printers
@ -38,7 +65,8 @@ Installation
------------
Some operating systems already ship this driver. This is the case for
at least Debian, Ubuntu, Raspbian, openSUSE, NixOS and Arch Linux.
at least Debian, Gentoo, Ubuntu, Raspbian, openSUSE, NixOS, Arch Linux
and Guix.
Look for a package named `printer-driver-brlaser`.
You'll also need Ghostscript, in case that's not installed

View File

@ -87,6 +87,13 @@ Option "brlaserEconomode/Toner save mode" Boolean AnySetup 10
PCFileName "br1510.ppd"
}
{
ModelName "DCP-1600 series"
Attribute "NickName" "" "Brother DCP-1600 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,XL2HB;MDL:DCP-1600 series;CLS:PRINTER;CID:Brother Laser Type1;"
PCFileName "br1600.ppd"
}
{
ModelName "DCP-7030"
Attribute "NickName" "" "Brother DCP-7030, $USING"
@ -119,6 +126,14 @@ Option "brlaserEconomode/Toner save mode" Boolean AnySetup 10
PCFileName "br7055w.ppd"
}
{
ModelName "DCP-7060D"
Attribute "NickName" "" "Brother DCP-7060D, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-7060D;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "br7060d.ppd"
}
{
ModelName "DCP-7065DN"
Attribute "NickName" "" "Brother DCP-7065DN, $USING"
@ -127,17 +142,203 @@ Option "brlaserEconomode/Toner save mode" Boolean AnySetup 10
PCFileName "br7065dn.ppd"
}
{
ModelName "DCP-7080"
Attribute "NickName" "" "Brother DCP-7080, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-7080;CLS:PRINTER;CID:Brother Laser Type1;"
PCFileName "br7080.ppd"
}
{
ModelName "DCP-7080D"
Attribute "NickName" "" "Brother DCP-7080D, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-7080D;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "br7080d.ppd"
}
{
ModelName "DCP-L2500D"
Attribute "NickName" "" "Brother DCP-L2500D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-L2500D series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2500d.ppd"
}
{
ModelName "DCP-L2520D"
Attribute "NickName" "" "Brother DCP-L2520D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-L2520D series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2520d.ppd"
}
{
ModelName "DCP-L2520DW"
Attribute "NickName" "" "Brother DCP-L2520DW series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-L2520DW series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2520dw.ppd"
}
{
ModelName "DCP-L2540DW"
Attribute "NickName" "" "Brother DCP-L2540DW series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-L2540DW series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2540.ppd"
}
{
ModelName "HL-1110"
Attribute "NickName" "" "Brother HL-1110 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-1110 series;CLS:PRINTER;CID:Brother Laser Type3;"
Resolution k 1 0 0 0 "300dpi/300 DPI"
PCFileName "br1110.ppd"
}
{
ModelName "HL-1200"
Attribute "NickName" "" "Brother HL-1200 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-1200 series;CLS:PRINTER;CID:Brother Laser Type3;"
PCFileName "br1200.ppd"
}
{
ModelName "HL-2030 series"
Attribute "NickName" "" "Brother HL-2030 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-2030 series;CLS:PRINTER;"
PCFileName "br2030.ppd"
}
{
ModelName "HL-2140 series"
Attribute "NickName" "" "Brother HL-2140 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-2140 series;CLS:PRINTER;"
PCFileName "br2140.ppd"
}
{
ModelName "HL-2220 series"
Attribute "NickName" "" "Brother HL-2220 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-2220 series;CLS:PRINTER;"
PCFileName "br2220.ppd"
}
{
ModelName "HL-2270DW series"
Attribute "NickName" "" "Brother HL-2270DW series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,PCL,PCLXL;MDL:HL-2270DW series;CLS:PRINTER;CID:Brother Laser Type1;"
Resolution k 1 0 0 0 "300dpi/300 DPI"
Duplex rotated
PCFileName "br2270dw.ppd"
}
{
ModelName "HL-5030 series"
Attribute "NickName" "" "Brother HL-5030 series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,PCL;MDL:HL-5030 series;CLS:PRINTER;"
PCFileName "br5030.ppd"
}
{
ModelName "HL-L2300D"
Attribute "NickName" "" "Brother HL-L2300D, $USING"
Attribute "1284DeviceID" "" " MFG:Brother;CMD:PJL,HBP;MDL:HL-L2300D series;CLS:PRINTER;CID:Brother Laser Type1;"
Attribute "NickName" "" "Brother HL-L2300D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-L2300D series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2300d.ppd"
}
{
ModelName "HL-L2320D"
Attribute "NickName" "" "Brother HL-L2320D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:HL-L2320D series;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "brl2320d.ppd"
}
{
ModelName "HL-L2340D"
Attribute "NickName" "" "Brother HL-L2340D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP,URF;MDL:HL-L2340D series;CLS:PRINTER;CID:Brother Laser Type1;URF:W8,CP1,IS4-1,MT1-3-4-5-8,OB10,PQ4,RS300-600,V1.3,DM1;"
Duplex rotated
PCFileName "brl2340d.ppd"
}
{
ModelName "HL-L2360D"
Attribute "NickName" "" "Brother HL-L2360D series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,PCL,PCLXL,URF;MDL:HL-L2360D series;CLS:PRINTER;CID:Brother Laser Type1;URF:W8,CP1,IS4-1,MT1-3-4-5-8,OB10,PQ4,RS300-600,V1.3,DM1;"
Duplex rotated
PCFileName "brl2360d.ppd"
}
{
ModelName "HL-L2375DW"
Attribute "NickName" "" "Brother HL-L2375DW series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,PCL,PCLXL,URF;MDL:HL-L2375DW series;CLS:PRINTER;CID:Brother Laser Type1;URF:W8,CP1,IS4-1,MT1-3-4-5-8,OB10,PQ3-4-5,RS300-600-1200,V1.4,DM1;"
Duplex rotated
PCFileName "brl2375w.ppd"
}
{
ModelName "HL-L2390DW"
Attribute "NickName" "" "Brother HL-L2390DW, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP,URF;MDL:HL-L2390DW;CLS:PRINTER;CID:Brother Laser Type1;URF:W8,CP1,IS4-1,MT1-3-4-5-8,OB10,PQ3-4-5,RS300-600-1200,V1.4,DM1;"
Duplex rotated
PCFileName "brl2390w.ppd"
}
{
ModelName "MFC-1910W"
Attribute "NickName" "" "Brother MFC-1910W, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;MFG:Brother;CMD:PJL,HBP;MDL:MFC-1910W series;CLS:PRINTER;CID:Brother Laser Type1;"
PCFileName "br1910w.ppd"
}
{
ModelName "MFC-7240"
Attribute "NickName" "" "Brother MFC-7240, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;MFG:Brother;CMD:PJL,HBP;MDL:MFC-7240;CLS:PRINTER;CID:Brother Laser Type1;"
PCFileName "br7240.ppd"
}
{
ModelName "MFC-7360N"
Attribute "NickName" "" "Brother MFC-7360N, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:MFC-7360N;CLS:PRINTER;CID:Brother Laser Type1;"
PCFileName "br7360n.ppd"
}
{
ModelName "MFC-7365DN"
Attribute "NickName" "" "Brother MFC-7365DN, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:MFC-7365DN;CLS:PRINTER;CID:Brother Laser Type1;"
Resolution k 1 0 0 0 "300dpi/300 DPI"
Duplex rotated
PCFileName "br7365dn.ppd"
}
{
ModelName "MFC-7420"
Attribute "NickName" "" "Brother Brother MFC-7420, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:MFC-7420;CLS:PRINTER;"
PCFileName "br7420.ppd"
}
{
ModelName "MFC-7460DN"
Attribute "NickName" "" "Brother MFC-7460DN, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:MFC-7460DN;CLS:PRINTER;CID:Brother Laser Type1;"
Duplex rotated
PCFileName "br7460dn.ppd"
}
{
ModelName "MFC-L2710DW series"
Attribute "NickName" "" "Brother MFC-L2710DW series, $USING"
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP,URF;MDL:MFC-L2710DW series;CLS:PRINTER;CID:Brother Laser Type1;URF:W8,CP1,IS4-1,MT1-3-4-5-8,OB10,PQ3-4-5,RS300-600-1200,V1.4,DM1;"
Duplex rotated
PCFileName "brl2710.ppd"
}

View File

@ -25,7 +25,6 @@
class block {
public:
block(): line_bytes_(0) {
lines_.reserve(max_lines_per_block_);
}
bool empty() const {
@ -40,8 +39,7 @@ class block {
}
bool line_fits(unsigned size) {
return lines_.size() != max_lines_per_block_
&& line_bytes_ + size < max_block_size_;
return line_bytes_ + size < max_block_size_;
}
void flush(FILE *f) {
@ -59,7 +57,6 @@ class block {
private:
static const unsigned max_block_size_ = 16350;
static const unsigned max_lines_per_block_ = 128;
std::vector<std::vector<uint8_t>> lines_;
int line_bytes_;

View File

@ -26,17 +26,18 @@
job::job(FILE *out, const std::string &job_name)
: out_(out),
job_name_(job_name),
page_params_() {
page_params_(),
pages_(0) {
// Delete dubious characters from job name
std::replace_if(job_name_.begin(), job_name_.end(), [](char c) {
return c < 32 || c >= 127 || c == '"' || c == '\\';
}, ' ');
begin_job();
}
job::~job() {
end_job();
if (pages_ != 0) {
end_job();
}
}
void job::begin_job() {
@ -86,6 +87,11 @@ void job::encode_page(const page_params &page_params,
int lines,
int linesize,
nextline_fn nextline) {
if (pages_ == 0) {
begin_job();
}
++pages_;
if (!(page_params_ == page_params)) {
page_params_ = page_params;
write_page_header();
@ -103,10 +109,20 @@ void job::encode_page(const page_params &page_params,
fputs("\033*b1030m", out_);
// XXX brother driver uses 128 lines per band
const int lines_per_band = 64;
for (int i = 1; i < lines && nextline(line); ++i) {
std::vector<uint8_t> encoded = encode_line(line, reference);
if (!block.line_fits(encoded.size())) {
std::vector<uint8_t> encoded;
if (i % lines_per_band == 0) {
block.flush(out_);
encoded = encode_line(line);
} else {
encoded = encode_line(line, reference);
if (!block.line_fits(encoded.size())) {
block.flush(out_);
encoded = encode_line(line);
}
}
block.add_line(std::move(encoded));
std::swap(line, reference);

View File

@ -55,6 +55,10 @@ class job {
int linesize,
nextline_fn nextline);
int pages() const {
return pages_;
}
private:
void begin_job();
void end_job();
@ -63,6 +67,7 @@ class job {
FILE *out_;
std::string job_name_;
page_params page_params_;
int pages_;
};
#endif // JOB_H

View File

@ -145,10 +145,12 @@ vector<uint8_t> encode_line(const vector<uint8_t> &line,
int num_edits = 0;
auto line_it = line.begin();
auto line_end_it =
std::mismatch(line.rbegin(), line.rend(), reference.rbegin()).first.base();
auto ref_it = reference.begin();
while (1) {
int offset = skip_to_next_mismatch(&line_it, line.end(), &ref_it);
if (line_it == line.end()) {
int offset = skip_to_next_mismatch(&line_it, line_end_it, &ref_it);
if (line_it == line_end_it) {
// No more differences, we're done.
break;
}
@ -156,17 +158,17 @@ vector<uint8_t> encode_line(const vector<uint8_t> &line,
if (++num_edits == max_edits) {
// We've run out of edits. Just output the rest of the line in a big
// substitute command.
write_substitute(offset, line_it, line.end(), &output);
write_substitute(offset, line_it, line_end_it, &output);
break;
}
int s = substitute_length(line_it, line.end(), ref_it);
int s = substitute_length(line_it, line_end_it, ref_it);
if (s > 0) {
write_substitute(offset, line_it, std::next(line_it, s), &output);
line_it += s;
ref_it += s;
} else {
int r = repeat_length(line_it, line.end());
int r = repeat_length(line_it, line_end_it);
assert(r >= 2);
write_repeat(offset, r, *line_it, &output);
line_it += r;

View File

@ -29,6 +29,10 @@
#include "job.h"
#include "debug.h"
#ifndef O_BINARY
#define O_BINARY 0
#endif
namespace {
@ -146,7 +150,7 @@ int main(int argc, char *argv[]) {
int fd = STDIN_FILENO;
if (job_filename) {
fd = open(job_filename, O_RDONLY);
fd = open(job_filename, O_RDONLY | O_BINARY);
if (fd < 0) {
fprintf(stderr, "ERROR: " PACKAGE ": Unable to open raster file\n");
return 1;
@ -166,7 +170,6 @@ int main(int argc, char *argv[]) {
return 1;
}
int pages = 0;
{
job job(stdout, ascii_job_name(job_id, job_user, job_name));
cups_page_header2_t header;
@ -175,11 +178,11 @@ int main(int argc, char *argv[]) {
|| header.cupsBitsPerColor != 1
|| header.cupsNumColors != 1
|| header.cupsBytesPerLine > 10000) {
fprintf(stderr, "ERROR: " PACKAGE ": Page %d: Bogus raster data.\n", pages + 1);
fprintf(stderr, "ERROR: " PACKAGE ": Page %d: Bogus raster data.\n", job.pages() + 1);
dump_page_header(header);
return 1;
}
if (pages == 0) {
if (job.pages() == 0) {
fprintf(stderr, "DEBUG: " PACKAGE ": Page header of first page\n");
dump_page_header(header);
}
@ -187,13 +190,12 @@ int main(int argc, char *argv[]) {
header.cupsHeight,
header.cupsBytesPerLine,
next_line);
fprintf(stderr, "PAGE: %d %d\n", ++pages, header.NumCopies);
fprintf(stderr, "PAGE: %d %d\n", job.pages(), header.NumCopies);
}
}
if (pages == 0) {
fprintf(stderr, "ERROR: " PACKAGE ": No pages were found.\n");
return 1;
if (job.pages() == 0) {
fprintf(stderr, "ERROR: " PACKAGE ": No pages were found.\n");
}
}
fflush(stdout);

View File

@ -18,6 +18,7 @@
#ifndef TEMPFILE_H
#define TEMPFILE_H
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

View File

@ -37,16 +37,6 @@ const lest::test specification[] = {
EXPECT(!b.empty());
},
"A block can contain 128 lines",
[] {
block b;
for (int i = 0; i < 128; ++i) {
EXPECT(b.line_fits(1));
b.add_line(vec(1));
}
EXPECT(!b.line_fits(1));
},
"A block has a size limit of about 16 kilobyte",
[] {
block b;

35
test/test_job.cc Normal file
View File

@ -0,0 +1,35 @@
// This file is part of the brlaser printer driver.
//
// Copyright 2020 Peter De Wachter
//
// brlaser is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// brlaser is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with brlaser. If not, see <http://www.gnu.org/licenses/>.
#include "lest.hpp"
#include "tempfile.h"
#include "../src/job.h"
const lest::test specification[] = {
"An empty job produces no output",
[] {
tempfile f;
{
job j(f.file(), "name");
}
EXPECT(f.data().empty());
},
};
int main() {
return lest::run(specification);
}