blob: db0b2cdeba002ac945336757b8b2d60ef40867ae [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _ANDROID_GRAPHICS_TYPEFACE_IMPL_H_
#define _ANDROID_GRAPHICS_TYPEFACE_IMPL_H_
#include "SkTypeface.h"
#include <cutils/compiler.h>
#include <minikin/FontCollection.h>
#include <vector>
#include <memory>
namespace android {
// This indicates that the weight or italic information should be resolved by OS/2 table.
// This value must be the same as the android.graphics.Typeface$Builder.RESOLVE_BY_FONT_TABLE.
constexpr int RESOLVE_BY_FONT_TABLE = -1;
struct ANDROID_API Typeface {
public:
std::shared_ptr<minikin::FontCollection> fFontCollection;
// resolved style actually used for rendering
minikin::FontStyle fStyle;
// style used for constructing and querying Typeface objects
SkTypeface::Style fSkiaStyle;
static Typeface* resolveDefault(Typeface* src);
// The following three functions create new Typeface from an existing Typeface with a different
// style. There is a base weight concept which is used for calculating relative style from an
// existing Typeface.
// The createRelative method creates a new Typeface with a style relative to the base Typeface.
// For example, if the base Typeface has a base weight of 400 and the desired style is bold, the
// resulting Typeface renders the text with a weight of 700. This function doesn't change the
// base weight, so even if you create a new Typeface from the bold Typeface specifying bold on
// it again, the text is still rendered with a weight of 700.
// You can create another base weight Typeface from an existing Typeface with
// createWithDifferentBaseWeight. The Typeface created with this function renders the text with
// a specified base weight.
// The createAbsolute method creates a new Typeface ignoring the base weight.
// Here is an example:
// Typeface* base = resolveDefault(nullptr); // Usually this has a weight of 400.
// Typeface* bold = createRelative(base, Bold); // Rendered with a weight of 700.
// Typeface* bold2 = createRelative(bold, Bold); // Rendered with a weight of 700.
//
// Typeface* boldBase = createWithDifferentBaseWeight(base, 700); // With a weight of 700.
// Typeface* boldBold = createRelative(boldBase, Bold); // Rendered with a weight of 1000.
//
// Typeface* lightBase = createWithDifferentBaseWeight(base, 300); // With a weight of 300.
// Typeface* lightBold = createRelative(lightBase, Bold); // Rendered with a weight of 600.
//
// Typeface* black = createAbsolute(base, 900, false); // Rendered with a weight of 900.
static Typeface* createWithDifferentBaseWeight(Typeface* src, int baseweight);
static Typeface* createRelative(Typeface* src, SkTypeface::Style desiredStyle);
static Typeface* createAbsolute(Typeface* base, int weight, bool italic);
static Typeface* createFromTypefaceWithVariation(Typeface* src,
const std::vector<minikin::FontVariation>& variations);
static Typeface* createFromFamilies(
std::vector<std::shared_ptr<minikin::FontFamily>>&& families,
int weight, int italic);
static void setDefault(Typeface* face);
// Sets roboto font as the default typeface for testing purpose.
static void setRobotoTypefaceForTest();
private:
// base weight in CSS-style units, 1..1000
int fBaseWeight;
};
}
#endif // _ANDROID_GRAPHICS_TYPEFACE_IMPL_H_