diff options
author | Chris Craik <ccraik@google.com> | 2015-12-02 14:50:25 -0800 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2015-12-02 15:25:10 -0800 |
commit | 8160f20b0aca8c6595d4b385d673f59b6bcd16a4 (patch) | |
tree | 581bd7ae88d7ad352fc03e00d5175ccbfdd140bc /libs/hwui/tests/common/TestUtils.cpp | |
parent | 54fa17f667c285a5c9225e238c8132dfe830ef36 (diff) |
Reorganize hwui test directories
Now test-only common files reside in tests/common, and each test
executable type (macrobench, microbench, and unit) has a subdir there.
This change means the shared lib no longer has test code in it, and
sets up a means for scenes to be shared between tests.
Change-Id: I37b081f6977300e03fdd961b8e6439fde730605e
Diffstat (limited to 'libs/hwui/tests/common/TestUtils.cpp')
-rw-r--r-- | libs/hwui/tests/common/TestUtils.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp new file mode 100644 index 000000000000..6cef85203352 --- /dev/null +++ b/libs/hwui/tests/common/TestUtils.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015 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. + */ + +#include "TestUtils.h" + +namespace android { +namespace uirenderer { + +SkColor TestUtils::interpolateColor(float fraction, SkColor start, SkColor end) { + int startA = (start >> 24) & 0xff; + int startR = (start >> 16) & 0xff; + int startG = (start >> 8) & 0xff; + int startB = start & 0xff; + + int endA = (end >> 24) & 0xff; + int endR = (end >> 16) & 0xff; + int endG = (end >> 8) & 0xff; + int endB = end & 0xff; + + return (int)((startA + (int)(fraction * (endA - startA))) << 24) + | (int)((startR + (int)(fraction * (endR - startR))) << 16) + | (int)((startG + (int)(fraction * (endG - startG))) << 8) + | (int)((startB + (int)(fraction * (endB - startB)))); +} + +void TestUtils::drawTextToCanvas(TestCanvas* canvas, const char* text, + const SkPaint& paint, float x, float y) { + // drawing text requires GlyphID TextEncoding (which JNI layer would have done) + LOG_ALWAYS_FATAL_IF(paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding, + "must use glyph encoding"); + + SkMatrix identity; + identity.setIdentity(); + SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry); + SkAutoGlyphCacheNoGamma autoCache(paint, &surfaceProps, &identity); + + float totalAdvance = 0; + std::vector<glyph_t> glyphs; + std::vector<float> positions; + Rect bounds; + while (*text != '\0') { + SkUnichar unichar = SkUTF8_NextUnichar(&text); + glyph_t glyph = autoCache.getCache()->unicharToGlyph(unichar); + autoCache.getCache()->unicharToGlyph(unichar); + + // push glyph and its relative position + glyphs.push_back(glyph); + positions.push_back(totalAdvance); + positions.push_back(0); + + // compute bounds + SkGlyph skGlyph = autoCache.getCache()->getUnicharMetrics(unichar); + Rect glyphBounds(skGlyph.fWidth, skGlyph.fHeight); + glyphBounds.translate(totalAdvance + skGlyph.fLeft, skGlyph.fTop); + bounds.unionWith(glyphBounds); + + // advance next character + SkScalar skWidth; + paint.getTextWidths(&glyph, sizeof(glyph), &skWidth, NULL); + totalAdvance += skWidth; + } + + // apply alignment via x parameter (which JNI layer would have done) + if (paint.getTextAlign() == SkPaint::kCenter_Align) { + x -= totalAdvance / 2; + } else if (paint.getTextAlign() == SkPaint::kRight_Align) { + x -= totalAdvance; + } + + bounds.translate(x, y); + + // Force left alignment, since alignment offset is already baked in + SkPaint alignPaintCopy(paint); + alignPaintCopy.setTextAlign(SkPaint::kLeft_Align); + canvas->drawText(glyphs.data(), positions.data(), glyphs.size(), alignPaintCopy, x, y, + bounds.left, bounds.top, bounds.right, bounds.bottom, totalAdvance); +} + +} /* namespace uirenderer */ +} /* namespace android */ |