14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2012 Google Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "picture_utils.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkBitmap.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "SkColorPriv.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkImageEncoder.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkOSFile.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "SkPicture.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkStream.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "SkString.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace sk_tools {
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void force_all_opaque(const SkBitmap& bitmap) {
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        SkASSERT(NULL == bitmap.getTexture());
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        SkASSERT(kN32_SkColorType == bitmap.colorType());
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (NULL != bitmap.getTexture() || kN32_SkColorType == bitmap.colorType()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkAutoLockPixels lock(bitmap);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int y = 0; y < bitmap.height(); y++) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (int x = 0; x < bitmap.width(); x++) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *bitmap.getAddr32(x, y) |= (SK_A32_MASK << SK_A32_SHIFT);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    void replace_char(SkString* str, const char oldChar, const char newChar) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (NULL == str) {
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            return;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        for (size_t i = 0; i < str->size(); ++i) {
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            if (oldChar == str->operator[](i)) {
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                str->operator[](i) = newChar;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_percentage(const char* const string) {
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        SkString skString(string);
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        return skString.endsWith("%");
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    void setup_bitmap(SkBitmap* bitmap, int width, int height) {
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        bitmap->allocN32Pixels(width, height);
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        bitmap->eraseColor(SK_ColorTRANSPARENT);
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool write_bitmap_to_disk(const SkBitmap& bm, const SkString& dirPath,
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                              const char *subdirOrNull, const SkString& baseName) {
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        SkString partialPath;
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        if (subdirOrNull) {
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            partialPath = SkOSPath::SkPathJoin(dirPath.c_str(), subdirOrNull);
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            sk_mkdir(partialPath.c_str());
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        } else {
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            partialPath.set(dirPath);
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        }
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        SkString fullPath = SkOSPath::SkPathJoin(partialPath.c_str(), baseName.c_str());
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        if (SkImageEncoder::EncodeFile(fullPath.c_str(), bm, SkImageEncoder::kPNG_Type, 100)) {
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            return true;
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        } else {
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            SkDebugf("Failed to write the bitmap to %s.\n", fullPath.c_str());
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            return false;
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        }
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} // namespace sk_tools
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)