GdkPixbuf *sp_cursor_pixbuf_from_xpm(char const *const *xpm, GdkColor const& black, GdkColor const& white, guint32 fill, guint32 stroke) { int height = 0; int width = 0; int colors = 0; int pix = 0; std::stringstream ss (std::stringstream::in | std::stringstream::out); ss << xpm[0]; ss >> height; ss >> width; ss >> colors; ss >> pix; std::map<char, RGBA> colorMap; for (int i = 0; i < colors; i++) { char const *p = xpm[1 + i]; g_assert(*p >=0); unsigned char const ccode = (guchar) *p; p++; while (isspace(*p)) { p++; } p++; while (isspace(*p)) { p++; } if (strcmp(p, "None") == 0) { colorMap[ccode] = RGBA(); } else if (strcmp(p, "Fill") == 0) { colorMap[ccode] = RGBA(SP_RGBA32_R_U(fill), SP_RGBA32_G_U(fill), SP_RGBA32_B_U(fill), SP_RGBA32_A_U(fill)); } else if (strcmp(p, "Stroke") == 0) { colorMap[ccode] = RGBA(SP_RGBA32_R_U(stroke), SP_RGBA32_G_U(stroke), SP_RGBA32_B_U(stroke), SP_RGBA32_A_U(stroke)); } else if (strcmp(p, "#000000") == 0) { colorMap[ccode] = RGBA(black.red, black.green, black.blue, 255); } else if (strcmp(p, "#FFFFFF") == 0) { colorMap[ccode] = RGBA(white.red, white.green, white.blue, 255); } else { colorMap[ccode] = RGBA(); } } guint32 *pixmap_buffer = new guint32[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { std::map<char, RGBA>::const_iterator it = colorMap.find(xpm[1 + colors + y][x]); pixmap_buffer[y * width + x] = (it == colorMap.end()) ? 0u : it->second; } } return gdk_pixbuf_new_from_data(reinterpret_cast<guchar*>(pixmap_buffer), GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * sizeof(guint32), free_cursor_data, NULL); }
void ColorICCSelector::_switchToProfile( gchar const* name ) { bool dirty = false; SPColor tmp( _color ); if ( name ) { if ( tmp.icc && tmp.icc->colorProfile == name ) { #ifdef DEBUG_LCMS g_message("Already at name [%s]", name ); #endif // DEBUG_LCMS } else { #ifdef DEBUG_LCMS g_message("Need to switch to profile [%s]", name ); #endif // DEBUG_LCMS if ( tmp.icc ) { tmp.icc->colors.clear(); } else { tmp.icc = new SVGICCColor(); } tmp.icc->colorProfile = name; Inkscape::ColorProfile* newProf = SP_ACTIVE_DOCUMENT->profileManager->find(name); if ( newProf ) { cmsHTRANSFORM trans = newProf->getTransfFromSRGB8(); if ( trans ) { guint32 val = _color.toRGBA32(0); guchar pre[4] = { static_cast<guchar>(SP_RGBA32_R_U(val)), static_cast<guchar>(SP_RGBA32_G_U(val)), static_cast<guchar>(SP_RGBA32_B_U(val)), 255}; #ifdef DEBUG_LCMS g_message("Shoving in [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]); #endif // DEBUG_LCMS cmsUInt16Number post[4] = {0,0,0,0}; cmsDoTransform( trans, pre, post, 1 ); #ifdef DEBUG_LCMS g_message("got on out [%04x] [%04x] [%04x] [%04x]", post[0], post[1], post[2], post[3]); #endif // DEBUG_LCMS #if HAVE_LIBLCMS1 guint count = _cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) ); #elif HAVE_LIBLCMS2 guint count = cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) ); #endif gchar const** names = 0; gchar const** tips = 0; guint const* scales = 0; getThings( asICColorSpaceSig(newProf->getColorSpace()), names, tips, scales ); for ( guint i = 0; i < count; i++ ) { gdouble val = (((gdouble)post[i])/65535.0) * (gdouble)scales[i]; #ifdef DEBUG_LCMS g_message(" scaled %d by %d to be %f", i, scales[i], val); #endif // DEBUG_LCMS tmp.icc->colors.push_back(val); } cmsHTRANSFORM retrans = newProf->getTransfToSRGB8(); if ( retrans ) { cmsDoTransform( retrans, post, pre, 1 ); #ifdef DEBUG_LCMS g_message(" back out [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]); #endif // DEBUG_LCMS tmp.set(SP_RGBA32_U_COMPOSE(pre[0], pre[1], pre[2], 0xff)); } } } dirty = true; } } else { #ifdef DEBUG_LCMS g_message("NUKE THE ICC"); #endif // DEBUG_LCMS if ( tmp.icc ) { delete tmp.icc; tmp.icc = 0; dirty = true; _fixupHit( 0, this ); } else { #ifdef DEBUG_LCMS g_message("No icc to nuke"); #endif // DEBUG_LCMS } } if ( dirty ) { #ifdef DEBUG_LCMS g_message("+----------------"); g_message("+ new color is [%s]", tmp.toString().c_str()); #endif // DEBUG_LCMS _setProfile( tmp.icc ); //_adjustmentChanged( _fooAdj[0], SP_COLOR_ICC_SELECTOR(_csel) ); setColorAlpha( tmp, _alpha, true ); #ifdef DEBUG_LCMS g_message("+_________________"); #endif // DEBUG_LCMS } }