void vsBuiltInFont::CreateStringInDisplayList(vsDisplayList *list, const vsString &string, float size, float capSize, JustificationType j, float maxWidth) { if ( maxWidth > 0.f ) { WrapLine(string, size, capSize, j, maxWidth); float lineHeight = capSize; float lineMargin = capSize * c_lineMarginFactor; // float baseOffsetDown = lineHeight * (m_wrappedLineCount * 0.5f); float totalHeight = (lineHeight * s_wrappedLineCount) + (lineMargin * (s_wrappedLineCount-1)); float baseOffsetDown = totalHeight * 0.5f; float topLinePosition = baseOffsetDown - totalHeight + lineHeight; // float halfTotalHeight = totalHeight * 0.5f; list->Clear(); vsVector2D offset(0.f,topLinePosition); for ( int i = 0; i < s_wrappedLineCount; i++ ) { offset.y = topLinePosition + (i*(lineHeight+lineMargin)); s_tempFontList.Clear(); BuildDisplayListFromString( &s_tempFontList, s_wrappedLine[i].c_str(), size, capSize, j, offset ); list->Append(s_tempFontList); } vsVector2D tl,br; list->GetBoundingBox(tl,br); /* float height = br.y-tl.y; list->Clear(); for ( int i = 0; i < m_wrappedLineCount; i++ ) { offset.Set(0.f,lineHeight*i - 0.5f*height); s_tempFontList.Clear(); BuildDisplayListFromString( &s_tempFontList, m_wrappedLine[i].c_str(), size, capSize, j, offset ); list->Append(s_tempFontList); }*/ } else { float lineHeight = capSize; float totalHeight = lineHeight; float baseOffsetDown = totalHeight * 0.5f; float topLinePosition = baseOffsetDown - totalHeight + lineHeight; list->Clear(); vsVector2D offset(0.f,topLinePosition); list->Clear(); BuildDisplayListFromString( list, string.c_str(), size, capSize, j, offset ); } }
bool TextFormatter::FormatFwd(CFDC& dc, FilePos start) { AdjustPos(start); // just to be safe if (start.para >= m_tf->Length(start.docid)) return false; // at eof m_lines.RemoveAll(); m_top = start; bool header = true; for (int page = 0; page < m_pages; ++page) { int h = 0; int beg = m_lines.GetSize(); while (h < m_height && start.para < m_tf->Length(start.docid)) { Paragraph para(m_tf->GetParagraph(start.docid, start.para)); bool empty = para.len == 0 || para.len == 1 && para.str[0] == _T(' '); if (h == 0 && empty) { start.off = para.len; AdjustPos(start); continue; } if (para.flags & Paragraph::header) { if (!header) break; } else if (!empty && !(para.flags & Paragraph::image)) header = false; int lh = WrapLine(dc, para, start, m_lines, h, m_height - h); if (lh < 0) break; AdjustPos(start); h += lh; } m_pagelen.SetAtGrow(page, m_lines.GetSize() - beg); } m_bot = start; Highlight(); // add one dummy line always Line l; l.pos = m_bot; m_lines.Add(l); return true; }
void TextFormatter::FormatPlainText(CFDC& dc, int& width, int& height, int fontsize, const wchar_t *text, int len, LineArray& lines) { lines.RemoveAll(); int save_width = m_width; bool save_justified = m_justified; m_width = width; m_justified = false; const wchar_t *top = text + len; Attr attr; attr.wa = 0; attr.fsize = fontsize; int curh = 0; while (text < top && curh < height) { const wchar_t *p_end = text; while (p_end < top && *p_end != '\r' && *p_end != '\n') ++p_end; Paragraph p(p_end - text); memcpy(p.str, text, (p_end - text)*sizeof(wchar_t)); for (int i = 0; i < p.cflags.size(); ++i) p.cflags[i].wa = attr.wa; p.findent = 3; // XXX int last = lines.GetSize(); FilePos fp = FilePos(); int lh = WrapLine(dc, p, fp, lines, curh, height - curh); if (lh < 0) { // it still might add something while (last < lines.GetSize()) curh += lines[last++].height; break; } curh += lh; while (p_end < top && (*p_end == '\r' || *p_end == '\n')) ++p_end; text = p_end; } m_width = save_width; m_justified = save_justified; // deduct ispace int min_ispace = -1, max_width = 0; for (int i = 0; i < lines.GetSize(); ++i) { const Line& ll = lines[i]; int w = 0; for (int j = 0; j < ll.dx.size(); ++j) w += ll.dx[j]; w += ll.ispace; if (max_width < w) max_width = w; if (min_ispace<0 || min_ispace>ll.ispace) min_ispace = ll.ispace; } if (min_ispace > 0) { for (int i = 0; i < lines.GetSize(); ++i) lines[i].ispace -= min_ispace; max_width -= min_ispace; } height = curh; width = max_width; }
bool TextFormatter::FormatBack(CFDC& dc, FilePos start, FilePos prev_top) { AdjustPos(start, true); if (start.para == 0 && start.off == 0) return false; // at the top m_lines.RemoveAll(); m_bot = start; for (int page = m_pages - 1; page >= 0; --page) { LineArray tmp; FilePos pos = start; int h = 0; // while there are still paragrahs before while (h < m_height && (pos.para>0 || pos.off > 0)) { // format entire paragraph LineArray cp; Paragraph para(m_tf->GetParagraph(pos.docid, pos.para)); if (pos.off < para.len) // double check args para.len = pos.off; else pos.off = para.len; FilePos fp = FilePos(pos.para, 0, pos.docid); WrapLine(dc, para, fp, cp, 0, 32768); // insert the formatted paragraph at start of list tmp.InsertAt(0, &cp); for (int i = 0; i < cp.GetSize(); ++i) h += cp[i].height; pos.off = 0; AdjustPos(pos, true); } // delete extra lines int j; // remove top lines for (h = 0, j = tmp.GetUpperBound(); j >= 0 && h + tmp[j].height <= m_height; --j) h += tmp[j].height; if (j < tmp.GetUpperBound()) { if (j >= 0 && prev_top != 0 && tmp[j + 1].pos >= prev_top) { --j; tmp.RemoveAt(0, j + 1); // now remove bottom lines for (h = j = 0; j < tmp.GetSize() && h + tmp[j].height <= m_height; ++j) h += tmp[j].height; if (j < tmp.GetSize()) tmp.RemoveAt(j, tmp.GetSize() - j); } else { tmp.RemoveAt(0, j + 1); } } // save lines m_lines.InsertAt(0, &tmp); m_pagelen.SetAtGrow(page, tmp.GetSize()); start = m_lines[0].pos; if (start.para == 0 && start.off == 0) // we reached the top of file return FormatFwd(dc, FilePos(0, 0, start.docid)); } // save positions m_top = m_lines[0].pos; Highlight(); // add one dummy line always Line l; l.pos = m_bot; m_lines.Add(l); return true; }
/* * Called when read from service pipe signals */ static void OnService(connection_t *c, UNUSED char *msg) { DWORD err = 0; DWORD pid = 0; WCHAR *p, *buf, *next; DWORD len; const WCHAR *prefix = L"IService> "; len = wcslen (c->iserv.readbuf); if (!len || (buf = wcsdup (c->iserv.readbuf)) == NULL) return; /* messages from the service are in the format "0x08x\n%s\n%s" */ if (swscanf (buf, L"0x%08x\n", &err) != 1) { free (buf); return; } p = buf + 11; if (!err && swscanf (p, L"0x%08x\nProcess ID", &pid) == 1 && pid != 0) { PrintDebug (L"Process ID of openvpn started by IService: %d", pid); c->hProcess = OpenProcess (PROCESS_TERMINATE|PROCESS_QUERY_INFORMATION, FALSE, pid); if (!c->hProcess) PrintDebug (L"Failed to get process handle from pid of openvpn: error = %lu", GetLastError()); free (buf); return; } while (iswspace(*p)) ++p; while (p && *p) { next = WrapLine (p); WriteStatusLog (c, prefix, p, c->manage.connected ? FALSE : TRUE); p = next; } free (buf); /* Error from iservice before management interface is connected */ switch (err) { case 0: break; case ERROR_STARTUP_DATA: WriteStatusLog (c, prefix, L"OpenVPN not started due to previous errors", true); c->state = timedout; /* Force the popup message to include the log file name */ OnStop (c, NULL); break; case ERROR_OPENVPN_STARTUP: WriteStatusLog (c, prefix, L"Check the log file for details", false); c->state = timedout; /* Force the popup message to include the log file name */ OnStop(c, NULL); break; default: /* Unknown failure: let management connection timeout */ break; } }