Calculating shaperecords numbits everywhere

This commit is contained in:
Jindra Petřík
2023-10-16 09:36:06 +02:00
parent 6223465945
commit 845a5d86d6
14 changed files with 50 additions and 22 deletions
@@ -2844,7 +2844,7 @@ public class SWFInputStream implements AutoCloseable {
cer.controlDeltaX = (int) readSB(cer.numBits + 2, "controlDeltaX");
cer.controlDeltaY = (int) readSB(cer.numBits + 2, "controlDeltaY");
cer.anchorDeltaX = (int) readSB(cer.numBits + 2, "anchorDeltaX");
cer.anchorDeltaY = (int) readSB(cer.numBits + 2, "anchorDeltaY");
cer.anchorDeltaY = (int) readSB(cer.numBits + 2, "anchorDeltaY");
ret = cer;
}
}
@@ -358,6 +358,7 @@ public class SvgImporter {
serclose.deltaX = (int) Math.round(p.x - prevPoint.x);
serclose.deltaY = (int) Math.round(p.y - prevPoint.y);
serclose.generalLineFlag = true;
serclose.calculateBits();
newRecords.add(serclose);
if (lineStyle != 0) {
@@ -455,6 +456,8 @@ public class SvgImporter {
serz.deltaY = (int) Math.round(p.y - prevPoint.y);
prevPoint = new Point(prevPoint.x + serz.deltaX, prevPoint.y + serz.deltaY);
serz.generalLineFlag = true;
serz.simplify();
serz.calculateBits();
newRecords.add(serz);
if (lineStyle2Obj != null) {
lineStyle2Obj.noClose = false;
@@ -472,6 +475,7 @@ public class SvgImporter {
prevPoint = new Point(prevPoint.x + serl.deltaX, prevPoint.y + serl.deltaY);
serl.generalLineFlag = true;
serl.simplify();
serl.calculateBits();
newRecords.add(serl);
empty = false;
break;
@@ -486,6 +490,7 @@ public class SvgImporter {
prevPoint = new Point(prevPoint.x + serh.deltaX, prevPoint.y + serh.deltaY);
serh.generalLineFlag = true;
serh.simplify();
serh.calculateBits();
newRecords.add(serh);
empty = false;
break;
@@ -501,6 +506,7 @@ public class SvgImporter {
prevPoint = new Point(prevPoint.x + serv.deltaX, prevPoint.y + serv.deltaY);
serv.generalLineFlag = true;
serv.simplify();
serv.calculateBits();
newRecords.add(serv);
empty = false;
break;
@@ -521,6 +527,7 @@ public class SvgImporter {
cer.anchorDeltaX = (int) Math.round(p.x - prevPoint.x);
cer.anchorDeltaY = (int) Math.round(p.y - prevPoint.y);
prevPoint = new Point(prevPoint.x + cer.anchorDeltaX, prevPoint.y + cer.anchorDeltaY);
cer.calculateBits();
newRecords.add(cer);
empty = false;
break;
@@ -558,6 +565,7 @@ public class SvgImporter {
cerc.anchorDeltaX = (int) Math.round(p.x - prevPoint.x);
cerc.anchorDeltaY = (int) Math.round(p.y - prevPoint.y);
prevPoint = new Point(prevPoint.x + cerc.anchorDeltaX, prevPoint.y + cerc.anchorDeltaY);
cerc.calculateBits();
newRecords.add(cerc);
}
@@ -217,15 +217,19 @@ public abstract class ImageTag extends DrawableTag {
StraightEdgeRecord top = new StraightEdgeRecord();
top.generalLineFlag = true;
top.deltaX = rect.getWidth();
top.calculateBits();
StraightEdgeRecord right = new StraightEdgeRecord();
right.generalLineFlag = true;
right.deltaY = rect.getHeight();
right.calculateBits();
StraightEdgeRecord bottom = new StraightEdgeRecord();
bottom.generalLineFlag = true;
bottom.deltaX = -rect.getWidth();
bottom.calculateBits();
StraightEdgeRecord left = new StraightEdgeRecord();
left.generalLineFlag = true;
left.deltaY = -rect.getHeight();
left.calculateBits();
shape.shapeRecords.add(top);
shape.shapeRecords.add(right);
shape.shapeRecords.add(bottom);
@@ -277,6 +277,7 @@ public abstract class MorphShapeTag extends DrawableTag {
endPosY += cer2.controlDeltaY + cer2.anchorDeltaY;
posX += cer.controlDeltaX + cer.anchorDeltaX;
posY += cer.controlDeltaY + cer.anchorDeltaY;
cer.calculateBits();
finalRecords.add(cer);
} else {
StraightEdgeRecord ser1 = null;
@@ -301,6 +302,8 @@ public abstract class MorphShapeTag extends DrawableTag {
endPosY += ser2.deltaY;
posX += ser.deltaX;
posY += ser.deltaX;
ser.simplify();
ser.calculateBits();
finalRecords.add(ser);
}
}
@@ -402,15 +402,23 @@ public abstract class TextTag extends DrawableTag {
StraightEdgeRecord top = new StraightEdgeRecord();
top.generalLineFlag = true;
top.deltaX = rect.getWidth();
top.simplify();
top.calculateBits();
StraightEdgeRecord right = new StraightEdgeRecord();
right.generalLineFlag = true;
right.deltaY = rect.getHeight();
right.simplify();
right.calculateBits();
StraightEdgeRecord bottom = new StraightEdgeRecord();
bottom.generalLineFlag = true;
bottom.deltaX = -rect.getWidth();
bottom.simplify();
bottom.calculateBits();
StraightEdgeRecord left = new StraightEdgeRecord();
left.generalLineFlag = true;
left.deltaY = -rect.getHeight();
left.simplify();
left.calculateBits();
shape.shapeRecords.add(top);
shape.shapeRecords.add(right);
shape.shapeRecords.add(bottom);
@@ -426,6 +426,7 @@ public final class DefineCompactedFont extends FontTag {
StraightEdgeRecord ser = (StraightEdgeRecord) c;
ser.deltaX = resize(ser.deltaX);
ser.deltaY = resize(ser.deltaY);
ser.simplify();
ser.calculateBits();
}
recs.add(c);
@@ -129,6 +129,7 @@ public class ContourType implements Serializable {
closeSer.generalLineFlag = true;
closeSer.deltaX = (src.moveDeltaX - x);
closeSer.deltaY = (src.moveDeltaY - y);
closeSer.simplify();
closeSer.calculateBits();
recs.add(closeSer);
@@ -134,6 +134,7 @@ public class EdgeType implements Serializable {
ser = new StraightEdgeRecord();
ser.generalLineFlag = false;
ser.deltaX = data[1] * multiplier;
ser.simplify();
ser.calculateBits();
return ser;
case Edge_VLine:
@@ -148,6 +149,7 @@ public class EdgeType implements Serializable {
ser.generalLineFlag = true;
ser.deltaX = data[1] * multiplier;
ser.deltaY = data[2] * multiplier;
ser.simplify();
ser.calculateBits();
return ser;
case Edge_Quad:
@@ -71,6 +71,7 @@ public class CurvedEdgeRecord extends SHAPERECORD {
tmp = controlDeltaY;
controlDeltaY = -anchorDeltaY;
anchorDeltaY = -tmp;
calculateBits();
}
@Override
@@ -195,6 +195,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
ret.controlDeltaY = ser.deltaY / 2;
ret.anchorDeltaX = ser.deltaX - ret.controlDeltaX;
ret.anchorDeltaY = ser.deltaY - ret.controlDeltaY;
ret.calculateBits();
return ret;
}
@@ -345,14 +346,9 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
ser.deltaX = multiplier * (((int) Math.round(points[0])) - lastX);
ser.deltaY = multiplier * (((int) Math.round(points[1])) - lastY);
ser.generalLineFlag = ser.deltaX != 0 && ser.deltaY != 0;
if (ser.deltaX == 0) {
ser.vertLineFlag = true;
}
ser.numBits = SWFOutputStream.getNeededBitsS(ser.deltaX, ser.deltaY) - 2;
if (ser.numBits < 0) {
ser.numBits = 0;
}
ser.generalLineFlag = true;
ser.simplify();
ser.calculateBits();
retList.add(ser);
lastX = (int) Math.round(points[0]);
lastY = (int) Math.round(points[1]);
@@ -371,10 +367,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
cer.controlDeltaY = multiplier * (((int) Math.round(quadCoords[i][1])) - lastY);
cer.anchorDeltaX = multiplier * (((int) Math.round(quadCoords[i][2])) - ((int) Math.round(quadCoords[i][0])));
cer.anchorDeltaY = multiplier * (((int) Math.round(quadCoords[i][3])) - ((int) Math.round(quadCoords[i][1])));
cer.numBits = SWFOutputStream.getNeededBitsS(cer.controlDeltaX, cer.controlDeltaY, cer.anchorDeltaX, cer.anchorDeltaY) - 2;
if (cer.numBits < 0) {
cer.numBits = 0;
}
cer.calculateBits();
lastX = (int) Math.round(quadCoords[i][2]);
lastY = (int) Math.round(quadCoords[i][3]);
retList.add(cer);
@@ -386,10 +379,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
cer.controlDeltaY = multiplier * (((int) Math.round(points[1])) - lastY);
cer.anchorDeltaX = multiplier * (((int) Math.round(points[2])) - (int) Math.round(points[0]));
cer.anchorDeltaY = multiplier * (((int) Math.round(points[3])) - (int) Math.round(points[1]));
cer.numBits = SWFOutputStream.getNeededBitsS(cer.controlDeltaX, cer.controlDeltaY, cer.anchorDeltaX, cer.anchorDeltaY) - 2;
if (cer.numBits < 0) {
cer.numBits = 0;
}
cer.calculateBits();
retList.add(cer);
lastX = (int) Math.round(points[2]);
lastY = (int) Math.round(points[3]);
@@ -402,10 +392,8 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
closeSer.generalLineFlag = true;
closeSer.deltaX = multiplier * ((int) Math.round((startX - lastX)));
closeSer.deltaY = multiplier * ((int) Math.round((startY - lastY)));
closeSer.numBits = SWFOutputStream.getNeededBitsS(closeSer.deltaX, closeSer.deltaY) - 2;
if (closeSer.numBits < 0) {
closeSer.numBits = 0;
}
closeSer.simplify();
closeSer.calculateBits();
retList.add(closeSer);
lastX = startX;
lastY = startY;
@@ -515,6 +503,8 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali
StraightEdgeRecord ser = (StraightEdgeRecord) c;
ser.deltaX = (int) (multiplierX * ser.deltaX);
ser.deltaY = (int) (multiplierY * ser.deltaY);
ser.generalLineFlag = true;
ser.simplify();
ser.calculateBits();
}
@@ -91,6 +91,7 @@ public class StraightEdgeRecord extends SHAPERECORD {
public void flip() {
deltaX = -deltaX;
deltaY = -deltaY;
calculateBits();
}
@Override
@@ -611,6 +611,7 @@ public class XFLConverter {
cer.anchorDeltaX = anchorShouldBeX - (hintedX + cer.controlDeltaX);
cer.anchorDeltaY = anchorShouldBeY - (hintedY + cer.controlDeltaY);
cer.calculateBits();
hintedX = anchorShouldBeX;
hintedY = anchorShouldBeY;
}
@@ -63,6 +63,7 @@ public class CurvedEdgeRecordAdvanced extends ShapeRecordAdvanced {
ret.controlDeltaY = (int) Math.round(controlDeltaY);
ret.anchorDeltaX = (int) Math.round(anchorDeltaX);
ret.anchorDeltaY = (int) Math.round(anchorDeltaY);
ret.calculateBits();
return ret;
}