Пример #1
0
static void
draw_shape(void* _context, const BShape& shape, bool fill)
{
	DrawingContext* context = reinterpret_cast<DrawingContext *>(_context);
	ShapePainter drawShape(context);

	drawShape.Iterate(&shape);
	drawShape.Draw(shape.Bounds(), fill);
}
Пример #2
0
static void
draw_shape(void* _canvas, const BShape& shape, bool fill)
{
	Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
	ShapePainter drawShape(canvas);

	drawShape.Iterate(&shape);
	drawShape.Draw(shape.Bounds(), fill);
}
Пример #3
0
// _Import
status_t
StyledTextImporter::_Import(Icon* icon, const char *text, text_run_array *runs)
{
	CALLED();
	status_t ret = Init(icon);
	if (ret < B_OK) {
		printf("StyledTextImporter::Import() - "
			   "Init() error: %s\n", strerror(ret));
		return ret;
	}

	BString str(text);
	if (str.Length() > 50) {
		BAlert* alert = new BAlert("too big",
			"The text you are trying to import is quite long, are you sure?",
			"Yes", "No", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
		if (alert->Go())
			return B_CANCELED;
	}

	// import run colors as styles
	if (runs) {
		delete[] fStyleMap;
		fStyleMap = new struct style_map[runs->count];
		for (int32 i = 0; runs && i < runs->count; i++) {
			_AddStyle(icon, &runs->runs[i]);
		}
	}

	int32 currentRun = 0;
	text_run *run = NULL;
	if (runs)
		run = &runs->runs[0];
	int32 len = str.Length();
	int32 chars = str.CountChars();
	BPoint origin(0,0);
	BPoint offset(origin);

	for (int32 i = 0, c = 0; i < len && c < chars; c++) {
		// make sure we are still on the (good) run
		while (run && currentRun < runs->count - 1 &&
			i >= runs->runs[currentRun + 1].offset) {
			run = &runs->runs[++currentRun];
			//printf("switching to run %d\n", currentRun);
		}

		int charLen;
		for (charLen = 1; str.ByteAt(i + charLen) & 0x80; charLen++);

		BShape glyph;
		BShape *glyphs[1] = { &glyph };
		BFont font(be_plain_font);
		if (run)
			font = run->font;

		// first char
		if (offset == BPoint(0,0)) {
			font_height height;
			font.GetHeight(&height);
			origin.y += height.ascent;
			offset = origin;
		}
		// LF
		if (str[i] == '\n') {
			// XXX: should take the MAX() for the line
			// XXX: should use descent + leading from previous line
			font_height height;
			font.GetHeight(&height);
			origin.y += height.ascent + height.descent + height.leading;
			offset = origin;
			i++;
			continue;
		}

		float charWidth;
		charWidth = font.StringWidth(str.String() + i, charLen);
		//printf("StringWidth( %d) = %f\n", charLen, charWidth);
		BString glyphName(str.String() + i, charLen);
		glyphName.Prepend("Glyph (");
		glyphName.Append(")");

		font.GetGlyphShapes((str.String() + i), 1, glyphs);
		if (glyph.Bounds().IsValid()) {
			//offset.x += glyph.Bounds().Width();
			offset.x += charWidth;
			Shape* shape = new (nothrow) Shape(NULL);
			shape->SetName(glyphName.String());
			if (!shape || !icon->Shapes()->AddShape(shape)) {
				delete shape;
				return B_NO_MEMORY;
			}
			for (int j = 0; run && j < fStyleCount; j++) {
				if (fStyleMap[j].run == run) {
					shape->SetStyle(fStyleMap[j].style);
					break;
				}
			}
			ShapeIterator iterator(icon, shape, offset, glyphName.String());
			if (iterator.Iterate(&glyph) < B_OK)
				return B_ERROR;

		}

		// skip the rest of UTF-8 char bytes
		for (i++; i < len && str[i] & 0x80; i++);
	}

	delete[] fStyleMap;
	fStyleMap = NULL;

	return B_OK;
}