private void OpenFile(string filename) { #if !DEBUG try { #endif _filename = filename; fileIn = new System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)); string startFileSig = ""; for (int i = 0; i < 4; i++) // 4 bytes { startFileSig += fileIn.ReadChar(); } if (startFileSig != "#PES") { // This is not a file that we can read readyStatus = statusEnum.ParseError; lastError = "Missing #PES at beginning of file"; fileIn.Close(); return; } // PES version string versionString = ""; for (int i = 0; i < 4; i++) // 4 bytes { versionString += fileIn.ReadChar(); } pesVersion = Convert.ToUInt16(versionString); int pecstart = fileIn.ReadInt32(); fileIn.BaseStream.Position = pecstart + 48; int numColors = fileIn.ReadByte() +1; List<byte> colorList = new List<byte>(); for (int x = 0; x < numColors; x++) { colorList.Add(fileIn.ReadByte()); } fileIn.BaseStream.Position = pecstart + 532; bool thisPartIsDone = false; stitchBlock curBlock; int prevX = 0; int prevY = 0; int maxX = 0; int minX = 0; int maxY = 0; int minY = 0; int colorNum = -1; int colorIndex = 0; List<Point> tempStitches = new List<Point>(); while (!thisPartIsDone) { byte val1; byte val2; val1 = fileIn.ReadByte(); val2 = fileIn.ReadByte(); if (val1 == 255 && val2 == 0) { //end of stitches thisPartIsDone = true; //add the last block curBlock = new stitchBlock(); curBlock.stitches = new Point[tempStitches.Count]; tempStitches.CopyTo(curBlock.stitches); curBlock.stitchesTotal = tempStitches.Count; colorNum++; colorIndex = colorList[colorNum]; curBlock.colorIndex = colorIndex; curBlock.color = getColorFromIndex(colorIndex); blocks.Add(curBlock); } else if (val1 == 254 && val2 == 176) { //color switch, start a new block curBlock = new stitchBlock(); curBlock.stitches = new Point[tempStitches.Count]; tempStitches.CopyTo(curBlock.stitches); curBlock.stitchesTotal = tempStitches.Count; colorNum++; colorIndex = colorList[colorNum]; curBlock.colorIndex = colorIndex; curBlock.color = getColorFromIndex(colorIndex); blocks.Add(curBlock); tempStitches = new List<Point>(); //read useless(?) byte fileIn.ReadByte(); } else { int deltaX = 0; int deltaY = 0; if ((val1 & 0x80) == 0x80) { //this is a jump stitch deltaX = ((val1 & 0x0f) << 8) + val2; /* dead code? bit we're checking is masked out in previous line if ((deltaX & 0x0800) == 0x0800) { deltaX = deltaX - 4096; } */ //read next byte for Y value val2 = fileIn.ReadByte(); } else { //normal stitch deltaX = val1; if (deltaX > 63) { deltaX = deltaX - 128; } } if ((val2 & 0x08) == 0x80) { //this is a jump stitch int val3 = fileIn.ReadByte(); deltaY = ((val2 & 0x0f) << 8) + val3; /* dead code? bit we're checking is masked out in previous line if ((deltaY & 0x0800) == 0x0800) { deltaY = deltaY - 4096; }*/ } else { //normal stitch deltaY = val2; if (deltaY > 63) { deltaY = deltaY - 128; } } tempStitches.Add(new Point(prevX + deltaX, prevY + deltaY)); prevX = prevX + deltaX; prevY = prevY + deltaY; if (prevX > maxX) { maxX = prevX; } else if (prevX < minX) { minX = prevX; } if (prevY > maxY) { maxY = prevY; } else if (prevY < minY) { minY = prevY; } } } imageWidth = maxX - minX; imageHeight = maxY - minY; translateStart.X = -minX; translateStart.Y = -minY; readyStatus = statusEnum.Ready; // Close the file fileIn.Close(); #if !DEBUG } catch (System.IO.IOException ioex) { readyStatus = statusEnum.IOError; lastError = ioex.Message; if (fileIn != null) { fileIn.Close(); } } catch (Exception ex) { readyStatus = statusEnum.ParseError; lastError = ex.Message; if (fileIn != null) { fileIn.Close(); } } #endif }
/*void readCSewFigSeg(System.IO.BinaryReader file) { startStitches = fileIn.BaseStream.Position; bool doneWithStitches = false; int xValue = -100; int yValue = -100; stitchBlock currentBlock; int blockType; //if this is equal to newColorMarker, it's time to change color int colorIndex = 0; int remainingStitches; List<Point> stitchData; stitchData = new List<Point>(); currentBlock = new stitchBlock(); while (!doneWithStitches) { //reset variables xValue = 0; yValue = 0; blockType = file.ReadInt16(); if (blockType == 16716) break; colorIndex = file.ReadInt16(); if (colorIndex == 16716) break; remainingStitches = file.ReadInt16(); if (remainingStitches == 16716) break; while (remainingStitches >= 0) { xValue = file.ReadInt16(); if (xValue == -32765) { break;//drop out before we start eating into the next section } if (remainingStitches == 0) { int junk2 = 0; junk2 = blocks.Count; file.ReadBytes(24); if (file.ReadInt16() == -1) doneWithStitches = true; currentBlock.stitches = new Point[stitchData.Count]; stitchData.CopyTo(currentBlock.stitches); currentBlock.colorIndex = colorIndex; currentBlock.color = getColorFromIndex(colorIndex); currentBlock.stitchesTotal = stitchData.Count; blocks.Add(currentBlock); stitchData = new List<Point>(); currentBlock = new stitchBlock(); file.ReadBytes(48); break; } else if (xValue == 16716 || xValue == 8224) { doneWithStitches = true; break; } yValue = fileIn.ReadInt16(); if (yValue == 16716 || yValue == 8224) { doneWithStitches = true; break; } stitchData.Add(new Point(xValue - translateStart.X, yValue + imageHeight - translateStart.Y)); remainingStitches--; } } if (stitchData.Count > 1) { currentBlock.stitches = new Point[stitchData.Count]; stitchData.CopyTo(currentBlock.stitches); currentBlock.colorIndex = colorIndex; currentBlock.color = getColorFromIndex(colorIndex); currentBlock.stitchesTotal = stitchData.Count; blocks.Add(currentBlock); } }*/ List<stitchBlock> filterStitches(List<stitchBlock> input, int threshold) { List<stitchBlock> retval = new List<stitchBlock>(); List<Point> tempStitchData = new List<Point>(); for (int x = 0; x < input.Count; x++) { for (int i = 0; i < input[x].stitches.Length; i++) { if (i > 0)//need a previous point to check against, can't check the first { double diffx = Math.Abs(input[x].stitches[i].X - input[x].stitches[i - 1].X); double diffy = Math.Abs(input[x].stitches[i].Y - input[x].stitches[i - 1].Y); if (Math.Sqrt(Math.Pow(diffx, 2.0) + Math.Pow(diffy, 2.0)) < threshold) //check distance between this point and the last one { if (tempStitchData.Count == 0 && i > 1)//first stitch of block gets left out without this, except for very first stitch { tempStitchData.Add(input[x].stitches[i - 1]); } tempStitchData.Add(input[x].stitches[i]); } else//stitch is too far from the previous one { if (tempStitchData.Count > 2)//add the block and start a new one { stitchBlock tempBlock = new stitchBlock(); tempBlock.color = input[x].color; tempBlock.colorIndex = input[x].colorIndex; tempBlock.stitches = new Point[tempStitchData.Count]; tempStitchData.CopyTo(tempBlock.stitches); retval.Add(tempBlock); tempStitchData = new List<Point>(); } else//reset variables { tempStitchData = new List<Point>(); } } } else //just add the first one, don't have anything to compare against { tempStitchData.Add(input[x].stitches[i]); } } if (tempStitchData.Count > 2) { stitchBlock tempBlock = new stitchBlock(); tempBlock.color = input[x].color; tempBlock.colorIndex = input[x].colorIndex; tempBlock.stitches = new Point[tempStitchData.Count]; tempStitchData.CopyTo(tempBlock.stitches); retval.Add(tempBlock); tempStitchData = new List<Point>(); } } return retval; }