330
476
return GIMP_PDB_SUCCESS;
479
static inline void Make565(guchar r, guchar g, guchar b, guchar *buf)
482
p = (((gint)(r / 255.0 * 31.0 + 0.5))<<11) |
483
(((gint)(g / 255.0 * 63.0 + 0.5))<<5) |
484
((gint)(b / 255.0 * 31.0 + 0.5));
485
buf[0] = (guchar)(p & 0xff);
486
buf[1] = (guchar)(p>>8);
489
static inline void Make5551(guchar r, guchar g, guchar b, guchar a, guchar *buf)
492
p = (((gint)(r / 255.0 * 31.0 + 0.5))<<10) |
493
(((gint)(g / 255.0 * 31.0 + 0.5))<<5) |
494
((gint)(b / 255.0 * 31.0 + 0.5)) |
495
((gint)(a / 255.0 + 0.5)<<15);
496
buf[0] = (guchar)(p & 0xff);
497
buf[1] = (guchar)(p>>8);
501
write_image (FILE *f,
344
guchar buf[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0};
512
guchar buf[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 };
347
guchar *Zeile, *ketten;
348
gint xpos, ypos, i, j, rowstride, laenge, thiswidth;
515
guchar *row, *ketten;
516
gint xpos, ypos, i, j, rowstride, length, thiswidth;
518
guchar n, r, g, b, a;
353
521
rowstride = width * channels;
355
/* We'll begin with the 24 bit Bitmaps, they are easy :-) */
523
/* We'll begin with the 16/24/32 bit Bitmaps, they are easy :-) */
359
527
for (ypos = height - 1; ypos >= 0; ypos--) /* for each row */
361
529
for (i = 0; i < width; i++) /* for each pixel */
363
531
temp = src + (ypos * rowstride) + (xpos * channels);
364
buf[2] = (guchar) *temp;
366
buf[1] = (guchar) *temp;
368
buf[0] = (guchar) *temp;
540
if (channels > 3 && (guchar) *temp == 0)
541
buf[0] = buf[1] = buf[2] = 0xff;
550
if (channels > 3 && (guchar) *temp == 0)
551
buf[0] = buf[1] = buf[2] = 0xff;
566
if (channels > 3 && (guchar) *temp == 0)
568
Make565 (r, g, b, buf);
576
if (channels > 3 && (guchar) *temp == 0)
578
Make5551 (r, g, b, 0x0, buf);
587
Make5551 (r, g, b, a, buf);
372
Write (f, &buf[3], spzeile - (width * 3));
594
Write (f, &buf[4], spzeile - (width * (bpp/8)));
375
597
if ((cur_progress % 5) == 0)
545
768
gimp_progress_update (1);
772
format_callback (GtkWidget *widget,
775
BMPSaveData.rgb_format = GPOINTER_TO_INT (data);
779
save_dialog (gint channels)
552
782
GtkWidget *toggle;
783
GtkWidget *vbox_main;
556
dlg = gimp_dialog_new (_("Save as BMP"), "bmp",
558
gimp_standard_help_func, "file-bmp-save",
560
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
561
GTK_STOCK_OK, GTK_RESPONSE_OK,
565
vbox = gtk_vbox_new (FALSE, 12);
566
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
567
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, TRUE, TRUE, 0);
568
gtk_widget_show (vbox);
570
toggle = gtk_check_button_new_with_mnemonic (_("_RLE encoded"));
571
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
572
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), encoded);
791
dialog = gimp_dialog_new (_("Save as BMP"), "bmp",
793
gimp_standard_help_func, SAVE_PROC,
795
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
796
GTK_STOCK_SAVE, GTK_RESPONSE_OK,
800
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
805
gimp_window_set_transient (GTK_WINDOW (dialog));
807
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
809
vbox_main = gtk_vbox_new (FALSE, 12);
810
gtk_container_set_border_width (GTK_CONTAINER (vbox_main), 12);
811
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox_main);
812
gtk_widget_show (vbox_main);
814
toggle = gtk_check_button_new_with_mnemonic (_("_Run-Length Encoded"));
815
gtk_box_pack_start (GTK_BOX (vbox_main), toggle, FALSE, FALSE, 0);
816
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
817
BMPSaveData.encoded);
573
818
gtk_widget_show (toggle);
820
gtk_widget_set_sensitive (toggle, FALSE);
575
822
g_signal_connect (toggle, "toggled",
576
823
G_CALLBACK (gimp_toggle_button_update),
579
gtk_widget_show (dlg);
581
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
583
gtk_widget_destroy (dlg);
824
&BMPSaveData.encoded);
826
expander = gtk_expander_new_with_mnemonic (_("_Advanced Options"));
828
gtk_box_pack_start (GTK_BOX (vbox_main), expander, TRUE, TRUE, 0);
829
gtk_widget_show (expander);
832
gtk_widget_set_sensitive (expander, FALSE);
834
vbox2 = gtk_vbox_new (FALSE, 12);
835
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 12);
836
gtk_container_add (GTK_CONTAINER (expander), vbox2);
837
gtk_widget_show (vbox2);
841
frame = gimp_frame_new (_("16 bits"));
842
gtk_box_pack_start (GTK_BOX (vbox2), frame, TRUE, TRUE, 0);
843
gtk_widget_show (frame);
845
vbox = gtk_vbox_new (FALSE, 6);
846
gtk_container_add (GTK_CONTAINER (frame), vbox);
847
gtk_widget_show (vbox);
849
toggle = gtk_radio_button_new_with_label (group, "R5 G6 B5");
850
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
851
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
852
gtk_widget_show (toggle);
853
g_signal_connect (toggle, "pressed",
854
G_CALLBACK (format_callback),
855
GINT_TO_POINTER (RGB_565));
857
toggle = gtk_radio_button_new_with_label (group, "A1 R5 G5 B5");
858
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
859
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
862
gtk_widget_set_sensitive (toggle, FALSE);
864
gtk_widget_show (toggle);
866
g_signal_connect (toggle, "pressed",
867
G_CALLBACK (format_callback),
868
GINT_TO_POINTER (RGBA_5551));
869
toggle = gtk_radio_button_new_with_label (group, "X1 R5 G5 B5");
870
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
871
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
872
gtk_widget_show (toggle);
873
g_signal_connect (toggle, "pressed",
874
G_CALLBACK (format_callback),
875
GINT_TO_POINTER (RGB_555));
877
frame = gimp_frame_new (_("24 bits"));
878
gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
879
gtk_widget_show (frame);
881
toggle = gtk_radio_button_new_with_label (group, "R8 G8 B8");
882
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(toggle));
883
gtk_container_add (GTK_CONTAINER (frame), toggle);
884
gtk_widget_show (toggle);
885
g_signal_connect (toggle, "pressed",
886
G_CALLBACK (format_callback),
887
GINT_TO_POINTER (RGB_888));
890
BMPSaveData.rgb_format = RGB_888;
891
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE);
894
frame = gimp_frame_new (_("32 bits"));
895
gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
896
gtk_widget_show (frame);
898
vbox = gtk_vbox_new (FALSE, 6);
899
gtk_container_add (GTK_CONTAINER (frame), vbox);
900
gtk_widget_show (vbox);
902
toggle = gtk_radio_button_new_with_label (group, "A8 R8 G8 B8");
903
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
904
gtk_container_add (GTK_CONTAINER (vbox), toggle);
908
gtk_widget_set_sensitive (toggle, FALSE);
912
BMPSaveData.rgb_format = RGBA_8888;
913
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE);
916
gtk_widget_show (toggle);
917
g_signal_connect (toggle, "pressed",
918
G_CALLBACK (format_callback),
919
GINT_TO_POINTER (RGBA_8888));
921
toggle = gtk_radio_button_new_with_label (group, "X8 R8 G8 B8");
922
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
923
gtk_container_add (GTK_CONTAINER (vbox), toggle);
924
gtk_widget_show (toggle);
925
g_signal_connect (toggle, "pressed",
926
G_CALLBACK (format_callback),
927
GINT_TO_POINTER (RGBX_8888));
929
gtk_widget_show (dialog);
931
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
933
gtk_widget_destroy (dialog);