Re: [Gnome-print] gnome-print-fax
- From: Lauris Kaplinski <lauris ximian com>
- To: Roberto Majadas <phoenix nova es>
- Cc: gnome-print ximian com
- Subject: Re: [Gnome-print] gnome-print-fax
- Date: 16 Feb 2001 06:35:54 +0200
Thank you very much!
This is a thing I have waited to happen! I'll integrate it into codebase as
soon as I am back at office!
What we need next, is the gnome-print frontend for some fax sending programs,
so recipient's number can be speciafied from print dialog.
Lauris Kaplinski
On 15 Feb 2001 04:02:40 +0100, Roberto Majadas wrote:
> Hello gnome-print hackers :
>
> I've was working in a driver for gnome-print . This driver is gnome-print-fax
> .. The funtion of gnome-print-fax is ... all gnome-print can print by printer
> , can send by fax-modem .
>
> This driver take a rgb-buffer a give a g3 file . The output.g3 file can be
> visualited with gimp and viewfax without problems . And i think there aren't
> any problem with mgetty+sendfax because this programs use g3 format .
>
> It've only a developed-problem . This problem is that only acept dpi<=209
> because if this number is bigger than 209 , the page weigth is bigger than
> 1728 , and with g3-format the weigth number must be 1728 (A4 paper) .
>
> If you want to see the driver running , there is a testfax . You must write
> output.g3 and not output.ps :o)
>
> I hope you like it . And if someone have any comments .. mail me ,ok?
>
> regards
>
> Roberto Majadas
>
> --------------Boundary-00=_G43SANLMB8D20DHSNFNY
> ? tests/testfax
> ? tests/output.g3
> Index: libgnomeprint/ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/gnome-print/libgnomeprint/ChangeLog,v
> retrieving revision 1.250
> diff -u -5 -r1.250 ChangeLog
> --- libgnomeprint/ChangeLog 2001/02/13 01:57:18 1.250
> +++ libgnomeprint/ChangeLog 2001/02/15 02:33:37
> @@ -1,5 +1,37 @@
> +2001-02-15 Roberto Majadas <phoenix@nova.es>
> +
> + * gnome-print-private.h: change in gnome_print_context_write_file
> + prototipe const char *buf => const void *buf
> +
> + * gnome-print.c (gnome_print_context_write_file): change
> + const char *buf => const void *buf
> +
> + * gnome-print-fax.c
> + (gnome_print_fax_get_type): new function
> + (gnome_print_fax_new): new function
> + (gnome_print_fax_construct): new function
> + (fax_class_init): new function
> + (fax_close): new function
> + (fax_beginpage): new function
> + (fax_page_begin): new function
> + (fax_page_end): new function
> + (fax_print_band): new function
> + (fax_encode): new function
> + (fax_encode_rules_apply): new function
> + (fax_encode_finish_of_row): new function
> + (fax_ditering): new function
> + (fax_code): new function
> + (fax_code_eof): new function
> + (fax_code_eol): new function
> + (fax_code_write): new function
> +
> + * gnome-print-fax.h
> + * gnomr-print-fax-g3.h
> +
> + * Makefile.am (libgnomeprint_la_SOURCES): add gnome-print-fax(.c,.h,-g3.h)
> +
> 2001-02-12 Thomas Hudson <thudson@gobe.com>
>
> * gnome-print-meta.c (gnome_print_meta_access_buffer): Fixed offset for
> writing size into buffer.
>
> Index: libgnomeprint/Makefile.am
> ===================================================================
> RCS file: /cvs/gnome/gnome-print/libgnomeprint/Makefile.am,v
> retrieving revision 1.45
> diff -u -5 -r1.45 Makefile.am
> --- libgnomeprint/Makefile.am 2000/12/17 20:26:41 1.45
> +++ libgnomeprint/Makefile.am 2001/02/15 02:33:38
> @@ -77,10 +77,13 @@
> gnome-print-dialog.c \
> gnome-print-copies.c \
> gnome-printer.c \
> gnome-printer-private.h \
> gnome-print.c \
> + gnome-print-fax.c \
> + gnome-print-fax.h \
> + gnome-print-fax-g3.h \
> gnome-print-file.c \
> gnome-print-file.h \
> gnome-print-private.h \
> gnome-print-meta.c \
> gnome-print-multipage.c \
> Index: libgnomeprint/gnome-print-fax-g3.h
> ===================================================================
> RCS file: gnome-print-fax-g3.h
> diff -N gnome-print-fax-g3.h
> --- /dev/null Tue May 5 16:32:27 1998
> +++ gnome-print-fax-g3.h Wed Feb 14 21:33:38 2001
> @@ -0,0 +1,221 @@
> +#ifndef __GNOME_PRINT_RGB2FAX_H__
> +#define __GNOME_PRINT_RGB2FAX_H__
> +
> +
> +BEGIN_GNOME_DECLS
> +
> +typedef struct g3table{
> + int code;
> + int length;
> +} g3table;
> +
> +
> +/* Terminating white code table*/
> +
> +struct g3table twtable[] = {
> + { 0x35 , 8 }, /* 0 */
> + { 0x7 , 6 }, /* 1 */
> + { 0x7 , 4 }, /* 2 */
> + { 0x8 , 4 }, /* 3 */
> + { 0xb , 4 }, /* 4 */
> + { 0xc , 4 }, /* 5 */
> + { 0xe , 4 }, /* 6 */
> + { 0xf , 4 }, /* 7 */
> + { 0x13 , 5 }, /* 8 */
> + { 0x14 , 5 }, /* 9 */
> + { 0x7 , 5 }, /* 10 */
> + { 0x8 , 5 }, /* 11 */
> + { 0x8 , 6 }, /* 12 */
> + { 0x3 , 6 }, /* 13 */
> + { 0x34 , 6 }, /* 14 */
> + { 0x35 , 6 }, /* 15 */
> + { 0x2a , 6 }, /* 16 */
> + { 0x2b , 6 }, /* 17 */
> + { 0x27 , 7 }, /* 18 */
> + { 0xc , 7 }, /* 19 */
> + { 0x8 , 7 }, /* 20 */
> + { 0x17 , 7 }, /* 21 */
> + { 0x3 , 7 }, /* 22 */
> + { 0x4 , 7 }, /* 23 */
> + { 0x28 , 7 }, /* 24 */
> + { 0x2b , 7 }, /* 25 */
> + { 0x13 , 7 }, /* 26 */
> + { 0x24 , 7 }, /* 27 */
> + { 0x18 , 7 }, /* 28 */
> + { 0x2 , 8 }, /* 29 */
> + { 0x3 , 8 }, /* 30 */
> + { 0x1a , 8 }, /* 31 */
> + { 0x1b , 8 }, /* 32 */
> + { 0x12 , 8 }, /* 33 */
> + { 0x13 , 8 }, /* 34 */
> + { 0x14 , 8 }, /* 35 */
> + { 0x15 , 8 }, /* 36 */
> + { 0x16 , 8 }, /* 37 */
> + { 0x17 , 8 }, /* 38 */
> + { 0x28 , 8 }, /* 39 */
> + { 0x29 , 8 }, /* 40 */
> + { 0x2a , 8 }, /* 41 */
> + { 0x2b , 8 }, /* 42 */
> + { 0x2c , 8 }, /* 43 */
> + { 0x2d , 8 }, /* 44 */
> + { 0x4 , 8 }, /* 45 */
> + { 0x5 , 8 }, /* 46 */
> + { 0xa , 8 }, /* 47 */
> + { 0xb , 8 }, /* 48 */
> + { 0x52 , 8 }, /* 49 */
> + { 0x53 , 8 }, /* 50 */
> + { 0x54 , 8 }, /* 51 */
> + { 0x55 , 8 }, /* 52 */
> + { 0x24 , 8 }, /* 53 */
> + { 0x25 , 8 }, /* 54 */
> + { 0x58 , 8 }, /* 55 */
> + { 0x59 , 8 }, /* 56 */
> + { 0x5a , 8 }, /* 57 */
> + { 0x5b , 8 }, /* 58 */
> + { 0x4a , 8 }, /* 59 */
> + { 0x4b , 8 }, /* 60 */
> + { 0x32 , 8 }, /* 61 */
> + { 0x33 , 8 }, /* 62 */
> + { 0x34 , 8 }, /* 63 */
> +};
> +
> +/* Make up white code table */
> +
> +struct g3table mwtable[] = {
> + { 0x1b, 5 }, /* 64 */
> + { 0x12, 5 }, /* 128 */
> + { 0x17, 6 }, /* 192 */
> + { 0x37, 7 }, /* 256 */
> + { 0x36, 8 }, /* 320 */
> + { 0x37, 8 }, /* 384 */
> + { 0x64, 8 }, /* 448 */
> + { 0x65, 8 }, /* 512 */
> + { 0x68, 8 }, /* 576 */
> + { 0x67, 8 }, /* 640 */
> + { 0xcc, 9 }, /* 704 */
> + { 0xcd, 9 }, /* 768 */
> + { 0xd2, 9 }, /* 832 */
> + { 0xd3, 9 }, /* 896 */
> + { 0xd4, 9 }, /* 960 */
> + { 0xd5, 9 }, /* 1024 */
> + { 0xd6, 9 }, /* 1088 */
> + { 0xd7, 9 }, /* 1152 */
> + { 0xd8, 9 }, /* 1216 */
> + { 0xd9, 9 }, /* 1280 */
> + { 0xda, 9 }, /* 1344 */
> + { 0xdb, 9 }, /* 1408 */
> + { 0x98, 9 }, /* 1472 */
> + { 0x99, 9 }, /* 1536 */
> + { 0x9a, 9 }, /* 1600 */
> + { 0x18, 6 }, /* 1664 */
> + { 0x9b, 9 }, /* 1728 */
> + };
> +
> +/* terminating white code table */
> +
> +struct g3table tbtable[] = {
> + { 0x37 , 10 }, /* 0 */
> + { 0x2 , 3 }, /* 1 */
> + { 0x3 , 2 }, /* 2 */
> + { 0x2 , 2 }, /* 3 */
> + { 0x3 , 3 }, /* 4 */
> + { 0x3 , 4 }, /* 5 */
> + { 0x2 , 4 }, /* 6 */
> + { 0x3 , 5 }, /* 7 */
> + { 0x5 , 6 }, /* 8 */
> + { 0x4 , 6 }, /* 9 */
> + { 0x4 , 7 }, /* 10 */
> + { 0x5 , 7 }, /* 11 */
> + { 0x7 , 7 }, /* 12 */
> + { 0x4 , 8 }, /* 13 */
> + { 0x7 , 8 }, /* 14 */
> + { 0x18 , 9 }, /* 15 */
> + { 0x17 , 10 }, /* 16 */
> + { 0x18 , 10 }, /* 17 */
> + { 0x8 , 10 }, /* 18 */
> + { 0x67 , 11 }, /* 19 */
> + { 0x68 , 11 }, /* 20 */
> + { 0x6c , 11 }, /* 21 */
> + { 0x37 , 11 }, /* 22 */
> + { 0x28 , 11 }, /* 23 */
> + { 0x17 , 11 }, /* 24 */
> + { 0x18 , 11 }, /* 25 */
> + { 0xca , 12 }, /* 26 */
> + { 0xcb , 12 }, /* 27 */
> + { 0xcc , 12 }, /* 28 */
> + { 0xcd , 12 }, /* 29 */
> + { 0x68 , 12 }, /* 30 */
> + { 0x69 , 12 }, /* 31 */
> + { 0x6a , 12 }, /* 32 */
> + { 0x6b , 12 }, /* 33 */
> + { 0xd2 , 12 }, /* 34 */
> + { 0xd3 , 12 }, /* 35 */
> + { 0xd4 , 12 }, /* 36 */
> + { 0xd5 , 12 }, /* 37 */
> + { 0xd6 , 12 }, /* 38 */
> + { 0xd7 , 12 }, /* 39 */
> + { 0x6c , 12 }, /* 40 */
> + { 0x6d , 12 }, /* 41 */
> + { 0xda , 12 }, /* 42 */
> + { 0xdb , 12 }, /* 43 */
> + { 0x54 , 12 }, /* 44 */
> + { 0x55 , 12 }, /* 45 */
> + { 0x56 , 12 }, /* 46 */
> + { 0x57 , 12 }, /* 47 */
> + { 0x64 , 12 }, /* 48 */
> + { 0x65 , 12 }, /* 49 */
> + { 0x52 , 12 }, /* 50 */
> + { 0x53 , 12 }, /* 51 */
> + { 0x24 , 12 }, /* 52 */
> + { 0x37 , 12 }, /* 53 */
> + { 0x38 , 12 }, /* 54 */
> + { 0x27 , 12 }, /* 55 */
> + { 0x28 , 12 }, /* 56 */
> + { 0x58 , 12 }, /* 57 */
> + { 0x59 , 12 }, /* 58 */
> + { 0x2b , 12 }, /* 59 */
> + { 0x2c , 12 }, /* 60 */
> + { 0x5a , 12 }, /* 61 */
> + { 0x66 , 12 }, /* 62 */
> + { 0x67 , 12 }, /* 63 */
> + };
> +
> +/* Make up black code table */
> +
> +struct g3table mbtable[] = {
> + { 0xf , 10 }, /* 64 */
> + { 0xc8 , 12 }, /* 128 */
> + { 0xc9 , 12 }, /* 192 */
> + { 0x5b , 12 }, /* 256 */
> + { 0x33 , 12 }, /* 320 */
> + { 0x34 , 12 }, /* 384 */
> + { 0x35 , 12 }, /* 448 */
> + { 0x6c , 13 }, /* 512 */
> + { 0x6d , 13 }, /* 576 */
> + { 0x4a , 13 }, /* 640 */
> + { 0x4b , 13 }, /* 704 */
> + { 0x4c , 13 }, /* 768 */
> + { 0x4d , 13 }, /* 832 */
> + { 0x72 , 13 }, /* 896 */
> + { 0x73 , 13 }, /* 960 */
> + { 0x74 , 13 }, /* 1024 */
> + { 0x75 , 13 }, /* 1088 */
> + { 0x76 , 13 }, /* 1152 */
> + { 0x77 , 13 }, /* 1216 */
> + { 0x52 , 13 }, /* 1280 */
> + { 0x53 , 13 }, /* 1344 */
> + { 0x54 , 13 }, /* 1408 */
> + { 0x55 , 13 }, /* 1472 */
> + { 0x5a , 13 }, /* 1536 */
> + { 0x5b , 13 }, /* 1600 */
> + { 0x64 , 13 }, /* 1664 */
> + { 0x65 , 13 }, /* 1728 */
> + };
> +
> +/* End of line code */
> +
> +struct g3table g3eol = {0x1 , 12 };
> +
> +END_GNOME_DECLS
> +
> +#endif /* __GNOME_PRINT_RGB2FAX_H__ */
> Index: libgnomeprint/gnome-print-fax.c
> ===================================================================
> RCS file: gnome-print-fax.c
> diff -N gnome-print-fax.c
> --- /dev/null Tue May 5 16:32:27 1998
> +++ gnome-print-fax.c Wed Feb 14 21:33:39 2001
> @@ -0,0 +1,447 @@
> +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
> +
> +
> +/*
> + * gnome-print-fax.c: A fax driver from buffer rgb to G3 archives
> + *
> + * This implementation uses the GnomePrintRGBP driver.
> + *
> + * Author:
> + * Roberto Majadas "telemaco" <phoenix@nova.es>
> + *
> + * References :
> + *
> + * [1] RFC 804 STANDARDIZATION OF GROUP 3 FACSIMILE APPARATUS FOR DOCUMENT
> + * TRANSMISSION
> + *
> + */
> +
> +
> +#include <config.h>
> +#include <stdio.h>
> +#include <math.h>
> +#include <string.h>
> +#include <libgnomeprint/gnome-printer.h>
> +#include <libgnomeprint/gnome-printer-private.h>
> +#include <libgnomeprint/gnome-print-fax.h>
> +#include <libgnomeprint/gnome-print-fax-g3.h>
> +#include <libgnomeprint/gnome-print-encode.h>
> +#include <libgnomeprint/gnome-print-preview.h>
> +#include <libgnomeprint/gnome-print-preview.h>
> +#include <libgnomeprint/gnome-print-preview-private.h>
> +
> +
> +#define MAX_FAX_COLS 1728 /* 0 to 1728 cols of A4-paper */
> +
> +#define YES_IOL 1
> +#define NO_IOL 0
> +
> +#define YES_LASTCODE 1
> +#define NO_LASTCODE 0
> +
> +#define FAX_BLACK_COLOR 1
> +#define FAX_WHITE_COLOR 0
> +
> +typedef struct _FaxEncodeInfo FaxEncodeInfo ;
> +struct _FaxEncodeInfo{
> +
> + gint run_length ;
> + gint run_length_color ;
> + gint actual_color;
> + gint first_code_of_row ;
> +};
> +
> +/* Gnome-print-fax prototipes */
> +
> +static void fax_encode (GnomePrintContext *pc, FaxEncodeInfo *fei);
> +static void fax_encode_finish_of_row (GnomePrintContext *pc, FaxEncodeInfo *fei,
> + gint cols);
> +static void fax_encode_rules_apply (GnomePrintContext *pc, FaxEncodeInfo *fei);
> +static void fax_code_write (GnomePrintContext *pc, struct g3table node, int lastcode);
> +static void fax_code_eol (GnomePrintContext *pc);
> +static void fax_code_eof (GnomePrintContext *pc);
> +static void fax_code (GnomePrintContext *pc, int run_length, int color, int iol);
> +static int fax_ditering (guchar *rgb_buffer, gint actual_col, gint offset);
> +
> +
> +static GnomePrintRGBPClass *fax_parent_class;
> +
> +static int fax_encode_buffer ;
> +static int fax_encode_buffer_pivot ;
> +static int first_code_of_doc ;
> +
> +
> +
> +/*
> + * fax_code_write : This funtion write in the g3-file the respective code
> + *
> + * struct g3table node : the respective color table
> + * int lastcode : if this code is the last code of the row => YES_LASTCODE
> + * if not => NO_LASTCODE
> + */
> +
> +static void
> +fax_code_write (GnomePrintContext *pc, struct g3table node, int lastcode){
> + int i,j;
> + int pow_of_2[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
> +
> + for (i=node.length; i > 0; ){
> +
> + if (fax_encode_buffer_pivot<0){
> + fax_encode_buffer_pivot = 7 ;
> + gnome_print_context_write_file (pc, &fax_encode_buffer, 1);
> + fax_encode_buffer = 0;
> + }
> + j = node.code&pow_of_2[i-1];
> +
> + if (j!=0){
> + fax_encode_buffer |= pow_of_2[fax_encode_buffer_pivot];
> + }
> + fax_encode_buffer_pivot -= 1;
> + i -= 1;
> + }
> +
> + if (lastcode){
> + gnome_print_context_write_file (pc, &fax_encode_buffer, 1);
> + }
> +}
> +
> +/*
> + * fax_code_eol : this funtion write in the g3-file the EOL code
> + *
> + */
> +
> +static void
> +fax_code_eol (GnomePrintContext *pc)
> +{
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> +}
> +
> +/*
> + * fax_code_eof : this funtion write in the g3-file the EOF code
> + *
> + */
> +
> +static void
> +fax_code_eof (GnomePrintContext *pc)
> +{
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> + fax_code_write (pc, g3eol, NO_LASTCODE);
> + fax_code_write (pc, g3eol, YES_LASTCODE);
> +}
> +
> +/*
> + * fax_code : this funtion recive a run_length and the color of this
> + * run_length . And this funtion write the respective code
> + *
> + */
> +
> +static void
> +fax_code (GnomePrintContext *pc, int run_length, int color, int iol)
> +{
> +
> + if (run_length < 64)
> + {
> + if ( color == FAX_BLACK_COLOR )
> + {
> + if (iol == YES_IOL)
> + {
> + fax_code_write (pc, twtable[0], NO_LASTCODE);
> + fax_code_write (pc, tbtable[run_length], NO_LASTCODE);
> + }
> + else
> + {
> + fax_code_write (pc, tbtable[run_length], NO_LASTCODE);
> + }
> + }
> + else
> + {
> + fax_code_write (pc, twtable[run_length], NO_LASTCODE);
> + }
> + }
> + else if (run_length <= 1728)
> + {
> + int x,y ;
> +
> + x = run_length / 64 ;
> + y = run_length % 64 ;
> +
> + if ( color == FAX_BLACK_COLOR )
> + {
> + if (iol == YES_IOL)
> + {
> + fax_code_write (pc, twtable[0], NO_LASTCODE);
> + fax_code_write (pc, mbtable[x-1], NO_LASTCODE);
> + fax_code_write (pc, tbtable[y], NO_LASTCODE);
> + }
> + else
> + {
> + fax_code_write (pc, mbtable[x-1], NO_LASTCODE);
> + fax_code_write (pc, tbtable[y], NO_LASTCODE);
> + }
> + }
> + else
> + {
> + fax_code_write (pc, mwtable[x-1], NO_LASTCODE);
> + fax_code_write (pc, twtable[y], NO_LASTCODE);
> + }
> + }
> +}
> +
> +/*
> + * fax_ditering : this function decide if a white or black pixel
> + *
> + */
> +
> +
> +static int
> +fax_ditering (guchar *rgb_buffer, gint actual_col, gint offset)
> +{
> + gint j = actual_col ;
> +
> + if ( rgb_buffer [offset+j] + rgb_buffer [offset+j+1] + rgb_buffer [offset+j+2] < (200*3) )
> + {
> + return FAX_BLACK_COLOR ;
> + }
> + else
> + {
> + return FAX_WHITE_COLOR ;
> + }
> +
> +}
> +
> +/*
> + * fax_encode_rules_apply : this funtion apply de rules for encode to g3
> + *
> + */
> +
> +static void
> +fax_encode_rules_apply (GnomePrintContext *pc, FaxEncodeInfo *fei)
> +{
> + if (fei->first_code_of_row == TRUE)
> + {
> + fei->first_code_of_row = FALSE;
> + fax_code (pc, fei->run_length, fei->run_length_color, YES_IOL);
> + }
> + else
> + {
> + fax_code (pc, fei->run_length, fei->run_length_color, NO_IOL);
> + }
> +}
> +
> +/*
> + * fax_encode_finish_of_row : finaliza la linea y rellena de blancos si es
> + * necesario
> + *
> + */
> +
> +static void
> +fax_encode_finish_of_row (GnomePrintContext *pc, FaxEncodeInfo *fei, gint cols)
> +{
> + if (fei->actual_color == FAX_WHITE_COLOR)
> + {
> + fei->run_length += MAX_FAX_COLS - cols ;
> + fax_encode_rules_apply (pc, fei);
> +
> + }
> + else
> + {
> + fax_encode_rules_apply (pc, fei);
> + if (cols<MAX_FAX_COLS)
> + fax_code (pc, MAX_FAX_COLS-cols, FAX_WHITE_COLOR, NO_IOL);
> +
> + }
> +
> +}
> +
> +/*
> + * fax_encode : proceso de coificacion de la linea
> + *
> + */
> +
> +static void
> +fax_encode (GnomePrintContext *pc, FaxEncodeInfo *fei)
> +{
> +
> + if (fei->run_length_color == fei->actual_color)
> + {
> + (fei->run_length)++;
> +
> + }
> + else
> + {
> + fax_encode_rules_apply (pc, fei);
> + fei->run_length_color = !fei->run_length_color ;
> + fei->run_length = 1 ;
> + }
> +}
> +
> +static int
> +fax_print_band (GnomePrintRGBP *rgbp, guchar *rgb_buffer, ArtIRect *rect)
> +{
> + GnomePrintContext *pc = GNOME_PRINT_CONTEXT (rgbp);
> + gint rows, actual_row, cols, actual_col, offset;
> +
> + FaxEncodeInfo *fei ;
> +
> + fei = g_new0 (FaxEncodeInfo, 1);
> +
> + rows = rect->y1 - rect->y0;
> + cols = rect->x1 - rect->x0;
> +
> + g_return_val_if_fail (cols <= MAX_FAX_COLS, -1);
> +
> + if (first_code_of_doc == TRUE)
> + {
> + fax_code_eol (pc) ;
> + first_code_of_doc = FALSE ;
> + }
> +
> + for (actual_row=0; actual_row<rows; actual_row++)
> + {
> +
> + actual_col = 0 ;
> + offset = actual_row * cols * 3 ;
> +
> + fei->actual_color = fax_ditering (rgb_buffer, actual_col, offset) ;
> + fei->run_length_color = fei->actual_color ;
> + fei->run_length = 1;
> + fei->first_code_of_row = TRUE ;
> +
> + for (actual_col=1; actual_col<cols; actual_col++)
> + {
> + fei->actual_color = fax_ditering (rgb_buffer, actual_col, offset) ;
> + fax_encode (pc, fei);
> + }
> +
> + fax_encode_finish_of_row (pc, fei, cols);
> +
> + fax_code_eol (pc) ;
> + }
> +
> + g_free (fei);
> +
> + return 1;
> +}
> +
> +
> +static int
> +fax_page_end (GnomePrintRGBP *rgbp)
> +{
> + GnomePrintContext *pc;
> +
> + g_return_val_if_fail (GNOME_IS_PRINT_RGBP (rgbp), -1);
> + pc = GNOME_PRINT_CONTEXT (rgbp);
> + g_return_val_if_fail (GNOME_IS_PRINT_CONTEXT (pc), -1);
> +
> + return 0;
> +}
> +
> +#ifdef KILL_COMPILE_WARNING
> +static int
> +fax_page_begin (GnomePrintContext *pc)
> +{
> + g_print ("Page begin\n");
> + return 0;
> +}
> +#endif
> +
> +static int
> +fax_beginpage (GnomePrintContext *pc, const char *name_of_this_page)
> +{
> + /* Nothing. */
> + return 0;
> +}
> +
> +static int
> +fax_close (GnomePrintContext *pc)
> +{
> + fax_code_eof (pc);
> + return gnome_print_context_close_file (pc);
> +}
> +
> +static void
> +fax_class_init (GtkObjectClass *object_class)
> +{
> + GnomePrintRGBPClass *rgbp_class = (GnomePrintRGBPClass *) object_class;
> + GnomePrintContextClass *pc_class = (GnomePrintContextClass *) object_class;
> +
> + fax_parent_class = gtk_type_class (gnome_print_rgbp_get_type ());
> +
> + rgbp_class->print_band = fax_print_band;
> + rgbp_class->page_end = fax_page_end;
> +
> +
> + pc_class->close = fax_close;
> + pc_class->beginpage = fax_beginpage;
> +
> +}
> +
> +GnomePrintFAX *
> +gnome_print_fax_construct (GnomePrintFAX *fax, GnomePrinter *printer, const GnomePaper *paper_info, int dpi)
> +{
> + g_return_val_if_fail (printer != NULL, NULL);
> + g_return_val_if_fail (GNOME_IS_PRINTER (printer), NULL);
> + g_return_val_if_fail (fax != NULL, NULL);
> + g_return_val_if_fail (GNOME_IS_PRINT_FAX (fax), NULL);
> + g_return_val_if_fail (paper_info != NULL, NULL);
> + g_return_val_if_fail (dpi >= 0, NULL);
> +
> + fax_encode_buffer_pivot = 7;
> + first_code_of_doc = TRUE ;
> +
> + if (gnome_print_rgbp_construct (GNOME_PRINT_RGBP (fax), paper_info, dpi)){
> + gnome_print_context_open_file (GNOME_PRINT_CONTEXT (fax), printer->filename);
> + return fax;
> + } else
> + return NULL;
> +}
> +
> +GnomePrintContext *
> +gnome_print_fax_new (GnomePrinter *printer, const char *paper_size, int dpi)
> +{
> + GnomePrintFAX *fax;
> + const GnomePaper *paper_info;
> +
> + g_return_val_if_fail (printer != NULL, NULL);
> + g_return_val_if_fail (GNOME_IS_PRINTER (printer), NULL);
> + g_return_val_if_fail (paper_size != NULL, NULL);
> + g_return_val_if_fail (dpi >= 0, NULL);
> +
> + fax = gtk_type_new (gnome_print_fax_get_type ());
> +
> + paper_info = gnome_paper_with_name (paper_size);
> + if (paper_info == NULL)
> + g_return_val_if_fail (FALSE, NULL);
> +
> + if (!gnome_print_fax_construct (fax, printer, paper_info, dpi))
> + gtk_object_unref (GTK_OBJECT (fax));
> +
> + return GNOME_PRINT_CONTEXT (fax);
> +}
> +
> +GtkType
> +gnome_print_fax_get_type (void)
> +{
> + static GtkType type = 0;
> +
> + if (!type){
> + GtkTypeInfo info = {
> + "GnomePrintFAX",
> + sizeof (GnomePrintFAX),
> + sizeof (GnomePrintFAXClass),
> + (GtkClassInitFunc) fax_class_init,
> + (GtkObjectInitFunc) NULL,
> + /* reserved_1 */ NULL,
> + /* reserved_2 */ NULL,
> + (GtkClassInitFunc) NULL,
> + };
> +
> + type = gtk_type_unique (gnome_print_rgbp_get_type (), &info);
> + }
> +
> + return type;
> +}
> Index: libgnomeprint/gnome-print-fax.h
> ===================================================================
> RCS file: gnome-print-fax.h
> diff -N gnome-print-fax.h
> --- /dev/null Tue May 5 16:32:27 1998
> +++ gnome-print-fax.h Wed Feb 14 21:33:39 2001
> @@ -0,0 +1,47 @@
> +#ifndef __GNOME_PRINT_FAX_H__
> +#define __GNOME_PRINT_FAX_H__
> +
> +#include <libgnome/gnome-defs.h>
> +#include <libgnome/gnome-paper.h>
> +#include <libgnomeui/gnome-canvas.h>
> +#include <libgnomeprint/gnome-print.h>
> +#include <libgnomeprint/gnome-print-rgbp.h>
> +
> +BEGIN_GNOME_DECLS
> +
> +/*
> + * GnomePrintPixbuf printer context.
> + */
> +#define GNOME_TYPE_PRINT_FAX (gnome_print_fax_get_type ())
> +#define GNOME_PRINT_FAX(obj) (GTK_CHECK_CAST ((obj), GNOME_TYPE_PRINT_FAX, GnomePrintFAX))
> +#define GNOME_PRINT_FAX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GNOME_TYPE_PRINT_FAX, GnomePrintFAXClass))
> +#define GNOME_IS_PRINT_FAX(obj) (GTK_CHECK_TYPE ((obj), GNOME_TYPE_PRINT_FAX))
> +#define GNOME_IS_PRINT_FAX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_PRINT_FAX))
> +
> +typedef struct _GnomePrintFAX GnomePrintFAX;
> +typedef struct _GnomePrintFAXPrivate GnomePrintFAXPrivate;
> +typedef struct _GnomePrintFAXClass GnomePrintFAXClass;
> +
> +struct _GnomePrintFAX {
> + GnomePrintRGBP rgbp;
> +
> + GnomePrintFAXPrivate *priv;
> +};
> +
> +struct _GnomePrintFAXClass {
> + GnomePrintRGBPClass parent_class;
> +};
> +
> +GtkType gnome_print_fax_get_type (void);
> +GnomePrintContext *gnome_print_fax_new (GnomePrinter *printer,
> + const char *paper_size,
> + int dpi);
> +GnomePrintFAX *gnome_print_fax_construct (GnomePrintFAX *fax,
> + GnomePrinter *printer,
> + const GnomePaper *paper_info,
> + int dpi);
> +
> +END_GNOME_DECLS
> +
> +#endif /* __GNOME_PRINT_PCLR_H__ */
> +
> Index: libgnomeprint/gnome-print-private.h
> ===================================================================
> RCS file: /cvs/gnome/gnome-print/libgnomeprint/gnome-print-private.h,v
> retrieving revision 1.6
> diff -u -5 -r1.6 gnome-print-private.h
> --- libgnomeprint/gnome-print-private.h 2000/09/24 16:14:23 1.6
> +++ libgnomeprint/gnome-print-private.h 2001/02/15 02:33:39
> @@ -101,11 +101,11 @@
>
> /* These are functions for writing bytes to the printer - generally to a
> file or piped to lpr. */
>
> int gnome_print_context_open_file (GnomePrintContext *pc, const char *filename);
> -int gnome_print_context_write_file (GnomePrintContext *pc, const char *buf, size_t size);
> +int gnome_print_context_write_file (GnomePrintContext *pc, const void *buf, size_t size);
> int gnome_print_context_fprintf (GnomePrintContext *pc, const char *fmt, ...);
> int gnome_print_context_close_file (GnomePrintContext *pc);
>
> END_GNOME_DECLS
>
> Index: libgnomeprint/gnome-print.c
> ===================================================================
> RCS file: /cvs/gnome/gnome-print/libgnomeprint/gnome-print.c,v
> retrieving revision 1.62
> diff -u -5 -r1.62 gnome-print.c
> --- libgnomeprint/gnome-print.c 2000/12/18 21:38:50 1.62
> +++ libgnomeprint/gnome-print.c 2001/02/15 02:33:41
> @@ -895,11 +895,11 @@
> return pc->f != NULL;
> }
>
> /* Return number of bytes written */
> int
> -gnome_print_context_write_file (GnomePrintContext *pc, const char *buf, size_t size)
> +gnome_print_context_write_file (GnomePrintContext *pc, const void *buf, size_t size)
> {
> g_return_val_if_fail (pc != NULL, 0);
> g_return_val_if_fail (GNOME_IS_PRINT_CONTEXT (pc), 0);
> g_return_val_if_fail (pc->f != NULL, 0);
>
> Index: tests/Makefile.am
> ===================================================================
> RCS file: /cvs/gnome/gnome-print/tests/Makefile.am,v
> retrieving revision 1.9
> diff -u -5 -r1.9 Makefile.am
> --- tests/Makefile.am 2000/11/26 05:19:45 1.9
> +++ tests/Makefile.am 2001/02/15 02:33:42
> @@ -3,10 +3,11 @@
> testprint2 \
> testprint3 \
> testprint4 \
> testprint5 \
> testprint6 \
> + testfax \
> testpdf \
> testmetrics\
> testembed \
> testzip
>
> @@ -72,10 +73,16 @@
>
> testprint6_SOURCES = testprint6.c
> testprint6_LDFLAGS =
> testprint6_DEPENDENCIES = $(DEPS)
> testprint6_LDADD = \
> + $(print_libs)
> +
> +testfax_SOURCES = testfax.c
> +testfax_LDFLAGS =
> +testfax_DEPENDENCIES = $(DEPS)
> +testfax_LDADD = \
> $(print_libs)
>
> testpdf_SOURCES = testpdf.c
> testpdf_LDFLAGS =
> testpdf_DEPENDENCIES = $(DEPS)
> Index: tests/testfax.c
> ===================================================================
> RCS file: testfax.c
> diff -N testfax.c
> --- /dev/null Tue May 5 16:32:27 1998
> +++ testfax.c Wed Feb 14 21:33:42 2001
> @@ -0,0 +1,162 @@
> +#include <config.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <gnome.h>
> +
> +#include <libgnomeprint/gnome-printer.h>
> +#include <libgnomeprint/gnome-print.h>
> +#include <libgnomeprint/gnome-print-meta.h>
> +#include <libgnomeprint/gnome-print-preview.h>
> +#include <libgnomeprint/gnome-print-pixbuf.h>
> +#include <libgnomeprint/gnome-print-fax.h>
> +#include <libgnomeprint/gnome-print-rgbp.h>
> +#include <libgnomeprint/gnome-font.h>
> +#include <libgnomeprint/gnome-printer-dialog.h>
> +
> +#define _GNOME_PRINT_FAX_CLEAR_TEST_NOT
> +
> +static int do_preview;
> +static int do_rgb_dump;
> +static int dpi = 209;
> +
> +static struct poptOption options [] = {
> + { "preview", 0, POPT_ARG_NONE, &do_preview },
> + { "dump", 0, POPT_ARG_NONE, &do_rgb_dump },
> + { "dpi", 0, POPT_ARG_INT, &dpi },
> + { NULL }
> +};
> +
> +
> +
> +static void
> +print_test_page (GnomePrintContext *pc)
> +{
> + GnomeFont *font;
> + int i;
> +
> +
> + font = gnome_font_new ("Courier", 14);
> + gnome_print_setfont (pc, font);
> +
> +#ifdef _GNOME_PRINT_FAX_CLEAR_TEST_NOT
> + for (i = 0; i < 300; i += 50){
> + char buf [40];
> +
> + gnome_print_setrgbcolor (pc, 0.3, 0.4, 0.5);
> +
> + gnome_print_moveto (pc, 0, i);
> + gnome_print_lineto (pc, 400, i);
> + gnome_print_stroke (pc);
> +
> + gnome_print_setrgbcolor (pc, 0.3, 0.4, 0.5);
> +
> + sprintf (buf, "%d", i);
> + gnome_print_moveto (pc, 10, i + 3);
> + gnome_print_show (pc, buf);
> + }
> +
> + gnome_print_setrgbcolor (pc, 0, 0, 0);
> +
> + font = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 1, 10);
> +
> + gnome_print_setfont (pc, font);
> +
> + gnome_print_moveto (pc, 5, 600);
> + gnome_print_show (pc, "En un lugar de la mancha de cuyo nombre no quiero acordarme");
> +
> +#endif
> +
> + gnome_print_showpage (pc);
> + gnome_print_context_close (pc);
> +
> +}
> +
> +static void
> +show_pixbuf (GnomePrintPixbuf * gpb, GdkPixbuf * pb, gint pagenum, gpointer data)
> +{
> + int fh;
> + gint y, w, h, rs;
> + guchar * px, * p;
> +
> + g_print ("Showpixbuf called :)\n");
> +
> + w = gdk_pixbuf_get_width (pb);
> + h = gdk_pixbuf_get_height (pb);
> + rs = gdk_pixbuf_get_rowstride (pb);
> + px = gdk_pixbuf_get_pixels (pb);
> +
> + fh = creat ("output.dump", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
> + g_return_if_fail (fh >= 0);
> +
> + for (y = 0; y < h; y++) {
> + p = px + y * rs;
> + write (fh, p, w * 4);
> + }
> +
> + close (fh);
> +}
> +
> +static void
> +test_fax (void)
> +{
> + GnomePrinter *printer;
> + GnomePrintContext *pc;
> + GtkWidget *toplevel, *canvas, *sw;
> +
> + if (do_preview){
> + gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
> + gtk_widget_set_default_visual (gdk_rgb_get_visual ());
> +
> + toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
> + gtk_widget_set_usize (toplevel, 700, 700);
> + sw = gtk_scrolled_window_new (NULL, NULL);
> + canvas = gnome_canvas_new_aa ();
> + gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (canvas), dpi);
> + gtk_container_add (GTK_CONTAINER (toplevel), sw);
> + gtk_container_add (GTK_CONTAINER (sw), canvas);
> +
> + pc = gnome_print_preview_new (GNOME_CANVAS(canvas), "US-Letter");
> +
> + gtk_widget_show_all (toplevel);
> + } else {
> + if (do_rgb_dump) {
> + const GnomePaper * gp;
> + gdouble w, h;
> +
> + gp = gnome_paper_with_name ("US-Letter");
> + w = gnome_paper_pswidth (gp);
> + h = gnome_paper_psheight (gp);
> +
> + pc = gnome_print_pixbuf_new (0.0, 0.0, w, h,
> + dpi, dpi, TRUE);
> +
> + gtk_signal_connect (GTK_OBJECT (pc), "showpixbuf",
> + GTK_SIGNAL_FUNC (show_pixbuf), NULL);
> +
> + } else {
> + printer = gnome_printer_dialog_new_modal ();
> +
> + if (!printer)
> + return;
> +
> + g_print ("Estoy donde el fax\n");
> + pc = gnome_print_fax_new (printer, "A4", dpi);
> +
> + }
> + }
> +
> + print_test_page (pc);
> +}
> +
> +int
> +main (int argc, char **argv)
> +{
> + gnome_init_with_popt_table ("TestPrint", VERSION, argc, argv, options, 0, NULL);
> +
> + test_fax ();
> +
> + if (do_preview)
> + gtk_main ();
> +
> + return 0;
> +}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]