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

📄 gfx.cc

📁 swf文件查看工具,能够看flash文件的格式
💻 CC
📖 第 1 页 / 共 5 页
字号:
    for (j = 0; j < nComps; ++j) {      if (abs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) {	break;      }    }    if (j < nComps) {      break;    }  }  // center of the rectangle  xM = 0.5 * (x0 + x1);  yM = 0.5 * (y0 + y1);  // the four corner colors are close (or we hit the recursive limit)  // -- fill the rectangle; but require at least one subdivision  // (depth==0) to avoid problems when the four outer corners of the  // shaded region are the same color  if ((i == 4 && depth > 0) || depth == functionMaxDepth) {    // use the center color    shading->getColor(xM, yM, &fillColor);    state->setFillColor(&fillColor);    out->updateFillColor(state);    // fill the rectangle    state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4],		  x0 * matrix[1] + y0 * matrix[3] + matrix[5]);    state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4],		  x1 * matrix[1] + y0 * matrix[3] + matrix[5]);    state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4],		  x1 * matrix[1] + y1 * matrix[3] + matrix[5]);    state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4],		  x0 * matrix[1] + y1 * matrix[3] + matrix[5]);    state->closePath();    out->fill(state);    state->clearPath();  // the four corner colors are not close enough -- subdivide the  // rectangle  } else {    // colors[0]       colorM0       colors[2]    //   (x0,y0)       (xM,y0)       (x1,y0)    //         +----------+----------+    //         |          |          |    //         |    UL    |    UR    |    // color0M |       colorMM       | color1M    // (x0,yM) +----------+----------+ (x1,yM)    //         |       (xM,yM)       |    //         |    LL    |    LR    |    //         |          |          |    //         +----------+----------+    // colors[1]       colorM1       colors[3]    //   (x0,y1)       (xM,y1)       (x1,y1)    shading->getColor(x0, yM, &color0M);    shading->getColor(x1, yM, &color1M);    shading->getColor(xM, y0, &colorM0);    shading->getColor(xM, y1, &colorM1);    shading->getColor(xM, yM, &colorMM);    // upper-left sub-rectangle    colors2[0] = colors[0];    colors2[1] = color0M;    colors2[2] = colorM0;    colors2[3] = colorMM;    doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1);        // lower-left sub-rectangle    colors2[0] = color0M;    colors2[1] = colors[1];    colors2[2] = colorMM;    colors2[3] = colorM1;    doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1);        // upper-right sub-rectangle    colors2[0] = colorM0;    colors2[1] = colorMM;    colors2[2] = colors[2];    colors2[3] = color1M;    doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1);    // lower-right sub-rectangle    colors2[0] = colorMM;    colors2[1] = colorM1;    colors2[2] = color1M;    colors2[3] = colors[3];    doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1);  }}void Gfx::doAxialShFill(GfxAxialShading *shading) {  double xMin, yMin, xMax, yMax;  double x0, y0, x1, y1;  double dx, dy, mul;  GBool dxZero, dyZero;  double tMin, tMax, t, tx, ty;  double s[4], sMin, sMax, tmp;  double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1;  double t0, t1, tt;  double ta[axialMaxSplits + 1];  int next[axialMaxSplits + 1];  GfxColor color0, color1;  int nComps;  int i, j, k, kk;  if (out->useShadedFills() &&      out->axialShadedFill(state, shading)) {    return;  }  // get the clip region bbox  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);  // compute min and max t values, based on the four corners of the  // clip region bbox  shading->getCoords(&x0, &y0, &x1, &y1);  dx = x1 - x0;  dy = y1 - y0;  dxZero = fabs(dx) < 0.01;  dyZero = fabs(dy) < 0.01;  if (dxZero && dyZero) {    tMin = tMax = 0;  } else {    mul = 1 / (dx * dx + dy * dy);    tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul;    t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul;    if (t < tMin) {      tMin = t;    } else if (t > tMax) {      tMax = t;    }    t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul;    if (t < tMin) {      tMin = t;    } else if (t > tMax) {      tMax = t;    }    t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul;    if (t < tMin) {      tMin = t;    } else if (t > tMax) {      tMax = t;    }    if (tMin < 0 && !shading->getExtend0()) {      tMin = 0;    }    if (tMax > 1 && !shading->getExtend1()) {      tMax = 1;    }  }  // get the function domain  t0 = shading->getDomain0();  t1 = shading->getDomain1();  // Traverse the t axis and do the shading.  //  // For each point (tx, ty) on the t axis, consider a line through  // that point perpendicular to the t axis:  //  //     x(s) = tx + s * -dy   -->   s = (x - tx) / -dy  //     y(s) = ty + s * dx    -->   s = (y - ty) / dx  //  // Then look at the intersection of this line with the bounding box  // (xMin, yMin, xMax, yMax).  In the general case, there are four  // intersection points:  //  //     s0 = (xMin - tx) / -dy  //     s1 = (xMax - tx) / -dy  //     s2 = (yMin - ty) / dx  //     s3 = (yMax - ty) / dx  //  // and we want the middle two s values.  //  // In the case where dx = 0, take s0 and s1; in the case where dy =  // 0, take s2 and s3.  //  // Each filled polygon is bounded by two of these line segments  // perpdendicular to the t axis.  //  // The t axis is bisected into smaller regions until the color  // difference across a region is small enough, and then the region  // is painted with a single color.  // set up: require at least one split to avoid problems when the two  // ends of the t axis have the same color  nComps = shading->getColorSpace()->getNComps();  ta[0] = tMin;  next[0] = axialMaxSplits / 2;  ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax);  next[axialMaxSplits / 2] = axialMaxSplits;  ta[axialMaxSplits] = tMax;  // compute the color at t = tMin  if (tMin < 0) {    tt = t0;  } else if (tMin > 1) {    tt = t1;  } else {    tt = t0 + (t1 - t0) * tMin;  }  shading->getColor(tt, &color0);  // compute the coordinates of the point on the t axis at t = tMin;  // then compute the intersection of the perpendicular line with the  // bounding box  tx = x0 + tMin * dx;  ty = y0 + tMin * dy;  if (dxZero && dyZero) {    sMin = sMax = 0;  } else if (dxZero) {    sMin = (xMin - tx) / -dy;    sMax = (xMax - tx) / -dy;    if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }  } else if (dyZero) {    sMin = (yMin - ty) / dx;    sMax = (yMax - ty) / dx;    if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }  } else {    s[0] = (yMin - ty) / dx;    s[1] = (yMax - ty) / dx;    s[2] = (xMin - tx) / -dy;    s[3] = (xMax - tx) / -dy;    for (j = 0; j < 3; ++j) {      kk = j;      for (k = j + 1; k < 4; ++k) {	if (s[k] < s[kk]) {	  kk = k;	}      }      tmp = s[j]; s[j] = s[kk]; s[kk] = tmp;    }    sMin = s[1];    sMax = s[2];  }  ux0 = tx - sMin * dy;  uy0 = ty + sMin * dx;  vx0 = tx - sMax * dy;  vy0 = ty + sMax * dx;  i = 0;  while (i < axialMaxSplits) {    // bisect until color difference is small enough or we hit the    // bisection limit    j = next[i];    while (j > i + 1) {      if (ta[j] < 0) {	tt = t0;      } else if (ta[j] > 1) {	tt = t1;      } else {	tt = t0 + (t1 - t0) * ta[j];      }      shading->getColor(tt, &color1);      for (k = 0; k < nComps; ++k) {	if (abs(color1.c[k] - color0.c[k]) > axialColorDelta) {	  break;	}      }      if (k == nComps) {	break;      }      k = (i + j) / 2;      ta[k] = 0.5 * (ta[i] + ta[j]);      next[i] = k;      next[k] = j;      j = k;    }    // use the average of the colors of the two sides of the region    for (k = 0; k < nComps; ++k) {      color0.c[k] = (color0.c[k] + color1.c[k]) / 2;    }    // compute the coordinates of the point on the t axis; then    // compute the intersection of the perpendicular line with the    // bounding box    tx = x0 + ta[j] * dx;    ty = y0 + ta[j] * dy;    if (dxZero && dyZero) {      sMin = sMax = 0;    } else if (dxZero) {      sMin = (xMin - tx) / -dy;      sMax = (xMax - tx) / -dy;      if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }    } else if (dyZero) {      sMin = (yMin - ty) / dx;      sMax = (yMax - ty) / dx;      if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }    } else {      s[0] = (yMin - ty) / dx;      s[1] = (yMax - ty) / dx;      s[2] = (xMin - tx) / -dy;      s[3] = (xMax - tx) / -dy;      for (j = 0; j < 3; ++j) {	kk = j;	for (k = j + 1; k < 4; ++k) {	  if (s[k] < s[kk]) {	    kk = k;	  }	}	tmp = s[j]; s[j] = s[kk]; s[kk] = tmp;      }      sMin = s[1];      sMax = s[2];    }    ux1 = tx - sMin * dy;    uy1 = ty + sMin * dx;    vx1 = tx - sMax * dy;    vy1 = ty + sMax * dx;    // set the color    state->setFillColor(&color0);    out->updateFillColor(state);    // fill the region    state->moveTo(ux0, uy0);    state->lineTo(vx0, vy0);    state->lineTo(vx1, vy1);    state->lineTo(ux1, uy1);    state->closePath();    out->fill(state);    state->clearPath();    // set up for next region    ux0 = ux1;    uy0 = uy1;    vx0 = vx1;    vy0 = vy1;    color0 = color1;    i = next[i];  }}void Gfx::doRadialShFill(GfxRadialShading *shading) {  double xMin, yMin, xMax, yMax;  double x0, y0, r0, x1, y1, r1, t0, t1;  int nComps;  GfxColor colorA, colorB;  double xa, ya, xb, yb, ra, rb;  double ta, tb, sa, sb;  double sz, xz, yz, sMin, sMax;  GBool enclosed;  int ia, ib, k, n;  double *ctm;  double theta, alpha, angle, t;  if (out->useShadedFills() &&      out->radialShadedFill(state, shading)) {    return;  }  // get the shading info  shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1);  t0 = shading->getDomain0();  t1 = shading->getDomain1();  nComps = shading->getColorSpace()->getNComps();  // Compute the point at which r(s) = 0; check for the enclosed  // circles case; and compute the angles for the tangent lines.  if (x0 == x1 && y0 == y1) {    enclosed = gTrue;    theta = 0; // make gcc happy    sz = 0; // make gcc happy  } else if (r0 == r1) {    enclosed = gFalse;    theta = 0;    sz = 0; // make gcc happy  } else {    sz = -r0 / (r1 - r0);    xz = x0 + sz * (x1 - x0);    yz = y0 + sz * (y1 - y0);    enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0) <= r0 * r0;    theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz)));    if (r0 > r1) {      theta = -theta;    }  }  if (enclosed) {    alpha = 0;  } else {    alpha = atan2(y1 - y0, x1 - x0);  }  // compute the (possibly extended) s range  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);  if (enclosed) {    sMin = 0;    sMax = 1;  } else {    sMin = 1;    sMax = 0;    // solve for x(s) + r(s) = xMin    if ((x1 + r1) - (x0 + r0) != 0) {      sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0));      if (sa < sMin) {	sMin = sa;      } else if (sa > sMax) {	sMax = sa;      }    }    // solve for x(s) - r(s) = xMax    if ((x1 - r1) - (x0 - r0) != 0) {      sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0));      if (sa < sMin) {	sMin = sa;      } else if (sa > sMax) {	sMax = sa;      }    }    // solve for y(s) + r(s) = yMin    if ((y1 + r1) - (y0 + r0) != 0) {      sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0));      if (sa < sMin) {	sMin = sa;      } else if (sa > sMax) {	sMax = sa;      }    }    // solve for y(s) - r(s) = yMax    if ((y1 - r1) - (y0 - r0) != 0) {      sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0));      if (sa < sMin) {	sMin = sa;      } else if (sa > sMax) {	sMax = sa;      }    }    // check against sz    if (r0 < r1) {      if (sMin < sz) {	sMin = sz;      }    } else if (r0 > r1) {      if (sMax > sz) {	sMax = sz;      }    }    // check the 'extend' flags    if (!shading->getExtend0() && sMin < 0) {      sMin = 0;    }    if (!shading->getExtend1() && sMax > 1) {      sMax = 1;    }  }  // compute the number of steps into which circles must be divided to  // achieve a curve flatness of 0.1 pixel in device space for the  // largest circle (note that "device space" is 72 dpi when generating  // PostScript, hence the relatively small 0.1 pixel accuracy)  ctm = state->getCTM();  t = fabs(ctm[0]);  if (fabs(ctm[1]) > t) {    t = fabs(ctm[1]);  }  if (fabs(ctm[2]) > t) {    t = fabs(ctm[2]);  }  if (fabs(ctm[3]) > t) {    t = fabs(ctm[3]);  }  if (r0 > r1) {    t *= r0;  } else {    t *= r1;  }  if (t < 1) {    n = 3;  } else {    n = (int)(M_PI / acos(1 - 0.1 / t));    if (n < 3) {      n = 3;    } else if (n > 200) {      n = 200;    }  }  // setup for the start circle  ia = 0;  sa = sMin;  ta = t0 + sa * (t1 - t0);  xa = x0 + sa * (x1 - x0);  ya = y0 + sa * (y1 - y0);  ra = r0 + sa * (r1 - r0);  if (ta < t0) {    shading->getColor(t0, &colorA);  } else if (ta > t1) {    shading->getColor(t1, &colorA);  } else {    shading->getColor(ta, &colorA);  }  // fill the circles  while (ia < radialMaxSplits) {

⌨️ 快捷键说明

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