commit
b7af16450c
18 changed files with 1753 additions and 0 deletions
@ -0,0 +1,20 @@ |
|||||||
|
# |
||||||
|
# Autotools |
||||||
|
# |
||||||
|
/Makefile |
||||||
|
/Makefile.in |
||||||
|
/aclocal.m4 |
||||||
|
/autom4te.cache |
||||||
|
/build-aux |
||||||
|
/config.* |
||||||
|
/configure |
||||||
|
/stamp-* |
||||||
|
.deps/ |
||||||
|
.dirstamp |
||||||
|
|
||||||
|
# |
||||||
|
# Binaries |
||||||
|
# |
||||||
|
/rastertobrlaser |
||||||
|
/brlaser.drv |
||||||
|
*.o |
||||||
@ -0,0 +1,339 @@ |
|||||||
|
GNU GENERAL PUBLIC LICENSE |
||||||
|
Version 2, June 1991 |
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
Everyone is permitted to copy and distribute verbatim copies |
||||||
|
of this license document, but changing it is not allowed. |
||||||
|
|
||||||
|
Preamble |
||||||
|
|
||||||
|
The licenses for most software are designed to take away your |
||||||
|
freedom to share and change it. By contrast, the GNU General Public |
||||||
|
License is intended to guarantee your freedom to share and change free |
||||||
|
software--to make sure the software is free for all its users. This |
||||||
|
General Public License applies to most of the Free Software |
||||||
|
Foundation's software and to any other program whose authors commit to |
||||||
|
using it. (Some other Free Software Foundation software is covered by |
||||||
|
the GNU Lesser General Public License instead.) You can apply it to |
||||||
|
your programs, too. |
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not |
||||||
|
price. Our General Public Licenses are designed to make sure that you |
||||||
|
have the freedom to distribute copies of free software (and charge for |
||||||
|
this service if you wish), that you receive source code or can get it |
||||||
|
if you want it, that you can change the software or use pieces of it |
||||||
|
in new free programs; and that you know you can do these things. |
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid |
||||||
|
anyone to deny you these rights or to ask you to surrender the rights. |
||||||
|
These restrictions translate to certain responsibilities for you if you |
||||||
|
distribute copies of the software, or if you modify it. |
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether |
||||||
|
gratis or for a fee, you must give the recipients all the rights that |
||||||
|
you have. You must make sure that they, too, receive or can get the |
||||||
|
source code. And you must show them these terms so they know their |
||||||
|
rights. |
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and |
||||||
|
(2) offer you this license which gives you legal permission to copy, |
||||||
|
distribute and/or modify the software. |
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain |
||||||
|
that everyone understands that there is no warranty for this free |
||||||
|
software. If the software is modified by someone else and passed on, we |
||||||
|
want its recipients to know that what they have is not the original, so |
||||||
|
that any problems introduced by others will not reflect on the original |
||||||
|
authors' reputations. |
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software |
||||||
|
patents. We wish to avoid the danger that redistributors of a free |
||||||
|
program will individually obtain patent licenses, in effect making the |
||||||
|
program proprietary. To prevent this, we have made it clear that any |
||||||
|
patent must be licensed for everyone's free use or not licensed at all. |
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and |
||||||
|
modification follow. |
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE |
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains |
||||||
|
a notice placed by the copyright holder saying it may be distributed |
||||||
|
under the terms of this General Public License. The "Program", below, |
||||||
|
refers to any such program or work, and a "work based on the Program" |
||||||
|
means either the Program or any derivative work under copyright law: |
||||||
|
that is to say, a work containing the Program or a portion of it, |
||||||
|
either verbatim or with modifications and/or translated into another |
||||||
|
language. (Hereinafter, translation is included without limitation in |
||||||
|
the term "modification".) Each licensee is addressed as "you". |
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not |
||||||
|
covered by this License; they are outside its scope. The act of |
||||||
|
running the Program is not restricted, and the output from the Program |
||||||
|
is covered only if its contents constitute a work based on the |
||||||
|
Program (independent of having been made by running the Program). |
||||||
|
Whether that is true depends on what the Program does. |
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's |
||||||
|
source code as you receive it, in any medium, provided that you |
||||||
|
conspicuously and appropriately publish on each copy an appropriate |
||||||
|
copyright notice and disclaimer of warranty; keep intact all the |
||||||
|
notices that refer to this License and to the absence of any warranty; |
||||||
|
and give any other recipients of the Program a copy of this License |
||||||
|
along with the Program. |
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and |
||||||
|
you may at your option offer warranty protection in exchange for a fee. |
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion |
||||||
|
of it, thus forming a work based on the Program, and copy and |
||||||
|
distribute such modifications or work under the terms of Section 1 |
||||||
|
above, provided that you also meet all of these conditions: |
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices |
||||||
|
stating that you changed the files and the date of any change. |
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in |
||||||
|
whole or in part contains or is derived from the Program or any |
||||||
|
part thereof, to be licensed as a whole at no charge to all third |
||||||
|
parties under the terms of this License. |
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively |
||||||
|
when run, you must cause it, when started running for such |
||||||
|
interactive use in the most ordinary way, to print or display an |
||||||
|
announcement including an appropriate copyright notice and a |
||||||
|
notice that there is no warranty (or else, saying that you provide |
||||||
|
a warranty) and that users may redistribute the program under |
||||||
|
these conditions, and telling the user how to view a copy of this |
||||||
|
License. (Exception: if the Program itself is interactive but |
||||||
|
does not normally print such an announcement, your work based on |
||||||
|
the Program is not required to print an announcement.) |
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If |
||||||
|
identifiable sections of that work are not derived from the Program, |
||||||
|
and can be reasonably considered independent and separate works in |
||||||
|
themselves, then this License, and its terms, do not apply to those |
||||||
|
sections when you distribute them as separate works. But when you |
||||||
|
distribute the same sections as part of a whole which is a work based |
||||||
|
on the Program, the distribution of the whole must be on the terms of |
||||||
|
this License, whose permissions for other licensees extend to the |
||||||
|
entire whole, and thus to each and every part regardless of who wrote it. |
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest |
||||||
|
your rights to work written entirely by you; rather, the intent is to |
||||||
|
exercise the right to control the distribution of derivative or |
||||||
|
collective works based on the Program. |
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program |
||||||
|
with the Program (or with a work based on the Program) on a volume of |
||||||
|
a storage or distribution medium does not bring the other work under |
||||||
|
the scope of this License. |
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it, |
||||||
|
under Section 2) in object code or executable form under the terms of |
||||||
|
Sections 1 and 2 above provided that you also do one of the following: |
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable |
||||||
|
source code, which must be distributed under the terms of Sections |
||||||
|
1 and 2 above on a medium customarily used for software interchange; or, |
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three |
||||||
|
years, to give any third party, for a charge no more than your |
||||||
|
cost of physically performing source distribution, a complete |
||||||
|
machine-readable copy of the corresponding source code, to be |
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium |
||||||
|
customarily used for software interchange; or, |
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer |
||||||
|
to distribute corresponding source code. (This alternative is |
||||||
|
allowed only for noncommercial distribution and only if you |
||||||
|
received the program in object code or executable form with such |
||||||
|
an offer, in accord with Subsection b above.) |
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for |
||||||
|
making modifications to it. For an executable work, complete source |
||||||
|
code means all the source code for all modules it contains, plus any |
||||||
|
associated interface definition files, plus the scripts used to |
||||||
|
control compilation and installation of the executable. However, as a |
||||||
|
special exception, the source code distributed need not include |
||||||
|
anything that is normally distributed (in either source or binary |
||||||
|
form) with the major components (compiler, kernel, and so on) of the |
||||||
|
operating system on which the executable runs, unless that component |
||||||
|
itself accompanies the executable. |
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering |
||||||
|
access to copy from a designated place, then offering equivalent |
||||||
|
access to copy the source code from the same place counts as |
||||||
|
distribution of the source code, even though third parties are not |
||||||
|
compelled to copy the source along with the object code. |
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program |
||||||
|
except as expressly provided under this License. Any attempt |
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is |
||||||
|
void, and will automatically terminate your rights under this License. |
||||||
|
However, parties who have received copies, or rights, from you under |
||||||
|
this License will not have their licenses terminated so long as such |
||||||
|
parties remain in full compliance. |
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not |
||||||
|
signed it. However, nothing else grants you permission to modify or |
||||||
|
distribute the Program or its derivative works. These actions are |
||||||
|
prohibited by law if you do not accept this License. Therefore, by |
||||||
|
modifying or distributing the Program (or any work based on the |
||||||
|
Program), you indicate your acceptance of this License to do so, and |
||||||
|
all its terms and conditions for copying, distributing or modifying |
||||||
|
the Program or works based on it. |
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the |
||||||
|
Program), the recipient automatically receives a license from the |
||||||
|
original licensor to copy, distribute or modify the Program subject to |
||||||
|
these terms and conditions. You may not impose any further |
||||||
|
restrictions on the recipients' exercise of the rights granted herein. |
||||||
|
You are not responsible for enforcing compliance by third parties to |
||||||
|
this License. |
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent |
||||||
|
infringement or for any other reason (not limited to patent issues), |
||||||
|
conditions are imposed on you (whether by court order, agreement or |
||||||
|
otherwise) that contradict the conditions of this License, they do not |
||||||
|
excuse you from the conditions of this License. If you cannot |
||||||
|
distribute so as to satisfy simultaneously your obligations under this |
||||||
|
License and any other pertinent obligations, then as a consequence you |
||||||
|
may not distribute the Program at all. For example, if a patent |
||||||
|
license would not permit royalty-free redistribution of the Program by |
||||||
|
all those who receive copies directly or indirectly through you, then |
||||||
|
the only way you could satisfy both it and this License would be to |
||||||
|
refrain entirely from distribution of the Program. |
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under |
||||||
|
any particular circumstance, the balance of the section is intended to |
||||||
|
apply and the section as a whole is intended to apply in other |
||||||
|
circumstances. |
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any |
||||||
|
patents or other property right claims or to contest validity of any |
||||||
|
such claims; this section has the sole purpose of protecting the |
||||||
|
integrity of the free software distribution system, which is |
||||||
|
implemented by public license practices. Many people have made |
||||||
|
generous contributions to the wide range of software distributed |
||||||
|
through that system in reliance on consistent application of that |
||||||
|
system; it is up to the author/donor to decide if he or she is willing |
||||||
|
to distribute software through any other system and a licensee cannot |
||||||
|
impose that choice. |
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to |
||||||
|
be a consequence of the rest of this License. |
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in |
||||||
|
certain countries either by patents or by copyrighted interfaces, the |
||||||
|
original copyright holder who places the Program under this License |
||||||
|
may add an explicit geographical distribution limitation excluding |
||||||
|
those countries, so that distribution is permitted only in or among |
||||||
|
countries not thus excluded. In such case, this License incorporates |
||||||
|
the limitation as if written in the body of this License. |
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions |
||||||
|
of the General Public License from time to time. Such new versions will |
||||||
|
be similar in spirit to the present version, but may differ in detail to |
||||||
|
address new problems or concerns. |
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program |
||||||
|
specifies a version number of this License which applies to it and "any |
||||||
|
later version", you have the option of following the terms and conditions |
||||||
|
either of that version or of any later version published by the Free |
||||||
|
Software Foundation. If the Program does not specify a version number of |
||||||
|
this License, you may choose any version ever published by the Free Software |
||||||
|
Foundation. |
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free |
||||||
|
programs whose distribution conditions are different, write to the author |
||||||
|
to ask for permission. For software which is copyrighted by the Free |
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes |
||||||
|
make exceptions for this. Our decision will be guided by the two goals |
||||||
|
of preserving the free status of all derivatives of our free software and |
||||||
|
of promoting the sharing and reuse of software generally. |
||||||
|
|
||||||
|
NO WARRANTY |
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
||||||
|
REPAIR OR CORRECTION. |
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
||||||
|
POSSIBILITY OF SUCH DAMAGES. |
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS |
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs |
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest |
||||||
|
possible use to the public, the best way to achieve this is to make it |
||||||
|
free software which everyone can redistribute and change under these terms. |
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest |
||||||
|
to attach them to the start of each source file to most effectively |
||||||
|
convey the exclusion of warranty; and each file should have at least |
||||||
|
the "copyright" line and a pointer to where the full notice is found. |
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.> |
||||||
|
Copyright (C) <year> <name of author> |
||||||
|
|
||||||
|
This program 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. |
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software Foundation, Inc., |
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail. |
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this |
||||||
|
when it starts in an interactive mode: |
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author |
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||||
|
This is free software, and you are welcome to redistribute it |
||||||
|
under certain conditions; type `show c' for details. |
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate |
||||||
|
parts of the General Public License. Of course, the commands you use may |
||||||
|
be called something other than `show w' and `show c'; they could even be |
||||||
|
mouse-clicks or menu items--whatever suits your program. |
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your |
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if |
||||||
|
necessary. Here is a sample; alter the names: |
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989 |
||||||
|
Ty Coon, President of Vice |
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into |
||||||
|
proprietary programs. If your program is a subroutine library, you may |
||||||
|
consider it more useful to permit linking proprietary applications with the |
||||||
|
library. If this is what you want to do, use the GNU Lesser General |
||||||
|
Public License instead of this License. |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
filter_PROGRAMS = rastertobrlaser
|
||||||
|
filterdir = $(CUPS_SERVERBIN)/filter
|
||||||
|
|
||||||
|
drv_DATA = brlaser.drv
|
||||||
|
drvdir = $(CUPS_DATADIR)/drv
|
||||||
|
|
||||||
|
rastertobrlaser_SOURCES = \
|
||||||
|
src/main.cc \
|
||||||
|
src/debug.h \
|
||||||
|
src/debug.cc \
|
||||||
|
src/job.h \
|
||||||
|
src/job.cc \
|
||||||
|
src/line.h \
|
||||||
|
src/line.cc
|
||||||
|
rastertobrlaser_CPPFLAGS = $(CUPS_CFLAGS)
|
||||||
|
rastertobrlaser_LDADD = $(CUPS_LIBS)
|
||||||
@ -0,0 +1,15 @@ |
|||||||
|
#! /bin/sh |
||||||
|
|
||||||
|
srcdir=`dirname "$0"` |
||||||
|
test -z "$srcdir" && srcdir=. |
||||||
|
|
||||||
|
ORIGDIR=`pwd` |
||||||
|
cd "$srcdir" |
||||||
|
|
||||||
|
autoreconf --force -v --install || exit 1 |
||||||
|
cd "$ORIGDIR" || exit $? |
||||||
|
|
||||||
|
if test -z "$NOCONFIGURE"; then |
||||||
|
exec "$srcdir"/configure "$@" |
||||||
|
fi |
||||||
|
|
||||||
@ -0,0 +1,83 @@ |
|||||||
|
// This file is part of the brlaser printer driver. |
||||||
|
// |
||||||
|
// Copyright 2013 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 standard font and media definitions |
||||||
|
#include <font.defs> |
||||||
|
#include <media.defs> |
||||||
|
|
||||||
|
// List the fonts that are supported, in this case all standard fonts... |
||||||
|
Font * |
||||||
|
|
||||||
|
// Manufacturer and driver version. |
||||||
|
Manufacturer "Brother" |
||||||
|
Version @VERSION@ |
||||||
|
|
||||||
|
// Each filter provided by the driver... |
||||||
|
Filter application/vnd.cups-raster 33 rastertobrlaser |
||||||
|
|
||||||
|
// Supported resolutions. |
||||||
|
// The 1200dpi mode is weird: we need to send 1200x1200dpi raster |
||||||
|
// data, but Brother only advertises 1200x600dpi. I wonder what |
||||||
|
// is going on there. |
||||||
|
Resolution k 1 0 0 0 "300dpi/300 DPI" |
||||||
|
*Resolution k 1 0 0 0 "600dpi/600 DPI" |
||||||
|
Resolution k 1 0 0 0 "1200dpi/1200HQ" |
||||||
|
|
||||||
|
// Supported page sizes. |
||||||
|
HWMargins 8 8 8 16 |
||||||
|
*MediaSize A4 |
||||||
|
MediaSize A5 |
||||||
|
MediaSize A6 |
||||||
|
MediaSize B5 |
||||||
|
MediaSize B6 |
||||||
|
MediaSize EnvC5 |
||||||
|
MediaSize EnvMonarch |
||||||
|
MediaSize EnvPRC5 |
||||||
|
MediaSize Executive |
||||||
|
MediaSize Legal |
||||||
|
MediaSize Letter |
||||||
|
|
||||||
|
// Input trays. Numbers must match the filter source code. |
||||||
|
*InputSlot 0 "Auto/Auto-select" |
||||||
|
InputSlot 1 "Tray1/Tray 1" |
||||||
|
InputSlot 2 "Tray2/Tray 2" |
||||||
|
InputSlot 3 "Tray3/Tray 3" |
||||||
|
InputSlot 4 "MPTray/MP Tray" |
||||||
|
InputSlot 5 "Manual/Manual" |
||||||
|
|
||||||
|
// Media types. |
||||||
|
*MediaType 0 "PLAIN/Plain paper" |
||||||
|
MediaType 1 "THIN/Thin paper" |
||||||
|
MediaType 2 "THICK/Thick paper" |
||||||
|
MediaType 3 "THICKER/Thicker paper" |
||||||
|
MediaType 4 "BOND/Bond paper" |
||||||
|
MediaType 5 "TRANS/Transparencies" |
||||||
|
MediaType 6 "ENV/Envelopes" |
||||||
|
MediaType 7 "ENV-THICK/Thick envelopes" |
||||||
|
MediaType 8 "ENV-THIN/Thin envelopes" |
||||||
|
|
||||||
|
Option "brlaserEconomode/Toner save mode" Boolean AnySetup 10 |
||||||
|
*Choice False/Off "<</cupsInteger10 0>>setpagedevice" |
||||||
|
Choice True/On "<</cupsInteger10 1>>setpagedevice" |
||||||
|
|
||||||
|
|
||||||
|
{ |
||||||
|
ModelName "DCP-7030" |
||||||
|
Attribute "NickName" "" "Brother DCP-7030, using @PACKAGE@ v@VERSION@" |
||||||
|
Attribute "1284DeviceID" "" "MFG:Brother;CMD:PJL,HBP;MDL:DCP-7030;CLS:PRINTER;" |
||||||
|
PCFileName "br7030.ppd" |
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
# This file is part of the brlaser printer driver. |
||||||
|
# |
||||||
|
# Copyright 2013 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/>. |
||||||
|
|
||||||
|
AC_PREREQ(2.68) |
||||||
|
AC_INIT([brlaser], [1], [pdewacht@gmail.com], [brlaser], |
||||||
|
[https://github.com/pdewacht/brlaser]) |
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([src/line.cc]) |
||||||
|
AC_CONFIG_MACRO_DIR([m4]) |
||||||
|
AC_CONFIG_AUX_DIR([build-aux]) |
||||||
|
AC_LANG([C++]) |
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([1.11.1 foreign subdir-objects dist-xz -Wall -Werror]) |
||||||
|
AM_MAINTAINER_MODE([enable]) |
||||||
|
AM_SILENT_RULES([yes]) |
||||||
|
|
||||||
|
AC_PROG_CXX |
||||||
|
AX_CXX_COMPILE_STDCXX_11 |
||||||
|
AX_CXXFLAGS_WARN_ALL |
||||||
|
|
||||||
|
dnl Use cups-config to detect the CUPS configuration. |
||||||
|
AC_PATH_PROG(CUPS_CONFIG, cups-config) |
||||||
|
AS_IF([test -z "$CUPS_CONFIG"], |
||||||
|
[AC_MSG_ERROR(["cups-config" command not found. Please install the CUPS development package.])]) |
||||||
|
CUPS_CFLAGS=`"$CUPS_CONFIG" --cflags` |
||||||
|
CUPS_LIBS=`"$CUPS_CONFIG" --image --libs` |
||||||
|
CUPS_SERVERBIN=`"$CUPS_CONFIG" --serverbin` |
||||||
|
CUPS_DATADIR=`"$CUPS_CONFIG" --datadir` |
||||||
|
AC_SUBST(CUPS_CFLAGS) |
||||||
|
AC_SUBST(CUPS_LIBS) |
||||||
|
AC_SUBST(CUPS_SERVERBIN) |
||||||
|
AC_SUBST(CUPS_DATADIR) |
||||||
|
|
||||||
|
dnl 'cups-config --libs' lists a lot of libs we don't need/want, |
||||||
|
dnl try to figure out whether the linker knows about --as-needed. |
||||||
|
AC_ARG_ENABLE([as-needed], |
||||||
|
AC_HELP_STRING([--disable-as-needed], [disable overlinking protection])) |
||||||
|
AS_IF([test "x$enable_as_needed" != "xno"], |
||||||
|
[AX_APPEND_LINK_FLAGS([-Wl,--as-needed])]) |
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h]) |
||||||
|
AC_CONFIG_FILES([Makefile brlaser.drv]) |
||||||
|
AC_OUTPUT |
||||||
@ -0,0 +1,69 @@ |
|||||||
|
# =========================================================================== |
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html |
||||||
|
# =========================================================================== |
||||||
|
# |
||||||
|
# SYNOPSIS |
||||||
|
# |
||||||
|
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) |
||||||
|
# |
||||||
|
# DESCRIPTION |
||||||
|
# |
||||||
|
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space |
||||||
|
# added in between. |
||||||
|
# |
||||||
|
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. |
||||||
|
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains |
||||||
|
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly |
||||||
|
# FLAG. |
||||||
|
# |
||||||
|
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. |
||||||
|
# |
||||||
|
# LICENSE |
||||||
|
# |
||||||
|
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
||||||
|
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
||||||
|
# |
||||||
|
# This program 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 3 of the License, or (at your |
||||||
|
# option) any later version. |
||||||
|
# |
||||||
|
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
# |
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner |
||||||
|
# gives unlimited permission to copy, distribute and modify the configure |
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You |
||||||
|
# need not follow the terms of the GNU General Public License when using |
||||||
|
# or distributing such scripts, even though portions of the text of the |
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern |
||||||
|
# all other use of the material that constitutes the Autoconf Macro. |
||||||
|
# |
||||||
|
# This special exception to the GPL applies to versions of the Autoconf |
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a |
||||||
|
# modified version of the Autoconf Macro, you may extend this special |
||||||
|
# exception to the GPL to apply to your modified version as well. |
||||||
|
|
||||||
|
#serial 2 |
||||||
|
|
||||||
|
AC_DEFUN([AX_APPEND_FLAG], |
||||||
|
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX |
||||||
|
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl |
||||||
|
AS_VAR_SET_IF(FLAGS, |
||||||
|
[case " AS_VAR_GET(FLAGS) " in |
||||||
|
*" $1 "*) |
||||||
|
AC_RUN_LOG([: FLAGS already contains $1]) |
||||||
|
;; |
||||||
|
*) |
||||||
|
AC_RUN_LOG([: FLAGS="$FLAGS $1"]) |
||||||
|
AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) |
||||||
|
;; |
||||||
|
esac], |
||||||
|
[AS_VAR_SET(FLAGS,["$1"])]) |
||||||
|
AS_VAR_POPDEF([FLAGS])dnl |
||||||
|
])dnl AX_APPEND_FLAG |
||||||
@ -0,0 +1,61 @@ |
|||||||
|
# =========================================================================== |
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html |
||||||
|
# =========================================================================== |
||||||
|
# |
||||||
|
# SYNOPSIS |
||||||
|
# |
||||||
|
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) |
||||||
|
# |
||||||
|
# DESCRIPTION |
||||||
|
# |
||||||
|
# For every FLAG1, FLAG2 it is checked whether the linker works with the |
||||||
|
# flag. If it does, the flag is added FLAGS-VARIABLE |
||||||
|
# |
||||||
|
# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is |
||||||
|
# used. During the check the flag is always added to the linker's flags. |
||||||
|
# |
||||||
|
# If EXTRA-FLAGS is defined, it is added to the linker's default flags |
||||||
|
# when the check is done. The check is thus made with the flags: "LDFLAGS |
||||||
|
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to |
||||||
|
# issue an error when a bad flag is given. |
||||||
|
# |
||||||
|
# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. |
||||||
|
# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. |
||||||
|
# |
||||||
|
# LICENSE |
||||||
|
# |
||||||
|
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
||||||
|
# |
||||||
|
# This program 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 3 of the License, or (at your |
||||||
|
# option) any later version. |
||||||
|
# |
||||||
|
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
# |
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner |
||||||
|
# gives unlimited permission to copy, distribute and modify the configure |
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You |
||||||
|
# need not follow the terms of the GNU General Public License when using |
||||||
|
# or distributing such scripts, even though portions of the text of the |
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern |
||||||
|
# all other use of the material that constitutes the Autoconf Macro. |
||||||
|
# |
||||||
|
# This special exception to the GPL applies to versions of the Autoconf |
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a |
||||||
|
# modified version of the Autoconf Macro, you may extend this special |
||||||
|
# exception to the GPL to apply to your modified version as well. |
||||||
|
|
||||||
|
#serial 2 |
||||||
|
|
||||||
|
AC_DEFUN([AX_APPEND_LINK_FLAGS], |
||||||
|
[for flag in $1; do |
||||||
|
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3]) |
||||||
|
done |
||||||
|
])dnl AX_APPEND_LINK_FLAGS |
||||||
@ -0,0 +1,122 @@ |
|||||||
|
# =========================================================================== |
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html |
||||||
|
# =========================================================================== |
||||||
|
# |
||||||
|
# SYNOPSIS |
||||||
|
# |
||||||
|
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
||||||
|
# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
||||||
|
# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
||||||
|
# |
||||||
|
# DESCRIPTION |
||||||
|
# |
||||||
|
# Try to find a compiler option that enables most reasonable warnings. |
||||||
|
# |
||||||
|
# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result |
||||||
|
# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. |
||||||
|
# |
||||||
|
# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, |
||||||
|
# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and |
||||||
|
# Intel compilers. For a given compiler, the Fortran flags are much more |
||||||
|
# experimental than their C equivalents. |
||||||
|
# |
||||||
|
# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS |
||||||
|
# - $2 add-value-if-not-found : nothing |
||||||
|
# - $3 action-if-found : add value to shellvariable |
||||||
|
# - $4 action-if-not-found : nothing |
||||||
|
# |
||||||
|
# NOTE: These macros depend on AX_APPEND_FLAG. |
||||||
|
# |
||||||
|
# LICENSE |
||||||
|
# |
||||||
|
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
||||||
|
# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com> |
||||||
|
# |
||||||
|
# This program 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 3 of the License, or (at your |
||||||
|
# option) any later version. |
||||||
|
# |
||||||
|
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
# |
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner |
||||||
|
# gives unlimited permission to copy, distribute and modify the configure |
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You |
||||||
|
# need not follow the terms of the GNU General Public License when using |
||||||
|
# or distributing such scripts, even though portions of the text of the |
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern |
||||||
|
# all other use of the material that constitutes the Autoconf Macro. |
||||||
|
# |
||||||
|
# This special exception to the GPL applies to versions of the Autoconf |
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a |
||||||
|
# modified version of the Autoconf Macro, you may extend this special |
||||||
|
# exception to the GPL to apply to your modified version as well. |
||||||
|
|
||||||
|
#serial 14 |
||||||
|
|
||||||
|
AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl |
||||||
|
AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl |
||||||
|
AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl |
||||||
|
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], |
||||||
|
VAR,[VAR="no, unknown" |
||||||
|
ac_save_[]FLAGS="$[]FLAGS" |
||||||
|
for ac_arg dnl |
||||||
|
in "-warn all % -warn all" dnl Intel |
||||||
|
"-pedantic % -Wall" dnl GCC |
||||||
|
"-xstrconst % -v" dnl Solaris C |
||||||
|
"-std1 % -verbose -w0 -warnprotos" dnl Digital Unix |
||||||
|
"-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX |
||||||
|
"-ansi -ansiE % -fullwarn" dnl IRIX |
||||||
|
"+ESlit % +w1" dnl HP-UX C |
||||||
|
"-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) |
||||||
|
"-h conform % -h msglevel 2" dnl Cray C (Unicos) |
||||||
|
# |
||||||
|
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` |
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM], |
||||||
|
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) |
||||||
|
done |
||||||
|
FLAGS="$ac_save_[]FLAGS" |
||||||
|
]) |
||||||
|
AS_VAR_POPDEF([FLAGS])dnl |
||||||
|
AC_REQUIRE([AX_APPEND_FLAG]) |
||||||
|
case ".$VAR" in |
||||||
|
.ok|.ok,*) m4_ifvaln($3,$3) ;; |
||||||
|
.|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; |
||||||
|
*) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; |
||||||
|
esac |
||||||
|
AS_VAR_POPDEF([VAR])dnl |
||||||
|
])dnl AX_FLAGS_WARN_ALL |
||||||
|
dnl implementation tactics: |
||||||
|
dnl the for-argument contains a list of options. The first part of |
||||||
|
dnl these does only exist to detect the compiler - usually it is |
||||||
|
dnl a global option to enable -ansi or -extrawarnings. All other |
||||||
|
dnl compilers will fail about it. That was needed since a lot of |
||||||
|
dnl compilers will give false positives for some option-syntax |
||||||
|
dnl like -Woption or -Xoption as they think of it is a pass-through |
||||||
|
dnl to later compile stages or something. The "%" is used as a |
||||||
|
dnl delimiter. A non-option comment can be given after "%%" marks |
||||||
|
dnl which will be shown but not added to the respective C/CXXFLAGS. |
||||||
|
|
||||||
|
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl |
||||||
|
AC_LANG_PUSH([C]) |
||||||
|
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
||||||
|
AC_LANG_POP([C]) |
||||||
|
]) |
||||||
|
|
||||||
|
AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl |
||||||
|
AC_LANG_PUSH([C++]) |
||||||
|
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
||||||
|
AC_LANG_POP([C++]) |
||||||
|
]) |
||||||
|
|
||||||
|
AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl |
||||||
|
AC_LANG_PUSH([Fortran]) |
||||||
|
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
||||||
|
AC_LANG_POP([Fortran]) |
||||||
|
]) |
||||||
@ -0,0 +1,73 @@ |
|||||||
|
# =========================================================================== |
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html |
||||||
|
# =========================================================================== |
||||||
|
# |
||||||
|
# SYNOPSIS |
||||||
|
# |
||||||
|
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) |
||||||
|
# |
||||||
|
# DESCRIPTION |
||||||
|
# |
||||||
|
# Check whether the given FLAG works with the linker or gives an error. |
||||||
|
# (Warnings, however, are ignored) |
||||||
|
# |
||||||
|
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on |
||||||
|
# success/failure. |
||||||
|
# |
||||||
|
# If EXTRA-FLAGS is defined, it is added to the linker's default flags |
||||||
|
# when the check is done. The check is thus made with the flags: "LDFLAGS |
||||||
|
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to |
||||||
|
# issue an error when a bad flag is given. |
||||||
|
# |
||||||
|
# INPUT gives an alternative input source to AC_LINK_IFELSE. |
||||||
|
# |
||||||
|
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this |
||||||
|
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. |
||||||
|
# |
||||||
|
# LICENSE |
||||||
|
# |
||||||
|
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
||||||
|
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
||||||
|
# |
||||||
|
# This program 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 3 of the License, or (at your |
||||||
|
# option) any later version. |
||||||
|
# |
||||||
|
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
# |
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner |
||||||
|
# gives unlimited permission to copy, distribute and modify the configure |
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You |
||||||
|
# need not follow the terms of the GNU General Public License when using |
||||||
|
# or distributing such scripts, even though portions of the text of the |
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern |
||||||
|
# all other use of the material that constitutes the Autoconf Macro. |
||||||
|
# |
||||||
|
# This special exception to the GPL applies to versions of the Autoconf |
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a |
||||||
|
# modified version of the Autoconf Macro, you may extend this special |
||||||
|
# exception to the GPL to apply to your modified version as well. |
||||||
|
|
||||||
|
#serial 3 |
||||||
|
|
||||||
|
AC_DEFUN([AX_CHECK_LINK_FLAG], |
||||||
|
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl |
||||||
|
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ |
||||||
|
ax_check_save_flags=$LDFLAGS |
||||||
|
LDFLAGS="$LDFLAGS $4 $1" |
||||||
|
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], |
||||||
|
[AS_VAR_SET(CACHEVAR,[yes])], |
||||||
|
[AS_VAR_SET(CACHEVAR,[no])]) |
||||||
|
LDFLAGS=$ax_check_save_flags]) |
||||||
|
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], |
||||||
|
[m4_default([$2], :)], |
||||||
|
[m4_default([$3], :)]) |
||||||
|
AS_VAR_POPDEF([CACHEVAR])dnl |
||||||
|
])dnl AX_CHECK_LINK_FLAGS |
||||||
@ -0,0 +1,133 @@ |
|||||||
|
# ============================================================================ |
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html |
||||||
|
# ============================================================================ |
||||||
|
# |
||||||
|
# SYNOPSIS |
||||||
|
# |
||||||
|
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) |
||||||
|
# |
||||||
|
# DESCRIPTION |
||||||
|
# |
||||||
|
# Check for baseline language coverage in the compiler for the C++11 |
||||||
|
# standard; if necessary, add switches to CXXFLAGS to enable support. |
||||||
|
# |
||||||
|
# The first argument, if specified, indicates whether you insist on an |
||||||
|
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. |
||||||
|
# -std=c++11). If neither is specified, you get whatever works, with |
||||||
|
# preference for an extended mode. |
||||||
|
# |
||||||
|
# The second argument, if specified 'mandatory' or if left unspecified, |
||||||
|
# indicates that baseline C++11 support is required and that the macro |
||||||
|
# should error out if no mode with that support is found. If specified |
||||||
|
# 'optional', then configuration proceeds regardless, after defining |
||||||
|
# HAVE_CXX11 if and only if a supporting mode is found. |
||||||
|
# |
||||||
|
# LICENSE |
||||||
|
# |
||||||
|
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> |
||||||
|
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com> |
||||||
|
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu> |
||||||
|
# |
||||||
|
# Copying and distribution of this file, with or without modification, are |
||||||
|
# permitted in any medium without royalty provided the copyright notice |
||||||
|
# and this notice are preserved. This file is offered as-is, without any |
||||||
|
# warranty. |
||||||
|
|
||||||
|
#serial 3 |
||||||
|
|
||||||
|
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [ |
||||||
|
template <typename T> |
||||||
|
struct check |
||||||
|
{ |
||||||
|
static_assert(sizeof(int) <= sizeof(T), "not big enough"); |
||||||
|
}; |
||||||
|
|
||||||
|
typedef check<check<bool>> right_angle_brackets; |
||||||
|
|
||||||
|
int a; |
||||||
|
decltype(a) b; |
||||||
|
|
||||||
|
typedef check<int> check_type; |
||||||
|
check_type c; |
||||||
|
check_type&& cr = static_cast<check_type&&>(c); |
||||||
|
|
||||||
|
auto d = a; |
||||||
|
]) |
||||||
|
|
||||||
|
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl |
||||||
|
m4_if([$1], [], [], |
||||||
|
[$1], [ext], [], |
||||||
|
[$1], [noext], [], |
||||||
|
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl |
||||||
|
m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], |
||||||
|
[$2], [mandatory], [ax_cxx_compile_cxx11_required=true], |
||||||
|
[$2], [optional], [ax_cxx_compile_cxx11_required=false], |
||||||
|
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl |
||||||
|
AC_LANG_PUSH([C++])dnl |
||||||
|
ac_success=no |
||||||
|
AC_CACHE_CHECK(whether $CXX supports C++11 features by default, |
||||||
|
ax_cv_cxx_compile_cxx11, |
||||||
|
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], |
||||||
|
[ax_cv_cxx_compile_cxx11=yes], |
||||||
|
[ax_cv_cxx_compile_cxx11=no])]) |
||||||
|
if test x$ax_cv_cxx_compile_cxx11 = xyes; then |
||||||
|
ac_success=yes |
||||||
|
fi |
||||||
|
|
||||||
|
m4_if([$1], [noext], [], [dnl |
||||||
|
if test x$ac_success = xno; then |
||||||
|
for switch in -std=gnu++11 -std=gnu++0x; do |
||||||
|
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) |
||||||
|
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, |
||||||
|
$cachevar, |
||||||
|
[ac_save_CXXFLAGS="$CXXFLAGS" |
||||||
|
CXXFLAGS="$CXXFLAGS $switch" |
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], |
||||||
|
[eval $cachevar=yes], |
||||||
|
[eval $cachevar=no]) |
||||||
|
CXXFLAGS="$ac_save_CXXFLAGS"]) |
||||||
|
if eval test x\$$cachevar = xyes; then |
||||||
|
CXXFLAGS="$CXXFLAGS $switch" |
||||||
|
ac_success=yes |
||||||
|
break |
||||||
|
fi |
||||||
|
done |
||||||
|
fi]) |
||||||
|
|
||||||
|
m4_if([$1], [ext], [], [dnl |
||||||
|
if test x$ac_success = xno; then |
||||||
|
for switch in -std=c++11 -std=c++0x; do |
||||||
|
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) |
||||||
|
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, |
||||||
|
$cachevar, |
||||||
|
[ac_save_CXXFLAGS="$CXXFLAGS" |
||||||
|
CXXFLAGS="$CXXFLAGS $switch" |
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], |
||||||
|
[eval $cachevar=yes], |
||||||
|
[eval $cachevar=no]) |
||||||
|
CXXFLAGS="$ac_save_CXXFLAGS"]) |
||||||
|
if eval test x\$$cachevar = xyes; then |
||||||
|
CXXFLAGS="$CXXFLAGS $switch" |
||||||
|
ac_success=yes |
||||||
|
break |
||||||
|
fi |
||||||
|
done |
||||||
|
fi]) |
||||||
|
AC_LANG_POP([C++]) |
||||||
|
if test x$ax_cxx_compile_cxx11_required = xtrue; then |
||||||
|
if test x$ac_success = xno; then |
||||||
|
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) |
||||||
|
fi |
||||||
|
else |
||||||
|
if test x$ac_success = xno; then |
||||||
|
HAVE_CXX11=0 |
||||||
|
AC_MSG_NOTICE([No compiler with C++11 support was found]) |
||||||
|
else |
||||||
|
HAVE_CXX11=1 |
||||||
|
AC_DEFINE(HAVE_CXX11,1, |
||||||
|
[define if the compiler supports basic C++11 syntax]) |
||||||
|
fi |
||||||
|
|
||||||
|
AC_SUBST(HAVE_CXX11) |
||||||
|
fi |
||||||
|
]) |
||||||
@ -0,0 +1,106 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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 "debug.h" |
||||||
|
#include <iostream> |
||||||
|
#include <typeinfo> |
||||||
|
|
||||||
|
namespace { |
||||||
|
|
||||||
|
template <typename T> |
||||||
|
void dump(const char *name, const T &value) { |
||||||
|
std::cerr << "DEBUG: page header: " << name << " = " << value << '\n'; |
||||||
|
} |
||||||
|
|
||||||
|
template <typename T, int N> |
||||||
|
void dump(const char *name, const T (&value)[N]) { |
||||||
|
std::cerr << "DEBUG: page header: " << name << " ="; |
||||||
|
for (int i = 0; i < N; ++i) { |
||||||
|
std::cerr << ' ' << value[i]; |
||||||
|
} |
||||||
|
std::cerr << '\n'; |
||||||
|
} |
||||||
|
|
||||||
|
void dump(const char *name, const char *value) { |
||||||
|
std::cerr << "DEBUG: page header: " << name << " = \"" << value << "\"\n"; |
||||||
|
} |
||||||
|
|
||||||
|
template <int N, int M> |
||||||
|
void dump(const char *name, const char (&value)[N][M]) { |
||||||
|
std::cerr << "DEBUG: page header: " << name << " ="; |
||||||
|
for (int i = 0; i < N; ++i) { |
||||||
|
std::cerr << " \"" << value[i] << '"'; |
||||||
|
} |
||||||
|
std::cerr << '\n'; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
void dump_page_header(const cups_page_header2_t &h) { |
||||||
|
#define d(f) dump(#f, h.f) |
||||||
|
d(MediaClass); |
||||||
|
d(MediaColor); |
||||||
|
d(MediaType); |
||||||
|
d(OutputType); |
||||||
|
d(AdvanceDistance); |
||||||
|
d(AdvanceMedia); |
||||||
|
d(Collate); |
||||||
|
d(CutMedia); |
||||||
|
d(Duplex); |
||||||
|
d(HWResolution); |
||||||
|
d(ImagingBoundingBox); |
||||||
|
d(InsertSheet); |
||||||
|
d(Jog); |
||||||
|
d(LeadingEdge); |
||||||
|
d(Margins); |
||||||
|
d(ManualFeed); |
||||||
|
d(MediaPosition); |
||||||
|
d(MediaWeight); |
||||||
|
d(MirrorPrint); |
||||||
|
d(NegativePrint); |
||||||
|
d(NumCopies); |
||||||
|
d(Orientation); |
||||||
|
d(OutputFaceUp); |
||||||
|
d(PageSize); |
||||||
|
d(Separations); |
||||||
|
d(TraySwitch); |
||||||
|
d(Tumble); |
||||||
|
d(cupsWidth); |
||||||
|
d(cupsHeight); |
||||||
|
d(cupsMediaType); |
||||||
|
d(cupsBitsPerColor); |
||||||
|
d(cupsBitsPerPixel); |
||||||
|
d(cupsBytesPerLine); |
||||||
|
d(cupsColorOrder); |
||||||
|
d(cupsColorSpace); |
||||||
|
d(cupsCompression); |
||||||
|
d(cupsRowCount); |
||||||
|
d(cupsRowFeed); |
||||||
|
d(cupsRowStep); |
||||||
|
d(cupsNumColors); |
||||||
|
d(cupsBorderlessScalingFactor); |
||||||
|
d(cupsPageSize); |
||||||
|
d(cupsImagingBBox); |
||||||
|
d(cupsInteger); |
||||||
|
d(cupsReal); |
||||||
|
d(cupsString); |
||||||
|
d(cupsMarkerType); |
||||||
|
d(cupsRenderingIntent); |
||||||
|
d(cupsPageSizeName); |
||||||
|
#undef d |
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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/>.
|
||||||
|
|
||||||
|
#ifndef DEBUG_H |
||||||
|
#define DEBUG_H |
||||||
|
|
||||||
|
#include <cups/raster.h> |
||||||
|
|
||||||
|
void dump_page_header(const cups_page_header2_t &h); |
||||||
|
|
||||||
|
#endif |
||||||
@ -0,0 +1,152 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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 "job.h" |
||||||
|
#include <assert.h> |
||||||
|
#include <algorithm> |
||||||
|
#include <vector> |
||||||
|
#include "line.h" |
||||||
|
|
||||||
|
using std::vector; |
||||||
|
|
||||||
|
namespace { |
||||||
|
|
||||||
|
class block { |
||||||
|
public: |
||||||
|
void add_line(vector<uint8_t> &&line) { |
||||||
|
assert(!line.empty()); |
||||||
|
line_bytes_ += line.size(); |
||||||
|
lines_.push_back(line); |
||||||
|
} |
||||||
|
|
||||||
|
bool line_fits(unsigned size) { |
||||||
|
return lines_.size() != max_lines_per_block_ |
||||||
|
&& line_bytes_ + size < max_block_size_; |
||||||
|
} |
||||||
|
|
||||||
|
void flush(FILE *f) { |
||||||
|
if (line_bytes_) { |
||||||
|
fprintf(f, "%dw%c%c", |
||||||
|
line_bytes_ + 2, 0, |
||||||
|
static_cast<int>(lines_.size())); |
||||||
|
for (auto &line : lines_) { |
||||||
|
fwrite(line.data(), 1, line.size(), f); |
||||||
|
} |
||||||
|
line_bytes_ = 0; |
||||||
|
lines_.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
const unsigned max_block_size_ = 16350; |
||||||
|
const unsigned max_lines_per_block_ = 128; |
||||||
|
|
||||||
|
vector<vector<uint8_t>> lines_; |
||||||
|
int line_bytes_ = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
job::job(FILE *out, const std::string &job_name) |
||||||
|
: out_(out), |
||||||
|
job_name_(job_name), |
||||||
|
page_params_() { |
||||||
|
// 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(); |
||||||
|
} |
||||||
|
|
||||||
|
void job::begin_job() { |
||||||
|
for (int i = 0; i < 128; ++i) { |
||||||
|
putc(0, out_); |
||||||
|
} |
||||||
|
fprintf(out_, "\033%%-12345X@PJL\n"); |
||||||
|
fprintf(out_, "@PJL JOB NAME=\"%s\"\n", job_name_.c_str()); |
||||||
|
} |
||||||
|
|
||||||
|
void job::end_job() { |
||||||
|
fprintf(out_, "\033%%-12345X@PJL\n"); |
||||||
|
fprintf(out_, "@PJL EOJ NAME=\"%s\"\n", job_name_.c_str()); |
||||||
|
fprintf(out_, "\033%%-12345X\n"); |
||||||
|
} |
||||||
|
|
||||||
|
void job::write_page_header() { |
||||||
|
fprintf(out_, "\033%%-12345X@PJL\n"); |
||||||
|
if (page_params_.resolution != 1200) { |
||||||
|
fprintf(out_, "@PJL SET RAS1200MODE = FALSE\n"); |
||||||
|
fprintf(out_, "@PJL SET RESOLUTION = %d\n", page_params_.resolution); |
||||||
|
} else { |
||||||
|
fprintf(out_, "@PJL SET RAS1200MODE = TRUE\n"); |
||||||
|
fprintf(out_, "@PJL SET RESOLUTION = 600\n"); |
||||||
|
} |
||||||
|
fprintf(out_, "@PJL SET ECONOMODE = %s\n", |
||||||
|
page_params_.economode ? "ON" : "OFF"); |
||||||
|
fprintf(out_, "@PJL SET SOURCETRAY = %s\n", |
||||||
|
page_params_.sourcetray.c_str()); |
||||||
|
fprintf(out_, "@PJL SET MEDIATYPE = %s\n", |
||||||
|
page_params_.mediatype.c_str()); |
||||||
|
fprintf(out_, "@PJL SET PAPER = %s\n", |
||||||
|
page_params_.papersize.c_str()); |
||||||
|
fprintf(out_, "@PJL SET PAGEPROTECT = AUTO\n"); |
||||||
|
fprintf(out_, "@PJL SET ORIENTATION = PORTRAIT\n"); |
||||||
|
fprintf(out_, "@PJL ENTER LANGUAGE = PCL\n"); |
||||||
|
} |
||||||
|
|
||||||
|
void job::encode_page(const page_params &page_params, |
||||||
|
int num_copies, |
||||||
|
int lines, |
||||||
|
int linesize, |
||||||
|
nextline_fn nextline) { |
||||||
|
if (!(page_params_ == page_params)) { |
||||||
|
page_params_ = page_params; |
||||||
|
write_page_header(); |
||||||
|
} |
||||||
|
|
||||||
|
vector<uint8_t> line(linesize); |
||||||
|
vector<uint8_t> reference(linesize); |
||||||
|
block block; |
||||||
|
|
||||||
|
if (!nextline(line.data())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
block.add_line(encode_line(line)); |
||||||
|
std::swap(line, reference); |
||||||
|
|
||||||
|
fputs("\033E", out_); |
||||||
|
fprintf(out_, "\033&l%dX", std::max(1, num_copies)); |
||||||
|
fputs("\033*b1030m", out_); |
||||||
|
|
||||||
|
for (int i = 1; i < lines && nextline(line.data()); ++i) { |
||||||
|
vector<uint8_t> encoded = encode_line(line, reference); |
||||||
|
if (!block.line_fits(encoded.size())) { |
||||||
|
block.flush(out_); |
||||||
|
} |
||||||
|
block.add_line(std::move(encoded)); |
||||||
|
std::swap(line, reference); |
||||||
|
} |
||||||
|
|
||||||
|
block.flush(out_); |
||||||
|
fputs("1030M\f", out_); |
||||||
|
fflush(out_); |
||||||
|
} |
||||||
@ -0,0 +1,64 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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/>.
|
||||||
|
|
||||||
|
#ifndef JOB_H |
||||||
|
#define JOB_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <string> |
||||||
|
|
||||||
|
struct page_params { |
||||||
|
int resolution; |
||||||
|
bool economode; |
||||||
|
std::string sourcetray; |
||||||
|
std::string mediatype; |
||||||
|
std::string papersize; |
||||||
|
|
||||||
|
bool operator==(const page_params &o) const { |
||||||
|
return resolution == o.resolution |
||||||
|
&& economode == o.economode |
||||||
|
&& sourcetray == o.sourcetray |
||||||
|
&& mediatype == o.mediatype |
||||||
|
&& papersize == o.papersize; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
class job { |
||||||
|
public: |
||||||
|
typedef bool (*nextline_fn)(uint8_t *buf); |
||||||
|
|
||||||
|
explicit job(FILE *out, const std::string &job_name); |
||||||
|
~job(); |
||||||
|
|
||||||
|
void encode_page(const page_params ¶ms, |
||||||
|
int num_copies, |
||||||
|
int lines, |
||||||
|
int linesize, |
||||||
|
nextline_fn nextline); |
||||||
|
|
||||||
|
private: |
||||||
|
void begin_job(); |
||||||
|
void end_job(); |
||||||
|
void write_page_header(); |
||||||
|
|
||||||
|
FILE *out_; |
||||||
|
std::string job_name_; |
||||||
|
page_params page_params_; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // JOB_H
|
||||||
@ -0,0 +1,191 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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 "line.h" |
||||||
|
#include <assert.h> |
||||||
|
#include <algorithm> |
||||||
|
using std::vector; |
||||||
|
|
||||||
|
namespace { |
||||||
|
|
||||||
|
void write_overflow(int value, vector<uint8_t> *out) { |
||||||
|
if (value >= 0) { |
||||||
|
if (value < 255) { |
||||||
|
out->push_back(value); |
||||||
|
} else { |
||||||
|
out->insert(out->end(), value / 255, 255); |
||||||
|
out->push_back(value % 255); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
template <typename Iterator> |
||||||
|
void write_substitute(int offset, |
||||||
|
Iterator first, |
||||||
|
Iterator last, |
||||||
|
vector<uint8_t> *out) { |
||||||
|
assert(offset >= 0); |
||||||
|
assert(offset < 10000); |
||||||
|
assert(first != last); |
||||||
|
|
||||||
|
const int offset_max = 15; |
||||||
|
const int count_max = 7; |
||||||
|
int count = std::distance(first, last) - 1; |
||||||
|
|
||||||
|
int offset_low = std::min(offset, offset_max); |
||||||
|
int count_low = std::min(count, count_max); |
||||||
|
out->push_back((offset_low << 3) | count_low); |
||||||
|
write_overflow(offset - offset_max, out); |
||||||
|
write_overflow(count - count_max, out); |
||||||
|
out->insert(out->end(), first, last); |
||||||
|
} |
||||||
|
|
||||||
|
void write_repeat(int offset, int count, int value, vector<uint8_t> *out) { |
||||||
|
assert(offset >= 0); |
||||||
|
assert(offset < 10000); |
||||||
|
assert(count >= 2); |
||||||
|
assert(count < 10000); |
||||||
|
|
||||||
|
const int offset_max = 3; |
||||||
|
const int count_max = 31; |
||||||
|
count -= 2; |
||||||
|
|
||||||
|
int offset_low = std::min(offset, offset_max); |
||||||
|
int count_low = std::min(count, count_max); |
||||||
|
out->push_back(128 | (offset_low << 5) | count_low); |
||||||
|
write_overflow(offset - offset_max, out); |
||||||
|
write_overflow(count - count_max, out); |
||||||
|
out->push_back(value); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
bool all_zeros(const vector<uint8_t> &buf) { |
||||||
|
return std::none_of(buf.begin(), buf.end(), [](uint8_t b) { return b; }); |
||||||
|
} |
||||||
|
|
||||||
|
template <typename Iterator1, typename Iterator2> |
||||||
|
int skip_to_next_mismatch(Iterator1 *first1, |
||||||
|
Iterator1 last1, |
||||||
|
Iterator2 *first2) { |
||||||
|
auto mismatch_it = std::mismatch(*first1, last1, *first2); |
||||||
|
int skipped = std::distance(*first1, mismatch_it.first); |
||||||
|
*first1 = mismatch_it.first; |
||||||
|
*first2 = mismatch_it.second; |
||||||
|
return skipped; |
||||||
|
} |
||||||
|
|
||||||
|
template <typename Iterator> |
||||||
|
int repeat_length(Iterator first, Iterator last) { |
||||||
|
if (first != last) { |
||||||
|
auto k = *first; |
||||||
|
auto mismatch = std::find_if(std::next(first), last, |
||||||
|
[=](decltype(k) x) { return x != k; }); |
||||||
|
return std::distance(first, mismatch); |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
template <typename Iterator1, typename Iterator2> |
||||||
|
int substitute_length(Iterator1 first1, Iterator1 last1, Iterator2 first2) { |
||||||
|
if (first1 != last1) { |
||||||
|
Iterator1 it1 = first1; |
||||||
|
Iterator2 it2 = first2; |
||||||
|
Iterator1 next1 = std::next(first1); |
||||||
|
Iterator2 next2 = std::next(first2); |
||||||
|
Iterator1 prev1 = first1; |
||||||
|
while (next1 != last1) { |
||||||
|
if ((*it1 == *it2 && *next1 == *next2)) { |
||||||
|
return std::distance(first1, it1); |
||||||
|
} |
||||||
|
if (*it1 == *next1 && *it1 == *prev1) { |
||||||
|
return std::distance(first1, prev1); |
||||||
|
} |
||||||
|
prev1 = it1; |
||||||
|
it1 = next1; it2 = next2; |
||||||
|
++next1; ++next2; |
||||||
|
} |
||||||
|
} |
||||||
|
return std::distance(first1, last1); |
||||||
|
} |
||||||
|
|
||||||
|
size_t reserve_size(const vector<uint8_t> &line) { |
||||||
|
// Big enough to store the line uncompressed together with an Substitute
|
||||||
|
// command with many overflow bytes.
|
||||||
|
return line.size() + 16; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
vector<uint8_t> encode_line(const vector<uint8_t> &line, |
||||||
|
const vector<uint8_t> &reference) { |
||||||
|
assert(line.size() == reference.size()); |
||||||
|
if (all_zeros(line)) { |
||||||
|
return vector<uint8_t>(1, 0xFF); |
||||||
|
} |
||||||
|
|
||||||
|
vector<uint8_t> output; |
||||||
|
output.reserve(reserve_size(line)); |
||||||
|
output.push_back(0); // first byte is the edit count
|
||||||
|
|
||||||
|
const uint8_t max_edits = 254; |
||||||
|
int num_edits = 0; |
||||||
|
|
||||||
|
auto line_it = line.begin(); |
||||||
|
auto ref_it = reference.begin(); |
||||||
|
while (1) { |
||||||
|
int offset = skip_to_next_mismatch(&line_it, line.end(), &ref_it); |
||||||
|
if (line_it == line.end()) { |
||||||
|
// No more differences, we're done.
|
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
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); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
int s = substitute_length(line_it, line.end(), 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()); |
||||||
|
assert(r >= 2); |
||||||
|
write_repeat(offset, r, *line_it, &output); |
||||||
|
line_it += r; |
||||||
|
ref_it += r; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
assert(num_edits <= max_edits); |
||||||
|
output[0] = num_edits; |
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
vector<uint8_t> encode_line(const vector<uint8_t> &line) { |
||||||
|
if (all_zeros(line)) { |
||||||
|
return vector<uint8_t>(1, 0xFF); |
||||||
|
} |
||||||
|
vector<uint8_t> buf; |
||||||
|
buf.reserve(reserve_size(line)); |
||||||
|
buf.push_back(1); |
||||||
|
write_substitute(0, line.begin(), line.end(), &buf); |
||||||
|
return buf; |
||||||
|
} |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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/>.
|
||||||
|
|
||||||
|
#ifndef LINE_H |
||||||
|
#define LINE_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
std::vector<uint8_t> encode_line( |
||||||
|
const std::vector<uint8_t> &line, |
||||||
|
const std::vector<uint8_t> &reference); |
||||||
|
|
||||||
|
std::vector<uint8_t> encode_line( |
||||||
|
const std::vector<uint8_t> &line); |
||||||
|
|
||||||
|
#endif // LINE_H
|
||||||
@ -0,0 +1,194 @@ |
|||||||
|
// This file is part of the brlaser printer driver.
|
||||||
|
//
|
||||||
|
// Copyright 2013 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 <stdio.h> |
||||||
|
#include <signal.h> |
||||||
|
#include <locale.h> |
||||||
|
#include <iconv.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <cups/raster.h> |
||||||
|
#include <algorithm> |
||||||
|
#include <functional> |
||||||
|
#include <string> |
||||||
|
#include <array> |
||||||
|
#include <map> |
||||||
|
#include "config.h" |
||||||
|
#include "job.h" |
||||||
|
#include "debug.h" |
||||||
|
|
||||||
|
namespace { |
||||||
|
|
||||||
|
volatile sig_atomic_t interrupted = 0; |
||||||
|
|
||||||
|
void sigterm_handler(int sig) { |
||||||
|
interrupted = 1; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
cups_raster_t *ras; |
||||||
|
cups_page_header2_t header; |
||||||
|
|
||||||
|
bool next_line(uint8_t *buf) { |
||||||
|
if (interrupted) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
unsigned bytes = header.cupsBytesPerLine; |
||||||
|
return cupsRasterReadPixels(ras, buf, bytes) == bytes; |
||||||
|
} |
||||||
|
|
||||||
|
// POSIX says the second argument of iconv has type 'char **', but
|
||||||
|
// some systems have 'const char **'. This class is used to work
|
||||||
|
// around this incompatibility.
|
||||||
|
class sloppy_ptr { |
||||||
|
public: |
||||||
|
explicit sloppy_ptr(const char **ptr): ptr_(ptr) { } |
||||||
|
operator const char **() { return ptr_; } |
||||||
|
operator char **() { return const_cast<char **>(ptr_); } |
||||||
|
private: |
||||||
|
const char **ptr_; |
||||||
|
}; |
||||||
|
|
||||||
|
std::string ascii_job_name(const char *job_name, const char *charset) { |
||||||
|
if (job_name && charset) { |
||||||
|
iconv_t cd = iconv_open("ASCII//TRANSLIT//IGNORE", charset); |
||||||
|
if (cd != (iconv_t) -1) { |
||||||
|
char ascii[80]; |
||||||
|
const char *in_ptr = job_name; |
||||||
|
size_t in_left = strlen(job_name); |
||||||
|
char *out_ptr = ascii; |
||||||
|
size_t out_left = sizeof(ascii) - 1; |
||||||
|
while (in_left > 0) { |
||||||
|
size_t err = iconv(cd, |
||||||
|
sloppy_ptr(&in_ptr), &in_left, |
||||||
|
&out_ptr, &out_left); |
||||||
|
if (err == (size_t) -1) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
*out_ptr = 0; |
||||||
|
iconv_close(cd); |
||||||
|
return ascii; |
||||||
|
} |
||||||
|
} |
||||||
|
return "CUPS"; |
||||||
|
} |
||||||
|
|
||||||
|
page_params build_page_params() { |
||||||
|
static const std::array<std::string, 6> sources = { |
||||||
|
"AUTO", "T1", "T2", "T3", "MP", "MANUAL" |
||||||
|
}; |
||||||
|
static const std::map<std::string, std::string> sizes = { |
||||||
|
{ "A4", "A4" }, |
||||||
|
{ "A5", "A5" }, |
||||||
|
{ "A6", "A6" }, |
||||||
|
{ "B5", "B5" }, |
||||||
|
{ "B6", "B6" }, |
||||||
|
{ "EnvC5", "C5" }, |
||||||
|
{ "EnvMonarch", "MONARCH" }, |
||||||
|
{ "EnvPRC5", "DL" }, |
||||||
|
{ "Executive", "EXECUTIVE" }, |
||||||
|
{ "Legal", "LEGAL" }, |
||||||
|
{ "Letter", "LETTER" } |
||||||
|
}; |
||||||
|
|
||||||
|
page_params p = { }; |
||||||
|
p.resolution = header.HWResolution[0]; |
||||||
|
p.economode = header.cupsInteger[10]; |
||||||
|
p.mediatype = header.MediaType; |
||||||
|
|
||||||
|
if (header.MediaPosition < sources.size()) |
||||||
|
p.sourcetray = sources[header.MediaPosition]; |
||||||
|
else |
||||||
|
p.sourcetray = sources[0]; |
||||||
|
|
||||||
|
auto size_it = sizes.find(header.cupsPageSizeName); |
||||||
|
if (size_it != sizes.end()) |
||||||
|
p.papersize = size_it->second; |
||||||
|
else |
||||||
|
p.papersize = "A4"; |
||||||
|
|
||||||
|
return p; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) { |
||||||
|
fprintf(stderr, "INFO: %s version %s\n", PACKAGE, VERSION); |
||||||
|
|
||||||
|
if (argc != 6 && argc != 7) { |
||||||
|
fprintf(stderr, "ERROR: %s job-id user title copies options [file]\n", argv[0]); |
||||||
|
fprintf(stderr, "INFO: This program is a CUPS filter. It is not intended to be run manually.\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
// const char *job_id = argv[1];
|
||||||
|
// const char *job_user = argv[2];
|
||||||
|
const char *job_name = argv[3]; |
||||||
|
// const int job_copies = atoi(argv[4]);
|
||||||
|
// const char *job_options = argv[5];
|
||||||
|
const char *job_filename = argv[6]; |
||||||
|
const char *job_charset = getenv("CHARSET"); |
||||||
|
|
||||||
|
setlocale(LC_ALL, ""); |
||||||
|
|
||||||
|
signal(SIGTERM, sigterm_handler); |
||||||
|
signal(SIGPIPE, SIG_IGN); |
||||||
|
|
||||||
|
int fd = 0; |
||||||
|
if (job_filename) { |
||||||
|
fd = open(job_filename, O_RDONLY); |
||||||
|
if (fd < 0) { |
||||||
|
fprintf(stderr, "ERROR: Unable to open raster file\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ras = cupsRasterOpen(fd, CUPS_RASTER_READ); |
||||||
|
if (!ras) { |
||||||
|
fprintf(stderr, "ERROR: Can't read raster data\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
int pages = 0; |
||||||
|
{ |
||||||
|
job job(stdout, ascii_job_name(job_name, job_charset)); |
||||||
|
while (!interrupted && cupsRasterReadHeader2(ras, &header)) { |
||||||
|
if (pages == 0) { |
||||||
|
dump_page_header(header); |
||||||
|
} |
||||||
|
job.encode_page(build_page_params(), |
||||||
|
header.NumCopies, |
||||||
|
header.cupsHeight, |
||||||
|
header.cupsBytesPerLine, |
||||||
|
next_line); |
||||||
|
fprintf(stderr, "PAGE: %d %d\n", ++pages, header.NumCopies); |
||||||
|
} |
||||||
|
} |
||||||
|
if (pages == 0) { |
||||||
|
fprintf(stderr, "ERROR: No pages were found."); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
fflush(stdout); |
||||||
|
if (ferror(stdout)) { |
||||||
|
fprintf(stderr, "ERROR: Could not write print data\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
Loading…
Reference in new issue