> > Well, FWIW, I'd still go with using Fl_Preferences to get the
> > persistence - it produces human readable output and is already part
> > of fltk, rather than adding boost (which I had a lot of trouble with
> > in the early days, so I'm wary of it now - although I accept that it
> > probably an awful lot better now!)
> >
> > --
> > Ian
> >
>
> Do you think that from preferences you can store the object, it seems
> difficult, preferences are properties for the object, but what about the
> positions in caneva??
> Would you please explain your idea?
> thanks
>
sorry for my english,
I post you a little app showing how to save 24 bits/pixel (RGB - 16.7 million
colors) bmp images.
not sure that subclass of Fl_Box and my draw() and handle() methods are bugfree.
make a selection rect and then press "save"
here is fluid file:
*****************************************
# data file for the Fltk User Interface Designer (fluid)
version 1.0106
header_name {.h}
code_name {.cxx}
decl {\#include <stdio.h>} {public
}
decl {\#include <stdlib.h>} {public
}
decl {\#include <FL/fl_draw.H>} {public
}
decl {\#include <FL/Fl_Widget.H>} {public
}
decl {\#include <FL/Fl_Box.H>} {public
}
decl {\#include "bmppix.h"} {public
}
decl {BMPhf hf_bmp;} {public
}
decl {BMPhi hi_bmp;} {public
}
decl {mRGB myRGB;} {public
}
decl {FILE *outbmp;} {public
}
decl {int cnt;} {public
}
decl {unsigned char pixRGB[3];} {public
}
decl {int ev_p_x;} {public
}
decl {int ev_p_y;} {public
}
decl {int ev_r_x;} {public
}
decl {int ev_r_y;} {public
}
decl {int ev_w;} {public
}
decl {int ev_h;} {public
}
decl {int ev_w3;} {public
}
decl {int clr_ovr;} {public
}
class Mydrwbox {open : {public Fl_Box}
} {
Function {draw()} {open private return_type void
} {
code {fl_overlay_clear();
fl_push_clip(this->x(), this->y(), this->w(), this->h());
fl_draw_box(FL_FLAT_BOX, this->x(), this->y(), this->w(), this->h(),
(Fl_Color)53);
//....
fl_line_style(FL_SOLID,5);
fl_color(180,180,180);
fl_line(this->w()/2+this->x(),this->y(),this->w()/2+this->x(),this->h()+this->y());
fl_color(220,80,80);
fl_line(this->x(),this->h()/2+this->y(),this->w()+this->x(),this->h()/2+this->y());
fl_pop_clip();} {}
}
Function {handle(int e)} {open private return_type int
} {
code {int ret = Fl_Box::handle(e);
switch(e)
{
case FL_PUSH:
ev_p_x=Fl::event_x(); ev_p_y=Fl::event_y();
/* fl_read_image(pixRGB, ev_p_x, ev_p_y, 1, 1, 0);
printf("RGB: %u %u %u\\n",pixRGB[0],pixRGB[1],pixRGB[2]); */
return(1);
case FL_RELEASE:
ev_r_x=Fl::event_x(); ev_r_y=Fl::event_y();
return(1);
case FL_DRAG:
ev_w=Fl::event_x()-ev_p_x;
ev_h=Fl::event_y()-ev_p_y;
mybox->window()->make_current();
fl_overlay_rect(ev_p_x, ev_p_y, ev_w, ev_h);
return(1);
}
return(ret);} {}
}
Function {redraw()} {return_type void
} {
code {this->draw();} {}
}
decl {public: Mydrwbox(int x,int y,int w,int h):Fl_Box(x,y,w,h) {}} {public
}
}
Function {} {} {
code {clr_ovr=0;
cnt=0;} {}
Fl_Window myw {
xywh {454 389 520 325} type Double visible
} {
Fl_Box mybox {
xywh {5 5 510 165} labeltype NO_LABEL when 0
class Mydrwbox
}
Fl_Button quitbut {
label Quit
callback {quitbut_cb()}
xywh {365 280 115 25}
}
Fl_Button sv {
label save
callback {sv_cb()}
xywh {40 280 115 25}
}
}
}
Function {quitbut_cb()} {return_type void
} {
code {exit(0);} {}
}
Function {sv_cb()} {open return_type void
} {
code {int njunkb=0;
int cnt1=0;
unsigned char *pnt;
unsigned char *pn2;
unsigned char padd;
div_t result;
myw->damage(1);myw->redraw();
mybox->damage(1); mybox->redraw();fl_overlay_clear();
mybox->window()->make_current();
mybox->damage(1); mybox->redraw(); /* 2 redraw , Double_Window (maybe
fl_read_image reads the buffer before) */
/*printf("ev_p_x: %d ev_p_y: %d ev_w: %d ev_h: %d\\n", ev_p_x, ev_p_y,
ev_w, ev_h);*/
if (ev_w<0) { ev_p_x=ev_r_x; ev_w=ev_w*(-1); }
if (ev_h<0) { ev_p_y=ev_r_y; ev_h=ev_h*(-1); }
ev_w3=ev_w*3; padd=0;
result = div (ev_w3,4);
njunkb = 4 - result.rem;
if(njunkb == 4) njunkb = 0;
/*printf("ev_p_x: %d ev_p_y: %d ev_w: %d ev_h: %d njunkb: %d\\n",
ev_p_x, ev_p_y, ev_w, ev_h, njunkb);*/
pnt = (unsigned char *) malloc ((ev_w3 * ev_h)+1);
if (pnt == 0){printf("no enougth memory\\n"); exit(1);}
fl_read_image(pnt, ev_p_x, ev_p_y, ev_w, ev_h, 0);
hf_bmp.bfType='MB';
hf_bmp.bfRes1=0; hf_bmp.bfRes2=0;
hf_bmp.bfOffBits=54;
hi_bmp.biSize=40;
hi_bmp.biWidth=ev_w;
hi_bmp.biHeight=ev_h;
hi_bmp.biPlanes=1;
hi_bmp.biBitCount=24;
hi_bmp.biCompression=0;
hi_bmp.biSizeImage=((ev_w * ev_h * 3) + (njunkb * ev_h));
hi_bmp.biXPixPerMeter=0;
hi_bmp.biYPixPerMeter=0;
hi_bmp.biClrUsed=0;
hi_bmp.biClrImportant=0;
hf_bmp.bfSize=54 + hi_bmp.biSizeImage;
if((outbmp = fopen("out.bmp","wb")) == NULL){
printf("Errore in apertura file di out\\n\\n"); }
fwrite (&hf_bmp.bfType, 2, 1, outbmp);
fwrite (&hf_bmp.bfSize, 4, 1, outbmp); /* printf("hf_bmp.bfSize:
%u\\n",hf_bmp.bfSize); */
fwrite (&hf_bmp.bfRes1, 2, 1, outbmp);
fwrite (&hf_bmp.bfRes2, 2, 1, outbmp);
fwrite (&hf_bmp.bfOffBits, 4, 1, outbmp);
fwrite (&hi_bmp.biSize, 4, 1, outbmp);
fwrite (&hi_bmp.biWidth, 4, 1, outbmp);
fwrite (&hi_bmp.biHeight, 4, 1, outbmp);
fwrite (&hi_bmp.biPlanes, 2, 1, outbmp);
fwrite (&hi_bmp.biBitCount, 2, 1, outbmp);
fwrite (&hi_bmp.biCompression, 4, 1, outbmp);
fwrite (&hi_bmp.biSizeImage, 4, 1, outbmp);
fwrite (&hi_bmp.biXPixPerMeter, 4, 1, outbmp);
fwrite (&hi_bmp.biYPixPerMeter, 4, 1, outbmp);
fwrite (&hi_bmp.biClrUsed, 4, 1, outbmp);
fwrite (&hi_bmp.biClrImportant, 4, 1, outbmp);
for(cnt=1;cnt<=ev_h;cnt++)
{
pn2=pnt+(ev_w3*(ev_h-cnt));
for(cnt1=0;cnt1<ev_w3;cnt1=cnt1+3)
{
fwrite ((pn2+cnt1+2),1,1,outbmp);
fwrite ((pn2+cnt1+1),1,1,outbmp);
fwrite ((pn2+cnt1),1,1,outbmp);
}
for(cnt1=0;cnt1<njunkb;cnt1++)
fwrite (&padd, 1, 1, outbmp);
}
free(pnt);
fclose(outbmp);} {selected
}
}
*****************************************
and here is bmppix.h:
*****************************************
/* bmppix.h */
typedef struct // 14 bytes
{
unsigned short bfType; // 2 BM
unsigned bfSize; // 4 size of the bitmap file
unsigned short bfRes1; // 2 not used
unsigned short bfRes2; // 2 not used
unsigned bfOffBits; // 4 number of bytes from the
// beginning of the file to
// the starting Pix Data byte
} BMPhf;
typedef struct // 40 bytes
{
unsigned biSize; // 4 size of the Head Info in bytes
unsigned biWidth; // 4 width in pixels
unsigned biHeight; // 4 height in pixels
unsigned short biPlanes; // 2 number of planes (must set to 1)
unsigned short biBitCount; // 2 bits per pixel
// 1: (black/white). In 1-bit mode the color table
// has to contain 2 entries (usually white and
black).
// If a bit in the image data is clear, it points
to
// the first palette entry.
// If the bit is set, it points to the second.
// 4: (16 colors). In 4-bit mode the color table
must contain
// 16 colors. Every byte in the image data
represents two pixels.
// The byte is split into the higher 4 bits and
the lower 4 bits
// and each value of them points to a palette
entry.
// 8: (256 colors). In 8-bit mode every byte
represents a pixel.
// The value points to an entry in the color
table which contains
// 256 entries
// 24: (16.7 million colors). Three bytes
represent one pixel.
// The first byte represents the red part,
// the second the green and the third the blue
part.
// There is no need for a palette because every
pixel
// contains a literal RGB-value, so the palette
is omitted.
unsigned biCompression; // 4 0 for uncompressed images
unsigned biSizeImage; // 4 length of the bitmap image data in bytes
unsigned biXPixPerMeter; // 4 pixels per meter (usually set to 0)
unsigned biYPixPerMeter; // 4 pixels per meter (usually set to 0)
unsigned biClrUsed; // 4 number of colors
unsigned biClrImportant;// 4 number of significant colors
} BMPhi;
typedef struct
{
unsigned char mred;
unsigned char mgre;
unsigned char mblu;
} mRGB;
*****************************************
I hope this can help You
bye.
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk