public int addCharacter(char data, LinkSet ls, bool ul) { WordArea ia = null; int remainingWidth = this.getRemainingWidth(); int width = this.currentFontState.GetWidth(currentFontState.MapCharacter(data)); if (width > remainingWidth) { return Character.DOESNOT_FIT; } else { if (Char.IsWhiteSpace(data) && whiteSpaceCollapse == WhiteSpaceCollapse.TRUE) { return Character.OK; } ia = new WordArea(currentFontState, this.red, this.green, this.blue, data.ToString(), width); ia.setYOffset(placementOffset); ia.setUnderlined(ul); pendingAreas.Add(ia); if (Char.IsWhiteSpace(data)) { this.spaceWidth = +width; prev = LineArea.WHITESPACE; } else { pendingWidth += width; prev = LineArea.TEXT; } return Character.OK; } }
private void addSpacedWord(string word, LinkSet ls, int startw, int spacew, TextState textState, bool addToPending) { /* * Split string based on four delimeters: * \u00A0 - Latin1 NBSP (Non breaking space) * \u202F - unknown reserved character according to Unicode Standard * \u3000 - CJK IDSP (Ideographic space) * \uFEFF - Arabic ZWN BSP (Zero width no break space) */ StringTokenizer st = new StringTokenizer(word, "\u00A0\u202F\u3000\uFEFF", true); int extraw = 0; while (st.MoveNext()) { string currentWord = (string)st.Current; if (currentWord.Length == 1 && (isNBSP(currentWord[0]))) { // Add an InlineSpace int spaceWidth = getCharWidth(currentWord[0]); if (spaceWidth > 0) { InlineSpace ispace = new InlineSpace(spaceWidth); extraw += spaceWidth; if (prevUlState) { ispace.setUnderlined(textState.getUnderlined()); } if (prevOlState) { ispace.setOverlined(textState.getOverlined()); } if (prevLTState) { ispace.setLineThrough(textState.getLineThrough()); } if (addToPending) { pendingAreas.Add(ispace); pendingWidth += spaceWidth; } else { addChild(ispace); } } } else { WordArea ia = new WordArea(currentFontState, this.red, this.green, this.blue, currentWord, getWordWidth(currentWord)); ia.setYOffset(placementOffset); ia.setUnderlined(textState.getUnderlined()); prevUlState = textState.getUnderlined(); ia.setOverlined(textState.getOverlined()); prevOlState = textState.getOverlined(); ia.setLineThrough(textState.getLineThrough()); prevLTState = textState.getLineThrough(); ia.setVerticalAlign(vAlign); if (addToPending) { pendingAreas.Add(ia); pendingWidth += getWordWidth(currentWord); } else { addChild(ia); } if (ls != null) { Rectangle lr = new Rectangle(startw + extraw, spacew, ia.getContentWidth(), fontState.FontSize); ls.addRect(lr, this, ia); } } } }