001/* 002 * SVG Salamander 003 * Copyright (c) 2004, Mark McKay 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or 007 * without modification, are permitted provided that the following 008 * conditions are met: 009 * 010 * - Redistributions of source code must retain the above 011 * copyright notice, this list of conditions and the following 012 * disclaimer. 013 * - Redistributions in binary form must reproduce the above 014 * copyright notice, this list of conditions and the following 015 * disclaimer in the documentation and/or other materials 016 * provided with the distribution. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 019 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 020 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 021 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 022 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 023 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 025 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 027 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 029 * OF THE POSSIBILITY OF SUCH DAMAGE. 030 * 031 * Mark McKay can be contacted at mark@kitfox.com. Salamander and other 032 * projects can be found at http://www.kitfox.com 033 * 034 * Created on July 23, 2007 035 */ 036 037package com.kitfox.svg.util; 038 039import java.io.FilterOutputStream; 040import java.io.IOException; 041import java.io.OutputStream; 042 043/** 044 * 045 * @author kitfox 046 */ 047public class Base64OutputStream extends FilterOutputStream implements Base64Consts 048{ 049 int buf; 050 int bitsUsed; 051 int charsPrinted; 052 053 /** Creates a new instance of Base64OutputSream */ 054 public Base64OutputStream(OutputStream out) 055 { 056 super(out); 057 } 058 059 public void close() throws IOException 060 { 061 writeBits(); 062 super.close(); 063 } 064 065 public void write(int b) throws IOException 066 { 067 buf = buf << 8 | (b & 0xff); 068 bitsUsed += 8; 069 if (bitsUsed == 24) 070 { 071 writeBits(); 072 } 073 } 074 075 private void writeBits() throws IOException 076 { 077 int padSize; 078 //Pad unused bits with 0 079 switch (bitsUsed) 080 { 081 case 8: 082 { 083 bitsUsed = 12; 084 buf <<= 4; 085 padSize = 2; 086 break; 087 } 088 case 16: 089 { 090 bitsUsed = 18; 091 buf <<= 2; 092 padSize = 1; 093 break; 094 } 095 default: 096 { 097 padSize = 0; 098 break; 099 } 100 } 101 102 if (charsPrinted == 76) 103 { 104 out.write('\r'); 105 out.write('\n'); 106 charsPrinted = 0; 107 } 108 109 for (; bitsUsed > 0; bitsUsed -= 6) 110 { 111 int b = buf >> (bitsUsed - 6) & 0x3f; 112 out.write(BASE64_CHARS.charAt(b)); 113 } 114 115 for (int i = 0; i < padSize; i++) 116 { 117 out.write('='); 118 } 119 120 charsPrinted += 4; 121 } 122}