// static she::Surface* BrushPopup::createSurfaceForBrush(const BrushRef& origBrush) { Image* image = nullptr; BrushRef brush = origBrush; if (brush) { if (brush->type() != kImageBrushType && brush->size() > 10) { brush.reset(new Brush(*brush)); brush->setSize(10); } image = brush->image(); } she::Surface* surface = she::instance()->createRgbaSurface( std::min(10, image ? image->width(): 4), std::min(10, image ? image->height(): 4)); if (image) { Palette* palette = get_current_palette(); if (image->pixelFormat() == IMAGE_BITMAP) { palette = new Palette(frame_t(0), 2); palette->setEntry(0, rgba(0, 0, 0, 0)); palette->setEntry(1, rgba(0, 0, 0, 255)); } convert_image_to_surface( image, palette, surface, 0, 0, 0, 0, image->width(), image->height()); if (image->pixelFormat() == IMAGE_BITMAP) delete palette; } else { she::ScopedSurfaceLock lock(surface); lock->clear(); } return surface; }
void AppBrushes::load(const std::string& filename) { XmlDocumentRef doc = app::open_xml(filename); TiXmlHandle handle(doc.get()); TiXmlElement* brushElem = handle .FirstChild("brushes") .FirstChild("brush").ToElement(); while (brushElem) { // flags int flags = 0; BrushRef brush; app::Color fgColor; app::Color bgColor; tools::InkType inkType = tools::InkType::DEFAULT; int inkOpacity = 255; Shade shade; bool pixelPerfect = false; // Brush const char* type = brushElem->Attribute("type"); const char* size = brushElem->Attribute("size"); const char* angle = brushElem->Attribute("angle"); if (type || size || angle) { if (type) flags |= int(BrushSlot::Flags::BrushType); if (size) flags |= int(BrushSlot::Flags::BrushSize); if (angle) flags |= int(BrushSlot::Flags::BrushAngle); brush.reset( new Brush( string_id_to_brush_type(type), (size ? base::convert_to<int>(std::string(size)): 1), (angle ? base::convert_to<int>(std::string(angle)): 0))); } // Brush image if (TiXmlElement* imageElem = brushElem->FirstChildElement("image")) { ImageRef image = load_xml_image(imageElem); if (image) { if (!brush) brush.reset(new Brush()); brush->setImage(image.get()); } } // Colors if (TiXmlElement* fgcolorElem = brushElem->FirstChildElement("fgcolor")) { if (auto value = fgcolorElem->Attribute("value")) { fgColor = app::Color::fromString(value); flags |= int(BrushSlot::Flags::FgColor); } } if (TiXmlElement* bgcolorElem = brushElem->FirstChildElement("bgcolor")) { if (auto value = bgcolorElem->Attribute("value")) { bgColor = app::Color::fromString(value); flags |= int(BrushSlot::Flags::BgColor); } } // Ink if (TiXmlElement* inkTypeElem = brushElem->FirstChildElement("inktype")) { if (auto value = inkTypeElem->Attribute("value")) { inkType = app::tools::string_id_to_ink_type(value); flags |= int(BrushSlot::Flags::InkType); } } if (TiXmlElement* inkOpacityElem = brushElem->FirstChildElement("inkopacity")) { if (auto value = inkOpacityElem->Attribute("value")) { inkOpacity = base::convert_to<int>(std::string(value)); flags |= int(BrushSlot::Flags::InkOpacity); } } // Shade if (TiXmlElement* shadeElem = brushElem->FirstChildElement("shade")) { if (auto value = shadeElem->Attribute("value")) { shade = shade_from_string(value); flags |= int(BrushSlot::Flags::Shade); } } // Pixel-perfect if (TiXmlElement* pixelPerfectElem = brushElem->FirstChildElement("pixelperfect")) { pixelPerfect = bool_attr_is_true(pixelPerfectElem, "value"); flags |= int(BrushSlot::Flags::PixelPerfect); } if (flags != 0) flags |= int(BrushSlot::Flags::Locked); BrushSlot brushSlot(BrushSlot::Flags(flags), brush, fgColor, bgColor, inkType, inkOpacity, shade, pixelPerfect); m_slots.push_back(brushSlot); brushElem = brushElem->NextSiblingElement(); } }