📄 metado.cs
字号:
cb.arc(state.transformX(l), state.transformY(b), state.transformX(r), state.transformY(t), 0, 360);
strokeAndFill();
break;
}
case META_ARC:
{
if (isNullStrokeFill(state.LineNeutral))
break;
float yend = state.transformY(meta.readShort());
float xend = state.transformX(meta.readShort());
float ystart = state.transformY(meta.readShort());
float xstart = state.transformX(meta.readShort());
float b = state.transformY(meta.readShort());
float r = state.transformX(meta.readShort());
float t = state.transformY(meta.readShort());
float l = state.transformX(meta.readShort());
float cx = (r + l) / 2;
float cy = (t + b) / 2;
float arc1 = getArc(cx, cy, xstart, ystart);
float arc2 = getArc(cx, cy, xend, yend);
arc2 -= arc1;
if (arc2 <= 0)
arc2 += 360;
cb.arc(l, b, r, t, arc1, arc2);
cb.stroke();
break;
}
case META_PIE:
{
if (isNullStrokeFill(state.LineNeutral))
break;
float yend = state.transformY(meta.readShort());
float xend = state.transformX(meta.readShort());
float ystart = state.transformY(meta.readShort());
float xstart = state.transformX(meta.readShort());
float b = state.transformY(meta.readShort());
float r = state.transformX(meta.readShort());
float t = state.transformY(meta.readShort());
float l = state.transformX(meta.readShort());
float cx = (r + l) / 2;
float cy = (t + b) / 2;
float arc1 = getArc(cx, cy, xstart, ystart);
float arc2 = getArc(cx, cy, xend, yend);
arc2 -= arc1;
if (arc2 <= 0)
arc2 += 360;
ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
if (ar.Count == 0)
break;
float[] pt = (float [])ar[0];
cb.moveTo(cx, cy);
cb.lineTo(pt[0], pt[1]);
for (int k = 0; k < ar.Count; ++k) {
pt = (float [])ar[k];
cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
}
cb.lineTo(cx, cy);
strokeAndFill();
break;
}
case META_CHORD:
{
if (isNullStrokeFill(state.LineNeutral))
break;
float yend = state.transformY(meta.readShort());
float xend = state.transformX(meta.readShort());
float ystart = state.transformY(meta.readShort());
float xstart = state.transformX(meta.readShort());
float b = state.transformY(meta.readShort());
float r = state.transformX(meta.readShort());
float t = state.transformY(meta.readShort());
float l = state.transformX(meta.readShort());
float cx = (r + l) / 2;
float cy = (t + b) / 2;
float arc1 = getArc(cx, cy, xstart, ystart);
float arc2 = getArc(cx, cy, xend, yend);
arc2 -= arc1;
if (arc2 <= 0)
arc2 += 360;
ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
if (ar.Count == 0)
break;
float[] pt = (float [])ar[0];
cx = pt[0];
cy = pt[1];
cb.moveTo(cx, cy);
for (int k = 0; k < ar.Count; ++k) {
pt = (float [])ar[k];
cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
}
cb.lineTo(cx, cy);
strokeAndFill();
break;
}
case META_RECTANGLE:
{
if (isNullStrokeFill(true))
break;
float b = state.transformY(meta.readShort());
float r = state.transformX(meta.readShort());
float t = state.transformY(meta.readShort());
float l = state.transformX(meta.readShort());
cb.rectangle(l, b, r - l, t - b);
strokeAndFill();
break;
}
case META_INTERSECTCLIPRECT:
{
float b = state.transformY(meta.readShort());
float r = state.transformX(meta.readShort());
float t = state.transformY(meta.readShort());
float l = state.transformX(meta.readShort());
cb.rectangle(l, b, r - l, t - b);
cb.eoClip();
cb.newPath();
break;
}
case META_EXTTEXTOUT:
{
int y = meta.readShort();
int x = meta.readShort();
int count = meta.readWord();
int flag = meta.readWord();
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0) {
x1 = meta.readShort();
y1 = meta.readShort();
x2 = meta.readShort();
y2 = meta.readShort();
}
byte[] text = new byte[count];
int k;
for (k = 0; k < count; ++k) {
byte c = (byte)meta.readByte();
if (c == 0)
break;
text[k] = c;
}
string s;
try {
s = System.Text.Encoding.GetEncoding("windows-1252").GetString(text, 0, k);
}
catch (Exception e) {
e.GetType();
s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
}
outputText(x, y, flag, x1, y1, x2, y2, s);
break;
}
case META_TEXTOUT:
{
int count = meta.readWord();
byte[] text = new byte[count];
int k;
for (k = 0; k < count; ++k) {
byte c = (byte)meta.readByte();
if (c == 0)
break;
text[k] = c;
}
string s;
try {
s = System.Text.Encoding.GetEncoding("windows-1252").GetString(text, 0, k);
}
catch (Exception e) {
e.GetType();
s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
}
count = (count + 1) & 0xfffe;
meta.skip(count - k);
int y = meta.readShort();
int x = meta.readShort();
outputText(x, y, 0, 0, 0, 0, 0, s);
break;
}
case META_SETBKCOLOR:
state.CurrentBackgroundColor = meta.readColor();
break;
case META_SETTEXTCOLOR:
state.CurrentTextColor = meta.readColor();
break;
case META_SETTEXTALIGN:
state.TextAlign = meta.readWord();
break;
case META_SETBKMODE:
state.BackgroundMode = meta.readWord();
break;
case META_SETPOLYFILLMODE:
state.PolyFillMode = meta.readWord();
break;
case META_SETPIXEL:
{
Color color = meta.readColor();
int y = meta.readShort();
int x = meta.readShort();
cb.saveState();
cb.ColorFill = color;
cb.rectangle(state.transformX(x), state.transformY(y), .2f, .2f);
cb.fill();
cb.restoreState();
break;
}
}
meta.skip((tsize * 2) - (meta.Length - lenMarker));
}
}
public void outputText(int x, int y, int flag, int x1, int y1, int x2, int y2, string text) {
MetaFont font = state.CurrentFont;
float refX = state.transformX(x);
float refY = state.transformY(y);
float sin = (float)Math.Sin(font.Angle);
float cos = (float)Math.Cos(font.Angle);
float fontSize = font.getFontSize(state);
BaseFont bf = font.Font;
int align = state.TextAlign;
float textWidth = bf.getWidthPoint(text, fontSize);
float tx = 0;
float ty = 0;
float descender = bf.getFontDescriptor(BaseFont.DESCENT, fontSize);
float ury = bf.getFontDescriptor(BaseFont.BBOXURY, fontSize);
cb.saveState();
cb.concatCTM(cos, sin, -sin, cos, refX, refY);
if ((align & MetaState.TA_CENTER) == MetaState.TA_CENTER)
tx = -textWidth / 2;
else if ((align & MetaState.TA_RIGHT) == MetaState.TA_RIGHT)
tx = -textWidth;
if ((align & MetaState.TA_BASELINE) == MetaState.TA_BASELINE)
ty = 0;
else if ((align & MetaState.TA_BOTTOM) == MetaState.TA_BOTTOM)
ty = -descender;
else
ty = -ury;
Color textColor;
if (state.BackgroundMode == MetaState.OPAQUE) {
textColor = state.CurrentBackgroundColor;
cb.ColorFill = textColor;
cb.rectangle(tx, ty + descender, textWidth, ury - descender);
cb.fill();
}
textColor = state.CurrentTextColor;
cb.ColorFill = textColor;
cb.beginText();
cb.setFontAndSize(bf, fontSize);
cb.setTextMatrix(tx, ty);
cb.showText(text);
cb.endText();
if (font.isUnderline()) {
cb.rectangle(tx, ty - fontSize / 4, textWidth, fontSize / 15);
cb.fill();
}
if (font.isStrikeout()) {
cb.rectangle(tx, ty + fontSize / 3, textWidth, fontSize / 15);
cb.fill();
}
cb.restoreState();
}
public bool isNullStrokeFill(bool isRectangle) {
MetaPen pen = state.CurrentPen;
MetaBrush brush = state.CurrentBrush;
bool noPen = (pen.Style == MetaPen.PS_NULL);
int style = brush.Style;
bool isBrush = (style == MetaBrush.BS_SOLID || (style == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
bool result = noPen && !isBrush;
if (!noPen) {
if (isRectangle)
state.LineJoinRectangle = cb;
else
state.LineJoinPolygon = cb;
}
return result;
}
public void strokeAndFill(){
MetaPen pen = state.CurrentPen;
MetaBrush brush = state.CurrentBrush;
int penStyle = pen.Style;
int brushStyle = brush.Style;
if (penStyle == MetaPen.PS_NULL) {
cb.closePath();
if (state.PolyFillMode == MetaState.ALTERNATE) {
cb.eoFill();
}
else {
cb.fill();
}
}
else {
bool isBrush = (brushStyle == MetaBrush.BS_SOLID || (brushStyle == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
if (isBrush) {
if (state.PolyFillMode == MetaState.ALTERNATE)
cb.closePathEoFillStroke();
else
cb.closePathFillStroke();
}
else {
cb.closePathStroke();
}
}
}
internal static float getArc(float xCenter, float yCenter, float xDot, float yDot) {
double s = Math.Atan2(yDot - yCenter, xDot - xCenter);
if (s < 0)
s += Math.PI * 2;
return (float)(s / Math.PI * 180);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -