/*
 * Copyright (C) 2004  Stefan Kleine Stegemann
 *
 * 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.
 */

#include <stdio.h>
#include <stdlib.h>
#include "poppler_splash_renderer.h"
#include "poppler.h"
#include <PDFDoc.h>
#include <Page.h>
#include <goo/GooString.h>
#include <SplashOutputDev.h>
#include <splash/SplashBitmap.h>

#define PDF_DOC(obj) static_cast<PDFDoc*>(obj)
#define PAGE(obj) static_cast<Page*>(obj)
#define SPLASH_DEV(obj) static_cast<SplashOutputDev*>(obj)
#define SPLASH_BITMAP(obj) static_cast<SplashBitmap*>(obj)

void* poppler_splash_device_create(int bg_red, int bg_green, int bg_blue)
{  
   BEGIN_SYNCHRONIZED;
      SplashColor white;
#ifdef POPPLER_0_4
      white.rgb8 = splashMakeRGB8(bg_red, bg_green, bg_blue);
      void* splashDevice = new SplashOutputDev(splashModeRGB8, gFalse, white);
#endif
#ifdef POPPLER_0_5
      white[0] = bg_red;
      white[1] = bg_green;
      white[2] = bg_blue;
      // I'm not sure what bitmapRowPad should be, 1 is just a guess.
      void* splashDevice = new SplashOutputDev(splashModeRGB8, 1, gFalse, white);
#endif
   END_SYNCHRONIZED;
   
   return splashDevice;
}

void poppler_splash_device_start_doc(void* output_dev, void* poppler_document)
{
   if (!output_dev || !poppler_document)
   {
     return;
   }
    
   SYNCHRONIZED(SPLASH_DEV(output_dev)->startDoc(PDF_DOC(poppler_document)->getXRef()));
}

void poppler_splash_device_destroy(void* output_dev)
{
   if (!output_dev)
   {
      return;
   }
   
   delete SPLASH_DEV(output_dev);
}

int poppler_splash_device_display_slice(void* output_dev, void* poppler_page,
                                        void* poppler_document,
                                        float hDPI, float vDPI, int rotate,
                                        float sliceX, float sliceY,
                                        float sliceW, float sliceH)
{
   if (!output_dev || !poppler_page || !poppler_document)
   {
      return 0;
   }

   
   SYNCHRONIZED(PAGE(poppler_page)->displaySlice(SPLASH_DEV(output_dev),
                                                 (double)hDPI, (double)vDPI,
                                                 rotate,
#ifdef POPPLER_0_5
						 gTrue, // useMediaBox
#endif
                                                 gTrue, // Crop
                                                 (int)sliceX, (int)sliceY,
                                                 (int)sliceW, (int)sliceH,
                                                 NULL, // Links
                                                 PDF_DOC(poppler_document)->getCatalog()));

   return 1;
}

int poppler_splash_device_get_bitmap(void* output_dev, void** bitmap,
                                     int* width, int* height)
{
   if (!output_dev)
   {
      return 0;
   }
   
   SplashBitmap* _bitmap = SPLASH_DEV(output_dev)->getBitmap();
   *width = _bitmap->getWidth();
   *height = _bitmap->getHeight();
   *bitmap = _bitmap;

   return 1;
}

int poppler_splash_device_get_rgb(void* bitmap, unsigned char** data)
{
   if (!bitmap)
   {
      return 0;
   }

#ifdef POPPLER_0_4
   SplashRGB8*     rgb8;
#endif
#ifdef POPPLER_0_5
   SplashColorPtr  color;
#endif
   unsigned char*  dataPtr;

#ifdef POPPLER_0_4
   rgb8 = SPLASH_BITMAP(bitmap)->getDataPtr().rgb8;
#endif
#ifdef POPPLER_0_5
   color = SPLASH_BITMAP(bitmap)->getDataPtr();
#endif

   dataPtr = *data;
   for (int row = 0; row < SPLASH_BITMAP(bitmap)->getHeight(); row++)
   {
      for (int col = 0; col < SPLASH_BITMAP(bitmap)->getWidth(); col++)
      {
#ifdef POPPLER_0_4
         *dataPtr++ = splashRGB8R(*rgb8);
         *dataPtr++ = splashRGB8G(*rgb8);
         *dataPtr++ = splashRGB8B(*rgb8);
         ++rgb8;
#endif
#ifdef POPPLER_0_5
	 *dataPtr++ = splashRGB8R(color);
	 *dataPtr++ = splashRGB8G(++color);
	 *dataPtr++ = splashRGB8B(++color);
	 ++color;
#endif
      }
   }
   
   return 1;
}
