1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <string> 20 21 #include "BigBuffer.h" 22 #include "IDiagnostics.h" 23 #include "Image.h" 24 #include "Source.h" 25 #include "Streams.h" 26 #include "android-base/macros.h" 27 28 namespace android { 29 // Size in bytes of the PNG signature. 30 constexpr size_t kPngSignatureSize = 8u; 31 32 struct PngOptions { 33 int grayscale_tolerance = 0; 34 }; 35 36 /** 37 * Deprecated. Removing once new PNG crunching code is proved to be correct. 38 */ 39 class Png { 40 public: Png(IDiagnostics * diag)41 explicit Png(IDiagnostics* diag) : mDiag(diag) { 42 } 43 44 bool process(const Source& source, std::istream* input, BigBuffer* outBuffer, 45 const PngOptions& options); 46 47 private: 48 DISALLOW_COPY_AND_ASSIGN(Png); 49 50 IDiagnostics* mDiag; 51 }; 52 53 /** 54 * An InputStream that filters out unimportant PNG chunks. 55 */ 56 class PngChunkFilter : public InputStream { 57 public: 58 explicit PngChunkFilter(StringPiece data); 59 virtual ~PngChunkFilter() = default; 60 61 bool Next(const void** buffer, size_t* len) override; 62 void BackUp(size_t count) override; 63 CanRewind()64 bool CanRewind() const override { 65 return true; 66 } 67 bool Rewind() override; ByteCount()68 size_t ByteCount() const override { 69 return window_start_; 70 } 71 HadError()72 bool HadError() const override { 73 return !error_msg_.empty(); 74 } GetError()75 std::string GetError() const override { 76 return error_msg_; 77 } 78 79 private: 80 DISALLOW_COPY_AND_ASSIGN(PngChunkFilter); 81 82 bool ConsumeWindow(const void** buffer, size_t* len); 83 84 StringPiece data_; 85 size_t window_start_ = 0; 86 size_t window_end_ = 0; 87 std::string error_msg_; 88 }; 89 /** 90 * Reads a PNG from the InputStream into memory as an RGBA Image. 91 */ 92 std::unique_ptr<Image> ReadPng(InputStream* in, IDiagnostics* diag); 93 94 /** 95 * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream 96 * as a PNG. 97 */ 98 bool WritePng(const Image* image, const NinePatch* nine_patch, OutputStream* out, 99 const PngOptions& options, IDiagnostics* diag, bool verbose); 100 } // namespace android