• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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