/* BeOS_print.cpp */

/* printing support for Tux Paint */
/* Marcin 'Shard' Konicki <shard at beosjournal.org> */

/*
  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;
}
