diff options
| author | nyamatongwe <unknown> | 2011-09-24 22:10:59 +1000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2011-09-24 22:10:59 +1000 | 
| commit | 77d25bd25490fe412a213581e371c7c26eb23f7d (patch) | |
| tree | e91d99a2328e82067e9781599cb2e058a8400fa3 /src/Editor.cxx | |
| parent | df08d45447c2b2386629d13004f4ab6006cab2d8 (diff) | |
| parent | 33e27dc25f933a92566d91a667ba4ee732ba6cfa (diff) | |
| download | scintilla-mirror-77d25bd25490fe412a213581e371c7c26eb23f7d.tar.gz | |
Merged fractional text positioning branch.
Diffstat (limited to 'src/Editor.cxx')
| -rw-r--r-- | src/Editor.cxx | 106 | 
1 files changed, 79 insertions, 27 deletions
| diff --git a/src/Editor.cxx b/src/Editor.cxx index 2e4d724e5..507ae60a1 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -102,7 +102,8 @@ Editor::Editor() {  	ctrlID = 0;  	stylesValid = false; - +	technology = SC_TECHNOLOGY_DEFAULT; +	  	printMagnification = 0;  	printColourMode = SC_PRINT_NORMAL;  	printWrapState = eWrapWord; @@ -168,11 +169,11 @@ Editor::Editor() {  	additionalCaretsVisible = true;  	virtualSpaceOptions = SCVS_NONE; -	pixmapLine = Surface::Allocate(); -	pixmapSelMargin = Surface::Allocate(); -	pixmapSelPattern = Surface::Allocate(); -	pixmapIndentGuide = Surface::Allocate(); -	pixmapIndentGuideHighlight = Surface::Allocate(); +	pixmapLine = 0; +	pixmapSelMargin = 0; +	pixmapSelPattern = 0; +	pixmapIndentGuide = 0; +	pixmapIndentGuideHighlight = 0;  	targetStart = 0;  	targetEnd = 0; @@ -227,12 +228,7 @@ Editor::~Editor() {  	pdoc->RemoveWatcher(this, 0);  	pdoc->Release();  	pdoc = 0; -	DropGraphics(); -	delete pixmapLine; -	delete pixmapSelMargin; -	delete pixmapSelPattern; -	delete pixmapIndentGuide; -	delete pixmapIndentGuideHighlight; +	DropGraphics(true);  }  void Editor::Finalise() { @@ -240,17 +236,50 @@ void Editor::Finalise() {  	CancelModes();  } -void Editor::DropGraphics() { -	pixmapLine->Release(); -	pixmapSelMargin->Release(); -	pixmapSelPattern->Release(); -	pixmapIndentGuide->Release(); -	pixmapIndentGuideHighlight->Release(); +void Editor::DropGraphics(bool freeObjects) { +	if (freeObjects) { +		delete pixmapLine; +		pixmapLine = 0; +		delete pixmapSelMargin; +		pixmapSelMargin = 0; +		delete pixmapSelPattern; +		pixmapSelPattern = 0; +		delete pixmapIndentGuide; +		pixmapIndentGuide = 0; +		delete pixmapIndentGuideHighlight; +		pixmapIndentGuideHighlight = 0; +	} else { +		if (pixmapLine) +			pixmapLine->Release(); +		if (pixmapSelMargin) +			pixmapSelMargin->Release(); +		if (pixmapSelPattern) +			pixmapSelPattern->Release(); +		if (pixmapIndentGuide) +			pixmapIndentGuide->Release(); +		if (pixmapIndentGuideHighlight) +			pixmapIndentGuideHighlight->Release(); +	} +} + +void Editor::AllocateGraphics() { +	if (!pixmapLine) +		pixmapLine = Surface::Allocate(technology); +	if (!pixmapSelMargin) +		pixmapSelMargin = Surface::Allocate(technology); +	if (!pixmapSelPattern) +		pixmapSelPattern = Surface::Allocate(technology); +	if (!pixmapIndentGuide) +		pixmapIndentGuide = Surface::Allocate(technology); +	if (!pixmapIndentGuideHighlight) +		pixmapIndentGuideHighlight = Surface::Allocate(technology);  }  void Editor::InvalidateStyleData() {  	stylesValid = false; -	DropGraphics(); +	vs.technology = technology; +	DropGraphics(false); +	AllocateGraphics();  	palette.Release();  	llc.Invalidate(LineLayout::llInvalid);  	posCache.Clear(); @@ -2220,7 +2249,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou  		// Layout the line, determining the position of each character,  		// with an extra element at the end for the end of the line.  		int startseg = 0;	// Start of the current segment, in char. number -		int startsegx = 0;	// Start of the current segment, in pixels +		XYACCUMULATOR startsegx = 0;	// Start of the current segment, in pixels  		ll->positions[0] = 0;  		unsigned int tabWidth = vstyle.spaceWidth * pdoc->tabInChars;  		bool lastSegItalics = false; @@ -2241,7 +2270,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou  				if (vstyle.styles[ll->styles[charInLine]].visible) {  					if (isControl) {  						if (ll->chars[charInLine] == '\t') { -							ll->positions[charInLine + 1] = ((((startsegx + 2) / +							ll->positions[charInLine + 1] = ((((static_cast<int>(startsegx) + 2) /  							        tabWidth) + 1) * tabWidth) - startsegx;  						} else if (controlCharSymbol < 32) {  							if (ctrlCharWidth[ll->chars[charInLine]] == 0) { @@ -2906,8 +2935,10 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis  		// draw strings that are completely past the right side of the window.  		if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) {  			// Clip to line rectangle, since may have a huge position which will not work with some platforms -			rcSegment.left = Platform::Maximum(rcSegment.left, rcLine.left); -			rcSegment.right = Platform::Minimum(rcSegment.right, rcLine.right); +			if (rcSegment.left < rcLine.left) +				rcSegment.left = rcLine.left; +			if (rcSegment.right > rcLine.right) +				rcSegment.right = rcLine.right;  			int styleMain = ll->styles[i];  			const int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc); @@ -3383,7 +3414,7 @@ void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xS  		const int spaceWidth = static_cast<int>(vsDraw.styles[ll->EndLineStyle()].spaceWidth);  		const int virtualOffset = posCaret.VirtualSpace() * spaceWidth;  		if (ll->InLine(offset, subLine) && offset <= ll->numCharsBeforeEOL) { -			int xposCaret = ll->positions[offset] + virtualOffset - ll->positions[ll->LineStart(subLine)]; +			XYPOSITION xposCaret = ll->positions[offset] + virtualOffset - ll->positions[ll->LineStart(subLine)];  			if (ll->wrapIndent != 0) {  				int lineStart = ll->LineStart(subLine);  				if (lineStart != 0)	// Wrapped @@ -3928,7 +3959,7 @@ void Editor::SetScrollBars() {  }  void Editor::ChangeSize() { -	DropGraphics(); +	DropGraphics(false);  	SetScrollBars();  	if (wrapState != eWrapNone) {  		PRectangle rcTextArea = GetClientRectangle(); @@ -6983,7 +7014,10 @@ void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam  		vs.styles[wParam].back.desired = ColourDesired(lParam);  		break;  	case SCI_STYLESETBOLD: -		vs.styles[wParam].bold = lParam != 0; +		vs.styles[wParam].weight = lParam != 0 ? SC_WEIGHT_BOLD : SC_WEIGHT_NORMAL; +		break; +	case SCI_STYLESETWEIGHT: +		vs.styles[wParam].weight = lParam;  		break;  	case SCI_STYLESETITALIC:  		vs.styles[wParam].italic = lParam != 0; @@ -6992,6 +7026,9 @@ void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam  		vs.styles[wParam].eolFilled = lParam != 0;  		break;  	case SCI_STYLESETSIZE: +		vs.styles[wParam].size = lParam * SC_FONT_SIZE_MULTIPLIER; +		break; +	case SCI_STYLESETSIZEFRACTIONAL:  		vs.styles[wParam].size = lParam;  		break;  	case SCI_STYLESETFONT: @@ -7029,12 +7066,16 @@ sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lPar  	case SCI_STYLEGETBACK:  		return vs.styles[wParam].back.desired.AsLong();  	case SCI_STYLEGETBOLD: -		return vs.styles[wParam].bold ? 1 : 0; +		return vs.styles[wParam].weight > SC_WEIGHT_NORMAL; +	case SCI_STYLEGETWEIGHT: +		return vs.styles[wParam].weight;  	case SCI_STYLEGETITALIC:  		return vs.styles[wParam].italic ? 1 : 0;  	case SCI_STYLEGETEOLFILLED:  		return vs.styles[wParam].eolFilled ? 1 : 0;  	case SCI_STYLEGETSIZE: +		return vs.styles[wParam].size / SC_FONT_SIZE_MULTIPLIER; +	case SCI_STYLEGETSIZEFRACTIONAL:  		return vs.styles[wParam].size;  	case SCI_STYLEGETFONT:  		if (!vs.styles[wParam].fontName) @@ -8146,9 +8187,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_STYLESETFORE:  	case SCI_STYLESETBACK:  	case SCI_STYLESETBOLD: +	case SCI_STYLESETWEIGHT:  	case SCI_STYLESETITALIC:  	case SCI_STYLESETEOLFILLED:  	case SCI_STYLESETSIZE: +	case SCI_STYLESETSIZEFRACTIONAL:  	case SCI_STYLESETFONT:  	case SCI_STYLESETUNDERLINE:  	case SCI_STYLESETCASE: @@ -8162,9 +8205,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_STYLEGETFORE:  	case SCI_STYLEGETBACK:  	case SCI_STYLEGETBOLD: +	case SCI_STYLEGETWEIGHT:  	case SCI_STYLEGETITALIC:  	case SCI_STYLEGETEOLFILLED:  	case SCI_STYLEGETSIZE: +	case SCI_STYLEGETSIZEFRACTIONAL:  	case SCI_STYLEGETFONT:  	case SCI_STYLEGETUNDERLINE:  	case SCI_STYLEGETCASE: @@ -9203,6 +9248,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_GETIDENTIFIER:  		return GetCtrlID(); +	case SCI_SETTECHNOLOGY: +		// No action by default +		break; +	 +	case SCI_GETTECHNOLOGY: +		return technology; +  	default:  		return DefWndProc(iMessage, wParam, lParam);  	} | 
