"Fossies" - the Fresh Open Source Software Archive

Member "xpdf-4.04/splash/SplashState.cc" (18 Apr 2022, 9521 Bytes) of package /linux/misc/xpdf-4.04.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "SplashState.cc" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 4.03_vs_4.04.

    1 //========================================================================
    2 //
    3 // SplashState.cc
    4 //
    5 // Copyright 2003-2013 Glyph & Cog, LLC
    6 //
    7 //========================================================================
    8 
    9 #include <aconf.h>
   10 
   11 #ifdef USE_GCC_PRAGMAS
   12 #pragma implementation
   13 #endif
   14 
   15 #include <string.h>
   16 #include "gmem.h"
   17 #include "gmempp.h"
   18 #include "SplashPattern.h"
   19 #include "SplashScreen.h"
   20 #include "SplashClip.h"
   21 #include "SplashBitmap.h"
   22 #include "SplashState.h"
   23 
   24 //------------------------------------------------------------------------
   25 // SplashState
   26 //------------------------------------------------------------------------
   27 
   28 // number of components in each color mode
   29 int splashColorModeNComps[] = {
   30   1, 1, 3, 3
   31 #if SPLASH_CMYK
   32   , 4
   33 #endif
   34 };
   35 
   36 SplashState::SplashState(int width, int height, GBool vectorAntialias,
   37              SplashScreenParams *screenParams) {
   38   SplashColor color;
   39   int i;
   40 
   41   matrix[0] = 1;  matrix[1] = 0;
   42   matrix[2] = 0;  matrix[3] = 1;
   43   matrix[4] = 0;  matrix[5] = 0;
   44   memset(&color, 0, sizeof(SplashColor));
   45   strokePattern = new SplashSolidColor(color);
   46   fillPattern = new SplashSolidColor(color);
   47   screen = new SplashScreen(screenParams);
   48   blendFunc = NULL;
   49   strokeAlpha = 1;
   50   fillAlpha = 1;
   51   lineWidth = 1;
   52   lineCap = splashLineCapButt;
   53   lineJoin = splashLineJoinMiter;
   54   miterLimit = 10;
   55   flatness = 1;
   56   lineDash = NULL;
   57   lineDashLength = 0;
   58   lineDashPhase = 0;
   59   strokeAdjust = splashStrokeAdjustOff;
   60   clip = new SplashClip(0, 0, width, height);
   61   clipIsShared = gFalse;
   62   softMask = NULL;
   63   deleteSoftMask = gFalse;
   64   inNonIsolatedGroup = gFalse;
   65   inKnockoutGroup = gFalse;
   66 #if SPLASH_CMYK
   67   rgbTransferR = (Guchar *)gmalloc(8 * 256);
   68   rgbTransferG = rgbTransferR + 256;
   69   rgbTransferB = rgbTransferG + 256;
   70   grayTransfer = rgbTransferB + 256;
   71   cmykTransferC = grayTransfer + 256;
   72   cmykTransferM = cmykTransferC + 256;
   73   cmykTransferY = cmykTransferM + 256;
   74   cmykTransferK = cmykTransferY + 256;
   75 #else
   76   rgbTransferR = (Guchar *)gmalloc(4 * 256);
   77   rgbTransferG = rgbTransferR + 256;
   78   rgbTransferB = rgbTransferG + 256;
   79   grayTransfer = rgbTransferB + 256;
   80 #endif
   81   for (i = 0; i < 256; ++i) {
   82     rgbTransferR[i] = (Guchar)i;
   83     rgbTransferG[i] = (Guchar)i;
   84     rgbTransferB[i] = (Guchar)i;
   85     grayTransfer[i] = (Guchar)i;
   86 #if SPLASH_CMYK
   87     cmykTransferC[i] = (Guchar)i;
   88     cmykTransferM[i] = (Guchar)i;
   89     cmykTransferY[i] = (Guchar)i;
   90     cmykTransferK[i] = (Guchar)i;
   91 #endif
   92   }
   93   transferIsShared = gFalse;
   94   overprintMask = 0xffffffff;
   95   enablePathSimplification = gFalse;
   96   next = NULL;
   97 }
   98 
   99 SplashState::SplashState(int width, int height, GBool vectorAntialias,
  100              SplashScreen *screenA) {
  101   SplashColor color;
  102   int i;
  103 
  104   matrix[0] = 1;  matrix[1] = 0;
  105   matrix[2] = 0;  matrix[3] = 1;
  106   matrix[4] = 0;  matrix[5] = 0;
  107   memset(&color, 0, sizeof(SplashColor));
  108   strokePattern = new SplashSolidColor(color);
  109   fillPattern = new SplashSolidColor(color);
  110   screen = screenA->copy();
  111   blendFunc = NULL;
  112   strokeAlpha = 1;
  113   fillAlpha = 1;
  114   lineWidth = 1;
  115   lineCap = splashLineCapButt;
  116   lineJoin = splashLineJoinMiter;
  117   miterLimit = 10;
  118   flatness = 1;
  119   lineDash = NULL;
  120   lineDashLength = 0;
  121   lineDashPhase = 0;
  122   strokeAdjust = splashStrokeAdjustOff;
  123   clip = new SplashClip(0, 0, width, height);
  124   clipIsShared = gFalse;
  125   softMask = NULL;
  126   deleteSoftMask = gFalse;
  127   inNonIsolatedGroup = gFalse;
  128   inKnockoutGroup = gFalse;
  129 #if SPLASH_CMYK
  130   rgbTransferR = (Guchar *)gmalloc(8 * 256);
  131   rgbTransferG = rgbTransferR + 256;
  132   rgbTransferB = rgbTransferG + 256;
  133   grayTransfer = rgbTransferB + 256;
  134   cmykTransferC = grayTransfer + 256;
  135   cmykTransferM = cmykTransferC + 256;
  136   cmykTransferY = cmykTransferM + 256;
  137   cmykTransferK = cmykTransferY + 256;
  138 #else
  139   rgbTransferR = (Guchar *)gmalloc(4 * 256);
  140   rgbTransferG = rgbTransferR + 256;
  141   rgbTransferB = rgbTransferG + 256;
  142   grayTransfer = rgbTransferB + 256;
  143 #endif
  144   for (i = 0; i < 256; ++i) {
  145     rgbTransferR[i] = (Guchar)i;
  146     rgbTransferG[i] = (Guchar)i;
  147     rgbTransferB[i] = (Guchar)i;
  148     grayTransfer[i] = (Guchar)i;
  149 #if SPLASH_CMYK
  150     cmykTransferC[i] = (Guchar)i;
  151     cmykTransferM[i] = (Guchar)i;
  152     cmykTransferY[i] = (Guchar)i;
  153     cmykTransferK[i] = (Guchar)i;
  154 #endif
  155   }
  156   transferIsShared = gFalse;
  157   overprintMask = 0xffffffff;
  158   enablePathSimplification = gFalse;
  159   next = NULL;
  160 }
  161 
  162 SplashState::SplashState(SplashState *state) {
  163   memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord));
  164   strokePattern = state->strokePattern->copy();
  165   fillPattern = state->fillPattern->copy();
  166   screen = state->screen->copy();
  167   blendFunc = state->blendFunc;
  168   strokeAlpha = state->strokeAlpha;
  169   fillAlpha = state->fillAlpha;
  170   lineWidth = state->lineWidth;
  171   lineCap = state->lineCap;
  172   lineJoin = state->lineJoin;
  173   miterLimit = state->miterLimit;
  174   flatness = state->flatness;
  175   if (state->lineDash) {
  176     lineDashLength = state->lineDashLength;
  177     lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
  178     memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
  179   } else {
  180     lineDash = NULL;
  181     lineDashLength = 0;
  182   }
  183   lineDashPhase = state->lineDashPhase;
  184   strokeAdjust = state->strokeAdjust;
  185   clip = state->clip;
  186   clipIsShared = gTrue;
  187   softMask = state->softMask;
  188   deleteSoftMask = gFalse;
  189   inNonIsolatedGroup = state->inNonIsolatedGroup;
  190   inKnockoutGroup = state->inKnockoutGroup;
  191   rgbTransferR = state->rgbTransferR;
  192   rgbTransferG = state->rgbTransferG;
  193   rgbTransferB = state->rgbTransferB;
  194   grayTransfer = state->grayTransfer;
  195 #if SPLASH_CMYK
  196   cmykTransferC = state->cmykTransferC;
  197   cmykTransferM = state->cmykTransferM;
  198   cmykTransferY = state->cmykTransferY;
  199   cmykTransferK = state->cmykTransferK;
  200 #endif
  201   transferIsShared = gTrue;
  202   overprintMask = state->overprintMask;
  203   enablePathSimplification = state->enablePathSimplification;
  204   next = NULL;
  205 }
  206 
  207 SplashState::~SplashState() {
  208   delete strokePattern;
  209   delete fillPattern;
  210   delete screen;
  211   gfree(lineDash);
  212   if (!clipIsShared) {
  213     delete clip;
  214   }
  215   if (!transferIsShared) {
  216     gfree(rgbTransferR);
  217   }
  218   if (deleteSoftMask && softMask) {
  219     delete softMask;
  220   }
  221 }
  222 
  223 void SplashState::setStrokePattern(SplashPattern *strokePatternA) {
  224   delete strokePattern;
  225   strokePattern = strokePatternA;
  226 }
  227 
  228 void SplashState::setFillPattern(SplashPattern *fillPatternA) {
  229   delete fillPattern;
  230   fillPattern = fillPatternA;
  231 }
  232 
  233 void SplashState::setScreen(SplashScreen *screenA) {
  234   delete screen;
  235   screen = screenA;
  236 }
  237 
  238 void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
  239                   SplashCoord lineDashPhaseA) {
  240   gfree(lineDash);
  241   lineDashLength = lineDashLengthA;
  242   if (lineDashLength > 0) {
  243     lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
  244     memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
  245   } else {
  246     lineDash = NULL;
  247   }
  248   lineDashPhase = lineDashPhaseA;
  249 }
  250 
  251 GBool SplashState::lineDashContainsZeroLengthDashes() {
  252   int i;
  253 
  254   if (lineDashLength == 0) {
  255     return gFalse;
  256   }
  257 
  258   // if the line dash array has an odd number of elements, we need to
  259   // check all of the elements; if the length is even, we only need to
  260   // check even-number elements
  261   if (lineDashLength & 1) {
  262     for (i = 0; i < lineDashLength; ++i) {
  263       if (lineDash[i] == 0) {
  264     return gTrue;
  265       }
  266     }
  267   } else {
  268     for (i = 0; i < lineDashLength; i += 2) {
  269       if (lineDash[i] == 0) {
  270     return gTrue;
  271       }
  272     }
  273   }
  274   return gFalse;
  275 }
  276 
  277 void SplashState::clipResetToRect(SplashCoord x0, SplashCoord y0,
  278                   SplashCoord x1, SplashCoord y1) {
  279   if (clipIsShared) {
  280     clip = clip->copy();
  281     clipIsShared = gFalse;
  282   }
  283   clip->resetToRect(x0, y0, x1, y1);
  284 }
  285 
  286 SplashError SplashState::clipToRect(SplashCoord x0, SplashCoord y0,
  287                     SplashCoord x1, SplashCoord y1) {
  288   if (clipIsShared) {
  289     clip = clip->copy();
  290     clipIsShared = gFalse;
  291   }
  292   return clip->clipToRect(x0, y0, x1, y1);
  293 }
  294 
  295 SplashError SplashState::clipToPath(SplashPath *path, GBool eo) {
  296   if (clipIsShared) {
  297     clip = clip->copy();
  298     clipIsShared = gFalse;
  299   }
  300   return clip->clipToPath(path, matrix, flatness, eo,
  301               enablePathSimplification, strokeAdjust);
  302 }
  303 
  304 void SplashState::setSoftMask(SplashBitmap *softMaskA, GBool deleteBitmap) {
  305   if (deleteSoftMask) {
  306     delete softMask;
  307   }
  308   softMask = softMaskA;
  309   deleteSoftMask = deleteBitmap;
  310 }
  311 
  312 void SplashState::setTransfer(Guchar *red, Guchar *green, Guchar *blue,
  313                   Guchar *gray) {
  314 #if SPLASH_CMYK
  315   int i;
  316 #endif
  317 
  318   if (transferIsShared) {
  319 #if SPLASH_CMYK
  320     rgbTransferR = (Guchar *)gmalloc(8 * 256);
  321     rgbTransferG = rgbTransferR + 256;
  322     rgbTransferB = rgbTransferG + 256;
  323     grayTransfer = rgbTransferB + 256;
  324     cmykTransferC = grayTransfer + 256;
  325     cmykTransferM = cmykTransferC + 256;
  326     cmykTransferY = cmykTransferM + 256;
  327     cmykTransferK = cmykTransferY + 256;
  328 #else
  329     rgbTransferR = (Guchar *)gmalloc(4 * 256);
  330     rgbTransferG = rgbTransferR + 256;
  331     rgbTransferB = rgbTransferG + 256;
  332     grayTransfer = rgbTransferB + 256;
  333 #endif
  334     transferIsShared = gFalse;
  335   }
  336   memcpy(rgbTransferR, red, 256);
  337   memcpy(rgbTransferG, green, 256);
  338   memcpy(rgbTransferB, blue, 256);
  339   memcpy(grayTransfer, gray, 256);
  340 #if SPLASH_CMYK
  341   for (i = 0; i < 256; ++i) {
  342     cmykTransferC[i] = (Guchar)(255 - rgbTransferR[255 - i]);
  343     cmykTransferM[i] = (Guchar)(255 - rgbTransferG[255 - i]);
  344     cmykTransferY[i] = (Guchar)(255 - rgbTransferB[255 - i]);
  345     cmykTransferK[i] = (Guchar)(255 - grayTransfer[255 - i]);
  346   }
  347 #endif
  348 }
  349