⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfxstate.cc

📁 swf文件查看工具,能够看flash文件的格式
💻 CC
📖 第 1 页 / 共 5 页
字号:
//========================================================================//// GfxState.cc//// Copyright 1996-2003 Glyph & Cog, LLC////========================================================================#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma implementation#endif#include <stddef.h>#include <math.h>#include <string.h>#include "gmem.h"#include "Error.h"#include "Object.h"#include "Array.h"#include "Page.h"#include "GfxState.h"#include "cmyk.h"//------------------------------------------------------------------------static inline GfxColorComp clip01(GfxColorComp x) {  return (x < 0) ? 0 : (x > gfxColorComp1) ? gfxColorComp1 : x;}static inline double clip01(double x) {  return (x < 0) ? 0 : (x > 1) ? 1 : x;}//------------------------------------------------------------------------struct GfxBlendModeInfo {  char *name;  GfxBlendMode mode;};static GfxBlendModeInfo gfxBlendModeNames[] = {  { "Normal",     gfxBlendNormal },  { "Compatible", gfxBlendNormal },  { "Multiply",   gfxBlendMultiply },  { "Screen",     gfxBlendScreen },  { "Overlay",    gfxBlendOverlay },  { "Darken",     gfxBlendDarken },  { "Lighten",    gfxBlendLighten },  { "ColorDodge", gfxBlendColorDodge },  { "ColorBurn",  gfxBlendColorBurn },  { "HardLight",  gfxBlendHardLight },  { "SoftLight",  gfxBlendSoftLight },  { "Difference", gfxBlendDifference },  { "Exclusion",  gfxBlendExclusion },  { "Hue",        gfxBlendHue },  { "Saturation", gfxBlendSaturation },  { "Color",      gfxBlendColor },  { "Luminosity", gfxBlendLuminosity }};#define nGfxBlendModeNames \          ((int)((sizeof(gfxBlendModeNames) / sizeof(GfxBlendModeInfo))))//------------------------------------------------------------------------// NB: This must match the GfxColorSpaceMode enum defined in// GfxState.hstatic char *gfxColorSpaceModeNames[] = {  "DeviceGray",  "CalGray",  "DeviceRGB",  "CalRGB",  "DeviceCMYK",  "Lab",  "ICCBased",  "Indexed",  "Separation",  "DeviceN",  "Pattern"};#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *)))//------------------------------------------------------------------------// GfxColorSpace//------------------------------------------------------------------------GfxColorSpace::GfxColorSpace() {}GfxColorSpace::~GfxColorSpace() {}GfxColorSpace *GfxColorSpace::parse(Object *csObj) {  GfxColorSpace *cs;  Object obj1;  cs = NULL;  if (csObj->isName()) {    if (csObj->isName("DeviceGray") || csObj->isName("G")) {      cs = new GfxDeviceGrayColorSpace();    } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) {      cs = new GfxDeviceRGBColorSpace();    } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) {      cs = new GfxDeviceCMYKColorSpace();    } else if (csObj->isName("Pattern")) {      cs = new GfxPatternColorSpace(NULL);    } else {      error(-1, "Bad color space '%s'", csObj->getName());    }  } else if (csObj->isArray()) {    csObj->arrayGet(0, &obj1);    if (obj1.isName("DeviceGray") || obj1.isName("G")) {      cs = new GfxDeviceGrayColorSpace();    } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) {      cs = new GfxDeviceRGBColorSpace();    } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) {      cs = new GfxDeviceCMYKColorSpace();    } else if (obj1.isName("CalGray")) {      cs = GfxCalGrayColorSpace::parse(csObj->getArray());    } else if (obj1.isName("CalRGB")) {      cs = GfxCalRGBColorSpace::parse(csObj->getArray());    } else if (obj1.isName("Lab")) {      cs = GfxLabColorSpace::parse(csObj->getArray());    } else if (obj1.isName("ICCBased")) {      cs = GfxICCBasedColorSpace::parse(csObj->getArray());    } else if (obj1.isName("Indexed") || obj1.isName("I")) {      cs = GfxIndexedColorSpace::parse(csObj->getArray());    } else if (obj1.isName("Separation")) {      cs = GfxSeparationColorSpace::parse(csObj->getArray());    } else if (obj1.isName("DeviceN")) {      cs = GfxDeviceNColorSpace::parse(csObj->getArray());    } else if (obj1.isName("Pattern")) {      cs = GfxPatternColorSpace::parse(csObj->getArray());    } else {      error(-1, "Bad color space");    }    obj1.free();  } else {    error(-1, "Bad color space - expected name or array");  }  return cs;}void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,				     int maxImgPixel) {  int i;  for (i = 0; i < getNComps(); ++i) {    decodeLow[i] = 0;    decodeRange[i] = 1;  }}int GfxColorSpace::getNumColorSpaceModes() {  return nGfxColorSpaceModes;}char *GfxColorSpace::getColorSpaceModeName(int idx) {  return gfxColorSpaceModeNames[idx];}//------------------------------------------------------------------------// GfxDeviceGrayColorSpace//------------------------------------------------------------------------GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() {}GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() {}GfxColorSpace *GfxDeviceGrayColorSpace::copy() {  return new GfxDeviceGrayColorSpace();}void GfxDeviceGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) {  *gray = clip01(color->c[0]);}void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {  rgb->r = rgb->g = rgb->b = clip01(color->c[0]);}void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {  cmyk->c = cmyk->m = cmyk->y = 0;  cmyk->k = clip01(gfxColorComp1 - color->c[0]);}void GfxDeviceGrayColorSpace::getDefaultColor(GfxColor *color) {  color->c[0] = 0;}//------------------------------------------------------------------------// GfxCalGrayColorSpace//------------------------------------------------------------------------GfxCalGrayColorSpace::GfxCalGrayColorSpace() {  whiteX = whiteY = whiteZ = 1;  blackX = blackY = blackZ = 0;  gamma = 1;}GfxCalGrayColorSpace::~GfxCalGrayColorSpace() {}GfxColorSpace *GfxCalGrayColorSpace::copy() {  GfxCalGrayColorSpace *cs;  cs = new GfxCalGrayColorSpace();  cs->whiteX = whiteX;  cs->whiteY = whiteY;  cs->whiteZ = whiteZ;  cs->blackX = blackX;  cs->blackY = blackY;  cs->blackZ = blackZ;  cs->gamma = gamma;  return cs;}GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) {  GfxCalGrayColorSpace *cs;  Object obj1, obj2, obj3;  arr->get(1, &obj1);  if (!obj1.isDict()) {    error(-1, "Bad CalGray color space");    obj1.free();    return NULL;  }  cs = new GfxCalGrayColorSpace();  if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&      obj2.arrayGetLength() == 3) {    obj2.arrayGet(0, &obj3);    cs->whiteX = obj3.getNum();    obj3.free();    obj2.arrayGet(1, &obj3);    cs->whiteY = obj3.getNum();    obj3.free();    obj2.arrayGet(2, &obj3);    cs->whiteZ = obj3.getNum();    obj3.free();  }  obj2.free();  if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&      obj2.arrayGetLength() == 3) {    obj2.arrayGet(0, &obj3);    cs->blackX = obj3.getNum();    obj3.free();    obj2.arrayGet(1, &obj3);    cs->blackY = obj3.getNum();    obj3.free();    obj2.arrayGet(2, &obj3);    cs->blackZ = obj3.getNum();    obj3.free();  }  obj2.free();  if (obj1.dictLookup("Gamma", &obj2)->isNum()) {    cs->gamma = obj2.getNum();  }  obj2.free();  obj1.free();  return cs;}void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) {  *gray = clip01(color->c[0]);}void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {  rgb->r = rgb->g = rgb->b = clip01(color->c[0]);}void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {  cmyk->c = cmyk->m = cmyk->y = 0;  cmyk->k = clip01(gfxColorComp1 - color->c[0]);}void GfxCalGrayColorSpace::getDefaultColor(GfxColor *color) {  color->c[0] = 0;}//------------------------------------------------------------------------// GfxDeviceRGBColorSpace//------------------------------------------------------------------------GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() {}GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() {}GfxColorSpace *GfxDeviceRGBColorSpace::copy() {  return new GfxDeviceRGBColorSpace();}void GfxDeviceRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) {  *gray = clip01((GfxColorComp)(0.3  * color->c[0] +				0.59 * color->c[1] +				0.11 * color->c[2] + 0.5));}void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {  rgb->r = clip01(color->c[0]);  rgb->g = clip01(color->c[1]);  rgb->b = clip01(color->c[2]);}void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {  GfxColorComp c, m, y, k;  c = clip01(gfxColorComp1 - color->c[0]);  m = clip01(gfxColorComp1 - color->c[1]);  y = clip01(gfxColorComp1 - color->c[2]);  k = c;  if (m < k) {    k = m;  }  if (y < k) {    k = y;  }  cmyk->c = c - k;  cmyk->m = m - k;  cmyk->y = y - k;  cmyk->k = k;}void GfxDeviceRGBColorSpace::getDefaultColor(GfxColor *color) {  color->c[0] = 0;  color->c[1] = 0;  color->c[2] = 0;}//------------------------------------------------------------------------// GfxCalRGBColorSpace//------------------------------------------------------------------------GfxCalRGBColorSpace::GfxCalRGBColorSpace() {  whiteX = whiteY = whiteZ = 1;  blackX = blackY = blackZ = 0;  gammaR = gammaG = gammaB = 1;  mat[0] = 1; mat[1] = 0; mat[2] = 0;  mat[3] = 0; mat[4] = 1; mat[5] = 0;  mat[6] = 0; mat[7] = 0; mat[8] = 1;}GfxCalRGBColorSpace::~GfxCalRGBColorSpace() {}GfxColorSpace *GfxCalRGBColorSpace::copy() {  GfxCalRGBColorSpace *cs;  int i;  cs = new GfxCalRGBColorSpace();  cs->whiteX = whiteX;  cs->whiteY = whiteY;  cs->whiteZ = whiteZ;  cs->blackX = blackX;  cs->blackY = blackY;  cs->blackZ = blackZ;  cs->gammaR = gammaR;  cs->gammaG = gammaG;  cs->gammaB = gammaB;  for (i = 0; i < 9; ++i) {    cs->mat[i] = mat[i];  }  return cs;}GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) {  GfxCalRGBColorSpace *cs;  Object obj1, obj2, obj3;  int i;  arr->get(1, &obj1);  if (!obj1.isDict()) {    error(-1, "Bad CalRGB color space");    obj1.free();    return NULL;  }  cs = new GfxCalRGBColorSpace();  if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&      obj2.arrayGetLength() == 3) {    obj2.arrayGet(0, &obj3);    cs->whiteX = obj3.getNum();    obj3.free();    obj2.arrayGet(1, &obj3);    cs->whiteY = obj3.getNum();    obj3.free();    obj2.arrayGet(2, &obj3);    cs->whiteZ = obj3.getNum();    obj3.free();  }  obj2.free();  if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&      obj2.arrayGetLength() == 3) {    obj2.arrayGet(0, &obj3);    cs->blackX = obj3.getNum();    obj3.free();    obj2.arrayGet(1, &obj3);    cs->blackY = obj3.getNum();    obj3.free();    obj2.arrayGet(2, &obj3);    cs->blackZ = obj3.getNum();    obj3.free();  }  obj2.free();  if (obj1.dictLookup("Gamma", &obj2)->isArray() &&      obj2.arrayGetLength() == 3) {    obj2.arrayGet(0, &obj3);    cs->gammaR = obj3.getNum();    obj3.free();    obj2.arrayGet(1, &obj3);    cs->gammaG = obj3.getNum();    obj3.free();    obj2.arrayGet(2, &obj3);    cs->gammaB = obj3.getNum();    obj3.free();  }  obj2.free();  if (obj1.dictLookup("Matrix", &obj2)->isArray() &&      obj2.arrayGetLength() == 9) {    for (i = 0; i < 9; ++i) {      obj2.arrayGet(i, &obj3);      cs->mat[i] = obj3.getNum();      obj3.free();    }  }  obj2.free();  obj1.free();  return cs;}void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) {  *gray = clip01((GfxColorComp)(0.299 * color->c[0] +				0.587 * color->c[1] +				0.114 * color->c[2] + 0.5));}void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {  rgb->r = clip01(color->c[0]);  rgb->g = clip01(color->c[1]);  rgb->b = clip01(color->c[2]);}void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {  GfxColorComp c, m, y, k;  c = clip01(gfxColorComp1 - color->c[0]);  m = clip01(gfxColorComp1 - color->c[1]);  y = clip01(gfxColorComp1 - color->c[2]);  k = c;  if (m < k) {    k = m;  }  if (y < k) {    k = y;  }  cmyk->c = c - k;  cmyk->m = m - k;  cmyk->y = y - k;  cmyk->k = k;}void GfxCalRGBColorSpace::getDefaultColor(GfxColor *color) {  color->c[0] = 0;  color->c[1] = 0;  color->c[2] = 0;}//------------------------------------------------------------------------// GfxDeviceCMYKColorSpace//------------------------------------------------------------------------GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() {}GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() {}GfxColorSpace *GfxDeviceCMYKColorSpace::copy() {  return new GfxDeviceCMYKColorSpace();}void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, GfxGray *gray) {  *gray = clip01((GfxColorComp)(gfxColorComp1 - color->c[3]				- 0.3  * color->c[0]				- 0.59 * color->c[1]				- 0.11 * color->c[2] + 0.5));}/*void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {    unsigned char r,g,b;    float c = color->c[0];    float m = color->c[1];    float y = color->c[2];    float k = color->c[3];    convert_cmyk2rgb(c,m,y,k, &r,&g,&b);    rgb->r = r/255.0;    rgb->g = g/255.0;    rgb->b = b/255.0;}*/void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {  double c, m, y, k, c1, m1, y1, k1, r, g, b, x;  c = colToDbl(color->c[0]);  m = colToDbl(color->c[1]);  y = colToDbl(color->c[2]);  k = colToDbl(color->c[3]);  c1 = 1 - c;  m1 = 1 - m;  y1 = 1 - y;  k1 = 1 - k;  // this is a matrix multiplication, unrolled for performance  //                        C M Y K  x = c1 * m1 * y1 * k1; // 0 0 0 0  r = g = b = x;  x = c1 * m1 * y1 * k;  // 0 0 0 1  r += 0.1373 * x;  g += 0.1216 * x;  b += 0.1255 * x;  x = c1 * m1 * y  * k1; // 0 0 1 0  r += x;  g += 0.9490 * x;  x = c1 * m1 * y  * k;  // 0 0 1 1  r += 0.1098 * x;  g += 0.1020 * x;  x = c1 * m  * y1 * k1; // 0 1 0 0  r += 0.9255 * x;  b += 0.5490 * x;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -