mirror of https://github.com/GNOME/gimp.git
parent
184cd0e3a1
commit
3425e135ec
|
@ -1,3 +1,11 @@
|
|||
Sun Dec 19 13:16:51 CET 1999 Sven Neumann <sven@gimp.org>
|
||||
|
||||
* plug-ins/bmp/bmp.c
|
||||
* plug-ins/bmp/bmpread.c
|
||||
* plug-ins/bmp/bmpwrite.c:
|
||||
Applied a patch from muppet <scott@asofyet.org> that adds resolution
|
||||
support for the BMP plug-in. Did some code cleanup while I was on it.
|
||||
|
||||
Sat Dec 18 20:40:44 CET 1999 Sven Neumann <sven@gimp.org>
|
||||
|
||||
* plug-ins/imagemap/imap_about.c
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
/* 16 and 32 bit images */
|
||||
/* 28.11.1998 Bug in RLE-read-padding */
|
||||
/* fixed. */
|
||||
/* 19.12.1999 Resolution support added */
|
||||
|
||||
/*
|
||||
* The GIMP -- an image manipulation program
|
||||
|
@ -180,7 +181,7 @@ run (char *name,
|
|||
break;
|
||||
}
|
||||
|
||||
image_ID = ReadBMP(param[1].data.d_string);
|
||||
image_ID = ReadBMP (param[1].data.d_string);
|
||||
|
||||
if (image_ID != -1)
|
||||
{
|
||||
|
@ -254,17 +255,21 @@ run (char *name,
|
|||
}
|
||||
}
|
||||
|
||||
gint32 ToL(guchar *puffer)
|
||||
gint32
|
||||
ToL (guchar *puffer)
|
||||
{
|
||||
return(puffer[0] | puffer[1]<<8 | puffer[2]<<16 | puffer[3]<<24);
|
||||
return (puffer[0] | puffer[1]<<8 | puffer[2]<<16 | puffer[3]<<24);
|
||||
}
|
||||
|
||||
gint16 ToS(guchar *puffer)
|
||||
gint16
|
||||
ToS (guchar *puffer)
|
||||
{
|
||||
return(puffer[0] | puffer[1]<<8);
|
||||
return (puffer[0] | puffer[1]<<8);
|
||||
}
|
||||
|
||||
void FromL(gint32 wert, guchar *bopuffer)
|
||||
void
|
||||
FromL (gint32 wert,
|
||||
guchar *bopuffer)
|
||||
{
|
||||
bopuffer[0]=(wert & 0x000000ff)>>0x00;
|
||||
bopuffer[1]=(wert & 0x0000ff00)>>0x08;
|
||||
|
@ -272,7 +277,9 @@ void FromL(gint32 wert, guchar *bopuffer)
|
|||
bopuffer[3]=(wert & 0xff000000)>>0x18;
|
||||
}
|
||||
|
||||
void FromS(gint16 wert, guchar *bopuffer)
|
||||
void
|
||||
FromS (gint16 wert,
|
||||
guchar *bopuffer)
|
||||
{
|
||||
bopuffer[0]=(wert & 0x00ff)>>0x00;
|
||||
bopuffer[1]=(wert & 0xff00)>>0x08;
|
||||
|
|
|
@ -2,6 +2,26 @@
|
|||
/* except OS2 bitmaps (wrong colors) */
|
||||
/* Alexander.Schulz@stud.uni-karlsruhe.de */
|
||||
|
||||
/*
|
||||
* The GIMP -- an image manipulation program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -11,8 +31,9 @@
|
|||
#include "bmp.h"
|
||||
#include "libgimp/stdplugins-intl.h"
|
||||
|
||||
gint32 ReadBMP (name)
|
||||
char *name;
|
||||
|
||||
gint32
|
||||
ReadBMP (char *name)
|
||||
{
|
||||
FILE *fd;
|
||||
char *temp_buf;
|
||||
|
@ -20,6 +41,7 @@ gint32 ReadBMP (name)
|
|||
int ColormapSize, SpeicherZeile, Maps, Grey;
|
||||
unsigned char ColorMap[256][3];
|
||||
guchar puffer[50];
|
||||
gint32 image_ID;
|
||||
|
||||
if (interactive_bmp)
|
||||
{
|
||||
|
@ -141,18 +163,50 @@ gint32 ReadBMP (name)
|
|||
#endif
|
||||
|
||||
/* Get the Image and return the ID or -1 on error*/
|
||||
image_ID = ReadImage (fd,
|
||||
Bitmap_Head.biWidth,
|
||||
Bitmap_Head.biHeight,
|
||||
ColorMap,
|
||||
Bitmap_Head.biClrUsed,
|
||||
Bitmap_Head.biBitCnt,
|
||||
Bitmap_Head.biCompr,
|
||||
SpeicherZeile,
|
||||
Grey);
|
||||
|
||||
return(ReadImage(fd, Bitmap_Head.biWidth, Bitmap_Head.biHeight, ColorMap,
|
||||
Bitmap_Head.biClrUsed, Bitmap_Head.biBitCnt, Bitmap_Head.biCompr, SpeicherZeile, Grey));
|
||||
#ifdef GIMP_HAVE_RESOLUTION_INFO
|
||||
{
|
||||
/* quick hack by the muppet, scott@asofyet.org, 19 dec 1999 */
|
||||
double xresolution;
|
||||
double yresolution;
|
||||
|
||||
/*
|
||||
* xresolution and yresolution are in dots per inch.
|
||||
* the BMP spec says that biXPels and biYPels are in
|
||||
* pixels per meter as long ints (actually, "DWORDS").
|
||||
* this means we've lost some accuracy in the numbers.
|
||||
* typically, the dots per inch settings on BMPs will
|
||||
* be integer numbers of dots per inch, which is freaky
|
||||
* because they're stored in the BMP as metric. *sigh*
|
||||
* so, we'll round this off, even though the gimp wants
|
||||
* a floating point number...
|
||||
*/
|
||||
#define LROUND(x) ((long int)((x)+0.5))
|
||||
xresolution = LROUND((Bitmap_Head.biXPels * 2.54 / 100.0));
|
||||
yresolution = LROUND((Bitmap_Head.biYPels * 2.54 / 100.0));
|
||||
#undef LROUND
|
||||
gimp_image_set_resolution (image_ID, xresolution, yresolution);
|
||||
}
|
||||
#endif /* GIMP_HAVE_RESOLUTION_INFO */
|
||||
|
||||
return (image_ID);
|
||||
}
|
||||
|
||||
gint ReadColorMap (fd, buffer, number, size, grey)
|
||||
FILE *fd;
|
||||
int number;
|
||||
unsigned char buffer[256][3];
|
||||
int size;
|
||||
int *grey;
|
||||
gint
|
||||
ReadColorMap (FILE *fd,
|
||||
unsigned char buffer[256][3],
|
||||
int number,
|
||||
int size,
|
||||
int *grey)
|
||||
{
|
||||
int i;
|
||||
unsigned char rgb[4];
|
||||
|
@ -183,11 +237,16 @@ gint ReadColorMap (fd, buffer, number, size, grey)
|
|||
return(0);
|
||||
}
|
||||
|
||||
Image ReadImage (fd, len, height, cmap, ncols, bpp, compression, spzeile, grey)
|
||||
FILE *fd;
|
||||
int len, height;
|
||||
unsigned char cmap[256][3];
|
||||
int ncols, bpp, compression, spzeile, grey;
|
||||
Image
|
||||
ReadImage (FILE *fd,
|
||||
int len,
|
||||
int height,
|
||||
unsigned char cmap[256][3],
|
||||
int ncols,
|
||||
int bpp,
|
||||
int compression,
|
||||
int spzeile,
|
||||
int grey)
|
||||
{
|
||||
char *name_buf;
|
||||
unsigned char v,wieviel;
|
||||
|
@ -372,6 +431,6 @@ Image ReadImage (fd, len, height, cmap, ncols, bpp, compression, spzeile, grey)
|
|||
gimp_drawable_flush(drawable);
|
||||
gimp_drawable_detach(drawable);
|
||||
g_free(dest);
|
||||
return(image);
|
||||
|
||||
return (image);
|
||||
}
|
||||
|
|
|
@ -7,6 +7,26 @@
|
|||
|
||||
/* Alexander.Schulz@stud.uni-karlsruhe.de */
|
||||
|
||||
/*
|
||||
* The GIMP -- an image manipulation program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -39,18 +59,15 @@ static BMPSaveInterface gsint =
|
|||
int encoded = 0;
|
||||
|
||||
|
||||
static gint save_dialog ();
|
||||
static void save_close_callback (GtkWidget *widget,
|
||||
gpointer data);
|
||||
static void save_ok_callback (GtkWidget *widget,
|
||||
gpointer data);
|
||||
static void save_toggle_update (GtkWidget *widget,
|
||||
gpointer data);
|
||||
static gint save_dialog (void);
|
||||
static void save_close_callback (GtkWidget *widget, gpointer data);
|
||||
static void save_ok_callback (GtkWidget *widget, gpointer data);
|
||||
static void save_toggle_update (GtkWidget *widget, gpointer data);
|
||||
|
||||
gint
|
||||
WriteBMP (filename,image,drawable_ID)
|
||||
char *filename;
|
||||
gint32 image,drawable_ID;
|
||||
WriteBMP (char *filename,
|
||||
gint32 image,
|
||||
gint32 drawable_ID)
|
||||
{
|
||||
FILE *outfile;
|
||||
int Red[MAXCOLORS];
|
||||
|
@ -127,13 +144,14 @@ WriteBMP (filename,image,drawable_ID)
|
|||
}
|
||||
|
||||
/* Perhaps someone wants RLE encoded Bitmaps */
|
||||
|
||||
encoded = 0;
|
||||
if (((BitsPerPixel==8) || (BitsPerPixel==4)) && interactive_bmp) {if (! save_dialog ()) {return -1;}}
|
||||
|
||||
if ((BitsPerPixel == 8 || BitsPerPixel == 4) && interactive_bmp)
|
||||
{
|
||||
if (! save_dialog ())
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Let's take some file */
|
||||
|
||||
outfile = fopen (filename, "wb");
|
||||
if (!outfile)
|
||||
{
|
||||
|
@ -181,10 +199,35 @@ WriteBMP (filename,image,drawable_ID)
|
|||
else if (BitsPerPixel==4) Bitmap_Head.biCompr=2;
|
||||
else Bitmap_Head.biCompr=0;
|
||||
Bitmap_Head.biSizeIm=SpZeile*rows;
|
||||
Bitmap_Head.biXPels=1;
|
||||
Bitmap_Head.biYPels=1;
|
||||
if (BitsPerPixel<24) Bitmap_Head.biClrUsed=colors;
|
||||
else Bitmap_Head.biClrUsed=0;
|
||||
#ifdef GIMP_HAVE_RESOLUTION_INFO
|
||||
{
|
||||
double xresolution;
|
||||
double yresolution;
|
||||
gimp_image_get_resolution (image, &xresolution, &yresolution);
|
||||
|
||||
if (xresolution > 1e-5 && yresolution > 1e-5) {
|
||||
/*
|
||||
* xresolution and yresolution are in dots per inch.
|
||||
* the BMP spec says that biXPels and biYPels are in
|
||||
* pixels per meter as long ints (actually, "DWORDS"),
|
||||
* so...
|
||||
* n dots inch 100 cm m dots
|
||||
* ------ * ------- * ------ = ------
|
||||
* inch 2.54 cm m inch
|
||||
*/
|
||||
Bitmap_Head.biXPels = (long int) xresolution * 100.0 / 2.54;
|
||||
Bitmap_Head.biYPels = (long int) yresolution * 100.0 / 2.54;
|
||||
}
|
||||
}
|
||||
#else /* GIMP_HAVE_RESOLUTION_INFO */
|
||||
Bitmap_Head.biXPels = 1;
|
||||
Bitmap_Head.biYPels = 1;
|
||||
#endif /* GIMP_HAVE_RESOLUTION_INFO */
|
||||
if (BitsPerPixel<24)
|
||||
Bitmap_Head.biClrUsed=colors;
|
||||
else
|
||||
Bitmap_Head.biClrUsed=0;
|
||||
|
||||
Bitmap_Head.biClrImp=Bitmap_Head.biClrUsed;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -230,8 +273,12 @@ WriteBMP (filename,image,drawable_ID)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void WriteColorMap(FILE *f, int red[MAXCOLORS], int green[MAXCOLORS],
|
||||
int blue[MAXCOLORS], int size)
|
||||
void
|
||||
WriteColorMap (FILE *f,
|
||||
int red[MAXCOLORS],
|
||||
int green[MAXCOLORS],
|
||||
int blue[MAXCOLORS],
|
||||
int size)
|
||||
{
|
||||
char trgb[4];
|
||||
int i;
|
||||
|
@ -247,14 +294,20 @@ void WriteColorMap(FILE *f, int red[MAXCOLORS], int green[MAXCOLORS],
|
|||
}
|
||||
}
|
||||
|
||||
void WriteImage(f, src, width, height, encoded, channels, bpp, spzeile, MapSize)
|
||||
FILE *f;
|
||||
guchar *src;
|
||||
int width,height,encoded,channels,bpp,spzeile,MapSize;
|
||||
void
|
||||
WriteImage (FILE *f,
|
||||
guchar *src,
|
||||
int width,
|
||||
int height,
|
||||
int encoded,
|
||||
int channels,
|
||||
int bpp,
|
||||
int spzeile,
|
||||
int MapSize)
|
||||
{
|
||||
guchar buf[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0};
|
||||
guchar puffer[8];
|
||||
guchar *temp,v,g;
|
||||
guchar *temp,v;
|
||||
guchar *Zeile,*ketten;
|
||||
int xpos,ypos,i,j,rowstride,laenge,thiswidth;
|
||||
int breite, n, k;
|
||||
|
@ -432,11 +485,10 @@ save_dialog ()
|
|||
{
|
||||
GtkWidget *dlg;
|
||||
GtkWidget *button;
|
||||
GtkWidget *hbbox;
|
||||
GtkWidget *toggle;
|
||||
GtkWidget *frame;
|
||||
GtkWidget *vbox;
|
||||
gchar **argv;
|
||||
gint argc;
|
||||
|
||||
dlg = gtk_dialog_new ();
|
||||
gtk_window_set_title (GTK_WINDOW (dlg), _("Save as BMP"));
|
||||
|
@ -446,12 +498,19 @@ save_dialog ()
|
|||
NULL);
|
||||
|
||||
/* Action area */
|
||||
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dlg)->action_area), 2);
|
||||
gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dlg)->action_area), FALSE);
|
||||
hbbox = gtk_hbutton_box_new ();
|
||||
gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4);
|
||||
gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dlg)->action_area), hbbox, FALSE, FALSE, 0);
|
||||
gtk_widget_show (hbbox);
|
||||
|
||||
button = gtk_button_new_with_label (_("OK"));
|
||||
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) save_ok_callback,
|
||||
dlg);
|
||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->action_area), button, TRUE, TRUE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
|
||||
gtk_widget_grab_default (button);
|
||||
gtk_widget_show (button);
|
||||
|
||||
|
@ -460,16 +519,16 @@ save_dialog ()
|
|||
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) gtk_widget_destroy,
|
||||
GTK_OBJECT (dlg));
|
||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->action_area), button, TRUE, TRUE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
/* parameter settings */
|
||||
frame = gtk_frame_new (_("Save Options"));
|
||||
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
|
||||
gtk_container_border_width (GTK_CONTAINER (frame), 10);
|
||||
gtk_container_border_width (GTK_CONTAINER (frame), 4);
|
||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
|
||||
vbox = gtk_vbox_new (FALSE, 5);
|
||||
gtk_container_border_width (GTK_CONTAINER (vbox), 5);
|
||||
vbox = gtk_vbox_new (FALSE, 4);
|
||||
gtk_container_border_width (GTK_CONTAINER (vbox), 4);
|
||||
gtk_container_add (GTK_CONTAINER (frame), vbox);
|
||||
|
||||
toggle = gtk_check_button_new_with_label (_("RLE encoded"));
|
||||
|
|
Loading…
Reference in New Issue