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); }
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); }
// _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; }