/* BeOS_print.cpp */ /* printing support for Tux Paint */ /* Marcin 'Shard' Konicki */ /* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (See COPYING.txt) */ /* Jan. 17, 2003 - March 18, 2023 */ #include "BeOS_print.h" #include "Bitmap.h" #include "Messenger.h" #include "PrintJob.h" #include "Window.h" #include "View.h" #include "dirent.h" #include "string.h" class PrintView:public BView { public: PrintView(BBitmap * bitmap):BView(bitmap->Bounds(), "TuxPaint Print", B_FOLLOW_NONE, B_WILL_DRAW) { b = bitmap; }; ~PrintView() { delete b; }; void Draw(BRect updateRect) { DrawBitmap(b); } private: BBitmap * b; }; BBitmap *SurfaceToBBitmap(SDL_Surface * surf) { BBitmap *bitmap = new BBitmap(BRect(0, 0, surf->w, surf->h), B_RGBA32); SDL_PixelFormat pixfmt; SDL_Surface *surf32; Uint8 *src, *dst; Uint32 linesize; int i; memset(&pixfmt, 0, sizeof(pixfmt)); pixfmt.palette = NULL; pixfmt.BitsPerPixel = 32; pixfmt.BytesPerPixel = 4; pixfmt.Rmask = 0x00FF0000; pixfmt.Gmask = 0x0000FF00; pixfmt.Bmask = 0x000000FF; pixfmt.Amask = 0xFF000000; pixfmt.Rshift = 16; pixfmt.Gshift = 8; pixfmt.Bshift = 0; pixfmt.Ashift = 24; pixfmt.Rloss = 0; pixfmt.Gloss = 0; pixfmt.Bloss = 0; pixfmt.Aloss = 0; surf32 = SDL_ConvertSurface(surf, &pixfmt, SDL_SWSURFACE); linesize = surf32->w * sizeof(Uint32); dst = (Uint8 *) bitmap->Bits(); src = (Uint8 *) surf32->pixels; for (i = 0; i < surf32->h; i++) { memcpy(dst, src, linesize); src += surf32->pitch - 4; dst += linesize; } SDL_FreeSurface(surf32); /* Free temp surface */ return bitmap; } int IsPrinterAvailable(void) { // this code is a little hack, i don't like such hardcoded things // but i have no choice ;] DIR *d; struct dirent *f = NULL; int num_files = 0; d = opendir("/boot/home/config/settings/printers"); if (d != NULL) { while ((f = readdir(d)) != NULL) num_files++; closedir(d); if (num_files > 2) return 1; } return 0; } int SurfacePrint(SDL_Surface * surf) { BWindow *window = new BWindow(BRect(0, 0, surf->w, surf->h), "TuxPaint Print", B_NO_BORDER_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_NOT_MOVABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_AVOID_FRONT | B_AVOID_FOCUS); PrintView *view = new PrintView(SurfaceToBBitmap(surf)); window->AddChild(view); window->Run(); BPrintJob job("TuxPaint"); if (job.ConfigPage() == B_OK) { if (job.ConfigJob() == B_OK) { job.BeginJob(); if (job.CanContinue()) { job.DrawView(view, BRect(0, 0, surf->w, surf->h), BPoint(0, 0)); job.SpoolPage(); } if (job.CanContinue()) job.CommitJob(); } } BMessenger(window).SendMessage(B_QUIT_REQUESTED); return 0; }