removed all: target
[swftools.git] / pdf2swf / SWFOutputDev.cc
index fd9cdc0..deef3f4 100644 (file)
@@ -48,8 +48,8 @@
 #include "Error.h"
 #include "Link.h"
 #include "OutputDev.h"
-#include "GfxState.h"
 #include "GfxFont.h"
+#include "GfxState.h"
 #include "CharCodeToUnicode.h"
 #include "NameToUnicodeTable.h"
 #include "GlobalParams.h"
@@ -143,7 +143,7 @@ public:
   gfxdevice_t* output;
 
   // Constructor.
-  SWFOutputDev();
+  SWFOutputDev(gfxdevice_t*output);
 
   // Destructor.
   virtual ~SWFOutputDev() ;
@@ -153,15 +153,12 @@ public:
 
   void setInfo(InfoOutputDev*info) {this->info = info;}
   
-  int save(char*filename);
-    
   // Start a page.
   void startFrame(int width, int height);
 
   virtual void startPage(int pageNum, GfxState *state, double x1, double y1, double x2, double y2) ;
 
   void endframe();
-  void* get(char*name);
 
   //----- get info about output device
 
@@ -172,10 +169,9 @@ public:
   // Does this device use drawChar() or drawString()?
   virtual GBool useDrawChar();
   
-  // Can this device draw gradients?
-  virtual GBool useGradients();
-  
   virtual GBool interpretType3Chars() {return gTrue;}
+  
+  //virtual GBool useShadedFills() { return gTrue; }
 
   //----- initialization and control
 
@@ -250,20 +246,18 @@ public:
   virtual void type3D0(GfxState *state, double wx, double wy);
   virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury);
 
+  void finish();
+
   private:
   void drawGeneralImage(GfxState *state, Object *ref, Stream *str,
                                   int width, int height, GfxImageColorMap*colorMap, GBool invert,
                                   GBool inlineImg, int mask, int *maskColors,
                                   Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap);
-  int SWFOutputDev::setGfxFont(char*id, char*filename, double quality);
+  int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double quality);
   void strokeGfxline(GfxState *state, gfxline_t*line);
   void clipToGfxLine(GfxState *state, gfxline_t*line);
   void fillGfxLine(GfxState *state, gfxline_t*line);
 
-  void finish();
-
-  gfxresult_t*result; //filled when complete
-
   char outer_clip_box; //whether the page clip box is still on
 
   InfoOutputDev*info;
@@ -311,7 +305,7 @@ public:
   int pagebuflen;
   int pagepos;
 
-  friend void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage);
+  friend void dev_output_preparepage(dev_output_t*swf, int pdfpage, int outputpage);
 };
 
 typedef struct _drawnchar
@@ -390,7 +384,6 @@ class InfoOutputDev:  public OutputDev
   }
   virtual GBool upsideDown() {return gTrue;}
   virtual GBool useDrawChar() {return gTrue;}
-  virtual GBool useGradients() {return gTrue;}
   virtual GBool interpretType3Chars() {return gTrue;}
   virtual void startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2)
   {
@@ -471,34 +464,33 @@ class InfoOutputDev:  public OutputDev
   }
 };
 
-SWFOutputDev::SWFOutputDev()
-{
-    jpeginfo = 0;
-    textmodeinfo = 0;
-    ttfinfo = 0;
-    linkinfo = 0;
-    pbminfo = 0;
-    type3active = 0;
-    statepos = 0;
-    xref = 0;
-    substitutepos = 0;
-    type3Warning = 0;
-    user_movex = 0;
-    user_movey = 0;
-    user_clipx1 = 0;
-    user_clipy1 = 0;
-    user_clipx2 = 0;
-    user_clipy2 = 0;
-    current_text_stroke = 0;
-    current_text_clip = 0;
-    fontlist = 0;
-    result = 0;
-    outer_clip_box = 0;
-    pages = 0;
-    pagebuflen = 0;
-    pagepos = 0;
-    output = (gfxdevice_t*)malloc(sizeof(gfxdevice_t));
-    gfxdevice_swf_init(output);
+SWFOutputDev::SWFOutputDev(gfxdevice_t*output)
+{
+    this->output = output;
+    this->jpeginfo = 0;
+    this->textmodeinfo = 0;
+    this->ttfinfo = 0;
+    this->linkinfo = 0;
+    this->pbminfo = 0;
+    this->type3active = 0;
+    this->statepos = 0;
+    this->xref = 0;
+    this->substitutepos = 0;
+    this->type3Warning = 0;
+    this->user_movex = 0;
+    this->user_movey = 0;
+    this->user_clipx1 = 0;
+    this->user_clipy1 = 0;
+    this->user_clipx2 = 0;
+    this->user_clipy2 = 0;
+    this->current_text_stroke = 0;
+    this->current_text_clip = 0;
+    this->fontlist = 0;
+    this->outer_clip_box = 0;
+    this->pages = 0;
+    this->pagebuflen = 0;
+    this->pagepos = 0;
+
     /* configure device */
     parameter_t*p = device_config;
     while(p) {
@@ -526,20 +518,31 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2)
 
 static char*getFontID(GfxFont*font)
 {
+    Ref*ref = font->getID();
     GString*gstr = font->getName();
-    char* fontname = gstr==0?0:gstr->getCString();
-    if(fontname==0) {
-       char buf[32];
-       Ref*r=font->getID();
-       sprintf(buf, "UFONT%d", r->num);
-       return strdup(buf);
+    char* fname = gstr==0?0:gstr->getCString();
+    char buf[128];
+    if(fname==0) {
+       sprintf(buf, "font-%d-%d", ref->num, ref->gen);
+    } else {
+       sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen);
     }
-    return strdup(fontname);
+    return strdup(buf);
 }
 
 static char*getFontName(GfxFont*font)
 {
-    char*fontid = getFontID(font);
+    char*fontid;
+    GString*gstr = font->getName();
+    char* fname = gstr==0?0:gstr->getCString();
+    if(fname==0) {
+       char buf[32];
+       Ref*r=font->getID();
+       sprintf(buf, "UFONT%d", r->num);
+       fontid = strdup(buf);
+    }
+    fontid = strdup(fname);
+
     char*fontname= 0;
     char* plus = strchr(fontid, '+');
     if(plus && plus < &fontid[strlen(fontid)-1]) {
@@ -1021,32 +1024,12 @@ void SWFOutputDev::finish()
        }
        outer_clip_box = 0;
     }
-    if(output) {
-       this->result = output->finish(output);
-       free(output);output=0;
-    }
-}
-
-int SWFOutputDev::save(char*filename)
-{
-    finish();
-    return result->save(result, filename);
-}
-void* SWFOutputDev::get(char*name)
-{
-    finish();
-    return result->get(result, name);
 }
 
 SWFOutputDev::~SWFOutputDev() 
 {
     finish();
 
-    if(this->result) {
-       this->result->destroy(this->result);
-       this->result = 0;
-    }
-    
     if(this->pages) {
        free(this->pages); this->pages = 0;
     }
@@ -1056,8 +1039,8 @@ SWFOutputDev::~SWFOutputDev()
        fontlist_t*next = l->next;
        l->next = 0;
        gfxfont_free(l->font);
-       free(l->id);
-       free(l->filename);
+       free(l->id);l->id=0;
+       free(l->filename);l->filename=0;
        free(l);
        l = next;
     }
@@ -1071,15 +1054,6 @@ GBool SWFOutputDev::useDrawChar()
 {
     return gTrue;
 }
-GBool SWFOutputDev::useGradients()
-{
-    if(!gradientinfo)
-    {
-       msg("<notice> File contains gradients");
-       gradientinfo = 1;
-    }
-    return gTrue;
-}
 
 char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible",
                       "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"};
@@ -1155,7 +1129,7 @@ int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u)
        int t;
        for(t=0;t<font->num_glyphs;t++) {
            if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,uniname)) {
-               msg("<debug> Char [%d,>%s<,%d] maps to %d\n", charnr, uniname, u, t);
+               msg("<debug> Char [%d,%s,>%d(%s)<] maps to %d\n", charnr, charname, u, uniname, t);
                return t;
            }
        }
@@ -1163,7 +1137,7 @@ int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u)
           we can find the capitalized version */
        for(t=0;t<font->num_glyphs;t++) {
            if(font->glyphs[t].name && !strcasecmp(font->glyphs[t].name,uniname)) {
-               msg("<debug> Char [%d,>>%s<<,%d] maps to %d\n", charnr, uniname, u, t);
+               msg("<debug> Char [%d,%s,>>%d(%s)<<] maps to %d\n", charnr, charname, u, uniname, t);
                return t;
            }
        }
@@ -1241,6 +1215,9 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y,
     Unicode u=0;
     char*name=0;
 
+    if(uLen)
+       u = _u[0];
+
     if(font->isCIDFont()) {
        GfxCIDFont*cfont = (GfxCIDFont*)font;
 
@@ -1278,12 +1255,9 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y,
            return;
        }
     }
-
     if(charid<0) {
-       if(!name) {
-           msg("<warning> Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", 
-                   FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs);
-       }
+       msg("<warning> Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", 
+               FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs);
        return;
     }
 
@@ -1327,6 +1301,7 @@ void SWFOutputDev::endString(GfxState *state)
           now (as there may be texts of other rendering modes in this
           text object)- clipping objects have to wait until endTextObject,
           however */
+       output->setparameter(output, "mark","TXT");
        if((render&3) == RENDER_FILL) {
            fillGfxLine(state, current_text_stroke);
            gfxline_free(current_text_stroke);
@@ -1341,6 +1316,7 @@ void SWFOutputDev::endString(GfxState *state)
            gfxline_free(current_text_stroke);
            current_text_stroke = 0;
        }
+       output->setparameter(output, "mark","");
     }
 }    
 
@@ -1352,7 +1328,9 @@ void SWFOutputDev::endTextObject(GfxState *state)
        msg("<error> Internal error: drawChar.render!=beginString.render");
     
     if(current_text_clip) {
+       output->setparameter(output, "mark","TXT");
        clipToGfxLine(state, current_text_clip);
+       output->setparameter(output, "mark","");
        gfxline_free(current_text_clip);
        current_text_clip = 0;
     }
@@ -1453,10 +1431,11 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl
 
 void SWFOutputDev::drawLink(Link *link, Catalog *catalog) 
 {
-    msg("<debug> drawlink\n");
     double x1, y1, x2, y2, w;
     gfxline_t points[5];
     int x, y;
+    
+    msg("<debug> drawlink\n");
 
     link->getRect(&x1, &y1, &x2, &y2);
     cvtUserToDev(x1, y1, &x, &y);
@@ -1484,14 +1463,20 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
     points[4].x = x + user_movex;
     points[4].y = y + user_movey;
     points[4].next = 0;
+    
+    msg("<trace> drawlink %.2f/%.2f %.2f/%.2f %.2f/%.2f %.2f/%.2f\n",
+           points[0].x, points[0].y,
+           points[1].x, points[1].y,
+           points[2].x, points[2].y,
+           points[3].x, points[3].y); 
 
     LinkAction*action=link->getAction();
     char buf[128];
     char*s = 0;
     char*type = "-?-";
-    char*url = 0;
     char*named = 0;
     int page = -1;
+    msg("<trace> drawlink action=%d\n", action->getKind());
     switch(action->getKind())
     {
         case actionGoTo: {
@@ -1554,12 +1539,15 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
             type = "Launch";
             LinkLaunch*l = (LinkLaunch*)action;
             GString * str = new GString(l->getFileName());
-            str->append(l->getParams());
+           GString * params = l->getParams();
+           if(params)
+               str->append(params);
             s = strdup(str->getCString());
             delete str;
         }
         break;
         case actionURI: {
+           char*url = 0;
             type = "URI";
             LinkURI*l = (LinkURI*)action;
             GString*g = l->getURI();
@@ -1580,9 +1568,12 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
             break;
         }
     }
+
     if(!s) s = strdup("-?-");
+    
+    msg("<trace> drawlink s=%s\n", s);
 
-    if(!linkinfo && (page || url))
+    if(!linkinfo && (page || s))
     {
         msg("<notice> File contains links");
         linkinfo = 1;
@@ -1605,9 +1596,9 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
        sprintf(buf, "page%d", lpage);
        output->drawlink(output, points, buf);
     }
-    else if(url)
+    else if(s)
     {
-        output->drawlink(output, points, url);
+        output->drawlink(output, points, s);
     }
 
     msg("<verbose> \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page);
@@ -1983,7 +1974,7 @@ void SWFOutputDev::setXRef(PDFDoc*doc, XRef *xref)
     this->xref = xref;
 }
 
-int SWFOutputDev::setGfxFont(char*id, char*filename, double maxSize)
+int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double maxSize)
 {
     gfxfont_t*font = 0;
     fontlist_t*last=0,*l = this->fontlist;
@@ -2035,7 +2026,10 @@ void SWFOutputDev::updateFont(GfxState *state)
     if (!gfxFont) {
        return;
     }  
+    
     char * fontid = getFontID(gfxFont);
+    char * fontname = getFontName(gfxFont);
+
     double maxSize = 1.0;
 
     if(this->info) {
@@ -2056,8 +2050,9 @@ void SWFOutputDev::updateFont(GfxState *state)
 
     /* second, see if this is a font which was used before-
        if so, we are done */
-    if(setGfxFont(fontid, 0, 0)) {
+    if(setGfxFont(fontid, fontname, 0, 0)) {
        free(fontid);
+       free(fontname);
        return;
     }
 /*    if(swfoutput_queryfont(&output, fontid))
@@ -2074,6 +2069,7 @@ void SWFOutputDev::updateFont(GfxState *state)
            showFontError(gfxFont, 2);
        }
        free(fontid);
+       free(fontname);
        return;
     }
 
@@ -2096,10 +2092,8 @@ void SWFOutputDev::updateFont(GfxState *state)
       if(!fileName) showFontError(gfxFont,0);
       else del = 1;
     } else {
-      char * fontname = getFontName(gfxFont);
       fileName = searchFont(fontname);
       if(!fileName) showFontError(gfxFont,0);
-      free(fontname);
     }
     if(!fileName) {
        char * fontname = getFontName(gfxFont);
@@ -2111,6 +2105,8 @@ void SWFOutputDev::updateFont(GfxState *state)
            msg("<warning> Try specifying one or more font directories");
 
        fileName = substituteFont(gfxFont, fontid);
+       if(!fileName)
+           exit(1);
        if(fontid) { free(fontid);fontid = strdup(substitutetarget[substitutepos-1]); /*ugly hack*/};
        msg("<notice> Font is now %s (%s)", fontid, fileName);
     }
@@ -2118,6 +2114,7 @@ void SWFOutputDev::updateFont(GfxState *state)
     if(!fileName) {
        msg("<error> Couldn't set font %s\n", fontid);
        free(fontid);
+       free(fontname);
        return;
     }
        
@@ -2126,15 +2123,17 @@ void SWFOutputDev::updateFont(GfxState *state)
 
     //swfoutput_setfont(&output, fontid, fileName);
     
-    if(!setGfxFont(fontid, 0, 0)) {
-       setGfxFont(fontid, fileName, maxSize);
+    if(!setGfxFont(fontid, fontname, 0, 0)) {
+       setGfxFont(fontid, fontname, fileName, maxSize);
     }
    
     if(fileName && del)
        unlinkfont(fileName);
+
     if(fileName)
         free(fileName);
     free(fontid);
+    free(fontname);
 
     msg("<verbose> |");
 }
@@ -2273,7 +2272,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
     ncomps = colorMap->getNumPixelComps();
     bits = colorMap->getBits();
   }
-  
+      
   if(maskStr) {
       int x,y;
       unsigned char buf[8];
@@ -2309,8 +2308,9 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
          }
          delete imgMaskStr;
       }
+      maskStr->close();
   }
-      
+  
   imgStr = new ImageStream(str, width, ncomps,bits);
   imgStr->reset();
 
@@ -2334,6 +2334,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
   state->transform(1, 0, &x3, &y3); x3 += user_movex; y3 += user_movey;
   state->transform(1, 1, &x4, &y4); x4 += user_movex; y4 += user_movey;
 
+
   if(!pbminfo && !(str->getKind()==strDCT)) {
       if(!type3active) {
          msg("<notice> file contains pbm pictures %s",mask?"(masked)":"");
@@ -2690,7 +2691,7 @@ void pdfswf_addlanguagedir(char*dir)
 
     int l;
     FILE*fi = 0;
-    char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc"));
+    char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc") + 1);
     strcpy(config_file, dir);
     strcat(config_file, dirseparator());
     strcat(config_file, "add-to-xpdfrc");
@@ -2758,10 +2759,10 @@ typedef struct _pdf_doc_internal
 typedef struct _pdf_page_internal
 {
 } pdf_page_internal_t;
-typedef struct _swf_output_internal
+typedef struct _dev_output_internal
 {
     SWFOutputDev*outputDev;
-} swf_output_internal_t;
+} dev_output_internal_t;
 
 pdf_doc_t* pdf_init(char*filename, char*userPassword)
 {
@@ -2889,38 +2890,44 @@ void pdf_page_destroy(pdf_page_t*pdf_page)
     free(pdf_page);pdf_page=0;
 }
 
-swf_output_t* swf_output_init() 
+dev_output_t* dev_output_init(gfxdevice_t*dev) 
 {
-    swf_output_t*swf_output = (swf_output_t*)malloc(sizeof(swf_output_t));
-    memset(swf_output, 0, sizeof(swf_output_t));
-    swf_output_internal_t*i= (swf_output_internal_t*)malloc(sizeof(swf_output_internal_t));
-    memset(i, 0, sizeof(swf_output_internal_t));
-    swf_output->internal = i;
+    dev_output_t*dev_output = (dev_output_t*)malloc(sizeof(dev_output_t));
+    memset(dev_output, 0, sizeof(dev_output_t));
+    dev_output_internal_t*i= (dev_output_internal_t*)malloc(sizeof(dev_output_internal_t));
+    memset(i, 0, sizeof(dev_output_internal_t));
+    dev_output->internal = i;
 
-    i->outputDev = new SWFOutputDev();
-    return swf_output;
+    i->outputDev = new SWFOutputDev(dev);
+    return dev_output;
 }
 
-void swf_output_setparameter(swf_output_t*swf, char*name, char*value)
+void dev_output_setparameter(dev_output_t*swf, char*name, char*value)
 {
     pdfswf_setparameter(name, value);
 }
 
-void swf_output_startframe(swf_output_t*swf, int width, int height)
+void dev_output_startframe(dev_output_t*swf, int width, int height)
 {
-    swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
+    dev_output_internal_t*i= (dev_output_internal_t*)swf->internal;
     i->outputDev->startFrame(width, height);
 }
 
-void swf_output_endframe(swf_output_t*swf)
+void dev_output_endframe(dev_output_t*swf)
 {
-    swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
+    dev_output_internal_t*i= (dev_output_internal_t*)swf->internal;
     i->outputDev->endframe();
 }
 
-void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage)
+void dev_output_finish(dev_output_t*swf)
+{
+    dev_output_internal_t*i= (dev_output_internal_t*)swf->internal;
+    i->outputDev->finish();
+}
+
+void dev_output_preparepage(dev_output_t*swf, int pdfpage, int outputpage)
 {
-    swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
+    dev_output_internal_t*i= (dev_output_internal_t*)swf->internal;
     SWFOutputDev*o = i->outputDev;
 
     if(pdfpage < 0)
@@ -2944,32 +2951,18 @@ void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage)
        o->pagepos = pdfpage;
 }
 
-int swf_output_save(swf_output_t*swf, char*filename)
-{
-    swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
-    int ret = i->outputDev->save(filename);
-    return ret;
-}
-
-void* swf_output_get(swf_output_t*swf,char*name)
-{
-    swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
-    void* ret = i->outputDev->get(name);
-    return ret;
-}
-
-void swf_output_destroy(swf_output_t*output)
+void dev_output_destroy(dev_output_t*output)
 {
-    swf_output_internal_t*i = (swf_output_internal_t*)output->internal;
+    dev_output_internal_t*i = (dev_output_internal_t*)output->internal;
     delete i->outputDev; i->outputDev=0;
     free(output->internal);output->internal=0;
     free(output);
 }
 
-void pdf_page_render2(pdf_page_t*page, swf_output_t*swf)
+void pdf_page_render2(pdf_page_t*page, dev_output_t*swf)
 {
     pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal;
-    swf_output_internal_t*si = (swf_output_internal_t*)swf->internal;
+    dev_output_internal_t*si = (dev_output_internal_t*)swf->internal;
 
     if(!pi) {
        msg("<fatal> pdf_page_render: Parent PDF this page belongs to doesn't exist yet/anymore");
@@ -2985,10 +2978,10 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*swf)
     pi->doc->displayPage((OutputDev*)si->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, true, /*doLinks*/(int)1);
 }
 
-void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, int x1, int y1, int x2, int y2)
+void pdf_page_rendersection(pdf_page_t*page, dev_output_t*output, int x, int y, int x1, int y1, int x2, int y2)
 {
     pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal;
-    swf_output_internal_t*si = (swf_output_internal_t*)output->internal;
+    dev_output_internal_t*si = (dev_output_internal_t*)output->internal;
 
     si->outputDev->setMove(x,y);
     if((x1|y1|x2|y2)==0) x2++;
@@ -2996,10 +2989,10 @@ void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y,
 
     pdf_page_render2(page, output);
 }
-void pdf_page_render(pdf_page_t*page, swf_output_t*output)
+void pdf_page_render(pdf_page_t*page, dev_output_t*output)
 {
     pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal;
-    swf_output_internal_t*si = (swf_output_internal_t*)output->internal;
+    dev_output_internal_t*si = (dev_output_internal_t*)output->internal;
     
     si->outputDev->setMove(0,0);
     si->outputDev->setClip(0,0,0,0);