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 @Override 060 public void close() throws IOException 061 { 062 writeBits(); 063 super.close(); 064 } 065 066 @Override 067 public void write(int b) throws IOException 068 { 069 buf = buf << 8 | (b & 0xff); 070 bitsUsed += 8; 071 if (bitsUsed == 24) 072 { 073 writeBits(); 074 } 075 } 076 077 private void writeBits() throws IOException 078 { 079 int padSize; 080 //Pad unused bits with 0 081 switch (bitsUsed) 082 { 083 case 8: 084 { 085 bitsUsed = 12; 086 buf <<= 4; 087 padSize = 2; 088 break; 089 } 090 case 16: 091 { 092 bitsUsed = 18; 093 buf <<= 2; 094 padSize = 1; 095 break; 096 } 097 default: 098 { 099 padSize = 0; 100 break; 101 } 102 } 103 104 if (charsPrinted == 76) 105 { 106 out.write('\r'); 107 out.write('\n'); 108 charsPrinted = 0; 109 } 110 111 for (; bitsUsed > 0; bitsUsed -= 6) 112 { 113 int b = buf >> (bitsUsed - 6) & 0x3f; 114 out.write(BASE64_CHARS.charAt(b)); 115 } 116 117 for (int i = 0; i < padSize; i++) 118 { 119 out.write('='); 120 } 121 122 charsPrinted += 4; 123 } 124}