blob: b1fa2f566d639246047ad1157cd445bf3516fbdf [file] [log] [blame] [edit]
//========================================================================
//
// SplashState.cc
//
//========================================================================
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2009 Thomas Freitag <Thomas.Freitag@alfa.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================
#include <config.h>
#ifdef USE_GCC_PRAGMAS
#pragma implementation
#endif
#include <string.h>
#include "goo/gmem.h"
#include "SplashPattern.h"
#include "SplashScreen.h"
#include "SplashClip.h"
#include "SplashBitmap.h"
#include "SplashState.h"
//------------------------------------------------------------------------
// SplashState
//------------------------------------------------------------------------
// number of components in each color mode
int splashColorModeNComps[] = {
1, 1, 3, 3, 4
#if SPLASH_CMYK
,4
#endif
};
SplashState::SplashState(int width, int height, GBool vectorAntialias,
SplashScreenParams *screenParams) {
SplashColor color;
matrix[0] = 1; matrix[1] = 0;
matrix[2] = 0; matrix[3] = 1;
matrix[4] = 0; matrix[5] = 0;
memset(&color, 0, sizeof(SplashColor));
strokePattern = new SplashSolidColor(color);
fillPattern = new SplashSolidColor(color);
screen = new SplashScreen(screenParams);
blendFunc = NULL;
strokeAlpha = 1;
fillAlpha = 1;
lineWidth = 0;
lineCap = splashLineCapButt;
lineJoin = splashLineJoinMiter;
miterLimit = 10;
flatness = 1;
lineDash = NULL;
lineDashLength = 0;
lineDashPhase = 0;
strokeAdjust = gFalse;
clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
softMask = NULL;
deleteSoftMask = gFalse;
inNonIsolatedGroup = gFalse;
next = NULL;
}
SplashState::SplashState(int width, int height, GBool vectorAntialias,
SplashScreen *screenA) {
SplashColor color;
matrix[0] = 1; matrix[1] = 0;
matrix[2] = 0; matrix[3] = 1;
matrix[4] = 0; matrix[5] = 0;
memset(&color, 0, sizeof(SplashColor));
strokePattern = new SplashSolidColor(color);
fillPattern = new SplashSolidColor(color);
screen = screenA->copy();
blendFunc = NULL;
strokeAlpha = 1;
fillAlpha = 1;
lineWidth = 0;
lineCap = splashLineCapButt;
lineJoin = splashLineJoinMiter;
miterLimit = 10;
flatness = 1;
lineDash = NULL;
lineDashLength = 0;
lineDashPhase = 0;
strokeAdjust = gFalse;
clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
softMask = NULL;
deleteSoftMask = gFalse;
inNonIsolatedGroup = gFalse;
next = NULL;
}
SplashState::SplashState(SplashState *state) {
memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord));
strokePattern = state->strokePattern->copy();
fillPattern = state->fillPattern->copy();
screen = state->screen->copy();
blendFunc = state->blendFunc;
strokeAlpha = state->strokeAlpha;
fillAlpha = state->fillAlpha;
lineWidth = state->lineWidth;
lineCap = state->lineCap;
lineJoin = state->lineJoin;
miterLimit = state->miterLimit;
flatness = state->flatness;
if (state->lineDash) {
lineDashLength = state->lineDashLength;
lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
} else {
lineDash = NULL;
lineDashLength = 0;
}
lineDashPhase = state->lineDashPhase;
strokeAdjust = state->strokeAdjust;
clip = state->clip->copy();
softMask = state->softMask;
deleteSoftMask = gFalse;
inNonIsolatedGroup = state->inNonIsolatedGroup;
next = NULL;
}
SplashState::~SplashState() {
delete strokePattern;
delete fillPattern;
delete screen;
gfree(lineDash);
delete clip;
if (deleteSoftMask && softMask) {
delete softMask;
}
}
void SplashState::setStrokePattern(SplashPattern *strokePatternA) {
delete strokePattern;
strokePattern = strokePatternA;
}
void SplashState::setFillPattern(SplashPattern *fillPatternA) {
delete fillPattern;
fillPattern = fillPatternA;
}
void SplashState::setScreen(SplashScreen *screenA) {
delete screen;
screen = screenA;
}
void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
SplashCoord lineDashPhaseA) {
gfree(lineDash);
lineDashLength = lineDashLengthA;
if (lineDashLength > 0) {
lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
} else {
lineDash = NULL;
}
lineDashPhase = lineDashPhaseA;
}
void SplashState::setSoftMask(SplashBitmap *softMaskA) {
if (deleteSoftMask) {
delete softMask;
}
softMask = softMaskA;
deleteSoftMask = gTrue;
}