package pngmeta // import ( // "bytes" // "encoding/binary" // "errors" // "fmt" // "hash/crc32" // "io" // ) // type Writer struct { // w io.Writer // } // func NewPNGWriter(w io.Writer) (*Writer, error) { // if _, err := io.WriteString(w, writeHeader); err != nil { // return nil, err // } // return &Writer{w}, nil // } // func (w *Writer) WriteChunk(length int32, typ string, r io.Reader) error { // if err := binary.Write(w.w, binary.BigEndian, length); err != nil { // return err // } // if _, err := w.w.Write([]byte(typ)); err != nil { // return err // } // checksummer := crc32.NewIEEE() // checksummer.Write([]byte(typ)) // if _, err := io.CopyN(io.MultiWriter(w.w, checksummer), r, int64(length)); err != nil { // return err // } // if err := binary.Write(w.w, binary.BigEndian, checksummer.Sum32()); err != nil { // return err // } // return nil // } // func WWriteToPngriteToPng(c *models.CharCardSpec, fpath, outfile string) error { // data, err := os.ReadFile(fpath) // if err != nil { // return err // } // jsonData, err := json.Marshal(c) // if err != nil { // return err // } // // Base64 encode the JSON data // base64Data := base64.StdEncoding.EncodeToString(jsonData) // pe := PngEmbed{ // Key: cKey, // Value: base64Data, // } // w, err := WritetEXtToPngBytes(data, pe) // if err != nil { // return err // } // return os.WriteFile(outfile, w.Bytes(), 0666) // } // func WritetEXtToPngBytes(inputBytes []byte, pe PngEmbed) (outputBytes bytes.Buffer, err error) { // if !(string(inputBytes[:8]) == header) { // return outputBytes, errors.New("wrong file format") // } // reader := bytes.NewReader(inputBytes) // pngr, err := NewPNGStepReader(reader) // if err != nil { // return outputBytes, fmt.Errorf("NewReader(): %s", err) // } // pngw, err := NewPNGWriter(&outputBytes) // if err != nil { // return outputBytes, fmt.Errorf("NewWriter(): %s", err) // } // for { // chunk, err := pngr.Next() // if err != nil { // if errors.Is(err, io.EOF) { // break // } // return outputBytes, fmt.Errorf("NextChunk(): %s", err) // } // if chunk.Type() != embType { // // IENDChunkType will only appear on the final iteration of a valid PNG // if chunk.Type() == IEND { // // This is where we inject tEXtChunkType as the penultimate chunk with the new value // newtEXtChunk := []byte(fmt.Sprintf(tEXtChunkDataSpecification, pe.Key, pe.Value)) // if err := pngw.WriteChunk(int32(len(newtEXtChunk)), embType, bytes.NewBuffer(newtEXtChunk)); err != nil { // return outputBytes, fmt.Errorf("WriteChunk(): %s", err) // } // // Now we end the buffer with IENDChunkType chunk // if err := pngw.WriteChunk(chunk.length, chunk.Type(), chunk); err != nil { // return outputBytes, fmt.Errorf("WriteChunk(): %s", err) // } // } else { // // writes back original chunk to buffer // if err := pngw.WriteChunk(chunk.length, chunk.Type(), chunk); err != nil { // return outputBytes, fmt.Errorf("WriteChunk(): %s", err) // } // } // } else { // if _, err := io.Copy(io.Discard, chunk); err != nil { // return outputBytes, fmt.Errorf("io.Copy(io.Discard, chunk): %s", err) // } // } // if err := chunk.Close(); err != nil { // return outputBytes, fmt.Errorf("chunk.Close(): %s", err) // } // } // return outputBytes, nil // }