// // "$Id$" // // MacOS image drawing code for the Fast Light Tool Kit (FLTK). // // Copyright 1998-2005 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library 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 // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // //////////////////////////////////////////////////////////////// #include #include #include #include #define MAXBUFFER 0x40000 // 256k /** * draw an image based on the input parameters * * buf: image source data * X, Y: position (in buffer?!) * W, H: size of picture (in pixel?) * delta: distance from pixel to pixel in buf in bytes * linedelta: distance from line to line in buf in bytes * mono: if set, pixel is one byte - if zero, pixel is 3 byte * cb: callback to copy image data into (RGB?) buffer * buf: pointer to first byte in image source * x, y: position in buffer * w: width (in bytes?) * dst: destination buffer * userdata: ? */ static void innards(const uchar *buf, int X, int Y, int W, int H, int delta, int linedelta, int mono, Fl_Draw_Image_Cb cb, void* userdata) { if (!linedelta) linedelta = W*delta; #ifdef __APPLE_QD__ // theoretically, if the current GPort permits, we could write // directly into it, avoiding the temporary GWorld. For now I // will go the safe way... . char direct = 0; GWorldPtr gw; Rect bounds; bounds.left=0; bounds.right=W; bounds.top=0; bounds.bottom=H; QDErr err = NewGWorld( &gw, 32, &bounds, 0L, 0L, useTempMem ); if (err==noErr && gw) { PixMapHandle pm = GetGWorldPixMap( gw ); if ( pm ) { LockPixels( pm ); if ( *pm ) { uchar *base = (uchar*)GetPixBaseAddr( pm ); if ( base ) { PixMapPtr pmp = *pm; // make absolutely sure that we can use a direct memory write to // create the pixmap! if ( pmp->pixelType == 16 || pmp->pixelSize == 32 || pmp->cmpCount == 3 || pmp->cmpSize == 8 ) { int rowBytes = pmp->rowBytes & 0x3fff; if ( cb ) { uchar *tmpBuf = new uchar[ W*delta ]; if ( mono ) delta -= 1; else delta -= 3; for ( int i=0; i-3),0,0); } void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int x, int y, int w, int h,int d) { innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data); } void fl_draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ innards(buf,x,y,w,h,d,l,1,0,0); } void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int x, int y, int w, int h,int d) { innards(0,x,y,w,h,d,0,1,cb,data); } void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { fl_color(r,g,b); fl_rectf(x,y,w,h); } // // End of "$Id$". //