2024
DEVELOPMENT
Digital Signatures
Development
Understanding cryptography standards in the context of PDF digital signatures
Explore the essential standards for implementing secure digital signatures in PDF documents.
DEVELOPMENT
iOS
Swift
Insights
Development
Expanding SwiftUI capabilities in Nutrient: Customizable main toolbar
This article explains our process of creating a new API for customizing the main toolbar using SwiftUI.
DEVELOPMENT
Doc Viewer
PDF
DOCX
WebODF
PDF.js
Development
Top 5 document viewers for developers
Explore the best free and open source document viewers for developers, supporting DOCX and PDF files, with a comparison of features, advantages, and how to get started with tools like Nutrient, WebODF, PDF.js, and ViewerJS.
DEVELOPMENT
JavaScript
PDF Generation
Tips
PDF.js
PDF-lib
PDFKit
jsPDF
pdfmake
Puppeteer
Development
Top JavaScript PDF libraries for PDF generation and manipulation
The post compares leading JavaScript PDF libraries, such as PDF.js, PDF-lib, PDFKit, and Nutrient, highlighting their key features, use cases, and differences to help developers choose the best option for their projects.
DEVELOPMENT
Agile
Python
Jira
Markdown
Productivity
Development
Automating Agile Stand-Up Ceremonies with Python Scripts
A blog post detailing how to automate Agile stand-up ceremonies with Python scripts.
DEVELOPMENT
iOS
Insights
Xcode
Development
Dark and Tinted Alternative App Icons
Updating how we implemented alternative app icons to support iOS 18’s new dark and tinted app icons.
DEVELOPMENT
C++
Development
Structure Padding in C++
A look at padding in C++ structs and classes and how data is laid out in memory can help you write more efficient code and optimize the performance of your programs.
DEVELOPMENT
Python
PDF Generation
Tips
Development
Top 10 ways to generate PDFs in Python
Explore 10 powerful methods for generating PDFs in Python, from open source libraries to premium solutions, to meet all your document creation needs.
DEVELOPMENT
Insights
Development
The Impact of Rapid Technological Advancements on Sustainable Software Product Development
Discover how tech giants like Apple and Microsoft shape software development, the challenges developers face, and strategies for balancing innovation with sustainability.
DEVELOPMENT
WebAssembly
JavaScript
Web
Document Processing
Development
Leveraging WebAssembly in JavaScript for High-Performance Document Processing
Learn how to use WebAssembly with PSPDFKit to boost the performance of document processing tasks like PDF manipulation directly in your JavaScript applications.
DEVELOPMENT
Android
Jetpack Compose
Development
How to Implement Drag-to-Reorder List Functionality with Jetpack Compose
This post will look at how to add custom functionality in Jetpack Compose to allow dragging items in a list. This is achieved using a custom modifier that is generic and can be reused easily.
DEVELOPMENT
HTML
JavaScript
Node
Tips
Development
Top 10 ways of converting HTML to PDF
Explore 10 effective methods for converting HTML to PDF, including open source options, as well as a premium choice.
DEVELOPMENT
iOS
Xcode
Insights
Development
Investigating a Dynamic Linking Crash with Xcode 16
Debugging and fixing a crash we noticed after updating to Xcode 16.
DEVELOPMENT
iOS
Android
Room
Kotlin Multiplatform
Tips
Development
Seamless Room database integration for Kotlin Multiplatform projects
This blog post explores the process of integrating the Room database library into Kotlin Multiplatform projects with ease and efficiency.
DEVELOPMENT
iOS
Insights
Xcode
Development
NSCopying in a Swift World
An exploration into how a modern Swift programming mindset clashes with Objective-C’s NSCopying protocol.
DEVELOPMENT
iOS
Swift
Insights
Development
Generating API documentation for multiple targets with DocC
Follow our process of utilizing DocC to create combined API documentation for multiple frameworks.
DEVELOPMENT
iOS
Swift
Tips
Development
Privacy Manifests and Required Reason APIs on iOS
What privacy manifests and required reason APIs are, and the approach taken by PSPDFKit for adding support for these requirements.
DEVELOPMENT
visionOS
iOS
Development
Apple’s Vision of Our Digital Future
Bridging reality and imagination in the digital age through spatial computing and innovative software.
2023
2022
2021
DEVELOPMENT
Android
Kotlin
Tips
Development
Autosizing Fonts for Android EditTexts
Transfer Android's TextView autosizing capability to EditTexts
DEVELOPMENT
iOS
Insights
Development
Understanding Fast-Math
What does the -ffast-math optimization really do, and when is it safe to use it?
DEVELOPMENT
Testing
Productivity
Insights
Development
A Case for Fast CI
How slow build times lower your team’s productivity, and how to change this.
DEVELOPMENT
Web
TypeScript
Insights
Development
Migrating Our Web Codebase from Flow to TypeScript
How we migrated our web codebase from Flow to TypeScript.
DEVELOPMENT
iOS
Swift
Tips
Development
Fitting Text into a Bounding Frame on iOS
How to use a binary search algorithm to precisely fit multiline text into a bounding frame on iOS.
DEVELOPMENT
Productivity
Tips
git
Development
How to handle stacked PRs on GitHub
This blog post describes how to deal with dependent pull requests on GitHub, as well as the git concepts you need to master to understand them.
DEVELOPMENT
iOS
Insights
Xcode
Development
What Is a Deprecated API on iOS?
A look at Apple's API evolution strategy and the effect of the deployment target and base SDK Xcode project settings.
DEVELOPMENT
Android
Kotlin
Jetpack Compose
UI/UX
Development
Introducing Jetpack Compose Support
The Android PDF SDK you know and love now supports Jetpack Compose!
DEVELOPMENT
Web
JavaScript
Tips
Development
Practical Uses of Object URLs
Showcasing different applications of JavaScript object URLs in the browser.
DEVELOPMENT
Web
JavaScript
Insights
Development
HTTP Caching 101
...Or, how the cache works on your browser.
DEVELOPMENT
Android
Productivity
git
Development
Refactoring Git Branches with Interactive Rebase and Autosquash in Android Studio
A primer on using Git's interactive rebase feature, and how to use it within Android Studio to housekeep commits.
DEVELOPMENT
PDF
C++
Development
How to Save Custom Data in Image Files
Image files hold more than just images, and in this post, you'll learn how to save custom data in them.
DEVELOPMENT
PDF
UI/UX
Insights
Development
What Is Text Shaping and Why Do We Do It?
Some text in some languages requires text shaping to render correctly. This will explain a little about what exactly that is.
DEVELOPMENT
Productivity
Testing
Insights
Development
Managing CI Pipelines with Terraform
Learn about Terraform and how we use it to manage our Buildkite pipelines.
DEVELOPMENT
iOS
Swift
Testing
Tips
Development
Swift Render Tests in Practice — Part III
How to automate regenerating and updating reference images for render tests.
DEVELOPMENT
iOS
Swift
Testing
Tips
Development
Swift Render Tests in Practice - Part II
How to improve test failures with attachments and grouping related test output.
DEVELOPMENT
iOS
Swift
Testing
Tips
Development
Swift Render Tests in Practice - Part I
How to pragmatically approach render testing for custom drawing code.
DEVELOPMENT
iOS
Objective-C
Debugging
Insights
Development
Reverse Engineering UIKit to Fix Our Top Crash
This blog post describes the process of reverse engineering UIKit to identify and fix our top crash in PSPDFKit for iOS.
DEVELOPMENT
iOS
Testing
Xcode
Development
Automating Test Retries
We walk through our experience of dealing with flaky tests by automatically retrying them.
DEVELOPMENT
iOS
Swift
Tips
Debugging
Development
Debugging Image Loading and Cropping Performance on iOS
We talk about using the Image I/O and Core Graphics APIs to improve the image loading and cropping performance in the PSPDFKit iOS SDK.
DEVELOPMENT
Signing
PDF
Debugging
Support
Development
How We Debugged a Customer Problem with a Signed PDF
This blog post details how the PDF expertise of the PSPDFKit team helped unblock a customer with a tricky PDF problem.
DEVELOPMENT
Server
JavaScript
Testing
Development
Load Testing PSPDFKit Server
How we figured out what it takes to run PSPDFKit Server.
DEVELOPMENT
Flutter
Productivity
git
Insights
Development
How We Maintain Our Public Flutter Project Using a Private Monorepo
We describe the process taken to speed up the maintenance, development, and release cycle of our public Flutter project.
DEVELOPMENT
Android
Kotlin
Development
Avoiding Primitive Type Saturation in Kotlin
Enough of fun getString(string: String): String – let's make greater use of Kotlin's powerful type system.
DEVELOPMENT
C++
Insights
Development
CMake Presets in Practice
What CMake presets are and why PSPDFKit hopes to use them more.
DEVELOPMENT
iOS
Productivity
How To
Development
Automating Mac Catalyst Distribution with fastlane
We recently automated PDF Viewer for Mac distribution via fastlane. Here’s how you can do the same for your Mac Catalyst app.
DEVELOPMENT
PDF
Insights
Development
Optimizing PDFs for Printers
How to make sure your users get a good experience when your PDF is printed.
DEVELOPMENT
Android
Web
Testing
UI/UX
Insights
Development
Why Should You Care about Manual Testing?
How to approach manual testing pragmatically for quality products you can be proud of.
DEVELOPMENT
PDF
Tips
Performance
Insights
Development
How a B-Tree Helped Reduce Memory Usage in Our Framework
This blog post describes the approach we took to save around 15 percent of memory in our framework by first identifying bottlenecks, and then changing one of our dictionary implementations to use a specialized data structure known as a B-tree.
DEVELOPMENT
Web
Insights
Development
A brief tour of multipart requests
Learn how multipart requests enable the transfer of multiple types of data, including files, over the internet in a single HTTP request.
DEVELOPMENT
PDF
Components
Insights
Development
Why PDF Uses Floats and Word Uses EMUs
This post explores and gives examples of the units of length in Word documents.
DEVELOPMENT
PDF
Development
What Contributes to Slow PDF Rendering?
We briefly cover how PDF rendering works and some reasons why rendering a PDF can be slow.
DEVELOPMENT
SwiftUI
iOS
Development
SwiftUI In Production
We recently shipped a major new feature in SwiftUI while still supporting iOS 12 in our SDK. Here's what we learned.
DEVELOPMENT
Web
Docker
Insights
Development
Server Development on Apple Silicon
A short post about the experience of using an M1 MacBook for working on our Server product.
DEVELOPMENT
Web
Docker
Server
Insights
Development
Our Journey to ARM
A recollection of the events that led to PSPDFKit supporting ARM for our server-based products.
DEVELOPMENT
Web
Tips
Debugging
Insights
Development
How to Identify Browser Bugs
Strategies to adopt for identifying browser bugs, and what to do after spotting one.
DEVELOPMENT
PDF
C++
PDFium
Development
Tackling PDF Performance Issues
Digging into the internals of PSPDFKit to improve PDF performance.
DEVELOPMENT
Web
Server
Elixir
Tips
Development
The Perils of Large Files in Elixir
A post about dealing with large files in Elixir applications.
DEVELOPMENT
iOS
Swift
Tips
Development
Streams of Cocoa: Why It's Still Worth Knowing NSStream
In this post, we'll look at a piece of API that many people rarely touch, if ever: Stream. It’s neither new nor shiny, but it's a powerful tool when you know how to use it.
DEVELOPMENT
C++
Tips
Insights
Development
String Literals, Character Encodings, and Multiplatform C++
How string literals are encoded by Clang and MSVC.
DEVELOPMENT
Web
JavaScript
Performance
Development
Frontend Performance Enhancements at PSPDFKit
A short article about the principles of performance improvements at PSPDFKit.
DEVELOPMENT
iOS
macOS
Insights
Development
Advances in XCFrameworks
With Xcode 12, Apple improved the XCFramework format, which unlocks great new capabilities.
DEVELOPMENT
iOS
Swift
Objective-C
Xcode
Testing
Development
Deflaking CI Tests with xcresults
We’re sharing some techniques for tracking down and fixing flaky Xcode tests on CI.
DEVELOPMENT
iOS
Swift
Tips
SwiftUI
UI/UX
Accessibility
Development
Keyboard Navigation in SwiftUI
SwiftUI wasn’t built with keyboard support in mind, and it shows. Learn how you can rewrite keyboardShortcut to work with iOS 13 and access the underlying navigation controller to pop views on ⌘-Left Arrow.
DEVELOPMENT
iOS
Swift
SwiftUI
Tips
Development
Using the SwiftUI ColorPicker on iOS and macOS
While macOS has offered a system-provided color picker since OS X 10.0 Cheetah, iOS developers had to wait a bit longer. Let's take a closer look at the new ColorPicker (SwiftUI) and UIColorPickerViewController (UIKit) controls.
DEVELOPMENT
iOS
Testing
Development
Continuous Integration: From Jenkins to Buildkite
Learn why we moved from Jenkins to Buildkite, what the current most promising services are, and how we evaluated them.
DEVELOPMENT
iOS
Testing
Development
Automating macOS Provisioning with Chef
Learn how to use Chef to automatically provision macOS machines for CI: infrastructure as code
DEVELOPMENT
Processor
Web
Server
Development
A Primer on JSON Web Tokens
What JWTs are, how they work, and how we use them at PSPDFKit.
DEVELOPMENT
C++
Tips
Debugging
Development
Time Travel Debugging for C/C++
A quick look at reverse debugging/time travel debugging for C/C++.
DEVELOPMENT
Web
JavaScript
Insights
Development
Keeping Up with JavaScript Pointer Events
Events on the web have changed a great deal since the days of the cursor and the mouse. We examine some differences that you should be aware of.
2020
DEVELOPMENT
Android
Kotlin
Insights
Development
How Updating to Kotlin 1.4 Broke Our Linter Rules
How the update to Android Gradle plugin 4.1 and Kotlin 1.4 can break custom linter rules, and how to fix it.
DEVELOPMENT
iOS
Testing
Development
Managing macOS Hardware: Virtualization or Bare Metal?
We explore the different ways to run macOS in the cloud, comparing virtualization via VMware, Anka, and Orka with running a fleet of bare metal machines on Amazon or MacStadium.
DEVELOPMENT
iOS
Testing
Development
Continuous Integration for Small iOS/macOS Teams
In this new series, we're sharing our approach to macOS continuous integration for smaller teams that can't dedicate an entire team to CI management or aren't willing to invest five-figure sums per year for their setup.
DEVELOPMENT
Python
Testing
Development
Executable API Documentation with the LLVM Integration Tester and FileCheck
This post covers what executable documentation is and how you can use the LLVM Integration Tester to create it.
DEVELOPMENT
git
PDFium
Insights
Open Source
Development
Updating Complex Forked Projects
This blog post explains all the steps we take to stay up to date with PDFium at all times.
DEVELOPMENT
iOS
Swift
Tips
Development
Caching file downloads with URLCache in Swift
Apple has a sophisticated caching system in iOS, which is enabled by default. However, documentation around URLCache is quite sparse. Today, we'll look at the behavior of caching when dealing with large files.
DEVELOPMENT
Tips
Productivity
Development
Faster Compilation with Ccache 4.0
Ccache is a build cache to achieve faster compilation. With the 4.0 release, it now supports Modules, which makes it possible to accelerate projects that mix Objective-C and Swift.
DEVELOPMENT
iOS
Swift
Tips
SwiftUI
UI/UX
Development
Presenting popovers from SwiftUI
Is there a way to present UIKit popovers from toolbar buttons managed by SwiftUI?
DEVELOPMENT
Web
WebAssembly
Tips
Performance
Development
Migrating to the New Emscripten LLVM Backend
We share the experience of migrating from the old Fastcomp backend to the new LLVM backend in Emscripten.
DEVELOPMENT
Web
Accessibility
Development
How We're Improving Accessibility on PSPDFKit for Web
Better keyboard navigation and assistive technology support on the latest versions of our Web SDK.
DEVELOPMENT
Web
JavaScript
Performance
Insights
Development
The Generalized CRUD API of PSPDFKit for Web
An introduction to why and how we designed the brand-new unified CRUD API in PSPDFKit for Web.
DEVELOPMENT
Swift
Tips
Debugging
Development
An Introduction to LLDB Reproducers
An introduction to an experimental feature in LLDB, Reproducers, that helps reproduce bugs in the debugger itself.
DEVELOPMENT
Web
JavaScript
WebAssembly
Debugging
Insights
Development
The State of Debugging in WebAssembly
We share our tips and tricks for debugging issues in WebAssembly and look to the future to see what's coming.
DEVELOPMENT
Server
Insights
Development
Monitoring PSPDFKit Server with Metrics
Using data to draw insightful conclusions.
DEVELOPMENT
iOS
Swift
Insights
Development
Binary Frameworks as Swift Packages
What we learned from experimenting with binary frameworks as Swift packages in Xcode 12.
DEVELOPMENT
PDF.js
PDF
Insights
Development
Evaluating the Render Fidelity of PDF.js
We explore various issues with the render fidelity of PDF.js.
DEVELOPMENT
Docker
C++
Development
Visual Studio Code, C++, and a Docker Container
Our journey of using Visual Studio Code to develop C++ in a remote container.
DEVELOPMENT
iOS
Swift
Performance
Development
Using Metal to Apply Image Filters
An overview of how to use Metal to apply filters to images to perform a simple color inversion on the input image.
DEVELOPMENT
C++
Insights
Development
C++20 in 2020: Modules
An introduction to the C++20 modules feature: what they are, their potential advantages and disadvantages, and how they are used.
DEVELOPMENT
iOS
macOS
PDF
Insights
Development
Why Is the PDF Format So Well Supported on Apple Platforms?
Apple has a rich history of supporting the PDF file format, but when and how did its relationship with the PDF format begin?
DEVELOPMENT
Tips
Productivity
git
Development
A Better Way to Git Log to Understand Changes in a Big Codebase
How git log information may not be enough when developers need to understand changes in a codebase that has evolved over several years.
DEVELOPMENT
iOS
Swift
UI/UX
Insights
Development
The Case for Lists in UICollectionView
Exploring the power and flexibility offered by creating lists using UICollectionView.
DEVELOPMENT
iOS
Swift
Debugging
Insights
Development
The Hidden Trap in Selective Table View and Collection View Reloads
Learn how to properly update cells in a table view or collection view without crashing.
DEVELOPMENT
Web
PDF
Development
How We Created a Real-Time Collaboration Tool Inside a PDF
This blog post takes a peek under the proverbial PDF hood to find out how we developed Instant Comments.
DEVELOPMENT
iOS
macOS
Objective-C
Performance
Insights
Development
Direct Calls with Objective-C
Apple introduced the objc_direct attribute in Xcode 12. Learn what it does and how you can use it to your advantage.
DEVELOPMENT
Web
JavaScript
C++
WebAssembly
How To
Performance
Development
How to use WebAssembly modules in a web worker
A short tutorial showing the use of WebAssembly in a web worker.
DEVELOPMENT
iOS
macOS
Insights
Xcode
Development
Supporting XCFrameworks
What we learned about XCFrameworks while migrating PSPDFKit to this new format.
DEVELOPMENT
iOS
Swift
Objective-C
Insights
Development
NULL-Characters in Strings and Tales of Apple Radar
In iOS 11, Smart Punctuation caused data loss. Learn how we fixed the issue and how we are now cleaning up the OS-level workaround.
DEVELOPMENT
Web
JavaScript
TypeScript
Tips
Development
Generate TypeScript Declarations from a Flow Codebase
A short guide on how to generate TypeScript declarations from a Flow codebase.
DEVELOPMENT
iOS
Swift
Tips
UI/UX
Development
Level Up Your Trackpad Support Using UIInteraction
How to make your iOS app work well with scrolling, secondary clicking and dragging on a trackpad or mouse.
DEVELOPMENT
Web
Debugging
Insights
Development
Text Selection Regression in Chrome 83
How we noticed a Chrome regression and shipped a workaround in a timely fashion.
DEVELOPMENT
Android
Kotlin
Tips
Productivity
Development
Think First, Code Later
A case study on how we design features and APIs for PSPDFKit for Android.
DEVELOPMENT
C++
Tips
Productivity
Development
Best C++ IDEs of 2024
Discover the best C++ IDEs and text editors of 2024. Learn the pros and cons of each tool, from Visual Studio to Vim, and find the right fit for your development needs.
DEVELOPMENT
iOS
macOS
Tips
Performance
Xcode
Development
Automated Profiling Runs in Instruments
Learn how to automate measurement runs with Instruments.
DEVELOPMENT
C++
Tips
Performance
Development
How to Effectively Measure the Performance of Your Code
This blog post explains why software that performs well is important and how we measure code performance at PSPDFKit.
DEVELOPMENT
Android
Kotlin
Tips
Productivity
Testing
Development
How to Reduce Flakiness in Automated UI Testing on Android
This blog post discusses tips and best practices on how to reduce flakiness in automated UI testing on Android.
DEVELOPMENT
iOS
Objective-C
Tips
Development
Preventing Surprisingly Large Objective-C Type Encodings
Objective-C stores type encoding in the binary. These encodings can become surprisingly large.
DEVELOPMENT
iOS
Swift
Tips
UI/UX
Insights
Development
Supporting Pointer Interactions
Apple introduced new pointer events in iOS 13.4 to better support trackpad and mouse devices.
DEVELOPMENT
C++
Tips
Productivity
Development
Effective Header Management in C++
How we can reduce build times and clean up our header dependencies with effective header management.
DEVELOPMENT
Android
Kotlin
Tips
UI/UX
Development
Change Android Themes Instantly Using the Circular Reveal Animation
This blog post investigates how to achieve nice animations when changing themes.
DEVELOPMENT
PDF
Tips
Insights
Development
Optimizing PDF File Size
When editing PDFs, they often grow in size, but that doesn't have to be the case. Here's how we optionally optimize for size.
DEVELOPMENT
C++
Tips
Testing
Development
Our Approach to Testing a Large-Scale C++ Codebase
This blog post outlines the frameworks and techniques PSPDFKit uses to test its large-scale C++ codebase.
DEVELOPMENT
C++
Tips
Performance
Development
Investigating the performance overhead of C++ exceptions
C++ exceptions have their place, but using an alternative is recommended for general program flow control.
DEVELOPMENT
C++
Tips
Performance
Development
Compiler-Based Lock Checking in C++
A short introduction to compiler-based lock checking in C++ with Clang using Thread Safety Analysis
DEVELOPMENT
Web
PWA
Insights
Development
The State of Progressive Web Apps in 2020
Examining new developments in the PWA landscape that affect mobile and desktop browsers.
DEVELOPMENT
C++
Security
Insights
Development
The C++ Lifetime Profile: How It Plans to Make C++ Code Safer
This blog post explains what the C++ Lifetime Profile is and how it intends to make the language safer and help avoid memory management problems.
DEVELOPMENT
Tips
Productivity
git
Development
Moving a Git Repository into Its Submodule
How we improved our Git repository setup by moving our PDF Viewer for iOS repository into our PSPDFKit repository.
DEVELOPMENT
iOS
Swift
Objective-C
Tips
UI/UX
Development
Adopting UIAppearance in Custom Views
Learn how to support styling your own custom views using UIAppearance.
DEVELOPMENT
Android
Java
Testing
Gradle
Development
Filtering Tests in Android
A look at the android.support.test.filters library and what it provides you with.
2019
DEVELOPMENT
C++
Insights
Development
The Functional Side of std::optional with C++20
std::optional is already really useful, and it's about to get better with C++20.
DEVELOPMENT
iOS
Tips
UI/UX
Development
Open Links in Safari, Not Safari View Controller
Why we changed our default for opening web links from SFSafariViewController to the Safari app.
DEVELOPMENT
Android
Insights
Development
Our Journey from Genymotion to the Android Emulator
How we migrated our Genymotion-based CI to an AVD.
DEVELOPMENT
Web
WebAssembly
Development
WebAssembly and Emscripten Chat with Alon Zakai
A chat with Alon Zakai, co-creator of WebAssembly and creator of Emscripten.
DEVELOPMENT
Swift
C++
Insights
Development
Introduction to C++ for Swift Developers
An introduction to the C++ language for Swift developers, with an overview of reasons to use C++ and a look at differences and similarities between the languages.
DEVELOPMENT
iOS
Swift
Objective-C
UI/UX
Development
Adopting Dark Mode on iOS and Ensuring Backward Compatibility
A comprehensive overview of adopting Dark Mode in an iOS app, along with a few tips to make the process of development easier.
DEVELOPMENT
Android
Kotlin
Tips
Accessibility
Insights
Development
How We Improved Keyboard Navigation Accessibility in Our Android SDK
A look at the steps we took to start improving the accessibility of our Android SDK.
DEVELOPMENT
C++
Python
Tips
Development
Making C++ Talk to Other Languages with SWIG
Using SWIG to generate interfaces to talk to a C++ backend.
DEVELOPMENT
Web
Docker
Containers
Tips
Development
A beginner's guide to Docker: Import/export vs. load/save commands
A blog post that explains the difference between the Docker import/export and load/save commands.
DEVELOPMENT
Android
Tips
Development
The Android Drag-and-Drop Framework in Practice
Using the Android drag-and-drop framework — from theory to implementation.
DEVELOPMENT
Android
Java
Gradle
Insights
Development
Understanding the Gradle Build System
In this article, we'll explore the Gradle build system, how it works, and why it is the new standard for building Android projects.
DEVELOPMENT
Android
iOS
macOS
Windows
C++
Insights
Development
Challenges of Using Emojis with C++
In this article, we discuss the challenges of implementing your own custom emoji support in a cross-platform way.
DEVELOPMENT
Android
Kotlin
Java
Insights
Development
What Is an Intent?
An overview of intents, their uses, and pitfalls to consider.
DEVELOPMENT
Android
Tips
Development
Dealing with Large Memory Requirements on Android
This article provides tips for optimizing memory usage of your apps.
DEVELOPMENT
Android
Debugging
Development
NDK Debugging
A set of tips for debugging native NDK code in Android apps.
DEVELOPMENT
Android
Kotlin
Tips
Development
How Do I Fix NetworkOnMainThreadException?
A post detailing what NetworkOnMainThreadException is and how to prevent it.
DEVELOPMENT
Android
iOS
Web
PDF
Development
The Role of PSPDFKit as a PDF Processor
How we fit into the PDF landscape.
DEVELOPMENT
Android
Java
Tips
Development
Performance Evaluation of Linked Lists
Today we'll delve into the performance evaluation of linked lists, a controversial topic among many experienced developers, and try to understand why they trigger a warning in the Error Prone report.
DEVELOPMENT
Web
React
JavaScript
Insights
Development
React Redux's New Features
An overview of React Redux's seven new features in action.
DEVELOPMENT
Windows
Tips
Development
How to Await an Async Event Handler Delegate in UWP
Asynchronous programming is hard, and the WinRT interface poses further issues. Learn how to implement a deferral to wait on a user action before completing additional work.
DEVELOPMENT
Web
JavaScript
Tips
Development
Smoother Interactions on the Web: getCoalescedEvents()
How to use the getCoalescedEvents() method of the PointerEvent API to improve the precision of drawing apps or of any web application.
DEVELOPMENT
iOS
Swift
Tips
Development
Making a Resource Thread-Safe with Locks
We discuss how to ensure thread safety and synchronization via locking.
DEVELOPMENT
C++
Tips
Debugging
Development
When C++ Doesn't Move
C++ move semantics make your code more efficient, but sometimes a move is not performed. In this blog post, we explore why.
DEVELOPMENT
Android
Tips
Development
The Soft Keyboard on Android
Tips for working with the soft keyboard on Android.
DEVELOPMENT
iOS
Swift
Tips
Development
Swizzling in Swift
A quick crash course on how to swizzle correctly, and how to do it in Swift 5.1
DEVELOPMENT
iOS
Swift
PDF
Tips
Development
Working with PDF Metadata in Swift
How and what metadata can be stored in a PDF, and how to programmatically work with this information.
DEVELOPMENT
Android
Kotlin
Tips
Development
Retaining Objects Using a Fragment
An overview of how to use a fragment to retain objects during a configuration change.
DEVELOPMENT
Android
Java
Tips
Insights
Development
Problems with Nullability Annotations
A look at some issues with Android's nullability annotations and how to fix them.
DEVELOPMENT
Culture
Productivity
Insights
Development
WWDC for First-Timers, 2019 Edition
Here's how to get the most out of Apple's Worldwide Developer Conference.
DEVELOPMENT
macOS
Tips
Insights
Development
How Xcode Indexing Works and How You Can Fix IDE Problems with Your Projects
This post provides an overview of how the code assistance feature in Xcode works and how you can debug code assistance problems in your projects.
DEVELOPMENT
Android
Tips
Development
Understanding Android Dimensions
A post about existing Android dimensions, their purpose, and common conversion rules.
DEVELOPMENT
Android
Gradle
Development
Gradle Task Configuration Avoidance in Android Builds
An overview of Gradle's task configuration avoidance APIs and how they are used by the Android build system.
DEVELOPMENT
Windows
UWP
C#
C++
Tips
Development
How to Use Native C++ in UWP
How to include native C++ in your UWP app and call into it from C#.
DEVELOPMENT
Android
Tips
Development
How to Use Android App Bundles
This blog post explains what Android App Bundles are and how to upload them to Google Play.
DEVELOPMENT
PDF
Insights
Development
Understanding the difference between bookmarks and the outline in a PDF
Bookmarks vs. outline elements: Not everything is what it seems.
DEVELOPMENT
Tips
Development
The Many Benefits of Using a Monorepo
A monorepo? Isn't that just a weird Facebook and Google thing? Why is PSPDFKit using a monorepo?
DEVELOPMENT
Android
Kotlin
Insights
Development
Kotlin Coroutines
A look at Kotlin coroutines and how they compare to other solutions for concurrency.
DEVELOPMENT
iOS
Insights
Development
The Bittersweet iOS Document Browser
A quick look at both the benefits and downsides of using the iOS system document browser in your applications.
DEVELOPMENT
Web
Debugging
Development
Debug Emscripten with the Tracing API
How to debug memory usage in an Emscripten app.
DEVELOPMENT
Web
Docker
PDF
Development
Preparing My Tax Return with Apache PDFBox, Docker, and Make
How I combined Apache PDFBox, Docker, and Make to streamline my tax return workflow.
DEVELOPMENT
Android
Java
Development
Java 8 in Android Apps
This article explains how to enable Java 8 features in an Android app and gives an overview of the available Java 8 features.
DEVELOPMENT
Android
Java
Tips
Development
Handling Nullability in Your Code
A brief excursion into the Java type system, nullability, and remedies for the billion-dollar mistake.
DEVELOPMENT
iOS
Objective-C
Insights
Development
Embracing the Limits of UIActivityViewController
We talk about our experience in implementing the new sharing flow.
DEVELOPMENT
Android
Kotlin
Tips
Jetpack Compose
Development
Using ViewModels to Retain State on Android
How to use Android's ViewModel class to retain complex objects across configuration changes.
DEVELOPMENT
iOS
Swift
Insights
Development
PSPDFKit and Swift
Will PSPDFKit for iOS move to Swift? In this post, we weigh the pros and cons.
DEVELOPMENT
iOS
Swift
Tips
Debugging
Development
Adding Logging to Crash Reports
Understanding crash reports is often difficult without extra context. Learn how we attach application logs to crash reports via Google's Firebase Crashlytics in the free PDF Viewer for iOS app.
DEVELOPMENT
Android
Tips
Development
What are configuration changes in Android?
An overview of configuration changes on Android, including best practices for modern development.
DEVELOPMENT
Productivity
Tips
Development
How Spaced Repetition Helps You Learn New Things
We present spaced repetition as a learning technique that can help you be more efficient at work.
DEVELOPMENT
Android
iOS
Windows
PDF
Tips
Insights
Development
Incremental and Full Save in PDFs
This article goes into what's involved when incrementally or fully saving a PDF, and why it matters.
DEVELOPMENT
Android
Kotlin
JavaScript
React Native
Development
Sharing Business Logic Using React Native
Not only can React Native be used to provide the UI for your application, but it is also a convenient way to share business logic.
DEVELOPMENT
Android
Debugging
Development
Android Debug Bridge Tricks and Tips
An introduction to Android Debug Bridge (adb) and an overview of some tricks.
DEVELOPMENT
Android
Kotlin
Tips
Instant
Development
How to Test REST API Clients in Android Apps
This article shows how we built simple and flexible integration tests for PSPDFKit Instant that are using a custom abstraction layer on top of an OkHttp mocked web server.
DEVELOPMENT
Tips
Development
What Is Ninja Refactoring, and When Should You Consider Doing It?
Tips and best practices for code refactoring.
DEVELOPMENT
Android
Java
Tips
Development
Saving the Activity State
An overview of how to make sure your activity state is saved.
DEVELOPMENT
iOS
macOS
Swift
Objective-C
Tips
Development
Writing and Maintaining Good Code Documentation
Tips, tricks, and techniques for documenting your code the correct way.
DEVELOPMENT
iOS
Windows
UWP
C#
Insights
Development
UWP for iOS Developers
A brief introduction to Universal Windows development for iOS developers.
DEVELOPMENT
Android
Kotlin
Tips
Development
Using the Bottom Navigation View in Android
An introduction to implementing bottom navigation in your app with a simple example that incorporates synced page switching as well.
DEVELOPMENT
C++
Tips
Insights
Development
Visual Studio Code for C++
How to use Visual Studio Code for C++ development.
DEVELOPMENT
Android
Tips
Debugging
Development
Inspecting APK Files
This article discusses the basics of Android reverse engineering using the Apktool, smali, and Java decompilers.
2018
DEVELOPMENT
iOS
Swift
Objective-C
Insights
Development
Self-Sizing Table View Cells in Practice
A look at self-sizing table view cells for apps supporting iOS 10, 11, and 12, covering three implementation approaches and some pitfalls I encountered supporting these across our UI in PSPDFKit.
DEVELOPMENT
Web
Ruby
PDF
Development
Generating PDFs with Ruby: 2018 Edition
This post surveys the Ruby landscape in 2018 to evaluate the current state-of-the-art of generating PDFs with Ruby.
DEVELOPMENT
Android
Development
External storage permissions on Android
An exploration of how permissions work, starting from a high level and working down to the lower lever managed by FUSE, the native Android module that interacts with the file system.
DEVELOPMENT
Android
Tips
Development
How to Increase the Logcat Buffer Size
Don't lose your logs. Increase your logcat buffer!
DEVELOPMENT
PDF
Development
Understanding Images in PDF
We take a look at how images are stored in a PDF and discuss some important things to know about them.
DEVELOPMENT
Elixir
How To
PDF
Development
How to generate PDFs with Elixir
In this blog post, we'll look at an example of how to generate PDFs with Elixir.
DEVELOPMENT
iOS
Swift
C++
Open Source
Tips
Development
Tips and Tricks for Contributing to the Swift Language
This post describes the process for contributing code to the Swift programming language, including how to propose changes to the language, write a pull request, address feedback, and make your code part of the next version of the language.
DEVELOPMENT
iOS
Swift
Objective-C
Performance
Development
Using Signposts for Performance Tuning on iOS
A look at the different ways that we measure and try to improve performance at PSPDFKit.
DEVELOPMENT
iOS
Tips
Development
Creating an Efficient App Store Screenshot Workflow
A look at how we generate our screenshots for the iOS App Store.
DEVELOPMENT
Productivity
Development
Time Management
A discussion of how managing time by incorporating productivity techniques, making lists, planning your days, and finding ways to utilize downtime can help with your workflow.
DEVELOPMENT
iOS
Insights
Development
iOS HEIC Performance
We evaluate the encoding and decoding performance of HEIC.
DEVELOPMENT
Android
Testing
Development
Rendering Tests Using Robolectric
Rendering tests using Robolectric with a custom bitmap shadow.
DEVELOPMENT
PDF
Development
PDF syntax 101: Understanding PDF Object Types
An overview of the internal structure of a PDF.
DEVELOPMENT
iOS
Objective-C
Insights
Development
Challenges of Adopting Drag and Drop
A recap of how we integrated drag-and-drop support into our Document Editor in iOS.
DEVELOPMENT
Android
Kotlin
Insights
Development
What are Kotlin contracts and how are they useful?
An overview of the experimental Kotlin Contracts API.
DEVELOPMENT
PDF
Insights
Development
What’s Hiding in Your PDF?
PDFs hold information you may not know about. Discover different forms of metadata and where to look for them.
DEVELOPMENT
Android
Tips
Development
Using paths to draw shapes with borders
How to use a flexible path API to draw complex shapes with borders.
DEVELOPMENT
Tips
Development
Running multiple instances of a service with Docker Compose
Learn how to efficiently run multiple instances of a service using Docker Compose. This guide covers configuration examples, load balancing with NGINX, and best practices for local development.
DEVELOPMENT
Productivity
Development
Using clang-tidy and integrating it in Jenkins
The benefits of using clang-tidy and how to get started setting it up in Jenkins.
DEVELOPMENT
iOS
Tips
Development
Refactoring Large Codebases: Tips and Tricks
If you're going to fall down a rabbit hole anyway, you might as well enjoy it!
DEVELOPMENT
iOS
Tips
Development
Improving Dynamic Type Support
How to improve Dynamic Type support in your app and bring it to the next level.
DEVELOPMENT
Web
React
Accessibility
Development
Building Accessible Modals with React
In this blog post, we will look at some simple solutions that we use at PSPDFKit to make our modals more inclusive and accessible.
DEVELOPMENT
iOS
Debugging
Tips
Development
How to Extend LLDB to Provide a Better Debugging Experience
Explore the extensibility capabilities of LLDB, a debugger for Swift, C, C++, and Objective-C code.
DEVELOPMENT
Web
PWA
Performance
Open Source
Development
PWA — Progressive Web Applications
PSPDFKit for Web and Progressive Web Applications: an open source example and guide.
DEVELOPMENT
iOS
macOS
Insights
Development
Marzipan: Porting iOS Apps to the Mac
With macOS Mojave, Apple is adding support to bring apps written in UIKit to macOS without the requirement of having to rewrite the UI in AppKit. This is not yet officially supported — this post will explore what we can expect in 2019 and how you can use Marzipan today.
DEVELOPMENT
iOS
Insights
Development
The Challenges of Changelogs
How we handle changelogs at PSPDFKit and the tools we built to help us with this.
DEVELOPMENT
Tips
Development
Naming Is Hard — Difficulties of Naming Variables
Is naming a variable so hard? According to Martin Fowler, it is. In this blog post, I'll try to shed some light on what naming entails and why it's a challenge.
DEVELOPMENT
Tips
Development
Naming Classes — Why It Matters, and How to Do It Well
Tips for choosing good class names.
DEVELOPMENT
Elixir
Tips
Development
How to Parse XML Documents in Elixir
A tutorial on how to parse XML documents in Elixir.
DEVELOPMENT
PDF
Signing
Security
Development
Protecting PDF Documents
Password-based security for PDF documents.
DEVELOPMENT
UWP
Windows
Tips
Development
Debugging WebView in UWP Apps with Edge DevTools
We show how a developer can use Edge DevTools to debug a WebView in a UWP app.
DEVELOPMENT
Android
RxJava
Kotlin
Tips
Development
RxJava for Multi-Level Data Retrieval
RxJava can be useful for many things, and in this post, we’ll have a look at how to use it to add offline support to your app.
DEVELOPMENT
Productivity
Development
Switching to a Standing Desk
We discuss some of the benefits of switching to a standing desk.
DEVELOPMENT
Elixir
Tips
Development
Database Transactions with Ecto
How to use database transactions and Ecto.Multi in Elixir
DEVELOPMENT
Web
Tips
Development
Immutable.js and Lazy Evaluation
A short introduction to Immutable.js and how lazy operations improve performance and readability of your code.
DEVELOPMENT
Tips
Development
Modern CMake Tips
There are better ways to write CMake scripts.
DEVELOPMENT
Ruby
Testing
Development
Adding Spellchecking to Your Tests
How we added simple spelling and grammar checks to our website build process to catch some common mistakes.
DEVELOPMENT
Flutter
Android
iOS
Insights
Development
How I Got Started with Flutter
A short review of Flutter from a mobile developer’s standpoint.
DEVELOPMENT
Elixir
Tips
Development
How to Build a Back-Pressure Queuing System in Elixir with sbroker
Tutorial on how to set up a back-pressure queuing system in Elixir with sbroker.
DEVELOPMENT
Web
JavaScript
Tips
Development
An Introduction to Stimulus.js
In this article, we'll look at the Stimulus JavaScript framework and how it can help bring some order to a website's frontend codebase.
DEVELOPMENT
Android
Kotlin
Tips
Development
Moving Your Gradle Build Scripts to Kotlin
Another take on writing your project's Gradle build files in pure Kotlin code.
DEVELOPMENT
Web
WebAssembly
Performance
Development
A real-world WebAssembly benchmark
A WebAssembly benchmark for browser vendors to test a real-world production application.
DEVELOPMENT
iOS
Swift
Insights
Development
Smart Grid Sizing
How PSPDFKit is smart about choosing thumbnail sizes.
DEVELOPMENT
Android
Tips
Development
Tips for Designing an Android Library
We take a look at some of the things you should keep in mind when designing an Android library.
DEVELOPMENT
Open Source
Development
Reviewbot
Reviewbot posts GitHub pull requests that are ready to be reviewed into Slack. How does it know when a pull request is ready? We have a special label in our repositories, named `READY TO REVIEW`.
DEVELOPMENT
PDF
Annotations
Development
Line Annotations in PDF
Line annotations are one of the most frequently used annotation types, and they are ideal for things like drawing attention to important areas of your document, diagramming the process flow, and decoration.
DEVELOPMENT
Android
Insights
Development
Rendering PDF Previews
An overview of how to render PDF previews.
DEVELOPMENT
iOS
Insights
Development
Advances in Auto Layout
An overview of how Auto Layout has changed in recent years and how to best use it.
DEVELOPMENT
Android
Java
Kotlin
Tips
Development
Async Stacktraces in Android Studio
How to create asynchronous stacktraces in Android Studio and IntelliJ.
DEVELOPMENT
iOS
Insights
Development
Understanding Smart Punctuation on iOS: Impact on string handling in apps
Explore how iOS's Smart Punctuation feature transforms straight quotes into curly quotes and modifies hyphens into dashes. Learn its implications for developers in string handling, UI tests, and input management within UIKit controls.
DEVELOPMENT
PDF
Insights
Development
What Are Appearance Streams?
An explanation of what appearance streams actually are, along with their gotchas.
DEVELOPMENT
Android
RxJava
Kotlin
Insights
Development
RxJava Is Async yet Blocking
An explanation of why RxJava is both asynchronous and blocking.
DEVELOPMENT
Tips
Development
How to Manage Multiple System Configurations Using Docker Compose
This blog post is a short introduction to Docker Compose and will explain how we use it to manage different system configurations that are built off the same base configuration.
DEVELOPMENT
Android
Debugging
Productivity
Development
The Subtle Art of Real-Time Debugging With Android Studio
Debugging in real time with Android Studio.
DEVELOPMENT
Android
Tips
Development
Hints for Beginners Navigating Around New Code
We share some tips on how to navigate a new codebase.
DEVELOPMENT
iOS
Android
C++
Objective-C
Development
Failable Methods with Djinni
In this article, we have look at using result types to model failable computations in the Djinni IDL.
DEVELOPMENT
Tips
Development
Using webpack with Middleman
We explain how to integrate Middleman and webpack to boost your frontend productivity.
DEVELOPMENT
iOS
Tips
Development
Leveraging SQLite Full-Text Search on iOS
We look at SQLite’s FTS extension and how you can use it to add high performance search to your app.
DEVELOPMENT
PDF
Tips
Forms
Development
Forms in PDF
Forms provide a simple yet flexible way to gather data from users.
DEVELOPMENT
iOS
Insights
Development
UICollectionView All the Things!
`UICollectionView` is now at the heart of every document. This blog post talks about why and how we rewrote our view hierarchy.
DEVELOPMENT
Android
Kotlin
Insights
Development
Using Kotlin to Make the PSPDFKit API Even Better
Kotlin provides the ability to extend any class with new functionality, and we can use this to expand the PSPDFKit API.
DEVELOPMENT
Android
Performance
UI/UX
Development
Rendering PDFs on Android
How to handle rendering large amounts of bitmaps and maintain a slick UX while doing it.
DEVELOPMENT
Web
WebAssembly
Development
Optimizing WebAssembly Startup Time
Four simple yet effective solutions we currently employ in PSPDFKit for Web to reduce WebAssembly startup time.
DEVELOPMENT
Elixir
Tips
Development
How to Run Your Phoenix Application with Docker
We’re taking a look at how to run Elixir applications within a Docker container, and how that can simplify the setup of development and deployment environments.
DEVELOPMENT
Android
Productivity
Tips
Development
Android Studio Shortcuts: How to Boost Your Productivity
The best shortcuts for Android Studio. The most famous and the most underrated.
DEVELOPMENT
iOS
Swift
Insights
Development
Binary Frameworks in Swift
ABI? Module stability? What does binary stability mean, and how will it affect you?
DEVELOPMENT
Android
Kotlin
Insights
Development
Simple Kotlin Tips for Beginners
Useful tricks for beginners to start writing better code with Kotlin.
DEVELOPMENT
PDF
Insights
Annotations
Development
Understanding PDF Annotations: Their Types and Uses
Discover everything you need to know about PDF annotations, their types, and how they function in PDFs. Learn how Nutrient makes managing these annotations simple with its robust annotation model.
DEVELOPMENT
PDF
Development
How to Extract Text from a PDF
Discover effective methods for extracting text from a PDF and learn how PSPDFKit simplifies this process.
2017
2016
DEVELOPMENT
macOS
Insights
Development
Chef on macOS
DEVELOPMENT
iOS
Tips
Development
Hiding Your Action and Share Extensions In Your Own Apps
DEVELOPMENT
Android
Kotlin
Java
Tips
Development
A clean status bar with Android System UI and QuickDemo
How to enable Android's demo mode using a quick setting tile
DEVELOPMENT
Android
Java
Kotlin
Development
Restoring State in Android MVP Architecture
State restoration is an important part of the Android framework, but we might encounter problems with it when implementing MVP architecture.
DEVELOPMENT
iOS
Android
Testing
Development
Running Tests with Clang's AddressSanitizer
Clang has powerful sanitizers that are incredibly useful, so we collected our experiences using them between iOS, Android, and our C++ core to help you through some gotchas.
DEVELOPMENT
Android
Kotlin
RxJava
Tips
Development
Android animations powered by RxJava
The purpose of this post is to show you how to combine RxJava features with animations on Android to create a great user interface without a lot of nested code.
DEVELOPMENT
React Native
JavaScript
Development
PSPDFKit 💖 React Native
DEVELOPMENT
iOS
Debugging
Tips
Development
Debugging a specific instance with scripted breakpoints
When debugging an issue that is somewhere deep inside your code, you easily end up debugging a class that has lots of living instances. Sometimes, you are only interested in a very particular one. This can become very tedious work.
DEVELOPMENT
iOS
Debugging
Tips
Development
Writing Good Bug Reports
At PSPDFKit, we work every day to read through developers' bug reports. In fact, we forward many of them to the engineers at Apple. While this post is Apple-centric, many details can be applied to any sort of bug reporting.
DEVELOPMENT
Insights
Development
Real-time collaboration, Apple, and you
Apple recognizes that real-time collaboration is necessary and so do we. Here's how PSPDFKit is upgrading your ability to work with teams.
DEVELOPMENT
iOS
Objective-C
Tips
UI/UX
Development
Spicing up status messages
At PSPDFKit, we likely spend just as much time polishing the UI as we do implementing PDF features or tweaking the performance. Here's a look at how one of our developers explored improving our status messages.
DEVELOPMENT
PDF
Debugging
Insights
Development
Just a simple bookmark
When books became digital, bookmarks became more complicated. Instead of stuffing a piece of paper in a book, you now had to store a digital marker, which is not always as simple as it looks.
DEVELOPMENT
iOS
Testing
Development
Converting Xcode Test Runs to JUnit, the Fast Way
DEVELOPMENT
iOS
Tips
Development
Preventing Popovers on Popovers
DEVELOPMENT
iOS
Tips
Development
Efficient iOS Version Checking
DEVELOPMENT
iOS
Debugging
Development
Investigating Thread Safety of UIImage
DEVELOPMENT
Instant
Testing
Development
End–to–End Testing: What, Why, and How?
DEVELOPMENT
Web
Instant
Elixir
Testing
Development
Testing HTTP APIs in Elixir
DEVELOPMENT
iOS
Swift
Objective-C
Insights
Development
Swifty Objective-C
DEVELOPMENT
Testing
Tips
Development
Selective Pull Request Testing
DEVELOPMENT
iOS
Testing
Development
Continuous iOS Code Coverage With Jenkins and Slather
DEVELOPMENT
Android
Java
UI/UX
Tips
Development
Keyboard Handling on Android
DEVELOPMENT
iOS
Performance
Testing
UI/UX
Development
Running UI Tests on iOS With Ludicrous Speed
DEVELOPMENT
iOS
Tips
Development
Adding live search to Jazzy docs
DEVELOPMENT
Android
Kotlin
Development
Kotlin-Ready Online Guides
Our Guides received a large update – now with Kotlin usage examples.
DEVELOPMENT
Insights
Development
A pragmatic cross-platform approach
DEVELOPMENT
iOS
Tips
Debugging
Development
Debugging Rotation Issues
Discover how we resolved a freezing issue in our Document Editor app after rotation, ensuring smooth user interaction and event handling.
DEVELOPMENT
iOS
Swift
Objective-C
Insights
Development
Surprises with Swift Extensions
DEVELOPMENT
Android
Insights
Development
The curious case of Android premultiplied alpha
2015