Ignore:
Timestamp:
Aug 27, 2010, 11:00:52 AM (11 years ago)
Author:
Silvan Scherrer
Message:

poppler update to 0.14.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/mypoppler/poppler/Annot.cc

    r277 r461  
    1616// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
    1717// Copyright (C) 2007, 2008 Julien Rebetez <julienr@svn.gnome.org>
    18 // Copyright (C) 2007-2009 Albert Astals Cid <aacid@kde.org>
    19 // Copyright (C) 2007-2009 Carlos Garcia Campos <carlosgc@gnome.org>
     18// Copyright (C) 2007-2010 Albert Astals Cid <aacid@kde.org>
     19// Copyright (C) 2007-2010 Carlos Garcia Campos <carlosgc@gnome.org>
    2020// Copyright (C) 2007, 2008 Iñigo Martínez <inigomartinez@gmail.com>
    2121// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
     
    6060#include "FileSpec.h"
    6161#include "DateInfo.h"
     62#include "Link.h"
    6263#include <string.h>
    63 
    64 #define annotFlagHidden    0x0002
    65 #define annotFlagPrint     0x0004
    66 #define annotFlagNoView    0x0020
    6764
    6865#define fieldFlagReadOnly           0x00000001
     
    9390// = (4 * (sqrt(2) - 1) / 3) * r
    9491#define bezierCircle 0.55228475
     92
     93// Ensures that x is between the limits set by low and high.
     94// If low is greater than high the result is undefined.
     95#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
    9596
    9697AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) {
     
    324325
    325326  if ((arrayLength % 8) == 0) {
    326     int i = 0;
     327    int i;
    327328
    328329    quadsLength = arrayLength / 8;
     
    331332    memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *));
    332333
    333     while (i < (quadsLength) && correct) {
    334       for (int j = 0; j < 8 && correct; j++) {
     334    for (i = 0; i < quadsLength; i++) {
     335      for (int j = 0; j < 8; j++) {
    335336        Object obj;
    336337        if (array->get(i * 8 + j, &obj)->isNum()) {
    337           quadArray[j] = obj.getNum();
    338           if (j % 2 == 1) {
    339               if (quadArray[j] < rect->y1 || quadArray[j] > rect->y2)
    340                   correct = gFalse;
    341           } else {
    342               if (quadArray[j] < rect->x1 || quadArray[j] > rect->x2)
    343                   correct = gFalse;
    344           }
     338          if (j % 2 == 1)
     339            quadArray[j] = CLAMP (obj.getNum(), rect->y1, rect->y2);
     340          else
     341            quadArray[j] = CLAMP (obj.getNum(), rect->x1, rect->x2);
    345342        } else {
    346343            correct = gFalse;
     344            obj.free();
     345            error (-1, "Invalid QuadPoint in annot");
     346            break;
    347347        }
    348348        obj.free();
    349349      }
    350350
    351       if (correct)
    352         quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1],
    353                                           quadArray[2], quadArray[3],
    354                                           quadArray[4], quadArray[5],
    355                                           quadArray[6], quadArray[7]);
    356       i++;
     351      if (!correct)
     352        break;
     353
     354      quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1],
     355                                        quadArray[2], quadArray[3],
     356                                        quadArray[4], quadArray[5],
     357                                        quadArray[6], quadArray[7]);
    357358    }
    358359
     
    612613AnnotColor::AnnotColor() {
    613614  length = 0;
    614   values = NULL;
    615615}
    616616
    617617AnnotColor::AnnotColor(double gray) {
    618618  length = 1;
    619   values = (double *) gmallocn (length, sizeof(double));
    620619
    621620  values[0] = gray;
     
    624623AnnotColor::AnnotColor(double r, double g, double b) {
    625624  length = 3;
    626   values = (double *) gmallocn (length, sizeof(double));
    627625
    628626  values[0] = r;
     
    633631AnnotColor::AnnotColor(double c, double m, double y, double k) {
    634632  length = 4;
    635   values = (double *) gmallocn (length, sizeof(double));
    636633
    637634  values[0] = c;
     
    641638}
    642639
    643 AnnotColor::AnnotColor(Array *array) {
    644   // TODO: check what Acrobat does in the case of having more than 5 numbers.
    645   if (array->getLength() < 5) {
    646     length = array->getLength();
    647     values = (double *) gmallocn (length, sizeof(double));
    648 
    649     for(int i = 0; i < length; i++) { 
    650       Object obj1;
    651 
    652       if (array->get(i, &obj1)->isNum()) {
    653         values[i] = obj1.getNum();
    654 
    655         if (values[i] < 0 || values[i] > 1)
    656           values[i] = 0;
    657       } else {
     640// If <adjust> is +1, color is brightened;
     641// if <adjust> is -1, color is darkened;
     642// otherwise color is not modified.
     643AnnotColor::AnnotColor(Array *array, int adjust) {
     644  int i;
     645
     646  length = array->getLength();
     647  if (length > 4)
     648    length = 4;
     649
     650  for (i = 0; i < length; i++) {
     651    Object obj1;
     652
     653    if (array->get(i, &obj1)->isNum()) {
     654      values[i] = obj1.getNum();
     655
     656      if (values[i] < 0 || values[i] > 1)
    658657        values[i] = 0;
    659       }
    660       obj1.free();
    661     }
    662   } else {
    663     values = NULL;
    664     length = 0;
    665   }
    666 }
    667 
    668 AnnotColor::~AnnotColor() {
    669   if (values)
    670     gfree (values);
     658    } else {
     659      values[i] = 0;
     660    }
     661    obj1.free();
     662  }
     663
     664  if (length == 4) {
     665    adjust = -adjust;
     666  }
     667  if (adjust > 0) {
     668    for (i = 0; i < length; ++i) {
     669      values[i] = 0.5 * values[i] + 0.5;
     670    }
     671  } else if (adjust < 0) {
     672    for (i = 0; i < length; ++i) {
     673      values[i] = 0.5 * values[i];
     674    }
     675  }
    671676}
    672677
     
    900905  appearBuf = NULL;
    901906  fontSize = 0;
     907
     908  appearance.initNull();
    902909
    903910  //----- parse the rectangle
     
    940947  obj1.free();
    941948
    942   /* TODO: Page Object indirect reference (should be parsed ?) */
    943   pageDict = NULL;
    944   /*if (dict->lookup("P", &obj1)->isDict()) {
    945     pageDict = NULL;
    946   } else {
    947     pageDict = NULL;
    948   }
    949   obj1.free();
    950   */
     949  if (dict->lookupNF("P", &obj1)->isRef()) {
     950    Ref ref = obj1.getRef();
     951
     952    page = catalog ? catalog->findPage (ref.num, ref.gen) : -1;
     953  } else {
     954    page = 0;
     955  }
     956  obj1.free();
    951957
    952958  if (dict->lookup("NM", &obj1)->isString()) {
     
    10811087  if (new_color) {
    10821088    Object obj1, obj2;
    1083     double *values = new_color->getValues();
     1089    const double *values = new_color->getValues();
    10841090
    10851091    obj1.initArray(xref);
     
    11221128    delete contents;
    11231129
    1124   if (pageDict)
    1125     delete pageDict;
    1126 
    11271130  if (name)
    11281131    delete name;
     
    11451148}
    11461149
    1147 // Set the current fill or stroke color, based on <a> (which should
    1148 // have 1, 3, or 4 elements).  If <adjust> is +1, color is brightened;
    1149 // if <adjust> is -1, color is darkened; otherwise color is not
    1150 // modified.
    1151 void Annot::setColor(Array *a, GBool fill, int adjust) {
    1152   Object obj1;
    1153   double color[4];
    1154   int nComps, i;
    1155 
    1156   nComps = a->getLength();
    1157   if (nComps > 4) {
    1158     nComps = 4;
    1159   }
    1160   for (i = 0; i < nComps && i < 4; ++i) {
    1161     if (a->get(i, &obj1)->isNum()) {
    1162       color[i] = obj1.getNum();
    1163     } else {
    1164       color[i] = 0;
    1165     }
    1166     obj1.free();
    1167   }
    1168   if (nComps == 4) {
    1169     adjust = -adjust;
    1170   }
    1171   if (adjust > 0) {
    1172     for (i = 0; i < nComps; ++i) {
    1173       color[i] = 0.5 * color[i] + 0.5;
    1174     }
    1175   } else if (adjust < 0) {
    1176     for (i = 0; i < nComps; ++i) {
    1177       color[i] = 0.5 * color[i];
    1178     }
    1179   }
    1180   if (nComps == 4) {
     1150void Annot::setColor(AnnotColor *color, GBool fill) {
     1151  const double *values = color->getValues();
     1152
     1153  switch (color->getSpace()) {
     1154  case AnnotColor::colorCMYK:
    11811155    appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n",
    1182         color[0], color[1], color[2], color[3],
    1183         fill ? 'k' : 'K');
    1184   } else if (nComps == 3) {
     1156                       values[0], values[1], values[2], values[3],
     1157                       fill ? 'k' : 'K');
     1158    break;
     1159  case AnnotColor::colorRGB:
    11851160    appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n",
    1186         color[0], color[1], color[2],
    1187         fill ? "rg" : "RG");
    1188   } else {
     1161                       values[0], values[1], values[2],
     1162                       fill ? "rg" : "RG");
     1163    break;
     1164  case AnnotColor::colorGray:
    11891165    appearBuf->appendf("{0:.2f} {1:c}\n",
    1190         color[0],
    1191         fill ? 'g' : 'G');
     1166                       values[0],
     1167                       fill ? 'g' : 'G');
     1168    break;
     1169  case AnnotColor::colorTransparent:
     1170  default:
     1171    break;
    11921172  }
    11931173}
     
    12671247}
    12681248
    1269 void Annot::draw(Gfx *gfx, GBool printing) {
    1270   Object obj;
    1271 
     1249void Annot::createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream) {
     1250  Object obj1, obj2;
     1251  Object appearDict;
     1252
     1253  appearDict.initDict(xref);
     1254  appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
     1255  appearDict.dictSet("Subtype", obj1.initName("Form"));
     1256  obj1.initArray(xref);
     1257  obj1.arrayAdd(obj2.initReal(bbox[0]));
     1258  obj1.arrayAdd(obj2.initReal(bbox[1]));
     1259  obj1.arrayAdd(obj2.initReal(bbox[2]));
     1260  obj1.arrayAdd(obj2.initReal(bbox[3]));
     1261  appearDict.dictSet("BBox", &obj1);
     1262  if (transparencyGroup) {
     1263    Object transDict;
     1264    transDict.initDict(xref);
     1265    transDict.dictSet("S", obj1.initName("Transparency"));
     1266    appearDict.dictSet("Group", &transDict);
     1267  }
     1268  if (resDict)
     1269    appearDict.dictSet("Resources", resDict);
     1270
     1271  MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0,
     1272                                     appearBuf->getLength(), &appearDict);
     1273  mStream->setNeedFree(gTrue);
     1274  aStream->initStream(mStream);
     1275}
     1276
     1277void Annot::createResourcesDict(char *formName, Object *formStream,
     1278                                char *stateName,
     1279                                double opacity, char *blendMode,
     1280                                Object *resDict) {
     1281  Object gsDict, stateDict, formDict, obj1;
     1282
     1283  gsDict.initDict(xref);
     1284  if (opacity != 1) {
     1285    gsDict.dictSet("CA", obj1.initReal(opacity));
     1286    gsDict.dictSet("ca", obj1.initReal(opacity));
     1287  }
     1288  if (blendMode)
     1289    gsDict.dictSet("BM", obj1.initName(blendMode));
     1290  stateDict.initDict(xref);
     1291  stateDict.dictSet(stateName, &gsDict);
     1292  formDict.initDict(xref);
     1293  formDict.dictSet(formName, formStream);
     1294
     1295  resDict->initDict(xref);
     1296  resDict->dictSet("ExtGState", &stateDict);
     1297  resDict->dictSet("XObject", &formDict);
     1298}
     1299
     1300GBool Annot::isVisible(GBool printing) {
    12721301  // check the flags
    1273   if ((flags & annotFlagHidden) ||
    1274       (printing && !(flags & annotFlagPrint)) ||
    1275       (!printing && (flags & annotFlagNoView))) {
    1276     return;
     1302  if ((flags & flagHidden) ||
     1303      (printing && !(flags & flagPrint)) ||
     1304      (!printing && (flags & flagNoView))) {
     1305    return gFalse;
    12771306  }
    12781307
     
    12801309  if (optContentConfig && oc.isRef()) {
    12811310    if (! optContentConfig->optContentIsVisible(&oc))
    1282       return;
    1283   }
     1311      return gFalse;
     1312  }
     1313
     1314  return gTrue;
     1315}
     1316
     1317void Annot::draw(Gfx *gfx, GBool printing) {
     1318  Object obj;
     1319
     1320  if (!isVisible (printing))
     1321    return;
    12841322
    12851323  // draw the appearance stream
    12861324  appearance.fetch(xref, &obj);
    1287   gfx->drawAnnot(&obj, (type == typeLink) ? border : (AnnotBorder *)NULL, color,
     1325  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
    12881326      rect->x1, rect->y1, rect->x2, rect->y2);
    12891327  obj.free();
     
    16141652}
    16151653
     1654#define ANNOT_TEXT_AP_NOTE                                                    \
     1655  "3.602 24 m 20.398 24 l 22.387 24 24 22.387 24 20.398 c 24 3.602 l 24\n"    \
     1656  "1.613 22.387 0 20.398 0 c 3.602 0 l 1.613 0 0 1.613 0 3.602 c 0 20.398\n"  \
     1657  "l 0 22.387 1.613 24 3.602 24 c h\n"                                        \
     1658  "3.602 24 m f\n"                                                            \
     1659  "0.533333 0.541176 0.521569 RG 2 w\n"                                       \
     1660  "1 J\n"                                                                     \
     1661  "1 j\n"                                                                     \
     1662  "[] 0.0 d\n"                                                                \
     1663  "4 M 9 18 m 4 18 l 4 7 4 4 6 3 c 20 3 l 18 4 18 7 18 18 c 17 18 l S\n"      \
     1664  "1.5 w\n"                                                                   \
     1665  "0 j\n"                                                                     \
     1666  "10 16 m 14 21 l S\n"                                                       \
     1667  "1.85625 w\n"                                                               \
     1668  "1 j\n"                                                                     \
     1669  "15.07 20.523 m 15.07 19.672 14.379 18.977 13.523 18.977 c 12.672 18.977\n" \
     1670  "11.977 19.672 11.977 20.523 c 11.977 21.379 12.672 22.07 13.523 22.07 c\n" \
     1671  "14.379 22.07 15.07 21.379 15.07 20.523 c h\n"                              \
     1672  "15.07 20.523 m S\n"                                                        \
     1673  "1 w\n"                                                                     \
     1674  "0 j\n"                                                                     \
     1675  "6.5 13.5 m 15.5 13.5 l S\n"                                                \
     1676  "6.5 10.5 m 13.5 10.5 l S\n"                                                \
     1677  "6.801 7.5 m 15.5 7.5 l S\n"                                                \
     1678  "0.729412 0.741176 0.713725 RG 2 w\n"                                       \
     1679  "1 j\n"                                                                     \
     1680  "9 19 m 4 19 l 4 8 4 5 6 4 c 20 4 l 18 5 18 8 18 19 c 17 19 l S\n"          \
     1681  "1.5 w\n"                                                                   \
     1682  "0 j\n"                                                                     \
     1683  "10 17 m 14 22 l S\n"                                                       \
     1684  "1.85625 w\n"                                                               \
     1685  "1 j\n"                                                                     \
     1686  "15.07 21.523 m 15.07 20.672 14.379 19.977 13.523 19.977 c 12.672 19.977\n" \
     1687  "11.977 20.672 11.977 21.523 c 11.977 22.379 12.672 23.07 13.523 23.07 c\n" \
     1688  "14.379 23.07 15.07 22.379 15.07 21.523 c h\n"                              \
     1689  "15.07 21.523 m S\n"                                                        \
     1690  "1 w\n"                                                                     \
     1691  "0 j\n"                                                                     \
     1692  "6.5 14.5 m 15.5 14.5 l S\n"                                                \
     1693  "6.5 11.5 m 13.5 11.5 l S\n"                                                \
     1694  "6.801 8.5 m 15.5 8.5 l S\n"
     1695
     1696#define ANNOT_TEXT_AP_COMMENT                                                   \
     1697  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"      \
     1698  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"    \
     1699  "l 1 21.523 2.477 23 4.301 23 c h\n"                                          \
     1700  "4.301 23 m f\n"                                                              \
     1701  "0.533333 0.541176 0.521569 RG 2 w\n"                                         \
     1702  "0 J\n"                                                                       \
     1703  "1 j\n"                                                                       \
     1704  "[] 0.0 d\n"                                                                  \
     1705  "4 M 8 20 m 16 20 l 18.363 20 20 18.215 20 16 c 20 13 l 20 10.785 18.363 9\n" \
     1706  "16 9 c 13 9 l 8 3 l 8 9 l 8 9 l 5.637 9 4 10.785 4 13 c 4 16 l 4 18.215\n"   \
     1707  "5.637 20 8 20 c h\n"                                                         \
     1708  "8 20 m S\n"                                                                  \
     1709  "0.729412 0.741176 0.713725 RG 8 21 m 16 21 l 18.363 21 20 19.215 20 17\n"    \
     1710  "c 20 14 l 20 11.785 18.363 10\n"                                             \
     1711  "16 10 c 13 10 l 8 4 l 8 10 l 8 10 l 5.637 10 4 11.785 4 14 c 4 17 l 4\n"     \
     1712  "19.215 5.637 21 8 21 c h\n"                                                  \
     1713  "8 21 m S\n"
     1714
     1715#define ANNOT_TEXT_AP_KEY                                                    \
     1716  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
     1717  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
     1718  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
     1719  "4.301 23 m f\n"                                                           \
     1720  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
     1721  "1 J\n"                                                                    \
     1722  "0 j\n"                                                                    \
     1723  "[] 0.0 d\n"                                                               \
     1724  "4 M 11.895 18.754 m 13.926 20.625 17.09 20.496 18.961 18.465 c 20.832\n"  \
     1725  "16.434 20.699 13.27 18.668 11.398 c 17.164 10.016 15.043 9.746 13.281\n"  \
     1726  "10.516 c 12.473 9.324 l 11.281 10.078 l 9.547 8.664 l 9.008 6.496 l\n"    \
     1727  "7.059 6.059 l 6.34 4.121 l 5.543 3.668 l 3.375 4.207 l 2.938 6.156 l\n"   \
     1728  "10.57 13.457 l 9.949 15.277 10.391 17.367 11.895 18.754 c h\n"            \
     1729  "11.895 18.754 m S\n"                                                      \
     1730  "1.5 w\n"                                                                  \
     1731  "16.059 15.586 m 16.523 15.078 17.316 15.043 17.824 15.512 c 18.332\n"     \
     1732  "15.98 18.363 16.77 17.895 17.277 c 17.43 17.785 16.637 17.816 16.129\n"   \
     1733  "17.352 c 15.621 16.883 15.59 16.094 16.059 15.586 c h\n"                  \
     1734  "16.059 15.586 m S\n"                                                      \
     1735  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
     1736  "11.895 19.754 m 13.926 21.625 17.09 21.496 18.961 19.465 c 20.832\n"      \
     1737  "17.434 20.699 14.27 18.668 12.398 c 17.164 11.016 15.043 10.746 13.281\n" \
     1738  "11.516 c 12.473 10.324 l 11.281 11.078 l 9.547 9.664 l 9.008 7.496 l\n"   \
     1739  "7.059 7.059 l 6.34 5.121 l 5.543 4.668 l 3.375 5.207 l 2.938 7.156 l\n"   \
     1740  "10.57 14.457 l 9.949 16.277 10.391 18.367 11.895 19.754 c h\n"            \
     1741  "11.895 19.754 m S\n"                                                      \
     1742  "1.5 w\n"                                                                  \
     1743  "16.059 16.586 m 16.523 16.078 17.316 16.043 17.824 16.512 c 18.332\n"     \
     1744  "16.98 18.363 17.77 17.895 18.277 c 17.43 18.785 16.637 18.816 16.129\n"   \
     1745  "18.352 c 15.621 17.883 15.59 17.094 16.059 16.586 c h\n"                  \
     1746  "16.059 16.586 m S\n"
     1747
     1748#define ANNOT_TEXT_AP_HELP                                                        \
     1749  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
     1750  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
     1751  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
     1752  "4.301 23 m f\n"                                                                \
     1753  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                         \
     1754  "1 J\n"                                                                         \
     1755  "1 j\n"                                                                         \
     1756  "[] 0.0 d\n"                                                                    \
     1757  "4 M 8.289 16.488 m 8.824 17.828 10.043 18.773 11.473 18.965 c 12.902 19.156\n" \
     1758  "14.328 18.559 15.195 17.406 c 16.062 16.254 16.242 14.723 15.664 13.398\n"     \
     1759  "c S\n"                                                                         \
     1760  "0 j\n"                                                                         \
     1761  "12 8 m 12 12 16 11 16 15 c S\n"                                                \
     1762  "1.539286 w\n"                                                                  \
     1763  "1 j\n"                                                                         \
     1764  "q 1 0 0 -0.999991 0 24 cm\n"                                                   \
     1765  "12.684 20.891 m 12.473 21.258 12.004 21.395 11.629 21.196 c 11.254\n"          \
     1766  "20.992 11.105 20.531 11.297 20.149 c 11.488 19.77 11.945 19.61 12.332\n"       \
     1767  "19.789 c 12.719 19.969 12.891 20.426 12.719 20.817 c S Q\n"                    \
     1768  "0.729412 0.741176 0.713725 RG 2.5 w\n"                                         \
     1769  "8.289 17.488 m 9.109 19.539 11.438 20.535 13.488 19.711 c 15.539 18.891\n"     \
     1770  "16.535 16.562 15.711 14.512 c 15.699 14.473 15.684 14.438 15.664 14.398\n"     \
     1771  "c S\n"                                                                         \
     1772  "0 j\n"                                                                         \
     1773  "12 9 m 12 13 16 12 16 16 c S\n"                                                \
     1774  "1.539286 w\n"                                                                  \
     1775  "1 j\n"                                                                         \
     1776  "q 1 0 0 -0.999991 0 24 cm\n"                                                   \
     1777  "12.684 19.891 m 12.473 20.258 12.004 20.395 11.629 20.195 c 11.254\n"          \
     1778  "19.992 11.105 19.531 11.297 19.149 c 11.488 18.77 11.945 18.61 12.332\n"       \
     1779  "18.789 c 12.719 18.969 12.891 19.426 12.719 19.817 c S Q\n"
     1780
     1781#define ANNOT_TEXT_AP_NEW_PARAGRAPH                                               \
     1782  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
     1783  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
     1784  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
     1785  "4.301 23 m f\n"                                                                \
     1786  "0.533333 0.541176 0.521569 RG 4 w\n"                                           \
     1787  "0 J\n"                                                                         \
     1788  "2 j\n"                                                                         \
     1789  "[] 0.0 d\n"                                                                    \
     1790  "4 M q 1 0 0 -1 0 24 cm\n"                                                      \
     1791  "9.211 11.988 m 8.449 12.07 7.711 11.707 7.305 11.059 c 6.898 10.41\n"          \
     1792  "6.898 9.59 7.305 8.941 c 7.711 8.293 8.449 7.93 9.211 8.012 c S Q\n"           \
     1793  "1.004413 w\n"                                                                  \
     1794  "1 J\n"                                                                         \
     1795  "1 j\n"                                                                         \
     1796  "q 1 0 0 -0.991232 0 24 cm\n"                                                   \
     1797  "18.07 11.511 m 15.113 10.014 l 12.199 11.602 l 12.711 8.323 l 10.301\n"        \
     1798  "6.045 l 13.574 5.517 l 14.996 2.522 l 16.512 5.474 l 19.801 5.899 l\n"         \
     1799  "17.461 8.252 l 18.07 11.511 l h\n"                                             \
     1800  "18.07 11.511 m S Q\n"                                                          \
     1801  "2 w\n"                                                                         \
     1802  "0 j\n"                                                                         \
     1803  "11 17 m 10 17 l 10 3 l S\n"                                                    \
     1804  "14 3 m 14 13 l S\n"                                                            \
     1805  "0.729412 0.741176 0.713725 RG 4 w\n"                                           \
     1806  "0 J\n"                                                                         \
     1807  "2 j\n"                                                                         \
     1808  "q 1 0 0 -1 0 24 cm\n"                                                          \
     1809  "9.211 10.988 m 8.109 11.105 7.125 10.309 7.012 9.211 c 6.895 8.109\n"          \
     1810  "7.691 7.125 8.789 7.012 c 8.93 6.996 9.07 6.996 9.211 7.012 c S Q\n"           \
     1811  "1.004413 w\n"                                                                  \
     1812  "1 J\n"                                                                         \
     1813  "1 j\n"                                                                         \
     1814  "q 1 0 0 -0.991232 0 24 cm\n"                                                   \
     1815  "18.07 10.502 m 15.113 9.005 l 12.199 10.593 l 12.711 7.314 l 10.301\n"         \
     1816  "5.036 l 13.574 4.508 l 14.996 1.513 l 16.512 4.465 l 19.801 4.891 l\n"         \
     1817  "17.461 7.243 l 18.07 10.502 l h\n"                                             \
     1818  "18.07 10.502 m S Q\n"                                                          \
     1819  "2 w\n"                                                                         \
     1820  "0 j\n"                                                                         \
     1821  "11 18 m 10 18 l 10 4 l S\n"                                                    \
     1822  "14 4 m 14 14 l S\n"
     1823
     1824#define ANNOT_TEXT_AP_PARAGRAPH                                              \
     1825  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
     1826  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
     1827  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
     1828  "4.301 23 m f\n"                                                           \
     1829  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
     1830  "1 J\n"                                                                    \
     1831  "1 j\n"                                                                    \
     1832  "[] 0.0 d\n"                                                               \
     1833  "4 M 15 3 m 15 18 l 11 18 l 11 3 l S\n"                                    \
     1834  "4 w\n"                                                                    \
     1835  "q 1 0 0 -1 0 24 cm\n"                                                     \
     1836  "9.777 10.988 m 8.746 10.871 7.973 9.988 8 8.949 c 8.027 7.91 8.844\n"     \
     1837  "7.066 9.879 7.004 c S Q\n"                                                \
     1838  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
     1839  "15 4 m 15 19 l 11 19 l 11 4 l S\n"                                        \
     1840  "4 w\n"                                                                    \
     1841  "q 1 0 0 -1 0 24 cm\n"                                                     \
     1842  "9.777 9.988 m 8.746 9.871 7.973 8.988 8 7.949 c 8.027 6.91 8.844 6.066\n" \
     1843  "9.879 6.004 c S Q\n"
     1844
     1845#define ANNOT_TEXT_AP_INSERT                                                 \
     1846  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
     1847  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
     1848  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
     1849  "4.301 23 m f\n"                                                           \
     1850  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
     1851  "1 J\n"                                                                    \
     1852  "0 j\n"                                                                    \
     1853  "[] 0.0 d\n"                                                               \
     1854  "4 M 12 18.012 m 20 18 l S\n"                                              \
     1855  "9 10 m 17 10 l S\n"                                                       \
     1856  "12 14.012 m 20 14 l S\n"                                                  \
     1857  "12 6.012 m 20 6.012 l S\n"                                                \
     1858  "4 12 m 6 10 l 4 8 l S\n"                                                  \
     1859  "4 12 m 4 8 l S\n"                                                         \
     1860  "0.729412 0.741176 0.713725 RG 12 19.012 m 20 19 l S\n"                    \
     1861  "9 11 m 17 11 l S\n"                                                       \
     1862  "12 15.012 m 20 15 l S\n"                                                  \
     1863  "12 7.012 m 20 7.012 l S\n"                                                \
     1864  "4 13 m 6 11 l 4 9 l S\n"                                                  \
     1865  "4 13 m 4 9 l S\n"
     1866
     1867#define ANNOT_TEXT_AP_CROSS                                                  \
     1868  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
     1869  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
     1870  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
     1871  "4.301 23 m f\n"                                                           \
     1872  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                    \
     1873  "1 J\n"                                                                    \
     1874  "0 j\n"                                                                    \
     1875  "[] 0.0 d\n"                                                               \
     1876  "4 M 18 5 m 6 17 l S\n"                                                    \
     1877  "6 5 m 18 17 l S\n"                                                        \
     1878  "0.729412 0.741176 0.713725 RG 18 6 m 6 18 l S\n"                          \
     1879  "6 6 m 18 18 l S\n"
     1880
     1881#define ANNOT_TEXT_AP_CIRCLE                                                      \
     1882  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
     1883  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
     1884  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
     1885  "4.301 23 m f\n"                                                                \
     1886  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                         \
     1887  "1 J\n"                                                                         \
     1888  "1 j\n"                                                                         \
     1889  "[] 0.0 d\n"                                                                    \
     1890  "4 M 19.5 11.5 m 19.5 7.359 16.141 4 12 4 c 7.859 4 4.5 7.359 4.5 11.5 c 4.5\n" \
     1891  "15.641 7.859 19 12 19 c 16.141 19 19.5 15.641 19.5 11.5 c h\n"                 \
     1892  "19.5 11.5 m S\n"                                                               \
     1893  "0.729412 0.741176 0.713725 RG 19.5 12.5 m 19.5 8.359 16.141 5 12 5 c\n"        \
     1894  "7.859 5 4.5 8.359 4.5 12.5 c 4.5\n"                                            \
     1895  "16.641 7.859 20 12 20 c 16.141 20 19.5 16.641 19.5 12.5 c h\n"                 \
     1896  "19.5 12.5 m S\n"
     1897
     1898void AnnotText::draw(Gfx *gfx, GBool printing) {
     1899  Object obj;
     1900  double ca = 1;
     1901
     1902  if (!isVisible (printing))
     1903    return;
     1904
     1905  double rectx2 = rect->x2;
     1906  double recty2 = rect->y2;
     1907  if (appearance.isNull()) {
     1908    ca = opacity;
     1909
     1910    appearBuf = new GooString ();
     1911
     1912    appearBuf->append ("q\n");
     1913    if (color)
     1914      setColor(color, gTrue);
     1915    else
     1916      appearBuf->append ("1 1 1 rg\n");
     1917    if (!icon->cmp("Note"))
     1918      appearBuf->append (ANNOT_TEXT_AP_NOTE);
     1919    else if (!icon->cmp("Comment"))
     1920      appearBuf->append (ANNOT_TEXT_AP_COMMENT);
     1921    else if (!icon->cmp("Key"))
     1922      appearBuf->append (ANNOT_TEXT_AP_KEY);
     1923    else if (!icon->cmp("Help"))
     1924      appearBuf->append (ANNOT_TEXT_AP_HELP);
     1925    else if (!icon->cmp("NewParagraph"))
     1926      appearBuf->append (ANNOT_TEXT_AP_NEW_PARAGRAPH);
     1927    else if (!icon->cmp("Paragraph"))
     1928      appearBuf->append (ANNOT_TEXT_AP_PARAGRAPH);
     1929    else if (!icon->cmp("Insert"))
     1930      appearBuf->append (ANNOT_TEXT_AP_INSERT);
     1931    else if (!icon->cmp("Cross"))
     1932      appearBuf->append (ANNOT_TEXT_AP_CROSS);
     1933    else if (!icon->cmp("Circle"))
     1934      appearBuf->append (ANNOT_TEXT_AP_CIRCLE);
     1935    appearBuf->append ("Q\n");
     1936
     1937    double bbox[4];
     1938    bbox[0] = bbox[1] = 0;
     1939    bbox[2] = bbox[3] = 24;
     1940    if (ca == 1) {
     1941      createForm(bbox, gFalse, NULL, &appearance);
     1942    } else {
     1943      Object aStream, resDict;
     1944
     1945      createForm(bbox, gTrue, NULL, &aStream);
     1946      delete appearBuf;
     1947
     1948      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     1949      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     1950      createForm(bbox, gFalse, &resDict, &appearance);
     1951    }
     1952    delete appearBuf;
     1953
     1954    rectx2 = rect->x1 + 24;
     1955    recty2 = rect->y1 + 24;
     1956  }
     1957
     1958  // draw the appearance stream
     1959  appearance.fetch(xref, &obj);
     1960  gfx->drawAnnot(&obj, border, color,
     1961                 rect->x1, rect->y1, rectx2, recty2);
     1962  obj.free();
     1963}
     1964
    16161965//------------------------------------------------------------------------
    16171966// AnnotLink
     
    16962045  Object obj;
    16972046
    1698   // check the flags
    1699   if ((flags & annotFlagHidden) ||
    1700       (printing && !(flags & annotFlagPrint)) ||
    1701       (!printing && (flags & annotFlagNoView))) {
     2047  if (!isVisible (printing))
    17022048    return;
    1703   }
    17042049
    17052050  // draw the appearance stream
     
    20222367  }
    20232368  obj1.free();
     2369}
     2370
     2371void AnnotLine::draw(Gfx *gfx, GBool printing) {
     2372  Object obj;
     2373  double ca = 1;
     2374
     2375  if (!isVisible (printing))
     2376    return;
     2377
     2378  /* Some documents like pdf_commenting_new.pdf,
     2379   * have y1 = y2 but line_width > 0, acroread
     2380   * renders the lines in such cases even though
     2381   * the annot bbox is empty. We adjust the bbox here
     2382   * to avoid having an empty bbox so that lines
     2383   * are rendered
     2384   */
     2385  if (rect->y1 == rect->y2)
     2386    rect->y2 += border ? border->getWidth() : 1;
     2387
     2388  if (appearance.isNull()) {
     2389    ca = opacity;
     2390
     2391    appearBuf = new GooString ();
     2392    appearBuf->append ("q\n");
     2393    if (color)
     2394      setColor(color, gFalse);
     2395
     2396    if (border) {
     2397      int i, dashLength;
     2398      double *dash;
     2399
     2400      switch (border->getStyle()) {
     2401      case AnnotBorder::borderDashed:
     2402        appearBuf->append("[");
     2403        dashLength = border->getDashLength();
     2404        dash = border->getDash();
     2405        for (i = 0; i < dashLength; ++i)
     2406          appearBuf->appendf(" {0:.2f}", dash[i]);
     2407        appearBuf->append(" ] 0 d\n");
     2408        break;
     2409      default:
     2410        appearBuf->append("[] 0 d\n");
     2411        break;
     2412      }
     2413      appearBuf->appendf("{0:.2f} w\n", border->getWidth());
     2414    }
     2415    appearBuf->appendf ("{0:.2f} {1:.2f} m\n", coord1->getX() - rect->x1, coord1->getY() - rect->y1);
     2416    appearBuf->appendf ("{0:.2f} {1:.2f} l\n", coord2->getX() - rect->x1, coord2->getY() - rect->y1);
     2417    // TODO: Line ending, caption, leader lines
     2418    appearBuf->append ("S\n");
     2419    appearBuf->append ("Q\n");
     2420
     2421    double bbox[4];
     2422    bbox[0] = bbox[1] = 0;
     2423    bbox[2] = rect->x2 - rect->x1;
     2424    bbox[3] = rect->y2 - rect->y1;
     2425    if (ca == 1) {
     2426      createForm(bbox, gFalse, NULL, &appearance);
     2427    } else {
     2428      Object aStream, resDict;
     2429
     2430      createForm(bbox, gTrue, NULL, &aStream);
     2431      delete appearBuf;
     2432
     2433      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     2434      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     2435      createForm(bbox, gFalse, &resDict, &appearance);
     2436    }
     2437    delete appearBuf;
     2438  }
     2439
     2440  // draw the appearance stream
     2441  appearance.fetch(xref, &obj);
     2442  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
     2443                 rect->x1, rect->y1, rect->x2, rect->y2);
     2444  obj.free();
    20242445}
    20252446
     
    20972518    quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
    20982519  } else {
     2520    error(-1, "Bad Annot Text Markup QuadPoints");
    20992521    quadrilaterals = NULL;
     2522    ok = gFalse;
    21002523  }
    21012524  obj1.free();
     
    21062529    delete quadrilaterals;
    21072530  }
     2531}
     2532
     2533
     2534
     2535void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) {
     2536  Object obj;
     2537  double ca = 1;
     2538  int i;
     2539  Object obj1, obj2;
     2540
     2541  if (!isVisible (printing))
     2542    return;
     2543
     2544  if (appearance.isNull() || type == typeHighlight) {
     2545    ca = opacity;
     2546
     2547    appearBuf = new GooString ();
     2548
     2549    switch (type) {
     2550    case typeUnderline:
     2551      if (color) {
     2552        setColor(color, gFalse);
     2553        setColor(color, gTrue);
     2554      }
     2555
     2556      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
     2557        double x1, y1, x2, y2, x3, y3;
     2558        double x, y;
     2559
     2560        x1 = quadrilaterals->getX1(i);
     2561        y1 = quadrilaterals->getY1(i);
     2562        x2 = quadrilaterals->getX2(i);
     2563        y2 = quadrilaterals->getY2(i);
     2564        x3 = quadrilaterals->getX3(i);
     2565        y3 = quadrilaterals->getY3(i);
     2566
     2567        x = x1 - rect->x1;
     2568        y = y3 - rect->y1;
     2569        appearBuf->append ("[]0 d 2 w\n");
     2570        appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x, y);
     2571        appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x + (x2 - x1), y);
     2572        appearBuf->append ("S\n");
     2573      }
     2574      break;
     2575    case typeStrikeOut:
     2576      if (color) {
     2577        setColor(color, gFalse);
     2578        setColor(color, gTrue);
     2579      }
     2580
     2581      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
     2582        double x1, y1, x2, y2, x3, y3;
     2583        double x, y;
     2584        double h2;
     2585
     2586        x1 = quadrilaterals->getX1(i);
     2587        y1 = quadrilaterals->getY1(i);
     2588        x2 = quadrilaterals->getX2(i);
     2589        y2 = quadrilaterals->getY2(i);
     2590        x3 = quadrilaterals->getX3(i);
     2591        y3 = quadrilaterals->getY3(i);
     2592        h2 = (y1 - y3) / 2.0;
     2593
     2594        x = x1 - rect->x1;
     2595        y = (y3 - rect->y1) + h2;
     2596        appearBuf->append ("[]0 d 2 w\n");
     2597        appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x, y);
     2598        appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x + (x2 - x1), y);
     2599        appearBuf->append ("S\n");
     2600      }
     2601      break;
     2602    case typeSquiggly:
     2603      // TODO
     2604    default:
     2605    case typeHighlight:
     2606      appearance.free();
     2607
     2608      if (color)
     2609        setColor(color, gTrue);
     2610
     2611      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
     2612        double x1, y1, x2, y2, x3, y3, x4, y4;
     2613        double h4;
     2614
     2615        x1 = quadrilaterals->getX1(i);
     2616        y1 = quadrilaterals->getY1(i);
     2617        x2 = quadrilaterals->getX2(i);
     2618        y2 = quadrilaterals->getY2(i);
     2619        x3 = quadrilaterals->getX3(i);
     2620        y3 = quadrilaterals->getY3(i);
     2621        x4 = quadrilaterals->getX4(i);
     2622        y4 = quadrilaterals->getY4(i);
     2623        h4 = (y1 - y3) / 4.0;
     2624
     2625        appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x3, y3);
     2626        appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     2627                            x3 - h4, y3 + h4, x1 - h4, y1 - h4, x1, y1);
     2628        appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y2);
     2629        appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     2630                            x2 + h4, y2 - h4, x4 + h4, y4 + h4, x4, y4);
     2631        appearBuf->append ("f\n");
     2632      }
     2633
     2634      Object aStream, resDict;
     2635      double bbox[4];
     2636      bbox[0] = rect->x1;
     2637      bbox[1] = rect->y1;
     2638      bbox[2] = rect->x2;
     2639      bbox[3] = rect->y2;
     2640      createForm(bbox, gTrue, NULL, &aStream);
     2641      delete appearBuf;
     2642
     2643      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     2644      createResourcesDict("Fm0", &aStream, "GS0", 1, "Multiply", &resDict);
     2645      if (ca == 1) {
     2646        createForm(bbox, gFalse, &resDict, &appearance);
     2647      } else {
     2648        createForm(bbox, gTrue, &resDict, &aStream);
     2649        delete appearBuf;
     2650
     2651        appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     2652        createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     2653        createForm(bbox, gFalse, &resDict, &appearance);
     2654      }
     2655      delete appearBuf;
     2656      break;
     2657    }
     2658  }
     2659
     2660  // draw the appearance stream
     2661  appearance.fetch(xref, &obj);
     2662  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
     2663                 rect->x1, rect->y1, rect->x2, rect->y2);
     2664  obj.free();
    21082665}
    21092666
     
    30153572  int dashLength, ff, quadding, comb, nOptions, topIdx, i, j;
    30163573  GBool modified;
     3574  AnnotColor aColor;
    30173575
    30183576  if (widget == NULL || !widget->getField () || !widget->getField ()->getObj ()->isDict ())
     
    30433601    if (mkDict->lookup("BG", &obj1)->isArray() &&
    30443602        obj1.arrayGetLength() > 0) {
    3045       setColor(obj1.getArray(), gTrue, 0);
     3603      AnnotColor aColor = AnnotColor (obj1.getArray());
     3604      setColor(&aColor, gTrue);
    30463605      appearBuf->appendf("0 0 {0:.2f} {1:.2f} re f\n",
    30473606          rect->x2 - rect->x1, rect->y2 - rect->y1);
     
    30913650            case AnnotBorder::borderUnderlined:
    30923651              appearBuf->appendf("{0:.2f} w\n", w);
    3093               setColor(obj1.getArray(), gFalse, 0);
     3652              aColor = AnnotColor (obj1.getArray());
     3653              setColor(&aColor, gFalse);
    30943654              drawCircle(0.5 * dx, 0.5 * dy, r - 0.5 * w, gFalse);
    30953655              break;
     
    30973657            case AnnotBorder::borderInset:
    30983658              appearBuf->appendf("{0:.2f} w\n", 0.5 * w);
    3099               setColor(obj1.getArray(), gFalse, 0);
     3659              aColor = AnnotColor (obj1.getArray());
     3660              setColor(&aColor, gFalse);
    31003661              drawCircle(0.5 * dx, 0.5 * dy, r - 0.25 * w, gFalse);
    3101               setColor(obj1.getArray(), gFalse,
    3102                   border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
     3662              aColor = AnnotColor (obj1.getArray(),
     3663                                   border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
     3664              setColor(&aColor, gFalse);
    31033665              drawCircleTopLeft(0.5 * dx, 0.5 * dy, r - 0.75 * w);
    3104               setColor(obj1.getArray(), gFalse,
    3105                   border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
     3666              aColor = AnnotColor (obj1.getArray(),
     3667                                   border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
     3668              setColor(&aColor, gFalse);
    31063669              drawCircleBottomRight(0.5 * dx, 0.5 * dy, r - 0.75 * w);
    31073670              break;
     
    31213684            case AnnotBorder::borderSolid:
    31223685              appearBuf->appendf("{0:.2f} w\n", w);
    3123               setColor(obj1.getArray(), gFalse, 0);
     3686              aColor = AnnotColor (obj1.getArray());
     3687              setColor(&aColor, gFalse);
    31243688              appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n",
    31253689                  0.5 * w, dx - w, dy - w);
     
    31273691            case AnnotBorder::borderBeveled:
    31283692            case AnnotBorder::borderInset:
    3129               setColor(obj1.getArray(), gTrue,
    3130                   border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
     3693              aColor = AnnotColor (obj1.getArray(),
     3694                                   border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
     3695              setColor(&aColor, gTrue);
    31313696              appearBuf->append("0 0 m\n");
    31323697              appearBuf->appendf("0 {0:.2f} l\n", dy);
     
    31363701              appearBuf->appendf("{0:.2f} {0:.2f} l\n", w);
    31373702              appearBuf->append("f\n");
    3138               setColor(obj1.getArray(), gTrue,
    3139                   border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
     3703              aColor = AnnotColor (obj1.getArray(),
     3704                                   border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
     3705              setColor(&aColor, gTrue);
    31403706              appearBuf->append("0 0 m\n");
    31413707              appearBuf->appendf("{0:.2f} 0 l\n", dx);
     
    31483714            case AnnotBorder::borderUnderlined:
    31493715              appearBuf->appendf("{0:.2f} w\n", w);
    3150               setColor(obj1.getArray(), gFalse, 0);
     3716              aColor = AnnotColor (obj1.getArray());
     3717              setColor(&aColor, gFalse);
    31513718              appearBuf->appendf("0 0 m {0:.2f} 0 l s\n", dx);
    31523719              break;
     
    32113778                dx = rect->x2 - rect->x1;
    32123779                dy = rect->y2 - rect->y1;
    3213                 setColor(obj3.getArray(), gTrue, 0);
     3780                aColor = AnnotColor (obj1.getArray());
     3781                setColor(&aColor, gTrue);
    32143782                drawCircle(0.5 * dx, 0.5 * dy, 0.2 * (dx < dy ? dx : dy),
    32153783                    gTrue);
     
    34213989  Object obj;
    34223990
    3423   // check the flags
    3424   if ((flags & annotFlagHidden) ||
    3425       (printing && !(flags & annotFlagPrint)) ||
    3426       (!printing && (flags & annotFlagNoView))) {
     3991  if (!isVisible (printing))
    34273992    return;
    3428   }
    34293993
    34303994  addDingbatsResource = gFalse;
     
    34874051  type = typeMovie;
    34884052  initialize(xrefA, catalog, dict);
    3489 
    3490   movie = new Movie();
    3491   movie->parseAnnotMovie(this);
    34924053}
    34934054
     
    34954056  if (title)
    34964057    delete title;
    3497   if (fileName)
    3498     delete fileName;
    34994058  delete movie;
    3500 
    3501   if (posterStream && (!posterStream->decRef())) {
    3502     delete posterStream;
    3503   }
    35044059}
    35054060
     
    35154070
    35164071  Object movieDict;
    3517   Object aDict;
    3518 
    3519   // default values
    3520   fileName = NULL;
    3521   width = 0;
    3522   height = 0;
    3523   rotationAngle = 0;
    3524   rate = 1.0;
    3525   volume = 1.0;
    3526   showControls = false;
    3527   repeatMode = repeatModeOnce;
    3528   synchronousPlay = false;
    3529  
    3530   hasFloatingWindow = false;
    3531   isFullscreen = false;
    3532   FWScaleNum = 1;
    3533   FWScaleDenum = 1;
    3534   FWPosX = 0.5;
    3535   FWPosY = 0.5;
    3536 
    35374072  if (dict->lookup("Movie", &movieDict)->isDict()) {
    35384073    Object obj2;
    3539     if (getFileSpecNameForPlatform(movieDict.dictLookup("F", &obj1), &obj2)) {
    3540       fileName = obj2.getString()->copy();
    3541       obj2.free();
    3542     }
    3543     obj1.free();
    3544 
    3545     if (movieDict.dictLookup("Aspect", &obj1)->isArray()) {
    3546       Array* aspect = obj1.getArray();
    3547       if (aspect->getLength() >= 2) {
    3548         Object tmp;
    3549         if( aspect->get(0, &tmp)->isNum() ) {
    3550           width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 );
    3551         }
    3552         tmp.free();
    3553         if( aspect->get(1, &tmp)->isNum() ) {
    3554           height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 );
    3555         }
    3556         tmp.free();
    3557       }
    3558     }
    3559     obj1.free();
    3560 
    3561     if (movieDict.dictLookup("Rotate", &obj1)->isInt()) {
    3562       // round up to 90°
    3563       rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90;
    3564     }
    3565     obj1.free();
    3566 
    3567     //
    3568     // movie poster
    3569     //
    3570     posterType = posterTypeNone;
    3571     posterStream = NULL;
    3572     if (!movieDict.dictLookup("Poster", &obj1)->isNone()) {
    3573       if (obj1.isBool()) {
    3574         GBool v = obj1.getBool();
    3575         if (v)
    3576           posterType = posterTypeFromMovie;
    3577       }
    3578      
    3579       if (obj1.isStream()) {
    3580         posterType = posterTypeStream;
    3581        
    3582         // "copy" stream
    3583         posterStream = obj1.getStream();
    3584         posterStream->incRef();
    3585       }
    3586 
    3587       obj1.free();
    3588     }
    3589 
     4074    dict->lookup("A", &obj2);
     4075    if (obj2.isDict())
     4076      movie = new Movie (&movieDict, &obj2);
     4077    else
     4078      movie = new Movie (&movieDict);
     4079    if (!movie->isOk()) {
     4080      delete movie;
     4081      movie = NULL;
     4082      ok = gFalse;
     4083    }
     4084    obj2.free();
     4085  } else {
     4086    error(-1, "Bad Annot Movie");
     4087    ok = gFalse;
    35904088  }
    35914089  movieDict.free();
    3592 
    3593 
    3594   // activation dictionary parsing ...
    3595 
    3596   if (dict->lookup("A", &aDict)->isDict()) {
    3597     if (!aDict.dictLookup("Start", &obj1)->isNone()) {
    3598       if (obj1.isInt()) {
    3599         // If it is representable as an integer (subject to the implementation limit for
    3600         // integers, as described in Appendix C), it should be specified as such.
    3601 
    3602         start.units = obj1.getInt();
    3603       }
    3604       if (obj1.isString()) {
    3605         // If it is not representable as an integer, it should be specified as an 8-byte
    3606         // string representing a 64-bit twos-complement integer, most significant
    3607         // byte first.
    3608 
    3609         // UNSUPPORTED
    3610       }
    3611 
    3612       if (obj1.isArray()) {
    3613         Array* a = obj1.getArray();
    3614 
    3615         Object tmp;
    3616         a->get(0, &tmp);
    3617         if (tmp.isInt()) {
    3618           start.units = tmp.getInt();
    3619         }
    3620         if (tmp.isString()) {
    3621           // UNSUPPORTED
    3622         }
    3623         tmp.free();
    3624 
    3625         a->get(1, &tmp);
    3626         if (tmp.isInt()) {
    3627           start.units_per_second = tmp.getInt();
    3628         }
    3629         tmp.free();
    3630       }
    3631     }
    3632     obj1.free();
    3633 
    3634     if (!aDict.dictLookup("Duration", &obj1)->isNone()) {
    3635       if (obj1.isInt()) {
    3636         duration.units = obj1.getInt();
    3637       }
    3638       if (obj1.isString()) {
    3639         // UNSUPPORTED
    3640       }
    3641 
    3642       if (obj1.isArray()) {
    3643         Array* a = obj1.getArray();
    3644 
    3645         Object tmp;
    3646         a->get(0, &tmp);
    3647         if (tmp.isInt()) {
    3648           duration.units = tmp.getInt();
    3649         }
    3650         if (tmp.isString()) {
    3651           // UNSUPPORTED
    3652         }
    3653         tmp.free();
    3654 
    3655         a->get(1, &tmp);
    3656         if (tmp.isInt()) {
    3657           duration.units_per_second = tmp.getInt();
    3658         }
    3659         tmp.free();
    3660       }
    3661     }
    3662     obj1.free();
    3663 
    3664     if (aDict.dictLookup("Rate", &obj1)->isNum()) {
    3665       rate = obj1.getNum();
    3666     }
    3667     obj1.free();
    3668 
    3669     if (aDict.dictLookup("Volume", &obj1)->isNum()) {
    3670       volume = obj1.getNum();
    3671     }
    3672     obj1.free();
    3673 
    3674     if (aDict.dictLookup("ShowControls", &obj1)->isBool()) {
    3675       showControls = obj1.getBool();
    3676     }
    3677     obj1.free();
    3678 
    3679     if (aDict.dictLookup("Synchronous", &obj1)->isBool()) {
    3680       synchronousPlay = obj1.getBool();
    3681     }
    3682     obj1.free();
    3683 
    3684     if (aDict.dictLookup("Mode", &obj1)->isName()) {
    3685       char* name = obj1.getName();
    3686       if (!strcmp(name, "Once"))
    3687         repeatMode = repeatModeOnce;
    3688       if (!strcmp(name, "Open"))
    3689         repeatMode = repeatModeOpen;
    3690       if (!strcmp(name, "Repeat"))
    3691         repeatMode = repeatModeRepeat;
    3692       if (!strcmp(name,"Palindrome"))
    3693         repeatMode = repeatModePalindrome;
    3694     }
    3695     obj1.free();
    3696 
    3697     if (aDict.dictLookup("FWScale", &obj1)->isArray()) {
    3698       // the presence of that entry implies that the movie is to be played
    3699       // in a floating window
    3700       hasFloatingWindow = true;
    3701 
    3702       Array* scale = obj1.getArray();
    3703       if (scale->getLength() >= 2) {
    3704         Object tmp;
    3705         if (scale->get(0, &tmp)->isInt()) {
    3706           FWScaleNum = tmp.getInt();
    3707         }
    3708         tmp.free();
    3709         if (scale->get(1, &tmp)->isInt()) {
    3710           FWScaleDenum = tmp.getInt();
    3711         }
    3712         tmp.free();
    3713       }
    3714 
    3715       // detect fullscreen mode
    3716       if ((FWScaleNum == 999) && (FWScaleDenum == 1)) {
    3717         isFullscreen = true;
    3718       }
    3719     }
    3720     obj1.free();
    3721 
    3722     if (aDict.dictLookup("FWPosition", &obj1)->isArray()) {
    3723       Array* pos = obj1.getArray();
    3724       if (pos->getLength() >= 2) {
    3725         Object tmp;
    3726         if (pos->get(0, &tmp)->isNum()) {
    3727           FWPosX = tmp.getNum();
    3728         }
    3729         tmp.free();
    3730         if (pos->get(1, &tmp)->isNum()) {
    3731           FWPosY = tmp.getNum();
    3732         }
    3733         tmp.free();
    3734       }
    3735     }
    3736   }
    3737   aDict.free();
    3738 }
    3739 
    3740 void AnnotMovie::getMovieSize(int& width, int& height) {
    3741   width = this->width;
    3742   height = this->height;
    3743 }
    3744 
    3745 void AnnotMovie::getZoomFactor(int& num, int& denum) {
    3746   num = FWScaleNum;
    3747   denum = FWScaleDenum;
    3748 }
    3749 
     4090}
     4091
     4092void AnnotMovie::draw(Gfx *gfx, GBool printing) {
     4093  Object obj;
     4094
     4095  if (!isVisible (printing))
     4096    return;
     4097
     4098  if (appearance.isNull() && movie->getShowPoster()) {
     4099    int width, height;
     4100    Object poster;
     4101    movie->getPoster(&poster);
     4102    movie->getAspect(&width, &height);
     4103
     4104    if (width != -1 && height != -1 && !poster.isNone()) {
     4105      MemStream *mStream;
     4106
     4107      appearBuf = new GooString ();
     4108      appearBuf->append ("q\n");
     4109      appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height);
     4110      appearBuf->append ("/MImg Do\n");
     4111      appearBuf->append ("Q\n");
     4112
     4113      Object imgDict;
     4114      imgDict.initDict(xref);
     4115      imgDict.dictSet ("MImg", &poster);
     4116
     4117      Object resDict;
     4118      resDict.initDict(xref);
     4119      resDict.dictSet ("XObject", &imgDict);
     4120
     4121      Object formDict, obj1, obj2;
     4122      formDict.initDict(xref);
     4123      formDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
     4124      formDict.dictSet("Subtype", obj1.initName("Form"));
     4125      formDict.dictSet("Name", obj1.initName("FRM"));
     4126      obj1.initArray(xref);
     4127      obj1.arrayAdd(obj2.initInt(0));
     4128      obj1.arrayAdd(obj2.initInt(0));
     4129      obj1.arrayAdd(obj2.initInt(width));
     4130      obj1.arrayAdd(obj2.initInt(height));
     4131      formDict.dictSet("BBox", &obj1);
     4132      obj1.initArray(xref);
     4133      obj1.arrayAdd(obj2.initInt(1));
     4134      obj1.arrayAdd(obj2.initInt(0));
     4135      obj1.arrayAdd(obj2.initInt(0));
     4136      obj1.arrayAdd(obj2.initInt(1));
     4137      obj1.arrayAdd(obj2.initInt(-width / 2));
     4138      obj1.arrayAdd(obj2.initInt(-height / 2));
     4139      formDict.dictSet("Matrix", &obj1);
     4140      formDict.dictSet("Resources", &resDict);
     4141
     4142      Object aStream;
     4143      mStream = new MemStream(copyString(appearBuf->getCString()), 0,
     4144                              appearBuf->getLength(), &formDict);
     4145      mStream->setNeedFree(gTrue);
     4146      aStream.initStream(mStream);
     4147      delete appearBuf;
     4148
     4149      Object objDict;
     4150      objDict.initDict(xref);
     4151      objDict.dictSet ("FRM", &aStream);
     4152
     4153      resDict.initDict(xref);
     4154      resDict.dictSet ("XObject", &objDict);
     4155
     4156      appearBuf = new GooString ();
     4157      appearBuf->append ("q\n");
     4158      appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height);
     4159      appearBuf->append ("q\n");
     4160      appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height);
     4161      appearBuf->appendf ("1 0 0 1 {0:d} {1:d} cm\n", width / 2, height / 2);
     4162      appearBuf->append ("/FRM Do\n");
     4163      appearBuf->append ("Q\n");
     4164      appearBuf->append ("Q\n");
     4165
     4166      double bbox[4];
     4167      bbox[0] = bbox[1] = 0;
     4168      bbox[2] = width;
     4169      bbox[3] = height;
     4170      createForm(bbox, gFalse, &resDict, &appearance);
     4171      delete appearBuf;
     4172    }
     4173    poster.free();
     4174  }
     4175
     4176  // draw the appearance stream
     4177  appearance.fetch(xref, &obj);
     4178  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
     4179                 rect->x1, rect->y1, rect->x2, rect->y2);
     4180  obj.free();
     4181}
    37504182
    37514183//------------------------------------------------------------------------
     
    37734205  if (appearCharacs)
    37744206    delete appearCharacs;
    3775 
    3776   action.free();
     4207  if (action)
     4208    delete action;
     4209
    37774210  additionAction.free();
    37784211}
     
    37874220  obj1.free();
    37884221
    3789   dict->lookup("A", &action);
     4222  action = NULL;
     4223  if (dict->lookup("A", &obj1)->isDict()) {
     4224    action = LinkAction::parseAction(&obj1, catalog->getBaseURI());
     4225    if (action->getKind() == actionRendition && page == 0) {
     4226      error (-1, "Invalid Rendition action: associated screen annotation without P");
     4227      delete action;
     4228      action = NULL;
     4229      ok = gFalse;
     4230    }
     4231  }
    37904232
    37914233  dict->lookup("AA", &additionAction);
     
    39004342  obj1.free();
    39014343
     4344}
     4345
     4346void AnnotGeometry::draw(Gfx *gfx, GBool printing) {
     4347  Object obj;
     4348  double ca = 1;
     4349
     4350  if (!isVisible (printing))
     4351    return;
     4352
     4353  if (appearance.isNull()) {
     4354    ca = opacity;
     4355
     4356    appearBuf = new GooString ();
     4357    appearBuf->append ("q\n");
     4358    if (color)
     4359      setColor(color, gFalse);
     4360
     4361    if (border) {
     4362      int i, dashLength;
     4363      double *dash;
     4364
     4365      switch (border->getStyle()) {
     4366      case AnnotBorder::borderDashed:
     4367        appearBuf->append("[");
     4368        dashLength = border->getDashLength();
     4369        dash = border->getDash();
     4370        for (i = 0; i < dashLength; ++i)
     4371          appearBuf->appendf(" {0:.2f}", dash[i]);
     4372        appearBuf->append(" ] 0 d\n");
     4373        break;
     4374      default:
     4375        appearBuf->append("[] 0 d\n");
     4376        break;
     4377      }
     4378      appearBuf->appendf("{0:.2f} w\n", border->getWidth());
     4379    }
     4380
     4381    if (interiorColor)
     4382      setColor(interiorColor, gTrue);
     4383
     4384    if (type == typeSquare) {
     4385      appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re\n",
     4386                          border->getWidth() / 2.0, border->getWidth() / 2.0,
     4387                          (rect->x2 - rect->x1) - border->getWidth(),
     4388                          (rect->y2 - rect->y1) - border->getWidth());
     4389    } else {
     4390      double width, height;
     4391      double b;
     4392      double x1, y1, x2, y2, x3, y3;
     4393
     4394      width = rect->x2 - rect->x1;
     4395      height = rect->y2 - rect->y1;
     4396      b = border->getWidth() / 2.0;
     4397
     4398      x1 = b;
     4399      y1 = height / 2.0;
     4400      appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y1);
     4401
     4402      y1 += height / 4.0;
     4403      x2 = width / 4.0;
     4404      y2 = height - b;
     4405      x3 = width / 2.0;
     4406      y3 = y2;
     4407      appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     4408                          x1, y1, x2, y2, x3, y3);
     4409      x2 = width - b;
     4410      y2 = y1;
     4411      x1 = x3 + (width / 4.0);
     4412      y1 = y3;
     4413      x3 = x2;
     4414      y3 = height / 2.0;
     4415      appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     4416                          x1, y1, x2, y2, x3, y3);
     4417
     4418      x2 = x1;
     4419      y2 = b;
     4420      x1 = x3;
     4421      y1 = height / 4.0;
     4422      x3 = width / 2.0;
     4423      y3 = b;
     4424      appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     4425                          x1, y1, x2, y2, x3, y3);
     4426
     4427      x2 = b;
     4428      y2 = y1;
     4429      x1 = width / 4.0;
     4430      y1 = b;
     4431      x3 = b;
     4432      y3 = height / 2.0;
     4433      appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
     4434                          x1, y1, x2, y2, x3, y3);
     4435
     4436    }
     4437
     4438    if (interiorColor)
     4439      appearBuf->append ("b\n");
     4440    else
     4441      appearBuf->append ("S\n");
     4442    appearBuf->append ("Q\n");
     4443
     4444    double bbox[4];
     4445    bbox[0] = bbox[1] = 0;
     4446    bbox[2] = rect->x2 - rect->x1;
     4447    bbox[3] = rect->y2 - rect->y1;
     4448    if (ca == 1) {
     4449      createForm(bbox, gFalse, NULL, &appearance);
     4450    } else {
     4451      Object aStream;
     4452
     4453      createForm(bbox, gTrue, NULL, &aStream);
     4454      delete appearBuf;
     4455
     4456      Object resDict;
     4457      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     4458      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     4459      createForm(bbox, gFalse, &resDict, &appearance);
     4460    }
     4461    delete appearBuf;
     4462  }
     4463
     4464  // draw the appearance stream
     4465  appearance.fetch(xref, &obj);
     4466  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
     4467                 rect->x1, rect->y1, rect->x2, rect->y2);
     4468  obj.free();
    39024469}
    39034470
     
    41934760}
    41944761
     4762#define ANNOT_FILE_ATTACHMENT_AP_PUSHPIN                                         \
     4763  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
     4764  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
     4765  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
     4766  "4.301 23 m f\n"                                                               \
     4767  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
     4768  "1 J\n"                                                                        \
     4769  "1 j\n"                                                                        \
     4770  "[] 0.0 d\n"                                                                   \
     4771  "4 M 5 4 m 6 5 l S\n"                                                          \
     4772  "2 w\n"                                                                        \
     4773  "11 14 m 9 12 l 6 12 l 13 5 l 13 8 l 15 10 l 18 11 l 20 11 l 12 19 l 12\n"     \
     4774  "17 l 11 14 l h\n"                                                             \
     4775  "11 14 m S\n"                                                                  \
     4776  "3 w\n"                                                                        \
     4777  "6 5 m 9 8 l S\n"                                                              \
     4778  "0.729412 0.741176 0.713725 RG 2 w\n"                                          \
     4779  "5 5 m 6 6 l S\n"                                                              \
     4780  "2 w\n"                                                                        \
     4781  "11 15 m 9 13 l 6 13 l 13 6 l 13 9 l 15 11 l 18 12 l 20 12 l 12 20 l 12\n"     \
     4782  "18 l 11 15 l h\n"                                                             \
     4783  "11 15 m S\n"                                                                  \
     4784  "3 w\n"                                                                        \
     4785  "6 6 m 9 9 l S\n"
     4786
     4787#define ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP                                       \
     4788  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
     4789  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
     4790  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
     4791  "4.301 23 m f\n"                                                               \
     4792  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
     4793  "1 J\n"                                                                        \
     4794  "1 j\n"                                                                        \
     4795  "[] 0.0 d\n"                                                                   \
     4796  "4 M 16.645 12.035 m 12.418 7.707 l 10.902 6.559 6.402 11.203 8.09 12.562 c\n" \
     4797  "14.133 18.578 l 14.949 19.387 16.867 19.184 17.539 18.465 c 20.551\n"         \
     4798  "15.23 l 21.191 14.66 21.336 12.887 20.426 12.102 c 13.18 4.824 l 12.18\n"     \
     4799  "3.82 6.25 2.566 4.324 4.461 c 3 6.395 3.383 11.438 4.711 12.801 c 9.648\n"    \
     4800  "17.887 l S\n"                                                                 \
     4801  "0.729412 0.741176 0.713725 RG 16.645 13.035 m 12.418 8.707 l\n"               \
     4802  "10.902 7.559 6.402 12.203 8.09 13.562 c\n"                                    \
     4803  "14.133 19.578 l 14.949 20.387 16.867 20.184 17.539 19.465 c 20.551\n"         \
     4804  "16.23 l 21.191 15.66 21.336 13.887 20.426 13.102 c 13.18 5.824 l 12.18\n"     \
     4805  "4.82 6.25 3.566 4.324 5.461 c 3 7.395 3.383 12.438 4.711 13.801 c 9.648\n"    \
     4806  "18.887 l S\n"
     4807
     4808#define ANNOT_FILE_ATTACHMENT_AP_GRAPH                                           \
     4809  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
     4810  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
     4811  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
     4812  "4.301 23 m f\n"                                                               \
     4813  "0.533333 0.541176 0.521569 RG 1 w\n"                                          \
     4814  "1 J\n"                                                                        \
     4815  "0 j\n"                                                                        \
     4816  "[] 0.0 d\n"                                                                   \
     4817  "4 M 18.5 15.5 m 18.5 13.086 l 16.086 15.5 l 18.5 15.5 l h\n"                  \
     4818  "18.5 15.5 m S\n"                                                              \
     4819  "7 7 m 10 11 l 13 9 l 18 15 l S\n"                                             \
     4820  "0.729412 0.741176 0.713725 RG 7 8 m 10 12 l 13 10 l 18 16 l S\n"              \
     4821  "18.5 16.5 m 18.5 14.086 l 16.086 16.5 l 18.5 16.5 l h\n"                      \
     4822  "18.5 16.5 m S\n"                                                              \
     4823  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
     4824  "1 j\n"                                                                        \
     4825  "3 19 m 3 3 l 21 3 l S\n"                                                      \
     4826  "0.729412 0.741176 0.713725 RG 3 20 m 3 4 l 21 4 l S\n"
     4827
     4828#define ANNOT_FILE_ATTACHMENT_AP_TAG                                             \
     4829  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
     4830  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
     4831  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
     4832  "4.301 23 m f\n"                                                               \
     4833  "0.533333 0.541176 0.521569 RG 0.999781 w\n"                                   \
     4834  "1 J\n"                                                                        \
     4835  "1 j\n"                                                                        \
     4836  "[] 0.0 d\n"                                                                   \
     4837  "4 M q 1 0 0 -1 0 24 cm\n"                                                     \
     4838  "8.492 8.707 m 8.492 9.535 7.82 10.207 6.992 10.207 c 6.164 10.207 5.492\n"    \
     4839  "9.535 5.492 8.707 c 5.492 7.879 6.164 7.207 6.992 7.207 c 7.82 7.207\n"       \
     4840  "8.492 7.879 8.492 8.707 c h\n"                                                \
     4841  "8.492 8.707 m S Q\n"                                                          \
     4842  "2 w\n"                                                                        \
     4843  "20.078 11.414 m 20.891 10.602 20.785 9.293 20.078 8.586 c 14.422 2.93 l\n"    \
     4844  "13.715 2.223 12.301 2.223 11.594 2.93 c 3.816 10.707 l 3.109 11.414\n"        \
     4845  "2.402 17.781 3.816 19.195 c 5.23 20.609 11.594 19.902 12.301 19.195 c\n"      \
     4846  "20.078 11.414 l h\n"                                                          \
     4847  "20.078 11.414 m S\n"                                                          \
     4848  "0.729412 0.741176 0.713725 RG 20.078 12.414 m\n"                              \
     4849  "20.891 11.605 20.785 10.293 20.078 9.586 c 14.422 3.93 l\n"                   \
     4850  "13.715 3.223 12.301 3.223 11.594 3.93 c 3.816 11.707 l 3.109 12.414\n"        \
     4851  "2.402 18.781 3.816 20.195 c 5.23 21.609 11.594 20.902 12.301 20.195 c\n"      \
     4852  "20.078 12.414 l h\n"                                                          \
     4853  "20.078 12.414 m S\n"                                                          \
     4854  "0.533333 0.541176 0.521569 RG 1 w\n"                                          \
     4855  "0 j\n"                                                                        \
     4856  "11.949 13.184 m 16.191 8.941 l S\n"                                           \
     4857  "0.729412 0.741176 0.713725 RG 11.949 14.184 m 16.191 9.941 l S\n"             \
     4858  "0.533333 0.541176 0.521569 RG 14.07 6.82 m 9.828 11.062 l S\n"                \
     4859  "0.729412 0.741176 0.713725 RG 14.07 7.82 m 9.828 12.062 l S\n"                \
     4860  "0.533333 0.541176 0.521569 RG 6.93 15.141 m 8 20 14.27 20.5 16 20.5 c\n"      \
     4861  "18.094 20.504 19.5 20 19.5 18 c 19.5 16.699 20.91 16.418 22.5 16.5 c S\n"     \
     4862  "0.729412 0.741176 0.713725 RG 0.999781 w\n"                                   \
     4863  "1 j\n"                                                                        \
     4864  "q 1 0 0 -1 0 24 cm\n"                                                         \
     4865  "8.492 7.707 m 8.492 8.535 7.82 9.207 6.992 9.207 c 6.164 9.207 5.492\n"       \
     4866  "8.535 5.492 7.707 c 5.492 6.879 6.164 6.207 6.992 6.207 c 7.82 6.207\n"       \
     4867  "8.492 6.879 8.492 7.707 c h\n"                                                \
     4868  "8.492 7.707 m S Q\n"                                                          \
     4869  "1 w\n"                                                                        \
     4870  "0 j\n"                                                                        \
     4871  "6.93 16.141 m 8 21 14.27 21.5 16 21.5 c 18.094 21.504 19.5 21 19.5 19 c\n"    \
     4872  "19.5 17.699 20.91 17.418 22.5 17.5 c S\n"
     4873
     4874void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) {
     4875  Object obj;
     4876  double ca = 1;
     4877
     4878  if (!isVisible (printing))
     4879    return;
     4880
     4881  if (appearance.isNull()) {
     4882    ca = opacity;
     4883
     4884    appearBuf = new GooString ();
     4885
     4886    appearBuf->append ("q\n");
     4887    if (color)
     4888      setColor(color, gTrue);
     4889    else
     4890      appearBuf->append ("1 1 1 rg\n");
     4891    if (!name->cmp("PushPin"))
     4892      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PUSHPIN);
     4893    else if (!name->cmp("Paperclip"))
     4894      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP);
     4895    else if (!name->cmp("Graph"))
     4896      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_GRAPH);
     4897    else if (!name->cmp("Tag"))
     4898      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_TAG);
     4899    appearBuf->append ("Q\n");
     4900
     4901    double bbox[4];
     4902    bbox[0] = bbox[1] = 0;
     4903    bbox[2] = bbox[3] = 24;
     4904    if (ca == 1) {
     4905      createForm (bbox, gFalse, NULL, &appearance);
     4906    } else {
     4907      Object aStream;
     4908
     4909      createForm (bbox, gTrue, NULL, &aStream);
     4910      delete appearBuf;
     4911
     4912      Object resDict;
     4913      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     4914      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     4915      createForm(bbox, gFalse, &resDict, &appearance);
     4916    }
     4917    delete appearBuf;
     4918  }
     4919
     4920  // draw the appearance stream
     4921  appearance.fetch(xref, &obj);
     4922  gfx->drawAnnot(&obj, border, color,
     4923                 rect->x1, rect->y1, rect->x2, rect->y2);
     4924  obj.free();
     4925}
     4926
    41954927//------------------------------------------------------------------------
    41964928// AnnotSound
     
    42414973  }
    42424974  obj1.free();
     4975}
     4976
     4977#define ANNOT_SOUND_AP_SPEAKER                                               \
     4978  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
     4979  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
     4980  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
     4981  "4.301 23 m f\n"                                                           \
     4982  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
     4983  "0 J\n"                                                                    \
     4984  "1 j\n"                                                                    \
     4985  "[] 0.0 d\n"                                                               \
     4986  "4 M 4 14 m 4.086 8.043 l 7 8 l 11 4 l 11 18 l 7 14 l 4 14 l h\n"          \
     4987  "4 14 m S\n"                                                               \
     4988  "1 w\n"                                                                    \
     4989  "1 J\n"                                                                    \
     4990  "0 j\n"                                                                    \
     4991  "13.699 15.398 m 14.699 13.398 14.699 9.398 13.699 7.398 c S\n"            \
     4992  "18.199 19.398 m 21.199 17.398 21.199 5.398 18.199 3.398 c S\n"            \
     4993  "16 17.398 m 18 16.398 18 7.398 16 5.398 c S\n"                            \
     4994  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
     4995  "0 J\n"                                                                    \
     4996  "1 j\n"                                                                    \
     4997  "4 15 m 4.086 9.043 l 7 9 l 11 5 l 11 19 l 7 15 l 4 15 l h\n"              \
     4998  "4 15 m S\n"                                                               \
     4999  "1 w\n"                                                                    \
     5000  "1 J\n"                                                                    \
     5001  "0 j\n"                                                                    \
     5002  "13.699 16 m 14.699 14 14.699 10 13.699 8 c S\n"                           \
     5003  "18.199 20 m 21.199 18 21.199 6 18.199 4 c S\n"                            \
     5004  "16 18 m 18 17 18 8 16 6 c S\n"
     5005
     5006#define ANNOT_SOUND_AP_MIC                                                        \
     5007  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
     5008  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
     5009  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
     5010  "4.301 23 m f\n"                                                                \
     5011  "0.533333 0.541176 0.521569 RG 2 w\n"                                           \
     5012  "1 J\n"                                                                         \
     5013  "0 j\n"                                                                         \
     5014  "[] 0.0 d\n"                                                                    \
     5015  "4 M 12 20 m 12 20 l 13.656 20 15 18.656 15 17 c 15 13 l 15 11.344 13.656 10\n" \
     5016  "12 10 c 12 10 l 10.344 10 9 11.344 9 13 c 9 17 l 9 18.656 10.344 20 12\n"      \
     5017  "20 c h\n"                                                                      \
     5018  "12 20 m S\n"                                                                   \
     5019  "1 w\n"                                                                         \
     5020  "17.5 14.5 m 17.5 11.973 l 17.5 8.941 15.047 6.5 12 6.5 c 8.953 6.5 6.5\n"      \
     5021  "8.941 6.5 11.973 c 6.5 14.5 l S\n"                                             \
     5022  "2 w\n"                                                                         \
     5023  "0 J\n"                                                                         \
     5024  "12 6.52 m 12 3 l S\n"                                                          \
     5025  "1 J\n"                                                                         \
     5026  "8 3 m 16 3 l S\n"                                                              \
     5027  "0.729412 0.741176 0.713725 RG 12 21 m 12 21 l 13.656 21 15 19.656 15 18 c\n"   \
     5028  "15 14 l 15 12.344 13.656 11 12 11 c 12 11 l 10.344 11 9 12.344 9 14 c\n"       \
     5029  "9 18 l 9 19.656 10.344 21 12 21 c h\n"                                         \
     5030  "12 21 m S\n"                                                                   \
     5031  "1 w\n"                                                                         \
     5032  "17.5 15.5 m 17.5 12.973 l 17.5 9.941 15.047 7.5 12 7.5 c 8.953 7.5 6.5\n"      \
     5033  "9.941 6.5 12.973 c 6.5 15.5 l S\n"                                             \
     5034  "2 w\n"                                                                         \
     5035  "0 J\n"                                                                         \
     5036  "12 7.52 m 12 4 l S\n"                                                          \
     5037  "1 J\n"                                                                         \
     5038  "8 4 m 16 4 l S\n"
     5039
     5040void AnnotSound::draw(Gfx *gfx, GBool printing) {
     5041  Object obj;
     5042  double ca = 1;
     5043
     5044  if (!isVisible (printing))
     5045    return;
     5046
     5047  if (appearance.isNull()) {
     5048    ca = opacity;
     5049
     5050    appearBuf = new GooString ();
     5051
     5052    appearBuf->append ("q\n");
     5053    if (color)
     5054      setColor(color, gTrue);
     5055    else
     5056      appearBuf->append ("1 1 1 rg\n");
     5057    if (!name->cmp("Speaker"))
     5058      appearBuf->append (ANNOT_SOUND_AP_SPEAKER);
     5059    else if (!name->cmp("Mic"))
     5060      appearBuf->append (ANNOT_SOUND_AP_MIC);
     5061    appearBuf->append ("Q\n");
     5062
     5063    double bbox[4];
     5064    bbox[0] = bbox[1] = 0;
     5065    bbox[2] = bbox[3] = 24;
     5066    if (ca == 1) {
     5067      createForm(bbox, gFalse, NULL, &appearance);
     5068    } else {
     5069      Object aStream, resDict;
     5070
     5071      createForm(bbox, gTrue, NULL, &aStream);
     5072      delete appearBuf;
     5073
     5074      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
     5075      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
     5076      createForm(bbox, gFalse, &resDict, &appearance);
     5077    }
     5078    delete appearBuf;
     5079  }
     5080
     5081  // draw the appearance stream
     5082  appearance.fetch(xref, &obj);
     5083  gfx->drawAnnot(&obj, border, color,
     5084                 rect->x1, rect->y1, rect->x2, rect->y2);
     5085  obj.free();
    42435086}
    42445087
Note: See TracChangeset for help on using the changeset viewer.