fl_draw_image() on Mac OS and to a printer requires the image data to be kept until the
page is finished. Thus, we now duplicate this data when the output is a printer, so the caller of the function does not have to take into account this Mac OS specificity. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8349 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
2192b8aed2
commit
45e539fff8
@ -107,13 +107,6 @@ public:
|
||||
/** \brief width, height and name of all elements of the enum \ref Page_Format.
|
||||
*/
|
||||
static const page_format page_formats[NO_PAGE_FORMATS];
|
||||
|
||||
#ifdef __APPLE__
|
||||
struct chain_elt {
|
||||
const uchar *data;
|
||||
struct chain_elt *next;
|
||||
};
|
||||
#endif
|
||||
private:
|
||||
void traverse(Fl_Widget *widget); // finds subwindows of widget and prints them
|
||||
protected:
|
||||
@ -121,11 +114,6 @@ protected:
|
||||
int x_offset;
|
||||
/** \brief vertical offset to the origin of graphics coordinates */
|
||||
int y_offset;
|
||||
#ifdef __APPLE__
|
||||
struct chain_elt *image_list_; // chained list of images used in this page
|
||||
void add_image(const uchar *data); // adds an image to the page image list
|
||||
void delete_image_list(); // deletes the page image list
|
||||
#endif
|
||||
/** \brief The constructor */
|
||||
Fl_Paged_Device() : Fl_Surface_Device(NULL) {class_name( class_id);};
|
||||
/** \brief The destructor */
|
||||
|
@ -141,35 +141,9 @@ void Fl_Paged_Device::print_window_part(Fl_Window *win, int x, int y, int w, int
|
||||
save_front->show();
|
||||
current->set_current();
|
||||
fl_draw_image(image_data, delta_x, delta_y, w, h, 3);
|
||||
#ifdef __APPLE__
|
||||
add_image(image_data);
|
||||
#else
|
||||
delete image_data;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
void Fl_Paged_Device::add_image(const uchar *data)
|
||||
{
|
||||
struct chain_elt *elt = (struct chain_elt *)calloc(sizeof(struct chain_elt), 1);
|
||||
elt->data = data;
|
||||
if (image_list_) { elt->next = image_list_; }
|
||||
image_list_ = elt;
|
||||
}
|
||||
|
||||
void Fl_Paged_Device::delete_image_list()
|
||||
{
|
||||
while(image_list_) {
|
||||
struct chain_elt *next = image_list_->next;
|
||||
if (image_list_->data) delete (uchar*) image_list_->data; // msvc6 compilation fix
|
||||
free(image_list_);
|
||||
image_list_ = next;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
@brief Starts a print job.
|
||||
*
|
||||
|
@ -261,7 +261,6 @@ int Fl_System_Printer::start_page (void)
|
||||
angle = 0;
|
||||
scale_x = scale_y = 1;
|
||||
win_scale_x = win_scale_y = 1;
|
||||
image_list_ = NULL;
|
||||
if(orientation == kPMPortrait)
|
||||
CGContextTranslateCTM(fl_gc, margins.left, margins.bottom + h);
|
||||
else
|
||||
@ -284,7 +283,6 @@ int Fl_System_Printer::end_page (void)
|
||||
CGContextRestoreGState(fl_gc);
|
||||
CGContextRestoreGState(fl_gc);
|
||||
OSStatus status = PMSessionEndPageNoDialog(printSession);
|
||||
delete_image_list();
|
||||
gc = NULL;
|
||||
return status != noErr;
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <config.h>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
#include <FL/Fl_Printer.H>
|
||||
#include <FL/x.H>
|
||||
|
||||
#define MAXBUFFER 0x40000 // 256k
|
||||
@ -39,7 +40,7 @@ static void dataReleaseCB(void *info, const void *data, size_t size)
|
||||
delete[] (uchar *)data;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* draw an image based on the input parameters
|
||||
*
|
||||
* buf: image source data
|
||||
@ -63,10 +64,14 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
|
||||
|
||||
const void *array = buf;
|
||||
uchar *tmpBuf = 0;
|
||||
if (cb) {
|
||||
if (cb || Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id) {
|
||||
tmpBuf = new uchar[ H*W*delta ];
|
||||
for (int i=0; i<H; i++) {
|
||||
cb(userdata, 0, i, W, tmpBuf+i*W*delta);
|
||||
if (cb) {
|
||||
for (int i=0; i<H; i++) {
|
||||
cb(userdata, 0, i, W, tmpBuf+i*W*delta);
|
||||
}
|
||||
} else {
|
||||
memcpy(tmpBuf, buf, H*W*delta);
|
||||
}
|
||||
array = (void*)tmpBuf;
|
||||
linedelta = W*delta;
|
||||
@ -86,7 +91,7 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
|
||||
size_t size
|
||||
);
|
||||
#endif
|
||||
CGDataProviderReleaseDataCallback releaseCB = ( cb ? dataReleaseCB : NULL);
|
||||
CGDataProviderReleaseDataCallback releaseCB = ( tmpBuf ? dataReleaseCB : NULL);
|
||||
CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, linedelta*H, releaseCB);
|
||||
CGImageRef img = CGImageCreate( W, H, 8, 8*delta, linedelta,
|
||||
//lut, delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
|
||||
|
Loading…
Reference in New Issue
Block a user