/* * GetAttr */ static PyObject * PyDiaImage_GetAttr(PyDiaImage *self, gchar *attr) { if (!strcmp(attr, "__members__")) return Py_BuildValue("[ssssss]", "width", "height", "rgb_data", "mask_data", "filename", "uri"); else if (!strcmp(attr, "width")) return PyInt_FromLong(dia_image_width(self->image)); else if (!strcmp(attr, "height")) return PyInt_FromLong(dia_image_height(self->image)); else if (!strcmp(attr, "filename")) { return PyString_FromString(dia_image_filename(self->image)); } else if (!strcmp(attr, "uri")) { GError* error = NULL; char* s = g_filename_to_uri(dia_image_filename(self->image), NULL, &error); if (s) { PyObject* py_s = PyString_FromString(s); g_free(s); return py_s; } else { PyErr_SetString(PyExc_RuntimeError, error->message); g_error_free (error); return NULL; } } else if (!strcmp(attr, "rgb_data")) { unsigned char* s = dia_image_rgb_data(self->image); int len = dia_image_width(self->image) * dia_image_height(self->image) * 3; PyObject* py_s; if (!s) return PyErr_NoMemory(); py_s = PyString_FromStringAndSize((const char *)s, len); g_free (s); return py_s; } else if (!strcmp(attr, "mask_data")) { unsigned char* s = dia_image_mask_data(self->image); int len = dia_image_width(self->image) * dia_image_height(self->image); PyObject* py_s; if (!s) return PyErr_NoMemory(); py_s = PyString_FromStringAndSize((const char *)s, len); g_free (s); return py_s; } PyErr_SetString(PyExc_AttributeError, attr); return NULL; }
static void draw_image(DiaRenderer *self, Point *point, real width, real height, DiaImage *image) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); int img_width, img_height, img_rowstride; int x, y; guint8 *rgb_data; guint8 *mask_data; gchar d1_buf[DTOSTR_BUF_SIZE]; gchar d2_buf[DTOSTR_BUF_SIZE]; img_width = dia_image_width(image); img_rowstride = dia_image_rowstride(image); img_height = dia_image_height(image); rgb_data = dia_image_rgb_data(image); if (!rgb_data) { dia_context_add_message(renderer->ctx, _("Not enough memory for image drawing.")); return; } mask_data = dia_image_mask_data(image); fprintf(renderer->file, "gs\n"); /* color output only */ fprintf(renderer->file, "/pix %i string def\n", img_width * 3); fprintf(renderer->file, "%i %i 8\n", img_width, img_height); fprintf(renderer->file, "%s %s tr\n", psrenderer_dtostr(d1_buf, point->x), psrenderer_dtostr(d2_buf, point->y) ); fprintf(renderer->file, "%s %s sc\n", psrenderer_dtostr(d1_buf, width), psrenderer_dtostr(d2_buf, height) ); fprintf(renderer->file, "[%i 0 0 %i 0 0]\n", img_width, img_height); fprintf(renderer->file, "{currentfile pix readhexstring pop}\n"); fprintf(renderer->file, "false 3 colorimage\n"); fprintf(renderer->file, "\n"); if (mask_data) { for (y = 0; y < img_height; y++) { for (x = 0; x < img_width; x++) { int i = y*img_rowstride+x*3; int m = y*img_width+x; fprintf(renderer->file, "%02x", 255-(mask_data[m]*(255-rgb_data[i])/255)); fprintf(renderer->file, "%02x", 255-(mask_data[m]*(255-rgb_data[i+1])/255)); fprintf(renderer->file, "%02x", 255-(mask_data[m]*(255-rgb_data[i+2])/255)); } fprintf(renderer->file, "\n"); } } else { for (y = 0; y < img_height; y++) { for (x = 0; x < img_width; x++) { int i = y*img_rowstride+x*3; fprintf(renderer->file, "%02x", (int)(rgb_data[i])); fprintf(renderer->file, "%02x", (int)(rgb_data[i+1])); fprintf(renderer->file, "%02x", (int)(rgb_data[i+2])); } fprintf(renderer->file, "\n"); } } fprintf(renderer->file, "gr\n"); fprintf(renderer->file, "\n"); g_free(rgb_data); g_free(mask_data); }