gfx.cc

来自「source code: Covert TXT to PDF」· CC 代码 · 共 2,586 行 · 第 1/5 页

CC
2,586
字号
	for (i = 0; i < numArgs; ++i) {	  printf(" ");	  args[i].print(stdout);	}	printf("\n");	fflush(stdout);      }      execOp(&obj, args, numArgs);      obj.free();      for (i = 0; i < numArgs; ++i)	args[i].free();      numArgs = 0;      // periodically update display      if (++updateLevel >= 20000) {	out->dump();	updateLevel = 0;      }      // check for an abort      if (abortCheckCbk) {	if (updateLevel - lastAbortCheck > 10) {	  if ((*abortCheckCbk)(abortCheckCbkData)) {	    break;	  }	  lastAbortCheck = updateLevel;	}      }    // got an argument - save it    } else if (numArgs < maxArgs) {      args[numArgs++] = obj;    // too many arguments - something is wrong    } else {      error(getPos(), "Too many args in content stream");      if (printCommands) {	printf("throwing away arg: ");	obj.print(stdout);	printf("\n");	fflush(stdout);      }      obj.free();    }    // grab the next object    parser->getObj(&obj);  }  obj.free();  // args at end with no command  if (numArgs > 0) {    error(getPos(), "Leftover args in content stream");    if (printCommands) {      printf("%d leftovers:", numArgs);      for (i = 0; i < numArgs; ++i) {	printf(" ");	args[i].print(stdout);      }      printf("\n");      fflush(stdout);    }    for (i = 0; i < numArgs; ++i)      args[i].free();  }  // update display  if (topLevel && updateLevel > 0) {    out->dump();  }}void Gfx::execOp(Object *cmd, Object args[], int numArgs) {  Operator *op;  char *name;  int i;  // find operator  name = cmd->getCmd();  if (!(op = findOp(name))) {    if (ignoreUndef == 0)      error(getPos(), "Unknown operator '%s'", name);    return;  }  // type check args  if (op->numArgs >= 0) {    if (numArgs != op->numArgs) {      error(getPos(), "Wrong number (%d) of args to '%s' operator",	    numArgs, name);      return;    }  } else {    if (numArgs > -op->numArgs) {      error(getPos(), "Too many (%d) args to '%s' operator",	    numArgs, name);      return;    }  }  for (i = 0; i < numArgs; ++i) {    if (!checkArg(&args[i], op->tchk[i])) {      error(getPos(), "Arg #%d to '%s' operator is wrong type (%s)",	    i, name, args[i].getTypeName());      return;    }  }  // do it  (this->*op->func)(args, numArgs);}Operator *Gfx::findOp(char *name) {  int a, b, m, cmp;  a = -1;  b = numOps;  // invariant: opTab[a] < name < opTab[b]  while (b - a > 1) {    m = (a + b) / 2;    cmp = strcmp(opTab[m].name, name);    if (cmp < 0)      a = m;    else if (cmp > 0)      b = m;    else      a = b = m;  }  if (cmp != 0)    return NULL;  return &opTab[a];}GBool Gfx::checkArg(Object *arg, TchkType type) {  switch (type) {  case tchkBool:   return arg->isBool();  case tchkInt:    return arg->isInt();  case tchkNum:    return arg->isNum();  case tchkString: return arg->isString();  case tchkName:   return arg->isName();  case tchkArray:  return arg->isArray();  case tchkProps:  return arg->isDict() || arg->isName();  case tchkSCN:    return arg->isNum() || arg->isName();  case tchkNone:   return gFalse;  }  return gFalse;}int Gfx::getPos() {  return parser ? parser->getPos() : -1;}//------------------------------------------------------------------------// graphics state operators//------------------------------------------------------------------------void Gfx::opSave(Object args[], int numArgs) {  out->saveState(state);  state = state->save();}void Gfx::opRestore(Object args[], int numArgs) {  state = state->restore();  out->restoreState(state);}void Gfx::opConcat(Object args[], int numArgs) {  state->concatCTM(args[0].getNum(), args[1].getNum(),		   args[2].getNum(), args[3].getNum(),		   args[4].getNum(), args[5].getNum());  out->updateCTM(state, args[0].getNum(), args[1].getNum(),		 args[2].getNum(), args[3].getNum(),		 args[4].getNum(), args[5].getNum());  fontChanged = gTrue;}void Gfx::opSetDash(Object args[], int numArgs) {  Array *a;  int length;  Object obj;  double *dash;  int i;  a = args[0].getArray();  length = a->getLength();  if (length == 0) {    dash = NULL;  } else {    dash = (double *)gmalloc(length * sizeof(double));    for (i = 0; i < length; ++i) {      dash[i] = a->get(i, &obj)->getNum();      obj.free();    }  }  state->setLineDash(dash, length, args[1].getNum());  out->updateLineDash(state);}void Gfx::opSetFlat(Object args[], int numArgs) {  state->setFlatness((int)args[0].getNum());  out->updateFlatness(state);}void Gfx::opSetLineJoin(Object args[], int numArgs) {  state->setLineJoin(args[0].getInt());  out->updateLineJoin(state);}void Gfx::opSetLineCap(Object args[], int numArgs) {  state->setLineCap(args[0].getInt());  out->updateLineCap(state);}void Gfx::opSetMiterLimit(Object args[], int numArgs) {  state->setMiterLimit(args[0].getNum());  out->updateMiterLimit(state);}void Gfx::opSetLineWidth(Object args[], int numArgs) {  state->setLineWidth(args[0].getNum());  out->updateLineWidth(state);}void Gfx::opSetExtGState(Object args[], int numArgs) {  Object obj1, obj2;  if (!res->lookupGState(args[0].getName(), &obj1)) {    return;  }  if (!obj1.isDict()) {    error(getPos(), "ExtGState '%s' is wrong type", args[0].getName());    obj1.free();    return;  }  if (obj1.dictLookup("ca", &obj2)->isNum()) {    state->setFillOpacity(obj2.getNum());    out->updateFillOpacity(state);  }  obj2.free();  if (obj1.dictLookup("CA", &obj2)->isNum()) {    state->setStrokeOpacity(obj2.getNum());    out->updateStrokeOpacity(state);  }  obj2.free();  obj1.free();}void Gfx::opSetRenderingIntent(Object args[], int numArgs) {}//------------------------------------------------------------------------// color operators//------------------------------------------------------------------------void Gfx::opSetFillGray(Object args[], int numArgs) {  GfxColor color;  state->setFillPattern(NULL);  state->setFillColorSpace(new GfxDeviceGrayColorSpace());  color.c[0] = args[0].getNum();  state->setFillColor(&color);  out->updateFillColor(state);}void Gfx::opSetStrokeGray(Object args[], int numArgs) {  GfxColor color;  state->setStrokePattern(NULL);  state->setStrokeColorSpace(new GfxDeviceGrayColorSpace());  color.c[0] = args[0].getNum();  state->setStrokeColor(&color);  out->updateStrokeColor(state);}void Gfx::opSetFillCMYKColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setFillPattern(NULL);  state->setFillColorSpace(new GfxDeviceCMYKColorSpace());  for (i = 0; i < 4; ++i) {    color.c[i] = args[i].getNum();  }  state->setFillColor(&color);  out->updateFillColor(state);}void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setStrokePattern(NULL);  state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace());  for (i = 0; i < 4; ++i) {    color.c[i] = args[i].getNum();  }  state->setStrokeColor(&color);  out->updateStrokeColor(state);}void Gfx::opSetFillRGBColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setFillPattern(NULL);  state->setFillColorSpace(new GfxDeviceRGBColorSpace());  for (i = 0; i < 3; ++i) {    color.c[i] = args[i].getNum();  }  state->setFillColor(&color);  out->updateFillColor(state);}void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setStrokePattern(NULL);  state->setStrokeColorSpace(new GfxDeviceRGBColorSpace());  for (i = 0; i < 3; ++i) {    color.c[i] = args[i].getNum();  }  state->setStrokeColor(&color);  out->updateStrokeColor(state);}void Gfx::opSetFillColorSpace(Object args[], int numArgs) {  Object obj;  GfxColorSpace *colorSpace;  GfxColor color;  int i;  state->setFillPattern(NULL);  res->lookupColorSpace(args[0].getName(), &obj);  if (obj.isNull()) {    colorSpace = GfxColorSpace::parse(&args[0]);  } else {    colorSpace = GfxColorSpace::parse(&obj);  }  obj.free();  if (colorSpace) {    state->setFillColorSpace(colorSpace);  } else {    error(getPos(), "Bad color space (fill)");  }  for (i = 0; i < gfxColorMaxComps; ++i) {    color.c[i] = 0;  }  state->setFillColor(&color);  out->updateFillColor(state);}void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) {  Object obj;  GfxColorSpace *colorSpace;  GfxColor color;  int i;  state->setStrokePattern(NULL);  res->lookupColorSpace(args[0].getName(), &obj);  if (obj.isNull()) {    colorSpace = GfxColorSpace::parse(&args[0]);  } else {    colorSpace = GfxColorSpace::parse(&obj);  }  obj.free();  if (colorSpace) {    state->setStrokeColorSpace(colorSpace);  } else {    error(getPos(), "Bad color space (stroke)");  }  for (i = 0; i < gfxColorMaxComps; ++i) {    color.c[i] = 0;  }  state->setStrokeColor(&color);  out->updateStrokeColor(state);}void Gfx::opSetFillColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setFillPattern(NULL);  for (i = 0; i < numArgs; ++i) {    color.c[i] = args[i].getNum();  }  state->setFillColor(&color);  out->updateFillColor(state);}void Gfx::opSetStrokeColor(Object args[], int numArgs) {  GfxColor color;  int i;  state->setStrokePattern(NULL);  for (i = 0; i < numArgs; ++i) {    color.c[i] = args[i].getNum();  }  state->setStrokeColor(&color);  out->updateStrokeColor(state);}void Gfx::opSetFillColorN(Object args[], int numArgs) {  GfxColor color;  GfxPattern *pattern;  int i;  if (state->getFillColorSpace()->getMode() == csPattern) {    if (numArgs > 1) {      for (i = 0; i < numArgs && i < 4; ++i) {	if (args[i].isNum()) {	  color.c[i] = args[i].getNum();	}      }      state->setFillColor(&color);      out->updateFillColor(state);    }    if (args[numArgs-1].isName() &&	(pattern = res->lookupPattern(args[numArgs-1].getName()))) {      state->setFillPattern(pattern);    }  } else {    state->setFillPattern(NULL);    for (i = 0; i < numArgs && i < 4; ++i) {      if (args[i].isNum()) {	color.c[i] = args[i].getNum();      }    }    state->setFillColor(&color);    out->updateFillColor(state);  }}void Gfx::opSetStrokeColorN(Object args[], int numArgs) {  GfxColor color;  GfxPattern *pattern;  int i;  if (state->getStrokeColorSpace()->getMode() == csPattern) {    if (numArgs > 1) {      for (i = 0; i < numArgs && i < 4; ++i) {	if (args[i].isNum()) {	  color.c[i] = args[i].getNum();	}      }      state->setStrokeColor(&color);      out->updateStrokeColor(state);    }    if (args[numArgs-1].isName() &&	(pattern = res->lookupPattern(args[numArgs-1].getName()))) {      state->setStrokePattern(pattern);    }  } else {    state->setStrokePattern(NULL);    for (i = 0; i < numArgs && i < 4; ++i) {      if (args[i].isNum()) {	color.c[i] = args[i].getNum();      }    }    state->setStrokeColor(&color);    out->updateStrokeColor(state);  }}//------------------------------------------------------------------------// path segment operators//------------------------------------------------------------------------void Gfx::opMoveTo(Object args[], int numArgs) {  state->moveTo(args[0].getNum(), args[1].getNum());}void Gfx::opLineTo(Object args[], int numArgs) {  if (!state->isCurPt()) {    error(getPos(), "No current point in lineto");    return;  }  state->lineTo(args[0].getNum(), args[1].getNum());}void Gfx::opCurveTo(Object args[], int numArgs) {  double x1, y1, x2, y2, x3, y3;  if (!state->isCurPt()) {    error(getPos(), "No current point in curveto");    return;  }  x1 = args[0].getNum();  y1 = args[1].getNum();  x2 = args[2].getNum();  y2 = args[3].getNum();  x3 = args[4].getNum();  y3 = args[5].getNum();  state->curveTo(x1, y1, x2, y2, x3, y3);}void Gfx::opCurveTo1(Object args[], int numArgs) {  double x1, y1, x2, y2, x3, y3;  if (!state->isCurPt()) {    error(getPos(), "No current point in curveto1");    return;  }  x1 = state->getCurX();  y1 = state->getCurY();  x2 = args[0].getNum();  y2 = args[1].getNum();  x3 = args[2].getNum();  y3 = args[3].getNum();  state->curveTo(x1, y1, x2, y2, x3, y3);}void Gfx::opCurveTo2(Object args[], int numArgs) {  double x1, y1, x2, y2, x3, y3;  if (!state->isCurPt()) {    error(getPos(), "No current point in curveto2");

⌨️ 快捷键说明

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