File: b_ppm.c

package info (click to toggle)
zapping 0.10~cvs6-16
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 16,008 kB
  • sloc: ansic: 110,600; asm: 11,770; sh: 9,809; xml: 3,186; makefile: 1,227; perl: 488
file content (86 lines) | stat: -rw-r--r-- 2,305 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * Screenshot saving plugin for Zapping
 * Copyright (C) 2000-2001 Iaki Garca Etxebarria
 * Copyright (C) 2001 Michael H. Schimek
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "screenshot.h"

static gboolean
backend_init (screenshot_data *data _unused_,
	      gboolean write _unused_, gint quality _unused_)
{
  return TRUE;
}

static void
backend_save (screenshot_data *data)
{
  gchar *src, *dest;
  guint src_bpl, dest_bpl, free, n;

  src = (gchar *) data->data;
  src_bpl = data->format.bytes_per_line[0];
  dest = data->io_buffer;
  free = data->io_buffer_size;
  dest_bpl = data->format.width * 3;

  g_assert (free > 80 && free > (dest_bpl + 80));

  n = snprintf (dest, 80, "P6 %d %d 255\n",
		data->format.width, data->format.height);
  dest += n;
  free -= n;

  /* NB lines is evaluated by parent thread to update the progress bar */
  for (data->lines = 0; data->lines < data->format.height; data->lines++)
    {
      if (screenshot_close_everything || data->thread_abort)
	{
	  data->thread_abort = TRUE;
	  break;
	}

      if (free < dest_bpl)
	{
	  data->io_flush (data, data->io_buffer_size - free);
	  dest = data->io_buffer;
	  free = data->io_buffer_size;
	}

      memcpy (dest, src, data->format.width * 3);

      src += src_bpl;
      dest += dest_bpl;
      free -= dest_bpl;
    }

  if (!data->thread_abort && free < data->io_buffer_size)
    data->io_flush (data, data->io_buffer_size - free);
}

screenshot_backend
screenshot_backend_ppm =
{
  .keyword		= "ppm",
  .label		= "PPM",
  .extension		= "ppm",
  .quality		= FALSE,
  .bpp_est		= 3.0,
  .init			= backend_init,
  .save			= backend_save,
};